smashtv/SCORE.ASM

986 lines
19 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.

.FILE 'SCORE.ASM'
.TITLE 'SCORE STUFF FOR ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: MAY 6,1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL
;
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROCESSOR EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;ZUNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS, YEAH!
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
.INCLUDE "LINK.EQU"
;
;SOUNDS
;
.REF FREEMAN,LOWSND,YAMOFF,FREESND
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF LFCY,RFCY,LFACEP,RFACEP,LIVECNT,AUD1,SENDCRNR,KOFFC
.REF GETFPAL,AFONT0,BLNKAREA,P1DATA,P2DATA,STATUS,XYSEEK2
.REF STARTUP,OBJON,OBJOFF,CANT,OVERLAP
.REF RD7FONT,RD15FONT,GAMSTATE,KILOBJ,DTIME,WNDO
.REF STRNGLEN,DMAN,CR_STRTP,CR_CONTP,CCCC
.REF GET_CREDITS,DMAQ,QDMAFLG ;FOR FILE SCORE USAGE
.REF STRCNRMO
.REF GETPRC,BEGINOBJ,BEGINOBJ2,HEXTOASC,STRLNRM,WORLDTL
.REF WAVEYX,METERP1,METERP2,FRANIM,P1LVS,P2LVS
.REF KILL
.REF ICNFLG,FREETOT
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF AH,CNTDIG1,CNTDIG2,SET_1ST,FFLG
;,AH2
.DEF PDSIZE,MSG_PROC2,MSG_PROC,SCORETYP,SCORE_FLAG,METERS
.DEF SCRADD2,INIT_SCORE,DRAW_SCORE,SCORE,SCRADD3
.DEF DELSCORE,FSCORE,BSCORE,P1MTRY,P2MTRY,FILLUP
.DEF EXTRA,FIXMETERS,FIXMETERS2,MTR1CNT,IS2,IS1
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS FFLG,8
.BSS CNTDIG1,8
.BSS CNTDIG2,8
.BSS ADDSCR,16
.BSS SCOUNT,16
.BSS SCORETYP,16
; .BSS MSGSET,16
.BSS OLDCRD,16
.BSS SCORE_FLAG,16
.BSS BSCORE,16
.BSS P1MTRY,16
.BSS P2MTRY,16
.BSS MTR1CNT,16 ;2 8 BIT POSITIONS FOR METER CNTRS
;
;EQUATES FIRST ORIGINATED IN THIS FILE
;
SCRSPC .EQU 12 ;SPACER FOR DIGITS (INCLUDING DIGIT)
BPDMA1 .EQU 01
BPDMA2 .EQU 02
MSGSLP .EQU 52*1/4
MSGSLP2 .EQU 52*2/4
**************************************************************************
.TEXT
EXTRA:
MMTM SP,A1,A2,A3,A4,A5,A6,A7
MOVE *A0(OPLINK),A0,L
MOVB *A0(PNUM),A4
; MOVE A8,A0
; CALLA DELOBJ
MOVK 1,A0
MOVB A0,@ICNFLG
CALLR DO_EXTRA
MOVB @FREETOT,A0
INC A0
MOVB A0,@FREETOT
MOVE A4,A9
CALLA SENDCRNR
CREATE FLYPID,KOFFC
MMFM SP,A1,A2,A3,A4,A5,A6,A7
RETS
DO_EXTRA
MMTM SP,A8,A7,A4
MOVI P1DATA,A8
MOVE @P1LVS,A7,L
CMPI 1,A4
JREQ CN
;PLYR 2
CMPI 2,A4
JRNZ OUT2
MOVI P2DATA,A8
MOVE @P2LVS,A7,L
CN MOVE *A8(PLIVES),A4,W ;GET NUMBER OF PLAYERS LIVES
INC A4
MOVE A4,*A8(PLIVES),W
CMPI 10,A4
JRGE OUT
SLL 7,A4 ;*128 (NEXT HEADER PLEASE!!)
ADDI AFONT0,A4 ;COMPUTE CORRECT HEADER
MOVE A4,A1
MOVE A7,A8
MOVE *A8(OFLAGS),A4,W
CALLA ANI
OUT
CREATE 0,YAMSND
OUT2
MMFM SP,A8,A7,A4
RETS
YAMSND
;CHECK TO SEE IF IN RACKUP, IF SO, DO MUSICAL FREEMAN SND
MOVB @CANT,A0
JRNZ DIOUT ;REGMN
; MOVI FREESND,A0 ;AUDIO EXTEND
; CALLA ONESND
; JRUC DIOUT
;REGMN
MOVI YAMOFF,A0
CALLA ONESND
SLEEP 2
MOVI FREEMAN,A0 ;AUDIO EXTEND
CALLA ONESND
DIOUT
MOVI AUDEXTRA,A0
CALLA AUD1
DIE
MTR1OR2 .LONG METERP1,METERP2
FILLUP:
;FILL UP THIS PLAYERS METER FROM EMPTY TO FULL
;A10=PLAYERS PROC PTR WHO IS FILLING UP
;
; MOVK 1,A0
; MOVB A1,@FFLG ;SOMEONE FILLING UP FLAG
; MOVI WAVESND,A0
; CALLA ONESND
; CALLR KILLBEEP
MOVE @METERP2,A8,L
MOVB *A10(PNUM),A0
DEC A0
JRNZ TAG1
MOVE @METERP1,A8,L
TAG1
MOVI FILLIN,A9
MOVK 1,A1
JSRP FRANIM
;A10
CALLA GETCNT
MOVB *A10(PNUM),A0
DEC A0
SLL 3,A0
ADDI MTR1CNT,A0 ;BASE OF METER CNT RAM
MOVK 1,A1
MOVB A1,*A0
CLR A1
MOVB A1,@FFLG ;SOMEONE FILLING UP FLAG
DIE
;KILLBEEP:
; MOVI BEEPID,A0
; CLR A1
; NOT A1
; JAUC KILALL ;KILL LOW ENERGY BEEPING PROCESS
FILLIN:
.LONG BOX6
.WORD 6
.LONG BOX5
.WORD 6
.LONG BOX4
.WORD 6
.LONG BOX3
.WORD 6
.LONG BOX2
.WORD 6
.LONG BOX1
.WORD 6
.LONG 0
METERS:
;CK FOR PLAYER #
;A10=PLAYER PROC PTR WHO IS METERING DOWN
MOVB @FFLG,A0 ;ANYBODY FILLING UP FLAG
JRNZ RY
MOVB *A10(PNUM),A0
DEC A0
SLL 3,A0
MOVI MTR1CNT,A2
ADD A0,A2
MOVB *A2,A1
INC A1
CMPI 8,A1
JRLT DAD
MOVK 7,A1
DAD
MOVB A1,*A2
PUSH A1
SLL 2,A0
ADDI MTR1OR2,A0
SLL 5,A1
ADDI METRS,A1
MOVE *A1,A1,L
PUSH A8
MOVE *A0,A8,L
MOVE *A8,A8,L
; MOVE @METERP1,A8,L
MOVE *A8(OFLAGS),A4,W
CALLA ANI
PULL A8
PULL A1
; MOVB @MTR1CNT,A0
CMPI 7,A1
JREQ STP
CMPI 5,A1
JRNZ GETCNT
MOVI LOWSND,A0
CALLA ONESND
; CREATE BEEPID,MRBEEP
GETCNT:
MOVE *A10(WPN_TYP),A0
SLL 4,A0
ADDI TIMERS,A0
MOVE *A0,A0,W
MOVE A0,*A10(SHOTCNT)
RY RETS
FIXMETERS:
SLEEP 1
MOVB @MTR1CNT,A0
SLL 5,A0
ADDI METRS,A0
MOVE *A0,A1,L
MOVE @METERP1,A8,L
MOVE *A8(OFLAGS),A4,W
CALLA ANI
; CALLR GETCNT
DIE
FIXMETERS2:
SLEEP 1
MOVB @MTR1CNT+8,A0
SLL 5,A0
ADDI METRS,A0
MOVE *A0,A1,L
MOVE @METERP2,A8,L
MOVE *A8(OFLAGS),A4,W
CALLA ANI
; CALLR GETCNT
DIE
STP:
; CALLR KILLBEEP
CLR A0
MOVE A0,*A10(WPN_TYP),W
RETS
;MRBEEP:
; MOVI BEEPLO,A0
; CALLA ONESND
; SLOOP 24,MRBEEP
; DIE
;SUBLZR .EQU 000H ;REGULAR LAZER SHOTS
;SUBSPRY .EQU 0001H ;SPRAY SUB TYPE
;SUBSPEW .EQU 0002H ;SPEW TYPE WEAPON (3)
;SUBGRND .EQU 0003H ;GRENADE
;SUBNOSTP .EQU 0004H ;NON STOPPING BULLET
TIMERS: .WORD 100,6,10,4,7,11,8,8 ;WEAPON 0,1,2,3,4 ETC
METRS .LONG BOX7,BOX1,BOX2,BOX3,BOX4,BOX5,BOX6,BOX7
IS2 MOVI P2DATA,A11
MOVI [35H,111H],A3
JRUC IS3
IS1
MOVI P1DATA,A11
MOVI [35H,24H],A3
IS3 CLR A0
MOVE A0,*A11(SCRCNT),L
MOVE A0,*A11(SCRSUB),L
MOVE A3,*A11(PSCRAD),L ;Y,X LOCATION OF SCORE 1
RETS
INIT_SCORE:
CALLR IS1
; MOVE A0,*A11(PSCORE),L
MOVE @GAMSTATE,A0
CMPI INAMODE,A0
JRZ DOP1MSG
; MOVE @MSGSET,A0
MOVE @STATUS,A0
SRL 1,A0
JRC NOMSG1
DOP1MSG:
CREATE P1PID,MSG_PROC ;ALWAYS DISPLAY START STUFF IN ATTRACT
NOMSG1:
CALLR IS2
; MOVE A0,*A11(PSCORE),L
MOVE @GAMSTATE,A0
CMPI INAMODE,A0
JRZ DOP2MSG
; MOVE @MSGSET,A0
MOVE @STATUS,A0
SRL 2,A0
JRC NOMSG2
DOP2MSG:
CREATE P2PID,MSG_PROC ;ALWAYS DISPLAY START STUFF IN ATTRACT
NOMSG2:
CREATE SCOREPID,SCORE
RETS
SCORE:
MOVI P1DATA,A2 ;UPDATE PLAYER 1
CALLA MOVER
MOVI P2DATA,A2 ;UPDATE PLAYER 2
CALLA MOVER
NODICE:
SLEEP 10 ;4 ;5! ;7!
JRUC SCORE
;
; MOVER-COUNT UP TO SCORE SPECIFIED IN SCRCNT
;
MOVER:
MOVE *A2(SCRCNT),A4,L ;MOVE SCORE TO ADD INTO A1
JRZ BYEALL ;NO SCORE SO EXIT
MOVE *A2(SCRSUB),A0,L ;PRESENT BCD COUNT-UP
MOVE @ADDSCR,A1,W ;ADD SCORE (ADDSCR+) AT A TIME
CALLA BCDADD ;BCD PRODUCT IN A0
CMP A4,A0 ;COUNT_UP MORE THAN AMOUNT TO ADD?
JRHI PRFCT ;ALL DONE BYE!
MOVE A0,*A2(SCRSUB),L ;UPDATE BCD COUNT-UP
MOVE @ADDSCR,A1,W ;GET TOTAL AMOUNT PER ADD
JRUC ESCAPE1 ;DO IT
PRFCT:
CLR A0
MOVE A0,*A2(SCRCNT),L ;ZERO SCORE AMOUNT TO ADD
MOVE A0,*A2(SCRSUB),L ;ZERO COUNTER
JRUC BYEALL ;ALWAYS
ESCAPE1:
MOVE *A2(PSCORE),A0,L ;MOVE IN PLAYERS CURRENT SCORE
CALLA BCDADD ;ADD CONTENTS OF A1 TO SCORE
MOVE A0,*A2(PSCORE),L ;REVISED SCORE
BYEALL:
RETS
;
;DRAW_SCORE-UPDATE PLAYER 1 & 2 SCORE
;
;A2=PLAYER DATA STRUCTURE
;
DRAW_SCORE:
MOVI AFONT0,A12
MOVI SCRSPC,A8 ;SPACING BETWEEN DIGITS
MOVI DMAWNZ,A5 ;CONTROL REGISTER
;DRAW 1 BITS ONLY
UPDSLP1:
MOVI P1DATA,A9
MOVE @SCORETYP,A0
JRNZ PUTSCORE
RETS ;0=NO SCORES 1=1 PLYR 2=2PLYR >3=BOTH
PUTSCORE:
CMPI 1,A0
JRZ OUTSCR
CHK1BIT:
CMPI 2,A0
JRZ UPDSLP2
;BOTH PLAYERS
CALLR OUTSCR
UPDSLP2:
MOVI P2DATA,A9 ;BASE TABLE PLAYER 2
;
;OUTPUT SCORE TO SCREEN
;A0=CURRENT PLAYER SCORE
;A9=PLINDX=PLAYER DATA AREA
;
OUTSCR:
MOVK 8,A6 ;DIGIT COUNT
MOVE *A9(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
;
MOVI >0101,A1
MOVE *A9(PSCORE),A0,L ;PLAYER SCORE IN BCD FORM
OUTSCL:
MOVE A0,A14
SRL 28,A14 ;NEXT DIGIT VALUE INTO LOWEST 4 BITS
SLL 7,A14 ;*128 (NEXT HEADER PLEASE!!)
ADD A12,A14 ;BASE ADDRESS OF IMAGE HEADER
*A1: CONSTANT COLOR:PALETTE
*A3: DESTINATION Y:X
*A5: OFFSET:CONTROL
*A14: ADDRESS OF IMAGE HEADER
*GETS: A2=H/W; A4=SAG
MOVE *A14,A2,L ;GET VSIZE:HSIZE
MOVE *A14(ISAG),A4,L ;GET SAG
MOVE @QDMAFLG,A13,W ;IS Q BEING MODIFIED?
JRNZ OUTSCRX
MOVK 1,A13
MOVE A13,@QDMAFLG,W ;Q BEING MODIFIED
MOVE @DMAQCUR,A13,L
CMPI DMAQ,A13
JRLS OUTSCRX ;Q OVERLOAD, CAN IT
MMTM A13,A1,A2,A3,A4,A5
MOVE A13,@DMAQCUR,L
CLR A13
MOVE A13,@QDMAFLG,W
ADDXY A8,A3 ;ADD SPACE AFTER DIGIT
SLL 4,A0 ;NEXT DIGIT PLEASE!
DSJ A6,OUTSCL
OUTSCRX:
RETS
SET_1ST
;A11=P1 OR P2DATA AREA
MMTM SP,A0,A1
CLR A0
MOVI >500000,A1 ;FIRST FREE MAN AT 500000
CALLR BCDADD
MOVE A0,*A11(PNEXTREP),L
MMFM SP,A0,A1
RETS
;
;SCRADD2-ADD BCD (8 DIGIT) AMOUNT TO PLAYERS SCORE
;A1=AMOUNT TO ADD (8 DIGIT BCD)
;
SCRADD3
;ENTRY POINT FOR BONUS RACKUP
MMTM SP,A4
MOVE *A2(PSCORE),A0,L ;GET SCORE
CALLR BCDADD ;ADD IN NEW VALUE
JRUC ONEPLYR
SCRADD2:
MMTM SP,A4
MOVE @GAMSTATE,A0
CMPI INAMODE,A0
JREQ RT
MOVE *A2(PSCORE),A0,L ;GET SCORE
CALLR BCDADD ;ADD IN NEW VALUE
MOVE @STATUS,A4
;CHECK TO SEE IF WE WANT TO DOUBLE SCORES FOR TWO PLAYER GAME
CMPI 3,A4
JRNZ ONEPLYR
CALLR BCDADD ;ADD IN NEW VALUE
;TWO PLAYER GAME
ONEPLYR MOVE A0,*A2(PSCORE),L ;STUFF IT
MOVE *A2(PNEXTREP),A1,L ;GET NEXT FREE MAN SCORE POINT
CMP A1,A0
JRLO RT
;GIVE PLAYER EXTRA LIFE
MOVE A1,A0
MOVI >1500000,A1 ;ADDITIONAL MEN
CALLR BCDADD
MOVE A0,*A2(PNEXTREP),L
MOVK 1,A4
CMPI P1DATA,A2
JREQ RT0
CMPI P2DATA,A2
JRNZ RT
MOVK 2,A4
RT0
CALLR DO_EXTRA
RT
MMFM SP,A4
ANRT RETS
;
;SCRADD-ADD BCD (4 DIGIT) AMOUNT TO PLAYERS SCORE
;A1,[Y,X]
;Y HALF IS THE AMOUNT TO ADD (4 DIGIT BCD)
;X HALF IS MULTIPLE FOR COUNT-UP
;Y HALF MUST BE EVENLY DIVISIBLE BY X HALF
;SCRADD:
; MOVE A1,@ADDSCR,W ;MULTIPLE FOR SCORE ADD
; SRL 16,A1 ;MOVE SCORE TO ADD INTO WORD
; MOVE *A2(SCRCNT),A0,L ;COUNT ALREADY STORED
; CALLR BCDADD ;ADD NEW VALUE (IN BCD)
; MOVE A0,*A2(SCRCNT),L ;TO NEW TOTAL
; RETS
;
;BCD ADD ROUTINE
;A0=SCORE (8 DIGIT BCD) 32 BITS
;A1=NUMBER TO ADD TO A0 (8 DIGIT BCD)
;PACKED BCD FORMAT 4-BITS/ DIGIT
;
BCDADD:
;NEED ALL THESE MMTM'S?
MMTM SP,A1,A3,A4,A5,A6
MOVK 8,A5 ;DO 8 DIGITS
CLRC ;CLEAR THE CARRY
MOVK >0A,A6
BCDLP:
MOVK >0F,A3
MOVK >0F,A4
AND A1,A3 ;MASK GARBAGE
AND A0,A4 ;TRANSFER
ADDC A3,A4
CMP A6,A4 ;NEED TO ADJUST? (PAST 9 DEC.)
JRLO BCDAD1 ;NO. THEN ADD
ADDK 6,A4 ;RETURN NUMBER TO 0
SRL 4,A0 ;
SLL 28,A4
ADD A4,A0
SRL 4,A1
SETC ;SET CARRY
DSJS A5,BCDLP ;DO ALL 8 DIGITS
JRUC BCDADX ;UNSTACK REGISTERS
BCDAD1:
SRL 4,A0
SLL 28,A4
ADD A4,A0
SRL 4,A1
CLRC
DSJS A5,BCDLP
BCDADX:
MMFM SP,A1,A3,A4,A5,A6
RETS
CNTDWN:
;TAKE FACE AWAY, AND DISPLAY LARGE FONT DIGIT WITH COLOR CYCLE
;DISPLAY A COUNTDOWN
CREATE 0,OVERLAP
MOVI 0FFF0H,A0
CMPI P1DATA,A11
JRNE V1
MOVE @LFACEP,A8,L
MOVE A0,*A8(OYPOS)
MOVK 10,A0
MOVB A0,@CNTDIG1
MOVE @STATUS,A0
ANDI 2,A0
MOVE A0,@STATUS
MOVE A0,@STARTUP
CREATE DG1PID,DIGIT1
JRUC V2
V1
MOVE @RFACEP,A8,L
MOVE A0,*A8(OYPOS)
MOVK 10,A0
MOVB A0,@CNTDIG2
MOVE @STATUS,A0
ANDI 1,A0
MOVE A0,@STATUS
MOVE A0,@STARTUP
CREATE DG2PID,DIGIT2
V2
DIE
DIGIT2
;DO DIGIT CNT
;TURN ON NEW CNTR OBJECT
MOVE @P2LVS,A0,L
; CALLA OBJOFF
MOVE *A0(OYPOS),A1
XORI 0F00H,A1
MOVE A1,*A0(OYPOS)
MOVB @CNTDIG2,A0
ANDI 0FH,A0
SLL 5,A0
ADDI NUMBS,A0
MOVE *A0,A2,L ;GET IMAGE
MOVE @RFACEP,A1,L
MOVE *A1(OXVAL),A0,L
MOVE @RFCY,A1
ADDI 12,A1
SLL 16,A1 ;GET Y
MOVI CLSNEUT|TYPTEXT|SUBDG2I,A5
MOVI 260,A3
MOVI DMACNZ,A4 ;CONSTANT COLOR NON-ZERO
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVI >3E3E0000,A0 ;COLOR NUMBER TO CYCLE
MOVE A0,*A8(OPAL),L
HG2 SLEEP 60
MOVB @CNTDIG2,A0
ANDI 0FH,A0
DEC A0
MOVB A0,@CNTDIG2
JRLE DV72
SLL 5,A0
ADDI NUMBS,A0
MOVE *A0,A1,L ;GET IMAGE
MOVE *A8(OFLAGS),A4,W
CALLA ANI
JRUC HG2
DV72
MOVE @STATUS,A1
ANDI 1,A1
MOVE A1,@STATUS
MOVE A1,@STARTUP
MOVE @P2LVS,A0,L
JRUC DV8
NUMBS .LONG FON150,FON150,FON151,FON152,FON153,FON154,FON155,FON156,FON157
.LONG FON158,FON159
.LONG FON159,FON159,FON159,FON159,FON159,FON159,FON159,FON159
DIGIT1
;DO DIGIT CNT
;TURN ON NEW CNTR OBJECT
MOVE @P1LVS,A0,L
; CALLA OBJOFF
MOVE *A0(OYPOS),A1
XORI 0F00H,A1
MOVE A1,*A0(OYPOS)
MOVB @CNTDIG1,A0
ANDI 0FH,A0
SLL 5,A0
ADDI NUMBS,A0
MOVE *A0,A2,L ;GET IMAGE
MOVE @LFACEP,A1,L
MOVE *A1(OXVAL),A0,L
MOVE @LFCY,A1
ADDI 12,A1
SLL 16,A1 ;GET Y
MOVI CLSNEUT|TYPTEXT|SUBDG1I,A5
; MOVI CLSNEUT|TYPNEUT,A5
MOVI 260,A3
MOVI DMACNZ,A4 ;CONSTANT COLOR NON-ZERO
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVI >3E3E0000,A0 ;COLOR NUMBER TO CYCLE
MOVE A0,*A8(OPAL),L
HG SLEEP 60
MOVB @CNTDIG1,A0
ANDI 0FH,A0
DEC A0
MOVB A0,@CNTDIG1
JRLE DV7
SLL 5,A0
ADDI NUMBS,A0
MOVE *A0,A1,L ;GET IMAGE
MOVE *A8(OFLAGS),A4,W
CALLA ANI
JRUC HG
DV7
MOVE @STATUS,A1
ANDI 2,A1
MOVE A1,@STATUS
MOVE A1,@STARTUP
MOVE @P1LVS,A0,L
DV8
; CALLA OBJON
MOVE *A0(OYPOS),A1
XORI 0F00H,A1
MOVE A1,*A0(OYPOS)
MOVE A8,A0
CALLA DELOBJ
CLR A0
MOVE A0,*A11(PLIVES)
CMPI P1DATA,A11
JRNE V3
MOVE @LFCY,A0
MOVE @LFACEP,A1,L
MOVE A0,*A1(OYPOS)
JRUC V4
V3
MOVE @RFCY,A0
MOVE @RFACEP,A1,L
MOVE A0,*A1(OYPOS)
V4
MOVK 2,A0 ;INDICATE KILL OFF PLAYER PRC ETC
MOVB A0,*A11(CNTD)
CALLA LIVECNT
DIE
MSG_PROC2:
;BOTH PLAYERS ARE PLAYING!
;CHANGE MESSAGE ON HIS SCOREBOARD/PLUS STILL SHOW PLAYER SCORE!
;COLOR CYCLE IT
SLEEP 30
MOVE A11,A2
CREATE 0,CNTDWN
JRUC DO_MSGS
;
; MSG_PROC - ALTERNATE BETWEEN PRESS START X TO PLAY/CONTINUE
; INSERT COIN TO PLAY/CONTINUE
; PARAMS:
; A11 = PTR TO PLAYER DATA STRUCTURE
;
MSG_PROC:
MOVE A11,A2
PRESSLP:
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRNZ DO_GO
DO_NADA:
SLOOP 1,PRESSLP
DO_GO:
CMPI P2DATA,A11
JRZ PMSG2
;PUT P1 METER ON SCREEN
MOVE @METERP1,A0,L
MOVE @P1MTRY,A1,W
MOVE A1,*A0(OYPOS),W
MOVE @SCORETYP,A0,W ;TURN ON PLAYER 1 SCORE
ORI 1,A0
MOVE A0,@SCORETYP,W
MOVI CLSNEUT|TYPTEXT|SUBP1TXT,A0
JRUC DOSCRE1
PMSG2:
;PUT P2 METER ON SCREEN
MOVE @METERP2,A0,L
MOVE @P2MTRY,A1,W
MOVE A1,*A0(OYPOS),W
MOVE @SCORETYP,A0,W ;TURN ON PLAYER 2 SCORE
ORI 2,A0
MOVE A0,@SCORETYP,W
MOVI CLSNEUT|TYPTEXT|SUBP2TXT,A0
DOSCRE1:
CLR A1
NOT A1
CALLA KILOBJ ;CLEAR PLAYER MESSAGE
MOVI MSGSLP,A9
WLUP1:
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRZ DO_NADA
SLEEP 4 ;1
DSJS A9,WLUP1
;
DO_MSGS:
CALLA CCCC ;MAKE SURE THINGS ARE INTACT
CALLA GET_CREDITS ;GET CURRENT CREDITS
MOVE A0,@OLDCRD,W ;AND SAVE THEM AS PREVIOUS CREDITS
CALLR AH
MOVB *A11(CNTD),A0
JRNZ CB
MOVE *A11(PSCORE),A0,L
JRZ PRESSTRT ;NO SCORE, THIS IS A NEW START
MOVE @GAMSTATE,A0,W
CMPI INGAMEOV,A0
JREQ PRESSTRT
CMPI INAMODE,A0
JREQ PRESSTRT
CB CALLA CR_CONTP ;CONTINUATION
JRLO INSCONT ;NOT ENOUGH FOR THE CONTINUE
JRUC PRESSTOC
PRESSTRT:
CALLA CR_STRTP
JRLO INSCONT ;NOT ENUFF TO START THIS GUY
;
; OUTPUT "PRESS START 1" OR "PRESS START 2" ON TOP HALF
;
PRESSTOC:
MOVE A11,A2
MOVK STRT1MSG,A3 ;"PRESS START 1"
CMPI P1DATA,A11
JREQ PRESCON1
PRESCONA:
MOVK STRT2MSG,A3 ;"PRESS START 2"
PRESCON1:
CALLA PUTMSG
JRUC NEXT1
AH
CMPI P2DATA,A11
JRZ CLRSCRE2
MOVE @SCORETYP,A0,W ;TURN OFF PLAYER 1 SCORE
ANDI 0FFFEH,A0
MOVE A0,@SCORETYP,W
;TAKE AWAY P1 METER
MOVE @METERP1,A0,L
MOVI 0FFF0H,A1
MOVE A1,*A0(OYPOS),W
JRUC DOINTRO
CLRSCRE2:
MOVE @SCORETYP,A0,W ;TURN OFF PLAYER 2 SCORE
ANDI 0FFFDH,A0
MOVE A0,@SCORETYP,W
;TAKE AWAY P2 METER
MOVE @METERP2,A0,L
MOVI 0FFF0H,A1
MOVE A1,*A0(OYPOS),W
DOINTRO:
; MOVB @WNDO,A0
RETS
;AH2
;
;OUTPUT PLAYER STANDBY MESSAGE
;
; MOVK PLAYER1M,A3
; CMPI P1DATA,A11
; JREQ PRESSBMA
; MOVK PLAYER2M,A3
;PRESSBMA:
; CALLA PUTMSG ;"PLAYER X"
; MOVK STANDBYM,A3 ;"STANDBY"
; CALLA PUTMSG
; RETS
;
; OUTPUT "INSERT COIN" ON TOP HALF
;
INSCONT:
MOVE A11,A2
CLR A3 ;"INSERT COIN"
CALLA PUTMSG
;
; START OF NEXT MESSAGE
;
NEXT1:
;
; OUTPUT "TO CONTINUE" OR "TO PLAY" ON THE BOTTOM HALF
;
MOVB *A11(CNTD),A0
JRNZ CB2
MOVE A11,A2
JRUC TOPLAY
; MOVE *A11(PSCORE),A0,L
; JRZ TOPLAY ;NO SCORE, THIS IS A NEW START
; MOVE @GAMSTATE,A0,W
; CMPI INGAMEOV,A0
; JREQ TOPLAY
; CMPI INAMODE,A0
; JREQ TOPLAY
CB2 MOVK CONTMSG,A3 ;"TO CONTINUE"
CALLA PUTMSG
JRUC NEXT2
TOPLAY:
MOVK PLAYMSG,A3 ;"TO PLAY"
CALLA PUTMSG
NEXT2:
MOVI MSGSLP2,A9 ;CHECK IF COIN DROP STATUS HAS CHANGED
CRDLUP:
CALLA CCCC ;MAKE SURE THINGS ARE IN TACT
CALLA GET_CREDITS ;GET CURRENT CREDITS
MOVE @OLDCRD,A1
CMP A0,A1
JRNZ RE_PLOT
SLEEP 4 ;1
DSJS A9,CRDLUP
JRUC PRESSLP
RE_PLOT:
MOVI CLSNEUT|TYPTEXT|SUBP2TXT,A0
CMPI P2DATA,A11
JRZ KIP1
MOVI CLSNEUT|TYPTEXT|SUBP1TXT,A0
KIP1:
CLR A1
NOT A1
CALLA KILOBJ
JRUC DO_MSGS
;
; FSCORE - TRANSFER BOTH PLAYERS SCORE TO FORGROUND OBJECTS AND DISPLAY THEM
; IN PLACE OF DIRECT-DMA OBJECTS
; PARAMS:
; BSCORE SET = TEXT OFFSET ADDED, WORLD COORDINATES IGNORED
; BSCORE CLR = TEXT OFFSET IGNORED, SET TO WORLD COORDINATES
FSCORE:
;
MOVI P1DATA,A9 ;TRANSFER PLAYER 1 SCORE
CALLA TSCORE
MOVI P2DATA,A9 ;TRANSFER PLAYER 2 SCORE
TSCORE:
MOVK 8,A11 ;DIGIT COUNT
MOVE *A9(PSCRAD),A0,L ;PLAYER SCORE ADDRESS
MOVE *A9(PSCORE),A9,L ;PLAYER SCORE IN BCD FORM
MOVE @BSCORE,A2
JRZ PUTSCL
MOVE @WAVEYX,A1,L
ADD A1,A0 ;POSSIBLE OFFSET
PUTSCL:
MMTM SP,A0
MOVE A9,A10
SRL 28,A10 ;NEXT DIGIT VALUE INTO LOWEST 4 BITS
SLL 7,A10 ;*128 (NEXT HEADER PLEASE!!)
ADDI AFONT0,A10 ;BASE ADDRESS OF IMAGE HEADER
CLR A1
MOVY A0,A1 ;Y VAL
SLL 16,A0 ;X VAL
MOVI 50,A3 ;Z POS.
MOVI DMAWNZ|M_NOCOLL,A4 ;FLAGS
MOVI CLSNEUT|TYPTEXT|SUBSCOR,A5 ;OBJ. ID
CLR A6 ;X VEL
CLR A7 ;Y VEL
MOVE @BSCORE,A2
JRNZ NADJST
MOVE A10,A2 ;IMG
CALLA BEGINOBJ ;CREATE OBJECT, WORLD ADJUSTED
JRUC DADJST
NADJST:
MOVE A10,A2 ;IMG
CALLA BEGINOBJ2 ;CREATE OBJECT,WORLD UNADJUSTED
DADJST:
MMFM SP,A0
MOVI SCRSPC,A1 ;SPACE BETWEEN DIGITS
ADDXY A1,A0 ;ADD SPACE AFTER DIGIT
SLL 4,A9 ;NEXT DIGIT PLEASE!
DSJ A11,PUTSCL
RETS
;
; DELSCORE - DELETE FGND OBJECTS USED AS TEMPORARY SCORES
; IN PLACE OF DIRECT-DMA OBJECTS
DELSCORE:
MOVI CLSNEUT|TYPTEXT|SUBSCOR,A0
CLR A1
NOT A1
JAUC KILOBJ
;
PUTMSG:
;A3=MSG #
;A11=PLAYER INDEX
CMPI P1DATA,A11
JRNZ GP2 ;BR=PLAYER 2 IS BEING UPDATED
CLR A4 ;OFFSET FOR BASE X POSITION
MOVI CLSNEUT|TYPTEXT|SUBP1TXT,A5
JRUC SETPUS
GP2:
MOVI 0EBH,A4
MOVI CLSNEUT|TYPTEXT|SUBP2TXT,A5
SETPUS:
MOVI MSGIMG,A1
SLL 5,A3
ADD A3,A1
MOVE *A1,A2,L
SRL 1,A3
MOVI MSGX,A1
ADD A3,A1
MOVE *A1,A0,W
ADD A4,A0
SLL 16,A0
MOVI MSGY,A1
ADD A3,A1
MOVE *A1,A1,W
SLL 16,A1
CLR A6
CLR A7 ;NO OBJECT VELOCITIES
MOVI DMACNZ,A4 ;CONSTANT COLOR NON-ZERO
MOVE A3,A9
MOVI DMACNZ,A4 ;CONSTANT COLOR NON-ZERO
CALLA BEGINOBJ
MOVI >3B3B0000,A0 ;COLOR NUMBER
MOVB *A11(CNTD),A1
JRNZ HH
CMPI 16*5,A9
JRLT GJ
HH MOVI >3E3E0000,A0 ;COLOR NUMBER TO CYCLE
GJ
MOVE A0,*A8(OPAL),L
P2SETX:
RETS
MSGIMG:
.LONG incoin,pstrt1,pstrt2,tocont,toplay,plyr1,plyr2,stndby
MSGX:
.WORD 038H-7,02FH-7,02FH-7,034H-7,044H-7,03BH-8,03BH-8,03DH
MSGY:
.WORD 50+3,50+3,50+3,60+3,60+3,50+3,50+3,60+3
STRT1MSG .EQU 1
;STRING "PRESS START 1"
STRT2MSG .EQU 2
;STRING "PRESS START 2"
CONTMSG .EQU 3
;STRING "TO CONTINUE"
PLAYMSG .EQU 4
;STRING "TO PLAY"
.END