robotron/RRDX2.ASM

669 lines
19 KiB
NASM
Executable File

OPT NOL
LIB RRF
OPT LIS
STTL DIAGONAL EXPLOSIONS
*
* EXPLODING OBJECT DATA STRUCTURE
*
ORG DXTAB PLACE FOR DATA
EX EQU *
NEXTZ RMB 2 LIST POINTER
PICPTZ RMB 2 POINTER TO DATA
XCENTZ RMB 1 SCREEN X CENTER (LEFT X OF CENTER LINE)
YCENTZ RMB 1 SCREEN Y CENTER
YOFZ RMB 1 OFFSET IN Y TO OBJECT CENTER (PIXELS) (0-HEIGHT)
XSIZEZ RMB 1 X SIZE USED LAST (THIS) FRAME
YSIZEZ RMB 2 CURRENT Y POINT SPACING
FRAMEZ RMB 1 FRAMES TO RUN IN EFFECT
ULZ RMB 2 UPPER LEFT
WHZ RMB 2 WIDTH,HEIGHT
DMAWHZ RMB 2 DMA HEIGHT WIDTH
YHITEZ RMB 1
SLOPEZ RMB 1 SLOPE OF DIAGONAL LINE WE ARE EXPLODING (SIGN BIT)
DATAZ RMB 16*2 LIST OF ROW DATA POINTERS (FOR SPEED MAN)
ESIZEZ EQU *
NEXT EQU NEXTZ-EX
PICPTR EQU PICPTZ-EX
XCENT EQU XCENTZ-EX
YCENT EQU YCENTZ-EX
YOF EQU YOFZ-EX
XSIZER EQU XSIZEZ-EX
YSIZER EQU YSIZEZ-EX
FRAMES EQU FRAMEZ-EX
UL EQU ULZ-EX
WH EQU WHZ-EX
DMAWH EQU DMAWHZ-EX
YHITE EQU YHITEZ-EX
SLOPE EQU SLOPEZ-EX
DATA EQU DATAZ-EX
EXSIZE EQU ESIZEZ-EX
RMB ((10-1)*EXSIZE) NUMBER OF BLOCKS
EXEND EQU *
ORG DXRAM (BASE PAGE)
YYCNT RMB 1 WHEN CHOPPING UP X, SAVE TO UPDATE ULY
YOFF RMB 1 ACTUAL PIXEL OFFSET TO CENTER (USED)
XSIZE RMB 1 DISTANCE BETWEEN X POINTS THIS FRAME
YSIZE RMB 1 DISTANCE BETWEEN Y POINTS THIS FRAME
EXPTR RMB 2
APPTR RMB 2 APPEAR POINTER
EXFREE RMB 2
HITE RMB 1
TEMP1 RMB 2
TEMP2 RMB 1
*
*VECTORS
*
ORG RDXORG
JMP EXINV
JMP EXSTZ
JMP APSTZ
JMP DXUPDV
*
*INIT DATA STRUCT
*
EXINV PSHS X,Y
LDX #EX FIRST
STX EXFREE
EXIN0 LEAY EXSIZE,X FIND NEXT
STY ,X STORE
CMPY #EXEND DONE??
BHS EXIN1
LEAX ,Y MAKE US NEXT
BRA EXIN0
EXIN1 LDY #0
STY ,X
STY EXPTR
STY APPTR
PULS X,Y,PC
GETBLK PSHS Y
LDU EXFREE
BEQ NOBLK NONE
LDY ,U GET NEXT
STY EXFREE
LDY EXPTR GET LIST
STY ,U APPEND US
STU EXPTR
CLC
PULS Y,PC RETURN IN U
NOBLK SEC
PULS Y,PC
GETAP PSHS Y
LDU EXFREE
BEQ NOBLK
LDY ,U
STY EXFREE
LDY APPTR
STY ,U
STU APPTR
CLC
PULS Y,PC
*
*START AN APPEAR
*X=OBJ,A=SLOPE
APSTZ PSHS X,Y,D,U
JSR GETAP GET AN APPEAR BLOCK
BCS APBY NONE
STA SLOPE,U SAVE SLOPE
LDD OBJX,X
LDX OPICT,X
STD UL,U START AS UPPER LEFT
STA XCENT,U SAVE X CENTER
LDB CENTMP+1
STB YCENT,U
SUBB UL+1,U SUBTRACT Y UPPER LEFT
BCS NWCEAP NO GOOD
CMPB 1,X COMPARE
BLO APNTOK
NWCEAP LDB ,X GET WIDTH
LSRB 1/2 Y
STB YOF,U SAVE OFFSET
ADDB UL+1,U ADD TOP
STB YCENT,U THIS IS
BRA CCOAP
APNTOK STB YOF,U
CCOAP LDD ,X FETCH H,W
STD WH,U SAVE
LDB #1 HEIGHT IS 1 FOR DMA
STB YHITE,U SMALL HEIGHT FOR FIRST (CRAZY) ERASE
EORA #$4
EORB #$4
STD DMAWH,U FORMED
LDX 2,X GET DATA POINTER
STX PICPTR,U SAVE OBJECT DESC
LDD #$1000 START LARGE FOR APPEAR
STD YSIZER,U
CLR XSIZER,U ERASE NORMAL OBJECT FIRST FRAME
BSR DATALD LOAD THE ROW DATA PTRS
APBY PULS X,D,U,PC,Y AND RETURN TO CALLER
DATALD LDX PICPTR,U GET POINTER TO DATA
LDB WH,U WIDTH IN B
LDA WH+1,U HEIGHT IN A
LEAU DATA,U POINT AT THE DATA
DATLD1 STX ,U++ STORE POINTER TO CURRENT ROW
ABX ADDING WIDTH FORMS POINTER TO NEXT ROW
DECA 1 LESS ROW (OFF HEIGHT)
BNE DATLD1 DONE?
RTS YEP
*
*START AN EXPLOSION
*X=OBJ,A=SLOPE
EXSTZ PSHS X,U,D,Y
JSR GETBLK GET A BLOCK TO USE
BCS EXBYE DONE...NO BLOCKS
STA SLOPE,U
LDD OBJX,X
LDX OPICT,X
STD UL,U STORE UPPER LEFT (FIRST FRAME)
STA XCENT,U SAVE LEFT X
LDB CENTMP+1
STB YCENT,U
SUBB UL+1,U SUBTRACT Y UPPER LEFT
BCS NWCENT NO GOOD
CMPB 1,X COMPARE
BLO CENTOK
NWCENT LDB ,X GET WIDTH
LSRB 1/2 Y
STB YOF,U SAVE OFFSET
ADDB UL+1,U ADD TOP
STB YCENT,U THIS IS
BRA CCONT
CENTOK STB YOF,U
CCONT LDD ,X FETCH H,W
STD WH,U SAVE
STB YHITE,U HITE FOR FIRST ERASE
LDB #1 HEIGHT IS 1 FOR DMA
EORA #$4
EORB #$4
STD DMAWH,U FORMED
LDX 2,X GET DATA POINTER
STX PICPTR,U SAVE OBJECT DESC
LDD #$100 1 UNIT IS MIN
STD YSIZER,U
CLR XSIZER,U
LDA #$10 NUMBER OF BYTES TO ERASE, NUMBER OF FRAMES LEFT
STA FRAMES,U
BSR DATALD LOAD THE ROW POINTERS
EXBYE PULS X,D,U,PC,Y AND RETURN TO CALLER
* THIS CODE DMA'S THE DMASIZONTAL LINES
* A JUMP INTO HERE IS MADE BASED ON NUMBER OF
* DMASIZONTAL LINES IN OBJECT
BSLOOP LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
BSSIZE EQU *-BSLOOP
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
ADDD XSIZE KICK POINTER TO NEXT ONE
LDX ,Y++ GET THE ROW POINTER
STX DMAORG THIS IS ORIGIN
STD DMADES D IS DEST
STU DMACTL THIS IS THE CONTROL REGISTER
CLI
PULS Y,PC RESTORE Y, RETURN
ERLOOP STD DMADES DEST TO ERASE
STU DMACTL-1 BYTE TO DO IT
ADDD XSIZE ADD OFFSETS
ERSIZ EQU *-ERLOOP
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
STD DMADES
STU DMACTL-1
ADDD XSIZE
CLI
RTS
ERASE LDB YHITE,Y ACTUALLY PLOTTED
SUBB #16 MAX OF 16
NEGB
ASLB
ASLB
ASLB
LDX #ERLOOP
ABX
LDD XSIZER,Y
STD XSIZE
LDA RWCTMP GET RWBYTE
LDB #$12 ERASE
TFR D,U
LDD #0
SEI
STD DMACON CONSTANT, AND HIGH HALF OF DMAORG
LDD DMAWH,Y
STD DMASIZ
LDD UL,Y DMADESINATION STARTS WITH UPPER LEFT
JMP ,X
KILEXP LDU #EXPTR LETS WALK LIST TO FIND HIM
KILEX2 CMPY ,U ARE WE SET
BEQ KILEX1 YEP
LDU ,U KEEP WALKING
BNE KILEX2 STILL STUFF THERE
SEI
BRA * ERROR TRAP
KILEX1 LDD ,Y GET GUY WE POINT AT
STD ,U POINT AROUND US
LDD EXFREE
STD ,Y APPEND FREE LIST
STY EXFREE
LEAY ,U RETURN GUY BEFORE US TO WALK FROM
RTS DONE!
*
*WRITE YOUR APPEAR!!!
*Y=EXPLOSION
AWRITE LDD YSIZER,Y
SUBD #$100
CMPA YSIZER,Y ANY SIZE CHANGE?
BNE AWRIT0 YES
STB YSIZER+1,Y NO DICE
RTS
AWRIT0 JSR ERASE
LDA STATUS
BNE AWRIT1
LDD PX SCROLL THE COCK SUCKER
STA XCENT,Y
ADDB YOF,Y
STB YCENT,Y
AWRIT1 LDA WH+1,Y GET HEIGHT
STA HITE PRELIMINARY ATTEMPT AT HEIGHT
LDD YSIZER,Y GET CURRENT SIZE
SUBD #$0100 TAKE AWAY SOME SIZE
CMPA #1
BHI APGO DONE!
LDU #APPTR FIND HE WHO POINTS AT HIM....NOW KILL IT
BRA KILEX2 NOW ITS JUST LIKE AN EXPLODE KILL
WRITE DEC FRAMES,Y ONE LESS FRAME
BEQ KILEXP DONE
LDA WH+1,Y GET HEIGHT
STA HITE
LDD YSIZER,Y
ADDD #$100
APGO STA YSIZE
STD YSIZER,Y
LSRA 1/2 FOR X SIZE
STA TEMP2 ALSO SAVE TO ADD 1/2 SIZE UNIT FOR CENTER LINE
LDB SLOPE,Y CHECK SLOPE
BPL APGG1 POSITIVE
NEGA NEGATIVE
APGG1 STA XSIZER,Y AND SAVE
STA XSIZE SCRATCH SOME SPEED
LDB YOF,Y CHECK FOR ZERO OFFSET
BNE APGO1
STB TEMP2 IF DOWN FROM TOP....FIX TOP ONE (OBSCURE BUG)
APGO1 LDA YSIZE
LDB YOF,Y GET OFFSET
STB YOFF SAVE FOR X CALCULATION
MUL DISTANCE UP FROM CENTER
STD TEMP1 SAVE
LDB YCENT,Y GET CENTER
CLRA
SUBD TEMP1 LETS BE GENERAL PURPOSE
ADDB TEMP2 ADD 1/2 SIZE
ADCA #0 AND PROPAGATE
BNE CHK2 NO GOOD..TIME TO SCREW AROUND
*
* DON'T WORRY EUGENE...I GOT THIS FIX THIS TIME
*
CMPB #YMIN
BHI CHK3 IN RANGE
CHK2 DEC HITE 1 LESS
DEC YOFF
ADDB YSIZE BRING BACK FROM NEGATIVE NOWHERE
ADCA #0
BNE CHK2 AND LOOP A WHILE
CMPB #YMIN POSITIVE-VILLE...BIG ENOUGH
BLS CHK2 NOPE
CHK3 STB UL+1,Y STORE IN PLACE
LDA YOFF ACTUAL Y OFFSET USED
LDB XSIZE WHICH SLOPE??
BMI XNEG BUMMER
MUL FIND DEFLECTION
STD TEMP1 WHERE HAVE I SEED CODE LIKE THIS
LDB XCENT,Y GET X "CENTER"
CLRA X CENTER HAS BEEN COMPUTED
SUBD TEMP1 FIND WHERE LEFTMOST X OCCURS
TSTA NEGATIVE??
BNE CKK2A YEP...SHIFT IT IN
CMPB #XMIN IN RANGE??
BHI CKK3AA RIGHT ON
CKK2A CLR YYCNT COUNT TO UDPATE 1 STARTING POINT
CKK2B DEC HITE CHOP SOME MORE AWAY
INC YYCNT INCICATE 1 MORE
ADDB XSIZE ADD THE X UNITS
ADCA #0
BNE CKK2B AND ITERATE
CMPB #XMIN
BLS CKK2B THANK YOU SIR MAY I HAVE ANOTHER
CKK3C STB UL,Y THIS IS THE UPPER LEFT X
LDB YYCNT GET THE YER
LDA YSIZE GET Y SIZE
MUL NUMBER OF Y UNITS FROM X CLIP
ADDB UL+1,Y
STB UL+1,Y
BRA CKK3B
XNEG NEGB MAKE SIZE POSITIVE (NEG STATE BY CONTROL HERE)
MUL NUMBER OF BYTES POS DISPLACEMENT
ADDB WH,Y ADD IN THE WIDTH, (GUAR NO CARRY IF SIZE<32I
ADDB XCENT,Y ADD CENTER TO FIND LAST PIXEL PLOTTED
ADCA #0 ALL RIGHT!
BNE XN2 NO GOOD...BIG CARRY
CMPB #XMAX IN RANGE??
BLS CKK3A SAME IS OK SINCE THIS IS 1 BEYOND OB
XN2 CLR YYCNT WE NEED TO KNOW HOW MANY CLIPPED
XN22 DEC HITE 1 MORE Y UNIT
INC YYCNT
ADDB XSIZE ADD THE SIZE (REMEMBER, ITS NEGATIVE)
ADCA #$FF ADD EXTENDED SIGN
BNE XN22 STILL TOO LARGE
CMPB #XMAX DID WE MAKE IT??
BHI XN22 NOPE
SUBB WH,Y REMOVE THE WIDTH TO GET BACK TO LEFT
BRA CKK3C ADJUST Y FOR THE DAMAGES
* (CKK3C IS UP, EUGENE)
CKK3A SUBB WH,Y GET BACK TO LEFT OF OB
CKK3AA STB UL,Y SAVE GOOD X
CKK3B LEAX DATA,Y POINT AT FIRST ITEM
LDB WH+1,Y GET HEIGHT
SUBB HITE FIND NUMBER WE WILL SKIP
ASLB POINTERS ARE 2 BYTES
ABX WE NOW POINT AT FIRST ONE WE WILL USE
*
* TIME FOR THE BUTT CLIP
*
LDA HITE GET HEIGHT
DECA
LDB YSIZE FIND FILL DEFLECTION
MUL
ADDB UL+1,Y ADD FIRST POINT
ADCA #0 FIND FULL DEFLECTION
BEQ CHK4 AOK
CHK5 DEC HITE 1 LESS
BEQ KLJMP EXIT IMMEDIATELY ON TOTAL CLIP
SUBB YSIZE 1 LESS DOWNWARD
SBCA #0
BNE CHK5
CHK4 CMPB #YMAX
BHS CHK5
LDA HITE GET HITE BACK
DECA FIRSTIES DON'T COUNT
LDB XSIZE GET X SIZE
BMI XNT NEGATIVE SLOPE
MUL DEFLECTION OF LAST GUY
ADDB WH,Y ADD WIDTH
ADDB UL,Y ADD STARTING X
ADCA #0 PROP IT
BEQ NCK4 NOT HUGE
NCK5 DEC HITE TAKE 1 AWAY
BEQ KLJMP TOTAL CLIP...BYE
SUBB XSIZE TRY AND BRING DOWN TO SIZE
SBCA #0
BNE NCK5
NCK4 CMPB #XMAX
BHI NCK5 EQUAL IS OK
BRA NCK6
XNT NEGB MAKE
MUL
STD TEMP1 SAVE OFFSET
LDB UL,Y GET UPPER LEFT
CLRA
SUBD TEMP1 REMOVE OFFSET
TSTA
BEQ NNCK4 NOT WAY TOO SMALL
NNCK5 DEC HITE 1 LESS
BEQ KLJMP
SUBB XSIZE ADDING NEG MOVES US POSITVE
SBCA #$FF SUB SIGN EXT
BNE NNCK5 KEEP GOING
NNCK4 CMPB #XMIN
BLS NNCK5 KEEP GOING
* FIND "LOOP" ENTRY
NCK6 LDA HITE GET HEIGHT
BNE NOKILE
KLJMP JMP KILEXP NO HEIGHT
NOKILE STA YHITE,Y SAVE FOR ERASE
SUBA #16 16 = 0 OFFSET, 0 = 16 OFFSET
NEGA
LDB #BSSIZE SIZE OF ITERATION
MUL
ADDD #BSLOOP BEGINNING
PSHS D,Y SETUP STACK AS FOLLOWS:
* PTR -> D = JUMP ADDRESS
* Y = PUSHED TO SAVE FOR RTS
* <RETURN ADDRESS>
* PULS Y,PC AT END OF LOOP CAUSES PROPER RETURN
LDU #$0A0A CONTROL REGISTER
LDD DMAWH,Y GET WH
SEI NO INTS BABY
STD DMASIZ
LDD UL,Y GET DMADESINATION IN D
LEAY ,X MAKE Y POINT AT PROPER DATA GUY
RTS RETURN, MY ASS!
*
*UPDATE YOUR DIAGONALS
*
DXUPDV LDY EXPTR
BEQ APUPD
DXUPDL JSR ERASE
JSR WRITE
LDY ,Y
BNE DXUPDL
APUPD LDY APPTR
BEQ APUPDX
APUPDL JSR AWRITE
LDY ,Y
BNE APUPDL
APUPDX RTS
END