.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