trog/TROG.ASM

3518 lines
93 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.

.MLIB "TROGMACS.LIB"
.FILE 'TROG.ASM'
.TITLE " <<< T R O G -- V1.0 GEORGE N. PETRO 6/5/89 >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* T R O G *
* ------- *
* *
* STARTED: 6/5/89 (INTERNATIONAL DUX DAY) *
* RELEASED: *
* 1.00 6/20/90 FINAL VERSION OF ORIGINAL TROG *
* 2.00 6/27/90 FIXED NASTY DINO SPACE BUG *
* 3.00 7/9/90 A FEW CORRECTIONS *
* *
*------------------------------------------------------------------------*
* *
* P A C - T R O G *
* ------- ------- *
* *
* STARTED: 7/10/90 *
* RELEASED: *
* PA6 9/27/90 PROTO PAC-TROG 10 DOMESTIC 10 ABROAD. *
* LA1 1/14/91 MANY CHANGES BEFORE PRODUCTION *
* LA2 2/6/91 FIRST TO BE MASS PRODUCED *
* LA3 2/14/91 HAPPY VALENTINES DAY! *
* *
*------------------------------------------------------------------------*
* *
* DESIGN: GEORGE N. PETRO & JACK E. HAEGER *
* *
* ARTWORK, *
* ANIMATIONS, *
* CLAY SCULPTING: JACK E. HAEGER *
* *
* GAME PROGRAM: GEORGE N. PETRO *
* J. KURT MAHAN *
* *
* HARDWARE: MARK LOFFREDO *
* GLENN SHIPP *
* CARY MEDNICK *
* *
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "TROGSEQU.ASM"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "STRING.H"
.INCLUDE "TROGAUDN.ASM"
.INCLUDE "TROGDIP.ASM"
.DEF POWERUP, MAIN_INIT
.DEF SETUP, GPLAYD, GPLAYNUM, WIPEOUT, PLAYER_DELETE, PLAYER
.DEF GAME_OVER, WAVE_END, PNAME_TAB, SWITCH_ESCAPE
.DEF PNAME15_TAB, CHAMPM_SND, SUFFIX_S, SUFFIX_NULL
.DEF INC_PLAYER_TIMERS, CLR_PDINOCNT, ATSTRT, CLR_PEXTRAS
.DEF POWERRET, WARMSET, PCMOSRET, CLSCRACH, EXEC_LP
.DEF CLRALLPD, EXECLED, IRQLED, SINTRAM, HSINTRAM, WDOGRAM
.DEF DIPINIT, WAVE_PLAYERS, WDOGDIS, WDISTAB, WAIT_WAVE_END
.DEF INC_PCONSECUTIVE, STUFF_PLASTWIN, PLAYER_RESTART
.DEF WAVE_START, GAME_INTRO, GRAMINIT, GAME_DIFFICULTY
.DEF SLEEP_SWITCHX, INITDATA, IDATAEND, IDATALEN, PLAYER_CLR
.DEF ALLOW_CONTINUE
.REF STORY_MODE, INIT_HSHOLD, EMPTY_HSHOLD, ADD_HSHOLD
.REF TOMOVE, CONSMOVE, GETMOVE, PJOY
.REF PDRAW, COLL_START, ATTRACT_MODE, COLOR_START
.REF DINO_START, EGG_START, ATT_MODE_GAME_OVER
.REF UPDSL, OUTSCR, WIPE_FROM_MID
.REF CWINDOW, SCOREHILITE, CLR_DRONE
.REF CLRBGND, BGND_UD1, BGND_UD2, BAKMODS, BAK2MODS
.REF MASTERDP, DISPATCH_TABLE, FGND_OUT
.REF WAVE_DIFF_TAB, GAME_DIFF_TAB, WAVE_TABLE
.REF WAVE_MUSIC, WAVE_WATER
.REF COLRTEMP, SKYCOLOR, SKYUP, SKYDOWN
.REF WDIFF_RAM_ST, WDIFF_RAM_END
.REF GDIFF_RAM_ST, GDIFF_RAM_END
.REF SCORPROC, HOUSE_SEL
.REF LCOIN, RCOIN, CCOIN, SCOIN, SLAM, COININT, TARBAITER
.REF XCOIN, CKHSTD
.REF POWERTST, DIAG, WAVEEGGS, MAXBOZO, SECURITY, SEC_FLAG
.REF CMOS_VAL, FAC_SET, GET_AUD, STORE_AUDIT, ISLAND_NUM
.REF P_START, P_CONT, CR_STRTP, CR_CONTP, G_CRED, GET_CSTR
.REF INIT_TAB, HIGHSCORECHECK, WAVETIME, SCIDONE, FOREGROUND
.REF POWERCMOS, BORDER_MARQUEE, TUNNEL, BCDADD, TUNNEL_SCORE
.REF BGND_TYPE, FADEIN, PCYCLE_RAM, LOOKSTICK
.REF LOOKFIRE, BEEP_1, TRSTP0, TRSTCLP0, START_SCORE
.REF WIN_SND, SPLAYER_NUM, SPLAYER_COL, WAVE_PSTUFF
.REF ALIGNTAB, BAITER_TIME, START_WAVE, TUTOR
.REF STAT_WORKS, FAST_TIME, EGG_LIST, LAY_EGGS, OUTEGGS
.REF GAME_ENDER, REXINIT, BLOOPINIT, ELVISINIT, SPIKEINIT
.REF BONE_LIST, LAY_BONES, NUM_TROGS, VIRTUAL_TROGS, BONUS_WAVE
.REF COCKTAIL, TROGSPEED, MAX_TROGSPEED, ALLOT_EGGS, LAY_MAN
.REF EGG_SCHEME
**** .REF TSHIRT_START, GAME_TSHIRT
.REF CKDIAG
.REF READ_DIP
.REF TIMEINIT
.REF COINFLAG ; TRUE IF ON COIN PAGE
.IF PRINTER
.REF PRINTP,TROGALIVE
.REF DOGGYPRINT
.REF PGAMESTART, PGAMEEND, PGAMEBUYIN, PGAMECONT, PIDIED
.REF LASTSTACK,LASTA0
.REF PGAMELEVEL
.ENDIF
.REF CLEAR_HSCOLORS, DRONE_DELETE
.REF WAVE_SHOW, WAVE_INSTRUCT, WAVE_BGND1, WAVE_BGND2
.REF ON_HSTD ; TRUE IF ON HSTD PAGE
.REF ON_CRED ; TRUE IF ON CREDIT PAGE
.REF SET_AVGWAVE
.REF GAMEUNITS ; CREDITS PER GAME
.BSS EXECLED,16
.BSS IRQLED,16
.BSS SINTRAM,16 ;TEMP FOR LAST SCORE AREA INTERRUPT LINE
.BSS HSINTRAM,16 ;LAST HALF SCREEN INTERRUPT LINE
.BSS WDOGRAM,32 ;INITIALIZED LONG FOR WATCH DOG DETECT
.BSS DIPSW,16 ;RAM FAKE FOR NON-EXISTANT DIP SWITCHES
.BSS SWITCH_ESCAPE,16 ;SWITCH ESCAPE FLAG USED BY SLEEP_SWITCHX
DIPFAKE .SET 0C000H ;THIS IS HOW YOU SET THE DIP SWITCHES
NUMBARS1 .SET 12 ;MAKE NUMBER OF ACTIVE BARS ALLOWED/PLAYER
.TEXT
.STRING "CCOOPPYYRRIIGGHHTT ((CC)) 11999900 MMIIDDWWAAYY "
.STRING "MMAANNUUFFAACCTTUURRIINNGG CCOOMMPPAANNYY,, "
.STRING "MMAANNUUFFAACCTTUURREERRSS OOFF BBAALLLLYY//MMIIDDWWAAYY "
.STRING "AAMMUUSSEEMMEENNTT GGAAMMEESS.. AALLLL RRIIGGHHTTSS "
.STRING "RREESSEERRVVEEDD.."
.STRING "DDEESSIIGGNNEEDD BBYY GGEEOORRGGEE NN.. PPEETTRROO "
.STRING "AANNDD JJAACCKK EE.. HHAAEEGGEERR.. "
.STRING "YYAAHH MMOONN,, DDIISS BBEE FFIIEERRCCEE!!"
.EVEN
.WORD 0,0,0,0
*CHECK OUT AUDIT PAGE
POWERUP
DINT
SETF 16,1,0 ;WORD SIGN EXTEND
SETF 32,1,1 ;LONG WORD
.IF PRINTER
MOVE SP,@LASTSTACK,L ; PRESERVE VALUE OF THIS SUCKER
MOVE A0,@LASTA0,L ; A0 GONNA GET WASTED, TOO
.ENDIF
MOVI STCKST,SP,L
MOVI SYSCINIT,A0
MOVE A0,@SYSCTRL,W
MOVE A0,@SYSCOPY,W ;KEEP A COPY IN RAM
*MANUAL SOUND BOARD RESET
MOVI 0FE00H,A0 ;HIT RESET BIT
MOVE A0,@SOUND
MOVI 100,A0 ;WAIT FOR IT TO CATCH
DSJS A0,$
MOVI 0FFFFh,A0 ;LET IT GO
MOVE A0,@SOUND
*CHECK FOR A WATCH DOG SITUATION
MOVE @WDOGRAM,A0,L ;GET THE DOG INITIALIZATION
CMPI WDOGNUM,A0 ;BEEN HERE BEFORE?
JRNE NEWSETUP ;NO
MOVE @SWITCH+32,A0,L ; CHECK TO SEE IF WOOF WAS REAL
BTST 6,A0 ; BIT SHOULD BE LOW IF DOG FIRED
JRNZ NEWSETUP ; BR = POWER ON/OFF
AUDIT AUDDOGGY ;CLICK A WATCH DOG RESET
.IF PRINTER
CALLA DOGGYPRINT ;LOG THE WATCH DOG TO THE PRINTER
.ENDIF
NEWSETUP
JAUC POWERTST ;DO THE PATENTED POWER UP TEST
*
*NOW THAT THE POWER ON TESTS ARE DONE, WE CAN INITIALIZE AGAIN, FOR REAL!
SETUP
POWERRET:
WARMSET:
DINT
SETF 16,1,0 ;WORD SIGN EXTEND
SETF 32,1,1 ;LONG WORD
MOVI STCKST,SP,L
*CLEAR SCRATCHPAD
CALLR CLSCRACH
MOVI SYSCINIT,A0 ;
MOVE A0,@SYSCOPY,W
MOVE A0,@SYSCTRL,W ; GET EVERYBODY HAPPY
.IF DEBUG
.ELSE
JAUC POWERCMOS ;VERIFY CMOS AND PRINT OPENING MESSAGE
.ENDIF
PCMOSRET
CALLR MAIN_INIT ;DO NORMAL INITIALIZATIONS
CALLA TIMEINIT ;WHY MUST WE DO THIS?
EINT ;ENABLE INTERRUPTS AND WE'RE OFF
DISPON ;ENABLE THE DISPLAY SYSTEM
CALLA CKDIAG ;ARE ANY OF THE DIAG SWITCHES CLOSED?
JRZ MAINGO ;BR = NO, THE GAME MAY PROCEED AS PLANNED
CREATE DIAG_PID,DIAG ;FIRE OFF THE DIAG PROCESS
JRUC EXEC_LP ;AND THEN DISPATCH IT.
MAINGO:
CLR A0
MOVE A0,@COINFLAG,W ; NOT ON COIN PAGE YET
.IF PRINTER
CALLA TROGALIVE ; PRINT OUT "ALIVE" MESSAGE
.ENDIF
CALLA ATSTRT ;START ATTRACT MODE
**************************************************************************
* *
* START OF EXECUTIVE LOOP *
* *
**************************************************************************
EXEC_LP:
CALLA PRCDSP ;DISPATCH PROCESSES
MOVE A13,A13 ;DID PROCESS EXECUTE CORRECTLY?
JRZ EXEC_POK ;BR = YES
LOCKUP ;REPORT THE SITUATION
EXEC_POK:
CALLA SNDPRC ;DISPATCH AND TIME THE SOUND CALLS
*
*UNSTACK THE VALID SWITCH CLOSURES AND ACTIVATE PROCESSES
*
MOVI ACTIVE,A13,L
MOVE @SWSTACK,A3,L
EXEC_UNSTKLP:
CMPI SWSTST,A3,L ;STACK AT START?
JREQ EXEC_UNSTKX ;YES, EXIT
MOVE @FREE,A0,L
JRZ EXEC_UNSTKX ;NO PROCESSES LEFT, TRY NEXT TIME AROUND
MOVE *A3+,A0,W ;GET ENTRY
MOVE A3,@SWSTACK,L ;UPDATE STACK
MOVE A0,A2
ADD A0,A2
ADD A0,A2 ;MULT BY 3
SLL 4,A2 ;ADJUST FOR WORD SIZE (16)
ADDI SWTAB,A2
MOVE *A2+,A1 ;GET PID
MOVE *A2+,A7,L ;GET STARTING ADDR
JREQ EXEC_UNSTKLP ;NULL ENTRY
MOVE @PAUSE_GAME,A0,W ;IS THE GAME IN PAUSE MODE?
JRZ EXEC_SWITCH_CREATE ;BR = NO, CONTINUE AS NORMAL
MOVE A1,A0 ;ANY DESTRUCTIBLE PROCESSES WILL
ZEXT A0 ;BE PAUSED BY THIS FLAG
SRL 13,A0
JRZ EXEC_UNSTKLP
EXEC_SWITCH_CREATE:
CALLA GETPRC
JRUC EXEC_UNSTKLP
EXEC_UNSTKX:
CALLA RANDOM ;RESEED THE RANDOM NUMBER GENERATOR
MOVE @EXECLED,A0,W
INC A0
MOVE A0,@EXECLED,W
CMPI 5,A0
JRLT EXEC_LP ;BR = NOT TIME TO BLINK THE EXEC LED
CLR A0
MOVE A0,@EXECLED,W
PUSHST
DINT
*
*DO SOME SYSCTRL STUFF WHILE INTERRUPTS ARE OFF
*
MOVE @SYSCOPY,A0,W ;BLINK L.E.D. TO ACK OPERATION
.IF YUNIT
XORI 0004H,A0
.ELSE
XORI 9000H,A0
.ENDIF
MOVE A0,@SYSCOPY,W
MOVE A0,@SYSCTRL,W
*HONEY! WOULD YOU FEED THE DOG?
MOVI WDOGBONE,A1 ;THROW ROVER A BONE
MOVK 1,A3
MOVE @SYSCOPY,A2,W
MOVE *A1+,A0,W
ROVERL
OR A2,A0
MOVE A0,@SYSCTRL,W
XOR A3,A0
MOVE A0,@SYSCTRL,W
MOVE *A1+,A0,W
JRNN ROVERL
MOVE A2,@SYSCTRL,W
POPST
JRUC EXEC_LP
**************************************************************************
* *
* END OF EXECUTIVE LOOP *
* *
**************************************************************************
**************************************************************************
* *
* MAIN_INIT - CUMBERSOME SYSTEM INITIALIZATION STUFF, USED TO BRING *
* UP THE SYSTEM COLD. *
* RAM MUST BE O.K., STACK POINTER VALID AND FIELDS SET. *
* RETURNS *
* A13 = PROCESS ACTIVE LIST *
* *
**************************************************************************
MAIN_INIT
PUSH A0
MOVI INAMODE,A0
MOVE A0,@GAME_STATE,W
MOVI WDOGNUM,A0
MOVE A0,@WDOGRAM,L ;MARK SYSTEM AS INITIALIZED
*RESET THE SOUND BOARD
CALLA SNDRES
CALLR INITIO ;INITIALIZE THE I/O REGS
*SET UP TI PIXEL PROCESSING REGS
CALLA SETPPROC
*INIT COLOR RAM
CLR A0
MOVE A0,@DMACTRL ;OFF DMA
MOVE A0,@CMAPSEL ;CLEAR COLOR MAP SELECT
MOVE A0,@IRQLED
MOVE A0,@EXECLED
*CLEAR THE SCREEN
CALLA SCRCLR
*INITIALIZE RANDOM SEED
MOVI 81261A8CH,A0
MOVE A0,@RAND,L
*ENABLE DISPLAY, EXT1 INTERRUPT
MOVI DIE,A0
MOVE A0,@intenb ;enable display interrupts
*INITIALIZE SWITCH STACK
MOVI SWSTST,A0
MOVE A0,@SWSTACK,L
*INITIALIZE SYSTEM CONTROL REGISTER
MOVI SYSCINIT,A0
MOVE A0,@SYSCTRL,W
MOVE A0,@SYSCOPY,W ;KEEP A COPY IN RAM
*INITIALIZE INTERRUPT RAM
MOVI SCOREINT,A0
MOVE A0,@SINTRAM,W ;SCORE AREA INTERRUPT
MOVI HSINT,A0
MOVE A0,@HSINTRAM,W ;HALF SCREEN INTERRUPT
*INITIALIZE DIP SWITCH OPTIONS
CALLR DIPINIT
*CLEAR ALL PLAYER DATA AREAS
CALLR CLRALLPD
*INITIALIZE PROCESS AND DISPLAY LISTS AND START THE SYSTEM
CALLA PINIT ;INIT PROCESS LIST
CALLA MYOINIT ;INITIALIZE THE OBJECT LIST
PULL A0
RETS
**************************************************************************
* *
* DIPINIT - INITIALIZE OPTIONS VIA DIP SWITCH SETTINGS *
* *
**************************************************************************
DIPINIT:
MMTM SP,A0,A1
CLR A0
MOVE A0,@STICKTYP,W
CALLA READ_DIP ;LOAD UP THE CURRENT DIP SWITCH BITS
MOVE A0,A1 ;STORE FOR MULTIPLE USES
ANDI DPPLAYERS,A0 ;AQUIRE THE NUMBER OF PLAYERS
SRL 9,A0
ADDI PLNUM,A0
MOVB *A0,A0
MOVE A0,@NPLAYERS,W
MOVE A1,A0
ANDI DPCOCKTAIL,A0 ;CHECK FOR "MIDWAY" COCKTAIL SETTING
JRZ DI_COCKNOT
MOVK 1,A0
DI_COCKNOT
MOVE A0,@COCKTAIL,W
MMFM SP,A0,A1
RETS
PLNUM .BYTE 3,2,1,0
.EVEN
**************************************************************************
* *
* ATSTRT - START THE ATTRACT MODE PROCESS *
* *
**************************************************************************
ATSTRT
MMTM SP,A0,A1,A7
MOVI INAMODE,A1
MOVE A1,@GAME_STATE,W
SOUNDOFF ;NO SOUNDS DURING A-MODE
CREATE INDPIDW,ATTRACT_MODE
MMFM SP,A0,A1,A7
DUMRETS:
DUMCOL:
RETS
**************************************************************************
* *
* PLAYER_START - PROCESS TO START A PLAYER INTO THE GAME. IF THE GAME *
* IS IN ATTRACT MODE, OR GAME OVER, THEN WE WILL START *
* A FRESH GAME. OTHERWISE, THE PLAYER WILL BE ADDED TO *
* THE CURRENT GAME. *
* *
**************************************************************************
PLAYER_START:
MOVE @GAME_STATE,A3,W
CMPI INDIAG,A3
JREQ PLAYER_X ;TEST MODE, NO DICE, CLAY.
CMPI INEPILOG,A3
JREQ PLAYER_X ;NO STARTS DURING EPILOG
MOVE *A13(PROCID),A4,W
MOVE A4,A0
CLR A1
NOT A1
CALLA EXISTP ;CHECK FOR THE SAME PROCESS
JRNE PLAYER_X ;BR = PROCESS ALREADY HERE, BYE
MOVE A4,A0
SLL 20,A0
SRL 28,A0
DEC A0
MOVE @NPLAYERS,A1,W
CMP A1,A0 ; CHECK FOR GAME CONFIG PLAYERS
JRHI PLAYER_X ; CAN'T START, DUDE!
MOVE A0,A9
CALLA GPLAYD ;GET THE PLAYER'S DATA AREA
CMPI INAMODE,A3 ;IN ATTRACT MODE?
JREQ PLAYER_INSTANT ;GO RIGHT FOR THE THROAT
CMPI INGAMEOV,A3 ;IN GAME OVER
JREQ PLAYER_INSTANT ;GO RIGHT FOR THE THROAT
MOVE *A2(PDRONEFLG),A8,W ;DRONE AT WORK?
JRNZ PLAYER_OBJ_SKIP ;DON'T GIVE A SHIT ABOUT EXISTING OBJ
MOVE *A2(POBJ),A8,L ;DOES HE ALREADY EXIST?
JRNE PLAYER_FLAG_X ;BR = YES, AND FLAG THE ESCAPE
PLAYER_OBJ_SKIP:
MOVE *A2(PSCORE),A1,L ; GET HIS SCORE
JRNZ PLAYER_CONT ; BR = TRYING TO CONTINUE
PLAYER_INSTANT:
CALLA CR_STRTP
JRLO PLAYER_X ; NOT ENOUGH CREDITS, DUDE!
CALLA P_START ; TAKE A CREDIT
.IF PRINTER
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0
JREQ PLAYER_START_PRINT
CMPI INAMODE,A0
JRNE PLAYER_1ST_BUYIN
PLAYER_START_PRINT:
CALLA PGAMESTART
JRUC PLAYER_COOL
PLAYER_1ST_BUYIN:
CALLA PGAMEBUYIN
.ENDIF
JRUC PLAYER_COOL
*
*PLAYER CONTINUE CREDIT DECREMENT
PLAYER_CONT:
CALLA ALLOW_CONTINUE ;IS CONTINUE ALLOWED?
JRZ PLAYER_X ;BR = NO
CALLA CR_CONTP ;DOES HE HAVE ENOUGH TO CONTINUE?
JRLO PLAYER_X ;BR = NO
CALLA P_CONT ;DECREMENT COST OF CONTINUE
.IF PRINTER
CALLA PGAMECONT
.ENDIF
*
*A2 = PLAYER DATA
*A3 = GAME STATE
*A9 = PLAYER NUMBER
PLAYER_COOL:
CMPI INPLAY,A3 ;ARE WE IN ACTION?
JRNE PLAYER_FRESH ;BR = NO, DON'T EVEN WORRY ABOUT DRONE
ORI HOUSEPID,A9
PLAYER_UNDRONE_LP:
MOVE *A2(PDRONEFLG),A8,W ;DRONE AT WORK?
JRZ PLAYER_FRESH ;BR = NO, CONTINUE AS NORMAL
MOVE A9,A0
CLR A1
NOT A1
CALLA EXISTP ;DRONE HOUSE BEING BUILT?
JRZ PLAYER_UNDRONE ;BR = NO
MOVE A2,A11
SLEEPK 1
MOVE A11,A2
JRUC PLAYER_UNDRONE_LP ;WAIT ON THE HOUSE BUILD BEFORE START
PLAYER_UNDRONE:
CALLA DRONE_DELETE ;DELETE IF WE ARE A DRONE
PLAYER_FRESH:
ADJUST ADJLIVES ;GET # OF LIVES FROM CMOS
MOVE A0,*A2(PLIVES),W ;GIVE THIS DUDE HIS LIFE
MOVE *A2(PPID),A0,W
ORI PINITIALPID,A0
MOVE A0,A3
CLR A1
NOT A1
CALLA EXISTP
JRZ PLAYER_NOT_ENTERING
CALLA GETA8
CALLA GETA9
CALLA GETA10
CALLA GETA11
MOVE A3,A1
MOVI SCIDONE,A7
CALLA XFERPROC ;LET THE GUY ENTER WHAT HE'S GOT
PLAYER_NOT_ENTERING:
MOVK 1,A0
MOVE A0,*A2(PENTER),W ;MARK THIS DUDE READY TO ENTER
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0
JREQ PLAYER_1ST ;AHHH THE FIRST TO PLAY, WELCOME
CMPI INGAMEOV,A0
JREQ PLAYER_1ST ;RESTART THE GAME, HOW INTERESTING
CLRM *A2(PDEAD),W
CMPI ININTRO,A0
JREQ PLAYER_HILITE ;HILITE THE SCORE AREA FOR FEEDBACK
CMPI INGAME,A0
JRNE PLAYER_SOUND
PLAYER_HILITE:
**** CLR A0
**** MOVE A0,*A2(PDEAD),W
**** MOVK 1,A0
**** MOVE A0,*A2(PENTER),W ;MARK THIS DUDE READY TO ENTER
CALLA UPDSL
**** JRUC PLAYER_STARTLP ;NO SOUNDS TO RUIN THE INTRO
PLAYER_SOUND:
**** CLR A0
**** MOVE A0,*A2(PDEAD),W
CALLR GPLAYNUM ;GET THE PLAYERS NUMBER
SLL 5,A0
ADDI START_SND_TAB,A0
MOVE *A0,A0,L
CALLA ONESND ;BLOW YOUR HORN
PLAYER_STARTLP:
MOVE @GAME_STATE,A0,W ;WAIT FOR GAME PLAY TO COMMENCE
CMPI INPLAY,A0
JREQ PLAYER_ADD
CMPI INGAMEOV,A0 ;HAVE WE SOMEHOW GOTTEN INTO GAMEOVER
JREQ PLAYER_CLRLIFE_X ;BR = YES
MOVE A2,A8 ;WAIT FOR GAME TO START OR END
SLEEPK 4
MOVE A8,A2
JRUC PLAYER_STARTLP
PLAYER_1ST:
PUSHP A2 ;STARTING FROM AMODE OR GAME OVER
FCALL SECURITY,B0
MOVE @SEC_FLAG,A14,W
JRZ P1ST_SEC_OK
AUDIT AUDSECURITY ;SHOW THE SECURITY BREECH
CALLR ATSTRT
DIE
P1ST_SEC_OK
MOVE *A12,A2,L ;RETRIEVE PLAYER DATA PTR
JSRP GAME_START
PULLP A2
PLAYER_ADD:
CALLR PLAYER ;MUST CALL THIS BEFORE YOU INC PWAVEST
JRZ PLAYER_CLRLIFE_X ;COULDN'T CREATE THE DUDE
INCM *A2(PSTARTS),W ;INCREMENT THE STARTS
**** CALLA DINO_START
**** MOVE *A2(PWAVEST),A0,W ;PLAYER STARTED THIS WAVE?
**** JRNE PLAYER_BUYIN ;BR = ALREADY STARTED THIS WAVE ONCE.
*DO THIS STUFF ONCE PER WAVE, MAX
**** CALLA EGG_START
MOVE *A2(PSCORE),A0,L
JRNZ PLAYER_BUYIN ;NON-VIRGIN
*DO THIS STUFF ON INITIAL PLAYER START ONLY
**** MOVK 1,A0
MOVE @START_WAVE,A0,W ;BASE THIS ON THE SELECTED START
MOVE A0,*A2(PWAVES),W ;COUNT ONE FOR WAVES PLAYED
DEC A0 ;DO THIS SO THAT THE PLAYER DOES'NT
MOVE A0,*A2(PLASTWIN),W ;GO INTO BOZO MODE RIGHT AWAY!
MOVE @CURPLYRS,A0,W
ADDI AUD1START,A0
CALLA AUD1
**** MOVE @START_SCORE,A1,L
**** CALLA SCORE ;AWARD START AHEAD BONUS, IF ANY
JRUC PLAYER_INIT
*DO THIS STUFF ON BUY-IN ONLY
PLAYER_BUYIN:
MOVE @CURPLYRS,A0,W
ADDI AUD1CONTS,A0 ;CLICK THE CORRECT AUDIT
CALLA AUD1
AUDIT AUDCONTTAKEN ;CLICK A CONTINUE TAKEN
*THINGS TO RE-INITIALIZE EVERY TIME SOMEONE STARTS OR BUYS IN
PLAYER_INIT:
INCM @CURPLYRS,W ;INCREMENT THE PLAYER COUNT
INCM *A2(PWAVEST),W ;INCREMENT THE STARTS THIS WAVE
ADJUST ADJLIVES ;GET # OF LIVES FROM CMOS
MOVE A0,*A2(PLIVES),W ;GIVE THIS DUDE HIS LIFE, AGAIN
CLR A0
MOVE A0,*A2(PJOYSTCK),W
MOVE A0,*A2(PTRUEJOY),W ;STORE THE LAST JOYSTICK STATUS
*EXTRA MAN BULLSHIT
ADJUST ADJNUMEXTRA ;SOCIALIST OPERATOR?
JRNZ PLAYER_FIXED_EXTRA ;BR = YES
MOVI 7FFFH,A0 ;A MILLION!
PLAYER_FIXED_EXTRA
MOVE A0,*A2(PEXTRAS),W ;NO EXTRA MEN SO FAR
ADJUST ADJEXTRA
MOVE *A2(PSCORE),A1,L
MOVE @START_SCORE,A4,L
JRZ PF_SETREP
CMP A4,A1
JRHS PF_SETREP
MOVE A4,A1
PF_SETREP
CALLA BCDADD ;CALCULATE NEXT REPLAY
MOVE A0,*A2(PNEXTREP),L ;AND STORE IT
**** MOVE A2,A11
**** SLEEP 5 ;INSURE THAT INITIAL ENTRY IS DEAD
**** MOVE A11,A2
CALLA UPDSL ;UPDATE THE STATUS AREA OF THIS PLAYER
PLAYER_X:
DIE
*EXIT HERE IF START FAILURE AFTER LIFE HAS BEEN GIVEN
*A2 = PTR TO PLAYER DATA AREA
PLAYER_CLRLIFE_X:
CLR A0
MOVE A0,*A2(PLIVES),W
JRUC PLAYER_X
*
*EXIT HERE IF YOU WISH TO MAKE IT KNOWN THAT THE START BUTTON WAS PRESSED
*A2 = PTR TO PLAYER DATA AREA
PLAYER_FLAG_X
MOVK 1,A0
MOVE A0,*A2(PSTARTESC),W
JRUC PLAYER_X
*
*PLAYER START SOUND TABLE
*
START_SND_TAB:
.LONG P1ST_SND,P2ST_SND,P3ST_SND,P4ST_SND
P1ST_SND .WORD >F3F0,30,>8093,0 ;PLAYER ONE START SOUND
P2ST_SND .WORD >F3F0,30,>8093,0 ;PLAYER TWO START SOUND
P3ST_SND .WORD >F3F0,30,>8093,0 ;PLAYER THREE START SOUND
P4ST_SND .WORD >F3F0,30,>8093,0 ;PLAYER FOUR START SOUND
*
*PLAYER NAME STRING TABLE, TO BE PROCESSED WITH STRINGF
*
PNAME_TAB:
.LONG P1NAME,P2NAME,P3NAME,P4NAME,0
P1NAME:
.STRING "\bREX",0
.WORD 0101H
.EVEN
P2NAME:
.STRING "\bBLoOP",0
.WORD 0303H
.EVEN
P3NAME:
.STRING "\bSPIKE",0
.WORD 0505H
.EVEN
P4NAME:
.STRING "\bGWEN",0
.WORD 0606H
.EVEN
*
*PLAYER NAME STRING TABLE, TO BE PROCESSED WITH STRINGF
*AND TO BE USED WITH THE 15 POINT FONT.
*
PNAME15_TAB:
.LONG P1NAME,P2NAME15,P3NAME,P4NAME,0
P2NAME15:
.STRING "\bBLOOP",0
.WORD 0303H
.EVEN
**************************************************************************
* *
* PLAYER - ROUTINE TO START A PLAYER OBJECT AN ADD IT TO THE DISPLAY. *
* A2 = INDEX TO PLAYER DATA AREA UPON CREATION. *
* RETURNS: *
* Z = FAILURE TO CREATE, NO PLAYER ADDED *
* NZ = SUCCESS *
* A0 = PLAYER OBJECT *
* A8 = PLAYER OBJECT *
* NOTE: TRASHES A14 *
* *
**************************************************************************
PLAYER:
MMTM SP,A1,A7,A11
MOVE *A2(PINITAB),A14,L ;GET THE INITIALIZATION TABLE
CALLA GPALOBJSTF
JRZ PLAYERX ;BR = WE FAILED TO GET AN OBJECT
MOVE A0,*A2(POBJ),L
MOVE A0,A8
CALLA OBJ_OFF ;KEEP THAT OBJECT TURNED OFF
CLR A0
MOVE A0,*A2(PDEAD),W
MOVE A0,*A2(PBOZO),W ;CLEAR THE BOZO LEVEL
MOVE A0,*A2(PJOYSTCK),W
MOVE A0,*A2(PTRUEJOY),W ;STORE THE LAST JOYSTICK STATUS
MOVE A0,*A2(PDRONEFLG),W
MOVE A0,*A2(PNOMOVE),W
MOVE A0,*A2(PDINOSTOP),W
MOVE A0,*A2(PINSTRUCT),W
CALLA DINO_START
CALLA EGG_START
CLR A0
MOVE A0,*A2(PENTER),W
MOVE A8,A0
CALLA INSOBJ
MOVE A0,A0 ;CLEAR ZERO FLAG UPON SUCCESS
PLAYERX
MMFM SP,A1,A7,A11
RETS
**************************************************************************
* *
* PLAYER_DELETE - DELETE THIS PLAYER'S OBJECT AND REMOVE HIM FROM THE *
* GAME, YEAH BOY! *
* A2 = PTR TO PLAYER DATA AREA *
* *
**************************************************************************
PLAYER_DELETE
MMTM SP,A0,A1,A11
MOVE *A2(PPID),A0,W
MOVI 08700H,A1
CALLA KILALL ;KILL THE PLAYER PROCESSES
MOVE *A2(POBJ),A0,L
CALLA DELPAL
CALLA DELOBJ ;REMOVE THE SHIT
CALLR PLAYER_CLR ;CLEAR OUT PLAYER GAME DATA
CALLA HIGHSCORECHECK ;DO A VERY SMALL HIGH SCORE CHECK
CALLR ALLOW_CONTINUE
JRZ PD_NOBUYIN
AUDIT AUDCONTOFFER ;CLICK A CONTINUE OFFERED
PD_NOBUYIN
MOVE @CURPLYRS,A0,W
DEC A0 ;KNOCK DOWN THE PLAYER COUNT
MOVE A0,@CURPLYRS,W
MMFM SP,A0,A1,A11
RETS
**************************************************************************
* *
* ALLOW_CONTINUE - ROUTINE TO DETERMINE IF WE SHOULD ALLOW THIS GUY TO *
* CONTINUE. *
* A2 = PTR TO PLAYER DATA AREA *
* RETURNS *
* Z = NOT ALLOWED *
* NZ = ALLOWED *
* NOTE: TRASHES A14 *
* *
**************************************************************************
ALLOW_CONTINUE
PUSH A0
ADJUST ADJBUYIN ;ARE GAME CONTINUES ALLOWED?
JRZ AC_X ;BR = NEVER
CMPI 2,A0
JREQ AC_YES ;BR = ALWAYS
MOVE *A2(PCONSECUTIVE),A0,W
CMPI 1,A0
JRLS AC_YES ;BR = SOMETIMES
SETZ ;HE DID NOT QUALIFY TO CONTINUE
JRUC AC_X
AC_YES
CLRZ
AC_X
PULL A0
RETS
**************************************************************************
* *
* PLAYER_CLR - ROUTINE TO CLEAR THE PLAYER ACTIVE FIELDS. *
* A2 = PTR TO THE PLAYER *
* *
**************************************************************************
PLAYER_CLR
PUSH A0
CLR A0
MOVE A0,*A2(POBJ),L ;CLEAR THIS OUT
MOVE A0,*A2(PENTER),W ;CLEAR THE GAME ENTRANCE WAITING FLAG
MOVE A0,*A2(PLIVES),W ;JUST TO MAKE SURE HE IS DEAD
MOVE *A2(PSCORE),A0,L
CALLA UPDSL ;TURN IT DOWN MANG!
PULL A0
RETS
**************************************************************************
* *
* PLAYER_RESTART - RESTART A PLAYER IF HE EXISTED BEFORE. THIS IS *
* USED FOR STARTING A NEW WAVE. *
* A2 = PLAYER INDEX *
* NOTE: CALL ONLY AFTER RE-INITIALIZING THE DISPLAY SYSTEM *
* *
**************************************************************************
PLAYER_RESTART:
PUSH A0
CLR A0
MOVE A0,*A2(PBARS),W
MOVE A0,*A2(PJOYSTCK),W
MOVE A0,*A2(PTRUEJOY),W ;STORE THE LAST JOYSTICK STATUS
MOVE A0,*A2(PEGGS),W
MOVE A0,*A2(PWAVEDEATHS),W
MOVE A0,*A2(PBOZO),W ;CLEAR BOZO LEVEL
MOVE A0,*A2(PTROGKILLS),W ;CLEAR THE TROG KILLS
MOVE A0,*A2(PWAVETIME),L ;START FROM ZERO
MOVE A0,*A2(PEXTRAEARN),W
MOVE A0,*A2(PDRONEFLG),W ;CLEAR HIS DRONE FLAG FOR GOOD LUCK
MOVE A0,*A2(PEGGOUT),W
MOVE A0,*A2(PEGGLAY),W
MOVE A0,*A2(PEGGINIT),W
MOVE A0,*A2(PEGGACTIVE),W
MOVE A0,*A2(PNOMOVE),W
MOVE A0,*A2(PDINOSTOP),W
MOVE A0,*A2(PINSTRUCT),W
MOVE *A2(POBJ),A0,L
JREQ PLAYER_RSX ;BR = THIS GUY WAS NOT AROUND
CALLR PLAYER ;MUST CALL THIS BEFORE YOU INC PWAVEST
**** CALLA DINO_START
**** CALLA EGG_START
INCM *A2(PWAVEST),W ;INCREMENT THE START COUNT
PLAYER_RSX:
PULL A0
RETS
**************************************************************************
* *
* GAME_START - START OF GAME ROUTINE, THIS WILL HANDLE ALL THINGS THAT *
* MUST BE DONE. *
* A2 = PLAYER DATA AREA OF PLAYER STARTING THE GAME *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
GAME_START:
MMTM A12,A8,A9,A10,A11
CALLA QSNDRST
CALLR WIPEOUT ;WIPE OUT THE WORLD
CALLR GRAMINIT ;INITIALIZE GAME RAM
CALLR GAME_DIFFICULTY ;INITIALIZE GAME DIFFICULTY PARAMS
CALLR CLRALLPD ;INITIALIZE PLAYER DATA AREAS
CALLA CLEAR_HSCOLORS ; CLEAR HIGHSCORE COLORS
CALLA INIT_HSHOLD ; HS HOLDING AREA
MOVK 1,A0 ;THESE 2 INSTRUCTIONS AFTER CLRALLPD
MOVE A0,*A2(PENTER),W ;YEAH! YEAH! DUDE IS READY TO PLAY!
*** MOVI ILIVES,A0 ;AND THESE TWO
ADJUST ADJLIVES ;GET # OF LIVES FROM CMOS
MOVE A0,*A2(PLIVES),W
ADJUST ADJEGGS
MOVE A0,@EGG_SCHEME,W
CREATE INDPIDW,SCORPROC ;START UP THE PUSH PLAYER START PROCESS
DISPON ;DISPLAY SYSTEM BACKON
MOVI ININTRO,A0
MOVE A0,@GAME_STATE,W ;SECRETARY OF STATE
JSRP GAME_INTRO
MOVI INGAME,A0
MOVE A0,@GAME_STATE,W
**** MOVK 1,A0
**** MOVE A0,@WAVE
JSRP WAVE_START ;DO THE WAVE INITIALIZATION
MMFM A12,A8,A9,A10,A11
RETP
**************************************************************************
* *
* GAME_DIFFICULTY - SETUP GAME DIFFICULTY PARAMETERS *
* USES THE THE GAME ADJUSTMENT ADJDIFF AS THE CURRENT DIFFICULTY *
* *
**************************************************************************
GAME_DIFFICULTY:
MMTM SP,A0,A1,A2,A3,A4,A6,A7,A8
ADJUST ADJDIFF ;GET MASTER DIFFICULTY
CMPI MAXDIFF,A0
JRLS GDIFF_OK ;BR = DIFFICULTY SETTING IS O.K.
MOVI MAXDIFF,A0 ;INSERT MAXIMUM ALLOWED DIFFICULTY
GDIFF_OK:
SUBK 5,A0
MOVI GDIFF_RAM_ST,A2
MOVI GAME_DIFF_TAB,A3
GDIFF_LP:
MOVE *A3+,A7,W ;GET DIFFICULTY DELTA
MOVE *A3+,A6,W ;GET MIN
MOVE *A3+,A4,W ;GET MAX
MOVE *A3+,A8,W ;GET GAME VALUE
MPYS A0,A7
ADD A7,A8 ;ADD IN DELTA
CMP A8,A6
JRLS GDIFF_MIN ;CHECK FOR MIN
MOVE A6,A8
JRUC GDIFF_MAX
GDIFF_MIN:
CMP A8,A4 ;CHECK FOR MAX
JRHS GDIFF_MAX
MOVE A4,A8
GDIFF_MAX:
MOVE A8,*A2+,W ;STORE IT AWAY
CMPI GDIFF_RAM_END,A2
JRLO GDIFF_LP ;NOT DONE
MMFM SP,A0,A1,A2,A3,A4,A6,A7,A8
RETS
**************************************************************************
* *
* GAME_INTRO - INTRODUCTION AT GAME START *
* A2 = PTR TO PLAYER THAT STARTED THIS GAME. *
* EXPECTATIONS: *
* - DISPLAY SYSTEM ON *
* - ALL DISPLAY LISTS CLEAR *
* - ALL DISPLAY PAGES CLEAR *
* - AUTO ERASE OFF *
* NOTE: A8,A9,A10,A11 ARE DESTROYED *
* ALSO TRASHES PTEMP1 & PTEMP2. *
* CALL WITH JSRP *
* *
**************************************************************************
*SELECTION TIMER POSITIONS
SELECTX .EQU 197
SELECTY .EQU 200+SKYTOPOF
GAME_INTRO:
CALLA SCORAREA
CALLA GET_CSTR
CALLA G_CRED ;UPDATE THE WAVE DISPLAY
CALLA ISLAND_NUM ;PLOP OUT THE ISLAND NUMBER
MOVE A2,*A13(PTEMP1),L
SLEEPK 4
*INTIALIZE GLOBAL START PLAYER VARIABLES
MOVE *A13(PTEMP1),A2,L
CALLR GPLAYNUM
MOVE A0,@SPLAYER_NUM,W ;STORE FOR THE REST OF THE WORLD
MOVE A0,A5
SLL 4,A5
ADDI HBOX_COLORS,A5
MOVE *A5,A5,W
MOVE A5,@SPLAYER_COL,W
SLL 5,A0
ADDI SELECTCOL_TAB,A0
MOVE *A0,A0,L
MOVE A0,@SELECTCOL,L
MOVE @STORY_MODE,A0,W ;IS IT THAT BLASTED ATTRACT MODE?
JRZ GAME_INTRO_GAME ;BR = NO, THANK GOD
MOVK 1,A0
MOVE A0,@TUTOR,W ;SETUP TUTORIAL FOR ATTRACT MODE
JRUC GAME_INTRO_X
GAME_INTRO_GAME
SOUND1 GAME_INTRO_SND
MOVI SELECT_MESS,A8
CALLA LM_SETUP
MOVE @SPLAYER_COL,A5,W
SLL 16,A5
JSRP PRINTF ;PRINT ISLAND SELECT HEADER
*PUT OUT SOME IMAGES TO MAKE THIS LOOK PRETTY
MOVI DMAWNZ,A5 ;USE THESE FLAGS
MOVI [RBOXY+21,RBOXX+33],A3
MOVE @SPLAYER_NUM,A14,W
SLL 5,A14
ADDI ALIGNTAB,A14
MOVE *A14,A14,L
MOVE *A14(INITIMG),A14,L ;GET INITIAL PLAYER IMAGE
CALLA DMAWPAL
MOVI [RBOXY+18,RBOXX+RBOXSPC+20],A3
MOVI TRSTP0,A14
CALLA DMAWPAL
MOVI [RBOXY+18,RBOXX+(RBOXSPC*2)+21],A3
MOVI TRSTCLP0,A14
CALLA DMAWPAL
CLR A0
CALLR BOX_ON ;DEFAULT ON CURRENT BOX
MOVE A1,@WAVE,W ;DEFAULT WAVE SELECT
MOVE A1,@START_WAVE,W ;DEFAULT GLOBAL INFORMER
MOVE A2,@START_SCORE,L ;DEFAULT SCORE
MOVE A3,@TUTOR,W ;DEFAULT MODUS
CLR A8 ;THIS IS OUR CURRENT BOX
INC A0
SELECT_BOXES:
CALLR BOX_OFF ;SHOW OTHER BOXES OFF
INC A0
CMPI NUMBOXS,A0
JRLO SELECT_BOXES ;MORE TO COME
SLEEPK 20 ;GIVE IT TIME TO SINK IN
MOVK 11,A9 ;SECONDS LEFT
CLR A10 ;TIME 'TIL NEXT SECOND
SELECT_LP:
MOVE *A13(PTEMP1),A2,L
CALLA LOOKFIRE ;DID HE PUSH HIS FIRE BUTTON?
JRNZ A_SELECTION ;BR = YES, THEN CRUISE WITH THIS ISLE
CALLA LOOKSTICK ;STICK ACTION?
JRZ SELECT_TICK ;BR = NO
CMPI 4,A0 ;RIGHT STICK?
JREQ SELECT_ADD ;BR = YES
CMPI 3,A0 ;LEFT STICK?
JRNE SELECT_TICK ;BR = NUTHIN' TIMER DOWN JACKSON!
*ONE BOX TO THE LEFT
MOVE A8,A8 ;ARE WE ALL THE WAY LEFT?
JRZ SELECT_TICK ;BR = YES, NO SELECT
MOVE A8,A6
DEC A6
JRUC SELECT_NEXT
*ONE BOX TO THE RIGHT
SELECT_ADD:
CMPI NUMBOXS-1,A8 ;ARE WE ALL THE WAY RIGHT?
JRHS SELECT_TICK ;BR = YES, NO SELECT
MOVE A8,A6
INC A6
SELECT_NEXT:
MOVE A8,A0
CALLR BOX_OFF ;TURN OFF THE OLD
MOVE A6,A8
MOVE A6,A0
CALLR BOX_ON ;TURN ON THE NEW
MOVE A1,@WAVE,W ;TAKE ITS INFO
MOVE A1,@START_WAVE,W ;HOLD ON TO THIS FOR POSTERITY
MOVE A2,@START_SCORE,L ;STARTING SCORE
MOVE A3,@TUTOR,W ;SET MODE
SOUND1 BEEP_1
SLEEPK 15 ;THE PAUSE THAT REFRESHES
SUBK 15,A10
JRUC SELECT_TICK2
SELECT_TICK:
SUBK 3,A10
SELECT_TICK2:
JRGT SELECT_SLEEP
DEC A9
JRN A_SELECTION ;BR = TIME OUT
MOVE A9,@SELECTCOL,L ;STORE TIME
CALLR BLANK_TIME ;BLANK OLD TIME
MMTM A12,A8,A9
MOVI SELECT_TIME,A8
JSRP LM_PRINTF
MMFM A12,A8,A9
MOVI 62,A10 ;TICKS 'TIL SECOND
SELECT_SLEEP:
SLOOP 3,SELECT_LP
*YOU HAVE MADE A SELECTION, A SELEH-EH-EH-EHCTION!
A_SELECTION:
SOUND1 WIN_SND
SOUND1 MUSICOFF
MOVI AUDSTLV1,A0 ; ADD 1 TO APPROPRIATE START LEVEL
ADD A8,A0
CALLA AUD1
.IF PRINTER
CALLA PGAMELEVEL
.ENDIF
*CLEAR THE OTHER BOXES
MOVI NUMBOXS-1,A0
SELECT_CLEAR_LP:
CMP A0,A8
JREQ SELECT_CLEAR_NXT
CALLR CLR_BOX
SELECT_CLEAR_NXT:
DEC A0
JRNN SELECT_CLEAR_LP
CALLR BLANK_TIME ;BLANK THE TIME
MOVI [165+SKYTOPOF,97],A3
MOVI [20,200],A4
CALLA BLNKAREA ;CLEAR SELECT TEXT
SLEEP 62
GAME_INTRO_X:
CALLA MYOINIT
RETP
**************************************************************************
* *
* BOX_IT - DRAW ONE OF THE BOXES *
* A0 = BOX NUMBER *
* A1 = [COLOR,PALETTE] *
* RETURNS: *
* A1 = WAVE SELECTED BY BOX *
* A2 = START SCORE *
* A3 = MODE 0 = NORMAL / 1 = TUTOR *
* NOTE: TRASHES A2,A3,A4,A5,A7 *
* *
**************************************************************************
BOX_ON:
**** MOVI [0D0DH,0],A1 ;BOX ON COLOR
MOVE @SPLAYER_COL,A1,W
SLL 16,A1
MOVI 0F0F0101H,A5 ;TEXT ON COLOR
JRUC BOX_IT
BOX_OFF:
MOVI [0101H,0101H],A1 ;BOX OFF COLOR
MOVI 01010101H,A5 ;TEXT OFF COLOR
BOX_IT:
MMTM SP,A0,A8
MOVE A5,@SELECTCOL,L
MOVI BOXENTSIZ,A5
MPYU A0,A5
ADDI BOX_TAB,A5
MOVK 3,A2 ;BOX WIDTH
MOVE *A5+,A3,L ;BOX POSITION
MOVE *A5+,A0,L ;BOX SIZE
CALLA DRAWBOX
MOVE *A5+,A8,L
MMTM SP,A5,A6,A9,A10,A11
CALLA LM_SETUP
MOVE @SELECTCOL,A5,L ;BRING ON THE CORRECT COLOR
JSRP PRINTF
MMFM SP,A5,A6,A9,A10,A11
MOVE *A5+,A1,W ;SEND THE WAVE BACK
MOVE *A5+,A3,W ;SEND BACK THE MODE
MOVE *A5+,A2,L ;SEND THE STARTING SCORE
MMFM SP,A0,A8
RETS
**************************************************************************
* *
* CLR_BOX - CLEAR AN ENTIRE BOX AREA *
* A0 = BOX NUMBER *
* NOTE: TRASHES A3,A4,A5 *
* *
**************************************************************************
CLR_BOX:
MOVI BOXENTSIZ,A5
MPYU A0,A5
ADDI BOX_TAB,A5
MOVE *A5+,A3,L
MOVE *A5+,A4,L
JAUC BLNKAREA
**************************************************************************
* *
* BLANK_TIME - BLANK THE SELECTION TIMER *
* NOTE: DESTROYS A3,A4 *
* *
**************************************************************************
BLANK_TIME:
MOVI [SELECTY-3,SELECTX-20],A3
MOVI [20,40],A4
JAUC BLNKAREA ;
RBOXX .EQU 65
RBOXY .EQU 60+SKYTOPOF
RBOXSPC .EQU 100
RBOXXSIZ .EQU 80
RBOXYSIZ .EQU 89
NUMBOXS .EQU 3
BOXENTSIZ .EQU 160
*
*SELECTION BOX TABLE
BOX_TAB:
.LONG [RBOXY,RBOXX],[RBOXYSIZ,RBOXXSIZ] ;[Y,X] POS, [Y,X] SIZE
.LONG BOX1TEXT ;TEXT TO PRINT IN BOX
.WORD 1,0 ;WAVE, TUTOR_MODE
.LONG 0 ;GIVE THIS MANY POINTS
.LONG [RBOXY,RBOXX+RBOXSPC],[RBOXYSIZ,RBOXXSIZ]
.LONG BOX2TEXT
.WORD 2,0
.LONG 200000H
.LONG [RBOXY,RBOXX+(2*RBOXSPC)],[RBOXYSIZ,RBOXXSIZ]
.LONG BOX3TEXT
.WORD 4,0
.LONG 400000H
SELECTCOL_TAB:
.LONG P1SELECTCOL,P2SELECTCOL,P3SELECTCOL,P4SELECTCOL
P1SELECTCOL:
.STRING "RED",0
.EVEN
P2SELECTCOL:
.STRING "BLUE",0
.EVEN
P3SELECTCOL:
.STRING "YELLOW",0
.EVEN
P4SELECTCOL:
.STRING "PURPLE",0
.EVEN
.BSS SELECTCOL,32
SELECT_TIME:
MESS_MAC RD15FONT,1,SELECTX,SELECTY,0F0F0101H,STRCNRM,0
.STRING "%d",0
.LONG SELECTCOL
.EVEN
SELECT_MESS:
MESS_MAC RD5FONT,2,197,165+SKYTOPOF,0D0D0000H,STRCNRM,0
.STRING "USE %p JOYSTICK TO SELECT\n\n"
.STRING "%p PUNCH BUTTON TO ENTER.\n"
.STRING "\d\f\p\bSELECT YOUR LEVEL!",0
.LONG SELECTCOL
.LONG SELECTCOL
.LONG RD20FONT
.LONG [-168,-128]
.LONG RED16
.WORD 0F0FH
.EVEN
BOX1TEXT:
MESS_MAC RD7FONT,1,RBOXX+(RBOXXSIZ/2),RBOXY+6,0,STRCNRM,0
.STRING "ISLAND 1\n\n\n\n"
.STRING "EASY\n"
.STRING "0\n\d\fLEVEL BONUS",0
.LONG RD5FONT
.LONG [0,12]
BOX2TEXT:
MESS_MAC RD7FONT,1,(RBOXX+(RBOXXSIZ/2))+RBOXSPC,RBOXY+6,0,STRCNRM,0
.STRING "ISLAND 2\n\n\n\n"
.STRING "ADVANCED\n"
.STRING "200,000\n\d\fLEVEL BONUS",0
.LONG RD5FONT
.LONG [0,12]
BOX3TEXT:
MESS_MAC RD7FONT,1,((RBOXX+(RBOXXSIZ/2))+(2*RBOXSPC)),RBOXY+6,0,STRCNRM,0
.STRING "ISLAND 4\n\n\n\n"
.STRING "EXPERT\n"
.STRING "400,000\n\d\fLEVEL BONUS",0
.LONG RD5FONT
.LONG [0,12]
GAME_INTRO_SND:
.WORD >F2FD,>1,>800A,0 ;GAME INTRO SOUND
*
*HELP BOX DUXPAL COLOR ASSIGNMENTS FOR EACH PLAYER
HBOX_COLORS:
.WORD TROG_RED, TROG_BLUE, TROG_YELLOW, TROG_PURPLE
**************************************************************************
* *
* WAVE_START - ROUTINE TO CALL AT THE BEGINNING OF EACH WAVE. *
* THIS WILL LEAD THE GAME INTO PLAY (GAME_STATE = INPLAY). *
* EXPECTATIONS: *
* - DISPLAY SYSTEM ON *
* - ALL DISPLAY LISTS CLEAR *
* - ALL DISPLAY PAGES CLEAR *
* - AUTO ERASE OFF *
* @WAVE = WAVE # JUST STARTING *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
WAVE_START:
CALLA WRAMINIT
CALLR WAVE_DIFFICULTY
MOVE @VIRTUAL_TROGS,@NUM_TROGS,W
MOVE @TROGSPEED,A0,W
ADDI 400H,A0
MOVE A0,@MAX_TROGSPEED,W
CALLA CLRBGND
MOVE @WAVE,A0,W
CMPI LAST_WAVE,A0
JRLE WAVE_START_NORM
MOVI LAST_WAVE,A0 ;STICK AT THE TOP WAVE
WAVE_START_NORM:
DEC A0
SLL 5,A0
ADDI WAVE_TABLE,A0
MOVE *A0,A0,L
*DO ALL LONG WORD INITS FIRST
MOVE *A0+,A1,L
MOVE A1,@POSTMAP,L
MOVE *A0+,A1,L
MOVE A1,@BOUNDRIES,L
MOVE *A0+,A1,L
MOVE A1,@WAVE_BGND1,L
MOVE *A0+,A1,L
MOVE A1,@WAVE_BGND2,L
MOVE *A0+,A1,L
MOVE A1,@FOREGROUND,L
MOVE *A0+,A1,L
MOVE A1,@DISPATCH_TABLE,L
MOVE *A0+,A1,L
MOVE A1,@WAVE_MUSIC,L
MOVE *A0+,A1,L
MOVE A1,@WAVE_WATER,L
MOVE *A0+,A1,L
MOVE A1,@P1DATA+PDINO,L
MOVE *A0+,A1,L
MOVE A1,@P2DATA+PDINO,L
MOVE *A0+,A1,L
MOVE A1,@P3DATA+PDINO,L
MOVE *A0+,A1,L
MOVE A1,@P4DATA+PDINO,L
*NOW DO WORD INITS
MOVE *A0+,A1,W
MOVE A1,@SKYCOLOR,W ;STUFF THE SKY COLOR
CLR A1
MOVE A1,@IRQSKYE,W ;CLEAR TO BLACK
MOVE *A0+,A1,W
MOVE A1,@BGND_TYPE,W ;STORE BACKGROUND TYPE
MOVE *A0+,A1,W
MOVE A1,@TUNNEL,W ;STORE TUNNEL WAVE
MOVE *A0+,A1,W
MOVE A1,@FAST_TIME,W ;GET THE "FAST FINISH" TIME
MOVE *A0+,A1,L
MOVE A1,@TUNNEL_SCORE,L ;SCORE FOR TUNNELING
MOVE *A0+,A1,L
MOVE A1,@WAVE_SHOW,L ;TROG SHOW TO DO THIS WAVE
MOVE *A0+,A1,L
MOVE A1,@WAVE_INSTRUCT,L ;INSTRUCTIONS TO POST THIS WAVE
MOVE *A0+,A1,L
MOVE A1,@WAVE_PSTUFF,L ;HELP SHIT
MOVE *A0+,A1,L
MOVE A1,@EGG_LIST,L ;WHERE TO PUT THE EGGS
MOVE *A0+,A1,L
MOVE A1,@BONE_LIST,L ;WHERE TO PUT THE EGGS
*DON'T SLEEP 'TIL AFTER THE CALL
CALLA GET_CSTR
CALLA G_CRED ;UPDATE THE WAVE DISPLAY
CALLA ISLAND_NUM ;PLOP OUT THE ISLAND NUMBER
MOVE @STORY_MODE,A0,W
JRNZ NO_CLEAR
CALLA CLRP_P0
CALLA CLRP_P1
MOVE @WAVE_SHOW,A8,L ;NO SHOW THIS WAVE
JRZ NO_CLEAR
MOVE @WAVE,A0,W
MOVE @START_WAVE,A1,W
CMP A0,A1 ;DID HE JUST SELECT HIS WAY HERE
JREQ NO_CLEAR ;BR = YES, GIVE NO SHOW
CALLA IAUTOE ;INITIALIZE THE AUTO ERASE AREA
SLEEPK 5
JSRPR A8
NO_CLEAR:
CALLA IAUTOE ;INITIALIZE THE AUTO ERASE AREA
SLEEPK 5
CALLA PAGE0
DISPOFF
CALLA CONSMOVE ;CONSTRUCT THE MOVE TABLES
***** CALLA HOUSE_SEL
MOVE @WAVE_BGND1,@BAKMODS,L
MOVE @WAVE_BGND2,@BAK2MODS,L
CALLA BGND_UD1 ;UPDATE THE BACKGROUNDS
CALLA BGND_UD2
CALLA FGND_OUT
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0 ;ARE WE IN AMODE?
JREQ WS_NODISP ;BR = YES, NO MASTER DISPATCH
CREATE MASTERID,MASTERDP ;CREATE MASTER DISPATCH LAST THING
WS_NODISP
SLEEPK 3 ;WATCH THE SHIT!
MOVI DUXNOFADE,A0
CALLA FADEIN
SLEEPK 1
DISPON
MOVK 1,A0
MOVE A0,@GAMERASE,W ;AUTO ERASE ON
ALLPLYR CLR_PWAVEST ;CLEAR WAVE START FLAG
ALLPLYR CLR_PDINOCNT ;CLEAR THE DINOSAUR COUNTS
ALLPLYR CLR_PDTHPOS ;CLEAR THE LAST DEATH POSITION
ALLPLYR CLR_PBOZO ;NO BOZOS
MOVE @WAVE_WATER,A7,L ;START THE "WATER" CYCLER FOR THIS WAVE
JRZ NO_WATER_CYCLE ;BR = NONE TO START
MOVI INDPID,A1
CALLA GETPRC
NO_WATER_CYCLE:
MOVI 800H,A9
CREATE SKYPID,SKYUP
SOUND1 ALLOFF
SLEEPK 3
SOUND1 VOLUMEF ;MAKE SURE THE VOLUME IS FULL
SLEEPK 3
CALLA HOUSE_SEL ;SELECT A HOUSE
MOVE @WAVE_MUSIC,A0,L ;GET THE MUSIC FOR THIS WAVE
JRZ WAVE_START_NO_M ;BR = NO MUSIC THIS WAVE
CALLA ONESND
WAVE_START_NO_M:
MOVE @GAME_STATE,A0,W ; CHECK IF IN ATTMODE
CMPI INAMODE,A0
JREQ WAVE_START_AMODE
*DO THIS STUFF ONLY WHEN STARTING A WAVE DURING A REAL GAME
MOVE @WAVE_INSTRUCT,A0,L
JRZ WAVE_START_NO_INS
JSRPR A0
WAVE_START_NO_INS:
MOVI INPLAY,A0 ;CAUTION: DO NOT SLEEP AFTER THIS
MOVE A0,@GAME_STATE,W
MOVE @EGG_LIST,A1,L
JRZ WS_EGGRAND
CALLA LAY_EGGS
WS_EGGRAND
MOVE @BONE_LIST,A3,L
CALLA LAY_BONES
CREATE INDPID,PLAYER_ADJUST ;PLAYER ADJUSTMENT PROCESS
CREATE INDPID,TARBAITER ;BAITER WATCH PROCESS
CALLA ALLOT_EGGS ;MAKE THE EGG ALLOTMENT
CREATE INDPID,LAY_MAN ;CREATE THE EGG LAYER
WAVE_START_AMODE:
CALLA COLL_START ;START THE COLLISION ROUTINE
RETP
*
*EXCLUDE THESE PALETTES WHEN FADING UP THE ISLAND
*
DUXNOFADE:
.LONG DUXPAL, RED16, YELLOW16, BLUE16, PINK16, FIXED3, GAMEFIX, 0
MAXDIFF .EQU 10
**************************************************************************
* *
* WAVE_DIFFICULTY - SETUP WAVE DIFFICULTY PARAMETERS *
* USES THE THE GAME ADJUSTMENT ADJDIFF AS THE CURRENT DIFFICULTY *
* *
**************************************************************************
WAVE_DIFFICULTY:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
ADJUST ADJDIFF ;GET MASTER DIFFICULTY
CMPI MAXDIFF,A0
JRLS WDIFF_OK ;BR = DIFFICULTY SETTING IS O.K.
MOVI MAXDIFF,A0 ;INSERT MAXIMUM ALLOWED DIFFICULTY
WDIFF_OK:
MOVE @WAVE,A1,W
MOVE A1,A9
CMPI NWAVES,A1
JRLE WDIFF_PARAMS
**** SUBK NWAVES,A1
MOVI NWAVES,A1 ;STICK AT TOP WAVE
WDIFF_PARAMS:
SLL 4,A1 ;MULTIPLY BY 16
SUBK 5,A0
MOVI WDIFF_RAM_ST,A2
MOVI WAVE_DIFF_TAB,A3
WDIFF_LP:
MOVE A3,A5
MOVE *A5+,A7,W ;GET DIFFICULTY DELTA
MOVE *A5+,A6,W ;GET MIN
MOVE *A5+,A4,W ;GET MAX
**** MOVE *A5,A10,W ;GET THE SINGLE PLAYER ADDER
**** CMPI 4,A9
**** JRHI WDIFF_SPADD
**** CLR A10
****WDIFF_SPADD:
ADD A1,A5
MOVE *A5,A8,W ;GET WAVE VALUE
MPYS A0,A7
ADD A7,A8 ;ADD IN DELTA
**** MOVE @CURPLYRS,A11,W
**** CMPI 1,A11
**** JRHI WDIFF_MANY
**** ADD A10,A8
****WDIFF_MANY:
CMP A8,A6
JRLS WDIFF_MIN ;CHECK FOR MIN
MOVE A6,A8
JRUC WDIFF_MAX
WDIFF_MIN:
CMP A8,A4 ;CHECK FOR MAX
JRHS WDIFF_MAX
MOVE A4,A8
WDIFF_MAX:
MOVE A8,*A2+,W ;STORE IT AWAY
ADDI (NWAVES + 4)*16,A3 ;OFFSET TO NEXT TABLE ENTRY
CMPI WDIFF_RAM_END,A2
JRLO WDIFF_LP ;NOT DONE
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
**************************************************************************
* *
* WAVE_END - JUMP HERE TO END THE WAVE. THIS WILL CHANGE THE GAME_STATE *
* TO INGAME AND HANDLE BONUS STUFF. FINALLY IT WILL INCREMENT *
* WAVE AND CALL WAVE_START TO START THE NEXT WAVE. *
* *
**************************************************************************
WAVE_END:
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0
JAEQ SUCIDE
MOVI INGAME,A0
MOVE A0,@GAME_STATE,W
JSRP WAIT_WAVE_END
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0
JAEQ SUCIDE
**** MOVK 1,A11
**** CREATE FADEPID,FADE_DOWN ;FADE ALL MUSIC DOWN
MOVI SCRNMID,A10
MOVI SCRNMID,A11
MOVI 20,A0
JSRP SCREXP32 ;CLOSE THE CURTAIN
CLR A0
MOVI 0A000h,A1
CALLA KILALL ;KILL ALL BUT THE INDESTRUCTIBLES
CLR A0
MOVE A0,@GAMERASE,W
CALLA AUTOEOFF
DISPOFF
CALLA DMAQWAIT ;WAIT ON ALL TO FINISH
CALLA MYOINIT
DISPON
ALLPLYR CLR_PDINOCNT ;CLEAR THE DINOSAUR COUNTS
ALLPLYR CLR_DRONE ;CLEAR THE DRONE STATUS OF ALL PLAYERS
CALLA SCORAREA ;SHOW THE SCORE
CALLA CLRSNDDB
CALLA CLRP_P0
MOVI PINITIALPID,A0
MOVI 0F8FFH,A1
CALLA EXISTP ;ANY INTIAL ENTRIES STILL AROUND?
JRZ WAVE_END_NORMAL_PRESET ;BR = NO, JUST RESET THE SYSTEM
CLR A0
MOVI 0A000h,A1
CALLA KILALL ;KILL ALL BUT THE INDESTRUCTIBLES
JRUC WAVE_NEXT_NO_PRESET
WAVE_END_NORMAL_PRESET:
MOVI 08000h,A1
MOVE A1,A0
CALLA EXISTP ;ARE THERE INDESTRUCTIBLES?
JRZ WAVE_PINIT ;BR = NO, RE-INITIALIZE THE PROCESSES
CLR A0
CALLA KILALL ;KILL EVERYTHING WE CAN
JRUC WAVE_NEXT
*MAJOR PROCESS SYSTEM RESET HERE
WAVE_PINIT:
MOVE *A13(PROCID),A1,W
CALLA PINIT
MOVI WAVE_NEXT,A7
MOVI STCKST,SP,L ;RESET THE SYSTEM STACK
CALLA GETPRC ;GET THE PROCESS
JAUC EXEC_LP ;AND DO SOME EXEC LOOP SHIT
*NOW CONTINUE TO THE NEXT WAVE
WAVE_NEXT:
*IF ANY PROCESSES NEED TO BE RE-STARTED, DO IT HERE
CALLA COLOR_START ;RE-START THE COLORS AFTER BLOW-OUT
CREATE INDPIDW,SCORPROC ;RE-START UP THE PUSH PLAYER START PROCESS
*ANY PROCESSES THAT NEED TO BE RE-STARTED SHOULD HAVE DONE SO BY NOW
WAVE_NEXT_NO_PRESET:
ALLPLYR CLR_PDEAD ;CLEAR THESE DEAD FLAGS FOR SURE
ALLPLYR INC_PCONSECUTIVE ;INC OR CLR THE CONSECUTIVE WAVE COUNT
MOVI AUDMAXWAVE,A0
CALLA GET_AUD
MOVE @WAVE,A2,W
CMP A1,A2
JRLE WAVE_END_NO_AUD
MOVE A2,A1
CALLA STORE_AUDIT
WAVE_END_NO_AUD:
MOVE @WAVE,A0,W
CMPI LAST_WAVE,A0
JRHS WAVE_LAST_DUDE
INCM @WAVE,W
JSRP WAVE_START ;\ DO NOT SLEEP BETWEEN THESE
ALLPLYR PLAYER_RESTART ;/ TWO CALLS. IT WOULD BE DANGEROUS
ALLPLYR OUTEGGS ;OUT EGG NUMBERS
DIE
WAVE_LAST_DUDE
AUDIT AUDFINISH ;YES WE HAVE FINISHED
JSRP GAME_ENDER
JAUC GAME_OVER
**************************************************************************
* *
* WAIT_WAVE_END - ROUTINE THAT RETURNS WHEN ALL OF THE WAVE END *
* WAIT PROCESSES ARE GONE. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
WAIT_WAVE_END:
PUSHP A11
MOVI 120,A11 ;TIME-OUT FOR BOGUSNESS
WWE_LP
SLEEP 1
MOVI 4000H,A0
MOVE A0,A1
CALLA EXISTP ;WAVE END WAIT PROCESSES?
JRZ WWE_CONT ;BR = NO, THEN START THE PARTY
DSJ A11,WWE_LP
.IF DEBUG
JRUC $
.ENDIF
WWE_CONT:
PULLP A11
RETP
**************************************************************************
* *
* PLAYER_ADJUST - PROCESS TO CONTINUALLY ADJUST CERTAIN VARIABLES *
* ACCORDING TO THE CURRENT NUMBER OF PLAYERS IN THE *
* GAME. *
* *
**************************************************************************
PLAYER_ADJUST
SLEEP 10
MOVE @BONUS_WAVE,A0,W ;ARE WE IN THE BONUS?
JRZ PA_DIE ;BR = NO
MOVE @CURPLYRS,A0,W
MOVE @VIRTUAL_TROGS,A2,W
ADD A0,A2
MOVE A2,@NUM_TROGS,W
JRUC PLAYER_ADJUST
PA_DIE
MOVE @VIRTUAL_TROGS,@NUM_TROGS,W
DIE
*BOZO WATCH CODE COMMENTED OUT 11/1/90 GNP
.IF 0
**************************************************************************
* *
* BOZO_WATCH - PROCESS TO WATCH FOR PLAYERS TO BECOME BOZOS AND *
* THEN SETTING THE PBOZO LEVEL SO THAT THE *
* GAME CAN HELP CURE THIS HATED AFFLICTION. *
* *
**************************************************************************
BOZO_WATCH:
MOVE @WAVETIME,A0,L
CMPI 2000H,A0
JRHI BOZO_WATCH_X ;BR = I CAN ONLY TAKE A BOZO FOR SO LONG!
ALLPLYR BOZO_QUALIFY ;ATTEMPT TO QUALIFY THE PLAYERS
SLOOP 10,BOZO_WATCH ;WHAT A PROCESS!
BOZO_WATCH_X:
ALLPLYR CLR_PBOZO ;NO MORE GIMME'S
DIE
**************************************************************************
* *
* BOZO_QUALIFY - ROUTINE TO DETERMINE IF THE GIVEN PLAYER IS A BOZO. *
* IT WILL SET HIS PBOZO LEVEL ACCORDINGLY. *
* A2 = PTR TO PLAYER DATA STRUCTURE. *
* *
**************************************************************************
BOZO_QUALIFY:
MMTM SP,A0,A1,A3,A4,A5,A6,A7,A8,A9
CLR A4 ;THIS WILL BE BOZO STATUS
MOVE *A2(POBJ),A0,L ;IS HE ALIVE?
JRZ BOZO_QUALIFY_LEVELX ;BR = NO, JUST ZERO BOZO-ISH
MOVE *A2(PDRONEFLG),A0,W
JRNZ BOZO_QUALIFY_LEVELX
MOVE *A2(PWAVEDEATHS),A5,W
MOVE *A2(PEXTRAEARN),A0,W
SUB A0,A5
JRNN BOZO_Q_LADJ
CLR A5 ;EFFECTIVELY IT'S ZERO
BOZO_Q_LADJ:
MOVE A5,A3 ;ADJUSTED WAVE DEATH COUNT
**** MOVI ILIVES,A0
ADJUST ADJLIVES ;GET # OF LIVES FROM CMOS
MOVE A0,A9 ;STORE IT HERE
DIVU A0,A5 ;A5 = NUMBER OF CREDITS THIS WAVE
MOVE *A2(PEGGS),A0,W
MOVE @WAVEEGGS,A6,W
SUB A0,A6 ;A6 = WAVEEGGS - PEGGS
**** MOVE *A2(PWAVEDEATHS),A3,W
MOVE *A2(PWAVEST),A0,W
DIVU A0,A3 ;A3 = PWAVEDEATHS/PWAVEST
MOVE *A2(PLASTEGG),A7,L ;A7 = ELAPSED TIME SINCE LAST EGG
CLR A8 ;BOZO WATCH FLAG
MOVE @MAXBOZO,A0,W
JRZ BOZO_QUALIFY_OFF
MOVE *A2(PCONSECUTIVE),A1,W
CMP A0,A1
JRLE BOZO_QUALIFY_LEVEL1
*
*TIME TO TURN BOZO MODE OFF
BOZO_QUALIFY_OFF:
MOVE @WAVE,A0,W
MOVE *A2(PLASTWIN),A1,W
SUB A1,A0
MOVE @CURPLYRS,A1,W
INC A1
CMP A1,A0 ;IS THIS GUY A REAL LOSER?
JRHS BOZO_QUALIFY_LEVEL1 ;BR = YES, DO A NORMAL BOZO CHECK
MOVK 1,A8
**** ADJUST ADJFREPL ;IF IN FREE PLAY MODE, THEN DON'T
**** JRNZ BOZO_QUALIFY_LEVELX ;FEEL SORRY IF HE'S SPENDING TOO MUCH.
*
*QUALIFY LEVEL 1
*
BOZO_QUALIFY_LEVEL1:
CMPI 1,A5 ;ONE CREDIT SPENT?
JREQ BOZO_LEVEL1 ;BR = YES, HE IS LEVEL ONE
MOVE A8,A8
JRNZ BOZO_QUALIFY_LEVEL2
MOVE *A2(PLASTDTH),A0,L
CMP A7,A0
JRLO BOZO_LEVEL1
CMPI 300H,A7
JRLO BOZO_QUALIFY_LEVEL2
MOVE A6,A6
JRGT BOZO_LEVEL1
CMPI 400H,A7
JRLO BOZO_QUALIFY_LEVEL2
BOZO_LEVEL1:
MOVK 1,A4 ;HE IS AT LEAST A LEVEL 1
*
*QUALIFY LEVEL 2
*
BOZO_QUALIFY_LEVEL2:
CMPI 2,A5 ;TWO CREDITS SPENT?
JREQ BOZO_LEVEL2 ;BR = YES, HE IS LEVEL TWO
MOVE A8,A8
JRNZ BOZO_QUALIFY_LEVEL3
MOVE *A2(PEGGSTHISLIFE),A0,W ;HAS HE PICKED UP ANY EGGS?
JRZ BOZO_QUALIFY_LEVEL2A ;BR = NO, THEN CONTINUE WITH THIS
CMPI 100H,A7
JRLO BOZO_QUALIFY_LEVEL3
BOZO_QUALIFY_LEVEL2A:
*** CMPI ILIVES-2,A3
MOVE A9,A0
SUBK 2,A0
CMP A0,A3
JRLO BOZO_QUALIFY_LEVEL3
MOVE A6,A6
JRGT BOZO_LEVEL2
CMPI 200H,A7
JRLO BOZO_QUALIFY_LEVEL3
BOZO_LEVEL2:
MOVK 2,A4 ;AHH, ANOTHER LEVEL MR. BOND
*
*QUALIFY LEVEL 3 (THIS IS EASY)
*A3 = PWAVEDEATHS/PWAVEST
*
BOZO_QUALIFY_LEVEL3:
CMPI 3,A5 ;THREE CREDITS SPENT?
JREQ BOZO_LEVEL3 ;BR = YES, HE IS LEVEL THREE
MOVE A8,A8
JRNZ BOZO_QUALIFY_LEVEL4
MOVE *A2(PEGGSTHISLIFE),A0,W ;HAS HE PICKED UP ANY EGGS?
JRZ BOZO_QUALIFY_LEVEL3A ;BR = NO, THEN CONTINUE WITH THIS
CMPI 180H,A7
JRLO BOZO_QUALIFY_LEVEL4
BOZO_QUALIFY_LEVEL3A:
**** CMPI ILIVES-1,A3
MOVE A9,A0
SUBK 1,A0
CMP A0,A3
JRLO BOZO_QUALIFY_LEVEL4
MOVE A6,A6
JRGT BOZO_LEVEL3
CMPI 300H,A7
JRLO BOZO_QUALIFY_LEVEL4
BOZO_LEVEL3:
MOVK 3,A4
*
*QUALIFY LEVEL 4 - SUPER BOZO
*
BOZO_QUALIFY_LEVEL4:
CMPI 3,A5 ;MORE THAN THREE CREDITS SPENT?
JRHI BOZO_LEVEL4 ;BR = YES, HE IS LEVEL FOUR
MOVE @WAVE,A0,W
MOVE *A2(PLASTWIN),A1,W
SUB A1,A0
CMPI 5,A0
JRLS BOZO_QUALIFY_LEVELX
MOVE *A2(PCONSECUTIVE),A1,W
CMPI 5,A1
JRHI BOZO_QUALIFY_LEVELX
BOZO_LEVEL4:
MOVK 4,A4 ;HE'S THE BIGGEST BOZO OF THEM ALL
BOZO_QUALIFY_LEVELX:
MOVE A4,*A2(PBOZO),W
MOVI AUDMAXBOZO,A0
CALLA GET_AUD
CMP A1,A4
JRLE BOZO_NO_AUD
MOVE A4,A1
CALLA STORE_AUDIT
BOZO_NO_AUD:
*** CALLA OUTBOZO
MMFM SP,A0,A1,A3,A4,A5,A6,A7,A8,A9
RETS
.ENDIF
**************************************************************************
* *
* GAME_OVER - THE GAME OVER PROCESS, JUMP HERE FROM CURRENT PROCESS. *
* IT WILL TAKE CONTROL. *
* A11 = PTR TO PLAYER ENDING THIS GAME *
* *
**************************************************************************
GAME_OVER
MOVE @WAVE,A1,W ; SET THE AVERAGE WAVE NUMBER
CALLA SET_AVGWAVE
.IF PRINTER
CALLA PGAMEEND
.ENDIF
CLR A1
MOVE A1,@GAMEUNITS,W ; CLEAR IT OUT FOR NEXT TIME
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0 ;ALREADY IN GAME OVER?
JREQ GO_SKIP_SND ;BR = YES, THEN NO SOUND
MOVI INGAMEOV,A0
MOVE A0,@GAME_STATE,W ;SET STATE
SOUND1 GAMEO_SND ;AND MAKE SOUND
GO_SKIP_SND
JSRP GAMEOTEXT ;OUTPUT THE TEXT FOR GAME OVER
SLEEP 4
MOVE A11,A2
SLEEP 195
GO_INIT_WAIT:
MOVI PINITIALPID,A0
MOVI 0F8FFH,A1
CALLA EXISTP ;ARE THERE ANY INITIAL PROCESSES?
JRZ GO_CONTINUE ;BR = NO
SLOOP 10,GO_INIT_WAIT
GO_CONTINUE:
CALLA EMPTY_HSHOLD ; EMPTY OUT HS HOLDING AREA
MOVE @IRQSKYE,A9,W
JRZ GO_SKIP_SKY
MOVI 2000H,A9
CREATE SKYPID,SKYDOWN
GO_SKIP_SKY
SLEEP 1
PUSHP A11 ;STORE THE ENDING PLAYER DATA
MOVI SCRNMID,A10
MOVE A10,A11
MOVK 16,A0
JSRP SCREXP32 ;SCREEN DOWN
CLR A0
MOVE A0,@IRQSKYE,W ;JUST IN CASE SKYDOWN DIDN'T MAKE IT
CLR A0
MOVI 0A000h,A1
CALLA KILALL ;WHACK-A-MOLE
CALLA MYOINIT
MOVK 1,A0
MOVE A0,@GAMERASE,W
SLEEP 2
CLR A0
MOVE A0,@GAMERASE,W
CALLA AUTOEOFF
PULLP A11
**** JSRP GAME_STATS ;SHOW ME THE STATS, NOW!
MOVI 08000h,A1
MOVE A1,A0
CALLA EXISTP ;ARE THERE INDESTRUCTIBLES?
JRZ GAMEO_PINIT ;BR = NO, RE-INITIALIZE THE PROCESSES
CALLA WIPEOUT
JRUC GAMEO_NEXT
*MAJOR PROCESS SYSTEM RESET HERE
GAMEO_PINIT:
CALLA WIPEOUT
MOVE *A13(PROCID),A1,W
CALLA PINIT
MOVI GAMEO_NEXT,A7
MOVI STCKST,SP,L ;RESET THE SYSTEM STACK
CALLA GETPRC ;GET THE PROCESS
JAUC EXEC_LP ;AND DO SOME EXEC LOOP SHIT
*NOW CONTINUE TO THE NEXT WAVE
GAMEO_NEXT:
*GET INTO ATTRACT MODE
MOVI INAMODE,A1
MOVE A1,@GAME_STATE,W
CREATE INDPID,ATT_MODE_GAME_OVER
DIE
GAMEO_SND .WORD >F3F0,>130,>8001,0 ;GAME OVER SOUND
*
*ALLOCATE SOME RAM FOR STRINGS AND WINS
.BSS STAT_COUNT,16
.BSS STAT_WINS,16
.BSS STAT_SCORE,32
.IF 0
**************************************************************************
* *
* GAME_STATS - PRINT OUT THE GAME STATISTICS SCREEN(S) *
* A11 = PTR TO PLAYER THAT ENDED THE GAME *
* DISPLAY CONDITIONS: *
* - DISPLAY SYSTEM ON *
* - AUTO-ERASE OFF *
* - PLAYFIELD AREA CLEARED *
* NOTE: CALL WITH JSRP *
* DESTROYS PTEMP1 AND PTEMP2 *
* *
**************************************************************************
GAME_STATS:
MOVE A11,*A13(PTEMP2),L
MOVE @P1DATA+PWINS,A8,W
MOVI P1NAME,A4
MOVE @P2DATA+PWINS,A9,W
MOVI P2NAME,A5
MOVE @P3DATA+PWINS,A10,W
MOVI P3NAME,A6
MOVE @P4DATA+PWINS,A11,W
MOVI P4NAME,A7
MOVE @P1DATA+PSCORE,B0,L
MOVE @P2DATA+PSCORE,B1,L
MOVE @P3DATA+PSCORE,B2,L
MOVE @P4DATA+PSCORE,B3,L
MOVK 3,A1 ;BUBBLE SORT THE WINS
COMP_STAT_LP:
CMP A11,A10
JRHI COMP_STAT1
JRLO COMP_SWAP1
CMP B3,B2 ;EQUAL ON WINS, CHECK SCORES
JRHS COMP_STAT1 ;BR = SONG REMAINS THE SAME
COMP_SWAP1:
SWAP A11,A10
SWAP A7,A6
SWAP B3,B2
COMP_STAT1:
CMP A10,A9
JRHI COMP_STAT2
JRLO COMP_SWAP2
CMP B2,B1 ;EQUAL ON WINS, CHECK SCORES
JRHS COMP_STAT2 ;BR = KEEP THEM THE SAME
COMP_SWAP2:
SWAP A10,A9
SWAP A6,A5
SWAP B2,B1
COMP_STAT2:
CMP A9,A8
JRHI COMP_STAT3
JRLO COMP_SWAP3 ;SWAP IMMEADIATELY IF THEY ARE REVERSED
CMP B1,B0 ;EQUAL ON WINS, CHECK SCORES
JRHS COMP_STAT3 ;BR = KEEP IT IN THE SAME ORDER
COMP_SWAP3:
SWAP A9,A8
SWAP A5,A4
SWAP B1,B0
COMP_STAT3:
DSJ A1,COMP_STAT_LP
CLR A1
MOVE A1,@STAT_COUNT,W ;CLEAR THE WINNER COUNT
MOVE A11,A11 ;CHECK FOURTH PLACE WINS
JRZ NO_FOURTH
INCM @STAT_COUNT,W
MMTM A12,A7,A11 ;STACK EVERYBODY CORRECTLY
NO_FOURTH:
MOVE A10,A10 ;CHECK THIRD PLACE WINS
JRZ NO_THIRD
INCM @STAT_COUNT,W
MMTM A12,A6,A10
NO_THIRD:
MOVE A9,A9 ;CHECK SECOND PLACE
JRZ NO_SECOND ;BR = THE BUCK STOPS HERE
INCM @STAT_COUNT,W
MMTM A12,A5,A9
NO_SECOND:
MOVE A8,A8 ;CHECK FIRST PLACE
JRZ NO_WINNERS ;BR = NOT ONE WINNER, YUK!
INCM @STAT_COUNT,W
MOVE @STAT_COUNT,A1,W
CMPI 1,A1 ;DID MORE THAN ONE PLAYER WIN?
JRLS NO_WINNERS ;BR = NO
MOVE A4,@STRING1,L ;PRINT THE WINNER
MOVE A8,@STAT_WINS,W
MOVE B0,@STAT_SCORE,L ;STORE THE WINNERS SCORE
CMPI 1,A8
JRNE STAT_WIN_S
MOVI SUFFIX_NULL,A1
JRUC STAT_PRINT_WINNER
STAT_WIN_S:
MOVI SUFFIX_S,A1
STAT_PRINT_WINNER:
MOVE A1,@STRING3,L
MOVK 1,A0
MOVE A0,@GAMERASE,W ;AUTO ERASE ON
MOVE @STRING1,A1,L ;FIND THE WINNERS DATA AREA
CLR A0
MOVI PNAME_TAB,A2
STAT_NEXT_NAME:
MOVE *A2+,A3,L
JRZ STAT_NAME_FND ;JUST USE THE LAST, WE DIDN'T FIND ONE
CMP A3,A1
JREQ STAT_NAME_FND
INC A0
JRUC STAT_NEXT_NAME
STAT_NAME_FND:
CALLR GPLAYD ;GET HIS DATA AREA FROM THIS
MOVE A2,A11
CREATE GOODIEPID,STAT_WORKS
PUSHP A11
MOVI STAT_WIN,A8
JSRP LM_PRINTF
PULLP A11
MOVI [115,85],A10 ;PUT THAT MARQUEE HERE
CREATE INDPID,BORDER_MARQUEE
SOUND1 BLOWHARD_SND
SLEEP 20
SOUND1 CHAMPM_SND
SOUNDOFF
STAT_BORDER_FAIL:
MOVI STAT_WIN2,A8
JSRP LM_PRINTF
DECM @STAT_COUNT,W
JRLE STAT_DONE
MOVI [170+SKYTOPOF,115],A9
MOVE A9,*A13(PTEMP1),L
SLEEP 100
STAT_PRINT_LP:
MMFM A12,A4,A8
JSRP STAT_SUB
MOVE @STAT_COUNT,A1,W
JRNZ STAT_PRINT_LP
STAT_DONE:
SLEEP 180
NO_WINNERS:
SLEEP 20
RETP
*
*GAME_STATS SUBROUTINE
*A4 = PTR TO PLAYER NAME, 0 = PLAYER DIDN'T EXIST
*A8 = WIN COUNT
**A13(PTEMP1),L = LAST PRINT POSITION
STAT_SUB:
MOVE A4,A4
JRZ STAT_SUB_X
MOVE A4,@STRING1,L
MOVE A8,@STAT_WINS,W
CMPI 1,A8
JRNE STAT_SUB_S ;BR = SUFFIX S FOR ALL COUNTS BUT 1
MOVI SUFFIX_NULL,A4
JRUC STAT_SUB_P
STAT_SUB_S:
MOVI SUFFIX_S,A4
STAT_SUB_P:
MOVE A4,@STRING3,L
MOVI STAT_WON,A8
CALLA LM_SETUP
MOVE *A13(PTEMP1),A9,L
ADDI [12,0],A9 ;RESET FOR THE NEXT LINE
MOVE A9,*A13(PTEMP1),L
JSRP PRINTF
DECM @STAT_COUNT,W ;DECREMENT THE STAT COUNT
STAT_SUB_X:
RETP
STAT_WIN:
MESS_MAC RD20FONT,2,197,15+SKYTOPOF,01010000H,STRCNRMO,0
.STRING "%p\a!\a\n\bThe Champ\a!",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
STAT_WIN2:
MESS_MAC RD15FONT,2,197,87+SKYTOPOF,01010101H,STRCNRMO,0
.STRING "with \b%d\b win%p\n"
.STRING "and a score of\d\b\n"
.STRING "%,lb",0
.WORD 0F0FH
.LONG STAT_WINS
.WORD 0101H
.LONG STRING3
.LONG RD20FONT
.WORD 0F0FH
.LONG STAT_SCORE
STAT_WON:
MESS_MAC RD7FONT,2,115,167+SKYTOPOF,02020000H,STRLNRMO,0
.STRING "%p \p\bfinished with \b%d\b win%p\a.\a"
.STRING 0
.LONG STRING1
.LONG RED16
.WORD 0101H
.WORD 0F0FH
.LONG STAT_WINS
.WORD 0101H
.LONG STRING3
.WORD 15
.WORD 0
.EVEN
BLOWHARD_SND:
.WORD >F0F0,>5D,>8051,0 ;BIG HARD BANG!
.ENDIF
SUFFIX_S:
.STRING "s"
SUFFIX_NULL
.STRING 0
.EVEN
*
*MUSIC FOR CHAMP
CHAMPM_SND:
.WORD >F2F0,>34,>8009,0 ;CHAMPION TUNE
**************************************************************************
* *
* GAMEOTEXT - PROCESS SUBROUTINE TO OUTPUT THE GAME OVER MESSAGE, AND *
* WAIT FOR READABILITIES SAKE. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
GAMEOTEXT:
MMTM A12,A8,A9,A10,A11
MOVI GAMEOMESS,A8
JSRP LM_PRINTF
MOVI TEXTOID,A0
MOVI GAMEOVEROID,A1
CALLA CHANGOID
MMFM A12,A8,A9,A10,A11
RETP
GAMEOMESS:
MESS_MAC RD20FONT,2,197,83+SKYTOPOF,0F0F0101H,STRCNRMOS,0
.STRING "Game Over",0
.EVEN
**************************************************************************
* *
* CLRALLPD - CLEAR ALL PLAYER DATA AREAS *
* *
**************************************************************************
CLRALLPD
MMTM SP,A2,A7
**** ALLPLYR CLRPLYRD
MOVI P1DATA,A2
CALLR CLRPLYRD
MOVI P2DATA,A2
CALLR CLRPLYRD
MOVI P3DATA,A2
CALLR CLRPLYRD
MOVI P4DATA,A2
CALLR CLRPLYRD
MMFM SP,A2,A7
RETS
.BSS CALLPRAM,16,1 ;STORAGE FOR PLAYER CALLS
**************************************************************************
* *
* CALLPLAY - CALL A ROUTINE ON ALL ALLOWED PLAYERS. *
* A7 = ROUTINE ADDRESS *
* NOTE: SENDS PLAYER DATA AREA IN A2 *
* DESTROYS A14 *
* *
**************************************************************************
CALLPLAY
PUSH A2
MOVE @NPLAYERS,@CALLPRAM,W
MOVI P1DATA,A2
CALLPL
CALL A7
ADDI PDSIZE,A2
DECM @CALLPRAM,W
JRNN CALLPL
PULL A2
RETS
**************************************************************************
* *
* CLRPLYRD - CLEAR THE PLAYER DATA AREA OF IT'S STATUS *
* A2 = PLAYER DATA AREA *
* *
**************************************************************************
CLRPLYRD
MMTM SP,A0,A1,A3,A4,A5,A6
CLR A0
MOVE A2,A1
MOVI PDSIZE,A3
SRL 5,A3
JRNC CLRPD1 ;BR = EVENLY DIVISIBLE BY 32
MOVE A0,*A1+,W ;KNOCK OFF ODD MAN
MOVE A3,A3
CLRPD1
JRZ CLRPD2
CLRPDL
MOVE A0,*A1+,L ;CLEAR THE WHOLE BLOCK
DSJS A3,CLRPDL
CLRPD2
CMPI P1DATA,A2
JRNE CLRPD3
; MOVI P1SCRAD,A0
MOVI P1PID,A1
MOVI REXINIT,A3
MOVI royicon,A4
MOVI P1BARS,A5
JRUC CLRPD4
CLRPD3
CMPI P2DATA,A2
JRNE CLRPD3A
; MOVI P2SCRAD,A0
MOVI P2PID,A1
MOVI BLOOPINIT,A3
MOVI bloopicon,A4
MOVI P2BARS,A5
JRUC CLRPD4
CLRPD3A
CMPI P3DATA,A2
JRNE CLRPD3B
; MOVI P3SCRAD,A0
MOVI P3PID,A1
MOVI ELVISINIT,A3
MOVI stegicon,A4
MOVI P3BARS,A5
JRUC CLRPD4
CLRPD3B
; MOVI P4SCRAD,A0
MOVI P4PID,A1
MOVI SPIKEINIT,A3
MOVI spikeicon,A4
MOVI P4BARS,A5
CLRPD4
MOVE @NPLAYERS,A0,W
SLL 7,A0 ; * 128
ADDI PSCTAB,A0
MOVE A0,A6 ; SAVE BASE TABLE OFFSET
CALLA GPLAYNUM
SLL 5,A0
ADD A6,A0 ; TABLE PLUS REFERENCE
MOVE *A0,A0,L ; ACTUAL SCREEN ADDRESS
MOVE A0,*A2(PSCRAD),L
MOVE A1,*A2(PPID),W
MOVE A3,*A2(PINITAB),L
MOVE A4,*A2(PLICON),L
MOVE A5,*A2(PSUPP),L
MOVE *A3(INITIMG),A3,L ;LET'S FIND THE PLAYER PALETTE I.D.
MOVE *A3(ICMAP),A3,L
MOVE A3,*A2(PPALID),L
*DO THESE THINGS TO ALL PLAYERS ALIKE
MOVI IREPLAY,A0
MOVE A0,*A2(PNEXTREP),L
MMFM SP,A0,A1,A3,A4,A5,A6
RETS
PSCTAB .LONG P11SCRAD,0,0,0 ; 1 PLAYER
.LONG P21SCRAD,P22SCRAD,0,0 ; 2 PLAYERS
.LONG P31SCRAD,P32SCRAD,P33SCRAD,0 ; 3 PLAYERS
.LONG P41SCRAD,P42SCRAD,P43SCRAD,P44SCRAD ; 4 PLAYERS
**************************************************************************
* *
* CLR_PENTER - CLEAR THE PLAYERS PENTER FLAG *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PENTER:
PUSH A0
CLR A0
MOVE A0,*A2(PENTER),W
PULL A0
RETS
**************************************************************************
* *
* CLR_PWAVEST - CLEAR THE PLAYERS PWAVEST COUNTER *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PWAVEST:
PUSH A0
CLR A0
MOVE A0,*A2(PWAVEST),W
PULL A0
RETS
**************************************************************************
* *
* CLR_PDEAD - CLEAR THE PLAYERS PDEAD FLAG *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PDEAD:
MMTM SP,A0,A1
MOVE *A2(PPID),A0,W
ORI PINITIALPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ CLR_PDEAD_X
CLR A0
MOVE A0,*A2(PDEAD),W
CLR_PDEAD_X:
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* CLR_PDINOCNT - CLEAR THE PLAYERS PDINOCNT COUNTER *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PDINOCNT:
PUSH A0
CLR A0
MOVE A0,*A2(PDINOCNT),W
PULL A0
RETS
**************************************************************************
* *
* CLR_PDTHPOS - CLEAR THE PLAYERS PDTHPOS VARIABLE *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PDTHPOS:
PUSH A0
CLR A0
MOVE A0,*A2(PDTHPOS),L
PULL A0
RETS
**************************************************************************
* *
* CLR_PBOZO - CLEAR THE PLAYERS BOZO LEVEL *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PBOZO:
PUSH A0
CLR A0
MOVE A0,*A2(PBOZO),W
PULL A0
RETS
**************************************************************************
* *
* CLR_PEXTRAS - CLEAR THE PLAYERS EXTRA MENABILITY. *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
CLR_PEXTRAS:
PUSH A0
CLR A0
MOVE A0,*A2(PEXTRAS),W
PULL A0
RETS
**************************************************************************
* *
* INC_PLAYER_TIMERS - INCREMENT PLAYER TIMERS *
* A0 = AMOUNT TO INCREMENT *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* NOTE: TRASHES A14 *
* *
**************************************************************************
INC_PLAYER_TIMERS:
MOVE *A2(POBJ),A14,L
JRZ INC_PTX ;INCREMENT ONLY IF HE'S ALIVE
ADDRM A0,*A2(PLASTEGG),L
ADDRM A0,*A2(PLASTDTH),L
ADDRM A0,*A2(PWAVETIME),L
INC_PTX:
RETS
**************************************************************************
* *
* INC_PCONSECUTIVE - INCREMENT OR CLEAR THE CONSECUTIVE PLAY COUNTER FOR *
* THIS PLAYER. *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* NOTE: TRASHES A14 *
* *
**************************************************************************
INC_PCONSECUTIVE:
MOVE *A2(PWAVEST),A14,W
JRNZ INC_PCONS
MOVE *A2(PCONSECUTIVE),A14,W
JRZ INC_PCONS_X
DEC A14 ;DEC THE MAN WHO DID NOT PLAY
MOVE A14,*A2(PCONSECUTIVE),W
**** CLRM *A2(PCONSECUTIVE),W
JRUC INC_PCONS_X
INC_PCONS:
INCM *A2(PCONSECUTIVE),W
INCM *A2(PWAVES),W ;INCREMENT TOTAL WAVE COUNTER
INC_PCONS_X:
RETS
**************************************************************************
* *
* STUFF_PLASTWIN - PUT A VALUE INTO THE PLAYER PLASTWIN VARIABLE *
* A0 = VALUE *
* A2 = PLAYER DATA *
* NOTE: TRASHES A14 *
* *
**************************************************************************
STUFF_PLASTWIN:
MOVE *A2(PWAVEST),A14,W
JRZ STUFF_PLW_X
MOVE A0,*A2(PLASTWIN),W
STUFF_PLW_X:
RETS
**************************************************************************
* *
* GPLAYNUM - GET THE PLAYER'S # (0-3), BASED ON PxDATA ADDRESS. *
* A2 = PLAYER DATA BLOCK *
* RETURNS: *
* A0 = PLAYER # *
* *
**************************************************************************
GPLAYNUM
CMPI P4DATA,A2
JRNE GPN1
MOVK 3,A0
RETS
GPN1
CMPI P3DATA,A2
JRNE GPN2
MOVK 2,A0
RETS
GPN2
CMPI P2DATA,A2
JRNE GPN3
MOVK 1,A0
RETS
GPN3
CLR A0
RETS
**************************************************************************
* *
* GPLAYD - GET THE PLAYERS DATA AREA BASED ON HIS #. *
* A0 = PLAYER # *
* RETURNS: *
* A2 = PLAYER DATA AREA *
* *
**************************************************************************
GPLAYD
MOVE A0,A2
SLL 5,A2
ADDI PDTAB,A2
MOVE *A2,A2,L
RETS
PDTAB .LONG P1DATA,P2DATA,P3DATA,P4DATA
**************************************************************************
* *
* WAVE_PLAYERS - RETURN THE NUMBER OF PLAYERS THAT PLAYED THIS WAVE. *
* RETURNS: *
* A0 = # OF PLAYERS THIS WAVE *
* *
**************************************************************************
WAVE_PLAYERS:
MMTM SP,A1,A2,A3
CLR A0
MOVE @NPLAYERS,A1,W
MOVI P1DATA,A2
WAVE_P_LP:
MOVE *A2(PWAVEST),A3,W
JRZ WAVE_P_NXT
INC A0
WAVE_P_NXT:
ADDI PDSIZE,A2
DEC A1
JRNN WAVE_P_LP
MMFM SP,A1,A2,A3
RETS
**************************************************************************
* *
* WIPEOUT - WIPES THE SYSTEM CLEAR OF ALL OTHER PROCESSES, OBJECTS *
* AND COORDINATES. *
* IT RETURNS WITH THE DISPLAY SYSTEM AND AUTO-ERASE SHUT OFF, *
* COLOR RAM CLEARED, AND THE BIT MAP WIPED CLEAN. *
* THIS IS NICE TO USE WHEN SWITCHING BETWEEN STUFF. *
* ALSO, NULLS POBJ IN BOTH PLAYERS, SO DON'T USE THIS *
* DURING GAME PLAY! *
* *
**************************************************************************
WIPEOUT
MMTM SP,A0,A1
CLR A0
** MOVE A0,@P1CTRL,W
** MOVE A0,@P2CTRL,W ;CLEAR PLAYER CPU CONTROLS
MOVE A0,@P1DATA+POBJ,L
MOVE A0,@P2DATA+POBJ,L
MOVE A0,@P3DATA+POBJ,L
MOVE A0,@P4DATA+POBJ,L
** MOVE A0,@PLAYPAGE,W ;CLEAR THE ATTRACT MODE PLAY PAGE
MOVE A0,@PAGE,W
MOVE A0,@COINFLAG,W ; NOT ON COIN PAGE YET
MOVE A0,@PAUSE_GAME,W ;TURN OFF GAME PAUSE
MOVE A0,@STORY_MODE,W ; TURN OFF STORY MODE
MOVE A0,@ON_HSTD,W ; NOT ON HIGH SCORE PAGE
MOVE A0,@ON_CRED,W ; NOT ON CREDITS PAGE
MOVI 08000h,A1
CLR A0
CALLA KILALL ;KILL ALL PROCS, EXCEPT FOR COINS
** CLR A0
** MOVE A0,@SOUNDSUP,W ;MAKE SURE SOUNDS ARE ALLOWED
CALLA CLRSNDDB ;RESET THE SOUND DATA BASE
CLR A0
MOVE A0,@GAMERASE,W
CALLA AUTOEOFF
CLR A0
MOVE A0,@DISPLAYON,W ;TURN THE DISPLAY PROCESSOR OFF
CALLA DMAQWAIT
PUSHST
DINT
CALLA CLRSWPRC
CALLA MYOINIT ;RE-INIT THE OBJECT LIST
CALLR SYSINITL
POPST
CALLA SYNCFULL ;NOW WAIT FOR VBLANK TO ZAP CMAP
CALLA CLR_SCRN ;WIPE OUT THE BIT MAP
CALLA IAUTOE ;INITIALIZE THE AUTO ERASE AREA
CLR A0
MOVE A0,@IRQSKYE,W ;CLR THE AUTO-ERASE COLOR
MOVI NORMDPYS,A0
MOVE A0,@DPYSTRT,W ;RESET DISPLAY START POINT
MOVI SCOREINT,A0
MOVE A0,@SINTRAM,W
MOVI HSINT,A0
MOVE A0,@HSINTRAM,W
CALLA COLOR_START ;RE-START THE COLOR CYCLER
MMFM SP,A0,A1
RETS
FREEZE_SW .EQU 8
FREEZE_DIP .EQU 9
**************************************************************************
* *
* FREEZE - PROCESS TO FREEZE THE GAME ACTION WHEN THE FREEZE BUTTON *
* GOES FROM OFF TO ON. GAME RESUMES WHEN THE BUTTON IS RELEASED. *
* *
**************************************************************************
FREEZE
MOVE @GAME_STATE,A0
CMPI INDIAG,A0
JREQ FREEZE_DIE ;NO FREEZE SHIT DURING DIAGNOSTICS
CALLA SYNCHALF
MOVE @NOAUTOE,A8,W
MOVK 1,A0
MOVE A0,@NOAUTOE,W
CALLA AUTOEOFF ;SHUT OFF AUTO-ERASE
DISPOFF
CALLA DMAQWAIT ;BLOW OUT THE QUEUE'D IMAGES
PUSHST
DINT
CALLR WDOGDIS
FREEZE_LP:
MOVE @COINS,A0,W ;GET THE COIN DOOR SWITCHES
BTST FREEZE_SW,A0
JREQ FREEZE_LP ;LOOP 'TIL BUTTON COMES UP
.IF YUNIT
MOVE @DIPSWITCH,A0,W
BTST FREEZE_DIP,A0
JREQ FREEZE_LP
.ENDIF
POPST
MOVE A8,@NOAUTOE,W
DISPON
FREEZE_DIE:
DIE
**************************************************************************
* *
* SLEEP_SWITCHX - SLEEP THE GIVEN NUMBER OF TICKS ESCAPING IF *
* A CONTROL PANEL BUTTON IS PRESSED. USE THIS *
* TO SLEEP DURING LENGTHY INTRO SCREENS. *
* A0 = # OF TICKS TO SLEEP *
* RETURNS: *
* Z = NO ESCAPE SWITCH DETECTED DURING SLEEP *
* NZ = ESCAPE SWITCH DETECTED *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
SLEEP_SWITCHX:
PUSHP A11
MOVE A0,A11
CLRM @SWITCH_ESCAPE,W
SLEEP_SWITCHX_LP:
SLEEP 1
MOVE @SWITCH_ESCAPE,A0,W
JRNE SLEEP_SWITCHX_ESC
DSJS A11,SLEEP_SWITCHX_LP
SETZ ;ALL IS WELL
SLEEP_SWITCHX_X
PULLP A11
RETP
SLEEP_SWITCHX_ESC:
CLRZ ;FLAG THE ESCAPE
JRUC SLEEP_SWITCHX_X
**************************************************************************
* *
* CLRSWPRC - MAKE ALL SWITCH TRIGGERED PROCESSES DUMDIE ENTRIES *
* NOTE: CALL WHEN INTERRUPTS ARE TURNED OFF *
* *
**************************************************************************
CLRSWPRC
MMTM SP,A0,A1,A3
MOVI 40,A1 ;USE SWTAB ENTRY 40 FOR DUMDIE PROC
MOVE @SWSTACK,A3,L
CLRSTKL CMPI SWSTST,A3,L ;STACK AT START?
JREQ CLRSTKX ;YES, EXIT
MOVE *A3+,A0,W
CMPI 63,A0
JRLS CLRSTKL ;THIS ENTRY IS A REAL SWITCH
MOVE A1,*A3(-10H),W ;STORE THE DUMDIE CALL
JRUC CLRSTKL
CLRSTKX
MMFM SP,A0,A1,A3
RETS
**************************************************************************
* *
* WDOGDIS - WATCH DOG DISABLE *
* NOTE: CALL WHILE INTERRUPTS ARE TURNED OFF. *
* *
**************************************************************************
WDOGDIS
MMTM SP,A0,A1,A2,A3
MOVI WDISTAB,A1
MOVK 1,A3
MOVE @SYSCOPY,A2,W
MOVE *A1+,A0,W
WDOGSL
OR A2,A0
MOVE A0,@SYSCTRL,W
XOR A3,A0
MOVE A0,@SYSCTRL,W
MOVE *A1+,A0,W
JRNN WDOGSL
MOVE A2,@SYSCTRL,W
MMFM SP,A0,A1,A2,A3
RETS
*
*WATCH DOG DISABLE TABLE
WDISTAB
.WORD 0
.WORD 0
.WORD 0
.WORD 0
.WORD 2
.WORD 0
.WORD 2
.WORD 0
.WORD 0FFFFH
**************************************************************************
* *
* CLSCRACH - CLEAR SCRATCH PAD *
* NOTE: DESTROYS A0,A1,A2,A3 *
* *
**************************************************************************
CLSCRACH
PULL A3
*CLEAR SCRATCHPAD RAM
CLR A0
MOVI SCRATCH,A1,L
MOVI >8000,A2,L ;CLEAR TWO AT A TIME
SCTLP MOVE A0,*A1+,L
DSJS A2,SCTLP
JUMP A3
**************************************************************************
* *
* SYSTEM ROUTINES AND PROCESSES *
* *
**************************************************************************
*NARC RAM INITIALIZATION
NRAMINIT
MMTM SP,A0,A1,A2
MOVI NRAMSTRT,A1
MOVI NRAMEND,A2
JRUC RAMINIT
*GAME RAM INITIALIZATION
GRAMINIT
MMTM SP,A0,A1,A2
MOVI GRAMSTRT,A1
MOVI GRAMEND,A2
JRUC RAMINIT
*WAVE RAM INITIALIZATION
WRAMINIT
MMTM SP,A0,A1,A2
MOVI WRAMSTRT,A1
MOVI WRAMEND,A2
RAMINIT
CLR A0
RAMLOOP
MOVE A0,*A1+,W ;16 BITS AT A TIME, NO EXTRANEOUS CLEARS
CMP A2,A1 ;DONE?
JRLO RAMLOOP ;NO!
MMFM SP,A0,A1,A2
RETS
**************************************************************************
* *
* SYSINITL - INITIALIZE LOW BYTE OF SYSTEM CONTROL REGISTER *
* *
**************************************************************************
SYSINITL
MMTM SP,A0,A1
MOVE @SYSCOPY,A0,W
MOVI SYSCINIT,A1
SLL 24,A1
SRL 24,A1
OR A1,A0
.IF YUNIT
ORI 700H,A0 ; SET A NOP
.ENDIF
MOVE A0,@SYSCOPY,W ;RE-INITIALIZE SYSTEM CONTROL REG
MOVE A0,@SYSCTRL,W
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* DIRQ - DISPLAY IRQ, USES THE VALUE STORE @DPYINT TO DETERMINE *
* WHICH INTERRUPT THIS IS, HALF OR FULL SCREEN. @DPYINT IS *
* COMPARED AGAINST THE CONSTANT HSINT. *
* *
**************************************************************************
DIRQ
MMTM SP,A0,A1
SETF 16,1,0 ;WORD SIGN EXTEND
MOVE @INTPEND,A1,W ;CLEAR STUPID INTERRUPT PENDING
ANDNI DIE,A1
MOVE A1,@INTPEND,W
MOVE @INTENB,A1,W ;DISABLE DISPLAY INTERRUPT
ANDNI DIE,A1
MOVE A1,@INTENB,W
MOVE @DPYINT,A0 ;CHECK WHAT SCREEN HALF
MOVE @SINTRAM,A1,W ;GET THE LAST SCORE AREA INTERRUPT
CMP A1,A0
JREQ DIRQ2 ;BR = END OF SCORE AREA INTERRUPT
EINT ;ENABLE OTHER INTERRUPTS
**** CMPI HSINT,A0
MOVE @HSINTRAM,A1,W ;GET THE LAST HALF SCREEN INTERRUPT
CMP A1,A0 ;IS THIS IT?
JRNE DIRQ1 ;BR = NO, MUST BE END OF SCREEN INTERRUPT
**************************************************************************
* *
* DIRQ0 - HALF SCREEN INTERRUPT. TOP HALF OBJECTS ARE UPDATED, *
* OBJECT VELOCITIES ARE ADDED, SWITCHES FOR PLAYER MOVEMENT ARE *
* SCANNED, AND PLAYERS ARE UPDATED. *
* *
**************************************************************************
DIRQ0
MMTM SP,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
MMTM SP,B0,B1,B2,B3,B4,B5
MOVI EOSINT,A1 ;SET FOR EOSCRN INTERRUPT
MOVE A1,@DPYINT
MOVE @TIMER,A1 ;HIT PROCESS TIMER
INC A1
MOVE A1,@TIMER
MOVE @INTSYNC0,A0,W
INC A0
MOVE A0,@INTSYNC0,W ;SYNC AT HALF SCREEN
MOVE @GAMERASE,A0,W
CMPI 2,A0
JRNE DIRQ0NEO ;BR = NOT THE CORRECT PLACE TO TURN OFF
MOVE @SYSCOPY,A0,W
ORI AUTOERAS,A0 ;DISABLE AUTO ERASE
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
MOVE A0,@SYSCTRL,W
DIRQ0NEO
CALLA DISPQT
DIRQ0E
CALLR SWSCAN ;SCAN SWITCHES TO TRIGGER PROCS.
CALLA DISPLAY ;GOT TO MAKE THE DONUTS
JRUC DIRQX
**************************************************************************
* *
* DIRQ1 - END OF SCREEN INTERRUPT ROUTINE. BOTTOM HALF OF SCREEN UPDATED *
* COLOR RAM IS CYCLED, AND SWITCHES ARE SCANNED. *
* *
**************************************************************************
DIRQ1
MMTM SP,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
MMTM SP,B0,B1,B2,B3,B4,B5
MOVE @GAMERASE,A0,W
JREQ DIRQ1NEO ;AUTO-ERASE IS NOT ENABLED!
CMPI 3,A0 ;ARE WE ERASING THE FULL SCREEN
JRNE DIRQ1AEOFF ;BR = NO
MOVE @NOAUTOE,A0,W ;AUTO-ERASE DISABLED?
JRNE DIRQ1AEOFF ;BR = YES
MOVE @SYSCOPY,A0,W
ANDNI AUTOERAS,A0 ;ENABLE AUTO-ERASE NOW!
JRUC DIRQ1AEST ;JUMP TO STORE
DIRQ1AEOFF
MOVE @SYSCOPY,A0,W ;ALWAYS TURN OFF HERE JUST FOR YUKS
ORI AUTOERAS,A0 ;DISABLE AUTO ERASE
DIRQ1AEST
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
MOVE A0,@SYSCTRL,W
DIRQ1NEO
MOVE @IRQSKYE,@ERASELOC,W ;MOVE IN THE CORRECT COLOR
MOVI SCOREINT,A0
MOVE @DPYSTRT,A1,W
SRA 4,A1
NOT A1
SUB A1,A0
MOVE A0,@SINTRAM,W ;KEEP THE LAST ONE HERE
JRNN DIRQ1B ;BR = THIS IS AN O.K. INTERRUPT
MOVI ENDVBLNK,A0
MOVE A0,@SINTRAM,W
DIRQ1B
MOVE A0,@DPYINT ;RESET FOR SCORE AREA INTERRUPT
MOVE @DPYCTL,A0,W ;SHIFT REGISTER READ TO RESTART DMA
ORI SRT,A0
MOVE A0,@DPYCTL,W ;ENABLE SHIFT REG TRANSFER TO STOP DMA HALT
CLR A1
PIXT *A1,A2
ANDNI SRT,A0
MOVE A0,@DPYCTL,W
CALLA DISPH ;CALL END OF SCREEN DISPLAY ROUTINE
*
*UPDATE NORMAL CYCLING COLOR RAM
MOVI COLRTEMP+COLROFFST,A0 ;GET NEW COLORS
MOVI CYCOLORS+COLROFFST,A1 ;GET ADDRESS OF CYCLE COLORS
MOVK COLRCNT,A6
SRL 1,A6 ;DIVIDE BY 2
JRNC COLORUP ;BR = NO ODD DUDE
MOVE *A0+,*A1+,W ;XFER THE ODD MAN
COLORUP
MOVE *A0+,*A1+,L
DSJS A6,COLORUP
*
*UPDATE PLAYER CYCLING COLOR RAM
MOVI PCYCLE_RAM,A0 ;GET NEW COLORS
MOVI PCYCOLORS+PCOLROFFST,A1 ;GET ADDRESS OF CYCLE COLORS
MOVK PCOLRCNT,A6
SRL 1,A6 ;DIVIDE BY 2
JRNC PCOLORUP ;BR = NO ODD DUDE
MOVE *A0+,*A1+,W ;XFER THE ODD MAN
PCOLORUP
MOVE *A0+,*A1+,L
DSJS A6,PCOLORUP
CALLA PALTRANS ;XFER NEW PALETTES IF NECESSARY
CALLA COININT ; HANDLE SOME COINS!
DINT
MOVE @INTENB,A0,W ;ENABLE DISPLAY INTERRUPT
ORI DIE,A0
MOVE A0,@INTENB,W
MOVE @INTSYNC1,A0,W
INC A0
MOVE A0,@INTSYNC1,W ;SYNC UP AT END OF SCREEN
CALLR SWSCAN ;SCAN SWITCHES TO TRIGGER PROCS.
MOVE @IRQLED,A0,W
INC A0
MOVE A0,@IRQLED,W
CMPI 8,A0
JRLT DIRQX
*
*DO EVERYTHING FROM HERE TO DIRQX EVERY 8 TICKS
*
CLR A0
MOVE A0,@IRQLED,W
MOVE @SYSCOPY,A0,W ;BLINK L.E.D. TO ACK OPERATION
.IF YUNIT
XORI 0004H,A0
.ELSE
XORI 100H,A0
.ENDIF
MOVE A0,@SYSCOPY,W
MOVE A0,@SYSCTRL,W
DIRQX:
MMFM SP,B0,B1,B2,B3,B4,B5
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
RETI
*
*WATCHDOG FEED TABLE
WDOGBONE
.WORD 0
.WORD 2
.WORD 0
.WORD 2
.WORD 2
.WORD 0FFFFH
**************************************************************************
* *
* END OF SCORE AREA INTERRUPT, USED TO TURN AUTO-ERASE ON, ONLY DURING *
* GAME PLAY. *
* ALL INTERRUPTS ARE DISABLED SO THAT THE AUTO-ERASE ON COMMAND *
* CAN BE EXECUTED PROMPTLY. *
* YOU MUST DO AN EINT DIRECTLY AFTER AUTO-ERASE IS ENABLED TO *
* KEEP THE DMA RUNNING. *
* NOTE: ONLY REGISTER A0 AND A1 ARE PUSHED AT THIS POINT! *
* *
**************************************************************************
DIRQ2:
MOVE @GAMERASE,A0,W
JREQ DIRQ2A ;DON'T ENABLE AUTOERASE
MOVE @NOAUTOE,A0,W
JRNE DIRQ2A
MOVE @SYSCOPY,A0,W
ANDNI AUTOERAS,A0 ;AUTO ERASE IS ENABLED LOW
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
MOVE A0,@SYSCTRL,W
DIRQ2A:
EINT ;ENABLE OTHER INTERRUPTS
**** MOVI HSINT,A0
**** MOVE A0,@DPYINT ;RESET FOR HALF SCREEN INTERRUPT
MOVI HSINT,A0
MOVE @DPYSTRT,A1,W
SRA 4,A1
NOT A1
ADD A1,A0
MOVE A0,@HSINTRAM,W ;KEEP THE LAST ONE HERE
JRNN DIRQ2B ;BR = THIS IS AN O.K. INTERRUPT
MOVI ENDVBLNK,A0 ;FAIL SAFE
MOVE A0,@HSINTRAM,W
DIRQ2B:
MOVE A0,@DPYINT,W ;RESET FOR HALF SCREEN INTERRUPT
DINT
MOVE @INTENB,A0,W ;ENABLE DISPLAY INTERRUPT
ORI DIE,A0
MOVE A0,@INTENB,W
MMFM SP,A0,A1
RETI
*
*SWITCHES SCANNED HERE WILL ACTIVATE THE PROCESSES IN THE SWITCH PROCESS
*TABLE.
*BASHES A0,A1,A2 & A3 SO BEWARE!
SWSCAN:
MOVE @SWITCH,A0,L
MOVE @SWTEMP1,A1,L ;PREVIOUS STATE T=N-1
MOVE @SWTEMP2,A2,L ;PREVIOUS PREVIOUS T=N-2
MOVE A1,@SWTEMP2,L ;NEW PREVIOUS PREVIOUS
MOVE A0,@SWTEMP1,L ;NEW PREVIOUS
AND A1,A2
ANDN A0,A2 ;LOOK FOR 110
JREQ SWITCH2_CHECK ;NO SWITCHES
MOVE @SWSTACK,A3,L ;SWITCH ACTIVATION STACK
SWSCLP: ;FIND BIT SET
CMPI SWSTMN,A3 ;SWITCH STACK OVERFLOW?
JREQ SWSCX1 ;YEP, QUIT
LMO A2,A0 ;1'S COMP LEFTMOST BIT
RL A0,A2 ;GET RID OF BIT
SLL 1,A2
MOVK 31,A1 ;CALC TRUE BIT #
SUB A0,A1
MOVE A1,-*A3 ;PUSH SWITCH NUMBER ON STACK (0-15)
RL A1,A2 ;RESTORE SWITCH WORD WITHOUT BIT
JRNE SWSCLP
SWSCX1:
MOVE A3,@SWSTACK,L ;RESTORE SWITCH STACK
*
SWITCH2_CHECK:
MOVE @SWITCH2,A0,L
ORI 0000FF00H,A0
MOVE @SW2TEMP1,A1,L ;PREVIOUS STATE T=N-1
MOVE @SW2TEMP2,A2,L ;PREVIOUS PREVIOUS T=N-2
MOVE A1,@SW2TEMP2,L ;NEW PREVIOUS PREVIOUS
MOVE A0,@SW2TEMP1,L ;NEW PREVIOUS
AND A1,A2
ANDN A0,A2 ;LOOK FOR 110
JREQ SWSCX ;NO SWITCHES
MOVE @SWSTACK,A3,L ;SWITCH ACTIVATION STACK
SW2SCLP: ;FIND BIT SET
CMPI SWSTMN,A3 ;SWITCH STACK OVERFLOW?
JREQ SW2SCX1 ;YEP, QUIT
LMO A2,A0 ;1'S COMP LEFTMOST BIT
RL A0,A2 ;GET RID OF BIT
SLL 1,A2
MOVI 63,A1
SUB A0,A1
MOVE A1,-*A3 ;PUSH SWITCH NUMBER ON STACK (0-15)
RL A1,A2 ;RESTORE SWITCH WORD WITHOUT BIT
JRNE SW2SCLP
SW2SCX1:
MOVE A3,@SWSTACK,L ;RESTORE SWITCH STACK
SWSCX:
RETS
**************************************************************************
* *
* INITIO - INITIALIZE THE GSP I/O REGISTERS *
* *
**************************************************************************
INITIO
MMTM SP,B0,B2,B10
*INITIALIZE I/O
MOVI HESYNC,B2,L
MOVI INITDATA,B0,L
MOVI (IDATAEND-INITDATA)/16,B10
INITIOS:
MOVE *B0+,*B2+
DSJS B10,INITIOS
MMFM SP,B0,B2,B10
RETS
*
*DUMMY FOR THE SWITCHES
DUMDIE JAUC SUCIDE ;NOTHING PROCESS
**************************************************************************
* *
* BADTRAP - COME HERE WHEN A TRAP IS HIT THAT IS NOT DEFINED AND LOG IT. *
* *
**************************************************************************
BADTRAP
LOCKUP
DINT
JRUC $ ;LET THE WATCH DOG CATCH US
**************************************************************************
* *
* SWITCH PROCESS ACTIVATION TABLE FOR JAMMA COMPATIBLE TROG *
* FOR JOYSTICKS THE PROCID IS THE FLAG LOCATION. *
* *
**************************************************************************
SWTAB:
.WORD P1PID|PUP|0 ;PROCESS ID SWITCH 0 -- PLAYER 1 UP
.LONG PJOY ;STARTING ADDR
.WORD P1PID|PDOWN|1 ;PROCESS ID SWITCH 1 -- PLAYER 1 DOWN
.LONG PJOY ;STARTING ADDR
.WORD P1PID|PLEFT|2 ;PROCESS ID SWITCH 2 -- PLAYER 1 LEFT
.LONG PJOY ;STARTING ADDR
.WORD P1PID|PRIGHT|3 ;PROCESS ID SWITCH 3 -- PLAYER 1 RIGHT
.LONG PJOY ;STARTING ADDR
.WORD P1PID|PDRAWPID ;PROCESS ID SWITCH 4 -- PLAYER 1 DRAW
.LONG PDRAW ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 5 -- SWITCH 5 NOT USED
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 6 -- SWITCH 6 NOT USED
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 7 -- SWITCH 7 NOT USED
.LONG 0 ;STARTING ADDR
.WORD P2PID|PUP|8 ;PROCESS ID SWITCH 8 -- PLAYER 2 UP
.LONG PJOY ;STARTING ADDR
.WORD P2PID|PDOWN|9 ;PROCESS ID SWITCH 9 -- PLAYER 2 DOWN
.LONG PJOY ;STARTING ADDR
.WORD P2PID|PLEFT|10 ;PROCESS ID SWITCH 10 -- PLAYER 2 LEFT
.LONG PJOY ;STARTING ADDR
.WORD P2PID|PRIGHT|11 ;PROCESS ID SWITCH 11 -- PLAYER 2 RIGHT
.LONG PJOY ;STARTING ADDR
.WORD P2PID|PDRAWPID ;PROCESS ID SWITCH 12 -- PLAYER 2 DRAW
.LONG PDRAW ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 13 -- SWITCH 13 NOT USED
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 14 -- SWITCH 14 NOT USED
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 15 -- SWITCH 15 NOT USED
.LONG 0 ;STARTING ADDR
.WORD LC_PID ;PROCESS ID SWITCH 16 -- LEFT COIN
.LONG LCOIN ;STARTING ADDR
.WORD RC_PID ;PROCESS ID SWITCH 17 -- RIGHT COIN
.LONG RCOIN ;STARTING ADDR
.WORD P1PID|PSTRTPID ;PROCESS ID SWITCH 18 -- PLAYER 1 START
.LONG PLAYER_START ;STARTING ADDR
.WORD SLAM_PID ;PROCESS ID SWITCH 19 -- SLAM
.LONG SLAM ;STARTING ADDR
.WORD DIAG_PID ;PROCESS ID SWITCH 20 -- SWITCH 20 -- DIAG!
.LONG DIAG ;STARTING ADDR
.WORD P2PID|PSTRTPID ;PROCESS ID SWITCH 21 -- PLAYER 2 START
.LONG PLAYER_START ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 22 -- SERVICE CREDIT
.LONG SCOIN ;STARTING ADDR
.WORD CC_PID ;PROCESS ID SWITCH 23 -- CENTER COIN
.LONG CCOIN ;STARTING ADDR
.WORD INDPIDW ;PROCESS ID SWITCH 24 -- FREEZE SWITCH
.LONG FREEZE ;STARTING ADDR
.WORD P3PID|PSTRTPID ;PROCESS ID SWITCH 25 -- PLAYER 3 START
.LONG PLAYER_START ;STARTING ADDR
.WORD P4PID|PSTRTPID ;PROCESS ID SWITCH 26 -- PLAYER 4 START
.LONG PLAYER_START ;STARTING ADDR
.WORD P3PID|PUP|27 ;PROCESS ID SWITCH 27 -- PLAYER 3 UP
.LONG PJOY ;STARTING ADDR
.WORD P3PID|PDOWN|28 ;PROCESS ID SWITCH 28 -- PLAYER 3 DOWN
.LONG PJOY ;STARTING ADDR
.WORD P3PID|PLEFT|29 ;PROCESS ID SWITCH 29 -- PLAYER 3 LEFT
.LONG PJOY ;STARTING ADDR
.WORD P3PID|PRIGHT|30 ;PROCESS ID SWITCH 30 -- PLAYER 3 RIGHT
.LONG PJOY ;STARTING ADDR
.WORD P3PID|PDRAWPID ;PROCESS ID SWITCH 31 -- PLAYER 3 DRAW
.LONG PDRAW ;STARTING ADDR
.WORD P4PID|PUP|32 ;PROCESS ID SWITCH 32 -- PLAYER 4 UP
.LONG PJOY ;STARTING ADDR
.WORD P4PID|PDOWN|33 ;PROCESS ID SWITCH 33 -- PLAYER 4 DOWN
.LONG PJOY ;STARTING ADDR
.WORD P4PID|PLEFT|34 ;PROCESS ID SWITCH 34 -- PLAYER 4 LEFT
.LONG PJOY ;STARTING ADDR
.WORD P4PID|PRIGHT|35 ;PROCESS ID SWITCH 35 -- PLAYER 4 RIGHT
.LONG PJOY ;STARTING ADDR
.WORD P4PID|PDRAWPID ;PROCESS ID SWITCH 36 -- PLAYER 4 DRAW
.LONG PDRAW ;STARTING ADDR
.WORD XC_PID ;PROCESS ID SWITCH 37 -- FOURTH COIN
.LONG XCOIN ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 38 -- SWITCH 38
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 39 -- SWITCH 39
.LONG 0 ;STARTING ADDR END OF CONNECTOR INPUTS
.WORD 0606H ;PROCESS ID SWITCH 40 -- SWITCH 40 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR THIS IS CLRSWPRC DEFALUT
.WORD 0606H ;PROCESS ID SWITCH 41 -- SWITCH 41 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 42 -- SWITCH 42 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 43 -- SWITCH 43 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 44 -- SWITCH 44 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 45 -- SWITCH 45 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 46 -- SWITCH 46 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 47 -- SWITCH 47 (NON-EXISTANT)
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 48 -- SWITCH 48 DS1-8
.LONG 0 ;STARTING ADDR *** START OF DIPSWITCHES ***
.WORD 0606H ;PROCESS ID SWITCH 49 -- SWITCH 49 DS1-7
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 50 -- SWITCH 50 DS1-6
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 51 -- SWITCH 51 DS1-5
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 52 -- SWITCH 52 DS1-4
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 53 -- SWITCH 53 DS1-3
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 54 -- SWITCH 54 DS1-2
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 55 -- SWITCH 55 DS1-1
.LONG 0 ;STARTING ADDR
.IF YUNIT
.WORD DIAG_PID ;PROCESS ID SWITCH 56 -- DS2-8, TEST SWITCH
.LONG DIAG ;STARTING ADDR
.ELSE
.WORD 0606H ;PROCESS ID SWITCH 56 -- SWITCH 56 DS2-8
.LONG 0 ;STARTING ADDR
.ENDIF
.IF YUNIT
.WORD INDPIDW ;PROCESS ID SWITCH 57 -- DS2-7, VIDEO FREEZE
.LONG FREEZE ;STARTING ADDR
.ELSE
.WORD 0606H ;PROCESS ID SWITCH 57 -- SWITCH 57 DS2-7
.LONG 0 ;STARTING ADDR
.ENDIF
.WORD 0606H ;PROCESS ID SWITCH 58 -- SWITCH 58 DS2-6
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 59 -- SWITCH 59 DS2-5
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 60 -- SWITCH 60 DS2-4
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 61 -- SWITCH 61 DS2-3
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 62 -- SWITCH 62 DS2-2
.LONG 0 ;STARTING ADDR
.WORD 0606H ;PROCESS ID SWITCH 63 -- SWITCH 63 DS2-1
.LONG 0 ;STARTING ADDR
*TV PATCH AREA
.BSS TVPATCH,30*16 ;PATCHLAND FOR TV
.BSS TVPATCHX,0
* VIDEO CONTROL REGISTERS INITIAL VALUES
INITDATA:
.IF NTSC
.WORD >0015 ;>C0000000 -- hesync
.WORD >002d ;>C0000010 -- heblnk
.WORD >00f3 ;>C0000020 -- hsblnk
.WORD >00fc ;>C0000030 -- htotal
.WORD 0003H ;>C0000040 -- VESYNC
.WORD ENDVBLNK ;>C0000050 -- VEBLNK
.WORD 0E0H+ENDVBLNK ;>C0000060 -- VSBLNK
.WORD 0109H ;>C0000070 -- VTOTAL
.ELSE
.WORD >0015 ;>C0000000 -- hesync
.WORD >002d ;>C0000010 -- heblnk
.WORD >00f3 ;>C0000020 -- hsblnk
.WORD >00fc ;>C0000030 -- htotal
.WORD 0003H ;>C0000040 -- VESYNC
.WORD ENDVBLNK ;>C0000050 -- VEBLNK
.WORD 0100H+ENDVBLNK ;>C0000060 -- VSBLNK
.WORD 0120H ;>C0000070 -- VTOTAL
.ENDIF
.WORD 0F010H ;>C0000080 -- DPYCTL
.WORD NORMDPYS ;>C0000090 -- dpystrt
.WORD HSINT ;>C00000A0 -- dpyint (HALF SCREEN)
.WORD INI_CTRL ;>C00000B0 -- control
.WORD 00h ;>C00000C0 -- hstdata
.WORD 00h ;>C00000D0 -- hstadrl
.WORD 00h ;>C00000E0 -- hstadrh
.WORD 00h ;>C00000F0 -- hstctll
.WORD 00h ;>C0000100 -- hstctlh
.WORD 00h ;>C0000110 -- intenbl
.WORD 00h ;>C0000120 -- intpend
.WORD 00h ;>C0000130 -- convsp
.WORD 00h ;>C0000140 -- convdp
.WORD PXSIZE ;>C0000150 -- psize
.WORD 00h ;>C0000160 -- pmask
.WORD 00h ;>C0000170 -- RESERVED
.WORD 00h ;>C0000180 -- RESERVED
.WORD 00h ;>C0000190 -- RESERVED
.WORD 00h ;>C00001A0 -- RESERVED
.WORD 00h ;>C00001B0 -- DPYTAP
IDATAEND:
IDATALEN EQU (IDATAEND-INITDATA)/16
*
*INITIALIZE ALL 32 TRAP VECTORS
*
.SECT "VECTORS"
.LONG BADTRAP ;TRAP 31
.LONG BADTRAP ;TRAP 30 ILLOP --- Illegal Opcode
.LONG BADTRAP ;TRAP 29
.LONG BADTRAP ;TRAP 28
.LONG BADTRAP ;TRAP 27
.LONG BADTRAP ;TRAP 26
.LONG BADTRAP ;TRAP 25
.LONG BADTRAP ;TRAP 24
.LONG BADTRAP ;TRAP 23
.LONG BADTRAP ;TRAP 22
.LONG BADTRAP ;TRAP 21
.LONG BADTRAP ;TRAP 20
.LONG BADTRAP ;TRAP 19
.LONG BADTRAP ;TRAP 18
.LONG BADTRAP ;TRAP 17
.LONG BADTRAP ;TRAP 16
.LONG BADTRAP ;TRAP 15
.LONG BADTRAP ;TRAP 14
.LONG BADTRAP ;TRAP 13
.LONG BADTRAP ;TRAP 12
.LONG BADTRAP ;TRAP 11 WV --- Window Violation
.LONG DIRQ ;TRAP 10 DI --- Display Interrupt
.LONG BADTRAP ;TRAP 9 HI --- Host Interrupt
.LONG BADTRAP ;TRAP 8 NMI -- NonMaskable Interrupt
.LONG BADTRAP ;TRAP 7
.LONG BADTRAP ;TRAP 6
.LONG BADTRAP ;TRAP 5
.LONG BADTRAP ;TRAP 4
.LONG BADTRAP ;TRAP 3
.LONG BADTRAP ;TRAP 2 INT2 --- External Interrupt 2
.LONG DMAINT ;TRAP 1 INT1 --- External Interrupt 1
.LONG POWERUP ;TRAP 0 Reset
.END