2957 lines
112 KiB
NASM
2957 lines
112 KiB
NASM
.FILE 'AUDIT.ASM'
|
||
.TITLE "ROBO AUDITS AND AJUSTMENTS HANDLING"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
;
|
||
; SOFTWARE BUFUS: LARRY DEMAR, ROBBI ASHWORTH, AND DR. J
|
||
;
|
||
; COPYRIGHT (C) 1990 WILLIAMS ELECTRONICS GAMES, INC.
|
||
;
|
||
;
|
||
; GET THE SYSTEM STUFF
|
||
|
||
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
|
||
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
|
||
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "ROBO.EQU"
|
||
.INCLUDE "LINK.EQU" ;LINK EQUATES
|
||
.INCLUDE "MENU.EQU" ;MENU EQUATES
|
||
|
||
.TEXT
|
||
|
||
*
|
||
* 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 P_TIMR,16 ;TIMER UNITS FOR GAME
|
||
; .BSS P2_TIMR,16 ;TIMER UNITS FOR 2 PLAYERS
|
||
.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 ;FLAG SAYS WE'RE HALFWAY THROUGH PUSS!
|
||
|
||
*
|
||
* IN THIS MODULE
|
||
.DEF C_FRAC,COINCNTR
|
||
.DEF L_MESS,AUD,AUD1,GET_ADJ
|
||
.DEF GET_AUD,SLAM_SW,STORE_AUDIT
|
||
.DEF CR_STRTP
|
||
.DEF CR_CONTP
|
||
.DEF P_START
|
||
.DEF P_CONT
|
||
.DEF CRED_P
|
||
.DEF L_TIMER
|
||
.DEF CRD_SCRN
|
||
.DEF ADD_DUMP
|
||
.DEF LM_SETUP
|
||
.DEF LM_FINIS
|
||
.DEF CMOS_VAL
|
||
.DEF CLR_AUD,FAC_SET,DISPDUMP
|
||
.DEF CLR_AUDR
|
||
.DEF FORM_ADC
|
||
.DEF F_ADC_S
|
||
.DEF BAD_AUD
|
||
.DEF ADJ_PAGE
|
||
.DEF STRCAT
|
||
; .DEF CLR_SUBS
|
||
.DEF NO_CREDS
|
||
.DEF COIN_PAG
|
||
.DEF CAT_A0
|
||
.DEF UNIT_CLR
|
||
.DEF CK_MAX
|
||
.DEF DUMP_FS
|
||
.DEF HTOHXASC
|
||
.DEF PUT_ADJ
|
||
.DEF LD_CTAB
|
||
.DEF DEF_PAGE
|
||
.DEF ROM_NAME
|
||
.DEF C_FLAGS
|
||
.DEF GET_CSTR
|
||
.DEF WAIT_MUT
|
||
.DEF UNSTACK
|
||
; .DEF COINIRQ
|
||
.DEF CLRSWPRC
|
||
.DEF KILL_CRD
|
||
.DEF CCCC
|
||
.DEF GET_CREDITS
|
||
|
||
.GLOBAL SYNCHALF,NOAUTOE,WDOGDIS,GAMSTATE
|
||
|
||
.REF STATUS,COINSND,BTIME,ATSTRT
|
||
|
||
*
|
||
* IN HSTD.ASM
|
||
*
|
||
.REF SET_PAGE,ENTERON,CANT
|
||
.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,CNTDIG1,CNTDIG2
|
||
.REF P1START
|
||
.REF P2START
|
||
|
||
*
|
||
* IN TEST.ASM
|
||
*
|
||
; .REF CK_DOOR
|
||
; .REF WT_ADV,WW_ADV
|
||
.REF WAIT_BUT
|
||
.REF FORM_SWS
|
||
;
|
||
; IN ROBOATT.ASM
|
||
;
|
||
.REF P1START
|
||
.REF P2START
|
||
|
||
*
|
||
* OTHERS
|
||
*
|
||
.REF SOUNDSUP
|
||
.REF RD15FONT,RD7FONT,DMAQWAIT,STRCNRM
|
||
.REF STRNGRAM,BLNKAREA,STRLNRM,HEXTOASC
|
||
.REF CLR_SCRN
|
||
.REF KILALL
|
||
.REF GETPRC,SWSTST,SWSTACK,SUCIDE
|
||
.REF ATSTRT
|
||
.REF GAMERASE,AUTOEON,AUTOEOFF
|
||
.REF COLRSTRT
|
||
;
|
||
; UNINITIALIZED RAM DEFINED IN THIS FILE
|
||
;
|
||
; SOUND EQUATES
|
||
;
|
||
.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 113H ;THIS IS 5 SECONDS. (Experimentally!)
|
||
|
||
L_TIMER:
|
||
MOVE @GAMSTATE,A0 ;CHECK IF ITS IN PLAY
|
||
CMPI INAMODE,A0
|
||
JREQ CK_OCTO ;ATTRACT MODE..CHECK OCTOPUS!
|
||
CMPI INDIAG,A0
|
||
JREQ NO_PLAY
|
||
CMPI INGAMEOV,A0
|
||
JREQ NO_PLAY
|
||
MOVE @STATUS,A2
|
||
JRZ NO_PLAY
|
||
;
|
||
; WE'RE PLAYING!
|
||
;
|
||
|
||
MOVE @TIMER,A1,W ;GET ELAPSED TIME
|
||
MOVE @P_TIMR,A0,W ;GET PLAY TIMER.
|
||
ADD A1,A0 ;ADD ELAPSED TIME
|
||
|
||
CMPI FIVE_SEC,A0 ;ARE WE AT 5 SECONDS?
|
||
JRLO LTIMX ;NOT YET
|
||
|
||
MOVI AUD1TIME,A0
|
||
CMPI 3,A2 ;CHECK TWO PLAYER GAME
|
||
JRNE ONE_PLYR ;NO
|
||
MOVI AUD2TIME,A0 ;YES, AUDIT DOUBLE
|
||
ONE_PLYR
|
||
CALLA AUD1 ;CHALK IT!
|
||
CLR A0
|
||
LTIMX
|
||
MOVE A0,@P_TIMR,W ;CLEAR OUT TIMER
|
||
NO_PLAY:
|
||
RETS
|
||
*
|
||
* ITS A-MODE...CHECK OCTOPUS!
|
||
*
|
||
CK_OCTO:
|
||
MOVE @SWITCH,A0,L ;CHECK FOR OCTOPUS
|
||
NOT A0
|
||
ANDI >24FFFF,A0 ;GET STICKS 'N STARTS
|
||
MOVE @OCT_FLG,A1,W ;GOT PART 1?
|
||
JRNZ CK_P2 ;YEP...CHECK FOR OTHER HALF
|
||
|
||
CMPI >00201001,A0 ;NO CHECK PART 1
|
||
JRNZ NO_OCTO ;NO ONE HOME
|
||
MOVI 60,A1,W ;ONE SEC TO GET PART TWO
|
||
CK_P2:
|
||
DEC A1 ;WAIT EXACTLY 1 SEC.
|
||
MOVE A1,@OCT_FLG,W ;GOT PART 1 SET FLAG
|
||
JRNE NO_OCTO
|
||
CMPI >00002008,A0 ;JOYSTICKS CORRECT?
|
||
JRNZ NO_OCTO ;BR= NOPE!
|
||
|
||
MOVI ACTIVE,A13
|
||
MOVI HID_P,A7 ;START THE PROCESS!
|
||
CLR A1
|
||
CALLA GETPRC ;THAT'S ALL FOLKS!
|
||
NO_OCTO:
|
||
RETS
|
||
;
|
||
;UNSTACK THE SWITCHES FOR OTHER THAN PLAYER CONTROLS
|
||
;
|
||
UNSTACK:
|
||
MOVI SWSTST,A0 ;INITIALIZE SWITCH STACK
|
||
MOVE A0,@SWSTACK,L
|
||
UNSTKL:
|
||
MOVE @SWSTACK,A3,L
|
||
CMPI SWSTST,A3,L ;STACK AT START?
|
||
JREQ UNSTKX ;BR=NO SWITCHES ACTIVE
|
||
MOVE @FREE,A0,L
|
||
JRZ UNSTKX ;NO PROCESSES LEFT, TRY NEXT TIME AROUND
|
||
MOVE *A3+,A0,W ;GET ENTRY
|
||
MOVE A3,@SWSTACK,L ;UPDATE STACK
|
||
SLL 27,A0 ;MAX SWITCH # = 31
|
||
SRL 27,A0
|
||
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 UNSTKL ;NULL ENTRY
|
||
CALLA GETPRC ;SPAWN THE PROCESS
|
||
UNSTKX:
|
||
SLEEP 1
|
||
JRUC UNSTKL
|
||
*
|
||
*GIVE HIM A SERVICE CREDIT
|
||
*
|
||
SERVICE
|
||
MOVE @GAMSTATE,A0,W ;DIAGNOSTICS?
|
||
CMPI INDIAG,A0
|
||
JREQ SERVICX ;THEN NO ACTION!
|
||
|
||
CALLR CCCC ;MAKE SURE THINGS ARE IN TACT
|
||
|
||
MOVI AUDSERV,A0
|
||
CALLA AUD1 ;CHALK UP A SERVICE CREDITS!
|
||
|
||
SOUND1 COINSND
|
||
|
||
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
|
||
JRUC CREDSP
|
||
SERVICX
|
||
DIE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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 @GAMSTATE,A0
|
||
CMPI INDIAG,A0
|
||
JREQ FREEZE_DIE ;NO FREEZE SHIT DURING DIAGNOSTICS
|
||
|
||
; CMPI INAMODE,A0
|
||
; JAEQ DIAG ;GAME ONLY PLEASE
|
||
; CMPI INGAMEOV,A0
|
||
; JAEQ DIAG
|
||
|
||
CALLA SYNCHALF
|
||
MOVE @NOAUTOE,A8,W
|
||
MOVK 1,A0
|
||
MOVE A0,@NOAUTOE,W
|
||
CALLA AUTOEOFF ;SHUT OFF AUTO-ERASE
|
||
CLR A0
|
||
MOVE A0,@DISPLAYON
|
||
CALLA DMAQWAIT ;BLOW OUT THE QUEUE'D IMAGES
|
||
PUSHST
|
||
DINT
|
||
CALLA WDOGDIS
|
||
|
||
MOVI 1500000,A1
|
||
FREZWT
|
||
DSJS A1,FREZWT
|
||
FREEZE_LP:
|
||
MOVE @SWITCH+>10,A0,W ;GET THE COIN DOOR SWITCHES
|
||
BTST 8,A0
|
||
JREQ FREEZE_LP ;LOOP 'TIL BUTTON COMES UP
|
||
POPST
|
||
MOVE A8,@NOAUTOE,W
|
||
MOVK 1,A0
|
||
MOVE A0,@DISPLAYON
|
||
FREEZE_DIE:
|
||
DIE
|
||
|
||
;
|
||
; THE FOLLOWING COIN ROUTINES ARE PROCESSES!
|
||
;
|
||
LCOIN:
|
||
MOVI ADJLMULT,A8 ;CMOS RAM ADJUST
|
||
MOVI LC_FLAG,A10 ;LEFT COIN FLAG
|
||
MOVI AUDLCOIN,A11 ;AUDIT NUMBER
|
||
JRUC VALID_COIN
|
||
|
||
CCOIN:
|
||
MOVI ADJCMULT,A8
|
||
MOVI CC_FLAG,A10 ;CENTER COIN FLAG
|
||
MOVI AUDCCOIN,A11
|
||
JRUC VALID_COIN
|
||
|
||
RCOIN:
|
||
MOVI ADJRMULT,A8
|
||
MOVI RC_FLAG,A10 ;RYTE COIN FLAG
|
||
MOVI AUDRCOIN,A11
|
||
JRUC VALID_COIN
|
||
|
||
XCOIN:
|
||
MOVI 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 RYTE "
|
||
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,W ;DIAGNOSTICS?
|
||
CMPI INDIAG,A0
|
||
JREQ CRX ;THEN NO ACTION!
|
||
|
||
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 3 SLOTS USE THIS ID NOW
|
||
MOVE A0,*A13(PROCID),W ;SET OUR ID (IN CASE TABLE IS WRONG)
|
||
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 30,A0 ;HIT TIMER FOR 1/2 SEC.
|
||
MOVB A0,*A10
|
||
|
||
COIN_LOOP:
|
||
SLEEP 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,W ;TURN SOUNDS ON. (A-MODE SOUND SUPRESSOR)
|
||
SOUND1 COINSND
|
||
|
||
MOVK 10,A0
|
||
MOVE A0,@BTIME ;RESTUFF BUYIN TIMER
|
||
CALLR DOCNT
|
||
|
||
MOVI 15*40H/8,A0 ;DON'T WIPE ON GAME OVER IF ITS WITHIN
|
||
MOVE A0,@C_FRAC,W ;15 SECONDS (THIS TIMES OUT TO OVER 20)
|
||
|
||
MOVE A11,A0
|
||
CALLR AUD1 ;CHALK THE DIRECT AUDIT
|
||
|
||
*HIT THE MECHANICAL COIN COUNTERS
|
||
MOVI 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
|
||
MECH1L
|
||
MOVE *A5+,A0,W ;NUMBERS UNDER 10?
|
||
CMPI 10,A0
|
||
JRHI MECH10 ;NO, JUST ONE CLICK
|
||
DSJS A1,MECH1L
|
||
MECH11
|
||
DEC A11 ;GET YOUR CLICK COUNT
|
||
SLL 4,A11 ;OFFSET FOR CHUTE, WORD CORRECT
|
||
ADD A11,A6
|
||
MOVE *A6,A2,W ;GET TOTAL COUNTS
|
||
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!
|
||
;
|
||
; 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 @STATUS,A0
|
||
JRNZ CRX
|
||
MOVE @GAMSTATE,A0,W
|
||
CMPI INAMODE,A0 ;A DISPLAY IN AMODE ONLY!
|
||
JRNZ CRX ;BR=GAME DEMO MODE IN PROGRESS
|
||
MOVI CP_PID1,A0 ;CHANGE TO "CREDIT PAGE" ID 1
|
||
MOVE A0,*A13(PROCID),W
|
||
MOVI 0FFFFH,A1 ;CHECK TO SEE IF CREDIT PAGE IS UP
|
||
CALLA EXISTP
|
||
JRZ CRY ;BR=NO CREDIT PAGE PUT HER UP!
|
||
JRUC CRX ;OTHERWISE DON'T RE-DISPLAY IT
|
||
CRY:
|
||
JSRP CRD_SCRN ;PUT UP THE CREDITS SCREEN
|
||
CLR A0
|
||
MOVE A0,@ENTERON
|
||
MOVB A0,@CANT
|
||
SLEEP 5*60 ;SLEEP FOR 5 SECONDS
|
||
|
||
;
|
||
; NOW THAT CREDITS HAS BEEN ADJUSTED.....WE NEED TO
|
||
; START ATTRACT MODE
|
||
;
|
||
CALLR KILL_CRD
|
||
CALLA ATSTRT
|
||
CRX:
|
||
JAUC SUCIDE
|
||
|
||
KILL_CRD:
|
||
MOVI DUM_ID,A0
|
||
MOVE A0,*A13(PROCID),W
|
||
MOVI CP_PID2,A0
|
||
CLR A1
|
||
NOT A1
|
||
CALLA KILALL ;ITS DEAD!
|
||
MOVK 1,A0
|
||
MOVE A0,@GAMERASE
|
||
CALLA AUTOEON
|
||
CALLA DMAQWAIT ; WAIT FOR DMA TO BE DONE (IF IN MOTION)
|
||
RETS
|
||
|
||
DOCNT
|
||
MOVB @CNTDIG1,A1
|
||
JRZ SKIP1
|
||
MOVB A0,@CNTDIG1
|
||
SKIP1 MOVB @CNTDIG2,A1
|
||
JRZ SKIP1A
|
||
MOVB A0,@CNTDIG2
|
||
SKIP1A
|
||
RETS
|
||
;
|
||
DUMDIE:
|
||
SLEEP 1
|
||
DIE
|
||
|
||
;
|
||
;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,W
|
||
CMPI 31,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
|
||
|
||
*
|
||
* 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:
|
||
MMTM SP,A0,A1
|
||
MOVI 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
|
||
MOVI 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:
|
||
MMTM SP,A0,A1
|
||
MOVI 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
|
||
MOVI 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
|
||
MOVI ADJCSTRT,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
|
||
|
||
P_CONT:
|
||
MMTM SP,A0,A1
|
||
CALLR CRED_P
|
||
MOVE A0,A1
|
||
MOVI 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:
|
||
MMTM SP,A0
|
||
MOVI 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:
|
||
MMTM SP,A0
|
||
MOVE @C_FRAC,A0,W ;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:
|
||
MMTM SP,A7
|
||
CALLR COIN_PAG
|
||
MOVI CREDITS,A7 ;
|
||
CALLA RC_BYTE ;READ CURRENT CREDITS
|
||
JRNZ GC1 ;WE GOT SOME!
|
||
|
||
MMTM SP,A0 ;PUSH THE ZERO!
|
||
MOVI 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:
|
||
MMTM SP,A7
|
||
MOVI CUNITS,A7
|
||
CALLA RC_WORD
|
||
MMFM SP,A7
|
||
RETS
|
||
|
||
PUT_CUNITS:
|
||
MMTM SP,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:
|
||
MOVI CP_PID1,A0 ;CHANGE OUR ID TO CREDIT 1
|
||
MOVE A0,*A13(PROCID),W
|
||
|
||
MOVI CP_PID2,A0 ;ARE WE SHOWING THE CREDIT PAGE?
|
||
CLR A1
|
||
NOT A1
|
||
CALLA EXISTP
|
||
|
||
JRZ NOT_CREDIT ;ITS NOT THE CREDIT PAGE...TRASH IT.
|
||
*
|
||
* CREDIT PAGE IS RUNNING....KILL IT!
|
||
*
|
||
MOVI CP_PID2,A0
|
||
CALLA KILALL
|
||
CALLA DMAQWAIT
|
||
*
|
||
* NOW BLANK THE AREA OF OUR INTEREST
|
||
*
|
||
|
||
* A3 = DAG OF AREA [YPOS,XPOS] *
|
||
* A4 = [Y,X] SIZE OF AREA *
|
||
|
||
MOVI 0680000H,A3 ;CORNER OF REGION
|
||
MOVI 0D80190H,A4
|
||
CALLA BLNKAREA ;BLANK IT OUT!
|
||
JRUC BLANKED_NOW_GO
|
||
|
||
NOT_CREDIT:
|
||
CALLA WIPEOUT ;TAKE DOWN WHATEVER'S RUNNING.
|
||
CALLA CLR_SCRN
|
||
SLEEP 1
|
||
|
||
MOVI 1,A0
|
||
MOVE A0,@DISPLAYON,W ;TURN THE DISPLAY PROCESSOR BACK ON!
|
||
|
||
SLEEP 1
|
||
|
||
CALLA COLRSTRT ;RESTART THE COLORS JACK
|
||
|
||
BLANKED_NOW_GO:
|
||
MOVI CPYR_MES,A8 ;COPYRIGHT MESSAGE
|
||
JSRP L_MESS
|
||
|
||
MOVI CP_PID2,A0 ;SET OUR ID BACK TO "CREDITS PAGE"
|
||
MOVE A0,*A13(PROCID),W ;SET OUR ID (IN CASE TABLE IS WRONG)
|
||
*
|
||
* BEWARE.....GET_CSTR SMASHES A LONG WORD IN THE PDATA AREA
|
||
* AT: AT PDATA + 3*LONG_SIZE
|
||
*
|
||
CALLR GET_CSTR ;GET THE CREDITS STRING
|
||
MOVE A8,A2 ;PUT IT IN NON-VOLITILE REGGIE!
|
||
|
||
CALLR SELECT_SETUP ;POINT AT PLACE BASED ON PROMPTING
|
||
CALLR LM_SETUP
|
||
MOVE A2,A8 ;POINT AT MESSAGE
|
||
JSRP LM_FINIS ;AND PRINT IT OUT!
|
||
|
||
CALLA CKPROMPT ;IS THERE A PROMPT STRING?
|
||
JRZ BOT_PROMPT ;NOT ON TOP...DO THE BOTTOM
|
||
*
|
||
* BASED ON A1.....WE NEED TO DO THE FOLLOWING:
|
||
*
|
||
* A1 = 0 PLOT THE A0 STRING OUTRIGHT USING L_MESS
|
||
* (IT CONTAINS ALL DATA)
|
||
*
|
||
* A1 = 1 PLOT ONLY THE STRING LIST (1, 2 or 3 POINTERS
|
||
* CENTERED APPROPRIATELY
|
||
*
|
||
* A1 = 2 PLOT THE 1ST LINE OF THE STRING LIST ALONG
|
||
* WITH THE 2 CREDITS TO START...1 TO CONTINUE
|
||
*
|
||
* A1 = 3 PLOT THE 2ND LINE OF THE STRING LIST ALONG
|
||
* WITH THE 2 CREDITS TO START...1 TO CONTINUE
|
||
*
|
||
* A1 = 4 PLOT THE 3RD LINE OF THE STRING LIST ALONG
|
||
* WITH THE 2 CREDITS TO START...1 TO CONTINUE
|
||
*
|
||
* A1 = 5 PLOT THE 1ST LINE W/ 2 CREDITS PER PLAYER
|
||
*
|
||
* A1 = 6 PLOT THE 2ND LINE W/2 CREDITS PER PLAYER
|
||
*
|
||
* A1 = 7 PLOT THE 3RD LINE W/2 CREDITS PER PLAYER
|
||
*
|
||
* A1 = 8 PLOT CUSTOM MESSAGE
|
||
*
|
||
MOVE A0,A8
|
||
MOVI LONG_SIZE,A0 ;INDEX A1 INTO A TABLE
|
||
MPYU A0,A1 ;A1 HAS OFFSET
|
||
ADDI HELP_TAB,A1 ;A1 POINTS AT VECTOR
|
||
MOVE *A1,A1,L ;GET THE VECTOR
|
||
|
||
MOVI BOT_PROMPT,A7
|
||
MOVE A7,-*A12,L ;PUSH RETURN ADDRESS
|
||
JUMP A1 ;THUS "JSRP"ing THE ROUTINE
|
||
|
||
BOT_PROMPT:
|
||
JSRP ADD_PROMPT ;ADD THE HELPFUL HARDWARE PROMPT
|
||
|
||
RETP
|
||
|
||
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 ;3 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
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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
|
||
CALLA 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
|
||
ADDI 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
|
||
CALLA 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
|
||
CALLA 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:
|
||
MMTM SP,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:
|
||
MMTM SP,A0
|
||
MOVI ADJCUNIT,A0
|
||
CALLR GET_ADJ
|
||
MOVE A0,A2
|
||
|
||
MOVI ADJBUNIT,A0
|
||
CALLR GET_ADJ
|
||
MOVE A0,A3
|
||
|
||
MOVI 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
|
||
CALLA EXISTP
|
||
RETS
|
||
|
||
SLAM_SW:
|
||
MOVI SLAM_PID,A0
|
||
MOVE A0,*A13(PROCID),W ;SET OUR ID TO SLAM
|
||
MOVI 0FFFFH,A1
|
||
CALLA KILALL ;KILL ANY OTHER INCARNATIONS
|
||
|
||
SLEEP 40H ;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. *
|
||
* *
|
||
* .EQ. IT MATCHES WHATS THERE *
|
||
* .NE. 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 24,A1
|
||
SRL 24,A1
|
||
; ANDI BYTE_MASK,A1 ;AND KEEP THE BYTE
|
||
|
||
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 they 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:
|
||
MMTM SP,A1
|
||
MOVI COIN_SELECT,A1 ;THIS IS COIN/CREDITS PAGE
|
||
CALLA SET_PAGE ;SET IT PLEASE
|
||
MMFM SP,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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:
|
||
MMTM SP,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:
|
||
MMTM SP,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,W
|
||
; 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,W ;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,A7,A0
|
||
CALLR FORM_AUD_CKSUM ;SEE IF CKSUM IS OK
|
||
JRZ FETCH_AUDIT_1 ;ITS OK....
|
||
*
|
||
* CHECKSUM IS BAD....SET GLOBAL
|
||
*
|
||
MOVK 1,A1
|
||
MOVE A1,@BAD_AUD,W ;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,A7,A0
|
||
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:
|
||
MMTM SP,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,W ;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:
|
||
MMTM SP,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
|
||
MOVI 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,W
|
||
; ANDI WORD_MASK,A1 ;KEEP A WORD.
|
||
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:
|
||
MMTM SP,A1,A7
|
||
CALLR ADJPOINT ;POINT AT ADJUSTMENT
|
||
CALLA RC_LONG ;FETCH THE ADJUST PLEASE
|
||
CALLR DEF_PAGE
|
||
MOVE A0,A0 ;RETURN Z BIT BASED ON ADJUSTMENT!
|
||
MMFM SP,A1,A7
|
||
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:
|
||
MMTM SP,A7,A0
|
||
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. .EQ. 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
|
||
; ANDI BYTE_MASK,A3 ;MASK ANY SIGN EXTENDS
|
||
|
||
CMP A3,A0 ;THEY BETTER BE THE SAME
|
||
JRNZ RETURN_NOW ;NOPE....BYE (RETURN .NE.)
|
||
|
||
ADDI 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:
|
||
MMTM SP,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:
|
||
PUSHST ;PRESERVE CODES THAT ARE BEING RETURNED
|
||
MMTM SP,A1
|
||
MOVI TODAYS_SELECT,A1 ;THIS IS TODAY'S HIGH SCORES PAGE
|
||
CALLA SET_PAGE ;SET IT PLEASE
|
||
MMFM SP,A1
|
||
POPST
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FAC_SET *
|
||
* *
|
||
* THIS ROUTINE RESTORES THE FACTORY SETTINGS TO THE *
|
||
* ADJUSTMENTS. *
|
||
* *
|
||
**************************************************************************
|
||
FAC_SET:
|
||
MMTM SP,A0,A1,A2,A7
|
||
CALLR DUMP_FS ;CLEAR OUT "DUMP" MEMORY
|
||
CALLR NO_CREDS ;REMOVE ANY COINS
|
||
**************************************************************************
|
||
* *
|
||
* CALLR HS_RESET_COUNTER *
|
||
* *
|
||
**************************************************************************
|
||
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,W ;FETCH A ROM LONG WORD
|
||
ZEXT A0,W
|
||
CALLA WC_LONGI ;WRITE THE WORD TO CMOS
|
||
DSJS A2,FACS1 ;WRITE 1 LONG WORD PER ADJUST
|
||
|
||
.IF YUNIT
|
||
MOVE @SWITCH+>30,A1
|
||
NOT A1
|
||
SLL 26,A1
|
||
SRL 26,A1 ;STRIP OFF BITS
|
||
INC A1
|
||
CMPI CS_ENTS,A1 ;GET DIP SWITCH DEFAULT MODE
|
||
JRHI FACS2
|
||
MOVI ADJPRICE,A0 ;AS MASTER PRICER.
|
||
CALLA PUT_ADJ
|
||
.ENDIF
|
||
FACS2
|
||
CALLR LD_CTAB ;EXPAND THE CSELCT VALUE
|
||
CALLR F_ADC_S ;MAKE THE CHECKSUM CORRECT.
|
||
*
|
||
* 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
|
||
ADDI BYTE_SIZE,A1 ;KICK SOURCE POINTER
|
||
MOVE A0,A0 ;WAS IT A ZERO?
|
||
JRZ NAME_DONE ;YEP....NO MORE!
|
||
DSJS A2,NEXT_LETTER
|
||
|
||
NAME_DONE:
|
||
MMFM SP,A0,A1,A2,A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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,W ;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
|
||
; MOVI 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
|
||
; MOVI ADJPRICE,A0 ;AS MASTER PRICER.
|
||
; MOVI G1SEL,A1 ;USE GERMAN SELECTOR
|
||
; CALLA PUT_ADJ
|
||
;
|
||
; MOVI ADJDIFF,A0
|
||
; MOVI 1,A1 ;DIFFICULTY 1 FOR GERMANS
|
||
; CALLA PUT_ADJ
|
||
;
|
||
; MOVI 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 POINTS AT CORRECT CSELCT VALUE
|
||
MOVI ADJC1,A0 ;FIRST ONE TO STORE
|
||
LCT1:
|
||
MOVE *A6+,A1,W ;FETCH A VALUE (WORD)
|
||
ZEXT A1,W
|
||
; ANDI WORD_MASK,A1 ;IN CASE SOMEONE SIGN EXTENDS.
|
||
CALLR PUT_ADJ ;WRITE THIS ONE TO MEMORY
|
||
INC A0
|
||
CMPI ADJCX,A0
|
||
JRLS LCT1
|
||
*
|
||
* NOW INDICATE THAT VALUES ARE "UNTOUCHED"
|
||
*
|
||
MOVI 1,A1
|
||
MOVI ADJVIRGIN,A0 ;THIS SAYS 1ST 8 UNTOUCHED.
|
||
CALLR PUT_ADJ
|
||
|
||
MOVI ADJ1ST6,A0 ;THIS SAYS 1ST 6 UNTOUCHED.
|
||
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:
|
||
ADDI BYTE_SIZE,A8 ;PUSH BEYOND THIS BYTE
|
||
L_MESS:
|
||
ADDI 0FH,A8 ;IF IT ENDS IN OTHER THAN ZERO..KICK TO
|
||
* ;NEXT WORD
|
||
SRL 4,A8
|
||
SLL 4,A8
|
||
; ANDI 0FFFFFFF0H,A8 ;AND MASK FRACTIONAL WORD
|
||
|
||
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:
|
||
MOVI 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.
|
||
*
|
||
MOVI 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
|
||
|
||
ADDI 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
|
||
|
||
MOVI 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:
|
||
MMTM SP,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:
|
||
MOVI ADJFREPL,A0
|
||
CALLA GET_ADJ
|
||
JRNZ RF2 ;ALWAYS READY FOR 2 PLAYERS!
|
||
|
||
CALLR CRED_P
|
||
JRZ PP1
|
||
|
||
MOVE A0,A1 ;PUT CREDITS IN A1
|
||
MOVI 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?
|
||
*
|
||
SLL 1,A0 ;THIS IS AMOUNT NEEDED FOR 2.
|
||
CMP A0,A1
|
||
JRLO PP2 ;NOT ENOUGH.....PRINT 1.
|
||
*
|
||
* >1 = READY FOR 2 PLAYERS. PRESS START.
|
||
*
|
||
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:
|
||
SLEEP 10H
|
||
|
||
MOVE *A13(PDATA),A8,L
|
||
CALLR LM_SETUP
|
||
CLR A6 ;BLACK
|
||
JSRP LM_FINIS
|
||
|
||
BL2:
|
||
SLEEP 10H
|
||
JRUC BLINK_LOOP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MESSAGE SECTION *
|
||
* *
|
||
**************************************************************************
|
||
ROM_NAME .STRING "SMASH TV REVISION 5.00"
|
||
.BYTE 0
|
||
.EVEN
|
||
|
||
FACTORY_TABLE
|
||
.WORD 0000H ;ADJ_UNUSED 0
|
||
.WORD 0001H ;ADJ_PRICING 1 ;MASTER PRICING
|
||
.WORD 0001H ;ADJ_LEFT_MULT 2
|
||
.WORD 0001H ;ADJ_RIGHT_MULT 4
|
||
.WORD 0004H ;ADJ_CENTER_MULT 3
|
||
.WORD 0000H ;ADJ_EXTRA_MULT 5
|
||
.WORD 0001H ;ADJ_UNITS_CREDIT 6
|
||
.WORD 0000H ;ADJ_UNITS_BONUS 7
|
||
.WORD 0000H ;ADJ_MIN_UNITS 8
|
||
.WORD 0004H ;ADJCDIV 9 ;COINS PER DOLLAR
|
||
.WORD 0001H ;SHOW FRACTIONS 10
|
||
.WORD 0001H ;ADJ_START_CRED 11 ;CREDITS REQUIRED TO START
|
||
.WORD 0001H ;ADJ_CONT_CRED 12 ;CREDITS REQUIRED TO CONTINUE
|
||
.WORD 0003H ;ADJ_DIFFICULTY 13
|
||
.WORD 5000 ;ADJ_HSRESET 14
|
||
.WORD 0003H ;ADJ_LIVES 15
|
||
.WORD 0000H ;ADJ_AMODE_MUSIC 16
|
||
.WORD 0060 ;MAXIMUM CREDITS 17
|
||
.WORD 0000H ;FREE PLAY 18
|
||
.WORD 0001H ;NON-ZERO MEANS COIN BLOCK (1ST 8) UNTOUCHED 19
|
||
.WORD 0000H ;ZERO MEANS NORMAL GORE ... 1 = SOFTEN IT 20
|
||
.WORD 0001H ;NON-ZERO MEANS 1ST 6 UNTOUCHED. 21
|
||
.WORD 0000H ;NON-ZERO MEANS NO COIN-SPECIFIC MESSAGE ON COIN PAGE 21
|
||
.WORD 0001H ;ADJCNTR 23 ADJUST MECH COIN COUNTER
|
||
|
||
*
|
||
* A0 = SLEEP
|
||
* A1 = ROUTINE
|
||
* A6 = COLOR
|
||
* A8 = STRING POINTER
|
||
* A9 = SCREEN ADDRESS
|
||
* A10 = SPACING
|
||
* A11 = FONT
|
||
* A14 = FLAGS
|
||
*
|
||
|
||
MESS_CREDITS
|
||
.STRING "CREDITS: "
|
||
.BYTE 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
|
||
.STRING "FREE PLAY"
|
||
.BYTE 0
|
||
.EVEN
|
||
|
||
MESS_READY_1
|
||
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
|
||
.STRING "READY FOR 1 PLAYER."
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
MESS_READY_2
|
||
MESS_MAC RD15FONT,SPACING20,CP_CX,155,ROBO_YELLOW,STRCNRM,0
|
||
.STRING "READY FOR 2 PLAYERS."
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
MESS_INS_COIN
|
||
MESS_MAC RD15FONT,SPACING20,CP_CX,175,ROBO_YELLOW,STRCNRM,0
|
||
.STRING "INSERT COIN."
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
MESS_PRESS_START
|
||
MESS_MAC RD15FONT,SPACING20,CP_CX,175,ROBO_YELLOW,STRCNRM,0
|
||
.STRING "PRESS START"
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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 ;ALLOW EM TO 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:
|
||
MMTM SP,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
|
||
MOVI 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
|
||
ADDI 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
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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:
|
||
SLEEP 1
|
||
|
||
CALLA FORM_SWS
|
||
MOVE A0,A2
|
||
ANDI 2002H,A2
|
||
CMPI 2002H,A2
|
||
JRNZ WB2 ;NOT "CLEAR"
|
||
|
||
SOUND1 COINSND
|
||
|
||
|
||
MOVK 10,A0
|
||
MOVE A0,@BTIME ;RESTUFF BUYIN TIMER
|
||
CALLR DOCNT
|
||
|
||
|
||
CALLR DUMP_FS ;CLEAR OUT THE DUMPS!
|
||
; CALLR CLR_DUMP_AUD
|
||
JRUC WB1
|
||
|
||
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
|
||
SOUND1 BEEP_1 ;MAKE A BEEP
|
||
RETP
|
||
|
||
BEEP_1 .WORD >F3DF,>10,>80A2,0 ;LOW BEEP
|
||
|
||
DUMP_DONE:
|
||
RETP ;AND RETURN TO CALLER!
|
||
|
||
NOTHIN_TO_DUMP:
|
||
CALLA CLR_SCRN ;PRINT SOMEHTING PLEASE
|
||
MOVI MESS_NODUMP,A8
|
||
JSRP L_MESS
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DO_DUMP *
|
||
* *
|
||
* A9 = DUMP NUMBER TO DO *
|
||
* A10 = Y POSITION. *
|
||
* *
|
||
**************************************************************************
|
||
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
|
||
MOVI 30,A2 ;STORE X IN A2
|
||
MOVI 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
|
||
|
||
ADDI 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
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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 *
|
||
* A8 = HEX # *
|
||
* RETURNS: *
|
||
* A8 PTR TO THE STRING *
|
||
* A3 = NON ZERO IF COMMAS ARE TO BE ADDED! *
|
||
* *
|
||
**************************************************************************
|
||
HTOHXASC:
|
||
MMTM SP,A1,A2,A9
|
||
CLR A1
|
||
CLR A2 ;COMMA COUNT
|
||
MOVE A1,-*SP,W ;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,W ;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,W ;STUFF A COMMA
|
||
CLR A2
|
||
JRUC HEXTASC2
|
||
HEXTASC3:
|
||
MOVI STRNGRAM,A1 ;STORE HERE FOR BLOW OUT
|
||
MOVE A1,A8
|
||
|
||
HEXTASC4:
|
||
MOVE *SP+,A9,W
|
||
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!
|
||
|
||
ADDI 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
|
||
ADDI BYTE_SIZE,A7
|
||
ADDI 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
|
||
.STRING "NOTHING HERE....PRESS ADVANCE!"
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
MESS_SLASH .STRING "/"
|
||
.BYTE 0
|
||
.EVEN
|
||
|
||
MESS_2SPACE .STRING " "
|
||
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
|
||
|
||
CPYR_MES
|
||
MESS_MAC RD7FONT,SPACING07,CP_CX,240,ROBO_GREY,STRCNRM,0
|
||
.STRING " COPYRIGHT 1990 WILLIAMS ELECTRONICS GAMES INC."
|
||
.BYTE 0,0
|
||
.EVEN
|
||
|
||
;
|
||
;SWITCH PROCESS ACTIVATION TABLE. THE PROCID IS THE FLAG LOCATION.
|
||
;
|
||
SWTAB:
|
||
.IF YUNIT
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 0 -- PLAYER 1 UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 1 -- PLAYER 1 DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 2 -- PLAYER 1 LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 3 -- PLAYER 1 RIGHT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 4 -- PLAYER 1 FIRE UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 5 -- PLAYER 1 FIRE DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 6 -- PLAYER 1 FIRE LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 7 -- PLAYER 1 FIRE RT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 8 -- PLAYER 2 MOVE UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 9 -- PLAYER 2 MOVE DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 10 -- PLAYER 2 MOVE LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 11 -- PLAYER 2 MOVE RIGHT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 12 -- PLAYER 2 FIRE UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 13 -- PLAYER 2 FIRE DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 14 -- PLAYER 2 FIRE LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 15 -- PLAYER 2 FIRE RIGHT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD LC_PID ;PROCESS ID SWITCH 16 -- LEFT COIN (1)
|
||
.LONG LCOIN ;STARTING ADDR
|
||
|
||
.WORD RC_PID ;PROCESS ID SWITCH 17 -- RIGHT COIN (2)
|
||
.LONG RCOIN ;STARTING ADDR
|
||
|
||
.WORD P1SWPID ;PROCESS ID SWITCH 18 -- START 1
|
||
.LONG P1START ;STARTING ADDR
|
||
|
||
.WORD SLAM_PID ;PROCESS ID SWITCH 19 -- SLAM TILT
|
||
.LONG SLAM_SW ;STARTING ADDR
|
||
|
||
.WORD DIAG_PID ;PROCESS ID SWITCH 20 -- TEST
|
||
.LONG DIAG ;STARTING ADDR
|
||
|
||
.WORD P2SWPID ;PROCESS ID SWITCH 21 -- START 2
|
||
.LONG P2START ;STARTING ADDR
|
||
|
||
|
||
.WORD DIAG_PID ;PROCESS ID SWITCH 22 -- SERVICE CREDIT
|
||
.LONG SERVICE ;STARTING ADDR
|
||
|
||
.WORD CC_PID ;PROCESS ID SWITCH 23 -- CENTER COIN (3)
|
||
.LONG CCOIN ;STARTING ADDR
|
||
|
||
.WORD P1SWPID ;PROCESS ID SWITCH 24 -- FREEZE
|
||
; .LONG DUMDIE ;STARTING ADDR
|
||
.LONG FREEZE ;STARTING ADDR
|
||
|
||
.WORD P2SWPID ;PROCESS ID SWITCH 25 -- COIN 4
|
||
.LONG XCOIN ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 26 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 27 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 28 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 29 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 30 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 31 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.ELSE
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 0 -- PLAYER 1 UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 1 -- PLAYER 1 DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 2 -- PLAYER 1 LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 3 -- PLAYER 1 RIGHT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 4 -- PLAYER 1 FIRE UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 5 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 6 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 7 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 8 -- PLAYER 2 FIRE UP
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 9 -- PLAYER 2 FIRE DOWN
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 10 -- PLAYER 2 FIRE LEFT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 11 -- PLAYER 2 FIRE RIGHT
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 12 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606h ;PROCESS ID SWITCH 13 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 14 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 15 -- UN-USED
|
||
.LONG DUMDIE ;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 CC_PID ;PROCESS ID SWITCH 18 -- CENTER COIN
|
||
.LONG CCOIN ;STARTING ADDR
|
||
|
||
.WORD SLAM_PID ;PROCESS ID SWITCH 19 -- SLAM TILT
|
||
.LONG SLAM_SW ;STARTING ADDR
|
||
|
||
.WORD DIAG_PID ;PROCESS ID SWITCH 20 -- ADVANCE
|
||
.LONG DIAG ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 21 -- AUTO-UP/MANUAL-DOWN
|
||
.LONG DUMDIE ;STARTING ADDRESS
|
||
; .LONG FREEZE ;STARTING ADDR
|
||
|
||
.WORD DIAG_PID ;PROCESS ID SWITCH 22 -- SERVICE CREDIT
|
||
.LONG SERVICE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 23 -- UN-USED
|
||
.LONG DUMDIE ;STARTING ADDRESS
|
||
|
||
.WORD P1SWPID ;PROCESS ID SWITCH 24 -- PLAYER 1 START
|
||
.LONG P1START ;STARTING ADDR
|
||
|
||
.WORD P2SWPID ;PROCESS ID SWITCH 25 -- PLAYER 2 START
|
||
.LONG P2START ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 26 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 27 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 28 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 29 -- NON-PHYSICAL SWITCH
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 30 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.WORD 0606H ;PROCESS ID SWITCH 31 --
|
||
.LONG DUMDIE ;STARTING ADDR
|
||
|
||
.ENDIF
|
||
|
||
.END
|
||
|