robotron/RRX7.ASM

478 lines
10 KiB
NASM
Executable File

OPT NOL
LIB RRF
OPT LIS
STTL EXPLOSIONS & APPEARS
*
*EXPLOSION DATA STRUCTURE
*
NEXT EQU $00
PICPTR EQU $02
YCENT EQU $04
YOF EQU $05
YSIZER EQU $06
FRAMES EQU $08
UL EQU $09
WH EQU $0B
DMAWH EQU $0D
YHITE EQU $0F
DMACNT EQU $10
EXSIZE EQU $12
*
YSIZE EQU HXRAM Y SIZE MUST HAVE SAME ADDRESS AS H'S XSIZE
*
ORG EXPRAM
EXPTR RMB 2
APPTR RMB 2 APPEAR POINTER
EXFREE RMB 2
HITE RMB 1
TEMP1 RMB 2
TEMP2 RMB 1
PTACT RMB 2
ORG RXORG
JMP EXINV
JMP EXSTV
JMP APSTV
JMP EXUPDV
JMP PDTHV
JMP HVEXV
JMP DDXST
JMP AAP
JMP HORAP
JMP HOREX
*
*INIT EXPLOSIONS
*
EXINV CLR EXPTR
CLR EXPTR+1
CLR APPTR
CLR APPTR+1
JSR HXINIT
JMP DXINIT
*
*ALLOCATE EXPLOSION BLOCK
*
GETBLK PSHS X
LDU OFREE
BEQ NOBLK NONE
LDX ,U GET NEXT
STX OFREE
LDX EXPTR GET LIST
STX ,U APPEND US
STU EXPTR
CLC
PULS X,PC RETURN IN U
NOBLK SEC
PULS X,PC
*
*GET AN APPEAR BLOCK
*
GETAP PSHS X
LDU OFREE
BEQ NOBLK
LDX ,U
STX OFREE
LDX APPTR
STX ,U
STU APPTR
CLC
PULS X,PC
* X = POINTER TO W,H,PTR
* D = UPPER LEFT
* CENTMP = COORD OF CENTER
AAP PSHS X,Y,D,U
BSR GETAP
BCS APBY
STD UL,U STORE COORDINATE UPPER LEFT
LDD #$E0E SLOW FOR ATTRACTER
STD DMACNT,U
BRA AAP1
GETBAL PSHS A
LDA FREEPL+1
ANDA #$F
PULS A,PC
* HORIZONTAL APPEAR TRAP
HORAP BSR GETBAL
LBNE HAPSTX
PSHS X,Y,D,U
BRA APSTTT
HOREX BSR GETBAL
LBNE HEXSTX
PSHS X,Y,D,U
JMP EXST1A
*
*START AN APPEAR
*X=OBJ PTR,CENTMP=EXPLOSION CENTER X,Y
*
APSTV PSHS X,Y,D,U
APSTTT BSR GETAP GET AN APPEAR BLOCK
BCS APBY NONE
LDD #$A0A CONTROL FOR NORMAL
STD DMACNT,U
LDD OBJX,X
STD UL,U
LDX OPICT,X
AAP1 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
APBY PULS X,D,U,PC,Y AND RETURN TO CALLER
*
*HORIZ+VERT
*
HVEXV LDD #$0100 FORCE VERT
STD LASDIR
BSR EXSTV
JMP HEXST
*
*DUAL DIAGONALS
*
DDXST LDD #$0101 RIG TWO DIAGONALS
STD LASDIR
BSR EXSTV
LDA #$FF
STA LASDIR
*
* EXSTV - X=OBJECT PTR, CENTMP=CENTER OF IMPACT (X,Y)
*
EXSTV PSHS X,U,D,Y
LDA LASDIR
BNE EXST1
JSR HEXST START A HORIZ GUY
BCC EXBYE O K
BRA EXST1X UNABLE TO GET IT UP
EXST1 LDB LASDIR+1
BEQ EXST1A NO Y COMPONENT, STRAIGHT VERTICAL
EORA LASDIR+1 CALC SLOPE
COMA
JSR DXST
BCC EXBYE
BRA EXST1X ABORTED
EXST1A JSR GETBLK GET A BLOCK TO USE
BCC EXST2 G OT ONE
EXST1X LDY OPICT,X ABORT THE SUCKER
LDD OBJX,X
JSR PCTOFF OFF THE IMAGE
BRA EXBYE
EXST2 LDD OBJX,X
LDX OPICT,X
STD UL,U STORE UPPER LEFT (FIRST FRAME)
LDD #$A0A DMA GUY
STD DMACNT,U
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 1,X GET HEIGHT
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 LDY #HCK2+1331
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
IFNC &A,NO
LDA STATUS
BMI NOCKK NOT IN GAME OVER!
LDA -1331,Y GET CHECK BYTE
CMPA #$4A IS IT THE MAGIC NUMBER
BEQ NOCKK ITS OK
LDA LSEED
BNE NOCKK
LDB HSEED
LDA #$98
PSHS D
STU [,S]
PULS D
ENDIF
NOCKK LDX 2,X GET DATA POINTER
STX PICPTR,U SAVE OBJECT DESC
LDD #$100 1 UNIT IS MIN
STD YSIZER,U
LDA #$10 NUMBER OF BYTES TO ERASE, NUMBER OF FRAMES LEFT
STA FRAMES,U
EXBYE PULS X,D,U,PC,Y AND RETURN TO CALLER
ERSIZ EQU 6
BSSIZE EQU 11 SIZE OF LOOP ELEMENTS IN OTHER FILE
ERASE LDB YHITE,Y ACTUALLY PLOTTED
SUBB #16 MAX OF 16
NEGB
LDA #ERSIZ
MUL
LDX ELOOPV LOAD START OF ERASE LOOP
ABX
PSHS X PLACE TO JUMP TO
LDA YSIZER,Y
STA YSIZE
LDA UL,Y GET UPPER LEFT
LDB #$12
SEI
STA DMADES HIGH HALF OF SCREEN STUFF
LDA UL+1,Y SO THAT COMMON LOOP WORKS
LDU #0
STU DMACON CONSTANT, AND HIGH HALF OF DMAORG
STA DMAORG+1 LOW HALF OF ORIG
LDU DMAWH,Y
STU DMASIZ
LDU #DMADES+1 Y CHANGES FOR US
LDX #DMACTL ADD SOME SPEED
RTS AND JUMP TO THE LOOP
*
*KILL EXPLOSION
*Y= EXP TO KILL
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 OFREE
STD ,Y APPEND FREE LIST
STY OFREE
LEAY ,U RETURN GUY BEFORE US TO WALK FROM
RTS DONE!
FCC ' ROBOTRON: 2084 '
FCC ' COPYRIGHT 1982 WILLIAMS ELECTRONICS INC. '
FCC ' ALL RIGHTS RESERVED '
*
*APPEAR WRITE
*Y=APPEAR
AWRITE LDD YSIZER,Y
SUBD #$0080
CMPA YSIZER,Y CHANGE?
BNE AWRIT0 UPDATE IT
STB YSIZER+1,Y STORE FRACT+QUIT
RTS
AWRIT0 JSR ERASE
LDA STATUS
BNE AWRIT1 SCROLL EM
LDD PX
STA UL,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
CMPA #1 DONE??
BHI AWW2
BSR APGO PUT IT OUT ONCE MORE
AWW1 LDU #APPTR
JMP KILEX2 AND KILL IT
AWW2 SUBD #$080 TAKE AWAY SOME SIZE
CMPA #1
BHI APGO DONE!
LDA DMACNT,Y GET CONTROL
CMPA #$E SLOW A MODE STUFF??
BNE AWW1 NO
LDA #1 FORCE SIZE OF 1
BRA APGO FINISH, THEN KILL!
*
*WRITE EXPANDED IMAGE
*
WRITE DEC FRAMES,Y ONE LESS FRAME
LBEQ KILEXP DONE
LDA WH+1,Y GET HEIGHT
STA HITE
LDD YSIZER,Y
ADDD #$100
APGO STA YSIZE
STD YSIZER,Y
LSRA 1/2 AND SAVE
LDB YOF,Y CHECK FOR ZERO OFFSET
BNE APGO1
CLRA IF DOWN FROM TOP....FIX TOP ONE (OBSCURE BUG)
APGO1 STA TEMP2
LDX PICPTR,Y GET DATA POINTER
LDA YSIZE
LDB YOF,Y GET OFFSET
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
CMPB #YMIN
BHI CHK3
CHK2 DEC HITE
ADDB YSIZE
ADCA #0
BNE CHK2
CHK1 CMPB #YMIN
BLS CHK2
STB UL+1,Y STORE IN PLACE
LDD WH,Y
SUBB HITE
MUL
ABX
BRA CHK3A
CHK3 STB UL+1,Y
CHK3A 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
SUBB YSIZE 1 LESS DOWNWARD
SBCA #0
BNE CHK5
CHK4 CMPB #YMAX
BHS CHK5
* FIND "LOOP" ENTRY
LDA HITE GET HEIGHT
LBEQ KILEXP
STA YHITE,Y SAVE FOR ERASE
SUBA #16 16 = 0 OFFSET, 0 = 16 OFFSET
NEGA
LDB #BSSIZE SIZE OF ITERATION
MUL
ADDD WLOOPV ADD THE START OF THE LOOP
PSHS D,Y
LDU DMACNT,Y DMA CONTROL REG
LDD DMAWH,Y GET WH
SEI NO INTS BABY
STD DMASIZ
LDA UL,Y GET X OF DMADESINATION
STA DMADES
LDB WH,Y GET INITIAL X WIDTH (AMOUNT TO ADD TO SOURCE PTR)
LDA UL+1,Y GET Y HEIGHT AT START
LDY #DMADES+1 PLACE TO CHANGE IN LOOP
RTS JUMP INTO IT
*
*EXPLOSION,APPEAR UPDATE
*
EXUPDV LDY EXPTR
BEQ APUPD
EXUPDL JSR ERASE
JSR WRITE
LDY ,Y
BNE EXUPDL
APUPD LDY APPTR
BEQ APUPDX
APUPDL JSR AWRITE
LDY ,Y
BNE APUPDL
APUPDX JSR HXUPD HORIZ UPDATE
JMP DXUPD
*
*GENIES BITCHEN 330AM PDEATH
*
PDTHV LDU CRPROC
PULS D
STD PD6,U
LDA #10
STA PD,U
LDX #PLOBJ
JSR DMAOFF
PDTH0 LDX #PLOBJ
LDA #$99
JSR OPON
NAP 2,PDTH1
PDTH1 LDA SEED
ANDA #3
LDX #PDCTAB
LDA A,X
LDX #PLOBJ
JSR OPON
DEC PD,U
BEQ PDTH2
NAP 6,PDTH0
PDTH2 EQU *
JSR GNCIDE
JSR COLST
JSR KILL OFF DECAY
LDU CRPROC
LDX #PD2TAB
STX PD,U
LDX #PLOBJ
LDA #$CC
JSR OPON
PDTH3 LDX PD,U
LDA ,X+
STA PCRAM+$C
BEQ PDTH4
STX PD,U
NAP 4,PDTH3
PDTH4 LDX #PLOBJ
CLR OFLAV,X
JSR DMAOFF
JSR COLST
LDU CRPROC
JMP [PD6,U]
PDCTAB FCB $00,$11,$33,$77
PD2TAB FCB $FF,$F6,$AD,$A4,$5B,$52,$09,$0
END