nba-jam-tournament-edition/AUDIT.ASM

3475 lines
74 KiB
NASM
Raw Normal View History

2021-04-06 14:57:20 -07:00
**************************************************************
*
* Software: LARRY DEMAR and DR. J
* Initiated: ?
*
* Modified: Shawn Liptak, 9/6/91 -SLEEPK (Total carnage)
* Shawn Liptak, 11/1/91 -Clean up
* Shawn Liptak, 2/11/91 -Started basketball
* Shawn Liptak, 11/6/92 -L_TIMER clean up
* GEORGE PETRO, 1/17/93 -NBA JAM
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 3/19/93 13:08
**************************************************************
.file "audit.asm"
.title "audits and ajustments handling"
.width 132
.option b,d,l,t
.mnolist
.include "mproc.equ" ;mproc equates
.include "disp.equ" ;display proc. equates
.include "sys.equ" ;z unit system equates
.include "gsp.equ"
.include "imgtbl.glo"
.include "game.equ"
.include "link.equ" ;link equates
.include "menu.equ" ;menu equates
.include "audit.equ"
.include "shawn.hdr" ;Macros
.include "mac2.asm"
.include "imgtbl.glo"
.include "bgndtbl.glo"
* BAD_AUD - ANYTIME AN AUDIT NUMBER IS FETCHED, IF ITS
* CHECKSUM IS BAD, THEN BAD_AUD GETS SET TO 1
* THIS CAUSES "ERROR" IF ANY AUDIT IN A CALCULATION
* IS CORRUPTED, AND KEEPS A BAD CHECKSUM BAD WHEN
* AN AUDIT IS CHANGED.
.BSS BAD_AUD ,16 ;(BAD_AUD...NOT BAD_DOG!)
.bss playtimer ,16 ;timer units for game
.BSS C_FRAC ,16 ;TIME 10 SECONDS TO
;INDICATE COIN ACTIVITY
.BSS C_FLAGS ,3*32 ;INTERRUPT COIN BOUNCE
.BSS COINCNTR ,32 ;MECH COIN COUNTER TIMERS AND COUNTS
COINCNT1 .EQU COINCNTR
COINCNT2 .EQU COINCNTR+8
* TIMERS 1,2:B16-23,B24-B31; COUNTS 1,2 B0-B7;B8-B15
.BSS OCT_FLG,16 ;!0=Did 1st part
* IN THIS MODULE
; .def ADD_DUMP
.def ADJ_PAGE
.def BAD_AUD
.def C_FRAC,COINCNTR
.def C_FLAGS
.def L_MESS,AUD,AUD1,GET_ADJ
.def GET_AUD,SLAM_SW,STORE_AUDIT
.def CAT_A0
.def CCCC
.def CK_MAX
; .def CLRSWPRC
.def CLR_AUD,FAC_SET
.def CLR_AUDR
; .def CLR_SUBS
.def CMOS_VAL
.def COIN_PAG
; .def COINIRQ
.def CR_STRTP
.def CR_CONTP
.def CRD_SCRN
.def CRED_P
.def DEF_PAGE
; .def DUMP_FS
.def FORM_ADC
.def F_ADC_S
.def GET_CREDITS
.def GET_CSTR
.def HTOHXASC
; .def KILL_CRD
.def L_TIMER
.def LD_CTAB
.def LM_SETUP
.def LM_FINIS
.def NO_CREDS
.def P_START
.def P_CONT
.def PUT_ADJ
.def ROM_NAME
.def STRCAT
.def UNIT_CLR
.def WAIT_MUT
.DEF KILL_AUD
.def CCOIN,RCOIN,SERVICE,XCOIN,LCOIN
.ref osgemd_ascii,sgmd8_ascii,ogmd10_ascii,lgmd_ascii
.ref mess_cursx,mess_cursy
.ref mess_line_spacing
.ref message_palette
.ref print_message,setup_message
.ref print_string_C,print_string_C2
.ref dec_to_asc
.ref copy_string,copy_rom_string
.ref concat_string,concat_rom_string
.ref BAKMODS
.ref KILBGND
.ref BGND_UD1
.ref COLRTEMP
.REF COUNTER_MODE
.GLOBAL SYNCHALF,WDOGDIS,GAMSTATE
.REF IRQSKYE
.ref dpageflip_off
.ref WFLG,BTIME
.REF PSTATUS,WRLD
;sounds
.ref coin_snd,beep2_snd
* IN HSTD.ASM
.REF SET_PAGE
.REF P_FORK
.REF DEC_HSR,INIT_HSR
.REF RC_BYTEI
.REF RC_BYTE
.REF RC_WORD
.REF RC_LONG
.REF RC_LONGI
.REF WC_BYTE
.REF WC_BYTEI
.REF WC_WORD
.REF WC_WORDI
.REF WC_LONG
.REF WC_LONGI
* IN MENU.ASM
.REF GET_CSPT
.REF STR_OBJ
.REF STR_FREE
.REF CKPROMPT
.REF TWO_TS,TWO_TP
.REF BUILD_ST
.REF HID_P
.REF DIAG
.REF CS_ENTS
* IN ROBOATT.ASM
.REF WIPEOUT
* IN TEST.ASM
; .REF CK_DOOR
; .REF WT_ADV,WW_ADV
.REF WAIT_BUT
.REF FORM_SWS
.ref opmsg_clr
* OTHERS
.ref TWOPLAYERS ;0 = NO, 1 = YES 2 players
; .ref plyr_strtb1,plyr_strtb2
.ref conttimers
.ref dirqtimer
.ref SOUNDSUP
.ref RD15FONT,RD7FONT,dmaq_wait,STRCNRM
.ref STRNGRAM,BLNKAREA,STRLNRM,HEXTOASC
.ref CLR_SCRN
.ref KILALL
.ref GETPRC,SUCIDE
.ref amode_start
.ref dpageflip
.ref snd_play1ovr
.ref update_scorebrd
*gnp
.ref TAMPEREDP
*gnp
.text
**************************************************************************
*
* COIN HANDLING
*
**************************************************************************
**************************************************************************
*
* L_TIMER
*
* THIS IS CALLED EACH TICK THROUGH THE EXEC LOOP
* BEFORE TIMER IS CLEARED. IT DOES NOTHING
* IF THE GAME IS NOT IN PLAY, ELSE IT ADDS
* THE EXEC TIME TO THE 1 PLAYER OR 2 PLAYER
* TIMER BASED ON CURRENT NUMBER OF PEOPLE PLAYING.
*
**************************************************************************
FIVE_SEC equ TSEC*5
L_TIMER
move @GAMSTATE,a0
jrn douptime ;In diagnostics?
subk INAMODE,a0
jreq CK_OCTO ;ATTRACT MODE..CHECK OCTOPUS!
subk INGAMEOV-INAMODE,a0
jreq douptime
move @dirqtimer,a1 ;get elapsed time
move @playtimer,a0 ;get play timer
sub a1,a0 ;add elapsed time
jrgt #not5 ;Under 5 seconds?
move @PSTATUS,a2
jrz audup
movi AUD_1PLAYTIME-1,a0
movk 4,b0
#plp srl 1,a2
jrnc #nop
addk 1,a0 ;+1 plyr
#nop dsj b0,#plp
callr AUD1
movi AUD_PLTIME,a0
callr AUD1
audup
movi AUD_UPTIME,a0
callr AUD1
movi FIVE_SEC,a0
#not5 move a0,@playtimer
rets
********************************
douptime
move @dirqtimer,a1 ;get elapsed time
move @playtimer,a0 ;get play timer
sub a1,a0 ;add elapsed time
jrle audup ;Under 5 seconds?
move a0,@playtimer
rets
#*******************************
* ITS A-MODE...CHECK OCTOPUS!
CK_OCTO
move @SWITCH,a0
not a0
andi >7f7f,a0 ;Get sticks 'n starts
move @OCT_FLG,a1
jrgt #p2 ;Got part one?
cmpi >7171,a0 ;P1&P2 all buts down & both sticks up
jrne #x ;Wrong?
movi TSEC,a1 ;One sec to get part two
#p2
subk 1,a1
move a1,@OCT_FLG
jrgt #x ;Still counting?
cmpi >202,a0
jrne #x ;Wrong?
movi ACTIVE,a13
movi HID_P,a7 ;Start the process!
movi DIAG_PID,a1
calla GETPRC
; movi MAW,A0
; calla snd_play1
#x jruc douptime
;MAW .WORD >F9F7,>50,>814A,0 ;OH MAW
#*******************************
* Give him a service credit
SERVICE
move @GAMSTATE,a0
jrn #x ;In diagnostics?
callr CCCC ;MAKE SURE THINGS ARE IN TACT
movk AUDSERV,a0
callr AUD1 ;CHALK UP A SERVICE CREDITS!
callr getcoin
movk 10,a0
move a0,@BTIME ;Restuff buyin timer
callr conttimers_set
callr GET_CREDITS
addk 1,a0 ;Add in the new ones
callr PUT_CREDITS ;NOW STORE EM BACK (ENFORCE MAX)
callr FORM_COIN_CKSUM_AND_STORE
calla update_scorebrd ;redraw scoreboard credits message
jruc CREDSP
#x DIE
********************************
* THE FOLLOWING COIN ROUTINES ARE PROCESSES!
LCOIN MOVK ADJLMULT,A8 ;CMOS RAM ADJUST
MOVI LC_FLAG,A10 ;LEFT COIN FLAG
MOVI AUDLCOIN,A11 ;AUDIT NUMBER
JRUC VALID_COIN
CCOIN MOVK ADJCMULT,A8
MOVI CC_FLAG,A10 ;CENTER COIN FLAG
MOVI AUDCCOIN,A11
JRUC VALID_COIN
RCOIN MOVK ADJRMULT,A8
MOVI RC_FLAG,A10 ;RYTE COIN FLAG
MOVI AUDRCOIN,A11
JRUC VALID_COIN
XCOIN MOVK ADJXMULT,A8
MOVI XC_FLAG,A10 ;XTRA (FOURTH) COIN FLAG
MOVI AUDXCOIN,A11
JRUC VALID_COIN
;
; COIN CONTROL EQUATES
;
LC_FLAG .EQU C_FLAGS ;UHB LEFT COIN
RC_FLAG .EQU C_FLAGS+8 ;UHB RGT "
CC_FLAG .EQU C_FLAGS+16 ;UHB CNTR "
XC_FLAG .EQU C_FLAGS+24 ;UHB XTRA "
;
; VALID_COIN- CHECK THE DURATION OF COIN DROP AND SEES IF IT IS A VALID
; ENTRY
;PARAMS REQUIRED:
; A8 = MULTIPLIER FOR THAT SWITCH.
; A10 = RAM TIMER/FLAG
; A11 = BASE AUDIT NUMBER
VALID_COIN
move @GAMSTATE,a0
jrn CRX ;In diagnostics?
MOVE A8,A0 ;MOVE MULTIPLIER ADJUST NUMBER TO A0
CALLA GET_ADJ ;FETCH IT
MOVE A0,A8 ;AND BACK TO STATIC REG...ANY THERE?
JRZ CRX ;NOPE....DON'T WASTE THE TIME!
CALLR SLAM_P ;SLAM AROUND?
JRNZ CRX ;THEN NO ACTION
MOVI LC_PID,A0 ;ALL 4 SLOTS USE THIS ID NOW
MOVE A0,*A13(PROCID) ;SET OUR ID (IN CASE TABLE IS WRONG)
; movb *a10,a0 ;get flag byte
; jrz #fok
; LOCKUP
;#fok
MOVB *A10,A0 ;GET FLAG BYTE
JRNZ CRX ;SOMEONE ELSE THERE...WE'RE A BOUNCE!
;OK....THIS IS A NEW POSITIVE EDGE....START THE DROP TIMING
movk 5,a0 ;Wait a few ticks
movb a0,*a10
COIN_LOOP
SLEEPK 1 ;SLEEP TILL WE GET SUCCESS OR FAIL
MOVB *A10,A0 ;GET THE TIMER
JRGT COIN_LOOP
CALLR SLAM_P ;SLAM?
JRNZ CRX ;THEN WE'RE OUT OF HERE
; 1/2 SECOND HAS PASSED WITHOUT A SLAM....INDICATE COIN DROP
CLR A0
MOVE A0,@SOUNDSUP ;TURN SOUNDS ON. (A-MODE SOUND SUPRESSOR)
callr getcoin
MOVK 20,A0
MOVE A0,@BTIME ;RESTUFF BUYIN TIMER
callr conttimers_set
MOVI 15*40H/8,A0 ;DON'T WIPE ON GAME OVER IF ITS WITHIN
MOVE A0,@C_FRAC ;15 SECONDS (THIS TIMES OUT TO OVER 20)
MOVE A11,A0
CALLR AUD1 ;CHALK THE DIRECT AUDIT
*HIT THE MECHANICAL COIN COUNTERS
MOVE @COUNTER_MODE,A0,W
; MOVK ADJCNTR,A0
; CALLA GET_ADJ
CMPI 1,A0
JRNE MECH20
*MULTIPLE OF LEAST VALUE COIN MODE
CALLA GET_CSPT ;POINT TO COIN TABLE A6
MOVK 4,A1 ;CHECK ALL CHUTES
ADDI CS_LVAL,A6 ;ADD IN OFFSET TO CHUTE VALUES
MOVE A6,A5 ;SAVE A6
CLR A2
NOT A2
MECH1L
MOVE *A5+,A0 ;FIND LOWEST NON-ZERO NUMBER IN LIST
JRZ MECH_SKIPZ
CMP A2,A0
JRHI MECH_SKIPZ
MOVE A0,A2 ;A NEW LOW!
MECH_SKIPZ
DSJS A1,MECH1L
MOVE A2,A2
JRZ MECH10 ;SOMETHING ILLEGAL HAPPENED, JUST ONE
DEC A11 ;GET YOUR CLICK COUNT
SLL 4,A11 ;OFFSET FOR CHUTE, WORD CORRECT
ADD A11,A6
MOVE *A6,A1 ;GET MONEY VALUE
JRZ MECH10 ;WIERDNESS, JUST ONE CLICK
DIVU A2,A1 ;DIVIDE BY LOWEST COMMON DENOMINATOR
MOVE A1,A2 ;RESULT TO KEEP COMPAT
MOVI COINCNT1,A1
JRUC MECH3B
MECH10
MOVK 2,A0 ;VALUE OVER 10, JUST GIVE ONE CLICK
MECH20
MOVI COINCNT1,A1
CMPI 2,A0
JREQ MECH3A ;CLICK COUNTER 1 MODE
CMPI AUDLCOIN,A11
JREQ MECH3A
CMPI AUDRCOIN,A11
JRNE MECH4
ADDK 8,A1
MECH3A
MOVK 1,A2
MECH3B
DINT
MOVB *A1,A0
ADD A2,A0
MOVB A0,*A1
EINT
MECH4
MOVE A8,A8 ;NO CREDIT UNITS?
JRZ CRX ;THEN NO MORE WORK TO DO.
CALLR ADJUST_CREDITS ;GIVE CREDIT FOR THE MONEY.
CALLR DEF_PAGE ;POINT PAGE AWAY!
calla update_scorebrd ;redraw scoreboard credits message
; SET-UP CREDITS MSG IN GAME SCREEN AND INDICATE 'INSERT COIN' IF NOT ENOUGH
; HAVE BEEN DROPPED
;
; CALLA G_MSG ;PLOT MESSAGE FOR GAME PLAY SCREEN
CREDSP
; MOVE @GAMSTATE,A0
; CMPI INAMODE,A0
; JRNZ NOZERO
;NOZERO
MOVE @PSTATUS,A0
JRNZ CRX
move @GAMSTATE,a0
subk INAMODE,a0 ;A DISPLAY IN AMODE ONLY!
jrne CRX
CRY jruc CRD_SCRN ;PUT UP THE CREDITS SCREEN
CRX JAUC SUCIDE
********************************
* Set active continue timers
* A0=New value
conttimers_set
PUSH a2,a3
movi conttimers,a2
movk 4,a3
ctslp move *a2,a1
jrz cts50 ;None?
move a0,*a2
cts50 addk 16,a2
dsj a3,ctslp
PULL a2,a3
rets
********************************
* Make all switch process dumdie entries
;CLRSWPRC
; MMTM SP,A0,A1,A3
;
; CLR A1 ;USE SWTAB ENTRY 0 FOR DUMDIE PROC
; MOVE @SWSTACK,A3,L
;CLRSTKL CMPI SWSTST,A3,L ;STACK AT START?
; JREQ CLRSTKX ;YES, EXIT
; MOVE *A3+,A0
; CMPI 31,A0
; JRLS CLRSTKL ;THIS ENTRY IS A REAL SWITCH
; MOVE A1,*A3(-10H) ;STORE THE DUMDIE CALL
; JRUC CLRSTKL
;
;CLRSTKX MMFM SP,A0,A1,A3
; RETS
********************************
* CR_STRTP - ARE THERE ENOUGH CREDITS TO START
* CR_CONTP - ARE THERE ENOUGH CREDITS TO CONTINUE
* P_START - PLAYER STARTED...DEDUCT CREDITS
* P_CONT - PLAYER CONTINUED...DEDUCT CREDITS
* CRED_P - HOW MANY CREDITS
*
* JRHS FOR OK TO START!
CR_STRTP
PUSH a0,a1
MOVK ADJFREPL,A0
CALLR GET_ADJ ;ARE WE IN FREE PLAY?
CMPI 1,A0 ;WE ARE IF ITS NOT ZERO.
JRHS CR_STX
CALLR CCCC ;MAKE SURE THINGS ARE IN TACT
CALLR COIN_PAG
CALLR GET_CREDITS ;GET CURRENT CREDITS
MOVE A0,A1
MOVK ADJCSTRT,A0
CALLR GET_ADJ ;GET NUMBER NEEDED
CMP A0,A1 ;DO WE HAVE ENOUGH TO START?
CR_STX MMFM SP,A0,A1
RETS
CR_CONTP
PUSH a0,a1
MOVK ADJFREPL,A0
CALLR GET_ADJ ;ARE WE IN FREE PLAY?
CMPI 1,A0 ;WE ARE IF ITS NOT ZERO.
JRHS CR_STX1
CALLR CCCC ;MAKE SURE THINGS ARE IN TACT
CALLR COIN_PAG
CALLR GET_CREDITS ;GET CURRENT CREDITS
MOVE A0,A1
MOVK ADJCCONT,A0
CALLR GET_ADJ ;GET NUMBER NEEDED
CMP A0,A1 ;DO WE HAVE ENOUGH TO START?
CR_STX1
MMFM SP,A0,A1
RETS
P_START
MMTM SP,A0,A1
CALLR CRED_P
MOVE A0,A1
MOVK ADJCSTRT,A0
CALLR GET_ADJ ;GET NUMBER NEEDED
CALLR REMOVE_CREDITS
CALLA DEC_HSR ;TAKE 1 FROM HIGH SCORE RESET COUNTER
calla update_scorebrd ;redraw scoreboard credits message
movi AUD_TOTSTARTS,a0
calla AUD1
move @GAMSTATE,a0
subk INAMODE,a0
jreq #doit
subk ININTRO-INAMODE,a0
jrne #nope
#doit
movi AUD_PRESTARTS,a0
calla AUD1
#nope
MMFM SP,A0,A1
RETS
P_CONT
MMTM SP,A0,A1
CALLR CRED_P
MOVE A0,A1
MOVK ADJCCONT,A0
CALLR GET_ADJ ;GET NUMBER NEEDED
CALLR REMOVE_CREDITS
CALLA DEC_HSR ;TAKE 1 FROM HIGH SCORE RESET COUNTER
MMFM SP,A0,A1
RETS
REMOVE_CREDITS
SUB A0,A1 ;REMOVE START AMOUNT FROM WHAT WE HAVE
JRHS PS1 ;WE'RE OK.
CLR A1 ;IT WENT NEGATIVE....MAKE ZERO.
PS1 CALLR COIN_PAG
MOVI CREDITS,A7
MOVE A1,A0 ;PUT WHATS LEFT OUT TO WRITE
CALLA WC_BYTE ;WRITE THE NEW AMOUNT
CALLR FORM_COIN_CKSUM_AND_STORE
CALLR DEF_PAGE ;POINT AT DEFAULT PAGE.
RETS
**************************************************************************
*
* NO_CREDS
*
* THIS IS CALLED TO REMOVE CREDITS AND CREDIT FRACTIONS
* FROM THE MACHINE.
*
**************************************************************************
NO_CREDS
MMTM SP,A0,A1,A7
CALLR FORM_COIN_CKSUM ;MAKE THE REAL CKSUM
MOVI COIN_CKSUM,A7
MOVE A1,A0
INC A0 ;MAKE THE CKSUM BAD!
CALLA WC_BYTE
MMFM SP,A0,A1,A7
RETS
**************************************************************************
*
* CHALK_COIN
*
* A11 contains the base audit number. Chalk the audit for
* 1 more coin hit there!
*
* 3 away from the base is the "door-closed" counter
* 3 away from that is the "sub-total".
* 3 away from that is the "door-closed" sub-total.
*
**************************************************************************
;CHALK_COIN
; MMTM SP,A0
; MOVE A11,A0
;*
;* READY TO CHALK THE AUDIT......ZERO MEANS "EXTRA SLOT"
;*
;
;CCC01
; CALLR CHALK_FOR_A0 ;CHALK RELEVANT COUNTERS
; MMFM SP,A0
; RETS
**************************************************************************
*
* CHALK_FOR_A0
*
* THIS IS CALLED TO CHALK THE AUDITS FOR A COIN SWITCH.
* A0 HAS THE BASE AUDIT FOR THE COIN SWITCH.
*
**************************************************************************
;CHALK_FOR_A0
; MMTM SP,A0
; CALLR AUD1 ;CHALK THE DIRECT AUDIT
; ADDI 2*CHUTES,A0 ;AND THE "SUB-TOTAL"
; CALLR AUD1
; SUBI CHUTES,A0 ;MOVE TO DOOR OPEN TOTAL
; CALLR AUD1
;
; ADDI 2*CHUTES,A0 ;AND DOOR OPEN SUB-TOTAL
; CALLR AUD1
;CKCN1
; MMFM SP,A0
; RETS
**************************************************************************
*
* ADJUST_CREDITS
*
* This is the routine that turns the coin switch hit
* into a tangable (if you could say that) reward.
*
* The coin chute multiplier is in A8.
*
**************************************************************************
ADJUST_CREDITS
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
CALLR CK_MAX ;ARE WE AT MAXIMUM CREDITS?
JRHS ADCRXX ;YEP.....DON'T ROCK THE BOAT!
CALLR CCCC ;VALIDATE THE CURRENT TOTALS (OR CLEAR!)
CALLR FETCH_REQ ;GET THE REQUIRED FOR CREDIT, BONUS AND MINIMUM
* A2 = REQUIRED FOR CREDIT
* A3 = FOR BONUS
* A4 = MINIMUM
CALLR ADD_TO_CUNITS ;ADD TO OUR CUNITS
MOVE A3,A3 ;BONUS EFFECTIVE?
JRZ NO_BUNITS ;NOPE....DON'T RUN UP THE COUNTER!
CALLR ADD_TO_BUNITS ;ADD TO BONUS UNITS
NO_BUNITS
MOVE A4,A4 ;MINIMUM REQUIRED?
JRZ NO_MINIMUM ;NOPE.....LEAVE ALONE.
MOVI MINUNITS,A7 ;POINT AT MINIMUM
CALLA RC_WORD ;GET THE AMOUNT ACCUMULATED
ADD A8,A0 ;ADD AMOUNT RECEIVED
CALLA WC_WORD ;WRITE THE MINUNITS BACK IN CASE NOT ENOUGH.
SUB A4,A0 ;DO WE HAVE ENOUGH TO ACT?
JRLO ADCRX ;NOPE....NO CREDITS YET!
CLR A0 ;CLEAR OUT MINIMUM FOR NEXT SHOT!
CALLA WC_WORD ;REMOVE ACCUMULATED MINIMUM.
NO_MINIMUM
CLR A6 ;COUNT ACCUMULATED CREDITS IN A6
CLR A10 ;IN CASE NO BONUS!
CLR A8
MOVI BUNITS,A7
CALLA RC_WORD ;GET THE NUMBER OF BUNITS
MOVE A0,A9 ;INTO A9
MOVE A3,A3 ;DON'T DIVIDE BY ZERO!
JRZ NO_BU_BU
DIVU A3,A8 ;DIVIDE BUNITS BY NUMBER NEEDED FOR BONUS
MOVE A9,A0 ;WRITE REMAINDER BACK
CALLA WC_WORD
MOVE A8,A6 ;NUMBER OF BONUS CREDITS EARNED.
MOVE A8,A10 ;REMEMBER IF ANY BONUS CREDITS WERE EARNED!
NO_BU_BU
CLR A8
CALLR GET_CUNITS ;READ IN THE CUNITS
MOVE A0,A9
MOVE A2,A2 ;DON'T DIVIDE BY ZERO.
JRZ NO_CR
DIVU A2,A8 ;GET CREDITS!
MOVE A9,A0 ;REMAINDER IS LEFTOVER CUNITS
CALLR PUT_CUNITS
ADD A8,A6 ;A6 HAS WHAT WE'VE WON!
NO_CR
MOVE A6,A1
MOVI AUDPAIDC,A0
CALLA AUD ;CHALK UP THE EARNED CREDITS!
CALLR GET_CREDITS
ADD A6,A0 ;ADD IN THE NEW ONES.
CALLR PUT_CREDITS ;NOW STORE EM BACK (ENFORCE MAX)
MOVE A10,A10 ;WAS THE BONUS EARNED?
JRZ ADCRX ;NOPE...EXIT!
*
* WHEN BONUS EARNED...WE START THE WHOLE SYSTEM OVER!
*
CALLR CLEAR_UNITS
ADCRX CALLR FORM_COIN_CKSUM_AND_STORE
ADCRXX MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
**************************************************************************
*
* PUT_CREDITS
*
* STORE CREDIT COUNT IN A0 TO CMOS....ENFORCING MAXIMUM CREDITS.
*
**************************************************************************
PUT_CREDITS
MMTM SP,A0,A6,A7
CALLR GET_MAX ;GET MAX CREDS IN A1....BE ON COIN PAGE
CMP A1,A0 ;SEE HOW WE STACK UP.
JRLO USE_A0 ;WE'RE LOWER...JUST STORE.
*
* WE'RE AT (OR OVER) MAXIMUM CREDITS
*
CALLR CLEAR_UNITS ;CLEAR OUT THE UNIT FRACTIONS.
MOVE A1,A0 ;USE MAXIMUM
USE_A0 MOVI CREDITS,A7
CALLA WC_BYTE ;WRITE THE CREDITS OUT.
MMFM SP,A0,A6,A7
RETS
**************************************************************************
*
* GET_MAX
*
* GET MAXIMUM CREDITS IN A1.
*
* THIS LEAVES YOU ON COIN PAGE.
*
**************************************************************************
GET_MAX
PUSH a0
MOVK ADJMAXC,A0
CALLA GET_ADJ_FOR_COIN ;FETCH MAXIMUM CREDITS (PUT US ON COIN PAGE)
MOVE A0,A1
MMFM SP,A0
RETS
**************************************************************************
*
* CK_MAX
*
* THIS IS CALLED TO SEE IF WE ARE AT MAXIMUM CREDITS.
* .HS. MEANS WE ARE AT MAXIMUM CREDITS.
*
**************************************************************************
CK_MAX
MMTM SP,A0,A1
CALLR GET_MAX ;GET MAXIMUM IN A1
CALLR CRED_P ;GET CREDITS IN A0 (AND FLIP PAGE AWAY)
CMP A1,A0 ;JRHS FOR MAXIMUM CREDITS!
MMFM SP,A0,A1
RETS
**************************************************************************
*
* UNIT_CLR
*
* THIS IS CALLED AT GAME OVER. IT CLEARS
* OUT ANY COIN FRACTIONS THAT WERE NOT USED BY THE
* CURRENT PLAYER(S). THIS ALLOWS ALL BUY-IN TO
* TAKE ADVANTAGE OF MULTIPLE COIN BONUSES.
*
* ANYTIME A COIN IS INSERTED, C_FRAC IS SET TO ABOUT
* 10 SECONDS. MY TIMING INTERFACE COUNTS C_FRAC DOWN
* TO ZERO. IF C_FRAC IS NON ZERO WHEN THIS ROUTINE IS
* CALLED, THEN SOMEONE PUT A COIN IN NOT TOO LONG BEFORE
* GAME OVER. DON'T SCREW HIM OUT OF HIS FRACTIONS.
*
**************************************************************************
UNIT_CLR
PUSH a0
MOVE @C_FRAC,A0 ;DO WE GIVE HIM A REPRIEVE?
JRNZ UC1 ;YEP!
CALLR CCCC ;VALIDATE COINAGE
CALLR CLEAR_UNITS ;CLEAR OUT FRACTIONAL UNITS
CALLR FORM_COIN_CKSUM_AND_STORE ;MAKE ALL GOOD.
UC1
MMFM SP,A0
RETS
CLEAR_UNITS
MMTM SP,A0,A7
CLR A0
MOVI CUNITS,A7 ;3 CONSECUTIVE WORDS OF CMOS
CALLA WC_WORDI
CALLA WC_WORDI
CALLA WC_WORD
MMFM SP,A0,A7
RETS
* RETURN CREDITS IN A0.........AND Z BIT CLEAR IF
* CREDITS EXIST OR IN FREE PLAY.
CRED_P
CALLR CCCC ;CHECK TO SEE IF DATA IS OK.
GET_CREDITS
PUSH a7
CALLR COIN_PAG
MOVI CREDITS,A7 ;
CALLA RC_BYTE ;READ CURRENT CREDITS
JRNZ GC1 ;WE GOT SOME!
;PUSH THE ZERO!
PUSH a0
MOVK ADJFREPL,A0
CALLR GET_ADJ ;SEE IF FREEPLAY......(Z BIT CLEAR IF SO!)
MMFM SP,A0 ;RESTORE A0
GC1 CALLR DEF_PAGE ;FLIP CMOS AWAY
MMFM SP,A7
RETS
ADD_TO_CUNITS
MMTM SP,A0,A7
CALLR GET_CUNITS
ADD A8,A0
CALLR PUT_CUNITS
MMFM SP,A0,A7
RETS
GET_CUNITS
PUSH a7
MOVI CUNITS,A7
CALLA RC_WORD
MMFM SP,A7
RETS
PUT_CUNITS
PUSH a7
MOVI CUNITS,A7
CALLA WC_WORD
MMFM SP,A7
RETS
ADD_TO_BUNITS
MMTM SP,A7,A0
MOVI BUNITS,A7
CALLA RC_WORD
ADD A8,A0
CALLA WC_WORD
MMFM SP,A7,A0
RETS
******************************************************************************
CRD_SCRN
CLR a10 ;Sleep 7 secs
SUBR CRD_SCRN2 ;Entry pnt for shorter sleep
MOVI CP_PID1,A0 ;CHANGE TO "CREDIT PAGE" ID 1
MOVE A0,*A13(PROCID)
MOVI 0FFFFH,A1 ;CHECK TO SEE IF CREDIT PAGE IS UP
CALLA EXISTP
jrnz #exists ;credit page up, so reprint text only
; JSRP scrn_scaleininit ;Hide display
calla display_blank
calla WIPEOUT ;CLEAN SYSTEM OUT
movk 1,a0 ;page flipping on
move a0,@dpageflip
movi SCRNEND,a0 ;[256,405]
move a0,@SCRNLR,L
clr a0
move a0,@WORLDTLX,L
move a0,@WORLDTLY,L
SLEEPK 2
movi coinin_mod,a0
move a0,@BAKMODS,L
calla BGND_UD1
movk 1,a0
move a0,@DISPLAYON ;Display processor on
callr crd_updatetxt
SLEEPK 2
; JSRP scrn_scalein
movi 4<<10+4<<5+7,a0
move a0,@IRQSKYE
SLEEPK 2
calla display_unblank
jruc #cont
#exists
move @HEBLNK,a0
cmpi >32,a0
jrne #inscl
move @dtype,a0
jrge #notinscl
#inscl move a10,a10
jrnz KILL_CRD2
jruc #die
#notinscl
SLEEPK 3
#cont
callr crd_updatetxt ;Display players per credit messages
movi >32,a0 ;Display on (just in case)
move a0,@HEBLNK
SLEEP 1*TSEC
movi 4*TSEC,a11
#lp SLEEPK 1
.ref get_all_buttons_cur2
calla get_all_buttons_cur2
jrz #nob
SOUND1 bounce_snd
move a10,a10
jrnz KILL_CRD2
jruc KILL_CRD
#nob
dsj a11,#lp
#ck2
move a10,a10
jrnz KILL_CRD2
movi 10*TSEC,a11
#lp1 SLEEPK 1
calla get_all_buttons_cur2
jrz #nob1
SOUND1 bounce_snd
jruc KILL_CRD
#nob1
dsj a11,#lp1
KILL_CRD
calla display_blank
calla WIPEOUT ;CLEAN SYSTEM OUT
SLEEPK 1
jauc amode_start
#die DIE
bounce_snd .word >fc80,10,>8129,0 ;Ball bounce
KILL_CRD2
RETP
coinin_mod
.long empjambBMOD
.word 0,0
.long 0
********************************
SUBRP crd_updatetxt
movi CP_PID1,a0 ;PID
movi 0ffffh,a1 ;mask bits
calla KILALL ;kill all CP_PID1 procs except self
movi TYPTEXT,a0 ;object ID
clr a1 ;mask
calla obj_delc ;delete existing text
; MOVI CPYR_MES,a2 ;COPYRIGHT MESSAGE
; .ref DIPSWITCH
move @DIPSWITCH,a0
btst 6,a0 ;UJ2 switch 1
jrnz #notfair ;OFF?
;Yes, a dollar bill acceptor is hooked up!
MOVI dollar_mes,a2 ;Dollar bill message
calla print_message
#notfair
PUSH A10
callr credits_string
PULL A10
rets
#*****************************************************************************
.asg 25,YSPACE
.asg 17,YSPACE0
.asg 40,LN0
.asg 70,LN1
.asg 100,LN2
.asg 130,LN3
.asg 60,LN3x
.asg 160,LN4
.asg 190,LN5
.asg 220,LN6
CM_Y_GAP EQU 13
CM_Y_GAP2 EQU 80
CM_Y_ADDGAP EQU [CM_Y_GAP,200]
credits_string
MOVK ADJFREPL,A0 ;ARE WE IN FREE PLAY?
CALLA GET_ADJ
JRZ #not_freeply
movi LN3x_setup,a2
calla setup_message
movi CM_Y_GAP2,a0
move a0,@mess_line_spacing
movi #str_freeply,a4
calla print_string_C2
rets
#not_freeply
;print "BEST VALUE"
; movi LN0a_setup,a2
; calla setup_message
; movi #str_value,a4
; calla print_string_C2
;print "PURCHASE FULL GAMES FOR ONLY X CREDITS!"
movi LN0_setup,a2
calla setup_message
movi #str_fullg1,a4
calla print_string_C2
movk ADJCCONT,a0
calla GET_ADJ
move a0,a10
add a0,a10
add a0,a10
movk ADJCSTRT,a0
calla GET_ADJ
add a0,a10
move @mess_cursy,a0
addi YSPACE0,a0
move a0,@mess_cursy
movi ADJFULLG,a0
calla GET_ADJ ;# credits for full game
cmp a0,a10
jrge #ok
move a10,a0
#ok
movi 20,a1 ;max string value
calla dec_to_asc
calla copy_string
movi #str_fullg2,a4
calla concat_rom_string
calla print_string_C
calla GET_CSPT ;a6 = * current pricing table
movk 2,a10 ;min number strings to print
move *a6(CS_LIST),a11,L ;a11 = * string list
jrz #no_strings
move a11,a2
#next_string
move *a2+,a0,L ;count up number of strings
jrz #last
inc a10
jruc #next_string
#last
#no_strings
callr CRED_P ;get number credits
move a0,a3
MOVK ADJCSTRT,A0
callr GET_ADJ ;# credits to start
divu a0,a3 ;credits / credits to start
move a3,a3
jrz #not_enough1
inc a10 ;+1 string (READY FOR...)
#not_enough1
;print "CREDITS : N"
movi LN1_setup,a2
calla setup_message
callr CRED_P ;# credits in a0
PUSH a0
movi #crd_str,a4
calla copy_rom_string
PULL a0
PUSH a0
movi 99,a1 ;max string value
calla dec_to_asc
calla concat_string
MOVK ADJMAXC,a0
calla GET_ADJ_FOR_COIN ;a0 = max credits
PULL a1
cmp a0,a1
jrlo #not_max_crds
movi #str_max,a4 ;max credits
calla concat_rom_string
#not_max_crds
calla print_string_C ;"CREDITS : NN"
;print 0-3 strings from current pricing table
movi LN2_setup,a2
calla setup_message
movi 140,a0
movi YSPACE0,a1
mpyu a10,a1 ;# strings * Y spacing
srl 1,a1 ;/2
sub a1,a0
move a0,@mess_cursy ;centered Y
*gnp
calla TAMPEREDP
JRZ #done
*gnp
#next_string2
move *a11+,a4,L ;* next string
jrz #done
move @mess_cursy,a0
addi YSPACE0,a0
move a0,@mess_cursy
calla print_string_C2
jruc #next_string2
#done
;print "N CREDITS TO START"
move @mess_cursy,a0
addi YSPACE0,a0
move a0,@mess_cursy
MOVK ADJCSTRT,a0
callr GET_ADJ ;# credits to start
PUSH a0
movi 99,a1 ;max string value
calla dec_to_asc
calla copy_string
movi #crd_2start,a4
PULL a0
dec a0
jrz #1credit
movi #crd_2starts,a4
#1credit
calla concat_rom_string
calla print_string_C
;print "N CREDITS TO CONTINUE"
move @mess_cursy,a0
addi YSPACE0,a0
move a0,@mess_cursy
MOVI ADJCCONT,a0 ;# credits to continue
callr GET_ADJ
PUSH a0
movi 99,a1 ;max string value
calla dec_to_asc
callr copy_string
movi #crd_2cont,a4
PULL a0
dec a0
jrz #1_creditb
movi #crd_2conts,a4
#1_creditb
calla concat_rom_string
calla print_string_C
;print READY FOR N PLAYERS and PRESS START/INSERT COIN messages
movi LN5_setup,a2
calla setup_message
callr CRED_P ;get number credits
move a0,a3
MOVK ADJCSTRT,A0
callr GET_ADJ ;# credits to start
divu a0,a3 ;credits / credits to start
move a3,a3
jrz #not_ready
dec a3
move @TWOPLAYERS,a0 ;0 = NO, 1 = YES 2 players
jrz #4_plyrs
cmpi 2,a3
jrlo #not_max
movi 1,a3
#4_plyrs
cmpi 4,a3
jrlo #not_max
movi 3,a3
#not_max
sll 5,a3 ;x 32 bits
addi #ready_for_lookup,a3
move *a3,a4,L
; move @mess_cursy,a0
; addi YSPACE,a0
; move a0,@mess_cursy
calla print_string_C2
movi #str_start,a4
jruc #ready
#not_ready
;Turmell
; movi RUBYPAL,a0 ;redpal
; move a0,@message_palette
movi #str_insert,a4
#ready
move @mess_cursy,a0
addi YSPACE,a0
move a0,@mess_cursy
calla print_string_C2
rets
LN0a_setup
RJR_STR osgemd_ascii,10,0,200,LN0-3-YSPACE,WHITEPAL,0
.even
LN0_setup
RJR_STR ogmd10_ascii,5,0,200,LN0-YSPACE,SGMD8WHT,0
.even
LN1_setup
RJR_STR osgemd_ascii,10,0,200,LN1+4,GOLD,0
.even
LN2_setup
RJR_STR ogmd10_ascii,5,0,200,LN2,SGMD8GLD,0
.even
LN3_setup
RJR_STR osgemd_ascii,5,0,200,LN3,GREENPAL,0
.even
LN3x_setup
;MJT
RJR_STR lgmd_ascii,10,2,200,LN3x,LGMDGLD,0
.even
LN5_setup
RJR_STR osgemd_ascii,10,0,200,LN5+10,GREENPAL,0
.even
LN6_setup
RJR_STR osgemd_ascii,10,0,200,LN6,GOLD,0
.even
#str_value
.string "BEST VALUE:",0
#str_fullg1
.string "PURCHASE FULL GAMES FOR ONLY ",0
#str_fullg2
.string " CREDITS PER PLAYER!",0
#str_max
.string " (MAXIMUM)",0
#crd_str
.string "CREDITS : ",0
#crd_2start
.string " CREDIT TO START",0
#crd_2starts
.string " CREDITS TO START",0
#crd_2cont
.string " CREDIT TO CONTINUE",0
#crd_2conts
.string " CREDITS TO CONTINUE",0
#str_freeply
.string "FREE PLAY",1
#str_start
.string "PRESS START",0
#str_insert
.string "INSERT COINS",0
.even
#ready_for_lookup
.long #str_1p,#str_2p
.long #str_3p,#str_4p
#str_1p .string "READY FOR 1 PLAYER",0
#str_2p .string "READY FOR 1 - 2 PLAYERS",0
#str_3p .string "READY FOR 1 - 3 PLAYERS",0
#str_4p .string "READY FOR 1 - 4 PLAYERS",0
.even
.if 0
CM_LINE1 EQU CUSTOM_MESSAGE
CM_LINE2 EQU CUSTOM_MESSAGE+CMESS_LINE_SIZE
CM_LINE3 EQU CUSTOM_MESSAGE+(2*CMESS_LINE_SIZE)
;OUTPUT_CUSTOM
CALLA ADJ_PAGE
MOVI VALID_CUSTOM,A7
CALLA RC_WORD
CMPI VALID_VALUE,A0 ; CHECK TO SEE IF MESSAGE IS VALID
JRNZ #zippo
movi CM_LINE3,A10 ;CHECK LINE 3
callr CK_LINE ;3 VALID LINES?
jrz GO_FOR_2
movi LN2_setup,a2
calla setup_message
movi STRNGRAM,a4
calla print_string_C2
GO_FOR_2
movi CM_LINE2,A10 ;CHECK LINE 2
callr CK_LINE ;2 VALID LINES?
jrz GO_FOR_1
movi LN3_setup,a2
calla setup_message
movi STRNGRAM,a4
calla print_string_C2
GO_FOR_1
movi CM_LINE1,A10 ;CHECK LINE 1
callr CK_LINE ;1 VALID LINES?
jrz #zippo
movi LN4_setup,a2
calla setup_message
movi STRNGRAM,a4
calla print_string_C2
#zippo
.endif
#*****************************************************************************
;open up window stating winners of a 4 player game get next game free
.asg 8,Y0
.asg 129-38,Y1
.asg 159-38,Y2
.asg 16,SPACING
.ref mess_objid
.ref flash_bigtxt
SUBR winner_stays_box
movi cheer_snd,a0
calla snd_play1
movi cheer1_snd,a0
calla snd_play1
movk ADJFREPL,a0 ;ARE WE IN FREE PLAY?
calla GET_ADJ
jrnz #freeply
movi ADJWINMODE,a0
calla GET_ADJ
jrz #exit ;disabled?
movi [200-2,0],a0 ;x val
movi [120-38,0],a1 ;y val
movi _4playbx,a2 ;* image
movi 200,a3 ;z pos
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
movi CLSNEUT|TYPTEXT|SUBMES2,a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ2
movi [200-2,0],a0 ;x val
movi [149-38,0],a1 ;y val
movi _4playline,a2 ;* image
movi 201,a3 ;z pos
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
movi CLSNEUT|TYPTEXT|SUBMES2,a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ2
movi #ln1_setup,a2
calla setup_message
movi CLSDEAD|123,a0 ;object ID
move a0,@mess_objid
movi Y0,a2
move a2,@mess_cursy
movi #notice,a4
calla print_string_C2
movi #ln2_setup,a2
calla setup_message
movi CLSNEUT|TYPTEXT|SUBMES2,a0 ;object ID
move a0,@mess_objid
movi Y1,a0
move a0,@mess_cursy
movi SPACING,a0
move a0,@mess_line_spacing
movi #str_in4,a4
calla print_string_C2
movi Y2,a0
move a0,@mess_cursy
movi #str_free,a4
calla print_string_C2
movk 8,a10
CREATE0 flash_bigtxt
move a0,a9
SLEEP 36
move a9,a0
calla KILL
SLEEP TSEC*1+20
movi TSEC*3+20,a10
#whopper_with_cheese
SLEEPK 1
.ref get_all_buttons_down
calla get_all_buttons_down
move a0,a0
jrnz #exit1
dsj a10,#whopper_with_cheese
jruc #ex2
#exit1
SOUND1 bounce_snd
#ex2
movi CLSNEUT|TYPTEXT|SUBMES2,a0 ;object ID
calla obj_del1c ;delete text
movi CLSDEAD|123,a0
calla obj_del1c ;delete text
#exit
#no_credpage
#freeply
RETP
cheer1_snd .word >fd84,80,>8144,0 ;Long cheer
cheer_snd .word >f898,10,>814e,0
#ln1_setup
RJR_STR lgmd_ascii,12,2,200-2,6,LGMDRED2,0
#ln2_setup
RJR_STR ogmd10_ascii,9,0,200-2,100,SGMD8GLD,0
#notice .string "NOTICE:",0
.even
#str_in4
.string "when 4 players play:",0
.even
#str_free
.string "winning team",1
.string "stays on",1
.string "for free!",0
.even
#*****************************************************************************
.if 0
HELP_TAB
.LONG L_MESS ;0 SAYS USE L_MESS
.LONG JUST_LIST ;1 SAYS USE LISTED MESSAGES ONLY
.LONG LINE_ONE_PLUS ;2 SAYS USE 1ST LINE W/ 2 TO START
.LONG LINE_TWO_PLUS ;3
.LONG LINE_THREE_PLUS ;4
.LONG LINE_ONE_PLUS_2 ;5 USE 1ST LINE 2/ 2 CREDITS PER PLAYER
.LONG LINE_TWO_PLUS_2 ;6
.LONG LINE_THREE_PLUS_2 ;7
.LONG OUTPUT_CUSTOM ;8 CUSTOM MESSAGE!
JUST_LIST
MOVE A8,A3 ;STASH WHERE IT WILL SURVIVE
MOVE *A3(LONG_SIZE),A2,L ;ONE WORD ONLY?
JRZ JUST_ONE ;YEP....CENTER IT NICELY
*
* there's a 2nd line...check for 3rd!
*
MOVE *A3(2*LONG_SIZE),A2,L ;IS THERE A 3RD LINE?
JRZ JUST_TWO ;NOPE
MOVI SETUP_3_OF_3,A8
JSRP SET_THEN_A2
MOVE *A3(LONG_SIZE),A2,L ;GET LINE 2
MOVI SETUP_2_OF_3,A8
JSRP SET_THEN_A2
MOVI SETUP_1_OF_3,A8 ;SET HEIGHT FOR TOP LINE
JRUC FIRST_LINE
JUST_TWO
MOVE *A3(LONG_SIZE),A2,L ;GET LINE 2
MOVI SETUP_2_OF_2,A8
JSRP SET_THEN_A2
MOVI SETUP_1_OF_2,A8
FIRST_LINE
MOVE *A3,A2,L
JRUC SET_THEN_A2 ;DO TOP LEN AND RETURN
JUST_ONE
MOVI SETUP_1_OF_1,A8
JRUC FIRST_LINE ;DO TOP LEN AND RETURN
*
* OUTPUT THE CUSTOM MESSAGE
*
CM_LINE1 EQU CUSTOM_MESSAGE
CM_LINE2 EQU CUSTOM_MESSAGE+CMESS_LINE_SIZE
CM_LINE3 EQU CUSTOM_MESSAGE+(2*CMESS_LINE_SIZE)
OUTPUT_CUSTOM
MOVI CM_LINE3,A10 ;CHECK LINE 3
CALLR CK_LINE ;3 VALID LINES?
JRZ GO_FOR_2
MOVI SETUP_3_OF_3,A8
JSRP SET_THEN_STRNGRAM ;PUT IT OUT
MOVI CM_LINE2,A10
MOVI SETUP_2_OF_3,A8
JSRP SET_THEN_STRNGRAM
MOVI CM_LINE1,A10
MOVI SETUP_1_OF_3,A8
JRUC SET_THEN_STRNGRAM
GO_FOR_2
MOVI CM_LINE2,A10 ;CHECK LINE 2
CALLR CK_LINE ;2 VALID LINES?
JRZ GO_FOR_1
MOVI SETUP_2_OF_2,A8
JSRP SET_THEN_STRNGRAM ;PUT IT OUT
MOVI CM_LINE1,A10
MOVI SETUP_1_OF_2,A8
JRUC SET_THEN_STRNGRAM
GO_FOR_1
MOVI CM_LINE1,A10
MOVI SETUP_1_OF_1,A8
JRUC SET_THEN_STRNGRAM
.endif
**************************************************************************
*
* SET_THEN_A2
*
* THIS IS A PRIMITIVE FOR THE COIN PAGE PLOTTERS.
*
* IT SETS UP WITH THE STRING IN A8, THEN FINSHES
* ON THE STRING IN A2.
*
* JSRP THIS ROUTINE!
*
**************************************************************************
SET_THEN_A2
CALLA LM_SETUP
MOVE A2,A8
JAUC LM_FINIS ;THAT DOES LINE 3
**************************************************************************
*
* SET_THEN_STRNGRAM
*
* A10 POINTS AT A CMOS STRING FOR CUSTOM MESSAGE.
* A8 CONTAINS THE SETUP STRING FOR PRINTING THIS
* STRING OUT. CONVERT FROM CMOS TO STRNGRAM
* AND PRINT ON THE STRING.
*
**************************************************************************
SET_THEN_STRNGRAM
CALLR CK_LINE ;TRANSFER TO STRNGRAM
CALLR LM_SETUP
MOVI STRNGRAM,A8
JAUC LM_FINIS
**************************************************************************
*
* CK_LINE
*
* A10 POINTS AT A CMOS STRING. WE MOVE THIS STRING
* TO OUR PDATA AREA. THEN WE CALL BUILD_ST TO
* PACK IT INTO "STRNGRAM" WE RETURN .EQ. (PASSED FROM
* BUILD_ST) BACK TO OUR CALLER IF IT IS ALL SPACES.
*
**************************************************************************
CK_LINE
MMTM SP,A0,A7,A1,A2,A10
MOVE A10,A7 ;INPUT POINTER TO CMOS
MOVE A13,A10 ;OUR PDATA AREA
ADDI PDATA,A10 ;A10 IS DESTINATION.
MOVE A10,A2 ;ITERATE TO LOAD IT UP.
MOVI CMESS_CHARS,A1 ;COUNTER
CALLA ADJ_PAGE ;POINT THE PAGE
CK_LOOP
CALLA RC_BYTEI ;FETCH A BYTE
MOVB A0,*A2 ;STORE
ADDK BYTE_SIZE,A2
DSJS A1,CK_LOOP
CALLA DEF_PAGE ;POINT AWAY NOW
CALLA BUILD_ST ;NOW XFER TO STRNGRAM (REMOVING SPACES ETC)
MMFM SP,A0,A7,A1,A2,A10 ;RETURN .EQ. IF ITS ALL SPACES.
RETS
LINE_ONE_PLUS
MOVE *A8,A2,L ;GET LINE 1
LOP_1
MOVI SETUP_1_OF_3,A8
CALLR LM_SETUP
MOVE A2,A8 ;SWAP IN TEXT POINTER
JSRP LM_FINIS ;PRINT IT
LOP_2
MOVI TWO_TS,A8 ;TWO TO START STUFF
JAUC L_MESS ;PRINT IT AND RETURN
*
* IF THE GAME IS IN A 2 TO START....2 TO CONTINUE MODE
*
LINE_THREE_PLUS
MOVE *A8(2*LONG_SIZE),A2,L ;FETCH LINE 3
JRZ LOP_2 ;NOTHING ON LINE 3
JAUC LOP_1 ;THEN ITS THE SAME AS ABOVE!
LINE_TWO_PLUS
MOVE *A8(LONG_SIZE),A2,L ;FETCH LINE 2
JRZ LOP_2 ;NOTHING ON LINE 2
JAUC LOP_1 ;THEN ITS THE SAME AS ABOVE!
LINE_ONE_PLUS_2
MOVE *A8,A2,L ;GET LINE 1
LOP_12
MOVI SETUP_1_OF_2,A8
CALLR LM_SETUP
MOVE A2,A8 ;SWAP IN TEXT POINTER
JSRP LM_FINIS ;PRINT IT
LOP_22
MOVI TWO_TP,A8 ;TWO CREDITS PER PLAYER
JAUC L_MESS ;PRINT IT AND RETURN
LINE_TWO_PLUS_2
MOVE *A8(LONG_SIZE),A2,L ;FETCH LINE 2
JRZ LOP_22 ;NOTHING ON LINE 2
JAUC LOP_12 ;THEN ITS THE SAME AS ABOVE!
LINE_THREE_PLUS_2
MOVE *A8(2*LONG_SIZE),A2,L ;FETCH LINE 3
JRZ LOP_22 ;NOTHING ON LINE 3
JAUC LOP_12 ;THEN ITS THE SAME AS ABOVE!
**************************************************************************
*
* SELECT_SETUP
*
* THIS IS CALLED TO SELECT A SETUP STRING FOR THE
* CREDITS MESSAGE. IF THERE IS PROMPTING TO ADD...WE
* DROP IT DOWN....ELSE WE PRINT IT CENTERED.
*
**************************************************************************
SELECT_SETUP
PUSH a0
MOVI MESS_CNUM,A8 ;ASSUME NO EXTRA PROMPT
CALLA CKPROMPT ;IS THERE ONE?
JRZ NO_EXTRA
MOVI MESS_LOWNUM,A8
NO_EXTRA
MMFM SP,A0
RETS
**************************************************************************
*
* FETCH_REQ
*
* THIS ROUTINE FETCHES THE NUMBER OF UNITS REQUIRED
* FOR CREDIT, BONUS AND MINIMUM:
*
* A2 = REQ FOR CREDITS
* A3 = REQ FOR BONUS
* A4 = MINIMUM
*
**************************************************************************
FETCH_REQ
PUSH a0
MOVK ADJCUNIT,A0
CALLR GET_ADJ
MOVE A0,A2
MOVK ADJBUNIT,A0
CALLR GET_ADJ
MOVE A0,A3
MOVK ADJMUNIT,A0
CALLR GET_ADJ_FOR_COIN
MOVE A0,A4
MMFM SP,A0
RETS
**************************************************************************
*
* SLAM_P
*
* IS THERE A SLAM PROCESS RUNNING?
*
* .EQ. NO
* .NE. YES
*
**************************************************************************
SLAM_P
MOVI SLAM_PID,A0 ;SLAM PROCESS ACTIVE?
MOVI 0FFFFH,A1
jauc EXISTP
SLAM_SW
movi SLAM_PID|>ffff0000,a0 ;So we can kill other indestructables
move a0,*a13(PROCID) ;Set our ID
calla KIL1C ;Kill others
SLEEP TSEC ;1 second of coin ignoring
jauc SUCIDE
**************************************************************************
*
* FORM_COIN_CKSUM
*
* THIS ROUTINE IS CALLED TO FORM THE COIN/CREDITS
* CHECKSUM. THE CHECKSUM IS RETURNED IN A1.
*
* Z IT MATCHES WHATS THERE
* NZ IT DOESN'T MATCH
*
**************************************************************************
FORM_COIN_CKSUM
MMTM SP,A0,A7,A2
CALLR COIN_PAG ;MAKE SURE WE'RE ON THE RIGHT PAGE.
MOVI COIN_CKSUM_START,A7 ;POINT AT FIRST BYTE TO CHECK
MOVI COIN_CKSUM_BYTES,A2
CLR A1 ;CLEAR OUT CHECKSUM
CN_SUM
CALLA RC_BYTEI ;FETCH A BYTE IN A0
ADD A0,A1 ;ADD TO SUM
DSJS A2,CN_SUM ;TILL WE HAVE EM ALL
NOT A1 ;COMPLEMENT OF COURSE
sll 32-8,a1
srl 32-8,a1
MOVI COIN_CKSUM,A7
CALLA RC_BYTE ;FETCH THE CURRENT CKSUM
CMP A0,A1 ;COMPARE TO THIS
MMFM SP,A0,A7,A2
RETS
FORM_COIN_CKSUM_AND_STORE
MMTM SP,A1,A7,A0
CALLR FORM_COIN_CKSUM
MOVI COIN_CKSUM,A7
MOVE A1,A0
CALLA WC_BYTE
MMFM SP,A1,A7,A0
RETS
**************************************************************************
*
* CCCC
*
* Check_Coin_and_Clear_on_bad_Checksum.
*
* This is called before operations that deal with
* the coinage and credits values.
*
* It checks to see if the area is in tact. If it
* is, then no action is performed.
*
* Else, it clears our all values (credits, etc.)
* so that nothing is given away erroneously.
*
**************************************************************************
CCCC
MMTM SP,A0,A1,A7,A2
CALLR FORM_COIN_CKSUM ;THIS SETS US TO THE COINAGE PAGE!
JRZ CCCCX ;ALL IS OK!
MOVI COIN_CKSUM_START,A7 ;POINT AT FIRST BYTE
MOVI COIN_CKSUM_BYTES,A2 ;NUMBER OF BYTES TO CLEAR
CLR A0
CCCC_LOOP
CALLA WC_BYTEI ;WRITE A BYTE
DSJS A2,CCCC_LOOP ;UNTIL THEY'RE DONE!
CALLR FORM_COIN_CKSUM_AND_STORE ;NOW MAKE THE CKSUM VALID
CCCCX
MMFM SP,A0,A1,A7,A2
RETS
**************************************************************************
*
* COIN_PAG
*
* THIS SETS THE CURRENT CMOS PAGE FOR COIN/CREDITS
*
**************************************************************************
COIN_PAG
PUSH a1
MOVI COIN_SELECT,A1 ;THIS IS COIN/CREDITS PAGE
CALLA SET_PAGE ;SET IT PLEASE
MMFM SP,A1
RETS
********************************
* Add the # of players to the audit
* A0=Audit #
* Trashes A0-A1,B0-B1
SUBR aud_addnumplyrs
movk 1,a1 ;1 plyr
move @PSTATUS,b0
subk 3,b0
jrne aanp50 ;Only 1?
movk 2,a1 ;2 plyrs
aanp50 jruc AUD
**************************************************************************
*
* AUDIT HANDLING
*
**************************************************************************
*
* POINT_AT_AUDIT
*
* THIS IS CALLED TO POINT AT THE AUDIT INDICATED BY
* A0. A0 IS THE AUDIT NUMBER 0-30. A7 IS RETURNED
* POINTING AT THE BEGINNING OF THE AUDIT.
*
**************************************************************************
POINT_AT_AUDIT
PUSH a1
CALLR AUDIT_PAGE
MOVI AUD_SIZE,A7 ;THIS IS SIZE PER AUDIT
MPYU A0,A7 ;A1 NOW HAS OFFSET
ADDI AUDITORG,A7 ;ADD BASE
MMFM SP,A1
RETS
AUDIT_PAGE
PUSH a1
MOVI AUDIT_SELECT,A1 ;THIS IS AUDIT PAGE
CALLA SET_PAGE ;SET IT PLEASE
MMFM SP,A1
RETS
**************************************************************************
*
* FORM_AUD_CKSUM
*
* THIS IS CALLED TO FORM THE CHECKSUM FOR THE AUDIT
* SPECIFIED IN A0.
*
* A1 RETURNS THE CHECKSUM.
*
* Z BIT IS SET BASED ON WHETHER IT MATCHES THE CHECKSUM THERE.
*
**************************************************************************
FORM_AUD_CKSUM
MMTM SP,A0,A4,A7
CALLR POINT_AT_AUDIT ;A7 = POINTER TO CURRENT ENTRY
MMTM SP,A7 ;SAVE POINTER TO ENTRY
MOVI AUD_BYTES_TO_CHECK,A4 ;COUNT DOWN THE BYTES
CLR A1 ;KEEP SUM IN A1
ADD_A_BYTE
CALLA RC_BYTEI ;GET A BYTE INTO A0
ADD A0,A1 ;ADD TO SUM
DSJ A4,ADD_A_BYTE ;ONE MORE ADDED
NOT A1 ;CHECKSUM IS NOW IN LOW WORD
ZEXT A1
; ANDI WORD_MASK,A1 ;MASK SO ITS COOL
MMFM SP,A7 ;GET POINTER BACK
ADDI AUD_CKSUM,A7 ;POINT AT CHECKBYTE
CALLA RC_WORD ;READ IN THE CKSUM
CMP A0,A1 ;COMPARE WHAT'S THERE TO WHAT WE GOT
MMFM SP,A0,A4,A7 ;Z BIT RETURNS COMPARE
RETS ;A1 RETURNS CKSUM
**************************************************************************
*
* STORE_AUD_CKSUM
*
* THIS WILL STORE THE AUDIT CHECKSUM IN A1 FOR THE
* AUDIT NUMBER SPECIFIED BY A0.
*
**************************************************************************
STORE_AUD_CKSUM
MMTM SP,A7,A0 ;POINTING REGISTER
CALLR POINT_AT_AUDIT ;A7 POINTS AT AUDIT
ADDI AUD_CKSUM,A7 ;POINT AT CHECKBYTE
MOVE A1,A0 ;GET CHECKBYTE IN A0
CALLA WC_WORD ;WRITE THE CKSUM
MMFM SP,A7,A0 ;POINTING REGISTER
RETS
**************************************************************************
*
* FORM_AUD_CKSUM_AND_STORE
*
* THE VALUE AT BAD_AUD IS USED TO DETERMINE WHETHER TO STORE
* THE CORRECT OR INCORRECT VALUE!
*
* A0 = AUDIT NUMBER
*
**************************************************************************
FORM_AUD_CKSUM_AND_STORE
MMTM SP,A1,A2 ;SAVE A1!
CALLR FORM_AUD_CKSUM
MOVE @BAD_AUD,A2 ;GET THE "FUDGE" WORD
XOR A2,A1 ;MAKE CKSUM BAD IF AUDIT IS BAD
CALLR STORE_AUD_CKSUM
MMFM SP,A1,A2
RETS
**************************************************************************
*
* GET_AUD
*
* THIS IS CALLED TO FETCH THE AUDIT VALUE FOR THE AUDIT
* SPECIFIED IN A0 INTO A1. IF THE CHECKBYTE FOR THE
* AUDIT IS INCORRECT, THEN RAM LOCATION BAD_AUD WILL BE
* SET TO 1.
*
**************************************************************************
GET_AUD
MMTM SP,A0,A7
CALLR FORM_AUD_CKSUM ;SEE IF CKSUM IS OK
JRZ FETCH_AUDIT_1 ;ITS OK....
MOVK 1,A1 ;CHECKSUM IS BAD
MOVE A1,@BAD_AUD ;SET THE FLAG!
FETCH_AUDIT_1
CALLR POINT_AT_AUDIT ;A7 POINTS AT AUDIT
ADDI AUD_DATA,A7 ;ADD ZERO OFFSET
CALLA RC_LONG ;FETCH THE LONG WORD TO A0
MOVE A0,A1 ;RETURN IN A1
MMFM SP,A0,A7
RETS
**************************************************************************
*
* STORE_AUDIT
*
* A0 = AUDIT NUMBER TO STORE VALUE FOR
* A1 = VALUE TO STORE.
* BAD_AUD = NON ZERO IF BAD CHECKSUM IS TO BE MAINTAINED.
*
**************************************************************************
STORE_AUDIT
MMTM SP,A0,A7
CALLR POINT_AT_AUDIT ;A7 POINTS AT AUDIT
ADDI AUD_DATA,A7 ;ADD ZERO OFFSET
MOVE A1,A0 ;MOVE DATA TO WRITING REGISTER
CALLA WC_LONG ;WRITE THE DATA BACK
MMFM SP,A0,A7 ;GET AUDIT NUMBER BACK
JRUC FORM_AUD_CKSUM_AND_STORE ;STORE GOOD OR BAD CKSUM BASED
;ON BAD_AUD
**************************************************************************
*
* CLR_SUBS
*
* THIS IS CALLED TO CLEAR OUT THE COINAGE SUB-TOTALS.
*
**************************************************************************
;CLR_SUBS
; MOVI FRST_SUB,A0
; MOVI LAST_SUB,A1
; CALLR CLR_AUDR ;CLEAR EM OUT!
; RETP
;
**************************************************************************
*
* CLR_AUDR
*
* THIS IS CALLED TO CLEAR OUT A RANGE OF AUDITS.
* A0 = 1ST AUDIT NUMBER
* A1 = LAST AUDIT NUMBER (INCLUSIVE)
*
**************************************************************************
CLR_AUDR
MMTM SP,A0,A1,A2
MOVE A1,A2 ;MOVE "LAST" TO A2
CLR A1 ;WE'LL STORE ZEROS
MOVE A1,@BAD_AUD ;MAKE CKSUMS GOOD ON STORING
CAR1
CALLR STORE_AUDIT ;STORE THIS AUDIT
INC A0 ;KICK TO NEXT AUDIT
CMP A2,A0
JRLS CAR1
MMFM SP,A0,A1,A2
RETS
**************************************************************************
*
* CLR_DUMP_AUD
*
* This is called by both joysticks down while looking
* at dump page. It clears out the audits associated
* with that page.
*
**************************************************************************
;CLR_DUMP_AUD
; MOVI AUDDOGGY,A0
; CALLR KILL_AUD
; MOVI AUDLOCK,A0
; CALLR KILL_AUD
; MOVI AUDTRAP,A0
; CALLR KILL_AUD
; MOVI AUDSURV,A0
; CALLR KILL_AUD
; MOVI AUDBONE,A0
; CALLR KILL_AUD
; RETS
**************************************************************************
*
* KILL_AUD
*
* This is called to clear out an audit.
*
* A0 = audit number.
*
**************************************************************************
KILL_AUD
PUSH a1
CLR A1 ;WE'LL STORE ZEROS
MOVE A1,@BAD_AUD ;MAKE CKSUMS GOOD ON STORING
CALLR STORE_AUDIT ;STORE THIS AUDIT
MMFM SP,A1
RETS
**************************************************************************
*
* AUD
*
* A0 = AUDIT NUMBER.......A1 = COUNT TO ADD.
*
**************************************************************************
AUD
MMTM SP,A1,A2
CLR A2 ;SET "BAD_AUD" GOOD UNTIL OTHERWISE PROVEN!
MOVE A2,@BAD_AUD ;ITS GOOD.
MOVE A1,A2 ;COPY OUR COUNT
CALLR GET_AUD ;FETCH THE CURRENT AUDIT COUNTER
ADD A2,A1 ;ADD THE NEW COUNT
CALLR STORE_AUDIT ;STORE IT BACK
CALLR DEF_PAGE ;SWITCH PAGE AWAY FROM THE DATA!
MMFM SP,A1,A2
RETS
AUD1
PUSH a1
MOVK 1,A1
CALLR AUD
MMFM SP,A1
RETS
**************************************************************************
*
* CLR_AUD
*
* This is called to clear out all of the audits.
*
* A relatively easy task given the primitives available.
*
**************************************************************************
CLR_AUD
MMTM SP,A0,A1
MOVK 1,A0 ;START AT AUDIT 1
MOVI N_AUDITS-1,A1 ;THIS IS TOTAL ALLOCATED
CALLR CLR_AUDR
MMFM SP,A0,A1
RETS
**************************************************************************
*
* ADJUSTMENTS
*
**************************************************************************
**************************************************************************
*
* CMOS_VAL
*
* ARE ADJUSTMENTS AND NAME/REV OK?
*
* .EQ. MEANS YES
* .NE. MEANS NO
*
**************************************************************************
CMOS_VAL
CALLR FORM_ADC ;SEE IF CKSUM IS OK.
JRNZ CMOS_BAD ;NOPE....RETURN .NE.
CALLR CHECK_NAME_AND_REV ;HOW ABOUT THE NAME AND REV?
CMOS_BAD
RETS
**************************************************************************
*
* Adjustments are all stored as long words in CMOS.
* They are referenced by adjustment number. Stuff
* adjustment number in A0. Call GET_ADJ and the
* value is returned in A0.
*
**************************************************************************
**************************************************************************
*
* FORM_ADC
*
* THIS IS CALLED TO FORM THE CHECKSUM FOR THE ADJUSTMENTS
* AREA. IT IS RETURNED IN A1.
*
* IT IS COMPARED TO THE REAL CHECKSUM AND .EQ. RETURNED IF OK.
*
**************************************************************************
FORM_ADC
MMTM SP,A7,A0,A6
CALLR ADJ_PAGE ;SET CMOS PAGE FOR ADJUSTMENTS
MOVI ADJUSTORG,A7 ;POINT AT FIRST BYTE
MOVI ADJ_BYTES_TO_CHECK,A6 ;NUMBER OF BYTES
CLR A1 ;ACCUMULATE CKSUM HERE
ADJ_C1
CALLA RC_BYTEI ;READ A BYTE
ADD A0,A1 ;ADD THE BYTE TO THE SUM
DSJS A6,ADJ_C1
NOT A1 ;COMPLEMENT THE SUM
ZEXT A1
MOVI ADJ_CKSUM,A7
CALLA RC_WORD ;FETCH THE CHECKSUM
CMP A0,A1 ;COMPARE TO FETCHED VALUE
MMFM SP,A7,A0,A6
RETS
**************************************************************************
*
* F_ADC_S
*
* CALCULATE THE ADJUSTMENT CHECKSUM AND STORE THE
* NEW VALUE.
*
**************************************************************************
F_ADC_S
MMTM SP,A0,A1,A7
CALLR FORM_ADC ;FORM THE CKSUM
MOVE A1,A0 ;PUT IN CMOS WRITING REGGIE
MOVI ADJ_CKSUM,A7
CALLA WC_WORD ;AND STORE IT
MMFM SP,A0,A1,A7
RETS
**************************************************************************
*
* GET_ADJ
*
* THIS IS CALLED TO FETCH THE VALUE OF AN ADJUSTMENT.
*
* THE ADJUSTMENT NUMBER IS GIVEN IN A0.
* THE VALUE FOR THE ADJUSTMENT IS RETURNED IN A0.
*
**************************************************************************
GET_ADJ
PUSH a1,a7
CALLR ADJPOINT ;POINT AT ADJUSTMENT
CALLA RC_LONG ;FETCH THE ADJUST PLEASE
CALLR DEF_PAGE
PULL a1,a7
MOVE A0,A0 ;RETURN Z BIT BASED ON ADJUSTMENT!
RETS
**************************************************************************
*
* PUT_ADJ
*
* ADJUST NUMBER IN A0.
* VALUE IN A1.
* STORE IT!........
*
* ****************** THIS IS A UTILITY......IT DOES NOT
* CORRECT ANY CHECKSUM CHANGE THAT
* MAY OCCUR!!
*
**************************************************************************
PUT_ADJ
PUSH a0,a7
CALLR ADJPOINT ;POINT AT REQUESTED ADJ.
MOVE A1,A0 ;GET VALUE IN WRITING REGGIE!
CALLA WC_LONG ;WRITE THE ADJUSTMENT
CALLR DEF_PAGE ;SWAP PAGE AWAY.
MMFM SP,A7,A0
RETS
ADJPOINT
CALLR ADJ_PAGE ;SET CMOS PAGE FOR ADJUSTMENTS
MOVI ADJ_SIZE,A7 ;SIZE PER ADJUSTMENT IN A7
MPYU A0,A7 ;TIMES ADJUSTMENT REQUESTED.
ADDI ADJUSTORG,A7 ;ADD TO BASE
RETS
GET_ADJ_FOR_COIN
CALLR GET_ADJ ;GET THE ADJUSTMENT
JAUC COIN_PAG ;THEN RE-INSTATE THE COIN PAGE!
**************************************************************************
*
* CHECK_NAME_AND_REV
*
* THIS ROUTINE IS CALLED TO SEE IF THE GAME NAME/REV IS
* CORRECT. IF IT IS NOT, THE GAME WILL AUTOMATICALLY
* FACTORY SET. Z MEANS OK!
*
**************************************************************************
CHECK_NAME_AND_REV
MMTM SP,A0,A1,A2,A3,A7
CALLR ADJ_PAGE ;MAKE SURE WE'RE ON THE CORRECT PAGE
MOVI NAME_REV,A7 ;POINT AT CMOS NAME STORAGE
MOVI ROM_NAME,A1 ;POINT AT OUR VERSION
MOVI NAME_REV_SIZE,A2 ;MAXIMUM NAME SIZE
NEXT_LET1
CALLA RC_BYTEI ;FETCH A BYTE
MOVB *A1,A3 ;GET 1 FROM ROM
SLL 24,A3
SRL 24,A3
CMP A3,A0 ;THEY BETTER BE THE SAME
JRNZ RETURN_NOW ;NOPE....BYE (RETURN .NE.)
ADDK BYTE_SIZE,A1 ;KICK SOURCE POINTER
MOVE A0,A0 ;WAS IT A ZERO?
JRZ RETURN_NOW ;YEP....NO MORE (RETURN .EQ.)
DSJS A2,NEXT_LET1
CLR A0 ;RETURN .EQ.
RETURN_NOW
MMFM SP,A0,A1,A2,A3,A7
RETS
**************************************************************************
*
* ADJ_PAGE
*
* THIS SETS THE CURRENT CMOS PAGE FOR ADJUSTMENTS.
*
**************************************************************************
ADJ_PAGE
PUSH a1
MOVI ADJUST_SELECT,A1 ;THIS IS AUDIT PAGE
CALLA SET_PAGE ;SET IT PLEASE
MMFM SP,A1
RETS
**************************************************************************
*
* DEF_PAGE
*
* THIS SWITCHES TO "DEFAULT" PAGE. THE DEFAULT
* PAGE IS THE ONE THAT WE WOULD LIKE TO SMASH
* MOST IN THE CASE OF A CRASH. AFTER MOST
* PROCESSING, WE SWITCH TO THIS PAGE!
*
**************************************************************************
DEF_PAGE
.if 0
PUSHST ;PRESERVE CODES THAT ARE BEING RETURNED
PUSH a1
MOVI TODAYS_SELECT,A1 ;THIS IS TODAY'S HIGH SCORES PAGE
CALLA SET_PAGE ;SET IT PLEASE
PULL a1
POPST
.endif
RETS
**************************************************************************
* FAC_SET - Restores the factory settings to the adjustments
* A0=Mode (0=All adjustments, 1=Only coinage)
FAC_SET
PUSH a1,a2,a7
move a0,-*sp
subk 1,a0
jreq fs20 ;Just coinage?
;MJT
.ref clear_player_records
calla clear_player_records
calla opmsg_clr
;;; CALLR DUMP_FS ;CLEAR OUT "DUMP" MEMORY
;;; (stomps on player records)
CALLR NO_CREDS ;REMOVE ANY COINS
CALLR ADJ_PAGE ;SET CMOS PAGE CORRECTLY
MOVI FACTORY_TABLE,A1 ;ROM
MOVI ADJUSTORG,A7 ;CMOS
MOVI N_ADJUSTS,A2 ;NUMBER OF ADJUSTMENTS ALLOCATED
FACS1
MOVE *A1+,A0 ;FETCH A ROM LONG WORD
ZEXT A0
CALLA WC_LONGI ;WRITE THE WORD TO CMOS
DSJS A2,FACS1 ;WRITE 1 LONG WORD PER ADJUST
fs20
; .if YUNIT
; move @SWITCH+>30,a1
; btst 6,a1
; jrnz fs80
; not a1
; sll 32-5,a1
; srl 32-5-3,a1 ;*8
; cmpi (dctend-dipcoinage_t),a1
; jrhs fs50 ;Illegal setting?
; addi dipcoinage_t,a1
; movb *a1,a1
; movk ADJPRICE,a0 ;Master priceing
; callr PUT_ADJ
;fs50
; movk ADJFREPL,a0 ;Free play
; clr a1 ;Off
; callr PUT_ADJ
;fs80
; .endif
callr LD_CTAB ;EXPAND THE CSELCT VALUE
callr F_ADC_S ;MAKE THE CHECKSUM CORRECT.
move *sp+,a0
subk 1,a0
jreq fsx ;Only coinage?
* NOW STORE THE GAME NAME AND REVISION INFO
MOVI NAME_REV,A7 ;POINT AT CMOS NAME STORAGE
MOVI ROM_NAME,A1 ;POINT AT OUR VERSION
MOVI NAME_REV_SIZE,A2 ;MAXIMUM NAME SIZE
NEXT_LETTER
MOVB *A1,A0 ;FETCH A BYTE
CALLA WC_BYTEI ;WRITE IT TO CMOS
ADDK BYTE_SIZE,A1 ;KICK SOURCE POINTER
move a0,a0
jrz fsx ;End?
DSJS A2,NEXT_LETTER
fsx PULL a1,a2,a7
rets
;dipcoinage_t
; .byte 1,2,3, 10,11,12, 16,17,18, 29, 32, 33,34,35, 37
; .byte 39, 41,42, 43, 45,46, 49, 50, 52, 53, 54, 55
;dctend
.even
**************************************************************************
*
* SWITCH_FOR_JUMPER
*
* THIS IS CALLED OUT OF THE FACTORY SETTING SEQUENCE.
* IT CHECKS FOR JUMPER COMBINATIONS INDICATING
* GERMAN OR FRENCH GAMES.
*
* THE JUMPERS ARE CONNECTED AS FOLLOWS:
*
* GERMAN JUMPER = BIT 15 OF "COINS"
* FRENCH JUMPER = BIT 14 OF "COINS"
*
* IF BOTH JUMPERS ARE IN, OR BOTH ARE MISSING, THEN
* ITS U.S. DEFAULT....LEAVE EVERYTHING ALONE.
*
* IF GERMAN IS MISSING (READ AS A 1) THEN USE
* GERMAN 1 COINAGE.
*
* IF FRENCH IS MISSING THEN USE FRENCH 1 COINAGE.
*
**************************************************************************
;SWITCH_FOR_JUMPER
; MMTM SP,A0
; MOVE @COINS,A0 ;GET THE 16 BITS
; ANDI JUMPERS,A0 ;JUST KEEP THE BITS
; JRZ USA ;BOTH ARE IN...US!
;
; CMPI JUMPERS,A0 ;ARE BOTH MISSING?
; JRZ USA ;YEP....US.
;
; CMPI GERMAN_BIT,A0 ;IS JUST THE GERMAN MISSING?
; JRNZ NOGERM ;NOPE
;
; CALLR DO_GERMAN ;DO THE GERMAN STUFF
; JRUC SFJX ;AND EXIT
;*
;* MUST BE FRENCH
;*
;NOGERM
; CALLR DO_FRENCH ;IF IT IS NOT POSSIBLE....DO IT.
;USA
;SFJX
; MMFM SP,A0
; RETS
;
;DO_FRENCH
; MMTM SP,A0,A1
; MOVK ADJPRICE,A0 ;AS MASTER PRICER.
; MOVI F1SEL,A1 ;USE FRENCH SELECTOR
; CALLA PUT_ADJ
; MMFM SP,A0,A1
; RETS
;
;DO_GERMAN
; MMTM SP,A0,A1
; MOVK ADJPRICE,A0 ;AS MASTER PRICER.
; MOVI G1SEL,A1 ;USE GERMAN SELECTOR
; CALLA PUT_ADJ
;
; MOVK ADJDIFF,A0
; MOVI 1,A1 ;DIFFICULTY 1 FOR GERMANS
; CALLA PUT_ADJ
;
; MOVK ADJBUYIN,A0
; MOVI 1,A1 ;EASY BUY-IN FOR GERMANS
; CALLA PUT_ADJ
;
; MMFM SP,A0,A1
; RETS
**************************************************************************
*
* LD_CTAB
*
* THIS IS CALLED TO STORE THE CSELCT VALUES FOR
* THE COIN SELECTOR STORED AS ADJPRICE.
*
**************************************************************************
LD_CTAB
mmtm sp,a0,a6,a1
calla GET_CSPT ;A6=CSELCT table
;{
.IF 0
movk 1,a1
move *a6(16*4),a0
jrnn lct5 ;Normal 1 credit to start?
movk 2,a1
lct5 movk ADJCSTRT,a0
callr PUT_ADJ
movk 1,a1
movk ADJCCONT,a0
callr PUT_ADJ
movk ADJC1,a0 ;1st one to store
lct8 move *a6+,a1 ;Get word
abs a1
callr PUT_ADJ ;Write this one to memory
addk 1,a0
cmpi ADJCX,a0
jrls lct8
.ENDIF
;}
movi ADJLMULT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJCMULT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJRMULT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJXMULT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJCUNIT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJBUNIT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJMUNIT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJCSTRT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJCCONT,a0
move *a6+,a1
calla PUT_ADJ
movi ADJCDIV,a0
move *a6+,a1
calla PUT_ADJ
movi ADJFRAC,a0
move *a6+,a1
calla PUT_ADJ
movk ADJVIRGIN,a0 ;THIS SAYS 1ST 8 UNTOUCHED.
movk 1,a1
callr PUT_ADJ
movk ADJ1ST6,a0 ;THIS SAYS 1ST 6 UNTOUCHED.
movk 1,a1
callr PUT_ADJ ;DONE!
mmfm sp,a0,a6,a1
rets
**************************************************************************
*
* CC_COIN
* MMTM SP,A7
* CALLR COIN_PAG
* MOVI HSR_C,A7
* CALLA RC_LONG ;GET THE TABLE COUNTER
* JRZ CCC_X ;ITS DOWN
* DEC A0 ;1 LESS
* CALLA WC_LONG
* CCC_X MMFM SP,A7
* RETS
*
**************************************************************************
**************************************************************************
*
* L_MESS
*
* A8 POINTS AT MESS_MAC FOLLOWED BY MESSAGE TEXT.
* POP ALL REGGIES LEAVING A8 POINTING AT TEXT.
* AND JUMP TO THE TEXT PROCESSOR!
*
* THE MMFM POPS THE ROUTINE TO CALL INTO A1.
*
* YOU ***MUST*** USE JSRP TO GET HERE. WE JUMP TO
* THE STRING ROUTINE WHICH WILL RETP BACK TO THE CALLER!
*
**************************************************************************
L_MESS_LOOP
addk BYTE_SIZE,a8 ;PUSH BEYOND THIS BYTE
L_MESS addk >f,a8 ;Round up word
srl 4,a8
sll 4,a8
MMFM A8,A1,A6,A9,A10,A11 ;LOAD UP REGGIES FROM A8.
CLR A0 ;NEVER SLEEP!
MOVI L_RET,A7
MOVE A7,-*A12,L ;PUSH RET ADDR
JUMP A1 ;JUMP TO THE ROUTINE.
L_RET MOVB *A8,A0 ;CHECK NEXT BYTE 0=DONE...1=MORE.
JRNZ L_MESS_LOOP
RETP
**************************************************************************
*
* LM_SETUP
*
* THIS IS CALLED TO SETUP THE WORLD FOR A STRING
* OPERATION, BUT NOT PHYSICALLY MAKE THE CALL.
*
* THIS ALLOWS TWEAKING OF REGGIES BEFORE THE CALL.
*
* LM_FINIS
*
* THIS IS CALLED ONCE THE MODIFICATIONS ARE MADE!
*
**************************************************************************
LM_SETUP
MMFM A8,A1,A6,A9,A10,A11 ;LOAD UP REGGIES FROM A8.
CLR A0 ;DON'T SLEEP
RETS
LM_FINIS
JUMP A1 ;THIS RUNS ROUTINE AND
**************************************************************************
*
* GET_CSTR
*
* HERE WE FORM THE CREDITS STRING AND
* RETURN IT IN THE STRING BUFFER.
* WE RETURN A8 POINTING AT THIS BUFFER.
*
* WE ALSO PUT APPROPRIATE FRACTION ON THE
* END IF ADJUSTED ACCORDINGLY.
*
**************************************************************************
GET_CSTR
MOVK ADJFREPL,A0 ;ARE WE IN FREE PLAY?
CALLA GET_ADJ
JRZ NOT_FREE
MOVI MESS_FREEP,A8 ;RETURN POINTING AT FREE PLAY MESSAGE
JRUC GET_CX
NOT_FREE
CALLA STR_OBJ ;ALLOCATE AN OBJECT PLEASE
JRC NO_SOBJ ;NONE TO USE!
MOVI MESS_CREDITS,A8 ;POINT AT TEXT PART
CALLA STRCAT ;BUILD THIS IN.
CALLR CRED_P
MOVE A0,A10 ;SAVE CREDITS
CALLR CAT_A0
*
* NOW WE NEED TO SEE IF WE SHOULD ADD A FRACTION.
*
MOVK ADJFRAC,A0
CALLA GET_ADJ ;CHECK THE ADJUSTMENT
JRZ NSFRAC ;DON'T SHOW IT!
*
* ADD ANY FRACTION WE HAVE.
*
CALLR COIN_PAG ;PUT US ON COIN PAGE
CALLR GET_CUNITS ;A0 HAS CUNITS
CALLR DEF_PAGE ;FLIP CMOS AWAY
MOVE A0,A0 ;ZERO?
JRZ NSFRAC ;THEN NO FRACTION.
*
* WE HAVE A FRACTION...WERE THE CREDITS ZERO?
*
MOVE A10,A10 ;WE SAVED EM IN A10
JRNZ NZM ;NON ZERO MANTISSA
MOVE A7,A8 ;WALK DOWN STRING LOOKING FOR THE "ZERO"
KILL_Z
MOVB *A8,A1 ;GET A BYTE
JRZ NZM ;COULDN'T FIND IT....GO ON.
CMPI LET_0,A1 ;IS THIS THE ZERO?
JRZ GOT_ZERO
ADDK BYTE_SIZE,A8
JRUC KILL_Z
GOT_ZERO
CLR A1
MOVB A1,*A8 ;KILL THE ZERO
NZM
MOVI MESS_2SPACE,A8 ;SPACE BET. MANTISSA AND DENMO
CALLA STRCAT
NOT_ZM
CALLR CAT_A0 ;ADD A0 ONTO FRACTION
MOVI MESS_SLASH,A8
CALLA STRCAT ;ADD SLASH
MOVK ADJCUNIT,A0 ;UNITS REQUIRED FOR CREDIT
CALLA GET_ADJ
CALLR CAT_A0 ;DENOMINATOR
NSFRAC
MOVE A7,A8 ;MOVE "OBJECT" TO A8
MOVI STRNGRAM,A7 ;POINT AT STRING RAM
CLR A0
MOVB A0,*A7 ;STRINGRAM IS NULL
CALLA STRCAT ;COPY THE STRING OUT OF OBJECT BLOCK
MOVE A7,A8
CALLA STR_FREE ;AND FREE UP THE OBJECT BLOCK
GET_CX
CLRC ;RETURN OK
GET_CXX
RETS
*
* NO OBJECTS AVAILABLE TO FORM STRING
*
NO_SOBJ
MOVI MESS_NULL,A8
SETC
JRUC GET_CXX ;RETURN BLANK STRING!
**************************************************************************
*
* CAT_A0
*
* A0 HAS A BINARY NUMBER. TURN INTO DECIMAL STRING
* AND CONCATONATE TO THE STRING WE'RE BUILDING IN A7. *
*
**************************************************************************
CAT_A0
PUSH a8
MOVE A0,A8 ;CREDIT COUNT IN A8
CALLA HEXTOASC ;STRING
CALLA STRCAT ;NOW WE HAVE WHOLE NUMBER.
MMFM SP,A8
RETS
**************************************************************************
*
* ADD_PROMPT
*
* THIS IS CALLED ON THE CREDITS PAGE TO ADD A WORD OF
* WISDOM BELOW THE CREDITS MESSAGE. IT PICKS OUT THE
* CORRECT MESSAGES AND BLINKS THEM.
*
**************************************************************************
ADD_PROMPT
MOVI PROMPT_PROC,A7
CALLA P_FORK ;START UP ANOTHER W/ SAME ID TO FLASH!
RETP
PROMPT_PROC
MOVK ADJFREPL,A0
CALLA GET_ADJ
JRNZ rf4 ;ALWAYS READY FOR 4 PLAYERS!
CALLR CRED_P
JRZ PP1
MOVE A0,A1 ;PUT CREDITS IN A1
MOVK ADJCSTRT,A0 ;GET AMOUNT NEEDED TO START.
CALLA GET_ADJ
CMP A0,A1 ;ARE THERE ENOUGH TO START?
JRLO PP1 ;NOPE...."INSERT COIN"
*
* WE HAVE ENOUGH TO START FOR 1....HOW ABOUT 2?
*
jrz PP2
move a0,a2
add a2,a2
cmp a1,a2
jrz RF2
jrhi PP2
add a0,a2
cmp a1,a2
jrhi RF2
add a0,a2
cmp a1,a2
jrhi rf3
*
* >1 = READY FOR 2 PLAYERS. PRESS START.
*
rf4
MOVI MESS_READY_4,A1
JRUC RED_1
rf3
MOVI MESS_READY_3,A1
JRUC RED_1
RF2
MOVI MESS_READY_2,A1
JRUC RED_1
PP1
MOVI MESS_INS_COIN,A0
CLR A1
JRUC RED_2
PP2
MOVI MESS_READY_1,A1
RED_1
MOVI MESS_PRESS_START,A0
RED_2
MOVE A0,*A13(PDATA),L ;HOLD MESSAGES
MOVE A1,*A13(PDATA+LONG_SIZE),L
BLINK_LOOP
MOVE *A13(PDATA),A8,L ;FIRST MESSAGE
JSRP L_MESS
MOVE *A13(PDATA+LONG_SIZE),A8,L ;2ND MESSAGE
JRZ BL1 ;NOT HOME!
JSRP L_MESS
BL1
SLEEPK 10H
MOVE *A13(PDATA),A8,L
CALLR LM_SETUP
CLR A6 ;BLACK
JSRP LM_FINIS
BL2
SLEEPK 10H
JRUC BLINK_LOOP
**************************************************************************
*
* MESSAGE SECTION
*
**************************************************************************
ROM_NAME
.byte "TOURNAMENT EDITION REV 4.0 3/23/94",0
.even
FACTORY_TABLE
.word 0 ;ADJNULL 0
.word 1 ;ADJPRICE 1 ;MASTER PRICING
.word 1 ;ADJLMULT 2
.word 4 ;ADJCMULT 3
.word 1 ;ADJRMULT 4
.word 0 ;ADJXMULT 5
.word 1 ;ADJCUNIT 6
.word 0 ;ADJBUNIT 7
.word 0 ;ADJMUNIT 8
.word 4 ;ADJCDIV 9
.word 1 ;ADJFRAC 10 ;NON ZERO SAYS SHOW HALF CREDITS
.word 2 ;ADJCSTRT 11 ;CREDITS REQUIRED TO START
.word 2 ;ADJCCONT 12 ;CREDITS REQUIRED TO CONTINUE
.word 3 ;ADJDIFF 13 ;Difficulty
.word 0 ; 14
.word 0 ; 15
.word 1 ;ADJMUSIC 16 ;attract mode music = off
.word 50 ;ADJMAXC 17 ;MAXIMUM CREDITS
.word 0 ;ADJFREPL 18 ;NON-ZERO MEANS FREE PLAY
.word 1 ;ADJVIRGIN 19 ;NON-ZERO MEANS 1ST 8 OF COIN ADJUST BLOCK UNTOUCHED
.word 8 ;ADJFULLG 20 ;credits needed to purchase full game (4-16)
.word 1 ;ADJ1ST6 21 ;NON-ZERO MEANS 1ST 6 UNTOUCHED.
.word 0 ;ADJNOCPAG 22
.word 1 ;ADJCNTR 23 ;COIN COUNTER MODE
.word 3 ;ADJSPEED 24 ;game timer speed (1-5)
.word 1 ;ADJHEADSZ 25 ;player head sizes (1-2)
.word 1 ;ADJWINMODE 26 ;(winner stays free)
.word 1 ;ADJCOMPASS 27 ;computer assistance (0=on)
.word 1 ;ADJTOURNEY 28 ;Tournament mode (0=on)
**
.if 0
.word 0 ;ADJ_UNUSED 0
.word 2 ;ADJ_PRICING 1 ;MASTER PRICING
.word 1 ;ADJ_LEFT_MULT 2
.word 1 ;ADJ_RIGHT_MULT 4
.word 4 ;ADJ_CENTER_MULT 3
.word 0 ;ADJ_EXTRA_MULT 5
.word 1 ;ADJ_UNITS_CREDIT 6
.word 0 ;ADJ_UNITS_BONUS 7
.word 0 ;ADJ_MIN_UNITS 8
.word 4 ;ADJCDIV 9 ;COINS PER DOLLAR
.word 1 ;SHOW FRACTIONS 10
.word 1 ;ADJ_START_CRED 11 ;CREDITS REQUIRED TO START
.word 1 ;ADJ_CONT_CRED 12 ;CREDITS REQUIRED TO CONTINUE
.word 3 ;ADJ_DIFFICULTY 13
.word 5000 ;ADJ_HSRESET 14
.word 3 ;ADJ_LIVES 15
.word 0 ;ADJ_AMODE_MUSIC 16
.word 50 ;MAXIMUM CREDITS 17
.word 0 ;FREE PLAY 18
.word 1 ;NON-ZERO MEANS COIN BLOCK (1ST 8) UNTOUCHED 19
.word 0 ;ZERO MEANS NORMAL GORE ... 1 = SOFTEN IT 20
.word 1 ;NON-ZERO MEANS 1ST 6 UNTOUCHED. 21
.word 0 ;NON-ZERO MEANS NO COIN-SPECIFIC MESSAGE ON COIN PAGE 21
.word 1 ;ADJCNTR 23 ADJUST MECH COIN COUNTER
.endif
* A0 = SLEEP
* A1 = ROUTINE
* A6 = COLOR
* A8 = STRING POINTER
* A9 = SCREEN ADDRESS
* A10 = SPACING
* A11 = FONT
* A14 = FLAGS
*
MESS_CREDITS
.byte "CREDITS: ",0
.even
* NORMAL CREDITS SETUP STRING
*
MESS_CNUM
MESS_MAC RD15FONT,SPACING20,CP_CX,135,ROBO_LF,STRCNRM,0
*
* "LOW" CREDITS SETUP STRING WHEN EXTRA ADVICE ON PRICING
* IS BEING ADDED.
*
MESS_LOWNUM
MESS_MAC RD15FONT,SPACING20,CP_CX,135,ROBO_LF,STRCNRM,0
MESS_FREEP
.byte "FREE PLAY",0,0
.even
MESS_READY_1
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
.byte "READY FOR 1 PLAYER",0,0
.even
MESS_READY_2
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
.byte "READY FOR 1 - 2 PLAYERS",0,0
.even
MESS_READY_3
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
.byte "READY FOR 1 - 3 PLAYERS",0,0
.even
MESS_READY_4
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
.byte "READY FOR 1 - 4 PLAYERS",0,0
.even
MESS_INS_COIN
MESS_MAC RD15FONT,SPACING20,CP_CX,175,ROBO_YELLOW,STRCNRM,0
.byte "INSERT COINS",0,0
.even
MESS_PRESS_START
MESS_MAC RD15FONT,SPACING20,CP_CX,175,ROBO_YELLOW,STRCNRM,0
.byte "PRESS START",0,0
.even
.if 0
**************************************************************************
*
* DUMPING SOFTWARE
*
**************************************************************************
DUMP_FS
CALLR DUMP_PAGE
CLR A0
MOVI DUMP_PTR,A7
CALLA WC_WORD ;SET NUMBER OF DUMPS TO ZERO
RETS
**************************************************************************
*
* ADD_DUMP
*
* THIS IS CALLED TO RECORD A DUMP. A0 THROUGH A9 ARE
* RECORDED IN MEMORY.
*
**************************************************************************
DUMP_SIZE .equ 10*C_LONG_SIZE ;9 LONG WORDS.
DUMP_LAST .equ CMOS+>8000-DUMP_SIZE ;Let em use the whole page!
MAX_DUMP .equ 8 ;DON'T HOLD MORE THAN 12/PAGE
ADD_DUMP
MMTM SP,B0,B1,B2
MMTM SP,A0,A1,A7
CALLR DUMP_PAGE ;SET CMOS PAGE CORRECTLY.
MOVE A0,B0
MOVE A7,B2 ;SAVE THESE!
MOVE A1,B1
MOVI DUMP_PTR,A7
CALLA RC_WORD ;GET THE INDICATOR OF HOW MANY.
MOVI DUMP_SIZE,A1
MPYU A0,A1 ;THIS IS OFFSET INTO CMOS FOR THIS ENTRY!
ADDI DUMP_DATA,A1 ;NOW A1 POINTS WHERE WE'RE PUTTING THE DATA!
CMPI DUMP_LAST,A1 ;ARE WE TOO FAR FOR ANOTHER?
JRHS NO_DUMP ;YEP....SKIP IT
INC A0 ;1 MORE OUT THERE!
CALLA WC_WORD ;CHALK IT!
MOVE A1,A7 ;THIS IS POINTER TO STORE DATA.
MOVE B0,A0 ;THIS IS A0
CALLA WC_LONGI
MOVE B1,A0 ;THIS IS A1
CALLA WC_LONGI
MOVE A2,A0 ;THIS IS A2
CALLA WC_LONGI
MOVE A3,A0 ;THIS IS A3
CALLA WC_LONGI
MOVE A4,A0 ;THIS IS A4
CALLA WC_LONGI
MOVE A5,A0 ;THIS IS A5
CALLA WC_LONGI
MOVE A6,A0 ;THIS IS A6
CALLA WC_LONGI
MOVE B2,A0 ;THIS IS A7
CALLA WC_LONGI
MOVE A8,A0 ;THIS IS A8
CALLA WC_LONGI
MOVE A9,A0 ;THIS IS A9
CALLA WC_LONGI
NO_DUMP
MMFM SP,A0,A1,A7
MMFM SP,B0,B1,B2
RETS
DUMP_PAGE
PUSH a1
MOVI DUMP_SELECT,A1 ;THIS IS DUMP PAGE
CALLA SET_PAGE ;SET IT PLEASE
MMFM SP,A1
RETS
DISPDUMP
CALLR DUMP_PAGE
MOVI DUMP_PTR,A7
CALLA RC_WORD ;GET THE INDICATOR OF HOW MANY.
JRZ NOTHIN_TO_DUMP
CLR A9 ;THIS IS CURRENT ONE
MOVE A0,A8 ;THIS IS THE LAST ONE TO DO
DO_ANOTHER_DPAGE
CALLA CLR_SCRN ;CLEAR SCREEN
CALLR DUMP_PAGE
movk 20,a10 ;This is y coordiante of current one!
MOVI MAX_DUMP,A11 ;THIS IS MAX NUMBER PER PAGE.
DO_ANOTHER_DUMP
JSRP DO_DUMP
addk 30,a10 ;Kick y up
INC A9 ;KICK TO NEXT DUMP
CMP A8,A9 ;UNTIL THEY'RE ALL DONE!
JRHS DUMP_DONE ;WE'RE NOT ALL DONE YET!
DSJS A11,DO_ANOTHER_DUMP ;NOT FOR THIS PAGE EITHER!
JSRP WAIT_MUT ;WATCH FOR STICKS!
JRUC DO_ANOTHER_DPAGE
.endif
**************************************************************************
*
* WAIT_MUT
*
* THIS IS LIKE "WAIT_BUT"....WAIT FOR ANY BUTTON EXCEPT
* THAT IT WILL CLEAR OUT THE DUMPS IF BOTH STICKS ARE PUSHED
* DOWN.
*
**************************************************************************
WAIT_MUT
CALLA FORM_SWS ;1ST STATE DOESN'T COUNT
*
* RETURN CURRENT STATE IN A0..PREVIOUS STATE IN A1.
*
WB1
SLEEPK 1
CALLA FORM_SWS
MOVE A0,A2
ANDI 2002H,A2
CMPI 2002H,A2
JRNZ WB2 ;NOT "CLEAR"
; .REF GETSPEAK
; CALLA GETSPEAK
; SOUND1 COINSND
; MOVK 10,A0
; MOVE A0,@BTIME ;RESTUFF BUYIN TIMER
; callr conttimers_set
; CALLR DUMP_FS ;CLEAR OUT THE DUMPS!
; CALLR CLR_DUMP_AUD
JRUC WB1
getcoin
movi coin_snd,a0
jauc snd_play1ovr
WB2 NOT A1 ;LAST = 0 AND NOW = 1 MEANS EDGE!
AND A1,A0 ;1'S WHERE WE HAVE POSITIVE EDGE.
ANDI BUTTONS,A0 ;IS IT A BUTTON?
JRZ WB1
;DO NEW SOUND CALL HERE
SOUND1 beep2_snd
RETP
DUMP_DONE
RETP ;AND RETURN TO CALLER!
NOTHIN_TO_DUMP
CALLA CLR_SCRN ;PRINT SOMETHING PLEASE
MOVI MESS_NODUMP,A8
JSRP L_MESS
RETP
**************************************************************************
* DO_DUMP
* A9=DUMP NUMBER TO DO
* A10=Y POSITION.
.if 0
DO_DUMP
MMTM A12,A8,A9,A10,A11
MOVI DUMP_SIZE,A7
MPYU A9,A7 ;THIS IS OFFSET INTO CMOS FOR THIS ENTRY!
ADDI DUMP_DATA,A7 ;NOW A1 POINTS WHERE WE'RE PUTTING THE DATA!
*
* Y IS IN A10
*
MOVE A10,A3 ;Y IN A3
MOVK 30,A2 ;STORE X IN A2
MOVK 10,A5 ;NUMBER OF WORDS TO DUMP
NEXT_ELE
CALLA RC_LONGI ;GET A WORD
MOVE A0,A4 ;HEX IN A4
MOVE A7,*A13(PDATA),L
MOVE A2,*A13(PDATA+LONG_SIZE),L
MOVE A3,*A13(PDATA+(2*LONG_SIZE)),L
MOVE A5,*A13(PDATA+(3*LONG_SIZE)),L
JSRP WRITE_HEX ;WRITE IT OUT.....A0 = DATA
* A10 = Y
* A11 = X
MOVE *A13(PDATA),A7,L
MOVE *A13(PDATA+LONG_SIZE),A2,L
MOVE *A13(PDATA+(2*LONG_SIZE)),A3,L
MOVE *A13(PDATA+(3*LONG_SIZE)),A5,L
ADDI 48H,A2
CMPI 6,A5 ;WHEN WE'RE DOWN TO 4 SKIP TO NEXT LINE
JRNZ NO_SKIP_NOW
ADDK 12,A3 ;PUSH TO 2ND LINE
MOVI 33,A2 ;RE-MARGIN OVER. (30)
NO_SKIP_NOW
DSJ A5,NEXT_ELE
MMFM A12,A8,A9,A10,A11
RETP
.endif
**************************************************************************
*
* WRITE_HEX
*
* A4 = DATA
* A3 = Y
* A2 = X
*
**************************************************************************
WRITE_HEX
MOVI MESS_DUMP,A8
CALLR LM_SETUP ;SETUP FOR A DUMP!
MOVE A3,A9 ;MOVE Y DOWN
SLL 16,A9 ;SHIFT Y INTO PLACE
ADD A2,A9 ;ADD IN X
MOVE A4,A8
CLR A3 ;NO COMMAS!
CALLR HTOHXASC ;CONVERT PLEASE!
JSRP LM_FINIS
RETP
**************************************************************************
* HTOHXASC - CONVERTS A 32 BIT HEX # TO AN ASCII STRING TERMINATED BY 0
* A3=NON ZERO IF COMMAS ARE TO BE ADDED!
* A8=HEX #
* Rets:
* A8=PTR TO THE STRING
HTOHXASC
MMTM SP,A1,A2,A9
CLR A1
CLR A2 ;COMMA COUNT
MOVE A1,-*SP ;HERE'S THE NULL TERMINATOR
MOVK 16,A1 ;DIVISOR FOR HEX
MOVE A8,A9
HEXTASC2
CLR A8
DIVU A1,A8
ADDI '0',A9 ;MAKE THE REMAINDER ASCII
CMPI '9',A9 ;IS IT IN A-F RANGE?
JRLS HHH1
ADDI 7,A9 ;MAKE ALPHA!
HHH1
MOVE A9,-*SP ;SAVE HERE
MOVE A8,A9
JRZ HEXTASC3 ;BR = DONE!
INC A2
CMPI 3,A2 ;COMMA CHECK
JRLO HEXTASC2 ;BR = NO COMMA
*
* SEE IF WE'RE DOING COMMAS
*
MOVE A3,A3 ;COMMAS?
JRZ HEXTASC2 ;NOPE....IGNORE!
MOVI ',',A2
MOVE A2,-*SP ;STUFF A COMMA
CLR A2
JRUC HEXTASC2
HEXTASC3
MOVI STRNGRAM,A1 ;STORE HERE FOR BLOW OUT
MOVE A1,A8
HEXTASC4
MOVE *SP+,A9
MOVB A9,*A1
ADDK 8,A1
MOVE A9,A9
JRNZ HEXTASC4
MMFM SP,A1,A2,A9
RETS
**************************************************************************
* STRCAT - THIS IS CALLED TO CONCATONATE 2 STRINGS.
* A7 <--- <A7><A8>
* THAT IS.......CONCATONATE A8 ONTO THE END OF A7.
STRCAT
MMTM SP,A7,A0,A8
STRC2
MOVB *A7,A0 ;WALK DOWN A7 TO ITS ZERO.
JRZ STRC1 ;WE'RE THERE!
ADDK BYTE_SIZE,A7 ;KICK TO NEXT BYTE
JRUC STRC2
*
* NOW A7 POINTS AT ITS ZERO.
*
STRC1
MOVB *A8,A0 ;GET A BYTE FROM 2ND STRING
MOVB A0,*A7 ;ADD THIS TO 1ST STRING
ADDK BYTE_SIZE,A7
ADDK BYTE_SIZE,A8
MOVE A0,A0 ;DID WE JUST MOVE TERMINATOR?
JRNZ STRC1 ;NOPE...MOVE ANOTHER
MMFM SP,A7,A0,A8
RETS
MESS_DUMP
MESS_MAC RD7FONT,SPACING07,23,227,ROBO_WHITE,STRLNRM,0
MESS_NODUMP
MESS_MAC RD15FONT,SPACING20,200,128,ROBO_ORANGE,STRCNRM,0
.byte "NOTHING HERE....PRESS ADVANCE!",0,0
.even
MESS_SLASH
.byte "/",0
.even
MESS_2SPACE .byte " "
MESS_NULL .byte 0
.even
SETUP_1_OF_3
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_13,ROBO_LASER,STRCNRM,0
SETUP_2_OF_3
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_23,ROBO_LASER,STRCNRM,0
SETUP_3_OF_3
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_33,ROBO_LASER,STRCNRM,0
SETUP_1_OF_2
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_12,ROBO_LASER,STRCNRM,0
SETUP_2_OF_2
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_22,ROBO_LASER,STRCNRM,0
SETUP_1_OF_1
MESS_MAC RD15FONT,SPACING20,CP_CX,CP_11,ROBO_LASER,STRCNRM,0
dollar_mes
RJR_STR ogmd10_ascii,5,0,200,53,SGMD8RED,print_string_C2
.byte "THIS GAME ACCEPTS DOLLAR BILLS",0,0
.even
CPYR_MES
RJR_STR sgmd8_ascii,5,0,200,240,SGMD8YEL,print_string_C2
.byte " COPYRIGHT 1993 MIDWAY MANUFACTURING COMPANY",0,0
.even
MESS_MAC RD7FONT,SPACING07,CP_CX,240,ROBO_WHITE,STRCNRM,0
.byte " COPYRIGHT 1993 MIDWAY MANUFACTURING COMPANY",0,0
.even
;MEN_MES
; MESS_MAC RD7FONT,SPACING07,CP_CX+6,20,ROBO_WHITE,STRCNRM,0
; .byte "LIVES AWARDED AT START",0,0
; .even
;MEN_MES2
; MESS_MAC RD7FONT,SPACING07,CP_CX+6,30,ROBO_WHITE,STRCNRM,0
; .byte "LIVES AWARDED FOR A CONTINUE",0,0
; .even
.end