smashtv/ROBO.ASM

3540 lines
66 KiB
NASM
Raw Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'ROBO.ASM'
;MENU
; MESS_MAC RD7FONT,SPACING20,200,137,ROBO_WHITE,STRCNRM,0
; .STRING "JON HEY "
; .BYTE 0,1
; MESS_MAC RD7FONT,SPACING20,200,147,ROBO_RED,STRCNRM,0
; .STRING "KEVIN WELSH "
; .BYTE 0,1
; MESS_MAC RD7FONT,SPACING20,200,157,ROBO_RED,STRCNRM,0
; .STRING "CHARLES OGDEN "
; .BYTE 0,0
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 13,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\GSP.INC" ;GSP ASSEMBLER EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
.INCLUDE "AUDIT.EQU"
;
;SOUNDS EXTERNAL
;
.REF MUSICOFF,SNDPRC,UGH,EXP3,CROWD2,YAMOFF,SHKSND,MCSPK9
;
;SYMBOLS EXTERNALLY DEFINED
;
;JARVIS
.REF FACCHECK,BONUS_WARP
.REF ADD_DUMP,GET_AUD,DEF_PAGE,GET_ADJ,GET_WVADDR
.REF SPAWN_ORB,ONSCRN_ORB,FLATFACE,O_FACE,MAXGAL,GAL_CNT
.REF ORB_DN,ORB_CNT,MAXORB,FACEON,SPWN_GAL3,SPWN_GAL1
.REF SPWN_GAL1A,SPWN_GAL2,O_COB,GALTYP,COLCYC,INIT_TAB
.REF STORE_AUDIT
.REF SCRADD2,POWERTST
.REF SPWN_SNK,SNK_DN,AUD1,MAXTNK,ROBTYP
.REF SPWN_RBTA,O_RBTA,RBTA_DN,MAXRBTA,RBTA_CNT,MUTPTR
.REF ADPCS3,OVALBLD,EXPMINE,SWAPSK,WNTOUT,O_ITEMS,PZON
.REF O_MUT,SCRIPTPLAY,ADJSTWTL,MTR1CNT,O_MINE,BLDOFF
.REF RNG_LIT,RNG_LIT2,PCTOT,TOID_ON,CIRCUIT,TWOCHNKS,CHNKS2
.REF KILLP1,KILLP2,CNTDIG1,CNTDIG2,GAMEOVER,LSHIT
.REF FIRE_DIRECTION,ATSTRT,STRT_WPN,MAXHULK,DELPAL
.REF BLT_CNT,MAXBLT,DO_BND,WAVEYX,STATUS,MSG_PROC2
.REF SPAWN_HULKS,HULK_DN,MAXFAT
.REF ONSCRN_HULKS,ONSCRN_FAT
.REF BEGINOBJ,GETANIX
.REF ONSCRN_TNK,SPAWN_TNK,SPAWN_FAT,FAT_CNT
.REF JOYSW,SCRCLR,INIT_ALL,SHK_ON
.REF CLSCRACH,RANDOM
.REF FRANIM,GPALOBJ,B_DIR,BEGINOBJ2
.REF COLLISIONS
.REF BOSSON,WDOGRAM
.REF P1CTRL,P2CTRL,P1DATA,P2DATA,GAMSTATE,WAVE,GETFPAL
.REF JOY_UPDATE,UNSTACK,PSTAT,FIXMETERS,FIXMETERS2
.REF KILBGND,AUTOEOFF,AUTOEON,HALT,OBJON,OBJOFF
.REF HULK_CNT,LIVECNT
.REF WORLDTLX,WORLDTLY
.REF KP_LS,KP_RS,KP_TS
.REF TNK_CNT,TNK_DN,SHORT_PLYR,PCNT,SHORT2
.REF ONSCRN_WLMN
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF MAINLP
.DEF RINGTIME,MAXFREE,TANKDIFF,GRUNTMOD,COBRAKIL
.DEF TANKDIFF2,SETDIFF,TNKHITS,FATHITS
.DEF DRAW_PLYR_TORSO,RINGS,OFFRNG,ENDON,OVERLAP
.DEF INIT_PROG,ZEROCNTS
.DEF KEEPXY
.DEF RAMXY,WAVE_RAM,INIT_RAM
.DEF XYSEEK,XYSKOBJ,GETADIR,GETADIR2,XYSEEK2
.DEF CPULEFT,CPUAVG
.DEF WARMSET,EHALT
.DEF KILL_PLYR
.DEF KEEP_TOPL_GATE,KEEP_TOPR_GATE,KEEP_LFT_GATE,KEEP_RGT_GATE
.DEF OVERLORD,ECON,ENON
.DEF PLYRPRCS,PLYROBJS
MAX_ONSC .EQU 50
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS BOGUS,64
.BSS PAL1,16*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
.BSS PLYROBJS,64 ;2 ENTRIES-PLYR1,PLYR2 TORSO PTR
.BSS ECON,8 ;0=NO ENEMY TO ENEMY COLLIDE, 1=YES
.BSS ENON,8 ;0=NO ENEMY TO NEUTRAL COLLIDE, 1=YES
.BSS ENDON,8 ;0=OK TO FIRE,1=NO FIRE STICK
.BSS INXT,8
.BSS EHALT,16
.BSS KEEPXY,32
.BSS KEEP_LFT_GATE,32
.BSS KEEP_RGT_GATE,32
.BSS KEEP_TOPL_GATE,32
.BSS KEEP_TOPR_GATE,32
.BSS CPULEFT,16
.BSS CPUAVG,16
.BSS RAMXY,32*MAX_ONSC
.BSS WAVE_RAM,6*16*10 ;6=ELEMENTS,16=WORD SIZE
.BSS PLYRPRCS,64 ;2 ENTRIES-PLYR1,PLYR2 PROCESS PTR
;10 IS MAX TYPES PER WAVE
.BSS RINGTIME,16
.BSS MAXFREE,16
.BSS GRUNTMOD,16
.BSS TANKDIFF,16
.BSS TANKDIFF2,16
.BSS COBRAKIL,16
.BSS TNKHITS,16
.BSS FATHITS,16
;
;EQUATES FOR THIS FILE
;
VNORMVEL .EQU 016000H
HNORMVEL .EQU 016000H
VSLOVEL .EQU 0FA00H ;VNORMVEL*.707
HSLOVEL .EQU 0FA00H ;HNORMVEL*.707
;
VNORMVEL2 .EQU 01F000H
HNORMVEL2 .EQU 01F000H
VSLOVEL2 .EQU 018000H ;VNORMVEL*.707
HSLOVEL2 .EQU 018000H ;HNORMVEL*.707
;
;
.TEXT
INIT_PROG:
DINT ;DISABLE INTERRUPTS
;
; SET FIELD PARAMETERS
SETF 16,1,0 ;WORD SIGN EXTEND (FIELD 0)
SETF 32,1,1 ;LONG WORD (FIELD 1)
; SET THE STACK POINTER TO THE END OF SCRATCHPAD
MOVI STCKST,SP,L ;MOVE STACK ADDR IN SP (32 BITS)
MOVE @WDOGRAM,A0,L ;MARK SYSTEM AS INITIALIZED
CMPI WDOGNUM,A0
JRNZ WARMSET0
MOVI AUDLOCK,A0
CALLA AUD1
;DUMP REPORT OF WATCHDOG
.IF DEBUG
.ELSE
CALLERR 11,0
.ENDIF
;JUMP TO RECOVER CODE
MOVI AUDSTAT,A0
CALLA GET_AUD
MOVE A1,A1
JREQ WARMSET ;ATTRACT MODE GLITCH
CLR A1
CALLA STORE_AUDIT ;WARP ONLY ONCE, DUDE!!!
JAUC BONUS_WARP
WARMSET0:
JAUC POWERTST
WARMSET:
DINT ;DISABLE INTERRUPTS
;
; SET FIELD PARAMETERS
SETF 16,1,0 ;WORD SIGN EXTEND (FIELD 0)
SETF 32,1,1 ;LONG WORD (FIELD 1)
; SET THE STACK POINTER TO THE END OF SCRATCHPAD
MOVI STCKST,SP,L ;MOVE STACK ADDR IN SP (32 BITS)
; RESET TODAYS HIGH SCORE TABLE
CALLA INIT_TAB
; CLEAR SCRATCHPAD, INITIALIZE PROCESSES
CALLA CLSCRACH ;CLR SCRATCH RAM
CALLA INIT_ALL ;INITIALIZE Z-UNIT
MAIN0
CREATE 0,FACCHECK ;START ATTRACT IF THINGS O.K.
; CALLA ATSTRT ;START ATTRACT MODE
CREATE PLIST_ID,UNSTACK ;CREATE SWITCH UNSTACKER
;
; MAIN LINE LOGIC LOOP
;
MAINLP:
CALLA PRCDSP ;DISPATCH PROCESSES
MOVE A13,A13
JRZ MAINPOK
.IF DEBUG
LOCKUP
EINT
.ELSE
CALLERR 10,0
.ENDIF
;
***********************************************
MAINPOK:
CALLA SNDPRC ;DISPATCH AND TIME THE SOUND CALLS
CALLA RANDOM ;NEW SEED PLEASE
; CALLA COINIRQ ;COIN SWITCH INTERRUPT
.IF DEBUG
callr StCpuLft
.ENDIF
***********************************************************
******test rom protect interrupt
.IF DEBUG
JRUC SKIPCK
dint
MOVE @INTENB,A0,0 ;ENABLE ROM PROTECT INTERRUPT (ext2)
ORI X2E,A0
MOVE A0,@INTENB,0
eint
move @>ffe00000,a0,0
move a0,@>ffe00000,0
SKIPCK
.ENDIF
**************************************************************
****************************************************************
MOVB @PCNT,A0
DEC A0
MOVB A0,@PCNT
MOVE @GAMSTATE,A0
CMPI INDIAG,A0
JRNZ NODIAG
MOVI AMDEPID,A0
CLR A1
NOT A1
CALLA KILALL
CALLA KILBGND
NODIAG:
JRUC MAINLP
;
SETDIFF
;BASED ON CMOS DIFFICULTY SETTING, (0-9) STUFF SEVERAL DIFFERENT
;RAM LOCATIONS THAT IMPACT GAME DIFFICULTY. THESE RAM LOCATIONS
;ARE REFERENCED BY ENEMIES IN EACH FILE.
;SETDIFF IS CALLED AT THE START OF A GAME AND WHENEVER WE WISH TO
;MODIFY OVERALL GAME DIFFICULTY.
;ITEMS AFFECTED:
;FREEMEN POSSIBLE PER CIRCUIT @MAXFREE
;MODIFY # GRUNTS ON SCREEN (+/-) @GRUNTMOD
;TANK FIRE RATE @TANKDIFF
;TIME RINGS ARE AROUND PLAYER (+/-) @RINGTIME
MOVI ADJDIFF,A0
CALLA GET_ADJ
;A0=0-9 DIFFICULTY LEVEL!
MOVE A0,A8
; SLL 4,A0
; ADDI LASERTBL,A0
; MOVE *A0,A0,W
; MOVE A0,@LASERSPD
;
; MOVE A8,A0
SLL 4,A0
ADDI FREETBL,A0
MOVE *A0,A0,W
MOVE A0,@MAXFREE
;
MOVE A8,A0
SLL 4,A0
ADDI GRUNTTBL,A0
MOVE *A0,A0,W
MOVE A0,@GRUNTMOD
;
MOVE A8,A0
SLL 4,A0
ADDI TANKTBL,A0
MOVE *A0,A0,W
MOVE A0,@TANKDIFF
;
MOVE A8,A0
SLL 4,A0
ADDI TANKTBL2,A0
MOVE *A0,A0,W
MOVE A0,@TANKDIFF2
;
MOVE A8,A0
SLL 4,A0
ADDI RINGTBL,A0
MOVE *A0,A0,W
MOVE A0,@RINGTIME
;
MOVE A8,A0
SLL 4,A0
ADDI WNDTBL,A0
MOVE *A0,A0,W
MOVE A0,@COBRAKIL
;
MOVE A8,A0
SLL 4,A0
ADDI HITFAT,A0
MOVE *A0,A0,W
MOVE A0,@FATHITS
;
MOVE A8,A0
SLL 4,A0
ADDI HITTNKS,A0
MOVE *A0,A0,W
MOVE A0,@TNKHITS
;
;ADD MORE DIFFICULTY SETTINGS HERE
RETS
HITTNKS .WORD 3,6,12,17,20,25,30,35,45,50,50
HITFAT .WORD 1,3,6,8,9,10,12,15,18,20,20
;LASERTBL
; .WORD 3,3,3,3,3,3,3,3,3,3,3
FREETBL
.WORD 4,4,3,2,2,2,1,1,0,0,0
GRUNTTBL
.WORD -4,-3,-2,-1,0,0,1,3,4,6,6
; .WORD -7,-7,-5,-5,-4,-4,-3,-1,2,4,4 ;GERMAN VERSION
TANKTBL
.WORD -3,-2,-1,-1,0,0,1,2,3,4,4
TANKTBL2
.WORD 12,11,10,9,8,8,7,6,5,4,4
RINGTBL
.WORD 700,600,500,400,300,300,300,200,150,110,110
WNDTBL
.WORD 1000-100,1500-100,2500-100,3000-100,3500-100,3900-100
.WORD 4000-100,4500-100,5000-100,5000-100,5000-100
INIT_RAM:
CLR A0
MOVE A0,@HULK_DN
MOVE A0,@ORB_DN
MOVE A0,@TNK_DN
MOVE A0,@RBTA_DN
MOVE A0,@SNK_DN
MOVB A0,@KP_LS
MOVB A0,@KP_RS
MOVB A0,@KP_TS
MOVB A0,@SHK_ON
MOVB A0,@FACEON
MOVB A0,@BOSSON
MOVB A0,@TOID_ON
MOVB A0,@WNTOUT
MOVB A0,@PCTOT ;CAREFUL!!
MOVB A0,@PZON
MOVB A0,@ENDON
RETS
;
RINGS:
;A10=TIME RINGS ARE ON
;A9=PLAYER NUMBER 1/2 TO RING
;TURN OFF EXISTING RINGS AROUND THIS PLAYER PLUS ITS COLOR CYCLE
MOVB A9,*A13(MYPLYR)
;SET BOUNDARIES TO ORBITING TYPE BNDRY
;SET BOUNDARIES FOR CORRECT PLAYER!
DEC A9
MOVE A10,*A13(TIME)
SLL 5,A9
MOVE A9,A10
JRZ X1
CREATE RCYC2PID,RNG_LIT2
JRUC X2
X1
CREATE RCYC1PID,RNG_LIT ;CYCLE NUP1 PAL
X2 ADDI PLYRPRCS,A9
MOVE *A9,A9,L
MOVK 1,A0 ;HELPER TYPE BOUNDARY FOR RING IMAGE
MOVB A0,*A9(BNDTYP)
MOVE A9,A7 ;DO_BND NEEDS PROC PTR IN A7
CALLA DO_BND
MOVI PLYROBJS,A9
ADD A10,A9
MOVE *A9,A8,L
MOVE A8,A11 ;KEEP PLAYER OBJ TO RING IN A11
CALLA GETANIXY
CLR A6
CLR A7
MOVE A2,A1
MOVE A3,A0
MOVI 140,A3 ;HIGHER PRIORITY THAN PLAYER
MOVI DMAWNZ,A4
MOVI CLSPLYR|TYPPLYR|SUBRNG1,A5
MOVI SHLD1,A2
CALLA BEGINOBJ2
MOVE A8,A9 ;CIRCLE IMAGE
MOVE A10,A10
JRZ RTP
;CHANGE TO NUP2 PAL
MOVI nup2,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
RTP
MOVE @HALT,A0
JRNE RG
MOVE *A13(TIME),A0
DEC A0
MOVE A0,*A13(TIME)
JRZ KRNGS
CMPI 100,A0
JRNE NYTB
MOVE A10,A10
JRNE F1
CREATE B1PID,BLINK ;BLINK OUT RING PROCESS
MOVI RCYC1PID,A0
CLR A1
NOT A1
CALLA KILALL
;STUFF RED INTO NUP1 PALL
JRUC NYTB
F1
CREATE B2PID,BLINK
MOVI RCYC2PID,A0
CLR A1
NOT A1
CALLA KILALL
;STUFF RED INTO NUP2 PALL
NYTB MOVE *A11(OPLINK),A0,L
MOVI 40,A1 ;10
MOVE A1,*A0(DELYDET) ;KEEP STUFFING A VALUE IN HERE
MOVE A9,A0
MOVE A11,A8
CALLA GETANIXY
ADDI 0300000H,A2
MOVE *A0(OFLAGS),A4,W
CALLA GANISAG
MOVE A0,A9
RG SLEEP 1
JRUC RTP
OFFRNG
;MOVE PLAYER WITH RINGS AWAY FROM MUTOID BOSS ENEMY
;A0=PLAYER RING IMAGE
MMTM SP,A0,A1,A2,A3,A4,A5,A6
MOVE *A0(OPLINK),A0,L
MOVE @MUTPTR,A3,L
MOVE *A3(PDATA),A3,L ;TNKL
MOVE *A3(OXPOS),A2
MOVE *A3(OYPOS),A3
ADDI 20,A2
ADDI 20,A3
MOVB *A0(MYPLYR),A1
DEC A1
SLL 5,A1
ADDI PLYRPRCS,A1
MOVE *A1,A1,L
MOVE *A1(TSO_PTR),A5,L
MOVE *A1(LEG2_PTR),A1,L
MOVE *A1(OXPOS),A4
MOVE *A5(OXPOS),A6
CMP A4,A2
JRGT GONEG
;ADD TO PLYR X
ADDI 3,A4
ADDI 3,A6
JRUC GOGO
GONEG
SUBI 3,A4
SUBI 3,A6
GOGO MOVE A4,*A1(OXPOS)
MOVE A6,*A5(OXPOS)
MOVE *A1(OYPOS),A4
MOVE *A5(OYPOS),A6
CMPI 182H,A4
JRLT GOGO2
CMP A4,A3
JRGT GONEG2
;ADD TO PLYR Y
ADDI 3,A4
ADDI 3,A6
JRUC GOGO1
GONEG2 SUBI 3,A4
SUBI 3,A6
GOGO1 MOVE A4,*A1(OYPOS)
MOVE A6,*A5(OYPOS)
;CALLED FROM COLLISION ROUTINE
;RESET HERE
; MOVI KRNGS,A7
; CALLA PUTA7
GOGO2
MMFM SP,A0,A1,A2,A3,A4,A5,A6
RETS
;KILL RINGS OFF
KRNGS MOVE A9,A0
; CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL!
CALLA DELOBJ
CLR A1
NOT A1
MOVI B1PID,A0
;A10=0 IF PLAYER 1
MOVE A10,A10
JREQ KL
MOVI B2PID,A0
KL CALLA KILALL
;CHANGE BOUNDARY FOR CORRECT PLAYER!
MOVI PLYRPRCS,A7
ADD A10,A7
MOVE *A7,A7,L
MOVE *A7(LSRPTR),A0,L
JRNZ D ;BR=LASER IS AROUND THIS PLAYER
MOVB *A7(BNDTYP),A0
CMPI 1,A0
JRNE D
CLR A0
MOVB A0,*A7(BNDTYP)
MOVB A0,*A7(PRVBND)
CALLA DO_BND
D
DIE
BLINK
;BLINK OUT RING
;A9=RING IMAGE TO BLINK
MOVE *A9(OFLAGS),A4,W
MOVI FRNTBK,A1
MOVE A9,A8
CALLA ANI
BKZ
MOVE A9,A0
CALLA OBJOFF
SLEEP 5
MOVE A9,A0
CALLA OBJON
SLEEP 5
JRUC BKZ
SETMAX:
MOVK 5,A0
MOVB A0,@MAXFAT
CLR A0
MOVE A0,@GALTYP
MOVE @CIRCUIT,A0
JRZ SET0
CMPI 1,A0
JRZ DOC1
;3RD CIRCUIT
MOVE @WAVE,A0
SLL 3,A0
ADDI RMAX2,A0
MOVB *A0,A0
MOVK 5,A1
CALLR ONEPADJ
CALLR ADJMAX
MOVB A0,@MAXRBTA
MOVE @WAVE,A0
SLL 3,A0
ADDI OMAX,A0
MOVB *A0,A0
MOVK 2,A1
CALLR ONEPADJ
MOVB A0,@MAXORB
MOVE @WAVE,A0
SLL 3,A0
ADDI RTYPT,A0
MOVB *A0,A0
MOVE A0,@ROBTYP
MOVE @WAVE,A0
SLL 3,A0
ADDI GTYPT,A0
MOVB *A0,A0
MOVE A0,@GALTYP
JRZ SETG
MOVI SPDRP,A8 ;PAL NAME
MOVI PAL1,A9 ;RAM AREA
MOVI [32,45],A10 ;BEGIN/END COLOR #
MOVK 3,A11 ;RATE IN TICKS
CREATE CYCPID,COLCYC ;COLOR CYCLER ON
SETG MOVE @WAVE,A0
SLL 3,A0
ADDI GMAX2,A0
MOVB *A0,A0
MOVK 2,A1
CALLR ONEPADJ
MOVB A0,@MAXGAL
MOVE @WAVE,A0
SLL 3,A0
ADDI HMAX2,A0
MOVB *A0,A0
MOVK 5,A1
CALLR ONEPADJ
CALLR ADJMAX
MOVB A0,@MAXHULK
MOVK 3,A0
MOVE @WAVE,A1
CMPI 1,A1
JRZ RTF
INC A0
CMPI 11,A1
JRZ RTF
MOVK 1,A0
RTF
MOVB A0,@MAXTNK
RETS
ONEPADJ
MOVE @STATUS,A2
CMPI 3,A2
JRZ TWEEK1
SUB A1,A0
TWEEK1
RETS
DOC1
;SET CIRCUIT 2
MOVE @WAVE,A0
SLL 3,A0
ADDI RTYPT,A0
MOVB *A0,A0
MOVE A0,@ROBTYP
MOVE @WAVE,A0
SLL 3,A0
ADDI RMAX,A0
MOVB *A0,A0
MOVK 2,A1
CALLR ONEPADJ
CALLR ADJMAX
MOVB A0,@MAXRBTA
MOVE @WAVE,A0
SLL 3,A0
ADDI OMAX,A0
MOVB *A0,A0
MOVB A0,@MAXORB
MOVE @WAVE,A0
SLL 3,A0
ADDI GMAX,A0
MOVB *A0,A0
MOVK 2,A1
CALLR ONEPADJ
MOVB A0,@MAXGAL
MOVK 5,A0
MOVB A0,@MAXFAT
MOVK 1,A0
MOVB A0,@MAXTNK
RETS
ADJMAX
MOVE @GRUNTMOD,A2
ADD A2,A0
RETS
SET0 ;CIRCUIT 1
MOVE @WAVE,A0
SLL 3,A0
ADDI HMAX,A0
MOVB *A0,A0
CALLR ADJMAX
MOVB A0,@MAXHULK
MOVE @WAVE,A0
SLL 3,A0
ADDI TMAX,A0
MOVB *A0,A0
MOVB A0,@MAXTNK
MOVE @WAVE,A0
SLL 3,A0
ADDI FMAX,A0
MOVB *A0,A0
MOVB A0,@MAXFAT
RETS
GTYPT .BYTE 0,1,1,0,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0
RTYPT .BYTE 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0
HMAX .BYTE 2,12,11,25,32,20,20,25,29,24,32,32 ;CIRCUIT 1
TMAX .BYTE 1,1,1,1,1,1,1,1,1,1,1,1 ;CIRCUIT 1
FMAX .BYTE 2,3,3,2,7,10,6,6,11,8,5 ;CIRCUIT 1
;JARVIS
OMAX .BYTE 2,20,20,25,25,25,13,25,25,25,25
.BYTE 25,25,25,25,25,25,25,25,25 ;CIRCUIT 2 (ORBS)
.BYTE 25,25,25,25
RMAX .BYTE 2,10-2,22-2,25-2,20-2,20-2,20-2,20-2,19-4,15-2,20-2
.BYTE 22-7,25-2,20-2,20-2,20-2,23-2,18-2,20-2,20-2 ;CIRCUIT 2 (ROBOTS)
.BYTE 25,25,25,25
RMAX2 .BYTE 2,10-2,22-2,25-2,20-2,32,20-2,20-2,19-4,15-2,20-2
.BYTE 22-7,25-2,20-2,20-2,23,24,18-2,20-2,26 ;CIRCUIT 2 (ROBOTS)
.BYTE 25,25,25,25
GMAX .BYTE 2,20,20,20,20,12,7,25,13,25,25
.BYTE 22-6,25,4,5,25,12,25,22,25 ;CIRCUIT 2 (GALS)
GMAX2 .BYTE 2,8,10,10,10,12,7,15,13,15,15
.BYTE 22-6,15,4,5,8,12,15,12,15 ;CIRCUIT 3 (GALS)
.BYTE 22-6,15 ;CIRCUIT 3 (GALS)
SMAX .BYTE 2,20,20,20,20,12,7,25,13,25,25
.BYTE 22-4,25,4,5,25,12,25,22,25 ;CIRCUIT 3 (SNKS)
HMAX2 .BYTE 2,15,15,29,32,20,26,25,23,24,32 ;CIRCUIT 3 GRUNTS
.BYTE 28,25,21,25,25,22,25,29,25 ;CIRCUIT 3
.BYTE 30,25 ;CIRCUIT 3
.EVEN
TYP_TBL: ;FOR ONSCREEN
.LONG 0,ONSCRN_ORB,ONSCRN_TNK,ONSCRN_FAT,ONSCRN_WLMN
.LONG ONSCRN_HULKS,O_MINE,O_MUT,O_FACE,O_RBTA,0,0,0,0,O_COB
.LONG 0
TYP_TBL2: ;FOR SPAWNING
.LONG 0,SPAWN_ORB,SPAWN_TNK,SPAWN_FAT,NO
.LONG SPAWN_HULKS,NO,NO,NO,SPWN_RBTA,SPWN_GAL3,SPWN_GAL1,SPWN_GAL1A
.LONG SPWN_GAL2,NO,SPWN_SNK
NO RETS
CQWAVE .LONG WAVE_INFO,W2_INFO,W3_INFO
WAVE_INFO:
;RECORDS LOOK LIKE THIS
;TYPES:DIFFERENT ID'S
;#:TOTAL NUMBER PER WAVE
;DIFFICULTY:0,1,2,3 0=EASIEST
;RATE:# OF CYCLES/3 (SLP CNTR) BEFORE SPAWN IS CALLED
;ONSCRN:# OF TYPE ON SCREEN AT START OF WAVE
;CNTR USED IN WAVE RAM UPDATING
;RECORD LAYOUT
;TYPE # LEVEL RATE ONSCRN CNTR
;WAVE 1
.WORD HULK,100,0,6,4,30 ;110
.WORD TANK,5,0,90,0,1320
.WORD 0
;WAVE 2
.WORD HULK,195,1,1,0,1
.WORD FAT,6,0,160,0,50
.WORD MINE,3,0,0,3,1
.WORD TANK,5,0,140,0,1420
.WORD 0
;WAVE 3
.WORD HULK,335,2,8,16,1
.WORD FAT,15,0,90,2,30
.WORD MINE,5,0,0,5,1
.WORD WLMN,1,0,0,1,1
.WORD TANK,5,0,90,0,1720
.WORD 0
;WAVE 4
.WORD HULK,25,3,1,0,410
.WORD FAT,30,0,5,7,40
.WORD WLMN,2,0,0,2,1
.WORD MINE,5,0,0,5,1
.WORD TANK,5,0,90,0,1720
.WORD 0
;WAVE 5
;CASH ROOM
.WORD HULK,455,6,4,0,120
.WORD FAT,25,0,80,0,400
.WORD MINE,5,0,0,5,1
.WORD TANK,2,0,140,0,1800
.WORD 0
;WAVE 6
.WORD HULK,35,3,1,16,500
.WORD GALS3,1,0,190,0,1 ;SWARMER DUDES
.WORD FAT,15,0,60,3,70
.WORD MINE,2,0,0,2,1 ;5
.WORD TANK,5,0,240,0,1220 ;1820
.WORD 0
;WAVE 7
.WORD HULK,395,3,1,16,1
.WORD GALS3,1,0,250,0,1300 ;SWARMER DUDES
.WORD MINE,3,0,0,3,1
.WORD FAT,13,0,115,2,1
.WORD TANK,5,0,140,0,1620
.WORD 0
;WAVE 8 ;WALL MEN
.WORD HULK,295,4,1,0,160 ;COULD ENTER FROM MULTIPLE DOORS!
;DO NOT HAVE ANY ON SCREEN!
.WORD GALS3,1,0,500,0,1 ;SWARMER DUDES
.WORD FAT,10,0,10,3,1
.WORD WLMN,2,0,0,2,1
.WORD MINE,5,0,0,5,1
.WORD TANK,13,0,40,0,700 ;8
.WORD 0
;WAVE 9 ;WALL MEN
.WORD HULK,325,4,1,0,1 ;COULD ENTER FROM MULTIPLE DOORS!
;DO NOT HAVE ANY ON SCREEN!
.WORD WLMN,2,0,0,2,1
.WORD TANK,17,0,160,0,1 ;200
.WORD FAT,8,0,1,3,300
.WORD MINE,4,0,0,4,1
.WORD 0
;WAVE 10
;MUTOID MAN
.WORD MUTD,0,0,07FFFH,1,1
.WORD MINE,2,0,0,2,1
.WORD GALS3,1,0,45,0,20 ;SWARMER DUDES
.WORD FAT,35,0,140,0,1000 ;1000 / 200
.WORD 0
W2_INFO:
;TYPE # LEVEL RATE ONSCRN CNTR
;WAVE 1
.WORD ORB,98,0,10,1,1 ;STUFF IN CORNER!
; .WORD RBTA,350,3,1,0,1
.WORD 0
;WAVE 2
.WORD RBTA,380,3,1,0,1
.WORD FAT,1,0,90,1,500
.WORD 0
;WAVE 3
.WORD RBTA,270,5,5,3,850
.WORD GALS3,2,0,80,0,1 ;SWARMER DUDES
.WORD MINE,3,0,0,3,1
.WORD GALS1A,15,0,10,0,150 ;TRAIN
.WORD 0
;WAVE 4
.WORD GALS3,1,0,70,0,1 ;SWARMER DUDES
.WORD RBTA,240,4,1,0,800
.WORD MINE,4,0,0,4,1
.WORD GALS1,60,0,15,0,1 ;GALAGA TRAIN HEAD ENEMY
.WORD 0
;WAVE 5
.WORD RBTA,330,7,1,0,720
.WORD GALS1,40,0,8,0,181 ;GALAGA TRAIN HEAD ENEMY
.WORD FAT,10,0,190,1,500
.WORD MINE,4,0,0,4,1
.WORD GALS3,4,0,75,0,1 ;SWARMER DUDES
.WORD TANK,6,0,60,1,1200
.WORD 0
;WAVE 6
.WORD ORB,90,0,8,1,400 ;
.WORD GALS2,35,0,15,0,1 ;PURPLE GALAGA
.WORD MINE,4,0,0,4,1
.WORD TANK,13,0,50,1,1
.WORD 0
;WAVE 7
;FLAT FACE ;MONITOR OUT
.WORD FACE,0,0,07FFFH,1,1
.WORD MINE,5,0,0,5,1
.WORD 0
;WAVE 8
.WORD RBTA,180,3,1,0,800
.WORD GALS1A,16,0,10,0,10 ;GALAGA TRAIN
.WORD MINE,3,0,0,3,1
.WORD 0
;WAVE 9 ;MONITOR OUT
;TYPE # LEVEL RATE ONSCRN CNTR
.WORD RBTA,290,7,1,0,130
.WORD GALS3,4,0,80,0,1 ;SWARMER DUDES
; .WORD TANK,4,0,140,1,1
.WORD MINE,5,0,0,5,1
.WORD 0
;WAVE 10
.WORD RBTA,100,4,1,5,1 ;BOGUS WAVE NEVER SEEN!
.WORD 0
;WAVE 11
.WORD RBTA,360,5,1,0,890 ;JUNK ON FLOOR
.WORD GALS1A,16,0,10,0,1 ;TRAIN
.WORD 0
;WAVE 12
;MONITOR OUT
; .WORD ORB,88,0,8,1,120 ;CASH ROOM
.WORD RBTA,550,4,1,0,150
.WORD MINE,5,0,0,5,1
.WORD FAT,17,0,70,0,500
.WORD 0
;WAVE 13
.WORD GALS2,24,0,4,0,10 ;PURPLE GALAGA
.WORD RBTA,350,4,5,0,350
.WORD MINE,3,0,0,3,1
.WORD 0
;WAVE 14 ;MONITOR OUT
.WORD RBTA,380,5,4,0,150 ;CASH ROOM
.WORD GALS1A,3,0,180,0,500 ;TRAIN GALAGA
.WORD FAT,9,0,10,0,1000
.WORD MINE,5,0,0,5,1
.WORD TANK,3,0,190,0,900
.WORD 0
;WAVE 15
.WORD ORB,90,0,8,1,1
.WORD MINE,5,0,0,5,1
.WORD TANK,8,0,190,1,1
.WORD 0
;WAVE 16
.WORD RBTA,350,7,1,0,720
.WORD GALS1,40,0,7,0,181 ;GALAGA TRAIN HEAD ENEMY
.WORD FAT,10,0,190,1,500
.WORD MINE,4,0,0,4,1
.WORD GALS3,4,0,75,0,1 ;SWARMER DUDES
.WORD TANK,8,0,60,1,1200
.WORD 0
;WAVE 17
.WORD RBTA,550,7,1,0,1
.WORD 0
;WAVE 18
.WORD RBTA,690,7,1,0,1200
.WORD MINE,2,0,0,2,1
.WORD GALS3,9,0,80,0,1 ;SWARMER DUDES
.WORD GALS1A,15,0,10,0,520 ;TRAIN
; .WORD TANK,3,0,100,1,1700
.WORD GALS2,5,0,10,0,1090 ;PURPLE GALAGA
.WORD 0
;
;CIRCUIT 3 INFO
;
W3_INFO:
;TYPE # LEVEL RATE ONSCRN CNTR
;WAVE 1
.WORD HULK,12,2,1,8,900 ;SET HULKTYP
.WORD SNK,15,3,280,0,400
.WORD TANK,24,0,19,0,1
.WORD MINE,5,0,0,5,1
.WORD 0
;WAVE 2
.WORD HULK,315,2,8,3,350
.WORD SNK,335,3,80,0,1
.WORD GALS1A,6,0,50,0,50 ;GALAGA TRAIN
.WORD MINE,5,0,0,5,1
.WORD TANK,3,0,100,0,1500
.WORD 0
;WAVE 3 ;REGULAR GRUNTS
.WORD HULK,700,7,1,5,1
.WORD FAT,5,0,170,2,2100
.WORD SNK,235,0,290,0,1
.WORD MINE,3,0,0,3,1
.WORD TANK,3,0,100,0,2400
.WORD 0
;WAVE 4
.WORD HULK,650,7,1,5,1
.WORD MINE,3,0,0,3,1
.WORD FAT,17,0,70,4,500
.WORD 0
;WAVE 5
.WORD RBTA,400,6,4,0,1
.WORD MINE,8,0,0,8,1
.WORD 0
;WAVE 6
.WORD HULK,1040,6,1,1,800
.WORD GALS3,13,0,70,0,1 ;SWARMER DUDES
.WORD MINE,14,0,0,14,1
.WORD GALS1A,34,0,400,0,180 ;GALAGA TRAIN
.WORD 0
;WAVE 7
;SNAKES ;MONITOR OUT
.WORD COBRA,0,0,07FFFH,1,1
.WORD 0
;WAVE 8
.WORD HULK,700,5,2,5,1
.WORD SNK,835,3,80,0,20
.WORD MINE,6,0,0,6,1
.WORD 0
;WAVE 9 ;MONITOR OUT
.WORD HULK,650,6,1,0,1200
.WORD FAT,17,0,170,4,500
.WORD SNK,2835,3,25,0,50
.WORD MINE,5,0,0,5,1
.WORD 0
;WAVE 10 ;BOGUS WAVE NEVER SEEN
.WORD HULK,140,4,1,5,1
.WORD 0
;WAVE 11
.WORD HULK,9,2,1,5,1100 ;SET HULKTYP
.WORD TANK,25,0,15,1,1
.WORD MINE,5,0,0,5,1
.WORD 0
;WAVE 12 ;PRIZE ROOM
.WORD HULK,600,6,1,0,350
.WORD MINE,6,0,0,6,1
.WORD FAT,8,0,1,0,1400
.WORD GALS1A,4,0,50,0,180 ;GALAGA TRAIN
.WORD GALS3,5,0,280,0,700 ;SWARMER DUDES
.WORD 0
;WAVE 13
.WORD HULK,400,2,1,10,1
.WORD SNK,535,3,80,0,50
.WORD MINE,5,0,0,5,1
.WORD GALS3,1,0,80,0,700 ;SWARMER DUDES
.WORD FAT,9,0,1,0,1400
.WORD GALS1A,5,0,50,0,180 ;GALAGA TRAIN
.WORD 0
;WAVE 14 ;PRIZE ROOM
.WORD HULK,555,5,1,0,150 ;SET HULKTYP
.WORD FAT,17,0,170,0,400
.WORD TANK,10,0,100,0,1500
.WORD MINE,6,0,0,6,1
.WORD 0
;WAVE 15
.WORD RBTA,900,5,1,0,1300
.WORD MINE,4,0,0,4,1
.WORD GALS1A,5,0,180,0,180 ;GALAGA TRAIN
.WORD SNK,2835,4,33,0,1
.WORD 0
;WAVE 16
.WORD RBTA,2440,5,1,0,1
.WORD MINE,5,0,0,5,1
.WORD GALS3,13,0,180,0,900 ;SWARMER DUDES
.WORD 0
;WAVE 17
.WORD HULK,650,5,1,1,1000
.WORD SNK,2835,4,25,0,1
.WORD GALS1A,5,0,200,0,180 ;GALAGA TRAIN
.WORD MINE,6,0,0,6,1
.WORD 0
;WAVE 18
.WORD HULK,750,5,3,5,1
.WORD MINE,3,0,0,3,1
.WORD GALS1A,15,0,50,0,180 ;GALAGA TRAIN
.WORD FAT,27,0,80,4,500
.WORD GALS3,15,0,180,0,1800 ;SWARMER DUDES
.WORD 0
;WAVE 19
.WORD ORB,240,0,8,1,400 ;
.WORD GALS2,35,0,15,0,1 ;PURPLE GALAGA
.WORD MINE,8,0,0,8,1
.WORD TANK,10,0,180,1,100
.WORD FAT,13,0,1,0,1200
.WORD 0
;WAVE 20
.WORD HULK,2540,6,3,5,80
.WORD MINE,3,0,0,3,1
.WORD GALS1A,2,0,10,0,10 ;GALAGA TRAIN
.WORD FAT,27,0,180,4,900
.WORD GALS3,2,0,180,0,2100 ;SWARMER DUDES
.WORD 0
;WAVE 21
;MUTOID MAN
.WORD MUTD,0,0,07FFFH,1,1
.WORD MINE,2,0,0,2,1
.WORD GALS3,1,0,45,0,20 ;SWARMER DUDES
.WORD FAT,35,0,140,0,1000 ;1000 / 200
.WORD 0
.IF DEBUG
;FAKE CIRCUIT
FAKE_INFO:
;RECORDS LOOK LIKE THIS
;TYPES:DIFFERENT ID'S
;#:TOTAL NUMBER PER WAVE
;DIFFICULTY:0,1,2,3 0=EASIEST
;RATE:# OF CYCLES/3 (SLP CNTR) BEFORE SPAWN IS CALLED
;ONSCRN:# OF TYPE ON SCREEN AT START OF WAVE
;CNTR USED IN WAVE RAM UPDATING
;RECORD LAYOUT
;TYPE # LEVEL RATE ONSCRN CNTR
;WAVE 1
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 2
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 3
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 4
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 5
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 6
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 7
.WORD COBRA,0,0,07FFFH,1,1
.WORD 0
;WAVE 8
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 9
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 10
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 11
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 12
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 13
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 14
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 15
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 16
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 17
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 18
.WORD HULK,5,6,1,0,1
.WORD 0
;WAVE 19
.WORD ORB,280,0,8,1,400 ;
.WORD GALS2,35,0,15,0,1 ;PURPLE GALAGA
.WORD MINE,8,0,0,8,1
.WORD TANK,10,0,180,1,100
.WORD FAT,13,0,1,0,1200
.WORD 0
;WAVE 20
.WORD HULK,2540,6,3,5,80
.WORD MINE,3,0,0,3,1
.WORD GALS1A,2,0,10,0,10 ;GALAGA TRAIN
.WORD FAT,27,0,180,4,900
.WORD GALS3,2,0,180,0,2100 ;SWARMER DUDES
.WORD 0
;WAVE 21
;MUTOID MAN
.WORD MUTD,0,0,07FFFH,1,1
.WORD MINE,2,0,0,2,1
.WORD GALS3,1,0,45,0,20 ;SWARMER DUDES
.WORD FAT,35,0,140,0,1000 ;1000 / 200
.WORD 0
.WORD ORB,12,0,7,1,1 ;
.WORD 0
.ENDIF
ZEROCNTS
CLR A0
MOVE A0,@HULK_CNT
MOVE A0,@TNK_CNT
MOVE A0,@FAT_CNT
MOVE A0,@ORB_CNT
MOVE A0,@GAL_CNT
MOVE A0,@RBTA_CNT
RETS
OVERLORD:
SLEEP 3
; MOVK 10,A0
; MOVE A0,@WAVE
;GET BASE ADDR OF CURRENT WAVES INFO
MOVE @WAVEYX,A0,L
;JUST ADJUST FOR NEW WORLD STUFF
;NEEDED
; CALLA DO_BND ;GETS BOUNDARIES FOR NEXT WAVE
AP MOVK 1,A0
MOVE A0,@EHALT
CALLR SETMAX
CALLR ZEROCNTS
MOVB A0,@ECON ;NO ENEMY TO ENEMY COLLIDE ON!
MOVB A0,@ENON ;NO ENEMY TO NEUTRAL COLLIDE ON!
MOVB A0,@PZON
;CLEAR RAM AREA FOR TEMP X/Y POSITIONS
MOVI RAMXY,A0
CLR A3
MOVI MAX_ONSC,A1
LP9: MOVE A3,*A0+,L
DSJS A1,LP9
MOVI [60,60],A0 ;SOME VALUE TO INIT TABLE WITH
;NOTHING WILL ORIGINATE AT 20/20
MOVI RAMXY,A1
MOVE A0,*A1+,L
MOVE A1,@KEEPXY,L
MOVE @CIRCUIT,A0
SLL 5,A0
ADDI CQWAVE,A0
MOVE *A0,A1,L
MOVE @GAMSTATE,A0,W
CMPI INAMODE,A0
JRNZ RIP
;IN DEMO
MOVE @WAVE,A0
CMPI 1,A0
JRNZ RIP
MOVI 30,A0
MOVB A0,@MAXHULK
MOVK 9,A0
JRUC RIP2
RIP
MOVE @WAVE,A0 ;WAVE 1 IS THE FIRST WAVE
RIP2 DEC A0
JRNZ OL00
MOVE A1,A5
OL00: CLR A4
OL0: INC A4
MOVE *A1,A2,W
JRZ OL1
ADDI 6*16,A1
JRUC OL0
OL1: CMPI 0,A0
JRZ GOTIT
ADDI 16,A1 ;POINT TO NEXT WAVE INFO TABLE
INC A3
CMP A0,A3
JRNE OL00
MOVE A1,A5
GOTIT:
MOVE A5,A1 ;A5=ADDR OF THIS WAVE IN ROM
; CLEAR WAVE RAM
MOVI WAVE_RAM,A0
CLR A6
MOVI 29,A7
GT00 MOVE A6,*A0+,L
DSJS A7,GT00
; PUT WAVE INFO INTO RAM FOR UPDATING
MOVK 8,A4 ;CAN IT AT 8!
MOVI WAVE_RAM,A0
GT0 MOVI 6,A3 ;# OF FIELDS PER BAD GUY
GT MOVE *A1+,*A0+,W
DSJS A3,GT
DSJS A4,GT0
; NOW PUT ONSCRN # OF EACH TYPE ONTO SCREEN!
MOVI WAVE_RAM,A0
ON1: MOVE *A0,A1,W ;GET TYPE #
JRZ DONE
MOVE *A0(4*16),A2,W ;A2=# ONSCRN
JRZ GET_NXT ;NONE ON SCREEN AT START
DEC A1 ;TYPE #
SLL 5,A1
ADDI TYP_TBL,A1
MOVE *A1,A3,L
PUSH A0
CALL A3
PULL A0
GET_NXT:
ADDI 6*16,A0
JRUC ON1
DONE:
;PLACE ON SCREEN CASH ITEMS!
MOVE @CIRCUIT,A0
JRNZ DNEA
MOVE @WAVE,A0
CMPI 5,A0
JRNE DNE
;YES ON THIS SCREEN
YEA CALLA O_ITEMS
JRUC DNE
DNEA MOVE @WAVE,A0
CMPI 12,A0
JRZ YEA
CMPI 14,A0
JRZ YEA
DNE
SLEEP 1
MOVE @EHALT,A0 ;EHALT IS SET IN WAVES.ASM
;AFTER ARENA TEXT IS ERASED
CMPI 2,A0
JRNZ DNE
CLR A1
NOT A1
MOVI TVPID,A0
CALLA EXISTP
JRZ SAD
MOVK 1,A0
MOVE A0,@HALT
SAD
SLEEP 60*2 ;DELAY BEFORE BAD GUYS MOVE
CLR A0
MOVE A0,@EHALT
CLR A1
NOT A1
MOVI TVPID,A0
CALLA EXISTP
JRZ SAD0
MOVK 1,A0
MOVE A0,@EHALT
SAD0
CALLR INIT_RAM
RLSE:
;DISPERSE ENEMIES THROUGHOUT WAVE
MOVI WAVE_RAM,A0
MOVE @HALT,A1,W
JRNZ RDN
RTOP
MOVE *A0(0),A1
JRZ RDN
MOVE *A0(16),A1 ;A1=HOW MANY ARE LEFT
; ANDI 0
JRZ NXTR
MOVE *A0(5*16),A1 ;SPAWN RATE CNTR
DEC A1
MOVE A1,*A0(5*16)
JRNZ NXTR
MOVE *A0(3*16),A1 ;SPAWN RATE IN CYCLES
MOVE A1,*A0(5*16)
;TIME TO SPAWN
MOVE *A0(0),A1
DEC A1
SLL 5,A1
ADDI TYP_TBL2,A1
MOVE *A1,A1,L
PUSH A0
CALL A1
PULL A0
NXTR ADDI 6*16,A0
JRUC RTOP
RDN
;ALL ENEMIES HAVE BEEN CHECKED FOR RELEASE
SLEEP 3
JRUC RLSE
BDF
;GET RID OF BLADES AT DEATH PROCESS!
;
SLEEP 30
;IF BLDS ON, SEND THEM FLYING!
MOVB *A0(BLDFLG),A1
JRZ NB
;YES BLADES ON THIS GUY
SLEEP 30
;WHEN PLAYER DIES, PAUSE A MOMENT AND THEN KILL BLADES AROUND HIM
CALLA BLDOFF
MOVI YAMOFF,A0
CALLA ONESND
NB
DIE
KILL_PLYR:
;MAKE MORE EFFICIENT!!!
;SAVE REGISTERS!?!
;PLYR IN A8, KILLER IN A0
MMTM SP,A1,A2,A6,A7,A10,A11
MOVE *A0(OID),A1
ANDI 0FFFFH,A1
CMPI CLSENMY|TYPORBL,A1
JRNE NSHKME ;SHOCK PLAYER
;LAZER INTO PLAYER!
CALLA SHORT2
JRNC GAMOK
JRUC KP99
NSHKME CALLA SHORT_PLYR ;REALLY A HIT?
JRNC GAMOK ;BR=NO COLLIDE!
KP99 MOVE @HALT,A1
JRNZ GAMOK
MOVE @GAMSTATE,A1
CMPI INAMODE,A1
JREQ GAMOK
MOVE *A8(OPLINK),A7,L
;
MOVB *A7(PNUM),A1 ;NEEDED?
JREQ GAMOK
MOVE *A7(DELYDET),A1,W
JRZ KRU
ANDI 01FFH,A1
JRNZ GAMOK
KRU MOVE *A7(DEAD),A1
JRNZ GAMOK
;
;YES, KILL THIS PLYR
MOVE @CIRCUIT,A10
JRNZ NOMOD
MOVE @WAVE,A10
CMPI 3,A10
JRNC NOMOD
;MODIFY DIFFICULTY! THIS PLAYER IS A BOZO!
PUSH A0
MOVI HULK,A2
CALLA GET_WVADDR
CLR A10
MOVE A10,*A0(32) ;ZERO DIFFICULTY
PULL A0
NOMOD MOVE A0,A10 ;PASS ALONG SHRAP PTR
MOVE *A0(OID),A11
ANDI 0FFFFH,A11
CMPI CLSENMY|TYPCBALL,A11 ;SHRAPNEL ALSO
JRNE AA
; MOVB @FACEON,A1
; JRZ AVC
;FACE ON, WANT A FRY DEATH!
; MOVI CLSENMY|TYPORB,A11 ;(OID)
; MOVE A11,*A0(OID)
; JRUC AA
;AVC
;WANT A SPIN DEATH!
PUSH A7
CREATE 0,SHOWIT
PULL A7
AA
CMPI CLSNEUT|TYPMINE,A11
JRNE ABC
;KILL MINE
PUSH A7
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A10(OID),W
CREATE 0,EXPMINE ;KILL LAND MINE (A10=PTR)
MOVI EXP3,A0
CALLA ONESND
PULL A7
ABC
;A11=OID OF WHAT KILLED THIS PLAYER
;A10=KILLER IMAGE PTR
MOVE A7,A0 ;A7=PLYR IMG OPLINK
MOVE A11,*A0(DEAD),W
PUSH A0
CREATE 0,BDF ;WILL HANDLE GETTING RID OF BLADES
PULL A0
;IF HELPER ON, SEND IT FLYING
MOVE *A0(LSRPTR),A1,L
JRZ NLZ
;YES LAZER ON
PUSH A8
MOVE A1,A8
CALLA LSHIT
PULL A8
NLZ
MOVI P1DATA,A11
MOVB *A0(PNUM),A0
CMPI 1,A0
JREQ CG
MOVI P2DATA,A11
CG
MOVE A11,A2
;A2=P1DATA OR P2DATA
MOVI >10,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
MOVE *A11(PLIVES),A0,W ;TEMP
CMPI 9,A0
JRC TAG1
MOVK 9,A0
MOVE A0,*A11(PLIVES),W
TAG1 CMPI 0,A0
JRNZ GAMOK
;CHANGE MESSAGE ON HIS SCOREBOARD/PLUS STILL SHOW PLAYER SCORE!
;COLOR CYCLE IT
;DISPLAY A COUNTDOWN
CREATE 0,OVERLAP
; MOVK 1,A0
; MOVB A0,@WNTOUT
MOVI MCSPK9,A0 ;TEN SECONDS SPEECH
CALLA ONESND
MOVK 1,A1
MOVB A1,*A11(CNTD) ;FLAG FOR MESSAGES AND CNTR
CMPI P1DATA,A11
JRNE F3
CREATE P1PID,MSG_PROC2
JRUC F4
F3 CREATE P2PID,MSG_PROC2
F4 MOVE @STATUS,A0
CMPI 3,A0
JRZ GAMOK
;IS PLAYER CNTING DOWN?
MOVB @CNTDIG1,A2
MOVB @CNTDIG2,A1
OR A2,A1
JRNZ GAMOK
CREATE BUYINPID,PSTAT
GAMOK:
MMFM SP,A1,A2,A6,A7,A10,A11
RETS
OVERLAP
MOVK 1,A0
MOVB A0,@WNTOUT
SLEEP 5
CLR A0
MOVB A0,@WNTOUT
DIE
SHOWIT
;SHOW SHRAPNEL FOR A MOMENT AFTER IT HAS KILLED PLAYER
;KILL CBALL/SHRAPNEL IMAGE (KILLER)
;A10=IMG PNTR OF KILLER
MOVE *A10(OPLINK),A0,L
JRZ DY
CALLA KILL
CLR A0
MOVE A0,*A10(OPLINK),L
CLR A0
;STOP ITS MOVEMENT
;MAKE IT CONSTANT COLOR CYCLE COLOR
MOVE A0,*A10(OXVEL),L
MOVE A0,*A10(OYVEL),L
MOVI BOOM3,A9
MOVE A10,A8
MOVK 1,A1
JSRP FRANIM
MOVE A10,A0
CALLA DELOBJ
DY DIE
BOOM3
.LONG EXPb1
.WORD NEWPALET|4
.LONG BULLET ;NEW PAL NAME
.LONG EXPb2
.WORD 4
.LONG EXPb3
.WORD 4
.LONG EXPb2
.WORD 4
.LONG EXPb1
.WORD 4
.LONG EXPb2
.WORD 4
.LONG EXPb3
.WORD 4
.LONG EXPb2
.WORD 4
.LONG EXPb1
.WORD 4
.LONG EXPb2
.WORD 4
.LONG EXPb3
.WORD 4
.LONG EXPb2
.WORD 4
.LONG EXPb1
.WORD 4
.LONG 0
CTRLS .LONG P1CTRL,P2CTRL
**************************************************************************
* DRAW_PLYR_TORSO *
* *
**************************************************************************
DRAW_PLYR_TORSO:
;MUST ARRIVE HERE WITH 1/2 PLAYER FLAG
;A8=1 OR 2 AT THIS POINT!
;A9=0 IF STARTING GAME FROM SCRATCH,1=START PLAYER BEHIND LEFT SIDE DOOR,2=RGT
MOVB A8,*A13(PNUM) ;A8=1 OR 2 FOR WHAT PLAYER THIS IS
DEC A8
SLL 5,A8
MOVI CTRLS,A1
ADD A8,A1
MOVE *A1,A0,L
MOVE A0,*A13(STICK),L ;PLACE CORRECT STICK READ ADDR
ADDI PLYRPRCS,A8
MOVE A13,*A8,L ;PUT PLYR PROC INTO TABLE PLYRPRCS
CALLA STRT_PLYR_LEGS
MOVE A0,*A13(LEG_PTR),L ;KEEP LEG PTR IN TORSO STURCTURE
MOVE A0,*A13(LEG2_PTR),L ;KEEP LEG PTR IN TORSO STURCTURE
MOVI 02H,A0 ;HI BIT SET, DIR = 4 (TO THE RIGHT)
;HI BIT SET = STANDING MODE
MOVE A0,*A13(P_DIR),W
MOVE A0,*A13(TMP_P_DIR),W
CALLA STRT_PLYR_TORSO
MOVE A8,*A13(TSO_PTR),L ;KEEP TORSO PTR IN TORSO STRUCTURE!?
MOVB *A13(PNUM),A0
DEC A0
SLL 5,A0
ADDI PLYROBJS,A0
MOVE A8,*A0,L ;INSERT TORSO PTRS INTO TABLE
MOVE *A13(LEG2_PTR),A9,L ;READY TO PASS LEG ALONG TO LEG PROC
MOVE A13,A10 ;PASS TORSO PROC TO LEG
MOVB *A13(PNUM),A0
CMPI 1,A0
JRNE AXC
CREATE PLY1PID,DRAW_PLYR_LEGS
JRUC AXCD
AXC
CREATE PLY2PID,DRAW_PLYR_LEGS
AXCD
MOVK 1,A0
MOVE A0,*A13(OLD_P_DIR),W
CLR A0
MOVE A0,*A13(DEAD),W
MOVE A0,*A13(WPN_TYP),W
MOVE A0,*A13(SHOOT_FLAG),W
MOVE A0,*A13(LSRPTR),L
MOVB A0,*A13(BLDFLG)
MOVB A0,*A13(BNDTYP)
MOVB A0,*A13(PRVBND)
MOVB *A13(PNUM),A7
DEC A7
SLL 5,A7
ADDI PLYRPRCS,A7
MOVE *A7,A7,L
CALLA DO_BND
MOVI 40,A0
MOVE A0,*A13(DELYDET)
TORSO_1:
CLR A0
MOVE A0,*A13(REV_FLAG),W
MOVE *A13(DELYDET),A0
ANDI 01FFH,A0
JRZ TY
DEC A0
MOVE A0,*A13(DELYDET)
TY
MOVE *A13(DEAD),A1
JRZ NDD ;BR=NOT DEAD
PUSH A1
CREATE 0,CHEER
PULL A1
;COLOR CYCLE/FLASH PLAYER!
MOVE *A13(LEG2_PTR),A2,L ;GET LEG INFO
CLR A0
MOVE A0,*A2(OXVEL),L
MOVE A0,*A2(OYVEL),L
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE @FACEON,A0
JRNZ DIECHU
CMPI CLSNEUT|TYPMINE,A1
JREQ DIECHU
CMPI CLSNEUT|TYPCHSR,A1
JREQ DIECHU
CMPI CLSNEUT|TYPTANK,A1
JREQ DIECHU
ANDI 0FFF0H,A1 ;FFF0?
CMPI CLSENMY|TYPMUT,A1
JREQ DIECHU
CMPI CLSENMY|TYPFACE,A1
JREQ DIECHU
CMPI CLSENMY|TYPCBL2,A1
JREQ DIECHU
CMPI CLSENMY|TYPGAL,A1
JREQ DIECHU
;OTHER CHUNK OIDS HERE
CMPI CLSENMY|TYPORBL,A1
JREQ DIESHK
CMPI CLSENMY|TYPORB,A1
JREQ DIESHK
CMPI CLSENMY|TYPCOB|SUBCOBFLM,A1
JREQ DIESHK
;OTHER SHOCK OIDS HERE
SPDTH
;IF SPIN DEATH, FALL IN HERE
SLEEP 05
;BLOOD CHUNKS
CREATE 0,TWOCHNKS
CREATE 0,CHNKS2
MOVI UGH,A0
CALLA ONESND
MOVK 1,A1
MOVI TSPN,A9
JSRP FRANIM
MOVK 1,A1
MOVI 132,A0 ;129
MOVE A0,*A8(OZPOS)
MOVI DIELST,A9
JSRP FRANIM
SLEEP 1
JRUC ALLDIE
DIESHK:
SLEEP 01
MOVI SHKSND,A0
CALLA ONESND
MOVK 1,A1
MOVI TSHK,A9
JSRP FRANIM
SLEEP 1
JRUC ALLDIE
CHEER SLEEP 25
MOVI CROWD2,A0
CALLA ONESND
DIE
;DIECK
; MOVB @TOID_ON,A0
; JRZ SPDTH
DIECHU:
;IF CHUNK DEATH, FALL IN HERE
MOVI UGH,A0 ;SCREAM
CALLA ONESND
CREATE 0,ADPCS3
;CHANGE PRIORITY
MOVE *A8(OYPOS),A0
ADDI 12,A0
MOVE A0,*A8(OYPOS)
MOVK 1,A1
MOVI OVALBLD,A9
JSRP FRANIM
MOVE A8,A0
CALLA OBJOFF
SLEEP 60*2
ALLDIE
MOVB *A13(PNUM),A0
SLL 5,A0
ADDI TBLP,A0
MOVE *A0,A11,L
SLP SLEEP 1
MOVE @HALT,A0
JRNZ SLP
MOVB *A11(CNTD),A0
JRZ DOV
CLR A1
MOVE A1,*A8(OYPOS)
MOVE A1,*A8(OXPOS)
MOVB *A13(PNUM),A10 ;1 OR 2
DEC A10
MMTM SP,A8,A9,A10,A11
CALLA SWAPSK ;TELL HULKS TO SEEK ANOTHER PLAYER
MMFM SP,A8,A9,A10,A11
SLPZ SLEEP 1
MOVE @HALT,A0
JRNZ SLPZ
MOVB *A11(CNTD),A0
JRZ DOV
CMPI 1,A0
JRZ SLPZ
;PLAYERS TIME HAS EXPIRED.
;KILL PROC,OBJS,START MESSAGES!
CLR A0
MOVB A0,*A11(CNTD)
CMPI P1DATA,A11
JRNE KL2
;KILL PLYR1
CALLA KILLP1
;IS OTHER GUY STILL AROUND?
MOVI PLY2PID,A0
DYE0 CLR A1
NOT A1
CALLA EXISTP
JRNZ DYE
CREATE 0,GOGUYS ;PRINTS GAME OVER MESSAGE!
DYE DIE
;KILL PLYR2
KL2 CALLA KILLP2
;IS OTHER GUY STILL AROUND?
MOVI PLY1PID,A0
JRUC DYE0
GOGUYS
MOVI INGAMEOV,A0
MOVE A0,@GAMSTATE,W
SOUND1 MUSICOFF ;MUSIC HARD OFF
CLR A0
CLR A1
NOT A1
CALLA KILALL ;KILL ALL GAME PROCESSES
; JSRP CWINDOW
; CLR A0
; MOVB A0,@WANTIN
; MOVB A0,@WNDO
CREATE GMEOVPID,GAMEOVER ;GAME IS NOW OFFICIALLY OVER
DIE
PCTR .LONG P1CTRL,P2CTRL
TBLP .LONG 0,P1DATA,P2DATA
DOV
;
;DEAD OVER
;
MOVI P1DATA,A1
MOVB *A13(PNUM),A0
CMPI 1,A0
JREQ ET1
MOVI P2DATA,A1
ET1
;
MOVE *A1(PLIVES),A2
DEC A2
MOVE A2,*A1(PLIVES),W
PUSH A8
CALLA LIVECNT
PULL A8
SKPIT MOVI 159,A0 ;TORSO REGULAR Z
MOVE A0,*A8(OZPOS)
MMTM SP,A8,A9
MOVB *A13(PNUM),A9
MOVE A9,A0
DEC A0
SLL 5,A0
ADDI PCTR,A0
MOVE *A0,A8,L
CREATE SCRPID,SCRIPTPLAY
CLR A0
MOVE A0,*A13(WPN_TYP)
MOVE A0,*A13(LSRPTR),L
MOVB A0,*A13(BNDTYP)
MOVB A0,*A13(BLDFLG)
MOVE *A13(LEG_PRC),A1,L
MOVE A0,*A1(SHOECNT)
;CLEAR SHOT CNT FOR METER
CMPI 1,A9
JRNE VX1
MOVI 080000H,A2
MOVI 0850000H,A3
MOVE @PLYRPRCS,A0,L
MOVE *A0(LEG2_PTR),A0,L
MOVE A2,*A0(OXVAL),L
MOVE A3,*A0(OYVAL),L
CALLA ADJSTWTL
;ANI EMPTY METER ONTO SCREEN
; MOVB @MTR1CNT,A0
; CMPI 6,A0
; JRNZ U1
;METER WAS LOW, TURN OFF BEEP SOUND
; CALLA KILLBEEP
;U1
MOVK 7,A0
MOVB A0,@MTR1CNT
CREATE 0,FIXMETERS
JRUC AXZ
VX1
MOVI 01800000H,A2
MOVI 0850000H,A3
MOVE @PLYRPRCS+32,A0,L
MOVE *A0(LEG2_PTR),A0,L
MOVE A2,*A0(OXVAL),L
MOVE A3,*A0(OYVAL),L
CALLA ADJSTWTL
;ANI EMPTY METER ONTO SCREEN
; MOVB @MTR1CNT+8,A0
; CMPI 6,A0
; JRNZ U2
;METER WAS LOW, TURN OFF BEEP SOUND
; CALLA KILLBEEP
;U2
MOVK 7,A0
MOVB A0,@MTR1CNT+8
CREATE 0,FIXMETERS2
AXZ
MMFM SP,A8,A9
;REALIGN PLAYER HALVES WHEN WE RESET
MOVE A8,A0
MOVE *A13(LEG2_PTR),A8,L ;GET LEG PTR OUT OF TORSO STRUCT
CALLA GETANIXY
MOVE *A8(OFLAGS),A4,W
ORI M_NOCOLL,A4
CALLA GANISAG
MOVE A0,A8
;TURN BACK ON TORSO OBJECT
CALLA OBJON
;
MOVI nup1,A0
MOVE *A8(OPLINK),A1,L
MOVB *A1(PNUM),A1
CMPI 1,A1
JREQ OKP
;CHANGE TO PLAYER 2 PAL IF NEEDED!
;CHANGE TO NUP2 PAL
MOVI nup2,A0
OKP
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
MOVI 140,A0 ;120
MOVE A0,*A13(DELYDET),W
CLR A0
MOVE A0,*A13(DEAD),W
NDD
MOVB @ENDON,A0 ;DO NOT SHOOT AT END OF MUTOID!
JRNZ NOT_TOUCHED
MOVE *A13(STICK),A2,L
MOVE *A2,A2,W ;ACTUALLY GET P1/P2CTRL INFO
.IF YUNIT
ANDI 0F0H,A2
.ELSE
ANDI 0F00H,A2
.ENDIF
JRNZ TORSO_2
NOT_TOUCHED:
; 1
; 8 5
;7 4
; 9 6
; 2
CLR A0
MOVB A0,*A13(OSHTDIR)
MOVE *A13(P_DIR),A0 ;DIR + HIBIT SET IF STATIONARY
BTST 15,A0 ;TEST FOR STANDING FLAG
JRZ RUNNING
; P1 IS STANDING STILL. PLACE CORRECT TORSO ON TOP OF FEET
; CHECK FOR ALREADY THERE!
ANDI 01FH,A0
CLR A14
MOVE A14,*A13(OLD_P_DIR),W
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A0,A14
MOVE A8,A0
MOVE *A13(LEG2_PTR),A8,L ;GET LEG PTR OUT OF TORSO STRUCT
CALLA GETANIXY
MOVE *A8(OFLAGS),A4,W
ORI M_NOCOLL,A4
CALLA GANISAG
MOVE A0,A8
MOVE A14,A0
MOVE *A13(WPN_TYP),A2,W
SLL 5,A2
ADDI WPNWALK,A2
MOVE *A2,A2,L
SLL 5,A0
ADD A0,A2
MOVE *A2,A1,L
ADDI T_WALK_FLG,A0
MOVE *A0,A4,W
CALLA ANI
LTP: SLEEP 1
JRUC TORSO_1
RUNNING:
MOVE A8,A0
MOVE *A13(LEG2_PTR),A8,L
CALLA GETANIXY
MOVE *A8(OFLAGS),A4,W
ORI M_NOCOLL,A4
CALLA GANISAG
MOVE A0,A8
MOVE *A13(P_DIR),A4 ;CURRENT DIR P1 IS FACING
SLL 5,A4
MOVE *A13(WPN_TYP),A1,W
SLL 5,A1
ADDI WPNWALK,A1
MOVE *A1,A1,L
;MOVE BASE TABLE ADDRESS INTO A1
ADD A4,A1 ;CALCULATE OFFSET IN TABLE
MOVE *A1,A1,L ;MOVE TABLE VALUE INTO A9
CMP A1,A9
JREQ TEE
MOVE A1,A9
ADDI T_WALK_FLG,A4
MOVE *A4,A4,W ;FLAG
CALLA ANI
TEE SLEEP 1
JRUC TORSO_1
TORSO_2:
; PLAYER IS SHOOTING
; STICK IS BEING PRESSED
CLR A0
MOVE A0,*A13(OLD_P_DIR),W
CALLA FIRE_DIRECTION
;PLAYER WILL BEGIN FRANIM OF SHOOTING IN PROPER DIRECTION
MOVE *A13(P_DIR),A0
ANDI 0FH,A0
MOVE @B_DIR,A4
MOVB *A13(OSHTDIR),A5
CMP A4,A5
JREQ JJ
;SHOOTING IN NEW DIR. ZERO REV_DIR.
CLR A5
MOVE A5,*A13(REV_P_DIR),W
JJ:
MOVB A4,*A13(OSHTDIR)
MOVE A4,*A13(SHOOT_FLAG),W
MOVI REVERSE,A1
SLL 4,A4
ADD A4,A1
MOVE *A1,A1 ;GET TABLE VALUES FOR THIS BDIR
;NOW BIT TEST CORRECT PDIR BIT TO SEE IF WE WILL NEED TO FLIP LEGS
BTST A0,A1
JRZ NOR
;YES WE MUST REVERSE PLAYERS LEGS BECAUSE HE IS TWISTING TO FAR!
MOVK 1,A1
MOVE A1,*A13(REV_FLAG),W
NOR:
SLL 1,A4
MOVE *A13(WPN_TYP),A5
SLL 5,A5
ADDI LISTWHAT,A5
MOVE *A5,A5,L
SLL 5,A0
ADD A0,A5
MOVE *A5,A3,L
ADD A4,A3 ;CALCULATE OFFSET IN TABLE
MOVE *A3,A9,L ;MOVE TABLE VALUE INTO A9
;THIS IS NEW FRANIM SCRIPT PNTR
PUSH A8
CALLA STRT_WPN ;TORSO CONTROLS
PULL A8
MOVI 1,A1
JSRP FRANIM
MOVI 0,A0
MOVE A0,*A13(SHOOT_FLAG)
JRUC TORSO_1
**************************************************************************
* DRAW_PLYR_LEGS *
* *
**************************************************************************
DRAW_PLYR_LEGS:
;A8=TORSO ABOVE THESE LEGS
;A10=PROCESS OF TORSO ABOVE THESE LEGS
;A9=LEG PNTR FOR THESE LEGS
MOVE A8,*A13(TSO_PTR),L ;A8=TORSO FOR THESE LEGS
MOVE A10,*A13(TSO_PRC),L ;A10=TORSO PROCESS PNTR
MOVE A9,*A13(LEG_PTR),L ;A9=LEG PTR
MOVE A13,*A10(LEG_PRC),L
CLR A0
MOVE A0,*A13(SHOECNT)
MOVE A9,A8 ;A8=LEG PNTR
MOVI PWK_RGT,A10 ;INIT FRANIM SCRIPT RESET
MOVE A10,A9 ;FRANIM NEEDS IT IN A9
MOVE_TOP:
MOVE *A13(TSO_PRC),A7,L
MOVE *A7(DEAD),A0 ;GET DEAD FLAG FROM TORSO STRUCT
JRZ SLND
ANDI 0FFFFH,A0
CMPI CLSENMY|TYPORBL,A0
JREQ DIECHU2
CMPI CLSENMY|TYPORB,A0
JREQ DIECHU2
; CMPI CLSNEUT|TYPMINE,A0
; JREQ DIECHU2
; CMPI CLSNEUT|TYPCHSR,A0
; JREQ DIECHU2
; CMPI CLSNEUT|TYPTANK,A0
; JREQ DIECHU2
; ANDI 0FFFFH,A0
; CMPI CLSENMY|TYPMUT,A0
; JREQ DIECHU2
;OTHER CHUNK DEATHS HERE.
;FOR CHUNKS, SKIP FOLLOWING LINES OF FRANIM
SLEEP 05
MOVK 1,A1
MOVI LSPN,A9
JSRP FRANIM
DIECHU2
CLR A0
MOVE A0,*A8(OXVAL),L
HG SLEEP 1
MOVE *A13(TSO_PRC),A7,L
MOVE *A7(DEAD),A0
JRNZ HG
MOVI PWK_RGT,A10 ;INIT FRANIM SCRIPT RESET
MOVB *A7(PNUM),A0
CMPI 1,A0
JREQ HGY
MOVI PWK_LFT,A10 ;INIT FRANIM SCRIPT RESET
HGY MOVE A10,A9 ;FRANIM NEEDS IT IN A9
SLND CALLA UPDATE_PLYRXY
JRC DO_FRANI
; PLAYER IS NOT TOUCHING MOVEMENT STICK!
; SET STAND FLAG, AND PNT TO CORRECT IMAGE
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE *A13(TSO_PTR),A1,L ;GET TORSO PNTR FOR THESE LEGS
MOVE A0,*A1(OXVEL),L ;UPDATE TORSO INFO
MOVE A0,*A1(OYVEL),L ;UPDATE TORSO
;A7=TORSO PROC
MOVK 1,A0
MOVE A0,*A7(HAVE_REV),W ;UPDATE TORSO
MOVE *A7(SHOOT_FLAG),A0 ;GET TORSO INFO
JRZ CONT_1
; PLAYERS TORSO IS SHOOTING, MAKE FEET TURN IN SAME DIRECTION AS BODY
ORI 08000H,A0
MOVE A0,*A7(P_DIR),W
ANDI 01FH,A0
SLL 5,A0
; PLAYER WILL BEGIN FRANIM OF SHOOTING IN PROPER DIRECTION
ADDI SHOOT_LEG_LIST,A0
MOVE *A0,A9,L ;MOVE TABLE VALUE INTO A9
;THIS IS NEW FRANIM SCRIPT PNTR
MOVI 1,A1
JSRP FRANIM
JRUC SL_1
CONT_1:
MOVE *A7(P_DIR),A0 ;GET TORSO INFO
ORI 08000H,A0
MOVE A0,*A7(P_DIR) ;GET TORSO INFO
ANDI 01FH,A0
SLL 5,A0
MOVI STAND_TBL_L,A2
ADD A0,A2
MOVE *A2,A1,L
ADDI L_WALK_FLG,A0
MOVE *A0,A4,W
CALLA ANI
;MAKE SURE A9,A10 ARE SET FOR THIS POSITION FOR WHEN HE DOES BEGIN RUNNING
SL_1 SLEEP 1
JRUC MOVE_TOP
DO_FRANI:
; STICK IS BEING PRESSED
; PLAYERS LEGS
;A5=DIR READ FROM STICK AT THIS POINT
;A7=TORSO PROCESS
MOVE *A7(REV_FLAG),A0,W
JRZ NORV
; WE MUST REVERSE PLAYERS LEGS BECAUSE OF SHOOTING POSITION
; VEL MUST STAY SAME
MOVK 1,A0
MOVE A0,*A7(HAVE_REV),W ;UPDATE TORSO INFO!
MOVE *A7(REV_P_DIR),A4
MOVE A5,*A7(P_DIR)
MOVE A5,A6
SLL 5,A6
CMP A5,A4
JRZ SAME_DIR
; NEW DIRECTION, SET A9
MOVE A5,*A7(REV_P_DIR),W ;SAME, BUT SHOULD BE REVERSE
MOVI REV_WALK_LIST,A2 ;MOVE BASE TABLE ADDRESS INTO A2
ADD A6,A2 ;CALCULATE OFFSET IN TABLE
MOVE *A2,A9,L ;MOVE TABLE VALUE INTO A9
MOVE A9,A10
JRUC SAME_DIR
NORV: MOVE *A7(P_DIR),A4 ;CURRENT DIR P1 IS FACING
ANDI 01FH,A4 ;JUST IN CASE HE WAS STANDING STILL
MOVE A5,*A7(P_DIR) ;HI BIT IS NOT SET BECAUSE HE RUNS!
MOVE A5,A6
SLL 5,A6
MOVE *A7(HAVE_REV),A0
JRNZ GET_PROPER
CMP A5,A4 ;CMP WITH NEW DIR READ FROM STICK
JRZ SAME_DIR
GET_PROPER:
; NEW DIRECTION, SET A9
CLR A0
MOVE A0,*A7(HAVE_REV),W
MOVI WALK_LIST,A2 ;MOVE BASE TABLE ADDRESS INTO A2
ADD A6,A2 ;CALCULATE OFFSET IN TABLE
MOVE *A2,A9,L ;MOVE TABLE VALUE INTO A9
MOVE A9,A10
SAME_DIR:
; CHECK BOUNDARIES FIRST
; COMPARE FOR TOP/BOT BOUNDARIES
CALLA STUFF_VEL
CLR A1 ;COMMAND PASSED TO FRANIM
JSRP FRANIM
JRNC MOVE_TOP
MOVE A10,A9 ;RESET TO TOP OF RUNNING LIST
JRUC MOVE_TOP
;
; UPDATE PLAYER 1 X Y POSITION BASED ON JOYSTICK INPUT
;
UPDATE_PLYRXY:
;
; READ MOVEMENT JOYSTICK FOR PLAYER
;A7=TSO_PRC PROCESS PNTR
;
MOVE *A7(STICK),A2,L ;GET STICK FROM TORSO STRUCT
MOVE *A2,A2,W ;GET ACTUAL CTRL INFO
ANDI 0FH,A2
JRNZ YES_A_MV
CLRC ;CLEAR CARRY SO WE DON'T FRANI
; STICK IS NOT BEING TOUCHED
RETS
YES_A_MV:
;
; PLAYER WILL MOVE IN DIRECTION SPECIFIED IN A2
;
MOVE *A8(OXVAL),A4,L
MOVE *A8(OYVAL),A5,L
CLR A3 ;DIR CNT
BTST BMPRYTE,A2
JRZ PLYR_LFT
MOVE *A7(RGTBND),A0,L
CMP A0,A4
JRLT YS1
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRNE TSTDN
YS1
ADDI 04,A3
PLYR_LFT:
BTST BMPLEFT,A2
JRZ TSTDN
MOVE *A7(LFTBND),A0,L
CMP A0,A4
JRGT YS2
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRNE TSTDN
YS2
ADDI 7,A3
TSTDN:
BTST BMPDOWN,A2
JRZ PLYR_UP
MOVE *A7(DNBND),A0,L
CMP A0,A5
JRLT YS3
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRNE TEST_OUT
YS3
ADDI 2,A3
PLYR_UP:
BTST BMPUP,A2
JRZ TEST_OUT
MOVE *A7(UPBND),A0,L
CMP A0,A5
JRGT YS4
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRNE TEST_OUT
YS4
ADDI 1,A3
;
TEST_OUT:
; ACTUALLY UPDATE PLAYERS LEGS TO NEW POSITION
;
CMPI 9,A3
JRLS OKAYSTK
MOVK 9,A3
OKAYSTK
MOVE A3,A5 ;KEEP IN A5 FOR LATER CMP WITH P_DIR
JRNZ T1
CLRC
RETS
T1:
;
SETC ;WE WILL FRANI
; STICK HAS BEEN TOUCHED
RETS
; 1
; 8 5
;7 4
; 9 6
; 2
VELX_LIST:
.LONG 0,0,0,0,HNORMVEL,HSLOVEL,HSLOVEL,-HNORMVEL,-HSLOVEL
.LONG -HSLOVEL
VELY_LIST:
.LONG 0,-VNORMVEL,VNORMVEL,0,0,-VSLOVEL,VSLOVEL,0
.LONG -VSLOVEL,VSLOVEL
VELX_LIST2:
.LONG 0,0,0,0,HNORMVEL2,HSLOVEL2,HSLOVEL2,-HNORMVEL2,-HSLOVEL2
.LONG -HSLOVEL2
VELY_LIST2:
.LONG 0,-VNORMVEL2,VNORMVEL2,0,0,-VSLOVEL2,VSLOVEL2,0
.LONG -VSLOVEL2,VSLOVEL2
;
STUFF_VEL:
MOVE *A13(SHOECNT),A0
JRZ SV
DEC A0
MOVE A0,*A13(SHOECNT)
MOVI VELX_LIST2,A2
ADD A6,A2
MOVE *A2,A0,L
MOVI VELY_LIST2,A2
ADD A6,A2
MOVE *A2,A1,L
JRUC SV2
SV MOVI VELX_LIST,A2
ADD A6,A2
MOVE *A2,A0,L
MOVI VELY_LIST,A2
ADD A6,A2
MOVE *A2,A1,L
SV2 MOVE A1,*A8(OYVEL),L
MOVE A0,*A8(OXVEL),L
; NOW ADD SAME VALUES INTO TORSO RECORD
MOVE *A13(TSO_PTR),A3,L
MOVE A1,*A3(OYVEL),L
MOVE A0,*A3(OXVEL),L
RETS
;
; INITIALIZE PLAYER OBJECT
; GET OBJECT INFO AND DO INSERT INTO OBJECT LIST
;
STRT_PLYR_LEGS:
;A9=1 IF START THIS PLAYER TO LEFT OF SCREEN,2 IF TO RIGHT, 0 IF NEITHER
MOVI 0D00000H,A0
MOVI 07A0000H,A1
MOVE @GAMSTATE,A2
CMPI INAMODE,A2
JRZ AMODE1
CMPI 1,A9
JRNE V1
MOVI 080000H,A0
MOVI 0620000H,A1
JRUC AMODE1
V1 CMPI 2,A9
JRNE V2
MOVI 01900000H,A0
MOVI 0620000H,A1
JRUC AMODE1
V2
;FRESH START IN TVSET AREA
MOVB *A13(PNUM),A0
CMPI 1,A0
JREQ PY1
MOVI 01300000H,A0
MOVI 0250000H,A1
JRUC AMODE1
PY1 MOVI 0670000H,A0
MOVI 0250000H,A1
AMODE1:
;CHECK TO SEE IF THIS IS PLAYER 1 OR 2
CALLR GETP
MOVI 158,A3
MOVI DMAWNZ,A4
CLR A6
CLR A7
CALLA BEGINOBJ
RETS
STRT_PLYR_TORSO:
;A9=1 IF START THIS PLAYER TO LEFT OF SCREEN,2 IF TO RIGHT, 0 IF NIETHER
MOVI 0D00000H,A0
MOVI 07A0000H,A1
MOVE @GAMSTATE,A2
CMPI INAMODE,A2
JRZ AMODE2
CMPI 1,A9
JRNE V1A
MOVI 080000H,A0
MOVI 0620000H,A1
JRUC AMODE2
V1A CMPI 2,A9
JRNE V2A
MOVI 01900000H,A0
MOVI 0620000H,A1
JRUC AMODE2
V2A
MOVB *A13(PNUM),A0
CMPI 1,A0
JREQ PY1A
MOVI 0D80000H,A0
MOVI 0400000H,A1
JRUC AMODE2
PY1A MOVI 0D00000H,A0
MOVI 0380000H,A1
AMODE2:
;CHECK TO SEE IF THIS IS PLAYER 1 OR 2
CALLR GETP
; MOVI 158,A3
MOVI 159,A3
MOVI DMAWNZ+M_NOCOLL,A4
; MOVI CLSNEUT|TYPNEUT,A5
; MOVI CLSPLYR|TYPPLYR|SUBPL_1,A5
CLR A6
CLR A7
CALLA BEGINOBJ
RETS
GETP MOVB *A13(PNUM),A2
CMPI 1,A2
JREQ PYX
MOVI BLACK,A2 ;TURN ON PLAYER 2 (BLACK)
MOVI CLSPLYR|TYPPLYR|SUBPL_2,A5
JRUC PY2
PYX MOVI P1WG6T1,A2
MOVI CLSPLYR|TYPPLYR|SUBPL_1,A5
PY2 RETS
;
;NABBED FROM NARC CODE
;
;GET ANIMATION DIRECTION BASED ON THE VELOCITIES IN A8
;A8=OBJECT
;RETURNS:
;A0=DIR OF TRAVEL
;701
;6 2
;543
GETADIR:
MOVE *A8(OXVEL),A1,L
MOVE *A8(OYVEL),A2,L
;040
;0 0
;030
GETADIR2:
MOVE A1,A3
MOVE A2,A4
ABS A3 ;UNSIGNED COMPARE
ABS A4
MOVE A3,A5
ADD A4,A5
JRNE GAD1
CLR A3 ;STANDING CASE
JRUC GETADX
GAD1:
MOVK 3,A5
MOVK 3,A7
MPYU A3,A5 ;CALC 3*X
MPYU A4,A7 ;CALC 3*Y
CMP A7,A3 ;XV GT 3*YV ?
JRHS GADX
CMP A5,A4
JRHS GADY
;DIAGONAL XY VELOCITY CASE
SRL 31,A1 ;4 QUADRANTS= 0-3
SRL 31,A2
SLL 1,A2
ADD A1,A2
ADDK 5,A2
MOVE A2,A3
JRUC GETADX
;X VELOCITY CASE
GADX:
MOVK 1,A3
MOVE A1,A1
JRNN GETADX ;XV + CASE
MOVK 2,A3
JRUC GETADX
;Y VELOCITY CASE
GADY:
MOVK 3,A3
MOVE A2,A2
JRNN GETADX
MOVK 4,A3
;HAVE OFFSET IN A3
GETADX:
MOVE A3,A0
RETS
;NABBED FROM EUGENE JARVIS FOOTBALL CODE
;
;SEEK XY OF ACTIVE OBJECT
;A8=OBJECT SEEKING
;A0=OBJECT SEEKED
;
;RETURNS
;A5=X VEL
;A6=Y VEL
XYSKOBJ:
MOVE *A0(OXPOS),A5,W
MOVE *A0(OYPOS),A6,W
;
;SEEK X-Y COORDINATE
;A8=OBJECT SEEKING
;A5=X COORD TO SEEK
;A6=Y COORD TO SEEK
;RETURNS
;A5=X VEL
;A6=Y VEL
;
;NABBED FROM EUGENE JARVIS FOOTBALL CODE
;
XYSEEK:
MMTM SP,A0,A1,A2,A3,A4,A7
MOVE *A8(OXPOS),A3,W
MOVE *A8(OYPOS),A4,W
SUB A3,A5 ;FIND DIFFERENCE
SUB A4,A6
MOVE A6,A3 ;
MOVE A5,A1
ABS A5
ABS A6
ADD A5,A6 ;CALC SUM ABS(DX+DY)
SLL 16,A1 ;SHIFT TO ACCOMODATE FRACTIONAL VELOCITY
SLL 16,A3
DIVS A6,A1 ;GENERATE SPEED RATIOS
DIVS A6,A3
MOVE A1,A2
ABS A2
SLL 16,A2
SRL 28,A2 ;CORRECT FOR SQUARE ROOT
SLL 4,A2
ADDI XYSQTAB,A2
MOVE *A2,A2,W
; MOVI 7,A2
MOVI 1,A5 ;MULTIPLY BY VELOCITY FACTOR
; MOVI 2,A5 ;MULTIPLY BY VELOCITY FACTOR
MPYU A2,A5
MPYS A5,A3
MPYS A1,A5 ;FINAL X VEL
SRA 4,A3
SRA 4,A5
MOVE A3,A6 ;FINAL Y VEL
MMFM SP,A0,A1,A2,A3,A4,A7
RETS
;CORRECT FOR ANGULAR VELOCITIES
XYSQTAB:
.WORD >20-28,>21-28,>22-28,>23-28,>24-28,>25-28,>26-28,>27-28
.WORD >27-28,>26-28,>25-28,>24-28,>23-28,>22-28,>21-28,>20-28
;
;SEEK X-Y COORDINATE
;A8=OBJECT SEEKING
;A5=X COORD TO SEEK
;A6=Y COORD TO SEEK
;RETURNS
;A5=X VEL
;A6=Y VEL
;
;NABBED FROM EUGENE JARVIS FOOTBALL CODE
;
XYSEEK2:
MOVE *A8(OXPOS),A3,W
MOVE *A8(OYPOS),A4,W
SUB A3,A5 ;FIND DIFFERENCE
SUB A4,A6
MOVE A6,A3 ;
MOVE A5,A1
ABS A5
ABS A6
ADD A5,A6 ;CALC SUM ABS(DX+DY)
SLL 16,A1 ;SHIFT TO ACCOMODATE FRACTIONAL VELOCITY
SLL 16,A3
DIVS A6,A1 ;GENERATE SPEED RATIOS
DIVS A6,A3
MOVI 7AH,A5 ;MULTIPLY BY VELOCITY FACTOR
; MOVI 6AH,A5 ;MULTIPLY BY VELOCITY FACTOR
MPYS A5,A3
MPYS A1,A5 ;FINAL X VEL
SRA 4,A3
SRA 4,A5
MOVE A3,A6 ;FINAL Y VEL
RETS
******************************************************************************
;
; INITIALIZING TABLES FOR ARENA, PLAYERS, ETC.
;
******************************************************************************
;
WALK_LIST:
.LONG PWK_UP,PWK_UP,PWK_DN,PWK_UP,PWK_RGT,PWK_UPRGT,PWK_DNRGT,PWK_LFT
.LONG PWK_UPLFT,PWK_DNLFT
REV_WALK_LIST:
.LONG PWK_UP,PWK_DN,PWK_UP,PWK_UP,PWK_LFT,PWK_DNLFT,PWK_UPLFT,PWK_RGT
.LONG PWK_DNRGT,PWK_UPRGT
; 1
; 8 5
;7 4
; 9 6
; 2
LISTWHAT:
.LONG WHATLST1,WHATLST2,WHATLST3,WHATLST4,WHATLST5
WHATLST1: ;NORMAL
.LONG SHOOT_LIST2,SHOOT_LIST2,SHOOT_LIST2,SHOOT_LIST,SHOOT_LIST
.LONG SHOOT_LIST,SHOOT_LIST,SHOOT_LIST,SHOOT_LIST,SHOOT_LIST
WHATLST2: ;SPRAY
.LONG SHOOT_LIST2,SHOOT2_LIST2,SHOOT2_LIST2,SHOOT2_LIST,SHOOT2_LIST3
.LONG SHOOT2_LIST,SHOOT2_LIST,SHOOT2_LIST,SHOOT2_LIST,SHOOT2_LIST
WHATLST3: ;POD
.LONG SHOOT_LIST2,SHOOT3_LIST2,SHOOT3_LIST2,SHOOT3_LIST,SHOOT3_LIST3
.LONG SHOOT3_LIST,SHOOT3_LIST,SHOOT3_LIST,SHOOT3_LIST,SHOOT3_LIST
WHATLST4: ;GRENADES
.LONG SHOOT_LIST2,SHOOT4_LIST2,SHOOT4_LIST2,SHOOT4_LIST,SHOOT4_LIST
.LONG SHOOT4_LIST,SHOOT4_LIST,SHOOT4_LIST,SHOOT4_LIST,SHOOT4_LIST
WHATLST5: ;NON STOPPING BULLET
.LONG SHOOT_LIST2,SHOOT5_LIST2,SHOOT5_LIST2,SHOOT5_LIST,SHOOT5_LIST3
.LONG SHOOT5_LIST,SHOOT5_LIST,SHOOT5_LIST,SHOOT5_LIST,SHOOT5_LIST
SHOOT_LIST: ;NORMAL
.LONG SHT_UP,SHT_UP,SHT_DN,SHT_UP,SHT_RGT,SHT_UPRGT,SHT_DNRGT,SHT_LFT
.LONG SHT_UPLFT,SHT_DNLFT
SHOOT_LIST2: ;NORMAL BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT_UP,SHT_DN,SHT_UP,SHT_RGT2,SHT_UPRGT,SHT_DNRGT2,SHT_LFT2
.LONG SHT_UPLFT,SHT_DNLFT
SHOOT2_LIST: ;SPRAY
.LONG SHT_UP,SHT2_UP,SHT2_DN,SHT_UP,SHT2_RGT,SHT2_UPRGT,SHT2_DNRGT,SHT2_LFT
.LONG SHT2_UPLFT,SHT2_DNLFT
SHOOT2_LIST2: ;SPRAY BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT2_UP,SHT2_DN,SHT_UP,SHT2_RGT2,SHT2_UPRGT,SHT2_DNRGT,SHT2_LFT2
.LONG SHT2_UPLFT,SHT2_DNLFT
SHOOT2_LIST3: ;SPRAY BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT2_UP,SHT2_DN2,SHT_UP,SHT2_RGT,SHT2_UPRGT,SHT2_DNRGT,SHT2_LFT
.LONG SHT2_UPLFT,SHT2_DNLFT
SHOOT3_LIST: ;POD
.LONG SHT_UP,SHT3_UP,SHT3_DN,SHT_UP,SHT3_RGT,SHT3_UPRGT,SHT3_DNRGT,SHT3_LFT
.LONG SHT3_UPLFT,SHT3_DNLFT
SHOOT3_LIST2: ;POD BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT3_UP,SHT3_DN,SHT_UP,SHT3_RGT2,SHT3_UPRGT,SHT3_DNRGT,SHT3_LFT2
.LONG SHT3_UPLFT,SHT3_DNLFT
SHOOT3_LIST3: ;POD BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT3_UP,SHT3_DN2,SHT_UP,SHT3_RGT,SHT3_UPRGT,SHT3_DNRGT,SHT3_LFT
.LONG SHT3_UPLFT,SHT3_DNLFT
SHOOT4_LIST: ;GRENADE
.LONG SHT_UP,SHT4_UP,SHT4_DN,SHT_UP,SHT4_RGT,SHT4_UPRGT,SHT4_DNRGT,SHT4_LFT
.LONG SHT4_UPLFT,SHT4_DNLFT
SHOOT4_LIST2: ;GRENADE BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT4_UP,SHT4_DN,SHT_UP,SHT4_RGT2,SHT4_UPRGT,SHT4_DNRGT,SHT4_LFT2
.LONG SHT4_UPLFT,SHT4_DNLFT
SHOOT5_LIST: ;NON STOPPING BULLET
.LONG SHT_UP,SHT5_UP,SHT5_DN,SHT_UP,SHT5_RGT,SHT5_UPRGT,SHT5_DNRGT,SHT5_LFT
.LONG SHT5_UPLFT,SHT5_DNLFT
SHOOT5_LIST2: ;NON STOPPING BULLET BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT5_UP,SHT5_DN,SHT_UP,SHT5_RGT2,SHT5_UPRGT,SHT5_DNRGT,SHT5_LFT
.LONG SHT5_UPLFT,SHT5_DNLFT
SHOOT5_LIST3: ;NON STOPPING BULLET BUT ADJUSTING FOR ODD ANI PNTS
.LONG SHT_UP,SHT5_UP,SHT5_DN2,SHT_UP,SHT5_RGT,SHT5_UPRGT,SHT5_DNRGT,SHT5_LFT
.LONG SHT5_UPLFT,SHT5_DNLFT
SHOOT_LEG_LIST:
.LONG L_SHT_UP,L_SHT_UP,L_SHT_DN,L_SHT_UP,L_SHT_RGT,L_SHT_UPRGT,L_SHT_DNRGT,L_SHT_LFT
.LONG L_SHT_UPLFT,L_SHT_DNLFT
; 1
; 8 5
;7 4
; 9 6
; 2
;WALK DIR IS ACROSS
;FIRE DIR IS DOWN
; 9876543210
REVERSE .WORD 0000000000B
.WORD 1001000100B
.WORD 0100100010B
.WORD 0000000000B
.WORD 1110000000B
.WORD 1010000100B
.WORD 0110000010B
.WORD 0001110000B
.WORD 0001010100B
.WORD 0000110010B
STAND_TBL_L:
.LONG P1S12L1,P1S12L1,P1SH6L1,P1S12L1,P1SH9L1,P1S10L1,P1SH8L1,P1SH9L1
.LONG P1S10L1,P1SH8L1
SHT_UP:
.LONG P1S12T1
.WORD FLIPBITS|4,0
.LONG P1S12T2
.WORD 4
.LONG 0
SHT_UPRGT:
.LONG P1S10T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1S10T2
.WORD 4
.LONG 0
SHT_UPLFT:
.LONG P1S10T1
.WORD FLIPBITS|4,0
.LONG P1S10T2
.WORD 4
.LONG 0
SHT_RGT:
.LONG P1SH9T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SH9T2
.WORD 4
.LONG 0
SHT_RGT2:
.LONG P1SH9T1A
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SH9T2A
.WORD 4
.LONG 0
SHT_LFT:
.LONG P1SH9T1
.WORD FLIPBITS|4,0
.LONG P1SH9T2
.WORD 4
.LONG 0
SHT_LFT2:
.LONG P1SH9T1A
.WORD FLIPBITS|4,0
.LONG P1SH9T2A
.WORD 4
.LONG 0
SHT_DN:
.LONG P1SH6T1
.WORD FLIPBITS|4,0
.LONG P1SH6T2
.WORD 4
.LONG 0
SHT_DNLFT:
.LONG P1SH8T1
.WORD FLIPBITS|4,0
.LONG P1SH8T2
.WORD 4
.LONG 0
SHT_DNRGT:
.LONG P1SH8T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SH8T2
.WORD 4
.LONG 0
SHT_DNRGT2:
.LONG P1SH8T1A
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SH8T2A
.WORD 4
.LONG 0
;SPRAY SHOOTING!
SHT2_UP:
.LONG P1SG12T2
.WORD FLIPBITS|4,0
.LONG P1SG12T3
.WORD 4
.LONG 0
SHT2_UPRGT:
.LONG P1SG10T2
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SG10T3
.WORD 4
.LONG 0
SHT2_UPLFT:
.LONG P1SG10T2
.WORD FLIPBITS|4,0
.LONG P1SG10T3
.WORD 4
.LONG 0
SHT2_RGT:
.LONG P1SG9T2
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SG9T3
.WORD 4
.LONG 0
SHT2_RGT2:
;'A' TYPE
.LONG P1SG9T2A
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SG9T3A
.WORD 4
.LONG 0
SHT2_LFT:
.LONG P1SG9T2
.WORD FLIPBITS|4,0
.LONG P1SG9T3
.WORD 4
.LONG 0
SHT2_LFT2:
;'A' TYPE
.LONG P1SG9T2A
.WORD FLIPBITS|4,0
.LONG P1SG9T3A
.WORD 4
.LONG 0
SHT2_DN:
.LONG P1SG6T2
.WORD FLIPBITS|4,0
.LONG P1SG6T3
.WORD 4
.LONG 0
SHT2_DN2:
.LONG P1SG6T2A
.WORD FLIPBITS|4,0
.LONG P1SG6T3A
.WORD 4
.LONG 0
SHT2_DNLFT:
.LONG P1SG8T2
.WORD FLIPBITS|4,0
.LONG P1SG8T3
.WORD 4
.LONG 0
SHT2_DNRGT:
.LONG P1SG8T2
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1SG8T3
.WORD 4
.LONG 0
;POD SHOOTING!
SHT3_UP:
.LONG P1B12T1
.WORD FLIPBITS|3,0
.LONG 0
SHT3_UPRGT:
.LONG P1B10T1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG 0
SHT3_UPLFT:
.LONG P1B10T1
.WORD FLIPBITS|3,0
.LONG 0
SHT3_RGT:
.LONG P1B9T1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG 0
SHT3_RGT2:
;'A' TYPE
.LONG P1B9T1A
.WORD FLIPBITS|3,(M_FLIPH)
.LONG 0
SHT3_LFT:
.LONG P1B9T1
.WORD FLIPBITS|3,0
.LONG 0
SHT3_LFT2:
;'A' TYPE
.LONG P1B9T1A
.WORD FLIPBITS|3,0
.LONG 0
SHT3_DN:
.LONG P1B6T1
.WORD FLIPBITS|3,0
.LONG 0
SHT3_DN2:
.LONG P1B6T1A
.WORD FLIPBITS|3,0
.LONG 0
SHT3_DNLFT:
.LONG P1B8T1
.WORD FLIPBITS|3,0
.LONG 0
SHT3_DNRGT:
.LONG P1B8T1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG 0
;GRENADE SHOOTING
SHT4_UP:
.LONG P1GG12T1
.WORD FLIPBITS|4,0
.LONG P1GG12T2
.WORD 4
.LONG 0
SHT4_UPRGT:
.LONG P1GG10T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1GG10T2
.WORD 4
.LONG 0
SHT4_UPLFT:
.LONG P1GG10T1
.WORD FLIPBITS|4,0
.LONG P1GG10T2
.WORD 4
.LONG 0
SHT4_RGT:
.LONG P1GG9T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1GG9T2
.WORD 4
.LONG 0
SHT4_RGT2:
;'A' VIEW
.LONG P1GG9T1A
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1GG9T2A
.WORD 4
.LONG 0
SHT4_LFT:
.LONG P1GG9T1
.WORD FLIPBITS|4,0
.LONG P1GG9T2
.WORD 4
.LONG 0
SHT4_LFT2:
;'A' VIEW
.LONG P1GG9T1A
.WORD FLIPBITS|4,0
.LONG P1GG9T2A
.WORD 4
.LONG 0
SHT4_DN:
.LONG P1GG6T1
.WORD FLIPBITS|4,0
.LONG P1GG6T2
.WORD 4
.LONG 0
SHT4_DNLFT:
.LONG P1GG8T1
.WORD FLIPBITS|4,0
.LONG P1GG8T2
.WORD 4
.LONG 0
SHT4_DNRGT:
.LONG P1GG8T1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG P1GG8T2
.WORD 4
.LONG 0
;NON STOPPING BULLET SHOOTING
SHT5_UP:
.LONG P1GL12T1
.WORD FLIPBITS|9,0
.LONG 0
SHT5_UPRGT:
.LONG P1GL10T1
.WORD FLIPBITS|9,(M_FLIPH)
.LONG 0
SHT5_UPLFT:
.LONG P1GL10T1
.WORD FLIPBITS|9,0
.LONG 0
SHT5_RGT:
.LONG P1GL9T1
.WORD FLIPBITS|9,(M_FLIPH)
.LONG 0
SHT5_RGT2:
;'A' VIEW
.LONG P1GL9T1A
.WORD FLIPBITS|9,(M_FLIPH)
.LONG 0
SHT5_LFT:
.LONG P1GL9T1
.WORD FLIPBITS|9,0
.LONG 0
;SHT5_LFT2:
;;'A' VIEW
; .LONG P1GL9T1A
; .WORD FLIPBITS|9,0
; .LONG 0
SHT5_DN:
.LONG P1GL6T1
.WORD FLIPBITS|9,0
.LONG 0
SHT5_DN2:
.LONG P1GL6T1A
.WORD FLIPBITS|9,0
.LONG 0
SHT5_DNLFT:
.LONG P1GL8T1
.WORD FLIPBITS|9,0
.LONG 0
SHT5_DNRGT:
.LONG P1GL8T1
.WORD FLIPBITS|9,(M_FLIPH)
.LONG 0
L_SHT_UP:
.LONG P1S12L1
.WORD FLIPBITS|1,0
.LONG 0
L_SHT_UPRGT:
.LONG P1S10L1
.WORD FLIPBITS|1,(M_FLIPH)
.LONG 0
L_SHT_UPLFT:
.LONG P1S10L1
.WORD FLIPBITS|1,0
.LONG 0
L_SHT_RGT:
.LONG P1SH9L1
.WORD FLIPBITS|1,(M_FLIPH)
.LONG 0
L_SHT_LFT:
.LONG P1SH9L1
.WORD FLIPBITS|1,0
.LONG 0
L_SHT_DN:
.LONG P1SH6L1
.WORD FLIPBITS|1,0
.LONG 0
L_SHT_DNLFT:
.LONG P1SH8L1
.WORD FLIPBITS|1,0
.LONG 0
L_SHT_DNRGT:
.LONG P1SH8L1
.WORD FLIPBITS|1,(M_FLIPH)
.LONG 0
PWK_UP:
.LONG P1R12L1
.WORD FLIPBITS|3,0
.LONG P1R12L2
.WORD 3
.LONG P1R12L3
.WORD 3
.LONG P1R12L4
.WORD 3
.LONG P1R12L5
.WORD 3
.LONG P1R12L6
.WORD 3
.LONG P1R12L7
.WORD 3
.LONG P1R12L8
.WORD 3
.LONG P1R12L9
.WORD 3
.LONG P1R12L9A
.WORD 3
.LONG 0
PWK_DN:
.LONG P1RN6L1
.WORD FLIPBITS|3,0
.LONG P1RN6L2
.WORD 3
.LONG P1RN6L3
.WORD 3
.LONG P1RN6L4
.WORD 3
.LONG P1RN6L5
.WORD 3
.LONG P1RN6L6
.WORD 3
.LONG P1RN6L7
.WORD 3
.LONG P1RN6L8
.WORD 3
.LONG P1RN6L9
.WORD 3
.LONG P1R6L9A
.WORD 3
.LONG 0
PWK_RGT:
.LONG P1R9L1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG P1R9L2
.WORD 3
.LONG P1R9L3
.WORD 3
.LONG P1R9L4
.WORD 3
.LONG P1R9L5
.WORD 3
.LONG P1R9L6
.WORD 3
.LONG P1R9L7
.WORD 3
.LONG P1R9L8
.WORD 3
.LONG P1R9L9
.WORD 3
.LONG P1R9L9A
.WORD 3
.LONG 0
PWK_UPRGT:
.LONG P1R10L1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG P1R10L2
.WORD 3
.LONG P1R10L3
.WORD 3
.LONG P1R10L4
.WORD 3
.LONG P1R10L5
.WORD 3
.LONG P1R10L6
.WORD 3
.LONG P1R10L7
.WORD 3
.LONG P1R10L8
.WORD 3
.LONG P1R10L9
.WORD 3
.LONG P1R10L9A
.WORD 3
.LONG 0
PWK_DNLFT:
.LONG P1RN8L1
.WORD FLIPBITS|3,0
.LONG P1RN8L2
.WORD 3
.LONG P1RN8L3
.WORD 3
.LONG P1RN8L4
.WORD 3
.LONG P1RN8L5
.WORD 3
.LONG P1RN8L6
.WORD 3
.LONG P1RN8L7
.WORD 3
.LONG P1RN8L8
.WORD 3
.LONG P1RN8L9
.WORD 3
.LONG P1R8L9A
.WORD 3
.LONG 0
PWK_LFT:
.LONG P1R9L1
.WORD FLIPBITS|3,0
.LONG P1R9L2
.WORD 3
.LONG P1R9L3
.WORD 3
.LONG P1R9L4
.WORD 3
.LONG P1R9L5
.WORD 3
.LONG P1R9L6
.WORD 3
.LONG P1R9L7
.WORD 3
.LONG P1R9L8
.WORD 3
.LONG P1R9L9
.WORD 3
.LONG P1R9L9A
.WORD 3
.LONG 0
PWK_UPLFT:
.LONG P1R10L1
.WORD FLIPBITS|3,0
.LONG P1R10L2
.WORD 3
.LONG P1R10L3
.WORD 3
.LONG P1R10L4
.WORD 3
.LONG P1R10L5
.WORD 3
.LONG P1R10L6
.WORD 3
.LONG P1R10L7
.WORD 3
.LONG P1R10L8
.WORD 3
.LONG P1R10L9
.WORD 3
.LONG P1R10L9A
.WORD 3
.LONG 0
PWK_DNRGT:
.LONG P1RN8L1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG P1RN8L2
.WORD 3
.LONG P1RN8L3
.WORD 3
.LONG P1RN8L4
.WORD 3
.LONG P1RN8L5
.WORD 3
.LONG P1RN8L6
.WORD 3
.LONG P1RN8L7
.WORD 3
.LONG P1RN8L8
.WORD 3
.LONG P1RN8L9
.WORD 3
.LONG P1R8L9A
.WORD 3
.LONG 0
TSPN:
.LONG P1WG8T1
.WORD FLIPBITS|3,0
.LONG P1WG9T1
.WORD 3
.LONG P1WG10T1
.WORD 3
.LONG P1WG12T1
.WORD 3
.LONG P1WG10T1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG P1WG9T1
.WORD 3
.LONG P1WG8T1
.WORD 3
.LONG P1WG6T1
.WORD FLIPBITS|3,0
.LONG 0
TSHK:
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK3
.WORD 2
.LONG SHOCK1
.WORD 2
.LONG SHOCK2
.WORD 2
.LONG 0
DIELST:
.LONG PDTH1
.WORD FLIPBITS|4,0
.LONG PDTH2
.WORD 4
.LONG PDTH3
.WORD 4
.LONG PDTH4
.WORD 4
.LONG PDTH5
.WORD 4
.LONG PDTH6
.WORD 4
.LONG PDTH7
.WORD 4
.LONG PDTH8
.WORD 4
.LONG PDTH9
.WORD 6
.LONG PDTH10
.WORD 4
.LONG PDTH11
.WORD 4
.LONG PDTH12
.WORD 4
.LONG PDTH13
.WORD 4
.LONG PDTH14
.WORD 10
.LONG PDTH15
.WORD 4
.LONG PDTH16
.WORD 4
.LONG PDTH17
.WORD 4
.LONG PDTH18
.WORD 4
.LONG PDTH19
.WORD 4
.LONG PDTH20
.WORD 4
.LONG PDTH21
.WORD 4
.LONG PDTH22
.WORD 4
.LONG PDTH23
.WORD 4
.LONG PDTH24
.WORD 4
.LONG 0
LSPN:
.LONG P1SH8L1
.WORD FLIPBITS|3,0
.LONG P1SH9L1
.WORD 3
.LONG P1S10L1
.WORD 3
.LONG P1S12L1
.WORD 3
.LONG P1S10L1
.WORD FLIPBITS|3,(M_FLIPH)
.LONG P1SH9L1
.WORD 3
.LONG P1SH8L1
.WORD 3
.LONG P1SH6L1
.WORD FLIPBITS|3,0
.LONG 0
;
WPNWALK:
.LONG T_WALK_LIST,T_WALK_LIST2,T_WALK_LIST3
.LONG T_WALK_LIST4,T_WALK_LIST5
T_WALK_LIST: ;REGULAR GUN
.LONG P1WG12T1,P1WG12T1,P1WG6T1,P1WG12T1,P1WG9T1,P1WG10T1,P1WG8T1,P1WG9T1
.LONG P1WG10T1,P1WG8T1
T_WALK_LIST2: ;SPRAY GUN
.LONG P1WG12T1,P1SG12T1,P1SG6T1,P1WG12T1,P1SG9T1,P1SG10T1,P1SG8T1,P1SG9T1
.LONG P1SG10T1,P1SG8T1
T_WALK_LIST3: ;BACKPACK BOMBS
.LONG P1WG12T1,P1B12T1,P1B6T1,P1WG12T1,P1B9T1,P1B10T1,P1B8T1,P1B9T1
.LONG P1B10T1,P1B8T1
T_WALK_LIST4: ;GRENADE
.LONG P1WG12T1,P1GG12T1,P1GG6T1,P1WG12T1,P1GG9T1,P1GG10T1,P1GG8T1,P1GG9T1
.LONG P1GG10T1,P1GG8T1
T_WALK_LIST5: ;NON STOPPING BULLET
.LONG P1WG12T1,P1GL12T1,P1GL6T1,P1WG12T1,P1GL9T1,P1GL10T1,P1GL8T1,P1GL9T1
.LONG P1GL10T1,P1GL8T1
T_WALK_FLG:
.LONG DMAWNZ+M_NOCOLL,DMAWNZ+M_NOCOLL,DMAWNZ+M_NOCOLL,DMAWNZ+M_NOCOLL,DMAWNZ+M_NOCOLL+M_FLIPH
.LONG DMAWNZ+M_NOCOLL+M_FLIPH
.LONG DMAWNZ+M_NOCOLL+M_FLIPH,DMAWNZ+M_NOCOLL
.LONG DMAWNZ+M_NOCOLL,DMAWNZ+M_NOCOLL
L_WALK_FLG:
.LONG DMAWNZ+M_NOCOLL,DMAWNZ+0,DMAWNZ+0,DMAWNZ+M_NOCOLL,DMAWNZ+0+M_FLIPH
.LONG DMAWNZ+0+M_FLIPH
.LONG DMAWNZ+0+M_FLIPH,DMAWNZ+0
.LONG DMAWNZ+0,DMAWNZ+0
;
; TEMP ROUTINES
;
**************************************************************************
.IF DEBUG
;
StCpuLft:
move @TIMER,A0,W
jrz NoBog
clr A0
jruc GotTime
NoBog:
move @vcount,A0
subi HSINT,A0
jrnn SkIncCnt
addi 256,A0
SkIncCnt:
sll 2,A0
neg A0
addi 1024,A0
GotTime:
move A0,@CPULEFT,W
srl 4,A0
move @CPUAVG,A1,W
move A1,A2
srl 4,A2
sub A2,A1
add A0,A1
move A1,@CPUAVG,W
rets
.ENDIF
**************************************************************************
* *
* ERRORLOG - THIS SHOULD BE CALLED IN PLACE OF ANY JRxx $ *
* IN CASE OF ERROR. IF WE ARE IN DEBUG MODE *
* IT WILL HANG, IF NOT, THE ERROR WILL BE LOGGED *
* AND IT WILL RETURN. *
* A1 = RETURN ADDRESS OF CALLING ROUTINE *
* A2 = ERROR CODE *
**************************************************************************
ERRORLOG
MMTM SP,A2,A3,A4,A5,A6,A7
SLL 16,A2
ERRLOGG ;A8 IS IN A8
MOVE A13,A7 ;PROC. BLOCK IN A7
MOVE *A7(PROCID),A6,W
SLL 16,A6
MOVE *A8(OID),A3,W
MOVX A3,A6 ;A6 = [PROCID:*A8(OID)]
MOVE @CIRCUIT,A5,W
SLL 16,A5
MOVE @WAVE,A3,W
MOVX A3,A5 ;A5 = [CIRCUIT#:WAVE#,)]
MOVI AUD1STRT,A4 ;PLAY #
CALLR GETAUD4
SLL 16,A4
MOVE *A0(OID),A3,W ;A4 = [STRT#:*A0(OID)]
MOVX A3,A4
; MOVE @GAMSTATE,A3,W ;A2 = [STATUS:GAMSTATE]
; MOVX A3,A2
MOVE @STATUS,A3,W ;A2 = [ERROR CODE:STATUS]
MOVX A3,A2
MOVE *SP(0C0H),A3,L ;A3=GET THE RETURN ADDRESS
; MOVE *SP(0E0H),A1,L ;A1=CALLING ADDRESS
CALLA ADD_DUMP
; MOVE @SURVCNT,A2,W
; INC A2 ;INCREMENT THE SURVIVAL COUNT
; MOVE A2,@SURVCNT,W
MMFM SP,A2,A3,A4,A5,A6,A7
RETS
**************************************************************************
* *
* GETAUD4 - GET AN AUDIT *
* A4 = AUDIT # *
* RETURNS: *
* A4 = AUDIT *
* *
**************************************************************************
GETAUD4
MMTM SP,A0,A1
MOVE A4,A0
CALLA GET_AUD
CALLA DEF_PAGE ;POINT AT DEFAULT PAGE.
MOVE A1,A4
MMFM SP,A0,A1
RETS
.END