smashtv/ROBO.ASM

3540 lines
66 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 '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