smashtv/TANK.ASM

2246 lines
41 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.FILE 'TANK.ASM'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL
;
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
; .INCLUDE "MARK.EQU"
;
;SOUNDS EXTERNAL
;
.REF EXP3,MISS2
;SYMBOLS EXTERNALLY DEFINED
;
.REF TANKDIFF,TANKDIFF2,TNKHITS
.REF BEGINOBJ2,BEGINOBJ,RANGRAND,FRANIM,INTO16
.REF P2DATA,P1DATA,SCRADD2,GET_WVADDR,DO_DIFF2,RANDPER
.REF GAMSTATE,WAVEYX,DEXIT,CIRCUIT,GETFPAL,ECON
.REF KEEPXY,RAMXY,WAVE_RAM,HALT,EHALT,XYSKOBJ
.REF GETADIR2,TOID_ON,PCNT,GETUGH
.REF SET_GATE_2,DRINF,SMLEXP
.REF WAVE,ADPCS1,PCTOT
.REF BOOM2,DELPAL,PLYROBJS,BOOM3
.REF FROMDR,GET_VALID_XY,ENON
.REF BULL_EXP_LIST,RECOIL
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF GETHDR,KILL_TK,KILL_TS,ABALL,WAY,FRANIM_DIE
.DEF SPAWN_TNK,KILL_TNK,ONSCRN_TNK,TURN_TANK,TNK_DN
.DEF TNK_CNT,KILL_TORSO,ADRIVER,KILL_CBALL,CVRT,DOBLO
.DEF CVRT2,MEBNCS,BULL_TOP,KILL_CBALL2,MAXTNK
.DEF TTORSO,KILL_TNKR,TSO_EXP,TSO_EXP2
.DEF FLASHME,GET_STANDT2
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS SCNTR,8 ;SIMPLE CNTR FOR RANDOMNESS
.BSS MAXTNK,8 ;MAX NUMBER OF TANKS ALLOWED ON SCRN
.BSS TNK_CNT,16 ;TOTAL TANKS ON SCREEN
.BSS TMP,16
.BSS TNK_DN,16
.BSS MEBNCS,16
;
;EQUATES FOR THIS FILE
;
;TANK DATA STRUCTURE
;
ADRIVER .EQU PDATA ;UHB A DRIVER OR NOT?
ABSORBT .EQU PDATA+8 ;UHB-SHOTS ABSORBED
DIR .EQU PDATA+16 ;UHW OBJECT DIRECTION
DIS .EQU PDATA+32 ;OBJECT DISTANCE COUNT
CFLAGS .EQU PDATA+48 ;CONTROL FLAGS FOR OBJECT
SK_DIR .EQU PDATA+64 ;SEEK DIR FOR SPIN
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
HSPD .EQU PDATA+96
H2SPD .EQU PDATA+128
VSPD .EQU PDATA+160
V2SPD .EQU PDATA+192
REACT .EQU PDATA+224 ;UHB
BUMP .EQU PDATA+232 ;UHB
DELYDT .EQU PDATA+240 ;UHB
WAY01 .EQU PDATA+248 ;UHB
MYTSO .EQU PDATA+256 ;UHL TORSO POINTER ABOVE ME
;
;
;TORSO DATA STRUCTURE
;
KPTANK .EQU PDATA ;UHL
ABSORB .EQU PDATA+32 ;UHB-SHOTS ABSORBED
TDIR .EQU PDATA+40 ;UHW OBJECT DIRECTION
TCFLAGS .EQU PDATA+56 ;UHW CONTROL FLAGS FOR OBJECT
TSK_DIR .EQU PDATA+72 ;UHW SEEK DIR FOR SPIN
KPTANKO .EQU PDATA+88 ;UHL
MODE .EQU PDATA+120 ;UHB
TCNTR .EQU PDATA+128 ;UHB
SPDLY .EQU PDATA+136 ;UHB
FIRED .EQU PDATA+144 ;UHB
TPNTR .EQU PDATA+152 ;UHB
TOIDLR .EQU PDATA+160 ;UHB 0=LEFT OF TOID,1=RGT OF TOID
;
;LEVEL .EQU PDATA+86 ;UHW DIFFICULTY LEVEL FOR SPEEDS ETC.
;
;EQUATES
;
TOTBNCS .EQU 1 ;# OF BOUNCES TANK BULLETS HAVE IN THEM
;TOTHIT .EQU 25 ;HITS IT TAKES TO DESTROY TORSO
TOIDHIT .EQU 51 ;HITS IT TAKES TO DESTROY TORSO ON MUTOID MAN
HITTNK .EQU 3 ;HITS IT TAKES TO DESTROY TANK
;
HSPEED .EQU 012000H
HBSPEED .EQU 04000H
.TEXT
;
SPAWN_TNK:
;SPAWN TANK IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
; MOVE @TNK_DN,A0
; JRNZ TANK_OU
MOVE @HALT,A0
JRNZ TANK_OUT
MOVE @TNK_CNT,A2 ;MOVE BYTE (# TANKS ON SCRN) TO A2
MOVB @MAXTNK,A3
CMP A3,A2 ;TANKS MAXED OUT?
JRGE TANK_OUT ;
MOVE @CIRCUIT,A0
JRZ YES
CMPI 2,A0
JRNZ POP
YES
MOVB A3,@ENON ;INDICATES ENEMY TO NEUTRAL IS ON!
POP
CREATE TNKPID,ATNK ;START ONE TANK
TANK_OUT:
RETS
ONSCRN_TNK:
;A2=# OF TANKS TO CREATE ON SCREEN
MOVB A2,@ENON ;INDICATES ENEMY TO NEUTRAL IS ON!
OH1 PUSH A2 ;CREATE A BUNCH OF THEM
CREATE TNKPID,OTNK
PULL A2
DSJNE A2,OH1
MOVE @CIRCUIT,A0
JRZ RTO
CMPI 2,A0
JRZ RTO
CLR A0
MOVB A0,@ENON
RTO
RETS
OTNK:
;OTNK IS CALLED AT THE START OF A WAVE TO PLACE X # OF TANKS ON SCREEN
;AT THE BEGINNING OF A WAVE
CLR A0
MOVB A0,*A13(REACT)
MOVB A0,*A13(BUMP)
MOVK 1,A0
MOVE A0,*A13(DIR)
CLR A11 ;A11 CLR=SKIP CIRCLE TABLE ALIGNMENT
CALLA GET_VALID_XY ;MAKE SURE NEW TANK IS NOT
;OVERLAPPING ANY EXISTING SHAPE
;WHICH IS ALREADY ON SCRN AT START
;A0 & A1 ARE SET UP
;ADD IN OFFSETS FOR THIS PARTICULAR ARENA
MOVE @GAMSTATE,A2
CMPI INAMODE,A2
JREQ DMD
MOVE @WAVEYX,A2,L
;A2=PACKED OFFSETS
MOVX A2,A3
SLL 16,A3
ADD A3,A0 ;ADJUSTED A0 XVAL!
ANDI 0FFFF0000H,A2
ADD A2,A1 ;ADJUSTED A1 YVAL!
DMD
;A0,A1 ARE SETUP.
CALLA IH1 ;INIT TANK (BEGINOBJ)
CALLA BEGINOBJ2
; MOVE @WAVE,A0
; CMPI 10,A0
; JRC NOCHNG
;HIGH WAVE, CHANGE PAL
;CHANGE TO OTHER PAL
; MOVI GLDP,A0
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
;NOCHNG
CALLA SETUP_TNK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVI HSPEED,A1 ;TANK SPEED
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
CALLA GET_DIS ;SET DISTANCE CNT FOR THIS DIR
CALLA GET_STAND ;TANK STANDS AND SPINS UNTIL A MATCH
;THIS GETS CORRECT OIMG, OFLAGS
JRUC LUP_TOP
ATNK:
;YES A NEW TANK WILL APPEAR
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
;THIS TANK WAS SPAWNED FROM 'WAVE OVERLORD' CODE
CLR A0
MOVB A0,*A13(REACT)
MOVB A0,*A13(BUMP)
MOVB A0,*A13(ABSORBT)
CALLA INIT_TNK ;INITIAL TANK PARAMS (BEGINOBJ)
JRNC AZ
DIE
AZ
CALLA SETUP_TNK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVI HSPEED,A1 ;TANK SPEED
CALLA DO_DIFF2
MOVI 20,A0
MOVE A0,*A13(DELYDT)
MOVE *A13(DIR),A0
CALLA INTO16
CALLA GET_RUN ;GET FIRST FRANIM PNTR FOR
;THIS TANKS DIRECTION
;
; LOOP TOP FOR TANKS
;
LUP_TOP:
CLR A0
MOVB A0,@TOID_ON
MOVE A13,A10
CREATE TNKPID,TTORSO
MOVK 1,A0
MOVB A0,*A13(ADRIVER)
LUP_TP:
;TOP OF TANK LOGIC
MOVE @EHALT,A0
JRZ MV ;BR=HALT ALL TANKS!!
;PLAYER IS WALKING INTO ARENA
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
SLEEP 2
JRUC LUP_TP
MV:
MOVB *A13(REACT),A0
CMPI 2,A0
JRNE MV2
;TANK HAS JUST COLLIDED WITH ANOTHER TANK.
;BACK UP
;THEN SPIN AS I WAS GOING TO
;
SLEEP 20
MOVI HBSPEED,A1 ;TANK SPEED BACKWARDS
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
MOVE *A13(DIR),A0
SLL 3,A0
ADDI REVTBL,A0
MOVB *A0,A0
CALLA INTO16
MOVI 15,A0
MOVE A0,*A13(DIS)
MOVK 1,A0
MOVB A0,*A13(REACT)
MV2:
MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
;THIS TANK IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CALLA WAY
JRC DIT ;INC
;DEC=CLRC
MOVI 0,A1
MOVB A1,*A13(WAY01)
JRUC DIT0
DIT MOVK 1,A1
MOVB A1,*A13(WAY01)
DIT0
MOVE A0,*A13(DIR),W
CALLA GET_STAND ;DOES ANI OF CORRECT VIEW
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JREQ GOODNEWS
;ANI IN NEW STAND/SPIN DIR
SLEEP 4
JRUC LUP_TP
GOODNEWS:
MOVI 300,A0
CALLA RANDPER
JRNC REGU
;PAUSE TANK BEFORE IT MOVES
SLEEP 20
MOVB *A13(DELYDT),A0
JRNZ REGU
MOVB *A13(BUMP),A0
JRNZ REGU
MOVI 400,A0
CALLA RANDPER
JRC MORE
REGU SLEEP 20
CALLA GET_RUN ;ZEROS STAND FLAG ALSO
CALLA GET_DIS ;SEND FOR THIS DISTANCE
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
MOVI HSPEED,A1 ;TANK SPEED
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
MOVE *A13(DIR),A0
CALLA INTO16 ;GET PROPER VELOCITY FOR THIS DIR
SLEEP 1
JRUC LUP_TP
NOSPN: MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOTNK ;BR=CONTINUE CURRENT DIRECTION
;TIME TO GET NEW DISTANCE
MOVB *A13(BUMP),A0
JRNZ TRN
MOVI [>23+60,>21+55],A2
MOVI [>FC-40,>171-55],A3
CALLA SCRTSTG
JRZ CONT ;BR=NOT INTO WALL
;ALMOST ABOUT TO RUN INTO A WALL
;A0= 3
; 1 2
; 4
MOVE *A13(DIR),A1
SLL 3,A1
ADDI TABL1,A1
MOVB *A1,A1
CMP A0,A1
JRNE CONT
;WALL IS RIGHT IN FRONT OF TANK
MOVI 10,A0
MOVE A0,*A13(DIS)
JRUC DOTNK
CONT CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVB *A13(REACT),A0
JRZ NSP1
;THIS TANK JUST BACKED UP FROM A HIT WITH ANOTHER TANK
MOVK 1,A1
MOVE A1,*A13(CFLAGS)
NSP1
; MOVB *A13(BUMP),A0
; JRNZ TRN
MORE SLEEP 20
;SPIN TANK SOME MORE
CALLA GET_DIS
CALLA GET_SK
SLEEP 1
JRUC LUP_TP
DOTNK:
;CHECK FOR WALL BORDERS!
MOVB *A13(DELYDT),A0
JRZ KS
DEC A0
MOVB A0,*A13(DELYDT)
JRUC DOANI
KS MOVI [>23+50,>21+45],A2
MOVI [>FC-20,>171-45],A3
CALLA SCRTSTG
JRZ DOANI ;BR=NOT INTO WALL
;A0=WALL HIT
; 3
;1 2
; 4
MOVB *A13(BUMP),A1
JRNZ DOANI
MOVB A0,*A13(BUMP)
;HAVE TANK GO BACKWARDS
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVI 0,A0
MOVB A0,*A13(DELYDT)
SLEEP 20
MOVI HBSPEED,A1 ;TANK SPEED BACKWARDS
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
MOVE *A13(DIR),A0
SLL 3,A0
ADDI REVTBL,A0
MOVB *A0,A0
CALLA INTO16
MOVI 15,A0 ;20
MOVE A0,*A13(DIS)
SLEEP 1
JRUC LUP_TP
REVTBL .BYTE 0,09,0,11,0,13,0,15,0,01,0,03,0,05,0,07,0
.EVEN
TRN:
DEC A0
SLL 5,A0
MOVI NEWANG,A1
ADD A0,A1
MOVE *A1,A1,L
MOVB *A1,A1
CMPI 14,A1
JRLO TRN1
.IF DEBUG
LOCKUP
EINT
.ENDIF
MOVK 1,A1
TRN1 MOVE A1,*A13(SK_DIR)
;TANK WILL SEEK TO A 45 DEGREE ANGLE
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
MOVI 5,A0
MOVB A0,*A13(DELYDT)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVB A0,*A13(BUMP)
SLEEP 20
JRUC LUP_TP
NEWANG .LONG HITL,HITR,HITT,HITB
TABL1 .BYTE 3,0,0,0,2,0,0,0,4,0,0,0,1
;
HITL .BYTE 05 ;,03,07,09,01,05,03,07
HITR .BYTE 13 ;,15,11,09,01,15,13,11
HITT .BYTE 09 ;,07,11,13,05,09,07,11
HITB .BYTE 01 ;,03,15,13,05,01,03,15
.EVEN
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
;DO FRANIM ANIMATION ON THIS MOVING TANK
DOANI
MOVE *A8(OXVEL),A0,L
MOVE *A8(OYVEL),A1,L
OR A0,A1
CMPI 0,A1
JRNE D1
SLEEP 2
MOVK 1,A0
MOVE A0,*A13(DIS)
JRUC LUP_TP
D1
CLR A1
JSRP FRANIM
JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
CALLA GET_RUN
CHECK_NEXT:
JRUC LUP_TP
GET_SK:
MOVE *A13(DIR),A1
GS CLR B0
MOVK 8,B1
CALLA RANGRAND
DEC A0
SLL 3,A0
ADDI BTAB,A0
MOVB *A0,A0
CMP A0,A1
JREQ GS
MOVE A0,*A13(SK_DIR)
;TANK WILL SEEK TO A 45 DEGREE ANGLE
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
RETS
;
BTAB .BYTE 1,5,9,13,1,5,9,13 ;3,7,11,15
.BYTE 1,5,9,13,1,5,9,13 ;3,7,11,15
.EVEN
SETUP_TNK:
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
;IF THIS IS AN ONSCREEN TANK, THEN ANY DIR IS OKAY!
;
CALLA GET_SK
;
; UPDATE TNK COUNT
;
MOVE @TNK_CNT,A0
INC A0
MOVE A0,@TNK_CNT
MOVI TANK,A2
CALLA GET_WVADDR
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL
MOVE A1,*A13(LEVEL),W
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS TANK
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES TANK CNT
MOVK 1,A1
MOVE A1,@TNK_DN
; CREATE 0,DEXIT
;
BZ
RETS
;
GET_DIS:
MOVI 25,B0
MOVI 50,B1
CALLA RANGRAND
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
RETS
WAY:
;SPIN LEFT OR RIGHT
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
;812
;7 3
;654
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
SUB A0,A1
MOVE A1,A2
ABS A1
CMPI 9,A1 ;5
JRLT N0
NEG A2
N0: BTST 31,A2
JRZ IC
INHERE: DEC A0
JRP TDEC
MOVK 16,A0 ;8
TDEC CLRC ;MEANS DEC
RETS
IC: INC A0 ;ROTATE TOWARD PLAYER
CMPI 17,A0 ;9
JRNE T1
MOVK 1,A0
T1: SETC ;MEANS INC
RETS
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS TANKS DIRECTION
;
MOVE *A13(DIR),A4
DEC A4
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
ADDI WALK_LIST,A4 ;CALCULATE OFFSET IN TABLE
MOVE *A4,A9,L ;MOVE TABLE VALUE INTO A9
;NEW ANIMATION SCRIPT
MOVE *A13(CFLAGS),A0
ANDI 0FFFEH,A0 ;
MOVE A0,*A13(CFLAGS) ;ZERO STANDING/SPIN FLAG
RETS
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
SPINFRMS:
.LONG TNK12A,TNK115A,TNK11A,TNK10A,TNK9A,TNK85A,TNK8A,TNK7A
.LONG TNK6A,TNK7A,TNK8A,TNK85A,TNK9A,TNK10A,TNK11A,TNK115A
TSPINFRMS:
.LONG MTK12,MTK115,MTK11,MTK10,MTK9,MTK85,MTK8,MTK7
.LONG MTK6,MTK7,MTK8,MTK85,MTK9,MTK10,MTK11,MTK115
TK_SPINFLGS:
.WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH
.WORD DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH
.WORD DMAWNZ+M_FLIPH
.WORD DMAWNZ,DMAWNZ,DMAWNZ
.WORD DMAWNZ,DMAWNZ,DMAWNZ
.WORD DMAWNZ,DMAWNZ
GET_STAND:
;ANI ONTO SCREEN THIS TANKS STANDING POSITION
MOVE *A13(DIR),A0 ;CURRENT DIR TANK IS FACING
DEC A0
ANDI 0FH,A0
MOVE A0,A2
SLL 5,A0
ADDI SPINFRMS,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI TK_SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RETS
GET_STANDT:
;ANI ONTO SCREEN THIS TANKS STANDING POSITION
MOVE *A13(TDIR),A0 ;CURRENT DIR TANK IS FACING
GET_STANDT2:
DEC A0
ANDI 0FH,A0
MOVE A0,A2
SLL 5,A0
ADDI TSPINFRMS,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI TK_SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RETS
SX: .LONG -020000H,01880000H,0CA0000H,0CA0000H
SY: .LONG 0540000H,0540000H,-280000H,0E80000H ;-22
SD: .WORD 5,13,9,1
INIT_TNK:
;INITIAL TANK POSITION,IMAGE SHAPE,AGE ETC....
;DO STFOBF AND GET A0 PNTR
MOVI 1,B0 ;DOORS 2-4 ONLY!
MOVI 4,B1
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
MOVE A0,A1
SLL 5,A1
ADDI DRINF,A1
MOVE *A1,A1,L
MOVB *A1,A1
JRZ G
CMPI 06,A1
JRGE G
;DOOR THIS GUY WILL BE SENT TO IS CLOSING RIGHT NOW. SO SEND HIM TO DOOR 4
SETC
RETS
MOVI 4,A0 ;DOOR 4
G MOVE A0,@TMP
;DOOR IS IN TMP
;NOW CHECK TO SEE IF THERE IS ROOM IN FRONT OF THIS DOOR TO BRING OUT A TANK
;IF NOT, DIE. OTHERWISE BRING HIM OUT.
DEC A0
MMTM SP,A0
MOVI UPLFT,A1 ;TOP/LEFT RANGE
SLL 5,A0
ADD A0,A1
MOVE *A1,A1,L ;PACKED X/Y OF UPPER LEFT
;
MOVI DNRGT,A2
ADD A0,A2
MOVE *A2,A2,L ;PACKED X/Y OF LOWER RIGHT
MOVI CLSNEUT|TYPTANK,A3
MOVB @MAXTNK,A0
CMPI 1,A0
JRZ ABC
;MULTIPLE TANKS ON SCREEN!
MOVI CLSENMY|TYPTANK,A3
MOVK 1,A0
MOVB A0,@ECON
ABC
CALLA ANYIN
JRNC NO
;THERE WERE TANKS INSIDE THE SPECIFIED BOX.
MMFM SP,A2
; SETC
RETS
NO
MMFM SP,A2
MOVI SD,A1
SLL 4,A2
ADD A2,A1
MOVE *A1,A1
MOVE A1,*A13(DIR)
MOVI SX,A1
SLL 1,A2
ADD A2,A1
MOVE *A1,A0,L
MOVI SY,A1
ADD A2,A1
MOVE *A1,A1,L
MMTM SP,A0,A1
MOVE @TMP,A0
MOVI >1F,A1
CALLA SET_GATE_2
MMFM SP,A0,A1
MOVI 20,A3
MOVE A3,*A13(DIS) ;CHANGE BASED ON TANKS SPEED?
CALLA IH1
CALLA BEGINOBJ
; MOVE @WAVE,A0
; CMPI 10,A0
; JRC NOCHNG0
;HIGH WAVE, CHANGE PAL
;CHANGE TO OTHER PAL
; MOVI GLDP,A0
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
;NOCHNG0
CLRC
RETS
ANYIN:
;A1=UPPER LEFT OF BOX PACKED Y/X
;A2=LOWER RIGHT OF BOX PACKED Y/X
;A3=OID OF OBJECT TO CHECK
;RETURNS C SET IF SOMETHING WAS FOUND IN THIS BOX
;C CLEAR IF NOT
MOVI OBJLST,A0
LP MOVE *A0,A0,L
JREQ CLC
MOVE *A0(OID),A5,W
ANDI 0FFFFH,A5
CMP A5,A3
JRNE LP
;NOW SEE IF THIS OID IS IN CHOSEN AREA
MOVE *A0(OXVAL),A5,L
MOVE *A0(OYVAL),A6,L
MOVE @WAVEYX,A7,L
;A2=PACKED OFFSETS
MOVX A7,A4
SLL 16,A4
SUB A4,A5 ;ADJUSTED A0 XVAL!
ANDI 0FFFF0000H,A7
SUB A7,A6 ;ADJUSTED A1 YVAL!
;A5,A6 ARE ADJUSTED X/Y VALS FOR THIS IMAGE
SRL 16,A5
MOVX A5,A6
;A6=PACKED Y/X OF IMAGE
CMPXY A6,A1
JRXGE LP
JRYGE LP
CMPXY A6,A2
JRXLE LP
JRYLE LP
;HIT
SET SETC
RETS
CLC CLRC
RETS
UPLFT .LONG [50,0],[50,250],[0,95],[150,95]
DNRGT .LONG [190,120],[190,440],[80,310],[250,310]
IH1: ;ENTER HERE IF ON SCRN TANK
MOVI TNK10A,A2 ;DOES NOT MATTER
MOVI 130,A3 ;119
MOVI CLSNEUT|TYPTANK,A5
MOVB @MAXTNK,A4
CMPI 1,A4
JRZ IH2
MOVI CLSENMY|TYPTANK,A5
IH2 CLR A6
CLR A7
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
RETS
TURN_TANK:
;CK REACTING FLAG
;STOP TANK
;START SPIN
MMTM SP,A1,A7
MOVE A0,A7
MOVE *A8(OPLINK),A0,L
MOVE *A0(CFLAGS),A1
BTST 0,A1
JRNZ RT
;CK TO SEE IF DIR OF THIS TANK IS GOING AWAY FROM TANK IT COLLIDED WITH.
MOVE *A0(DIR),A1
CMPI 1,A1
JRNE Z1
;UP
MOVE *A7(OYPOS),A7
MOVE *A8(OYPOS),A9
CMP A9,A7
JRNC RT
JRUC Z4
Z1 CMPI 5,A1
JRNE Z2
MOVE *A7(OXPOS),A7
MOVE *A8(OXPOS),A9
; ADDI 20,A9
CMP A9,A7
JRC RT
JRUC Z4
Z2 CMPI 9,A1
JRNE Z3
MOVE *A7(OYPOS),A7
MOVE *A8(OYPOS),A9
CMP A9,A7
JRC RT
JRUC Z4
Z3 CMPI 13,A1
JRNE Z4
MOVE *A7(OXPOS),A7
MOVE *A8(OXPOS),A9
; ADDI 20,A9
CMP A9,A7
JRNC RT
Z4
;THIS TANK IS NOT ALREADY REACTING TO A COLLISION
MOVE A0,A9
CREATE 0,MODS
MOVE A9,A0
MOVK 2,A1
MOVB A1,*A0(REACT)
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A1,*A8(OYVEL),L
MOVE *A0(DIR),A1
DEC A1
SLL 5,A1
ADDI NEWANGS,A1
MOVE *A1,A1,L
MOVB *A1,A1
MOVE A1,*A0(SK_DIR)
;TANK WILL SEEK TO A 45 DEGREE ANGLE
CLR A0
MOVB A0,*A13(DELYDT)
RT MMFM SP,A1,A7
RETS
MODS SLEEP 2
MOVE *A9(CFLAGS),A0
BTST 0,A0
JRNZ MODS
CLR A0
MOVB A0,*A9(REACT)
DIE
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
NEWANGS .LONG THIT12,0,THIT2,0,THIT3,0,THIT5,0
.LONG THIT6,0,THIT8,0,THIT9,0,THIT10,0
THIT9 .BYTE 05 ;,03,07,05 ;05,03,07
THIT3 .BYTE 13 ;,15,11,13 ;15,13,11
THIT12 .BYTE 09 ;,07,11,09 ;09,07,11
THIT6 .BYTE 01 ;,03,15,01 ;01,03,15
THIT2 .BYTE 13 ;,11,09,13
THIT5 .BYTE 13 ;,01,15,13
THIT8 .BYTE 01 ;,03,05,01
THIT10 .BYTE 09 ;,05,07,09
.EVEN
KILL_TNK:
MMTM SP,A1
MOVE A0,A10
MOVE *A0(OID),A9,W ;KILLERS OID
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
MOVE *A0(OPLINK),A1,L
MOVE *A8(OPLINK),A0,L
MOVB *A0(ADRIVER),A1
JRNE OKT
ANDI F_SUBT,A9
DEC A9
SLL 3,A9
ADDI PUNISHT,A9
MOVB *A9,A9
MOVB *A0(ABSORBT),A1
ADD A9,A1
MOVB A1,*A0(ABSORBT)
CMPI HITTNK,A1
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
JRLT OKTF
;ABSORBED ENOUGH HITS TO DESTROY IT
MOVI EXP3,A0
CALLA ONESND
;COME IN HERE IF SMART BOMB
;A8=TANK IMAGE PTR
;A10=KILLER PNTR
CREATE 0,TNK_EXP
;TANK_EXP WHEN IT WAKES UP
MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
CALLA DELOBJ
CLR A0
MOVB A0,@ENON
OKT MMFM SP,A1
RETS
OKTF PUSH A9
MOVI 018180000H,A9
CREATE 0,FLASHME
PULL A9
MMFM SP,A1
RETS
KILL_TK
;COME IN HERE IF SMART BOMB
;A8=TANK IMAGE PTR
CREATE 0,KILL_TK2
;TANK_EXP WHEN IT WAKES UP
MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILLS PROCESS IN A0
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A8(OID)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE *A8(OYPOS),A0
ADDI 034H,A0
MOVE A0,*A8(OYPOS)
RETS
KILL_TK2
MOVI BOOM3,A9
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0
CALLA DELOBJ
CLR A0
MOVB A0,@ENON
DIE
FLASHME:
;A9=COLOR TO FLASH WITH
;A8=IMAGE PNTR TO FLASH
;FLASH MORE?
MOVE *A8(OPAL),A10,L
OR A10,A9
CMP A9,A10 ;>18180000,A9
JREQ DI
; MOVE A9,A0 ;>18180000,A0 ;COLOR NUMBER
MOVE A9,*A8(OPAL),L
MOVE *A8(OFLAGS),A0,W
ORI 8,A0
MOVE A0,*A8(OFLAGS),W
SLEEP 2
ANDI 0FFFFH,A10
MOVE A10,*A8(OPAL),L
MOVE *A8(OFLAGS),A0,W
ANDI 0FFF7H,A0
ORI 2,A0
MOVE A0,*A8(OFLAGS),W
DI DIE
PUNISHT: .BYTE 3,3,5,20,20
.EVEN
KILL_TNKR
;IF RING HIT TANK, COME HERE
MMTM SP,A1,A7
MOVE *A0(OPLINK),A0,L
MOVB *A0(MYPLYR),A10 ;A10=1 OR 2
MOVI EXP3,A0
CALLA ONESND
CREATE 0,TNK_EXP2
;TANK_EXP WHEN IT WAKES UP
;IF THIS TANK HAS ADRIVER, THEN KILL IT ALSO!
MOVE *A8(OPLINK),A0,L
MOVB *A0(ADRIVER),A1
JRZ OOF
;YES I DO!
;KILL TORSO ALSO!
MOVE *A0(MYTSO),A1,L
MOVE *A1(OPLINK),A0,L
CALLA KILL
MOVE A1,A0
CALLA DELOBJ
MOVE *A8(OPLINK),A0,L
OOF CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
CALLA DELOBJ
CLR A0
MOVB A0,@ENON
MMFM SP,A1,A7
RETS
TNK_EXP2:
MOVE A10,A0
JRUC TE2
TNK_EXP:
;A10=KILLER IMAGE PNTR
MOVE *A10(OPLINK),A0,L
MOVB *A0(MYPLYR),A0
TE2
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
CMPI 1,A0
JREQ CGA
CMPI 2,A0
JRNZ CGAZ
MOVI P2DATA,A2
CGA
MOVI TNKPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
CGAZ MOVE @TNK_CNT,A3 ;DELETE A BNCR FROM CNT
DEC A3
MOVE A3,@TNK_CNT
CLR A6
CLR A7
CALLA GETANIXY
ADDI 0350000H,A2 ;A1=Y OFFSET
MOVE A2,A1
MOVE A3,A0
MOVI 199,A3 ;259
MOVI DMAWNZ|M_NOCOLL|M_FLIPV,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPNEUT,A5
MOVI EXPb1,A2
;PUT ON ANOTHER LIST OTHER THAN OBJLST!
;THE LIST WITH THE HIGHEST PRIORITY
CALLA BEGINOBJ2
MOVI BOOM2,A9
FRANIM_DIE
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0
CALLA DELOBJ
DIE
TTORSO:
;A10=A13 OF TANK THAT CREATED THIS TORSO
;TURN ON TORSO WITH SAME X/Y AS CURRENT A8
MOVB @TOID_ON,A0
JRZ TR1
;A9=0 IF ON LEFT OF MUTOID MAN,1=RIGHT
MOVB A9,*A13(TOIDLR)
MOVE A9,*A13(TDIR)
TR1 CLR A0
MOVB A0,*A13(ABSORB)
MOVB A0,*A13(MODE)
MOVK 1,A0
MOVB A0,*A13(SPDLY)
MOVB A0,*A13(TCNTR)
MOVE A10,*A13(KPTANK),L ;TANK PROC
MOVE A8,*A13(KPTANKO),L ;TANK OBJECT PNTR
;OR MUTOID LEFT SIDE TANK OBJECT
CALLA GETANIXY
CLR A6
CLR A7
MOVE A2,A1
MOVE A3,A0
MOVI 143,A3 ;133
MOVI DMAWNZ,A4
MOVI CLSENMY|TYPTORSO,A5
MOVI MTK10,A2
CALLA BEGINOBJ2
MOVE @TOID_ON,A0
JRZ NOCHNGA
; MOVE @WAVE,A0
; CMPI 10,A0
; JRC NOCHNGA
;HIGH WAVE, CHANGE PAL
;CHANGE TO OTHER PAL
MOVI PURPTK,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
NOCHNGA
MOVE *A8(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L
MOVB @TOID_ON,A0
JRNE FEFE
MOVE *A13(KPTANK),A0,L
MOVE A8,*A0(MYTSO),L
FEFE
MOVI 35,B0
MOVI 80,B1
CALLA RANGRAND
MOVB A0,*A13(TCNTR)
TLP_TOP:
;MODE 0=ROTATE WITH TANK. TORSO WILL ALWAYS POINT AT DIR TANK IS FACING.
;MODE 1=JUST SITTING ON TOP OF TANK, NOT CARING WHAT DIR TORSO IS FACING.
;MODE 2=ACTIVELY SEEKING A DIR TO SHOOT, THEN FIRE AT END OF SEEK.
;MODE 3=ACTIVELY SEEKING TO DIR TANK IS FACING.
;MODE 4=AIM TOWARD PLAYER
;MODE 5=CONTINUE TO FIRE IN CURRENT DIRECTION
;MODE 6=OSCILLATE AND FIRE
CALLA SIT ;ALIGN TORSO EVERY FRAME
MOVE @HALT,A0
JRZ DOG1
;NEED TO START THESE GUYS BACK UP AFTER YOU DIE
;CHECK NDSP1 STOP OBJ FLAGS! (NOMOV?)
SLEEP 2
JRUC TLP_TOP
DOG1
MOVE @EHALT,A0
JRZ MVZ ;BR=HALT ALL TANKS!!
;PLAYER IS WALKING INTO ARENA
SLEEP 2
JRUC TLP_TOP
MVZ
MOVB @TOID_ON,A0
JRNZ NOSPNT
MOVE *A13(KPTANK),A0,L
MOVE *A0(CFLAGS),A1,W
; BTST 0,A1
JRZ NOSPNT
MOVB *A13(MODE),A1
JRZ NOSPNT
CMPI 4,A1 ;AIM AT PLAYER
JREQ NOSPNT
CMPI 5,A1 ;SHOOTING AT PLAYER
JREQ NOSPNT
CMPI 6,A1 ;SHOOTING AT PLAYER
JREQ NOSPNT
MOVB *A13(SPDLY),A1
CMPI 7,A1
JRLT AF
MOVI 5,A1
AF
DEC A1
MOVB A1,*A13(SPDLY)
JRNN TAG
;THE TANK UNDER THIS TORSO IS SPINNING
MOVK 4,A0 ;SHOULD MATCH TANK ROTATION SLEEP TIME
MOVB A0,*A13(SPDLY)
MOVB *A13(WAY01),A1
;WAS *A0!
JRNZ INCIT
;TANK IS DEC TO LEFT!
DECIT MOVE *A13(TDIR),A0,W
CALLA INHERE
MOVE A0,*A13(TDIR),W
JRUC OUT
INCIT
;TANK IS ROTATING TO RIGHT
MOVE *A13(TDIR),A0,W
CALLA IC
MOVE A0,*A13(TDIR),W
OUT CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
JRUC TAG
NOSPNT MOVB *A13(MODE),A0
JRNZ NZ
CALLA MODECHNG
CALLA STIK
JRUC TAG
NZ CMPI 1,A0
JRNZ SK
;JUST SITTING HERE
CALLA MODECHNG
JRUC TAG
SK CMPI 2,A0
JRNE SK2
;SEEK TO SKDIR, SHOOT(UNLESS MODE=3), THEN CHANGE MODE
SKIN1: MOVB *A13(SPDLY),A0
ANDI 0FFH,A0
CMPI 7,A0
JRLT SC
MOVK 1,A0
SC
DEC A0
MOVB A0,*A13(SPDLY)
JRNZ TAG
MOVE *A13(TSK_DIR),A1
MOVE *A13(TDIR),A0,W
CALLA WAY
MOVE A0,*A13(TDIR),W
CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
MOVE A10,A10
JREQ NSPRAY
MOVE A13,A9
CREATE 0,CBALL ;CANNON BALL
NSPRAY MOVE *A13(TSK_DIR),A1
MOVE *A13(TDIR),A0,W
CMP A0,A1
JREQ GDNEWS
MOVI 4,A0
MOVB A0,*A13(SPDLY)
JRUC TAG
GDNEWS:
;HAVE SEEKED TO CORRECT SKDIR
;SHOOT
CLR A10
MOVB *A13(MODE),A0
CMPI 4,A0
JRNE GG
MOVI 500,A0 ;800
CALLA RANDPER
JRC AP
;SWEEPING OSCILLATE BULLETS
DOSWP MOVK 6,A0
MOVB A0,*A13(MODE)
MOVK 6,B0
MOVK 20,B1
CALLA RANGRAND
MOVE @TANKDIFF,A1
ADD A1,A0
MOVB A0,*A13(FIRED)
MOVK 1,A0
MOVB A0,*A13(SPDLY)
CLR A0
MOVB A0,*A13(TPNTR)
JRUC TAG
AP
;NORMAL FIRE AT PLAYER
MOVK 5,A0
MOVB A0,*A13(MODE)
MOVK 4,B0 ;2
MOVK 7,B1
CALLA RANGRAND
MOVE @TANKDIFF,A1
ADD A1,A0
MOVB A0,*A13(FIRED)
MOVK 1,A0
MOVB A0,*A13(SPDLY)
JRUC TAG
GG:
MOVI 200,A0 ;800
CALLA RANDPER
JRC GG2
;80% BE SMART
;BE SMART
MOVK 4,A0
MOVB A0,*A13(MODE)
JRUC TAG
GG2
MOVK 1,A0
MOVB A0,*A13(MODE)
JRUC TAG
SK2 CMPI 3,A0
JRNE AIM
;SEEK TO DIR OF TANK UNDER THIS TORSO
MOVB @TOID_ON,A0
JRNZ GG2
MOVB *A13(SPDLY),A0
ANDI 0FFH,A0
DEC A0
MOVB A0,*A13(SPDLY)
JRNN TAG
MOVE *A13(KPTANK),A1,L
MOVE *A1(DIR),A1,W
MOVE *A13(TDIR),A0,W
CALLA WAY
MOVE A0,*A13(TDIR),W
CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
; MOVE A13,A9
; CREATE 0,CBALL ;CANNON BALL
MOVE *A13(KPTANK),A1,L
MOVE *A1(DIR),A1,W
MOVE *A13(TDIR),A0,W
CMP A0,A1
JREQ GDNEWS2
MOVI 4,A0
MOVB A0,*A13(SPDLY)
JRUC TAG
GDNEWS2:
;NOW LINED UP WITH TANK DIR
;SET MODE TO STICK
CLR A0
MOVB A0,*A13(MODE)
MOVI 04FH,A0 ;AF
MOVB A0,*A13(TCNTR)
TAG SLEEP 1
JRUC TLP_TOP
AIM
CMPI 4,A0
JRNZ FIRE
;MODE=4
;
MOVB @SCNTR,A3
INC A3
MOVB A3,@SCNTR
ANDI 01,A3
SLL 5,A3
MOVI PLYROBJS,A2
ADD A3,A2
MOVE *A2,A0,L ;GET FIRST ENTRY
JRNZ PX
XORI 32,A3
ADDI PLYROBJS,A3
MOVE *A3,A0,L
PX CALLA XYSKOBJ
MOVE A5,A1
MOVE A6,A2
CALLA GETHDR
SLL 3,A0
ADDI CVRT,A0
MOVB *A0,A0
;DIR TO FACE IN A0
;A0=DIR TO SEEK TO FACE PLAYER
MOVE *A13(TDIR),A1
;
CMPI 17,A1
JRC OKAYZ
;FIX BUG
CLR A1
MOVE A1,*A13(TDIR)
OKAYZ
CMP A0,A1
JREQ AIM2
;NOT =
MOVE A0,*A13(TSK_DIR),W
JRUC SKIN1
AIM2
MOVE A13,A9
CREATE 0,CBALL
; MOVE *A13(TDIR),A9,W
; CREATE 0,RECOIL
MOVI 400,A0
CALLA RANDPER
JRC DOSWP ;DO SWEEP BULLETS
MOVI 400,A0
CALLA RANDPER
MOVK 4,A0
JRC AIM3 ;DO SWEEP BULLETS
MOVK 3,A0
AIM3 MOVB A0,*A13(MODE)
JRUC TAG
FIRE
CMPI 5,A0
JRNZ OSC
;CONTINUALLY FIRE IN CURRENT DIRECTION
MOVB *A13(SPDLY),A0
DEC A0
MOVB A0,*A13(SPDLY)
JRNN TAG
MOVK 5,A0
MOVB A0,*A13(SPDLY)
MOVB *A13(FIRED),A0
DEC A0
MOVB A0,*A13(FIRED)
JREQ RESET
;FIRE A BULLET
MOVE A13,A9
CREATE 0,CBALL
; MOVE *A13(TDIR),A9,W
; CREATE 0,RECOIL
JRUC TAG
RESET
MOVI 900,A0
CALLA RANDPER
JRC SLW
;SEEK PLAYER AGAIN
MOVK 4,A0
MOVB A0,*A13(MODE)
JRUC TAG
SLW MOVK 1,A0
MOVB A0,*A13(MODE)
JRUC TAG
OSC:
CMPI 6,A0
JRNE SWING
;OSCILLATE AND FIRE
MOVB *A13(SPDLY),A0
DEC A0
MOVB A0,*A13(SPDLY)
JRNN TAG
MOVE @TANKDIFF2,A0
; MOVK 8,A0 ;TIE IN TO LEVEL OF DIFFICULTY!
MOVB A0,*A13(SPDLY)
MOVB *A13(FIRED),A0
DEC A0
MOVB A0,*A13(FIRED)
JREQ RESET
;FIRE A BULLET
MOVE A13,A9
CREATE 0,CBALL
; MOVE *A13(TDIR),A9,W
; CREATE 0,RECOIL
;NOW ANGLE OFF
MOVB *A13(TPNTR),A0
INC A0
MOVB A0,*A13(TPNTR)
CMPI 9,A0
JRLT AB
MOVK 1,A0
MOVB A0,*A13(TPNTR)
AB SLL 5,A0
ADDI WAYTBL,A0
MOVE *A0,A0,L
JUMP A0
WAYTBL .LONG 0,INCIT,INCIT,DECIT,DECIT,DECIT,DECIT,INCIT,INCIT
SWING:
;SWING AROUND AND AROUND SPRAYING BULLETS
JRUC TAG
MODECHNG:
MOVB *A13(TCNTR),A0
ANDI 0FFH,A0
CMPI 200,A0
JRLT AV
MOVI 50,A0
AV
DEC A0
MOVB A0,*A13(TCNTR)
JRNN EX
;TCNTR UP, MAYBE RESET MODE
MOVI 35,B0
MOVI 80,B1
CALLA RANGRAND
MOVB A0,*A13(TCNTR)
MOVI 700,A0
CALLA RANDPER
JRNC EX ;NO CHANGE OF MODE
;COULD BE IN SIT MODE OR STICK MODE
MOVI 1,B0
MOVI 13,B1 ;4
CALLA RANGRAND
CMPI 5,A0
JRLT AK
MOVK 4,A0
AK:
CMPI 1,A0
JREQ SHOOT
MOVB A0,*A13(MODE)
CMPI 3,A0
JREQ EX
MOVE *A13(TDIR),A1
MOVI 4,B0
MOVI 15,B1
CALLA RANGRAND
ADD A0,A1
CMPI 17,A1
JRLT AGN
SUBI 16,A1
AGN MOVE A1,*A13(TSK_DIR)
MOVK 1,A10
EX
MOVB @TOID_ON,A0
JRNZ RTY1
MOVB *A13(MODE),A0
CMPI 3,A0
JRNE RTY1
MOVK 1,A0 ;JUST SIT
MOVB A0,*A13(MODE)
RTY1 RETS
SHOOT
;SHOOT
MOVE A13,A9
CREATE 0,CBALL
MOVK 1,A0
MOVB A0,*A13(MODE)
RETS
STIK
MOVB @TOID_ON,A0
JRNZ RTY
MOVE *A13(KPTANK),A0,L
MOVE *A0(DIR),A0,W
MOVE A0,*A13(TDIR),W
DEC A0
ANDI 0FH,A0
MOVE A0,A2
SLL 5,A0
ADDI TSPINFRMS,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI TK_SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RTY RETS
SIT:
MOVE A8,A0
MOVE *A13(KPTANKO),A8,L
CALLA GETANIXY
;A2=Y,A3=X
MOVE *A0(OFLAGS),A4,W
MOVB @TOID_ON,A7
JRZ ADF
ADDI 0360000H,A2 ;Y
MOVB *A13(TOIDLR),A7
JRZ SUBT
;THIS TORSO ON RIGHT
ADDI 0160000H,A3 ;X
JRUC ADF
SUBT SUBI 0160000H,A3 ;X
ADF CALLA GANISAG ;ADJUSTS TORSO
MOVE A0,A8
RETS
XOFSET: .LONG 070000H,0F0000H,0140000H,0160000H,01A0000H,0180000H,0140000H
.LONG 0E0000H,090000H,040000H,020000H,020000H,0,0,010000H,040000H
YOFSET: .LONG 020000H,020000H,020000H,020000H,0B0000H,0110000H,0120000H
.LONG 0170000H,0180000H,0170000H,0120000H,0110000H,0B0000H,020000H
.LONG 010000H,020000H
XVL: .LONG 0,0B333H,019999H,019999H,019999H,019999H,019999H,0B333H,0
.LONG -0B333H,-019999H,-019999H,-019999H,-019999H,-019999H,-0B333H
YVL: .LONG -019999H,-019999H,-019999H,-0CCCCH,0,0CCCCH,019999H,019999H,019999H
.LONG 019999H,019999H,0CCCCH,0,-0CCCCH,-019999H,-019999H
XVL2: .LONG 0,0E8F5H,02147AH,02147AH,02147AH,02147AH,02147AH,0E8F5H,0
.LONG -0E8F5H,-02147AH,-02147AH,-02147AH,-02147AH,-02147AH,-0E8F5H
YVL2: .LONG -02147AH,-02147AH,-02147AH,-010A3CH,0,010A3CH,02147AH,02147AH,02147AH
.LONG 02147AH,02147AH,010A3CH,0,-010A3CH,-02147AH,-02147AH
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
CBALL:
;A9=TORSOS' A13 THAT FIRED THIS BALL
MOVI TOTBNCS,A0
MOVE A0,@MEBNCS
MOVI CNNBLL,A10 ;CBALL
MOVI DMAWNZ,A11 ;FLAGS
MOVE *A9(KPTANKO),A0,L
MOVE *A0(OXVEL),A6,L ;RETAIN TANK VELOCITY
MOVE *A0(OYVEL),A7,L
; CLR A6
; CLR A7
CLR A5 ;MEANS CHECK DOORS FOR THIS BALL
; MOVB A8,*A13(SHWFLG)
MOVE *A9(TDIR),A2,W
MOVB @TOID_ON,A0
JRZ CBG
MOVK 1,A0
MOVE A0,@MEBNCS
MOVI CNNBLL2,A10 ;CBALL
MOVB *A9(TOIDLR),A0
JRZ CL
;THIS IS TORSO TO RGT, MAKE SURE HE WILL NOT FIRE 14,15,16,1, OR 2
CMPI 14,A2
JRNC DIEC
CMPI 2,A2
JRNC CBG
DIEC DIE
FBLI .LONG 0,WBUL6,WBUL7,WBUL8,WBUL85,WBUL9,WBUL85,WBUL8
.LONG WBUL7,WBUL6,WBUL7,WBUL8,WBUL85,WBUL9,WBUL85,WBUL8
.LONG WBUL7
FBLF .LONG 0,DMAWNZ+(M_FLIPV),DMAWNZ+(M_FLIPV)+(M_FLIPH)
.LONG DMAWNZ+(M_FLIPV)+(M_FLIPH),DMAWNZ+(M_FLIPV)+(M_FLIPH)
.LONG DMAWNZ+(M_FLIPV)+(M_FLIPH),DMAWNZ+(M_FLIPH),DMAWNZ+(M_FLIPH)
.LONG DMAWNZ+(M_FLIPH),DMAWNZ+(M_FLIPH)
.LONG DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ+(M_FLIPV)
.LONG DMAWNZ+(M_FLIPV),DMAWNZ+(M_FLIPV)
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
ABALL
;ENTER HERE FROM WLMAN
;A6 AND A7 SHOULD BE CLEARED
;A2=TDIR
; CLR A0
; MOVB A0,*A13(SHWFLG)
MOVK TOTBNCS,A0
MOVE A0,@MEBNCS
MOVE A9,A2
SLL 5,A9
MOVI FBLI,A6
ADD A9,A6
MOVE *A6,A10,L
ADDI FBLF,A9
MOVE *A9,A11,L
CLR A6
CLR A7
DEC A2
SLL 5,A2
MOVI XVL2,A3
ADD A2,A3
MOVE *A3,A3,L
ADD A3,A6
MOVI YVL2,A3
JRUC INHR0
CL
; CMPI 17,A2
; JREQ DIEC
CMPI 5,A2
JRC DIEC
CBG
DEC A2
SLL 5,A2
MOVI XVL,A3
ADD A2,A3
MOVE *A3,A3,L
ADD A3,A6
MOVI YVL,A3
;RECOIL
PUSH A7
MOVE *A9(TDIR),A9,W
CREATE 0,RECOIL
PULL A7
INHR0 ADD A2,A3
MOVE *A3,A3,L
ADD A3,A7
MOVE *A8(OXVAL),A0,L
MOVE *A8(OYVAL),A1,L
MOVI XOFSET,A3
ADD A2,A3
MOVE *A3,A3,L
ADD A3,A0
MOVI YOFSET,A3
ADD A2,A3
MOVE *A3,A3,L
ADD A3,A1
MOVE A10,A2 ;A10=IMAGE
; MOVE A5,A10
;YVAL IN A1
MOVI CLSENMY|TYPCBALL,A5
MOVE A11,A4
;ID IN A5
MOVI 159,A3 ;133
;ZPOS IN A3
;XVEL IN A6
;YVEL IN A7
CALLA BEGINOBJ2
MOVI MISS2,A0
CALLA ONESND
CLR A0
MOVB A0,*A13(BNCS)
MOVB A0,*A13(FDLY)
MOVB A0,*A13(LAST) ;LAST WALL HIT
CLR A10 ;INDICATES NO FRANIM OF THIS BULLET
MOVB @TOID_ON,A0
JRZ BULL_TOP
MOVI CLSENMY|TYPCBL2,A5
MOVE A5,*A8(OID)
C1L SLEEP 1
;MUST NOW DO EXPLODE CHECK ALSO!
L_TOP:
CALLR CLOSE ;CHECK TO SEE IF WE SHOULD EXPLODE BULLET!
JRC BULLEXP ;SET=EXP
MOVI [>1E,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRZ C1L
;
;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG!
;
MOVB *A13(LAST),A1
CMP A0,A1
JREQ C1L
MOVB A0,*A13(LAST)
MOVE A0,A11 ;KEEP B_DIR 1,2,3,OR 4
; NOW CHECK TO SEE IF BULLET IS PASSING THROUGH A GATE
CMPI 4,A0
JRNE AXEL
MOVB *A13(BNCS),A1
INC A1
MOVB A1,*A13(BNCS)
MOVE @MEBNCS,A0
CMP A0,A1
JRZ BULLGN
;
DO_BNCL:
;DO BOUNCE OF THIS BULLET
MOVB *A13(LAST),A0
CMPI 3,A0
JRLT DNL
MOVE *A8(OYVEL),A0,L
NEG A0
MOVE A0,*A8(OYVEL),L
JRUC C1L
DNL
MOVE *A8(OXVEL),A0,L
NEG A0
MOVE A0,*A8(OXVEL),L
JRUC C1L
CK_BNCL:
MOVB *A13(BNCS),A1
INC A1
MOVB A1,*A13(BNCS)
MOVE @MEBNCS,A0
CMP A0,A1
JRZ REGEXP
JRUC DO_BNCL
;
;CHECK TO SEE IF BULLET IS WITHIN EDGES OF DOOR
;
AXEL: MOVE A0,A1
SLL 5,A0
ADDI DRINF,A0
MOVE *A0,A0,L
MOVB *A0,A0
JREQ CK_BNCL
MOVE A1,A0
CALLA YESWALL
JRC CK_BNCL
; JRC REGEXP ;PROJECTILE HIT WALL NOT A DOORWAY
SLEEP 60 ;LET BULLET EXIT SCREEN
JRUC BULLGN
BULLEXP
; CLR A4
; MOVE A4,*A8(OXVEL),L
; MOVE A4,*A8(OYVEL),L
MOVI SMLEXP,A9
JRUC FRANIM_DIE
; MOVK 1,A1 ;COMMAND PASSED TO FRANIM
; JSRP FRANIM
;
; DELETE OBJECT FROM OBJLST
;
; MOVE A8,A0
; CALLA DELOBJ
; DIE
;
CLOSE
;OBJECT IN A8 CLOSE TO RANDOM PLAYER
;
MOVB @PCNT,A1
ANDI 01,A1
SLL 5,A1
MOVI PLYROBJS,A0,L
ADD A1,A0
MOVE *A0,A0,L
JRNZ BLO1
XORI 32,A1
ADDI PLYROBJS,A1,L
MOVE *A1,A0,L
JRNZ BLO1
NOEXP
CLRC
RETS
BLO1 MOVE *A8(OXPOS),A1
MOVE *A0(OXPOS),A2
;A0=PLAYER PNTR
ADDI 10,A2
SUB A1,A2
ABS A2
CMPI 16,A2 ;LEFT OF PLAYER
JRHI NOEXP
YSEXP
;A0=PLAYER PNTR
MOVE *A8(OYPOS),A1
MOVE *A0(OYPOS),A2
ADDI 15,A2
SUB A1,A2
ABS A2
CMPI 10H,A2 ;OVER PLYRS HEAD
JRHI NOEXP
YSEXP2
SETC
RETS
BULL_TOP:
MOVI [>1E,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRZ C1
;
;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG!
;
MOVE A10,A10 ;INDICATES NO DOOR CHECKS! A10=0=CK DOORS=FRANIM
JRNZ BULLGN
MOVB *A13(LAST),A1
CMP A0,A1
JREQ C1
MOVB A0,*A13(LAST)
MOVE A0,A11 ;KEEP B_DIR 1,2,3,OR 4
; NOW CHECK TO SEE IF BULLET IS PASSING THROUGH A GATE
CMPI 4,A0
JRNE AXE
MOVB *A13(BNCS),A1
INC A1
MOVB A1,*A13(BNCS)
MOVE @MEBNCS,A0
CMP A0,A1
JRZ BULLGN
;
DO_BNC:
;DO BOUNCE OF THIS BULLET
MOVB *A13(LAST),A0
CMPI 3,A0
JRLT DN
MOVE *A8(OYVEL),A0,L
NEG A0
MOVE A0,*A8(OYVEL),L
JRUC C1
DN
MOVE *A8(OXVEL),A0,L
NEG A0
MOVE A0,*A8(OXVEL),L
JRUC C1
CK_BNC:
MOVB *A13(BNCS),A1
INC A1
MOVB A1,*A13(BNCS)
MOVE @MEBNCS,A0
CMP A0,A1
JRZ REGEXP
JRUC DO_BNC
;
;CHECK TO SEE IF BULLET IS WITHIN EDGES OF DOOR
;
AXE: MOVE A0,A1
SLL 5,A0
ADDI DRINF,A0
MOVE *A0,A0,L
MOVB *A0,A0
JREQ CK_BNC
MOVE A1,A0
CALLA YESWALL
JRC CK_BNC
; JRC REGEXP ;PROJECTILE HIT WALL NOT A DOORWAY
SLEEP 20 ;LET BULLET EXIT SCREEN
JRUC BULLGN
;
; PUT IN SEPERATE SLEEP VALUE HERE
;
C1:
MOVE A10,A10
JRZ C2
MOVB *A13(FDLY),A0
DEC A0
MOVB A0,*A13(FDLY)
JRNZ C2
MOVK 04,A1
JSRP FRANIM
JRNC C3
MOVE A10,A9 ;RESET A9 LIST PNTR
MOVK 3,A0
MOVB A0,*A13(FDLY)
C3
MOVB A0,*A13(FDLY)
JRUC BULL_TOP
C2 SLEEP 1 ;SLEEP 2 MAYBE?
JRUC BULL_TOP
;
YESWALL:
;
; COLLISION WITH WALL
;
MOVE @WORLDTL,A5,L
CMPI 3,A0
JRNE HZCK
MOVX A5,A4
SLL 16,A4
MOVE *A8(OXVAL),A0,L
SUB A4,A0
CMPI GATELFT,A0
JRLT NO1
CMPI GATERGT,A0
JRGE NO1
JRUC KEEP_GOING
;CHECK HORZ DOORWAYS
HZCK: MOVE *A8(OYVAL),A0,L
CLR A4
MOVY A5,A4
SUB A4,A0
CMPI GATETOP,A0
JRLT NO1
CMPI GATEBOT,A0
JRLT KEEP_GOING ;CHECK GATE STATE NOW
NO1:
SETC
RETS
KEEP_GOING:
;NOW CHECK TO SEE IF BULLET IS COLLIDING WITH TOP GATE.
CLRC ;INDICATES KEEP ON GOING THROUGH GATE
RETS
BULLGN
; ANYTHING ELSE TO DO HERE? WHEN DELETING AN OBJECT?
CLR A4
MOVE A4,*A8(OXVEL),L
MOVE A4,*A8(OYVEL),L
;
; DELETE OBJECT FROM OBJLST
;
MOVE A8,A0
CALLA DELOBJ
;DYG
DIE
;
KILL_CBALL:
;ALSO USED FOR SHRAPNEL FROM FAT MAN
MMTM SP,A1
MOVE *A8(OPLINK),A0,L
JREQ RET
CLR A1
MOVE A1,*A8(OPLINK),L
CALLA KILL
MOVE A8,A0
; CALLA DELPAL ;NEEDED? NO!!!!
CALLA DELOBJ
RET
MMFM SP,A1
RETS
KILL_CBALL2:
MMTM SP,A1,A7
MOVE *A8(OPLINK),A0,L
JREQ RET2
CLR A1
MOVE A1,*A8(OPLINK),L
CALLA KILL
CREATE 0,BULLEXP
RET2
MMFM SP,A1,A7
RETS
REGEXP:
;REGULAR EXPLOSION HERE
CLR A4
MOVE A4,*A8(OXVEL),L
MOVE A4,*A8(OYVEL),L
;CHANGE THE ID
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A8(OID)
MOVI BULL_EXP_LIST,A2 ;MOVE BASE TABLE ADDRESS INTO A2
;A11=WALL 1,2,3 OR 4 WHICH WAS RETURNED FROM SCRTSTG
DEC A11
SLL 5,A11 ;BDIR*32 FOR LONG WORD LOOKUP TABLE
ADD A11,A2 ;CALCULATE OFFSET IN TABLE
MOVE *A2,A9,L ;MOVE TABLE VALUE INTO A4
;POSSIBLY PLACE THIS OBJECT ON ANOTHER LIST
;EXPLODE BULLET NOW!
JRUC FRANIM_DIE
; MOVK 1,A1 ;COMMAND PASSED TO FRANIM
; JSRP FRANIM
; NOW DELETE OBJECT FROM OBJLST
;
; DELETE OBJECT FROM OBJLST
;
; MOVE A8,A0
; CALLA DELOBJ
; DIE
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
;701
;6 2
;543
CVRT .BYTE 0,5,13,9,1,7,11,3,15,6,12,2,16,8,10,4
CVRT2 .BYTE 0,05,13,09,01,07,11,03,15
.EVEN
; 04
; 12 11
; 08 07
; 16 15
; 02 01
; 10 09
; 06 05
; 14 13
; 03
;GETHDR - RETURNS 1 OF 16 DIRECTIONS BASED ON OBJECTS X,Y VELOCITIES
;PARAMS:
; A1 = OBJ X VELOCITY
; A2 = OBJ Y VELOCITY
;RETURNS:
; A0 = 4,B,7,F,1,9,5,D,3,E,6,A,2,10,8,C = CW DIRECTION STARTING AT 12 O'CLOCK
; 4
; 2 1
; 3
GETHDR:
MOVE A1,A3
MOVE A2,A4
ABS A3 ;ABSOLUTE X VELOCITY
ABS A4 ;ABSOLUTE Y VELOCITY
MOVE A3,A5
ADD A4,A5 ;SUM Y+X
JRNE GAD1 ;BR = THERE IS A DIRECTION HERE!
CLR A3 ;STANDING CASE
JRUC SETDVAL
GAD1:
MOVK 3,A5
MOVK 3,A7
MPYU A3,A5 ;CALC 3*X
MPYU A4,A7 ;CALC 3*Y
CMP A7,A3 ;XV>3*YV ?
JRHS GADX ;BR = CHECK X VELOCITY CASE
CMP A5,A4 ;YV>3*XV ?
JRHS GADY ;BR = CHECK Y VELOCITY CASE
;
;DIAGONAL XY VELOCITY CASE
;4 POSSIBLE QUADRANTS 0-3
; 3 2
; 1 0
MOVE A1,A3 ;SAVE X,Y VELOCITIES
MOVE A2,A4
SRL 31,A1 ;X VEL
SRL 31,A2 ;Y VEL
SLL 1,A2
ADD A1,A2
;WE NOW HAVE THE QUADRANT NOW CHECK FOR 1 OF 3 DIRECTIONS WITHIN QUADRANT
;IN A2
ABS A3 ;X UNSIGNED COMPARE
ABS A4 ;Y
CMP A3,A4 ;Y>X?
JRGT DIFF ;BR = YES
SUB A4,A3
CMPI >2800,A3 ;-4000?
JRLT INRNGE ;WITHIN RANGE, USE QUADRANT K
ADDK 9,A2 ;RANGE LO
JRUC SETRNGE
DIFF:
SUB A3,A4
CMPI >2800,A4 ;+4000
JRLT INRNGE ;WITHIN RANGE USE QUADRANT K
ADDK >D,A2 ;RANGE HI
JRUC SETRNGE
INRNGE:
ADDK 5,A2
SETRNGE:
MOVE A2,A3
JRUC SETDVAL
;X VELOCITY CASE
GADX:
MOVK 1,A3 ;DISCRETE RYTE
MOVE A1,A1
JRNN SETDVAL ;
MOVK 2,A3 ;LEFT
JRUC SETDVAL
;Y VELOCITY CASE
GADY:
MOVK 3,A3 ;DISCRETE DOWN
MOVE A2,A2
JRNN SETDVAL
MOVK 4,A3 ;UP
;HAVE OFFSET IN A3
SETDVAL:
MOVE A3,A0
RETS
KILL_TORSO:
MMTM SP,A1
MOVE A0,A10
MOVE *A0(OID),A9,W ;KILLERS OID
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
MOVE *A8(OPLINK),A0,L
ANDI F_SUBT,A9
DEC A9
SLL 3,A9
ADDI PUNISH,A9
MOVB *A9,A9
MOVB *A0(ABSORB),A1
ADD A9,A1
MOVB A1,*A0(ABSORB)
MOVB @TOID_ON,A9
JRZ CTP
CMPI TOIDHIT,A1
JRUC CTP2
CTP MOVE @TNKHITS,A9
CMP A9,A1
; CMPI TOTHIT,A1
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
CTP2 JRLT OKFL
;ABSORBED ENOUGH HITS TO DESTROY IT
CREATE 0,TORSO_EXP
;TANK_EXP WHEN IT WAKES UP
MOVE *A8(OPLINK),A0,L
MOVE *A0(KPTANK),A1,L
CLR A7
MOVB A7,*A1(ADRIVER)
CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
CALLA DELOBJ
CALLA GETUGH
OK MMFM SP,A1
RETS
KILL_TS
;SMART BOMB
;A8=TORSO IMG PTR
CREATE 0,KILL_TS2
;TANK_EXP WHEN IT WAKES UP
MOVE *A8(OPLINK),A0,L
MOVE *A0(KPTANK),A1,L
CLR A7
MOVB A7,*A1(ADRIVER)
CALLA KILL ;KILLS PROCESS IN A0
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A8(OID)
MOVE *A8(OYPOS),A0
ADDI 040H,A0
MOVE A0,*A8(OYPOS)
RETS
KILL_TS2
MOVI BOOM3,A9
JRUC FRANIM_DIE
; MOVK 1,A1
; JSRP FRANIM
; MOVE A8,A0
; CALLA DELOBJ
; DIE
OKFL
; MOVE *A0(KPTANKO),A8,L
PUSH A9
MOVI 018180000H,A9
CREATE 0,FLASHME
PULL A9
MMFM SP,A1
RETS
PUNISH: .BYTE 2,2,5,20,20
.EVEN
TORSO_EXP:
;A10=KILL IMAGE PNTR
MOVE *A10(OPLINK),A0,L
MOVB *A0(MYPLYR),A0
TSO_EXP:
;A0=1 OR 2
MOVI TNKPT,A1 ;AMOUNT OF SCORE
DOBLO
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
CMPI 1,A0
JREQ TX1
;ADD TO WHICH SCORE
CMPI 2,A0
JRNZ TX1A
MOVI P2DATA,A2 ;PLAYER 1 SCORE SELECT
TX1
CALLA SCRADD2 ;DO IT!
TX1A
;A8=PNTR TO OBJECT TO BLOW UP
CLR A6
CLR A7
TSO_EXP2
MOVB @PCTOT,A2
CMPI 019H,A2
JRGE NOT
;HAVE ROOM FOR PIECES
CREATE 0,ADPCS1
NOT DIE
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
WALK_LIST:
.LONG TNK01,0,0,0,TNK05,0,0,0
.LONG TNK09,0,0,0,TNK13,0,0,0
;
;TANK ANIMATION TABLES
;
TNK01:
.LONG TNK12A
.WORD FLIPBITS|05,0
.LONG TNK12B
.WORD 05
.LONG 0
TNK05:
.LONG TNK9A
.WORD FLIPBITS|05,(M_FLIPH)
.LONG TNK9B
.WORD 05
.LONG 0
TNK09:
.LONG TNK6A
.WORD FLIPBITS|05,0
.LONG TNK6B
.WORD 05
.LONG 0
TNK13:
.LONG TNK9A
.WORD FLIPBITS|05,0
.LONG TNK9B
.WORD 05
.LONG 0
.END