trog/TROGCOIN.ASM

2447 lines
65 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.MLIB "TROGMACS.LIB"
.FILE 'TROGCOIN.ASM'
.TITLE "TROG COIN HANDLING ROUTINES"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "STRING.H"
.INCLUDE "TROGSEQU.ASM"
.INCLUDE "TROGMEQU.ASM"
.INCLUDE "TROGAUDN.ASM"
.INCLUDE "TROGDIP.ASM"
.DEF RCOIN,LCOIN,CCOIN,XCOIN, SCOIN,SLAM, COININT, NO_CREDS
.DEF CR_STRTP, CR_CONTP, P_START, P_CONT, CR_BOTH
.DEF GET_CSTR, CHECKFREE
.DEF COINFLAG, TIMEINT, TIMEINIT
.DEF CAT_A0, STRCAT
.DEF CRED_P
.DEF CREDIT_SCREEN
.DEF CRED_STRING
.DEF LOGOINIT,COPYRIGHTINIT
.REF BAKMODS, BGND_UD1, CREDITBGND
.REF DEC_HSR
.REF DEF_PAGE, SET_PAGE
.REF RC_BYTE, RC_BYTEI, RC_WORD, RC_WORDI
.REF WC_BYTE, WC_BYTEI, WC_WORD, WC_WORDI
.REF ATT_MODE_HSTD
.REF WIPEOUT, COLOR_START
.REF P_FORK, ADJ_PAGE
.REF CHECKDIPFREE, READ_DIP, FORCEDIP
.REF G_CRED
.REF GET_CSPT
.REF AUD1, STORE_AUDIT, GET_AUD
.IF PRINTER
.REF PLCOIN,PRCOIN,PSCOIN
.ENDIF
.DEF OCTO_FLAG
.REF OCTO_PAGE, HSTD_ENTRY_POINT, ON_HSTD
.REF ON_CRED, CRED_ENTRY_POINT
**************************************************************************
* *
* GLOBAL VARIABLES *
* *
**************************************************************************
.BSS C_FLAGS,4*32 ;INTERRUPT COIN BOUNCE
.BSS CTRLEFT,16 ; FOR THE COIN COUNTERS
.BSS CTRRIGHT,16
.BSS COINFLAG,16
.BSS GAMEUNITS,16 ; UNITS USED PER CURRENT GAME
.BSS TIMECNT,16 ; TIME COUNTER
.BSS SUBTIMECNT,16 ; YET ANOTHER TIMER COUNTER
.BSS CTIMEAUD,4*16 ; CREDIT TIME AUDITS
.BSS OCTO_FLAG,16 ; OCTOPUS FLAG
.BSS TEXT_BUFF,(8*25)
.DEF GAMEUNITS
**************************************************************************
* *
* COIN EQUATES *
* *
**************************************************************************
LC_FLAG EQU C_FLAGS
RC_FLAG EQU C_FLAGS+8
CC_FLAG EQU RC_FLAG+8
XC_FLAG EQU CC_FLAG+8
RUN_TIME EQU 32 ;2ND LONG WORD COUNTS DOWN LONG TIME
OPENS_LEFT EQU RUN_TIME+32 ;3RD LONG WORD COUNTS DOWN CONSEC OPENS
PULSE_MAX EQU 700/16 ;FRAMES TILL ITS TOO LINE.
MIN_OPENS EQU 4
ACC_LIMIT EQU 80H ;AFTER 2 SECONDS OF NO-REPLY....RE-SET FLAG!
COIN_SBIT EQU 0
COIN_SUCC_BIT EQU 1
COIN_FAIL_BIT EQU 2
COIN_ACK_BIT EQU 3
COIN_SFLAG EQU 1
COIN_SUCC_VAL EQU 2
COIN_FAIL_VAL EQU 4
COIN_ACK_VAL EQU 8
COINENABLE EQU 0000H ; CURRENTLY BACKWARDS!
COINDISABLE EQU 0100H ; HA!
LEFTCOIN EQU 0100H ; LEFT COIN MASK
RIGHTCOIN EQU 0200H ; RIGHT COIN MASK
**************************************************************************
* *
* COIN ROUTINES *
* *
**************************************************************************
.TEXT
.EVEN
**************************************************************************
* *
* CLICKLEFT *
* *
* CLICK THE LEFT COIN COUNTER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
CLICKLEFT:
MMTM SP,A0,A1,A7
SINGLECLICK
MOVE @CTRLEFT,A0,W
INC A0
MOVE A0,@CTRLEFT,W
CALLR COINCTR_P ; CHECK TO SEE IF PROCESS EXISTS
JRNE CLRET
CREATE COINCTR_PID,COINCOUNTER
CLRET
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* CLICKRIGHT *
* *
* CLICK THE RIGHT COIN COUNTER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
CLICKRIGHT:
MMTM SP,A0,A1,A7
CALLA READ_DIP
ANDI DPCOUNTER,A0 ; CHECK FOR DUAL COUNTERS
JRZ SINGLECLICK ; COMBINED COUNTER
MOVE @CTRRIGHT,A0,W
INC A0
MOVE A0,@CTRRIGHT,W
CALLR COINCTR_P ; CHECK TO SEE IF PROCESS EXISTS
JRNE CRRET
CREATE COINCTR_PID,COINCOUNTER
CRRET
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* COINCOUNTER *
* *
* PROCESS THAT DEALS WITH THE COIN COUNTER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
COINCOUNTER
CLR A8
MOVE @CTRLEFT,A1,W
JRZ CC1
MOVI LEFTCOIN,A8
DEC A1
MOVE A1,@CTRLEFT,W
CC1
MOVE @CTRRIGHT,A1,W
JRZ CC2
ORI RIGHTCOIN,A8
DEC A1
MOVE A1,@CTRRIGHT,W
CC2
MOVE A8,A8
JRZ CCDIE ; BOTH WERE EMPTY
;
CALLA READ_DIP
ANDI DPCOUNTER,A0
JRNZ CC3
ORI RIGHTCOIN,A8
ORI LEFTCOIN,A8 ; MAKE SURE BOTH TRIGGER
CC3
PUSHST
DINT ; DON'T FUCK WITH ME
; MOVE @SYSCOPY,A1,W
; ANDI 00FFH,A1
; ORI COINENABLE,A1 ; GET THE COIN ENABLE THING
MOVI COINENABLE,A1
MOVE A1,@SECCHIP,W ; TRIGGER ENABLE
; MOVE A1,@SYSCTRL,W ; TRIGGER ENABLE
ANDI 00FFH,A1
OR A8,A1 ; SET THE COUNTER TRIGGER BITS
; MOVE A1,@SYSCTRL,W
MOVE A1,@SECCHIP,W
POPST ; LET PEOPLE INTERRUPT ME
SLEEP 7 ; THIS SUCKS, BUT CARY LIKES IT
PUSHST
DINT
; MOVE @SYSCOPY,A1,W
; ANDI 00FFH,A1
; ORI COINENABLE,A1 ; GET THE COIN ENABLE THING
MOVI COINENABLE,A1
MOVE A1,@SECCHIP,W
; MOVE A1,@SYSCTRL,W ; TRIGGER ENABLE
ANDI 00FFH,A1
; MOVE A1,@SYSCTRL,W
MOVE A1,@SECCHIP,W
POPST
SLEEP 7 ; GIVE THEM TIME TO BE OFF
JRUC COINCOUNTER
CCDIE
DIE
**************************************************************************
* *
* COINCTR_P *
* *
* IS THERE A COIN COUNTER PROCESS RUNNING *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .EQ. NO *
* .NE. YES *
* *
**************************************************************************
COINCTR_P
MOVI COINCTR_PID,A0 ; COIN COUNTER PROCESS
MOVI 0FFFFH,A1
CALLA EXISTP
RETS
CREDIT_JUMP
JSRP CREDIT_SCREEN
JAUC ATT_MODE_HSTD
**************************************************************************
* *
* CREDIT_SCREEN *
* *
* PLOT THE APPROPRIATE CREDIT SCREEN -- DESTROY ANYTHING THAT *
* HAPPENS TO BE AROUND AT THE TIME *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
CREDIT_SCREEN:
CLR A0
MOVI 08000h,A1
CALLA KILALL ;KILL ALL BUT THE INDESTRUCTIBLES
CALLA COLOR_START
MOVE @COINFLAG,A0,W ; CHECK TO SEE WHICH PAGE WE ARE
JRNZ CS1
CALLA WIPEOUT ; LATER, DUDES!
DISPON
MOVE @COINFLAG,A0,W ; CHECK TO SEE WHICH PAGE WE ARE
JRNZ CS1
CALLA CLR_SCRN
CLR A0
MOVE A0,@SCRNTL,L ;RE-ADJUST TOP LEFT CORNER OF SCREEN
MOVE A0,@GAMERASE,W ;AUTO ERASE OFF
MOVI CREDITBGND,A14
MOVE A14,@BAKMODS,L ; SETUP THE BACKGROUND
CALLA BGND_UD1
SLEEP 2 ; MAKE SURE IT GETS OUT
CLR A1
CALLA KILBOBJ
MOVI LOGOINIT,A14
CALLA MAKE_OBJ
MOVI COPYRIGHTINIT,A14
CALLA MAKE_OBJ
CS1
MOVK 1,A0
MOVE A0,@COINFLAG,W ; FLAG WE ARE ON THE COIN PAGE
MOVI [68,74],A3
MOVI [100,250],A4
CALLA BLNKAREA ; CLEAR OUT INNER AREA
MOVI [175,108],A3
MOVI [40,180],A4
CALLA BLNKAREA ; CLEAR OUT INNER AREA
CALLR OUTPUT_CUSTOM
MOVI COIN_MESS,A8
MOVE A2,A2
JRNZ CS2
MOVI COIN_MESS2,A8
CS2
CALLA LM_SETUP
CALLR GET_CSTR ; GET THE CHARACTER STRING
JSRP PRINTF
JSRP ADD_PROMPT ; ADD THE RANDOM MESSAGE FLASHER
SLEEP 300
CLR A0
MOVE A0,@COINFLAG,W
RETP
**************************************************************************
* *
* OUTPUT_CUSTOM *
* *
* OUTPUT THE COINUP MESSAGE. THIS PLOTS ALL THE DIFFERENT *
* FORMS OF IT.. *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A2 NUMBER OF LINES PLOTTED *
* *
**************************************************************************
CM_LINE1 EQU CUSTOM_MESSAGE
CM_LINE2 EQU CUSTOM_MESSAGE+CMESS_LINE_SIZE
CM_LINE3 EQU CUSTOM_MESSAGE+(2*CMESS_LINE_SIZE)
CM_Y_GAP EQU 20
CM_Y_ADDGAP EQU [20,200]
CM_Y1 EQU SKYTOPOF+43
CM_Y2 EQU SKYTOPOF+33
CM_Y3 EQU SKYTOPOF+28
OUTPUT_CUSTOM
CLR A2
CALLR CHECKFREE
JRNZ OCGO ; BR = FREEPLAY
MOVI ADJMAXC,A0
CALLA GET_ADJ ; MAX CREDITS ALLOWED
JRZ OCGO ; BR = NO MAX CREDITS
MOVE A0,A1
CALLR CRED_P
JRZ OCGO ; AIN'T GOT NO CREDITS
CMP A1,A0
JRLO OCGO ; CREDITS < MAXCREDITS
MOVI MESS_MAX,A8
CALLA LM_SETUP
JSRP PRINTF
MOVI 1,A2
JRUC OCRET
; JRUC OCNOMESS
OCGO
CALLA ADJ_PAGE
MOVI VALID_CUSTOM,A7
CALLA RC_WORD
CMPI VALID_VALUE,A0 ; CHECK TO SEE IF MESSAGE IS VALID
JRNZ OCNOMESS ; BR = NOT VALID
CALLR NUM_CLINES ; COMPUTE NUMBER OF DISPLAYABLE LINES
JRZ OCNOMESS ; NOTHING TO SHOW
MOVK 1,A2
SLL 4,A0
ADDI CM_YTAB,A0
MOVE *A0,A9,W
MOVI CM_LINE1,A10
CALLR CK_LINE ; LOAD IT UP, BABY!
JRZ OC1
CALLR CPLOTLINE
OC1
MOVI CM_LINE2,A10
CALLR CK_LINE
JRZ OC2
CALLR CPLOTLINE
OC2
MOVI CM_LINE3,A10
CALLR CK_LINE
JRZ OC3
CALLR CPLOTLINE
OC3
JRUC OCRET
OCNOMESS
.IF DEBUG
.ELSE
CALLR PLOTCOINAGE
.ENDIF
OCRET
RETS
CM_YTAB .WORD 0,CM_Y1, CM_Y2, CM_Y3, CM_Y3
**************************************************************************
* *
* CPLOTLINE *
* *
* PLOT THE LINE IN PDATA OUT ON THE SCREEN *
* *
* ENTRY *
* A9 Y LOCATION TO PLOT AT *
* *
* EXIT *
* A9 NEW Y LOCATION *
* *
**************************************************************************
CPLOTLINE:
PUSH A9
PUSH A9
MOVI CUSTOM_SETUP,A8
CALLA LM_SETUP
; MOVE A13,A8
; ADDI PDATA,A8
MOVI TEXT_BUFF,A8
PULL A9
SLL 16,A9
ADDI 200,A9
JSRP PRINTF
PULL A9
ADDI CM_Y_GAP,A9
RETS
CUSTOM_SETUP:
MESS_MAC RD15FONT,SPACING20,196,0,TROG_PRGB,STRCNRM,0
MESS_MAX:
MESS_MAC RD20FONT,SPACING20,200,CM_Y2-4,TROG_PLF,STRCNRM,0
.STRING "MAXIMUM"
.STRING "\nCREDITS!",0
.EVEN
COPYRIGHTINIT:
.LONG [78,0],[247,0]
.WORD 0,0
.LONG COPY,0,DUMCOLL
.WORD DMAWNZ,JUNKOID
LOGOINIT:
.LONG [152,0],[0,0]
.WORD 0,0
.LONG LITTLELOG,0,DUMCOLL
.WORD DMAWNZ,JUNKOID
**************************************************************************
* *
* NUM_CLINES *
* *
* COMPUTE THE NUMBER OF DISPLAYABLE LINES IN CUSTOM RAM *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A0 NUMBER OF LINES *
* *
**************************************************************************
NUM_CLINES
MMTM SP,A1,A10
CLR A1
MOVI CM_LINE1,A10
CALLR CK_LINE
JRZ NC2
INC A1
NC2
MOVI CM_LINE2,A10
CALLR CK_LINE
JRZ NC3
INC A1
NC3
MOVI CM_LINE3,A10
CALLR CK_LINE
JRZ NC4
INC A1
NC4
MOVE A1,A0
MMFM SP,A1,A10
RETS
**************************************************************************
* *
* CK_LINE *
* *
* COPY A LINE INTO PDATA AREA, AND RETURN IN A0 NUMBER OF CHARS *
* *
* ENTRY *
* A10 POINTER TO CMOS LOC OF LINE *
* *
* EXIT *
* A0 NUMBER OF VALID CHARS IN LINE *
* *
**************************************************************************
CK_LINE:
MMTM SP,A1,A2,A3,A4,A7,A10
MOVE A10,A7 ;INPUT POINTER TO CMOS
; MOVE A13,A2 ;OUR PDATA AREA
; ADDI PDATA,A2 ;A10 IS DESTINATION.
MOVI TEXT_BUFF,A2
MOVI CMESS_CHARS,A1 ;COUNTER
CALLA ADJ_PAGE ;POINT THE PAGE
CLR A3 ; ONLY SPACES SO FAR
CK_LOOP CALLA RC_BYTEI ;FETCH A BYTE
MOVB A0,*A2 ;STORE
MOVE A0,A0
JRZ CKLX ; END OF STRING
CMPI 20H,A0 ; CHECK FOR NON-SPACES
JRZ CKGO
INC A3
CKGO
ADDI BYTE_SIZE,A2
DSJS A1,CK_LOOP
CLR A0
MOVE A0,*A2,W ; MAKE SURE OF THINGS
CKLX
CALLA DEF_PAGE ;POINT AWAY NOW
MOVE A3,A3 ; HOW MANY "REAL" CHARACTERS
MMFM SP,A1,A2,A3,A4,A7,A10
RETS
**************************************************************************
* *
* PLOTCOINAGE *
* *
* PLOT OUT THE CURRENT COINAGE ON THE SCREEN *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PLOTCOINAGE:
MMTM SP,A0,A1,A6
CLR A2
MOVI ADJFREPL,A0
CALLA GET_ADJ
JRNZ PCNOHEAD
MOVI ADJMAXC,A0
CALLA GET_ADJ ; MAX CREDITS ALLOWED
JRZ PC1 ; BR = NO MAX CREDITS
MOVE A0,A1
CALLR CRED_P
JRZ PC1 ; AIN'T GOT NO CREDITS
CMP A1,A0
JRHS PCNOHEAD
PC1
MOVI ADJPRICE,A0
CALLA GET_ADJ ; GET THE CURRENT PRICING
CALLA GET_CSPT
MOVE *A6(CS_LIST),A2,L
JRZ PCNOHEAD ; NO HEADER, BELIEVE IT OR NOT
MOVI PCSETUP,A8
CALLA LM_SETUP
MMTM SP,A0,A1,A2
CLR A0
PC2
MOVE *A2+,A1,L ; COUNT UP NUMBER OF MESSAGES
JRZ PC3
INC A0
JRUC PC2
PC3
SLL 4,A0
ADDI CM_YTAB,A0
MOVE *A0,A9,W
SLL 16,A9
*** ADDI 200,A9
ADDI 190,A9
MMFM SP,A0,A1,A2
PCNEXTHEAD
MOVE *A2+,A8,L ; PICKUP THE NEXT POINTER
JRZ PCDONE
JSRP PRINTF
SRL 16,A9
SLL 16,A9 ; MASK OFF X ADDRESS
ADDI CM_Y_ADDGAP,A9
JRUC PCNEXTHEAD
PCDONE
MOVK 1,A2
JRUC PCRET
PCNOHEAD
CLR A2
PCRET
MMFM SP,A0,A1,A6
RETS
PCSETUP
MESS_MAC RD15FONT,SPACING20,185,CM_Y1,TROG_PRGB,STRCNRM,0
;
; "I love wine. What is this?" -- Inga to Hawkeye -- MASH
;
**************************************************************************
* *
* GET_CSTR *
* *
* CREATE THE CREDIT STRING AND RETURN IT IN STRNGRAM *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A8 POINTS TO *STRNGRAM* *
* *
**************************************************************************
GET_CSTR:
MMTM SP,A0,A1,A7,A10
CALLR CHECKFREE
JRZ NOT_FREE
MOVI MESS_FREEP,A8 ; FREEPLAY MESSAGE
JRUC GET_CX
NOT_FREE
.IF 0
CALLR FORM_COIN_CKSUM ;THIS SETS US TO THE COINAGE PAGE!
JRZ GCCOOL ;ALL IS OK!
MOVI GCCMOSBAD,A8
JRUC GET_CX
.ENDIF
GCCOOL
MOVI STRINGF_RAM,A7 ; TEXT STRING TO BUILD IN
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
MOVI STRINGF_RAM,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
MOVE A8,A7 ; UPDATE END OF STRING LOCATION
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
MOVI STRNGRAM,A7 ; STARTING POINTER
MOVI STRINGF_RAM,A8
CALLR STRCAT
MOVI STRNGRAM,A8
GET_CX CLRC ;RETURN OK
GET_CXX
MMFM SP,A0,A1,A7,A10
RETS
GCCMOSBAD
.STRING "CMOS BAD",0
.EVEN
**************************************************************************
* *
* CAT_A0 *
* *
* TURN A0 INTO A DECIMAL NUMBER AND THEN CONCATENATE IT ONTO *
* THE END OF THE STRING WE ARE BUILDING *
* *
* ENTRY *
* A0 NUMBER FOR THE END OF THE STRING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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
**************************************************************************
* *
* STRCAT *
* *
* CONCATENATE THE STRING POINTED TO BY A8 ONTO A7 STARTING AT *
* A7. GROSS BUT EFFECTIVE *
* *
* ENTRY *
* A7 STARTING POSITION IN STRING *
* A8 ZERO-TERMINATED STRING TO STICK ONTO A7 *
* *
* EXIT *
* A7 POINTS AT ZERO TERMINATOR *
* *
**************************************************************************
STRCAT
PUSH A0
STRLOOP
MOVB *A8,*A7 ; STICK NEXT CHAR IN
MOVB *A7,A0 ; MOVB SUCKS
JRZ STRDONE
ADDI 8,A7
ADDI 8,A8 ; WOOF WOOF WHO CARES
JRUC STRLOOP
STRDONE
PULL A0
RETS
**************************************************************************
* *
* ADD_PROMPT *
* *
* THIS IS CALLED ON THE CREDITS PAGE TO ADD A WORD OF *
* WISDOM BELOW THE CREDITS MESSAGE -- IT PICKS OUT THE *
* BEST MESSAGES AND BLINKS THEM *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ADD_PROMPT:
MOVI PROMPT_PROC,A7
CALLA P_FORK ;START UP ANOTHER W/ SAME ID TO FLASH!
RETP
**************************************************************************
* *
* PROMPT_PROC *
* *
* PROCESS TO PICK A GOOD MESSAGE AND SHOW IT *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PROMPT_PROC:
CALLR CHECKFREE
JRNZ PPFREE ; BR = FREEPLAY
CALLR CRED_P
JRZ PPNOCOIN ; BR = NOT ENOUGH TO START 1 PLAYER
MOVE A0,A1 ; STORE CREDS IN A1
MOVI ADJCSTRT,A0 ; CREDITS TO START
CALLA GET_ADJ
CMP A0,A1
JRLO PPNOCOIN ; BR = NOT ENOUGH TO START
MOVE A0,A2 ; CREDS REQUIRED IN A2
SUB A2,A1 ; GET US GOING HERE
MOVK 1,A0 ; HAVE ENOUGH FOR 1 PLAYER
SUB A2,A1
JRN PPMESS ; BR = NOT ENOUGH FOR 2
INC A0
SUB A2,A1
JRN PPMESS ; BR = NOT ENOUGH FOR 3
INC A0
SUB A2,A1
JRN PPMESS ; BR = NOT ENOUGH FOR 4
INC A0
JRUC PPMESS ; CAN HAVE UP TO 4 PLAYERS
PPFREE
MOVK 4,A0 ; FREEPLAY IS MAX PLAYERS
;
; A0 NUMBER OF PLAYERS WE ARE READY FOR ( 0 = NONE )
;
PPMESS
MOVE @NPLAYERS,A1,W ; GRAB GAME NUMBER OF PLAYERS
INC A1
CMP A1,A0
JRLS PPMESS1 ; BR = COOL NUMBER
MOVE A1,A0 ; SET TO MAXIMUM NUMBER OF PLAYERS
PPMESS1
SLL 5,A0
ADDI PROMPT_TAB,A0
MOVE *A0,A0,L ; GET APPROPRIATE MESSAGE
JRZ PPNOCOIN
PUSH A0
MOVI PROMPT_SETUP,A8
CALLA LM_SETUP
PULL A8 ; PULL OUT THE MESSAGE STRING
JSRP PRINTF
MOVK 1,A0
JRUC BLINKINIT
PPNOCOIN
CLR A0
BLINKINIT
MOVE A0,*A13(PDATA),W ; FLASH "PRESS START"
MOVI PROMPT_COLOR,A0
MOVE A0,*A13(PDATA+10H),L ; COLOR TO FLASH IT IN
BLINKLOOP
MOVI PROMPT_SETUP2,A8
CALLA LM_SETUP
MOVE *A13(PDATA+10H),A5,L ; GET THE CURRENT COLOR
MOVE *A13(PDATA),A8,W ; GET STRING
SLL 5,A8
ADDI PROMPT_MESSTAB,A8
MOVE *A8,A8,L
JSRP PRINTF
CMPI PROMPT_COLOR,A5
JRNZ BL1
MOVI TROG_PBLACK,A5
JRUC BL2
BL1
MOVI PROMPT_COLOR,A5
BL2
MOVE A5,*A13(PDATA+10H),L ; SET NEW COLOR
SLEEP 10H
JRUC BLINKLOOP
PROMPT_COLOR EQU TROG_PWHITE
MESS_SLASH .STRING "/"
.BYTE 0
.EVEN
MESS_2SPACE .STRING " "
MESS_NULL .BYTE 0
.EVEN
MESS_CREDITS
.STRING "CREDIT "
.BYTE 0
.EVEN
PROMPT_SETUP
MESS_MAC RD7FONT,SPACING20,196,SKYTOPOF+135,TROG_PYELLOW,STRCNRM,0
PROMPT_SETUP2
MESS_MAC RD15FONT,SPACING20,200,SKYTOPOF+158,TROG_PYELLOW,STRCNRM,0
PROMPT_1
.STRING "READY FOR 1 PLAYER.",0
.EVEN
PROMPT_2
.STRING "READY FOR 1 OR 2 PLAYERS.",0
.EVEN
PROMPT_3
.STRING "READY FOR 1 - 3 PLAYERS.",0
.EVEN
PROMPT_4
.STRING "READY FOR 1 - 4 PLAYERS.",0
.EVEN
PROMPT_TAB
.LONG 0,PROMPT_1, PROMPT_2, PROMPT_3, PROMPT_4
PROMPT_INSCOIN
.STRING "INSERT COIN.",0
.EVEN
PROMPT_PRESSSTART
.STRING "PRESS START.",0
.EVEN
PROMPT_MESSTAB
.LONG PROMPT_INSCOIN, PROMPT_PRESSSTART
*
* NORMAL CREDITS SETUP STRING
*
.IF 0
MESS_CNUM
MESS_MAC RD20FONT,SPACING20,CP_CX,240,TROG_PLF,STRCNRM,0
*
* "LOW" CREDITS SETUP STRING WHEN EXTRA ADVICE ON PRICING
* IS BEING ADDED.
*
MESS_LOWNUM
MESS_MAC RD20FONT,SPACING20,CP_CX,118H,TROG_PLF,STRCNRM,0
.ENDIF
MESS_FREEP
.STRING "FREE PLAY"
.BYTE 0
.EVEN
.IF 0
MESS_INS_COIN
MESS_MAC RD15FONT,SPACING20,CP_CX,335,TROG_PWHITE,STRCNRM,0
.STRING "INSERT COIN."
.BYTE 0,0
.EVEN
MESS_PRESS_START
MESS_MAC RD15FONT,SPACING20,CP_CX,355,TROG_PWHITE,STRCNRM,0
.STRING "PRESS START"
.BYTE 0,0
.EVEN
.ENDIF
COIN_MESS
MESS_MAC RD20FONT,SPACING20,197,95+SKYTOPOF,TROG_PLF,STRCNRM,0
.EVEN
COIN_MESS2
MESS_MAC RD20FONT,SPACING20,197,CM_Y1+10,TROG_PLF,STRCNRM,0
.EVEN
**************************************************************************
* *
* COIN UTILITY ROUTINES *
* *
**************************************************************************
**************************************************************************
* *
* CRED_STRING *
* *
* RETURN A STRING TO JUST THE NUMBER OF CREDITS IN A8 *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A8 STRING POINTING TO CREDITS *
* *
**************************************************************************
CRED_STRING:
MMTM SP,A0
CALLR CRED_P ; GET CREDITS IN A0
MOVE A0,A8
CALLA HEXTOASC
MMFM SP,A0
RETS
**************************************************************************
* *
* CHECKFREE *
* *
* CHECK TO SEE IF THE GAME IS IN FREEPLAY STATE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NZ = FREEPLAY *
* Z = NOT IN FREEPLAY *
* *
**************************************************************************
CHECKFREE:
.IF FORCEFREE
MOVK 1,A0
JRUC CFRET
.ENDIF
MOVI ADJFREPL,A0
CALLA GET_ADJ
CFRET
MOVE A0,A0
RETS
**************************************************************************
* *
* SCOIN *
* *
* PROCESS CALLED WHEN SERVICE COIN SWITCH TRIGGERED *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
SCOIN:
.IF PRINTER
JSRP PSCOIN
.ENDIF
MOVE @GAME_STATE,A0,W ;DIAGNOSTICS?
CMPI INDIAG,A0
JREQ 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)
CALLR CK_MAX ;ARE WE AT MAXIMUM CREDITS?
JRHS SCOIN_KURT_BONE ;BR = YES, SKIP THIS KURT BONER
MOVI AUDPAIDC,A0
MOVI -1,A1
CALLA AUD ; OFFSET FOR SERVICE, GROSS!!
SCOIN_KURT_BONE
MOVI AUDSCOIN,A11
MOVK 1,A8
JRUC CGOPROC
**************************************************************************
* *
* XCOIN *
* *
* PROCESS CALLED WHEN FOURTH COIN SWITCH TRIGGERED *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
XCOIN MOVI ADJ4MULT,A8
MOVI XC_FLAG,A10 ; LEFT COIN FLAG
MOVI AUD4COIN,A11
JRUC COIN_ROUTINE
**************************************************************************
* *
* LCOIN *
* *
* PROCESS CALLED WHEN LEFT COIN SWITCH TRIGGERED *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
LCOIN
.IF PRINTER
JSRP PLCOIN
.ENDIF
MOVI ADJLMULT,A8
MOVI LC_FLAG,A10 ; LEFT COIN FLAG
MOVI AUDLCOIN,A11
JRUC COIN_ROUTINE
**************************************************************************
* *
* CCOIN *
* *
* PROCESS CALLED WHEN CENTER COIN SWITCH TRIGGERED *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
CCOIN MOVI ADJCMULT,A8
MOVI CC_FLAG,A10 ; CENTER COIN FLAG
MOVI AUDCCOIN,A11
JRUC COIN_ROUTINE
**************************************************************************
* *
* RCOIN *
* *
* PROCESS CALLED WHEN RIGHT COIN SWITCH TRIGGERED *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
RCOIN
.IF PRINTER
JSRP PRCOIN
.ENDIF
MOVI ADJRMULT,A8
MOVI RC_FLAG,A10 ; RIGHT COIN FLAG
MOVI AUDRCOIN,A11
; FALL THROUGH
**************************************************************************
* *
* COIN_ROUTINE *
* *
* THIS IS CALLED FROM EACH OF THE COIN SWITCHES WHEN *
* MADE. IT CONTAINS THE FOLLOWING: *
* *
* A8 = MULTIPLIER FOR THAT SWITCH. *
* A10 = BASE OF RAM POINTERS *
* A11 = BASE AUDIT NUMBER *
* *
**************************************************************************
COIN_ROUTINE
MOVE @GAME_STATE,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 TIMING
* WHEELS (A0 HAS A ZERO!)
*
MOVI PULSE_MAX,A1 ;MAXIMUM PULSE WIDTH
MOVB A1,*A10(RUN_TIME) ;COUNT IT DOWN HERE.
MOVI MIN_OPENS,A1 ;THIS MANY FRAMES OF OPEN TIL OPEN
MOVB A1,*A10(OPENS_LEFT)
MOVI COIN_SFLAG,A1
MOVB A1,*A10 ;TELL INTERRUPT TO START!
MOVI 100H,A9 ;4 SECONDS MAX
COIN_LOOP
SLEEP 1 ;NOW SLEEP TIGHTLY TILL WE GET SUCCESS OR FAIL
MOVB *A10,A0 ;GET THE FLAGS
BTST COIN_FAIL_BIT,A0 ;TOO LONG?
JRZ CK_SUCC
*
* WE HAVE FAILURE...ACKNOWLEDGE IT
*
ORI COIN_ACK_VAL,A0 ;THIS ACKNOWLEDGES WE SAW IT.
MOVB A0,*A10 ;PUT IT BACK
JRUC CRX ;AND GET OUT
CK_SUCC
BTST COIN_SUCC_BIT,A0
JRNZ COIN_GO ;GOT IT!...CONTINUE!
DSJS A9,COIN_LOOP ;TIME OUT FOR SAFETY
.IF DEBUG ; THIS IS A STUPID PLACE TO BE
JRUC $
.ENDIF
JRUC CRX ;TIMED OUT....JUST DIE!
COIN_GO CLR A0
MOVB A0,*A10 ;CLEAR THE FLAGS BACK OUT!
CALLR SLAM_P ;SLAM?
JRNZ CRX ;THEN WE'RE OUT OF HERE
*
* WE SURVIVED 1/2 SECOND WITHOUT A SLAM....ITS TIME TO CASH
* IN HIS STACHE.
*
CMPI LC_FLAG,A10
JRNZ CGO1
CALLR CLICKLEFT ; CLICK LEFT COIN COUNTER
JRUC CGO2
CGO1
CMPI RC_FLAG,A10
JRNZ CGO2
CALLR CLICKRIGHT ; CLICK RIGHT COIN COUNTER
CGO2
*
CGOPROC
CALLR CHALK_COIN ;STRIKE UP THE AUDIT(S)
MOVE A8,A8 ;NO CUNITS?
JRZ CRX ;THEN NO MORE WORK TO DO.
CALLR ADJUST_CREDITS ;GIVE CREDIT FOR THE MONEY.
CALLA DEF_PAGE ;POINT PAGE AWAY!
SOUNDON
SOUND1 COINSND
MOVE @GAME_STATE,A0,W ; CHECK FOR ATTRACT MODE
CMPI INAMODE,A0
JRNZ CRCALL
MOVI INDPID,A0
MOVE A0,*A13(PROCID),W ; MAKE ME KILLABLE
; JRUC CREDIT_SCREEN
JRUC CREDIT_JUMP
CRCALL
CALLR GET_CSTR ; GET CREDIT STRING
CALLA G_CRED ; CALL GEORGE
CRX
JAUC SUCIDE
**************************************************************************
* *
* 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
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
CALLA AUD1 ;CHALK THE DIRECT AUDIT
MMFM SP,A0
RETS
**************************************************************************
* *
* ADJUST_CREDITS *
* *
* TAKES A VALID COIN SWITCH HIT AND COUNTS IT TOWARDS CREDITS *
* *
* ENTRY *
* A8 CHUTE MULTIPLIER *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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 THE CREDIT COUNT IN A0 TO CMOS -- ENFORCE MAX CREDITS *
* *
* ENTRY *
* A0 CREDIT COUNT *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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 ( LEAVES YOU ON COIN PAGE ) *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A1 MAXIMUM CREDITS *
* *
**************************************************************************
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 *
* *
* CALLED TO SEE IF WE ARE AT MAXIMUM CREDITS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .HS. 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
**************************************************************************
* *
* CLEAR_UNITS *
* *
* CLEAR OUT ANY FRACTIONS OF A UNIT IN CMOS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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
**************************************************************************
* *
* FETCH_REQ *
* *
* SNAG THE NUMBER OF UNITS REQUIRED FOR CREDIT, BONUS AND *
* MINIMUM *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A2 REQUIRED FOR CREDITS *
* A3 REQUIRED FOR BONUS *
* A4 MINIMUM *
* *
**************************************************************************
FETCH_REQ
MMTM SP,A0
MOVI ADJCUNIT,A0
CALLA GET_ADJ
MOVE A0,A2
MOVI ADJBUNIT,A0
CALLA GET_ADJ
MOVE A0,A3
MOVI ADJMUNIT,A0
CALLR GET_ADJ_FOR_COIN
MOVE A0,A4
MMFM SP,A0
RETS
**************************************************************************
* *
* GET_ADJ_FOR_COIN *
* *
* GET THE PASSED ADJUSTMENT AND PUT BACK ON COIN PAGE *
* *
* ENTRY *
* A0 ADJUSTMENT REQUESTED *
* *
* EXIT *
* A0 ADJUSTMENT VALUE *
* *
**************************************************************************
GET_ADJ_FOR_COIN:
CALLA GET_ADJ ; GET THE ADJUSTMENT
JAUC COIN_PAG ; THEN RE-INSTATE THE COIN PAGE!
**************************************************************************
* *
* CRED_P *
* *
* RETURN NUMBER OF CREDITS IN A0. ALSO CLEARS Z BIT IF *
* CREDITS EXIST OR IN FREE PLAY *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A0 NUMBER OF CREDITS *
* .NZ. CREDITS OR FREEPLAY *
* *
**************************************************************************
CRED_P:
CALLR CCCC ; CHECKSUM COIN CREDITS
GET_CREDITS
MMTM SP,A7
CALLR COIN_PAG ; COIN PAGE
MOVI CREDITS,A7 ; WANT NUMBER OF CREDITS
CALLA RC_BYTE ;READ CURRENT CREDITS
; JRNZ GC1 ;WE GOT SOME!
; MOVI ADJFREPL,A0
; CALLA GET_ADJ ;SEE IF FREEPLAY......(Z BIT CLEAR IF SO!)
GC1 CALLA DEF_PAGE ;FLIP CMOS AWAY
MMFM SP,A7
RETS
**************************************************************************
* *
* ADD_TO_CUNITS *
* *
* ADD A VALUE TO THE CREDIT UNITS *
* *
* ENTRY *
* A8 NUMBER OF CUNITS TO ADD *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ADD_TO_CUNITS
MMTM SP,A0,A7
CALLR GET_CUNITS
ADD A8,A0
CALLR PUT_CUNITS
MMFM SP,A0,A7
RETS
**************************************************************************
* *
* GET_CUNITS *
* *
* GET THE NUMBER OF CREDIT UNITS HANGING AROUND *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A0 NUMBER OF CUNITS *
* *
**************************************************************************
GET_CUNITS
MMTM SP,A7
MOVI CUNITS,A7
CALLA RC_WORD
MMFM SP,A7
RETS
**************************************************************************
* *
* PUT_CUNITS *
* *
* PUT THE NUMBER OF CREDIT UNITS IN A0 OUT TO CMOS *
* *
* ENTRY *
* A0 NUMBER OF CUNITS *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PUT_CUNITS
MMTM SP,A7
MOVI CUNITS,A7
CALLA WC_WORD
MMFM SP,A7
RETS
**************************************************************************
* *
* ADD_TO_BUNITS *
* *
* ADD A NUMBER OF BONUS UNITS TO THE BONUS COUNTER *
* *
* ENTRY *
* A8 NUMBER OF BONUS UNITS TO ADD *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ADD_TO_BUNITS
MMTM SP,A7,A0
MOVI BUNITS,A7
CALLA RC_WORD
ADD A8,A0
CALLA WC_WORD
MMFM SP,A7,A0
RETS
**************************************************************************
* *
* FORM_COIN_CKSUM *
* *
* THIS ROUTINE IS CALLED TO FORM THE COINS/CREDITS CHECKSUM. *
* THE CHECKSUM IS RETURNED IN A1 *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A1 CHECKSUM *
* .EQ. MATCHES WHAT'S THERE *
* .NE. IT DON'T MATCH, DUDE *
* *
**************************************************************************
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
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 *
* *
* CHECKSUM THE COINS AND THEN STORE IT OUT *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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 -- BASICALLY JUST *
* CHECKS OUT THE COIN CHECKSUMS AND IF THEY ARE WRONG IT *
* CLEARS THEM OUT *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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 *
* *
* SET THE CURRENT CMOS PAGE TO TO COINS/CREDITS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
COIN_PAG
MMTM SP,A1
MOVI COIN_SELECT,A1 ;THIS IS COIN/CREDITS PAGE
CALLA SET_PAGE ;SET IT PLEASE
MMFM SP,A1
RETS
**************************************************************************
* *
* NO_CREDS *
* *
* THIS IS CALLED TO REMOVE CREDITS AND STUFF FROM THE MACHINE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
NO_CREDS
MMTM SP,A0,A1,A7
CALLR FORM_COIN_CKSUM
MOVI COIN_CKSUM,A7
MOVE A1,A0
INC A0 ;MAKE THE CKSUM BAD!
CALLA WC_BYTE
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* CR_BOTH *
* *
* CHECK TO SEE IF THINGS ARE GOOD FOR A LOT OF STUFF *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* A2 0 = NEITHER *
* 1 = CAN START *
* 2 = CAN CONTINUE *
* 3 = YOU CAN DO ANYTHING YOU WANT *
* *
**************************************************************************
CR_BOTH:
MMTM SP,A0,A1
.IF FORCEFREE
MOVK 3,A2
JRUC CR_BX
.ENDIF
MOVK 3,A2 ; ASSUME FREEPLAY
MOVI ADJFREPL,A0
CALLA GET_ADJ ; ARE WE IN FREE PLAY?
MOVE A0,A0
JRNZ CR_BX
CLR A2 ; ASSUME NOTHING
CALLR GET_CREDITS ; GET CURRENT CREDS
CMPI 1,A0
JRLO CR_BX
MOVE A0,A1
MOVI ADJCSTRT,A0
CALLA GET_ADJ ; GET START CREDS
CMP A0,A1
JRLO CR_B1
MOVK 1,A2 ; YES, ENOUGH TO START
CR_B1
MOVI ADJCCONT,A0
CALLA GET_ADJ ; GET CONTINUE CREDS
CMP A0,A1
JRLO CR_BX
ORI 2,A2 ; SET SECOND BIT
CR_BX MMFM SP,A0,A1
RETS
**************************************************************************
* *
* CR_STRTP *
* *
* CHECK TO SEE IF THERE ARE ENOUGH CREDITS TO START *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .HS. ENOUGH CREDITS TO START *
* *
**************************************************************************
CR_STRTP:
MMTM SP,A0,A1
.IF FORCEFREE
MOVK 1,A0
; MOVE A0,A0
CMPI 0,A0
JRUC CR_STX
.ENDIF
MOVI ADJFREPL,A0
CALLA GET_ADJ ;ARE WE IN FREE PLAY?
MOVE A0,A0
JRNZ CR_STX
CALLR GET_CREDITS ;GET CURRENT CREDITS
CMPI 1,A0
JRLO CR_STX
MOVE A0,A1
MOVI ADJCSTRT,A0
CALLA GET_ADJ ;GET NUMBER NEEDED
CMP A0,A1 ;DO WE HAVE ENOUGH TO START?
CR_STX MMFM SP,A0,A1
RETS
**************************************************************************
* *
* CR_CONTP *
* *
* CHECK TO SEE IF THERE ARE ENOUGH CREDITS TO CONTINUE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .HS. ENOUGH CREDITS TO START *
* *
**************************************************************************
CR_CONTP
MMTM SP,A0,A1
.IF FORCEFREE
MOVK 1,A0
; MOVE A0,A0
CMPI 0,A0
JRUC CR_CTX
.ENDIF
MOVI ADJFREPL,A0
CALLA GET_ADJ ;ARE WE IN FREE PLAY?
MOVE A0,A0
JRNZ CR_CTX
CALLR GET_CREDITS ;GET CURRENT CREDITS
MOVE A0,A1
CMPI 1,A0
JRLO CR_STX
MOVI ADJCCONT,A0
CALLA GET_ADJ ;GET NUMBER NEEDED
CMP A0,A1 ;DO WE HAVE ENOUGH TO START?
CR_CTX MMFM SP,A0,A1
RETS
**************************************************************************
* *
* P_START *
* *
* PLAYER STARTED -- DEDUCT REQUISITE NUMBER OF CREDITS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
P_START MMTM SP,A0,A1,A8
CALLR CRED_P
MOVE A0,A1
MOVI ADJCSTRT,A0
CALLA GET_ADJ ;GET NUMBER NEEDED ( IN A0 )
ADDRM A0,@GAMEUNITS,W ; CONTINUING COST OF THE GAME
CALLR REMOVE_CREDITS
CALLA DEC_HSR ;TAKE 1 FROM HIGH SCORE RESET COUNTER
CALLR GET_CSTR ; GET CREDIT STRING
CALLA G_CRED ; CALL GEORGE
MMFM SP,A0,A1,A8
RETS
**************************************************************************
* *
* P_CONT *
* *
* PLAYER CONTINUED -- DEDUCT REQUISITE NUMBER OF CREDITS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
P_CONT MMTM SP,A0,A1,A8
CALLR CRED_P
MOVE A0,A1
MOVI ADJCCONT,A0
CALLA GET_ADJ ;GET NUMBER NEEDED
ADDRM A0,@GAMEUNITS,W ; CONTINUING COST OF THE GAME
CALLR REMOVE_CREDITS
CALLA DEC_HSR ;TAKE 1 FROM HIGH SCORE RESET COUNTER
CALLR GET_CSTR ; GET CREDIT STRING
CALLA G_CRED ; CALL GEORGE
MMFM SP,A0,A1,A8
RETS
**************************************************************************
* *
* REMOVE_CREDITS *
* *
* REMOVE N CREDITS FROM THE MACHINE *
* *
* ENTRY *
* A0 NUMBER OF CREDITS TO REMOVE *
* A1 NUMBER OF CREDITS ON THE MACHINE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
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
TIMEINIT
MOVI PTAB,A0
TILOOP
MOVE *A0+,A1,L
JRZ TIDONE
CLR A2
MOVE A2,*A1(PTOTTIME),W
JRUC TILOOP
TIDONE
RETS
**************************************************************************
* *
* TIMEINT *
* *
* TIME INTERRUPT -- CALLED ONCE EVERY TIME THROUGH THE EXEC *
* LOOP.. *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
MINRES EQU 5 ;MINIMUM TIME RESOLUTION
ONE_SECOND EQU 55 ;THIS MANY TICKS PER SECOND
TIMEINT:
MMTM SP,A0,A1,A2
;
MOVE @SUBTIMECNT,A0,W
INC A0
MOVE A0,@SUBTIMECNT,W
CMPI MINRES,A0
JRLO TIMECHECK
TIMESUBTICK
CLR A0
MOVE A0,@SUBTIMECNT,W
;
; EVERY MINRES TICKS
;
MOVI PTAB,A0
TLOOP
MOVE *A0+,A1,L
JRZ TIME_OCTO_CHECK
MOVE *A1(PDRONEFLG),A2,W
JRNZ TLOOP ; BR = DRONE PLAYER
MOVE *A1(PDTHFLAG),A2,W ; CHECK HIS "I DIED" FLAG
JRZ TL1CK1 ; BR = "I'M NOT DEAD"
MMTM SP,A0,A1
MOVE *A1(PLIFETIME),A2,W ; GET THE TIME HE LIVED
MOVI AUDNUMTL,A0
CALLA AUD1 ; TL DIVISOR ++
MOVI AUDAVGTL,A0
MOVE A2,A1
CALLA AUD ; TIME += NTIME
MMFM SP,A0,A1
CLR A2
MOVE A2,*A1(PDTHFLAG),W ; WE DON'T THINK OF HIM AS DEAD
MOVE A2,*A1(PLIFETIME),W ; BORN AGAIN!
TL1CK1
MOVE *A1(POBJ),A2,L
JRNZ TLOOP ; BR = NOT DEAD YET
MOVE *A1(PTOTTIME),A2,W
JRZ TLOOP ; BR = NOT BEING COUNTED
PUSH A0
CLR A0
MOVE A0,*A1(PTOTTIME),W ; SO WE DON'T COUNT IT AGAIN
MOVI AUDNUMTC,A0
CALLA AUD1 ; TC DIVISOR ++
MOVI AUDAVGTC,A0
MOVE A2,A1
CALLA AUD ; TIME += NTIME
PULL A0
JRUC TLOOP
TIME_OCTO_CHECK:
MOVE @GAME_STATE,A0 ; GET THE CURRENT GAME STATE
CMPI INAMODE,A0
JRNZ TIMECHECK
MOVE @SWITCH,A1,L ; GET SWITCH STATE
NOT A1
ANDI 1F1FH,A1 ; STICKS AND BUTTONS ONLY, DUDE
MOVE @OCTO_FLAG,A0
JRNZ TIME_OCTO_PART2 ; BR = WORKING ON SECOND PART OF IT
CMPI 0111H,A1 ; P1 UP, P2 UP, P1 BONE
JRNZ TIME_OCTO_FAIL
MOVK 1,A1
MOVE A1,@OCTO_FLAG,W ; SET THE "WE SAW IT" FLAG
TIME_OCTO_PART2:
MOVE @SWITCH,A1,L
NOT A1
ANDI 1F1FH,A1
MOVE A1,A2
ANDI 0010H,A1 ; CHECK TO SEE IF P1 BONE BUTTON DOWN
JRNZ TIME_HSTD_CHECK ; YEP, KEEP WAITING
MOVE A2,A1
ANDI 0F0FH,A1 ; CHECKING JUST THE STICKS
CMPI 0804H,A1 ; JOYSTICKS RIGHT? ( P1 LEFT, P2 RT )
JRNZ TIME_OCTO_FAIL
TIME_OCTO_LASTBUT
CMPI 1804H,A2 ; ADD THAT P2 BONE SWITCH IN
JRNZ TIME_HSTD_CHECK
CREATE INDPIDW,OCTO_PAGE ; FIRE OFF THE OCTOPUSS PAGE
TIME_OCTO_FAIL:
CLR A0
MOVE A0,@OCTO_FLAG,W
;
; CHECK FOR P1 DOWN, P2 DOWN FOR HSTD PAGE
;
TIME_HSTD_CHECK:
MOVE @SWITCH,A1,L ; GET SWITCH STATE
NOT A1
ANDI 1F1FH,A1 ; STICKS AND BUTTONS ONLY, DUDE
CMPI 0202H,A1 ; P1 DOWN, P2 DOWN
JRNZ TIMECHECK
MOVE @ON_HSTD,A2,W
JRNZ TIMECHECK
ADJUST ADJHSON ; CHECK TO SEE IF HIGHSCORE EXISTS
JREQ TIMECHECK
CREATE INDPIDW,HSTD_ENTRY_POINT
*THIS STUFF IS DONE EVERY TICK
TIMECHECK
MOVE @TIMECNT,A0,W
MOVE @TIMER,A1,W
ADD A1,A0
MOVE A0,@TIMECNT,W
CMPI ONE_SECOND,A0
JRLO TIME_REAL_RET
*THIS STUFF IS DONE EVERY SECOND
CLR A0
MOVE A0,@TIMECNT,W ;RESET TIMER
MOVI AUDUPTIME,A0 ; TOTAL GAME POWER ON TIME
CALLA AUD1
MOVI AUDONTIME,A0 ; GAME ON TODAY TIME
CALLA AUD1
MOVE @GAME_STATE,A0 ; GET THE CURRENT GAME STATE
CMPI INGAME,A0
JRZ TIMEGAME
CMPI ININTRO,A0
JRZ TIMEGAME
CMPI INGAMEOV,A0
JRZ TIMEGAME
CMPI INEPILOG,A0
JREQ TIMEGAME
CMPI INPLAY,A0
JRNZ TIME_REAL_RET
TIMEGAME
MOVI AUDPTIME,A0 ; TOTAL PLAY TIME
CALLA AUD1
CLR A2 ; COUNT OF ACTIVE PLAYERS
MOVI PTAB,A0
TLOOP2
MOVE *A0+,A1,L
JRZ TIMEDONE
MOVE *A1(PITIME),A3,W ; INITIAL COUNTDOWN TIME
JRZ TL2BYPASS
DEC A3 ; DECREMENT TIME, EVEN FOR DRONES
MOVE A3,*A1(PITIME),W
TL2BYPASS
MOVE *A1(PDRONEFLG),A3,W
JRNZ TLOOP2 ; BR = DRONE PLAYER
MOVE *A1(POBJ),A3,L
JRZ TLOOP2 ; BR = NOT ALIVE
MOVE *A1(PTOTTIME),A3,W ; CREDIT TIME
INC A3
MOVE A3,*A1(PTOTTIME),W
MOVE *A1(PLIFETIME),A3,W ; LIFE TIME
INC A3
MOVE A3,*A1(PLIFETIME),W
INC A2
JRUC TLOOP2
TIMEDONE
SLL 4,A2
ADDI TIMETAB,A2
MOVE *A2,A0,W
CALLA AUD1 ; ADD FOR RIGHT NUMBER OF PLAYERS
TIME_REAL_RET
MMFM SP,A0,A1,A2
RETS
TIMETAB .WORD 0,AUD1TIME, AUD2TIME,AUD3TIME, AUD4TIME
PTAB .LONG P1DATA,P2DATA,P3DATA,P4DATA,0
**************************************************************************
* *
* COININT *
* *
* INTERRUPT ROUTINE PROCESSING FOR COINS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
COININT:
MOVE @C_FLAGS,A0,L ;ANY FLAGS SET?
JRZ NO_COIN_WORK ;NOPE!
MOVI C_FLAGS,A10 ;WALK THROUGH THE 3 COUNTERS
MOVI 4,A9
MOVI L_COIN_BIT,A8 ;THIS IS THE BIT TO CHECK
*
* I BELIEVE THAT LC_FLAG IS IN THE LOW BYTE...THEN CC_FLAG...THEN RC_FLAG
*
NEXT_SLOT
MOVE A0,A1 ;GET CURRENT BYTE IN A1
SRL 8,A0 ;SHIFT DOWN TO NEXT
ANDI 0FFH,A1 ;JUST HOLD LEFT SWITCH
JRZ TRY_NEXT ;NOT LEFT
BTST COIN_FAIL_BIT,A1 ;FAIL LOOKING FOR OPEN?
JRZ CHECK_START ;YEP...THAT'S ALL WE NEED DO!
*
* WE'RE IN A FAIL CONDITION SEE IF WE CAN CANCEL IT!
*
BTST COIN_ACK_BIT,A1 ;HAS IT BEEN ACKNOWLEDGED?
JRNZ FAIL_ACKED ;YEP.....JUST RUN DOWN THE "OPEN" TIMER
*
* HASN'T BEEN ACKNOWLEDGED.....TIME DOWN AND AUTO ACK IF
* PROCESS IS DEAD! THIS SHOULDN'T HAPPEN, BUT
* DEADLOCKS ARE UGLY!
*
MOVB *A10(RUN_TIME),A3 ;WE'RE RUNNING OUT OF TIME
DEC A3
MOVB A3,*A10(RUN_TIME) ;PUT IT BACK!
JRNZ TRY_TO_OPEN ;NOW CONTINUE TO OPEN THE SWITCH
*
* NO ACK IN ALL THIS TIME!
* PROVIDE THE ACK OURSELVES!
*
.IF DEBUG ;THIS IS A FAIL-SAFE...TRAP DURING DEBUG
JRUC $
.ENDIF
ORI COIN_ACK_VAL,A1 ;ADD IN THE ACK!
MOVB A1,*A10 ;AND STORE IT BACK!
*
* WE HAVE ACK...HAVE WE HAD OUR OPEN?
*
FAIL_ACKED
MOVB *A10(OPENS_LEFT),A3 ;HAVE WE MADE IT?
JRNZ TRY_TO_OPEN ;NOT YET...KEEP TRYING.
*
* WERE OPEN AND HAVE OUR ACK CLEAR OUT THE FLAGS!
*
MOVB A3,*A10 ;THIS CLEARS OUT THE FLAG
JRUC TRY_NEXT ;FLAGS ARE CLEAR...STEP TO NEXT
CHECK_START
BTST COIN_SBIT,A1 ;"START" FLAG?
JRNZ TIME_START ;YEP......KEEP TIMING
*
* HERE BY PROCESS OF ELIMINATION...ITS "SUCC" BIT OR
* SOMTHING ELSE GOT SET.....SIMPLY TIME IT DOWN
* IN CASE SOMEONE TRASHED IN ON THIS BYTE
*
MOVB *A10(RUN_TIME),A3 ;WE'RE RUNNING OUT OF TIME
DEC A3
MOVB A3,*A10(RUN_TIME) ;PUT IT BACK!
JRNZ TRY_NEXT ;WHEN IT HITS ZERO...WE'LL CLEAR OUT!
.IF DEBUG ;THIS IS A FAIL-SAFE...TRAP DURING DEBUG
JRUC $
.ENDIF
MOVB A3,*A10 ;CLEAR OUT THE FLAGS...PROC IS GONE!
JRUC TRY_NEXT ;MUST BE SUCCESS...NO ACTION.
TIME_START
MOVB *A10(RUN_TIME),A3 ;WE'RE RUNNING OUT OF TIME
DEC A3
MOVB A3,*A10(RUN_TIME) ;PUT IT BACK!
JRNZ TRY_TO_OPEN ;NOW CONTINUE TO OPEN THE SWITCH
*
* THIS ONE TIMED OUT......ITS FAIL FLAG TIME!
*
MOVI COIN_FAIL_VAL,A3
MOVB A3,*A10 ;WE HAVE FAILURE
MOVI ACC_LIMIT,A3
MOVB A3,*A10(RUN_TIME) ;THIS IS TIME LIMIT FOR PROCESS TO ANSWER!
*
TRY_TO_OPEN
CMPI 8,A8
JRZ TTOFOURTH ; ANOTHER KLUDGE FOR XCOIN
MOVE @COINS,A2,W ;THE SWITCH HAS 1/2 SECOND TO OPEN
CMPI 4,A8 ; SPECIAL CHECK FOR CENTER CHUTE
JRZ TTOCENTER
AND A8,A2 ;A1 CONTIAINS ZERO FOR CLOSED
JRZ STILL_CLOSED ;ITS CLOSED...RE-START THE OPEN COUNT
JRUC TTOGO
TTOCENTER
ANDI 80H,A2 ; MASK FOR JAMMA CENTER
JRZ STILL_CLOSED
JRUC TTOGO
TTOFOURTH
MOVE @SWITCH2,A2,W
ANDI 20H,A2
JRZ STILL_CLOSED
TTOGO
*
* ITS OPEN
*
MOVB *A10(OPENS_LEFT),A3 ;HAVE WE MADE IT?
JRZ HIT_ZERO ;WE HAVE A LONG ENOUGH OPEN
DEC A3
MOVB A3,*A10(OPENS_LEFT) ;PUT IT BACK
JRNZ TRY_NEXT ;TRY THE NEXT BYTE
*
* WE HIT ZERO....IF "START FLAG" IS ON THEN WE HAVE SUCCESS
*
HIT_ZERO BTST COIN_SBIT,A1 ;"START" FLAG?
JRZ TRY_NEXT ;NOPE....
MOVI COIN_SUCC_VAL,A3
MOVB A3,*A10 ;INDICATE WE MADE IT!
MOVI ACC_LIMIT,A3
MOVB A3,*A10(RUN_TIME) ;THIS IS TIME LIMIT FOR PROCESS TO ANSWER!
JRUC TRY_NEXT
STILL_CLOSED
MOVI MIN_OPENS,A1 ;THIS MANY FRAMES OF OPEN TIL OPEN
MOVB A1,*A10(OPENS_LEFT)
TRY_NEXT
ADDI 8,A10 ;NEXT BYTE
SLL 1,A8 ;NEXT COIN BIT
DSJ A9,NEXT_SLOT
NO_COIN_WORK
RETS
**************************************************************************
* *
* SLAM_P *
* *
* IS THERE A SLAM PROCESS RUNNING *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .EQ. NO *
* .NE. YES *
* *
**************************************************************************
SLAM_P MOVI SLAM_PID,A0 ;SLAM PROCESS ACTIVE?
MOVI 0FFFFH,A1
CALLA EXISTP
RETS
**************************************************************************
* *
* SLAM *
* *
* PROCESS THAT STARTS UP WHEN WE GET SLAMMED ON *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
SLAM
MOVI AUDSLAMS,A0
CALLA AUD1
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
**************************************************************************
* *
* SOUND(S?) *
* *
**************************************************************************
COINSND .WORD >F0FE,>30,>8049,0 ;"COIN" SOUND
PCOINLEFT
.STRING "LEFT COIN",0AH,0
.EVEN
PCOINRIGHT
.STRING "RIGHT COIN",0AH,0
.EVEN