narc/NARC/NARC1A.ASM

2619 lines
69 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 'NARC1A.ASM'
.TITLE " <<< NARC GENERAL PURPOSE SUBROUTINES PART II >>>"
**************************************************************************
* *
* COPYRIGHT (C) 1988 WILLIAMS ELECTRONICS GAMES, INC. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.WIDTH 132
.OPTION B,D,L
.MNOLIST
* GET THE SYSTEM STUFF
.INCLUDE "\video\MPROCEQU.ASM" ;MPROC equates
.INCLUDE "\video\DISPEQU.ASM" ;Display processor equates
.INCLUDE "\video\GSP.INC" ;GSP assembler equates
.INCLUDE "\video\SYS.INC" ;Zunit system equates
.INCLUDE "\video\MACROS.HDR" ;Macros, Yeah!
* LOCAL STUFF
.INCLUDE "NARCEQU.ASM" ;NARC Equates
.INCLUDE "NARCTEQU.ASM" ;NARC Todd Equates
.INCLUDE "NARCAUDN.ASM" ;NARC Audit Equates
.INCLUDE "IMGTBL.GLO" ;Image Label Equates
*
*GLOBALS IN THIS FILE
.GLOBAL PPOSADDX,ESCAPEJ,INVINCO,INVINCNF,PXFERCRD,PFLYNDIE
.GLOBAL PFLASH2,PLEGOFF,PLAYERCON,PIJDECEL,PDELETE,PLEGON,PLEGOFF
.GLOBAL PTORSON,BUYINWIN,BOTHPON,GAMEOTXT,DUMPWTCH,AUDPLWAV,AUD1
.GLOBAL STRNGLEN,FLYTOPL,BUYINLP,BWAITCLD
*
*EXTERNALS
.GLOBAL CR_CONTP,OUTMBIGS,BTIME
.BSS XPALRAM,256*16 ;RAM FOR FADE PALETTE XFERS
.BSS BTIMERST,16 ;BUY-IN TIMER RESET FLAG
.EVEN
.TEXT
**************************************************************************
* *
* MUSICSYN - WATCH FOR THE SYNC BEAT FROM THE SOUND BOARD AND *
* INCREMENT RAM. *
* I.D. = MSYNPID *
* *
**************************************************************************
MUSICSYN
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA KILALL
CLR A0
MOVE A0,@BEATCNT,W
MSYN1
MOVE @SWITCH,A0,L
BTST 26,A0
JREQ MUSICINC
SLOOP 1,MSYN1
MUSICINC
MOVE @BEATCNT,A0,W
INC A0
MOVE A0,@BEATCNT,W
SLOOP 4,MSYN1
**************************************************************************
* *
* XPALETTE - PALETTE INTENSITY MULTIPLIER *
* A1 = XFACTOR *
* A2 = PTR TO ROM PALETTE *
* A3 = CURRENT PALETTE ALLOCATION # *
* A4 = STARTING COLOR # *
* A5 = ENDING COLOR # *
* *
**************************************************************************
XPALETTE
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
MOVE *A2+,A6,W ;GET THE COLOR COUNT
CLR A8 ;INCREMENTAL COUNTER
MOVI XPALRAM,A7 ;GET THE RAM
XPALET1
MOVE *A2+,A0,W
CMP A4,A8
JRLO XPJUSTUF ;BELOW LOWER BOUND
CMP A5,A8
JRHI XPJUSTUF ;ABOVE UPPER BOUND
CALLR XCOLOR ;MULTIPLY THIS GUY
XPJUSTUF
MOVE A0,*A7+,W
INC A8
CMP A6,A8
JRLO XPALET1 ;BR = NOT DONE WITH MULTIPLY
MOVI XPALRAM,A0
CLR A1
MOVE A3,A1
SLL 16,A1
MOVE A6,A2
CALLA PALSET ;SET UP THE XFER
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
RETS
**************************************************************************
* *
* XCOLOR - COLOR VALUE MULTIPLIER *
* A0 = COLOR VALUE *
* A1 = X FACTOR (MSW:INTEGER LSW:FRACTION) *
* RETURNS *
* A0 = X COLOR VALUE *
* *
**************************************************************************
XCOLOR
MMTM SP,A3,A4
CLR A4
MOVE A0,A3
SLL 27,A3
SRL 27,A3 ;NOW I GOT 'DA BLUES
MPYU A1,A3
SLL 11,A3
SRL 27,A3
OR A3,A4
MOVE A0,A3
SLL 22,A3
SRL 27,A3 ;GREENS
MPYU A1,A3
SLL 11,A3 ;STRIP GARBAGE
SRL 27,A3
SLL 5,A3
OR A3,A4
MOVE A0,A3
SLL 17,A3
SRL 27,A3 ;NOW REDS
MPYU A1,A3
SLL 11,A3
SRL 27,A3
SLL 10,A3
OR A3,A4
MOVE A4,A0
MMFM SP,A3,A4
RETS
**************************************************************************
* *
* AUTOEOFF - TURN OFF AUTO ERASE *
* NOTE: BE SURE THE DIRQ IS OFF BEFORE CALLING *
* *
**************************************************************************
AUTOEOFF
PUSH A0
PUSHST
DINT
MOVE @SYSCOPY,A0,W
ORI AUTOERAS,A0 ;DISABLE AUTO ERASE
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
POPST
MOVE A0,@SYSCTRL,W
PULL A0
RETS
**************************************************************************
* *
* AUTOEON - TURN ON AUTO ERASE *
* NOTE: BE SURE THE DIRQ IS OFF BEFORE CALLING *
* *
**************************************************************************
AUTOEON
PUSH A0
MOVE @NOAUTOE,A0,W
JRNE AUTOEON1 ;BR = DEBUGGER MAN SAYS NO AUTOERASE
PUSHST
DINT
MOVE @SYSCOPY,A0,W
ANDNI AUTOERAS,A0 ;AUTO ERASE IS ENABLED LOW
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
POPST
MOVE A0,@SYSCTRL,W
AUTOEON1
PULL A0
RETS
*
*MAKE AND OBJECT WITH Z INITIALIZATION
*RETURN(S)
*A0 = OBJECT BLOCK
MAKOBJZ
CALLA GETOBJ
JRZ MAKOBZX ;NONE LEFT
CALLA STFOBJ
CALLA SETZPOS
CALLA INSOBJ
MOVE A0,A0 ;RETURN NON-ZERO
MAKOBZX
RETS
**************************************************************************
* *
* COPYOBJ - COPIES THE CONTENTS OF ONE OBJECT BLOCK TO THE OTHER. *
* A0 = PTR TO DESTINATION BLOCK *
* A8 = PTR TO SOURCE BLOCK *
* *
**************************************************************************
COPYOBJ
MMTM SP,A0,A6,A8
MOVI OBSIZ,A6,W ;GET THE SIZE OF THE BLOCK IN WORDS
ADDI 64,A0
ADDI 64,A8 ;DON'T COPY THE LINKS
SRL 4,A6 ;DIVIDE BY 16
SUBK 4,A6 ;SUBTRACT TO ACCOUNT FOR THE 1st TWO LINKS
COPYOBJL
MOVE *A8+,*A0+,W ;MOVE A WORD
DSJS A6,COPYOBJL
MMFM SP,A0,A6,A8
PUSH A6 ;KLUDGE TO ZERO MISPLACED LINKS
CLR A6
MOVE A6,*A0(OSHAD),L
PULL A6
RETS
**************************************************************************
* *
* STRINGER - OUTPUT A TEXT STRING, THIS IS A PROCESS! *
* A0 = SLEEP TIME BETWEEN CHARACTERS *
* A4 = DMA CONTROL *
* A6 = COLOR (16 BITS) *
* A8 = PTR TO STRING *
* A9 = [Y,X] SCREEN ADDRESS OF STRING *
* A10 = [Y,X] SPACING *
* A11 = POINTER TO FONT TABLE *
* A14 = FLAGS - INSERT:JUSTIFY *
* BIT 16 = 1 INSERT ON OBJECT LIST, 0 JUST QUEUE THE DMA *
* JUSTIFY = 0 LEFT JUSTIFY *
* 1 CENTER JUSTIFY *
* 2 RIGHT JUSTIFY *
* RETURNS: *
* A8 = POINTS TO NEXT BYTE AFTER STRING TERMINATOR *
* A9 = NEXT CURSOR POSITION AFTER THE STRING *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
*
*STRING ENTRYPOINT, LEFT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST
STRLNRM
MMTM A12,A1,A4,A6,A14
MOVI DMACNZ,A4
CLR A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, CENTER JUSTIFY, NORMAL, NOT ON THE OBJECT LIST
STRCNRM
MMTM A12,A1,A4,A6,A14
MOVI DMACNZ,A4
MOVK 1,A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, RIGHT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST
STRRNRM
MMTM A12,A1,A4,A6,A14
MOVI DMACNZ,A4
MOVK 2,A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, LEFT JUSTIFY, INVERTED, NOT ON THE OBJECT LIST
STRLINV
MMTM A12,A1,A4,A6,A14
MOVI DMACZ,A4
CLR A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, CENTER JUSTIFY, INVERTED, NOT ON THE OBJECT LIST
STRCINV
MMTM A12,A1,A4,A6,A14
MOVI DMACZ,A4
MOVK 1,A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, LEFT JUSTIFY, NORMAL, OBJECT LIST
STRLNRMO
MMTM A12,A1,A4,A6,A14
MOVI DMACNZ,A4
MOVI 10000H,A14
JRUC STRINGR1
*
*STRING ENTRYPOINT, CENTER JUSTIFY, NORMAL, OBJECT LIST
STRCNRMO
MMTM A12,A1,A4,A6,A14
MOVI DMACNZ,A4
MOVI 10001H,A14
JRUC STRINGR1
STRINGER
MMTM A12,A1,A4,A6,A14
STRINGR1
MOVE A6,A5
SLL 16,A5 ;SETUP CONSTANT COLOR IN FIXED PALETTE
CLR A7
MOVX A14,A7
DEC A7
JRN STRINGR2 ;NORMAL LEFT JUSTIFY
JREQ STRINGRC
*RIGHT JUSTIFY
CALLR STRNGLEN ;GET THE STRING LENGTH
JRUC STRINGRA
*CENTER JUSTIFY
STRINGRC
CALLR STRNGLEN
SRL 1,A7 ;STRNGLEN/2
STRINGRA
SUBXY A7,A9 ;ADJUST STRING STARTING POSITION
STRINGR2
MOVB *A8,A7 ;GET A CHARACTER
SLL 24,A7
SRL 24,A7 ;MAKE SURE WE'RE POSITIVE
JREQ STRINGRX ;BR = STRING BE GONE BROTHA
ADDK 8,A8 ;NEXT BYTE
PUSH A0
CMPI 20H,A7
JRNE STRNCHAR ;BR = IT'S KOSH BABY
MOVK 5,A7 ;HARD CODE A SPACE
ADDXY A7,A9 ;AND ADD IT IN
ADDXY A10,A9 ;ADD SPACING
PULL A0
JRUC STRINGR2 ;DON'T SLEEP ON A SPACE, IT LOOKS STUPID!!!
STRNCHAR
MMTM SP,A2,A3,A4,A10,A14
MOVE A11,A1 ;ESCAPE TO THE OTHER SIDE
SUBI 21H,A7 ;GET A BASE
SLL 5,A7
ADD A7,A1
MOVE *A1,A1,L ;LOAD THE ADDRESS OF THE IMAGE HEADER
CALLA GSAGOF
CALLA GANIOF
BTST 16,A14
JREQ STRNQDMA ;BR = DO NORMAL DMA OF STRING
*CREATE THE CHARACTER AS AN OBJECT, HERE
CALLA GETOBJ
JREQ STRNGDUN ;BR = NO OBJECT
MOVE A1,*A0(OIMG),L
MOVE A5,*A0(OPAL),L
MOVE A0,A14
ADDI OSIZE+20H,A14
MMTM A14,A2,A3,A4 ;STUFF VITAL SHIT
CLR A14
ADDI OZVEL+20H,A0
MOVK 6,A4
STRNGOL
MOVE A14,-*A0,L
DSJS A4,STRNGOL ;ZERO OUT THE VELS & POSITIONS
SUBI 64,A0 ;BACK TO NORMAL
MOVI TEXTOID,A14
MOVE A14,*A0(OID),W ;STUF A FINDABLE I.D.
MOVE A9,A14
MOVE A14,*A0(OXPOS),W
SRL 16,A14
MOVE A14,*A0(OYPOS),W ;STUFF POSITIONS
MOVI 7FFF000AH,A14
MOVE A14,*A0(OZVAL),L
CALLA ADJSTWTL ;PUT US IN THE WORLD
CALLA INSOBJ ;STUFF THIS SHEEEEEEET
JRUC STRNGDUN
*SIMPLY DMA THE SUCKER, HERE
STRNQDMA
MOVE A1,A10
MOVE A5,A1 ;CONSTANT:PALETTE
MOVE A4,A5 ;OFFSET:CONTROL
MOVE A3,A4 ;SAG
CLR A14
MOVY A9,A14
CLR A3
MOVX A9,A3
SRL 16,A6
SUBXY A6,A3
SUBXY A7,A14 ;MOVE TO CORRECT POSITION
MOVY A14,A3 ;A3 = DAG
CALLA DMAN
MOVE A1,A5
MOVE A10,A1
STRNGDUN
MOVE *A1(ISIZE),A6,W ;GET THE VISIBLE HORIZONTAL SIZE
MMFM SP,A2,A3,A4,A10,A14
ADDXY A6,A9 ;GET TO THE OTHER SIDE
ADDXY A10,A9
MOVE *SP+,A0,L
JREQ STRINGR2 ;BR = NO SLEEP
MMTM A12,A0,A4,A5,A14
CALLA PRCSLP
MMFM A12,A0,A4,A5,A14
JRUC STRINGR2
STRINGRX
ADDK 8,A8 ;GET TO THE NEXT BYTE
MMFM A12,A1,A4,A6,A14
RETP
**************************************************************************
* *
* STRNGLEN - RETURNS THE LENGTH, IN PIXELS, OF A GIVEN STRING *
* A8 = PTR TO STRING *
* A10 = [Y,X] SPACING OF STRING *
* A11 = PTR TO FONT TABLE *
* RETURNS: *
* A7 = LENGTH OF STRING *
* Z BIT SET IF LENGTH IS ZERO *
* *
**************************************************************************
STRNGLEN
MMTM SP,A8,A14
CLR A14
MOVB *A8,A7
SLL 24,A7
SRL 24,A7 ;MAKE SURE WE'RE POSITIVE
JREQ STRNLENX
STRNLEN
ADDK 8,A8 ;POINT TO NEXT
CMPI 20H,A7
JRNE STRNLEN1 ;BR = IT'S NOT A SPACE
MOVK 5,A7 ;HARD CODE A SPACE
JRUC STRNLEN2
STRNLEN1
SUBI 21H,A7 ;GET A BASE
SLL 5,A7
ADD A11,A7 ;A7 = PTR TO CORRECT CHARACTER HEADER
MOVE *A7,A7,L
MOVE *A7(ISIZE),A7,W ;GET THE ACTUAL X LENGTH
STRNLEN2
ADDXY A7,A14 ;ADD DIGIT LENGTH
MOVX A10,A7
ADDXY A7,A14 ;ADD SPACE LENGTH
MOVB *A8,A7
SLL 24,A7
SRL 24,A7 ;MAKE SURE WE'RE POSITIVE
JRNE STRNLEN ;NEXT CHARACTER
STRNLENX
MOVE A14,A7 ;PASS RETURN VALUE IN A7
MMFM SP,A8,A14
RETS
**************************************************************************
* *
* HEXTOASC - CONVERTS A 32 BIT HEX # TO AN ASCII STRING TERMINATED *
* BY 0 *
* A8 = HEX # *
* RETURNS: *
* A8 PTR TO THE STRING *
* *
**************************************************************************
HEXTOASC
MMTM SP,A1,A2,A9
CLR A1
CLR A2 ;COMMA COUNT
MOVE A1,-*SP,W ;HERE'S THE NULL TERMINATOR
MOVK 10,A1 ;DIVISOR FOR DECIMAL
MOVE A8,A9
HEXTASC2
CLR A8
DIVU A1,A8
ADDI '0',A9 ;MAKE THE REMAINDER ASCII
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
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
**************************************************************************
* *
* PPOSADDX - ADD LONG KONSTANT TO PLAYER X POSITION. *
* A0 = 32 BIT KONSTANT *
* A4 = PTR TO PLAYER LEGS *
* A8 = PTR TO PLAYER TORSO *
* *
**************************************************************************
PPOSADDX
MMTM SP,A1,A2,A3,A5,A6,A7,A14
PUSHST
DINT
MOVE *A8(OXVAL),A1,L
MOVE *A4(OXVAL),A2,L
MOVE *A8(OSHAD),A3,L
MOVE *A3(OXVAL),A6,L
MOVE *A4(OSHAD),A5,L
MOVE *A5(OXVAL),A7,L
POPST
ADD A0,A1
ADD A0,A2
ADD A0,A6
ADD A0,A7
MOVE A1,*A8(OXVAL),L
MOVE A2,*A4(OXVAL),L
MOVE A3,A3
JREQ PPADDX1
MOVE A6,*A3(OXVAL),L
PPADDX1
MOVE A5,A5
JREQ PPADDX2
MOVE A7,*A5(OXVAL),L
PPADDX2
MMFM SP,A1,A2,A3,A5,A6,A7,A14
RETS
**************************************************************************
* *
* ESCAPEJ - ESCAPE FROM THE CAR BY WAY OF THE JUMP BUTTON *
* A11 = PLINDX *
* *
**************************************************************************
ESCAPEJ
CMPI P1DATA,A11
JRNE ESCAPP2
MOVI P1CTRL,A11
JRUC ESCAPEJ1
ESCAPP2
MOVI P2CTRL,A11
ESCAPEJ1
MOVE *A11,A0,W
ORI PJUMP,A0
MOVE A0,*A11,W
SLEEP 12
MOVE *A11,A0,W
ANDNI PJUMP,A0
MOVE A0,*A11,W
DIE
**************************************************************************
* *
* INVINCO - THE PLAYER INVINCIBLE EFFECT *
* THIS PROCESS WILL SET AND CLEAR THE INVINCIBLE FLAG. *
* A8 = PTR TO OBJECT BLOCK OF PART 1 *
* A9 = PTR TO PLAYER DATA BLOCK *
* A10 = ITERATION COUNT *
* A11 = PTR TO OBJECT BLOCK OF PART 2 *
* *
**************************************************************************
INVINCO
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA EXISTP
JRZ INVINCA ;BR = NO OTHER INVINCO PROCESS
MOVE A10,A1
CALLA GETA10
ADD A1,A10 ;JUST TACK ON SOME MORE TIME
CALLA PUTA10 ;AND STUFF IT
DIE
INVINCA
MOVE *A9(PEXEFLAG),A0,W
ORI MINVINC,A0
MOVE A0,*A9(PEXEFLAG),W ;SET THE FLAGS
INVINCO1
MOVE A9,A2
CALLA PLAYEROF
SLEEP 1
MOVE A9,A2
CALLA PLAYERON
SLEEP 3
DSJ A10,INVINCO1
MOVE *A9(PEXEFLAG),A0,W
ANDNI MINVINC,A0
MOVE A0,*A9(PEXEFLAG),W ;SORRY BUDDY
DIE
*
*INVINCNF - SAME AS INVINCO, BUT WITH NO PLAYER FLASHY
* A8 = PTR TO OBJECT BLOCK OF PART 1
* A9 = PTR TO PLAYER DATA BLOCK
* A10 = ITERATION COUNT
* A11 = PTR TO OBJECT BLOCK OF PART 2
INVINCNF
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA EXISTP
JRZ INVINCNA ;BR = NO OTHER INVINCO PROCESS
MOVE A10,A1
CALLA GETA10
ADD A1,A10 ;JUST TACK ON SOME MORE TIME
CALLA PUTA10 ;AND STUFF IT
DIE
INVINCNA
MOVE *A9(PEXEFLAG),A0,W
ORI MINVINC,A0
MOVE A0,*A9(PEXEFLAG),W ;SET THE FLAGS
INVINCN1
SLEEP 4
DSJ A10,INVINCN1
MOVE *A9(PEXEFLAG),A0,W
ANDNI MINVINC,A0
MOVE A0,*A9(PEXEFLAG),W ;SORRY BUDDY
DIE
**************************************************************************
* *
* PXFERCRD - XFER CARDS TO OTHER ACTIVE PLAYER *
* A2 = PTR PLAYER DOING THE XFERING *
* *
**************************************************************************
PXFERCRD
RETS
**************************************************************************
* *
* MMTM SP,A0,A1,A2,A3 *
* CMPI P1DATA,A2 *
* JRNE PXFER21 *
* MOVI P2DATA,A3 *
* JRUC PXFERNOW *
* PXFER21 *
* MOVI P1DATA,A3 *
* PXFERNOW *
* MOVE *A2(PCARDS),A0,L *
* MOVE *A3(PCARDS),A1,L *
* ADD A0,A1 *
* MOVE A1,*A3(PCARDS),L *
* CLR A0 *
* MOVE A0,*A2(PCARDS),L *
* MOVE *A2(PCARDS1),A0,L *
* MOVE *A3(PCARDS1),A1,L *
* ADD A0,A1 *
* MOVE A1,*A3(PCARDS1),L *
* CLR A0 *
* MOVE A0,*A2(PCARDS1),L *
* *XFER MR. BIG KILLS ALSO *
* MOVE *A2(PMBIGS),A0,W *
* MOVE *A3(PMBIGS),A1,W *
* ADD A0,A1 *
* MOVE A1,*A3(PMBIGS),W *
* CLR A0 *
* MOVE A0,*A2(PMBIGS),W *
* *
* CALLA OUTCARDS ;SHOW THIS GUYS CARDS OR LACK TH *
* CALLA OUTMBIGS *
* MOVE A3,A2 *
* CALLA OUTCARDS ;SHOW THE OTHER GUYS ADDED CARDS *
* CALLA OUTMBIGS *
* MMFM SP,A0,A1,A2,A3 *
* RETS *
* *
**************************************************************************
**************************************************************************
* *
* PDROPALL - DROP ALL OF THE PLAYERS CARDS AND SHIT *
* A2 = PTR TO PLAYER DATA STRUCTURE *
* A8 = PTR TO PLAYER OBJECT *
* *
**************************************************************************
**************************************************************************
* *
* PDROPALL *
* MMTM SP,A0,A4,A5,A6,A7,A9,A14 *
* MOVI CARDCOLD,A7 ;THIS IS THE PROCESS TO CREATE *
* MOVE *A8(OXPOS),A5,W *
* MOVE *A8(OYPOS),A6,W *
* SLL 16,A6 *
* MOVY A6,A5 *
* CLR A6 *
* MOVI 00100000H|CARDOID,A14 *
* *
* MOVB *A2(PSCARD),A4 ;GET THE # SILVER CARDS *
* JREQ DRPS1A2 *
* ORI SILVER,A14 *
* DRPS1A1 *
* CALL A7 *
* ADDI 20,A5 *
* DSJS A4,DRPS1A1 *
* MOVB A4,*A2(PSCARD) *
* DRPS1A2 *
* MOVB *A2(PBCARD),A4 ;GET THE # OF BLUE CARDS *
* JREQ DRPS1A4 *
* SRL 4,A14 *
* SLL 4,A14 *
* ORI BLUE,A14 *
* DRPS1A3 *
* CALL A7 *
* ADDI 20,A5 *
* DSJS A4,DRPS1A3 *
* MOVB A4,*A2(PBCARD) *
* DRPS1A4 *
* MOVB *A2(PRCARD),A4 ;GET THE # OF RED CARDS *
* JREQ DRPS1A6 *
* SRL 4,A14 *
* SLL 4,A14 *
* ORI RED,A14 *
* DRPS1A5 *
* CALL A7 *
* ADDI 20,A5 *
* DSJS A4,DRPS1A5 *
* MOVB A4,*A2(PRCARD) *
* DRPS1A6 *
* MOVB *A2(PGCARD),A4 ;GET THE # OF GOLD CARDS *
* JREQ DRPS1A8 *
* SRL 4,A14 *
* SLL 4,A14 *
* ORI GOLD,A14 *
* DRPS1A7 *
* CALL A7 *
* ADDI 20,A5 *
* DSJS A4,DRPS1A7 *
* MOVB A4,*A2(PGCARD) *
* DRPS1A8 *
* MOVB *A2(PGRCARD),A4 ;GET THE # OF GOLD CARDS *
* JREQ DRPS1AA *
* SRL 4,A14 *
* SLL 4,A14 *
* ORI GREEN,A14 *
* DRPS1A9 *
* CALL A7 *
* ADDI 20,A5 *
* DSJS A4,DRPS1A9 *
* MOVB A4,*A2(PGRCARD) *
* DRPS1AA *
* CALLA OUTCARDS *
* MMFM SP,A0,A4,A5,A6,A7,A9,A14 *
* RETS *
* *
**************************************************************************
**************************************************************************
* *
* SLOWPCAR - SLOW THE PLAYER'S CAR DOWN BY A CONSTANT, SWITCHED PROC. *
* *
**************************************************************************
SLOWPCAR
MOVE @PLAYCAR,A10,L
JRZ SLOWPDI ;NO CAR, NO SLOW DOWN
MOVE *A10(OPLINK),A0,L
JRZ SLOWPDI ;BR = NO CONTROL
MOVE A13,A14
MOVE A0,A13 ;PROC BLOK PTR HERE
CALLA GETA8 ;GET THE DRIVER PTR
MOVE *A10(OXVEL),A1,L ;FUCK WITH X VELOCITY
JRZ SLOWPSWP ;BR = THERE WASN'T ANY
JRN SLPCBAD ;BR = NEGATIVE SO ADD TO REDUCE
SUBI [0,7FFFH],A1
JRNN SLPCBSX ;BR = DIDN'T CHANGE SIGNS
CLR A1 ;ZERO IN THIS CASE
JRUC SLPCBSX
SLPCBAD
ADDI [0,7FFFH],A1
JRN SLPCBSX ;DIDN'T SWITCH TO POSITIVE
CLR A1
SLPCBSX
CALLA CARXVEL
SLOWPSWP
MOVE A14,A13
SLOWPDI
DIE
**************************************************************************
* *
* POUTOFRK - PLAYER OUT OF ROCKETS SOUND PROCESS *
* *
**************************************************************************
POUTOFRK
SOUND1 OUTOROCK ;SOUND OFF
DIE
OUTOROCK .WORD >F3A0,>01,>80A7,0 ;OUT OF ROCKETS SOUND
**************************************************************************
* *
* PFLYNDIE - MAKE THE PLAYER FLY THROUGH THE AIR AND FLAIL HELPLESSLY *
* A2 = PLAYER DATA AREA *
* A8 = PTR TO TORSO *
* A11 = PTR TO LEGS *
* NOTE: CALL WITH JSRP, MAKE SURE ALL RELEVANT PLAYER FLAGS ARE SET. *
* *
**************************************************************************
PFLYNDIE
MOVE *A2(PIRQFLAG),A0,W
BTST BDRIVER,A0
JREQ PFLYND1
*PLAYER IS DRIVING, LET'S VAULT HIM OUT OF THE CAR
MOVE @PUPDATE,A1,W
MOVK 1,A3
MOVE A3,@PUPDATE,W
MOVE *A2(PIRQFLAG),A0,W
ANDNI MDRIVER|MSITIN,A0
MOVE A0,*A2(PIRQFLAG),W
MOVE A1,@PUPDATE,W
MOVE *A8(OSHAD),A0,L
JRNZ PFLYND0 ;BR = SHADOW ALREADY EXISTS
CALLA SHADST2 ;RE-START TORSO SHADOW
PFLYND0
MOVE *A11(OSHAD),A0,L
JRNZ PFLYND0A
SWAP A11,A8
CALLA SHADST ;RE-START LEG SHADOW
SWAP A11,A8
PFLYND0A
CALLR PCAROYZ
NEG B2 ;NEGATE THE Z VELOCITY
MOVE @PLAYCAR,A0,L ;GET THE CAR
JRZ PFLYND2
MOVE *A0(OZMINUS),A1,W
MOVE *A0(OZPOS),A14,W
SUB A1,A14
SUBK 20,A14
*** MOVE @PLZMIN,A1,W
*** CMP A1,A14
*** JRGE PFLYND0B
*** MOVE A1,A14
***PFLYND0B
MOVE A14,*A8(OZPOS),W
MOVE *A0(OPLINK),A0,L
JRZ PFLYND2 ;WIERDNESS, NO PROC
MOVE A8,B0
CLR A8
CALLA PUTA8 ;ZERO OUT THE DRIVER POINTER
MOVE B0,A8
JRUC PFLYND2
PFLYND1
MOVE *A2(PIRQFLAG),A0,W ;RELOAD FOR SAFETY
BTST BPASSEN,A0
JREQ PFLYND1C
MOVE @PUPDATE,A1,W
MOVK 1,A3
MOVE A3,@PUPDATE,W
MOVE *A2(PIRQFLAG),A0,W
ANDNI MPASSEN|MSITIN,A0
MOVE A0,*A2(PIRQFLAG),W
MOVE A1,@PUPDATE,W
MOVE *A8(OSHAD),A0,L
JRNZ PFLYND1A ;BR = SHADOW ALREADY EXISTS
CALLA SHADST2 ;RE-START TORSO SHADOW
PFLYND1A
MOVE *A11(OSHAD),A0,L
JRNZ PFLYND1B
SWAP A11,A8
CALLA SHADST ;RE-START LEG SHADOW
SWAP A11,A8
PFLYND1B
CALLR PCAROYZ
MOVE @PLAYCAR,A0,L ;GET THE CAR
JRZ PFLYND2
MOVE *A0(OZPLUS),A1,W
MOVE *A0(OZPOS),A14,W
ADD A1,A14
ADDK 5,A14
*** MOVE @PLZMAX,A1,W
*** CMP A1,A14
*** JRLE PFLYND1B0
*** MOVE A1,A14
***PFLYND1B0
MOVE A14,*A8(OZPOS),W
MOVE *A0(OPLINK),A0,L
JRZ PFLYND2 ;WIERDNESS, NO PROC
CLR A1
MOVE A1,*A0(PASSPTR),L ;CLEAR THE PASSENGER PTR
JRUC PFLYND2
PFLYND1C
CALLA GETYZVEL ;GET THE MEGA LEGA EXPLODING VEL
ABS B3
CMPI [6,0],B3
JRLS PFLYND2 ;O.K. UP VEL, DO IT BABY
MOVI [6,0],B3
PFLYND2
MOVE A11,A4 ;GOT TO HAVE THIS MAAHN
CALLA PLEGOFF
MOVE A11,A0
MOVI PLAYERS,A1
CALLA ISSUPP
JRZ PFLYND3 ;BR = ALREADY OFF YOU NIT WIT
CALLA DELSUPP ;RID O' LEGS
PFLYND3
NEG B3 ;GO UP
ADD B2,B3 ;MAKE IT REALISTIC
MOVE A8,B0
MOVE B2,*B0(OZVEL),L
MOVE B3,*B0(OYVEL),L
MOVI PFLAIL,A9
PUSHP A11
PFLYND4
MOVK 4,A1
JSRP FRANIM
JRC PFLYND7 ;THE END WAS HIT
MOVE A0,A11
PFLYND5
SLEEP 1
MOVE *A8(OYVEL),A3,L ;GET THE CURRENT Y VELOCITY
MOVE *A8(OZVEL),A2,L
SUB A2,A3
JRLE PFLYND6 ;BR = NOT GOING DOWN, DON'T CHECK GROUND HIT
CALLA DFRMGRND ;DID HE HIT THE GROUND?
JRLE PFLYND8 ;BR = YES
PFLYND6
ADDI GRAVITY,A3
ADD A2,A3
MOVE A3,*A8(OYVEL),L
MOVE *A8(OXVEL),A5,L
JRNZ PFLYND6A ;HE'S STILL MOVING IN X
CALLA GETANIX ;IF HE STOPPED IN X
MOVE @WORLDTLX+16,A5,W
SUB A5,A0 ;MAKE THE ANIMATION PNT SCREEN REL
CMPI 256,A0 ;START HIM MOVING TOWARDS THE MIDDLE
JRGT PFLYND60
MOVI [1,0],A5 ;MOVE RIGHT
JRUC PFLYND61
PFLYND60
MOVI [-1,0],A5 ;MOVE LEFT
PFLYND61
MOVE A5,*A8(OXVEL),L
*CHECK FOR ZERO Z VEL
PFLYND6A
MOVE *A8(OZVEL),A5,L
JRNZ PFLYND6B ;HE'S STILL MOVING IN Z
MOVE *A8(OZPOS),A5,W ;NOW GET THE Z POSITION
MOVE @PLZMID,A0
CMP A0,A5
JRLT PFLYND6A0
MOVI [-1,0],A5
JRUC PFLYND6A1
PFLYND6A0
MOVI [1,0],A5
PFLYND6A1
MOVE A5,*A8(OZVEL),L ;LET'S KEEP TRUCKIN'
MOVE *A8(OYVEL),A0,L
ADD A5,A0
MOVE A0,*A8(OYVEL),L
PFLYND6B
DSJ A11,PFLYND5
JRUC PFLYND4
PFLYND7
MOVI PFLAIL,A9
JRUC PFLYND4
PFLYND8
PULLP A11
MOVE A11,A4
CALLA PLSTOP
RETP
**************************************************************************
* *
* PCAROYZ - GET SOME YZ VELOCITIES FOR GETTING OUSTED FROM THE CAR *
* RETURNS: *
* B2 = POSITIVE Z VEL *
* B3 = CORRECT Y VEL *
* *
**************************************************************************
PCAROYZ
PUSH A0
MOVI [1,0],A0
CALLA SRAND
ADDI [3,0],A0
MOVE A0,B3
NEG B3
MOVI 0800H,A0
CALLA SRAND
ADDI 18000H,A0
MOVE A0,B2
PULL A0
RETS
**************************************************************************
* *
* PFLASH2 - FLASH A PLAYER WITH A CONSTANT COLOR. *
* A11 = PTR TO PLAYER DATA STRUCTURE *
* *
**************************************************************************
PFLASH2
MOVI 0FFFFh,A0
MOVE *A11(POBJ),A1,L
MOVE A0,*A1(OCONST),W ;SELECT CONSTANT COLOR
MOVE *A11(PLOBJ),A1,L
MOVE A0,*A1(OCONST),W ;FOR BOTH OBJECTS
PFLSH21
MOVE A11,A2
CALLA PLAYERCON ;CONSTANT ON
SLEEP 2
MOVE A11,A2
CALLA PLAYERON ;NORMAL
SLEEP 4
JRUC PFLSH21
**************************************************************************
* *
* PIJDECEL - DECELERATE A PLAYER DURING HIS GAMEPLAY INTRO *
* A9 = PTR TO PLAYER CONTROL LOCATION *
* A10 = PTR TO VEHICLE THAT PLACEHOLDER IS ABOARD *
* A11 = PTR TO PLAYER DATA BLK *
* *
**************************************************************************
PIJDECEL
MOVE A11,A2
MOVE A9,A11
MOVE *A2(POBJ),A8,L
MOVE *A2(PLOBJ),A9,L
MOVE *A10(OXVEL),A10,L
CMPI [3,0],A10
JRGT PIJDEC1
MOVI [4,0],A10
JRUC PIJDEC2
PIJDEC1
CMPI [15,0],A10
JRLT PIJDEC2
MOVI [14,0],A10
PIJDEC2
SLEEP 6
MOVE A10,*A8(OXVEL),L
MOVE A10,*A9(OXVEL),L
MOVE *A8(OYVEL),A3,L
ADDI [-2,0],A3
MOVE A3,*A8(OYVEL),L
MOVE A3,*A9(OYVEL),L
SLEEP 4
PLJSLP
SUBI 3000H,A10
MOVE *A8(OXVEL),A1,L
ABS A1
CMPI [2,1000H],A1
JRLE PLJDECX
MOVE A10,*A8(OXVEL),L
MOVE A10,*A9(OXVEL),L
SLOOP 1,PLJSLP
PLJDECX
MOVI PRYTE,A0
MOVE A0,*A11,W
SLEEP 16
CLR A0
MOVE A0,*A11,W
DIE
**************************************************************************
* *
* PLAYER DELETE ROUTINE *
* A2=PLINDX=PLAYER DATA STRUCTURE *
* RETURNS: *
* Z BIT SET = LAST PLAYER TO DIE *
* Z BIT CLR = ANOTHER PLAYER LEFT *
* *
**************************************************************************
PDELETE:
MMTM SP,A0,A1,A4,A6,A8
MOVI PLAYERS,A1 ;DELETE FROM THIS LIST
MOVE @NPLYRS,A6,W
DEC A6 ;DECREMENT NUMBER OF PLAYERS
MOVE A6,@NPLYRS,W
MOVE *A2(PLOBJ),A0,L ;GET THE LEGS
JREQ PDELETE1 ;BR = NO LEGS
MOVE *A0(OFLAGS),A4,W
SRL 4,A4
SLL 4,A4
ORI 2,A4
MOVE A4,*A0(OFLAGS),W
CALLA DELSUPP
MOVE A6,A6
JREQ PDELETE1
MOVE A0,A8
CREATE 0DFH,PLSINK
PDELETE1
MOVE *A2(POBJ),A0,L ;GET THE OBJECT BLOCK PTR
MOVE *A0(OFLAGS),A4,W
SRL 4,A4
SLL 4,A4
ORI 2,A4
MOVE A4,*A0(OFLAGS),W
CALLA DELSUPP
MOVE A6,A6
JREQ PDELETE2
MOVE A0,A8
CREATE 0DFH,DSINK
**** CALLA PDROPALL ;DROP ALL OF HIS CARDS
CALLA PXFERCRD ;XFER CARDS
CLR A0
MOVE A0,*A2(POBJ),L ;AND MAKE HIS OBJECT PTR NULL
MOVE A0,*A2(PLOBJ),L
MOVE *A2(PSCORE),A0,L
CALLA OUTSCR ;TURN OFF THE FLASH OF HIS SCORE
*** MOVI INTR1OID|CBODYID,A0
*** MOVI CARLIST,A1
*** CALLA ISSUPPID
*** JRZ PDELETE3 ;BR = NO INTRO VEHICLE AROUND
***
*** MMTM SP,A2,A3,A5,A14
*** MOVE *A1(OPLINK),A5,L
*** CMPI P2DATA,A2
*** JREQ PDELTOT1
*** MOVI P1TINIT,A14
*** CALLA GPALOBJ
*** JRZ PDELTOTX
*** MOVE A0,*A5(PASSPTR),L ;STUFF THE PLAYER 1 PTR
*** MOVE A5,*A0(OPLINK),L
*** MOVI CARLIST,A14
*** JRUC PDELTOT2
***PDELTOT1
*** MOVI P2TINIT,A14
*** CALLA GPALOBJ
*** JRZ PDELTOTX
*** MOVE A0,A8
*** MOVE A5,A0
*** CALLA PUTA8
*** MOVE A8,A0
*** MOVE A5,*A0(OPLINK),L
*** MOVI ENEMIES,A14
***PDELTOT2
*** CALLA STFOBJ
*** MOVE A1,A8
*** MOVE *A8(OZPOS),A1,W
*** INC A1
*** MOVE A1,*A0(OZPOS),W
*** MOVE *A8(OXVEL),*A0(OXVEL),L
*** MOVE *A8(OYVEL),*A0(OYVEL),L
*** MOVE *A8(OZVEL),*A0(OZVEL),L
*** CALLA GETANIXY ;GET ROCKET APOINT POSITION
*** MOVE *A8(OFLAGS),A4,W ;AND ROCKET FLAGS
*** CALLA GANISAG ;ADJUST FOR NEW IMAGE AND POSS. FLIP
*** CALLA INSOBJ ;PUT IT ON THE LIST
*** MOVE A14,A1
*** CALLA ADDSUPP ;O.K., WE'RE HAPPENING
***PDELTOTX
*** MMFM SP,A2,A3,A5,A14
PDELETE3
MOVE A6,A6
MMFM SP,A0,A1,A4,A6,A8
RETS
PDELETE2
MOVE A0,A4
CLR A0
MOVE A0,*A2(POBJ),L ;AND MAKE HIS OBJECT PTR NULL
MOVE *A2(PSCORE),A0,L
CALLA OUTSCR ;TURN OFF THE FLASH OF HIS SCORE
MOVE A4,*A2(POBJ),L
JRUC PDELETE3
*
*PLSINK - PLAYER LEG SINK,NO PALETTE DELETE
*A8 = PTR TO PLAYER LEG OBJECT
PLSINK
MOVI [1,1],A9
JSRP OSINK
MOVE A8,A0
CALLA DELSOBJ ;GET RID OF THIS THING
JAUC SUCIDE
**************************************************************************
* *
* PLEGOFF - TURN THE PLAYERS LEGS AND SHADOW OFF *
* A2 = PTR TO PLAYER DATA BLOCK *
* A4 = PTR TO OBJECT *
* *
**************************************************************************
PLEGOFF
MMTM SP,A0,A1
MOVE *A4(OFLAGS),A0,W
SRL 4,A0
SLL 4,A0
MOVE A0,*A4(OFLAGS),W ;TURN OFF THE LEGS
MOVE *A4(OSHAD),A0,L
JREQ PLEGOFF1
MOVE *A0(OFLAGS),A1,W
SRL 4,A1
SLL 4,A1
MOVE A1,*A0(OFLAGS),W ;TURN OFF THE LEG SHADOW
PLEGOFF1
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* PLEGON - TURN THE PLAYERS LEGS AND SHADOW ON *
* A4 = PTR TO OBJECT *
* *
**************************************************************************
PLEGON
MMTM SP,A0,A1
MOVE *A4(OFLAGS),A0,W
SRL 4,A0
SLL 4,A0
ADDK 2,A0
MOVE A0,*A4(OFLAGS),W ;TURN ON THE LEGS
MOVE *A4(OSHAD),A0,L
JREQ PLEGON1
MOVE *A0(OFLAGS),A1,W
SRL 4,A1
SLL 4,A1
ADDK 8,A1
MOVE A1,*A0(OFLAGS),W ;TURN ON THE LEG SHADOW
PLEGON1
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* PTORSON - TURN THE PLAYERS TORSO AND SHADOW ON *
* A8 = PTR TO TORSO OBJECT *
* *
**************************************************************************
PTORSON
MMTM SP,A0,A1
MOVE *A8(OFLAGS),A0,W
SRL 4,A0
SLL 4,A0
ADDK 2,A0
MOVE A0,*A8(OFLAGS),W ;TURN ON THE TORSO
MOVE *A8(OSHAD),A0,L
JREQ PTORSON1
MOVE *A0(OFLAGS),A1,W
SRL 4,A1
SLL 4,A1
ADDK 8,A1
MOVE A1,*A0(OFLAGS),W ;TURN ON THE LEG SHADOW
PTORSON1
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* BOTHPON - TURN BOTH PLAYERS ON IF ACTIVE *
* *
**************************************************************************
BOTHPON
MMTM SP,A0,A2
MOVI P1DATA,A2
MOVE *A2(POBJ),A0,L
JRZ BOTHP2ON
CALLA PLAYERON
BOTHP2ON
MOVI P2DATA,A2
MOVE *A2(POBJ),A0,L
JRZ BOTHPXON
CALLA PLAYERON
BOTHPXON
MMFM SP,A0,A2
RETS
**************************************************************************
* *
* TSHADST - CREATES A NEW PLAYER TORSO SHADOW IF NONE EXISTED. *
* A2 = PTR TO PLAYER DATA BLOCK *
* *
**************************************************************************
TSHADST1 ;PLAYER ONE ENTRY
MOVI P1DATA,A2
JRUC TSHADST
TSHADST2 ;PLAYER TWO ENTRY
MOVI P2DATA,A2
TSHADST
MOVE *A2(POBJ),A8,L
MOVE *A8(OSHAD),A0,L
JRNZ TSHADSTX ;BR = SHADOW ALREADY EXISTS
CALLA SHADST2
TSHADSTX
DIE
**************************************************************************
* *
* LSHADST - CREATES A NEW PLAYER LEG SHADOW IF NONE EXISTED. *
* A2 = PTR TO PLAYER DATA BLOCK *
* *
**************************************************************************
LSHADST1 ;PLAYER ONE ENTRY
MOVI P1DATA,A2
JRUC LSHADST
LSHADST2 ;PLAYER TWO ENTRY
MOVI P2DATA,A2
LSHADST
MOVE *A2(PLOBJ),A8,L
JRZ LSHADSTX
MOVE *A8(OSHAD),A0,L
JRNZ LSHADSTX ;BR = SHADOW ALREADY EXISTS
CALLA SHADST
LSHADSTX
DIE
**************************************************************************
* *
* TSHADDEL - DELETE THE PLAYER TORSO SHADOW. *
* A2 = PTR TO PLAYER DATA *
* *
**************************************************************************
TSHADDL1
MOVI P1DATA,A2
JRUC TSHADDEL
TSHADDL2
MOVI P2DATA,A2
TSHADDEL
MOVE *A2(POBJ),A8,L
MOVE *A8(OSHAD),A0,L
JRZ TSHADDLX ;BR = NO SHADOW
CALLA DELOBJ
CLR A0
MOVE A0,*A8(OSHAD),L
TSHADDLX
DIE
**************************************************************************
* *
* LSHADDEL - DELETE THE PLAYER LEG SHADOW. *
* A2 = PTR TO PLAYER DATA *
* *
**************************************************************************
LSHADDL1
MOVI P1DATA,A2
JRUC LSHADDEL
LSHADDL2
MOVI P2DATA,A2
LSHADDEL
MOVE *A2(PLOBJ),A8,L
JRZ LSHADDLX
MOVE *A8(OSHAD),A0,L
JRZ LSHADDLX ;BR = NO SHADOW
CALLA DELOBJ
CLR A0
MOVE A0,*A8(OSHAD),L
LSHADDLX
DIE
**************************************************************************
* *
* PCONTST - START PLAYER CONTINUATION MESSAGES, IF NECESSARY *
* *
**************************************************************************
PCONTST
PUSH A2
MOVI P1DATA,A2
CALLR STRTCONT
MOVI P2DATA,A2
CALLR STRTCONT
PULL A2
RETS
**************************************************************************
* *
* STRTCONT - START A PLAYER'S CONTINUATION MESSAGE IF HE'S DEAD. *
* A2 = PLINDX *
* *
**************************************************************************
STRTCONT
MMTM SP,A0,A1,A7,A11
MOVE *A2(POBJ),A0,L
JREQ STRTCNT1 ;BR = NO PLAYER TO BE FOUND
MOVE *A2(PFLAGS),A0,L
BTST BBUYIN,A0
JREQ STRTCNTX ;BR = NOT BUY-IN TIME
STRTCNT1
MOVE A2,A11
MOVE *A2(PPID),A1
ORI PMPID,A1
MOVI PRESCONT,A7
CALLA GETPRC ;FLASH THE BUY-IN MESSAGE
STRTCNTX
MMFM SP,A0,A1,A7,A11
RETS
**************************************************************************
* *
* OWINDOW - OPEN A TEXT WINDOW, ON THE OBJECT LIST. *
* ZVAL WILL BE = 7FFF0000H *
* A8 = WINDOW SIZE *
* A10 = CENTER POINT OF WINDOW (SCREEN RELATIVE) *
* RETURNS: *
* A8 = PTR WINDOW OBJECT *
* ZBIT SET = FAILURE TO CREATE *
* ZBIT CLR = WINDOW IS OPEN *
* NOTE: CALL WITH JSRP *
* TRASHES A9,A10 & A11 *
* *
**************************************************************************
OWINDOW
MOVI WINDINIT,A14
CALLA GPALOBJ
MOVE A8,A11
MOVE A0,A8
JRZ OWINDOWX ;BR = FAILED MISERBLY
CALLA STFOBJ
MOVE A10,*A8(OXPOS),W
MOVY A10,A1
SRL 16,A1
MOVE A1,*A8(OYPOS),W
MOVI 0101H,A1
MOVE A1,*A8(OCONST),W
CALLA ADJSTWTL ;ADJUST TO THE WORLD TOP LEFT
CALLA INSOBJ
MOVE *A8(OXPOS),A10,W
MOVE *A8(OYPOS),A0,W
SLL 16,A0
MOVY A0,A10 ;GET NEW WORLD COORDS.
MOVE A10,A0 ;STORE HERE
MOVY A11,A1
SRL 17,A1
SLL 16,A1 ;DIVIDE Y BY 2
SLL 16,A11
SRL 17,A11 ;AND X
MOVY A1,A11
SUBXY A11,A10
ADDXY A0,A11
MOVI 16,A0
JSRP OBJEXP32
MOVE A8,A8
OWINDOWX
RETP
**************************************************************************
* *
* CWINDOW - CLOSE A TEXT WINDOW, ON THE OBJECT LIST. *
* A8 = PTR TO WINDOW OBJECT *
* RETURNS: *
* WITH WINDOW OBJECT DELETED *
* NOTE: CALL WITH JSRP *
* TRASHES A9,A10 & A11 *
* *
**************************************************************************
CWINDOW
MOVE *A8(OXPOS),A10,W
MOVE *A8(OYPOS),A11,W
SLL 16,A11
MOVY A11,A10
MOVE *A8(OSIZE),A11,L
MOVY A11,A1
SRL 17,A1
SLL 16,A1
SLL 16,A11
SRL 17,A11
MOVY A1,A11
ADDXY A11,A10
MOVE A10,A11 ;CALCULATED CENTER OF OBJECT
MOVI 20,A0
JSRP OBJEXP32
MOVE A8,A0
CALLA DELPAL
CALLA DELOBJ
RETP
**************************************************************************
* *
* OBJEXP32 - SHRINK OR EXPAND AN OBJECT FROM THE CURRENT SIZE *
* TO THE GIVEN SIZE IN A GIVEN AMOUNT OF TICKS. *
* A0 = # OF TICKS *
* A8 = PTR TO OBJECT *
* A10 = NEW OBJTL *
* A11 = NEW OBJLR *
* NOTE: CALL WITH JSRP *
* TRASHES A9 *
* *
**************************************************************************
OBJEXP32
MOVE *A8(OXPOS),A1,W
MOVE *A8(OYPOS),A14,W
SLL 16,A14
MOVX A1,A14 ;A14 = OBJECT UL
SLL 16,A1
CLR A2
MOVY A14,A2
SUBXY A10,A14
MOVX A14,A5
SLL 16,A5
DIVS A0,A5
NEG A5
MOVE A5,A6
CLR A5
MOVY A14,A5
DIVS A0,A5
NEG A5
MOVE A5,A7
MOVE *A8(OXPOS),A3,W
MOVE *A8(OYPOS),A14,W
SLL 16,A14
MOVX A3,A14
MOVE *A8(OSIZE),A3,L
ADDXY A3,A14 ;A14 = OBJECT LR
PUSH A8 ;STACK OBJECT
MOVX A14,A3
SLL 16,A3
CLR A4
MOVY A14,A4
SUBXY A11,A14
MOVX A14,A5
SLL 16,A5
DIVS A0,A5
NEG A5
MOVE A5,A8
CLR A5
MOVY A14,A5
DIVS A0,A5
NEG A5
MOVE A5,A9
MOVE A0,A5
PULL A14 ;KEEP OBJECT HERE
OBJTIMLP
ADD A6,A1 ;ADD THE TLX INCREMENT
ADD A7,A2 ;ADD THE TLY INCREMENT
ADD A8,A3 ;ADD THE LRX INCREMENT
ADD A9,A4 ;ADD THE LRY INCREMENT
MMTM A12,A1,A2,A3,A4,A5,A6,A7,A14
MOVE A1,*A14(OXVAL),L
MOVE A2,*A14(OYVAL),L
SUB A1,A3
SUB A2,A4 ;GET A SIZE FOR THE WINDOW
SRL 16,A3
MOVY A4,A3
CALLR FIXA3XY
MOVE A3,*A14(OSIZE),L
SLEEP 1
MMFM A12,A1,A2,A3,A4,A5,A6,A7,A14
DSJS A5,OBJTIMLP
MOVE A10,*A14(OXPOS),W
MOVY A10,A1
SRL 16,A1
MOVE A1,*A14(OYPOS),W
MOVE A11,A9
SUBXY A10,A11
MOVE A11,A3
CALLR FIXA3XY
MOVE A3,*A14(OSIZE),L ;MATCH WHAT THE CALLER WANTED
MOVE A9,A11 ;PRESERVE FOR YUKS
MOVE A14,A8
RETP
**************************************************************************
* *
* FIXA3XY - CHECKS THE X AND Y COMPONENT OF A3, ANY ONE THAT IS ZERO *
* WILL BE SET TO ONE. KEEPS OSIZE IN ORDER. *
* A3 = [Y,X] *
* *
**************************************************************************
FIXA3XY
PUSH A0
CLR A0
MOVY A3,A0
MOVE A0,A0
JRNZ FA3YOK
MOVK 1,A0
SLL 16,A0
MOVY A0,A3
FA3YOK
CLR A0
MOVX A3,A0
MOVE A0,A0
JRNZ FA3XOK
MOVK 1,A0
MOVX A0,A3
FA3XOK
PULL A0
RETS
*INIT TABLE FOR WINDOW
WINDINIT
.LONG 0,0,0,0,7FFF0000H,WINDOBJ,0,0
.WORD DMACAL,TEXTWOID,0,0
*INITIAL WINDOW OBJECT
WINDOBJ
.WORD 1,1,0,0
.LONG 02000000H,NARCS
**************************************************************************
* *
* BUYINWIN - PUT UP THE BUY-IN WINDOW PROCESS *
* A10 = PTR TO PLAYER DATA CAUSING THIS *
* *
**************************************************************************
BUYINWIN
PUSHP A10 ;KEEP PLINDX
MOVI [65+SKYTOPOF,255],A10
MOVI [120,230],A8
JSRP OWINDOW ;OPEN THE WINDOW
JRZ BUYINWDI ;COULDN'T DO IT
SOUND1 BUYMUSIC
CALLR INIBTIME ;INITIALIZE BUY IN TIME
CALLR INIBMESS ;INITIALIZE BUY IN MESSAGE
MOVK 1,A0
MOVE A0,@BUYNOW,W
PBUYOLP
MOVI BUYTICK,A11
PBUYILP
MOVE *A12,A2,L
MOVE *A2(PENERGY),A0,L
JRGT PBUYDONE
MOVE @NPLYRS,A0,W
DEC A0
JRNZ PBUYDONE ;OTHER GUY BOUGHT IN
SLEEP BUYSLP
CALLR UPBMESS1 ;UPDATE BUYIN MESSAGE 1
CALLR UPBMESS2
DSJS A11,PBUYILP
CALLR DECBTIME ;DECREMENT BUYIN TIME
JRGE PBUYOLP ;WE ARE NOT DONE YET
*SOMEBODY JUST BOUGHT IN OR TIME IS UP
PBUYDONE
CALLR CLRBTIME
CALLR CLRBMESS
SOUND1 BUYMOFF
JSRP CWINDOW
CLR A0
MOVE A0,@BUYNOW,W
BUYINWDI
DIE
**************************************************************************
* *
* BUYINLP - PUT UP THE BUY-IN WINDOW PROCESS AND LOOP BACK ON BUY-IN. *
* A10 = PTR TO PLAYER DATA CAUSING THIS *
* *
**************************************************************************
BUYINLP
PUSHP A10 ;KEEP PLINDX
MOVI [65+SKYTOPOF,255],A10
MOVI [120,230],A8
JSRP OWINDOW ;OPEN THE WINDOW
JRZ BUYINLPDI ;COULDN'T DO IT
SOUND1 BUYMUSIC
CALLR INIBTIME ;INITIALIZE BUY IN TIME
CALLR INIBMESS ;INITIALIZE BUY IN MESSAGE
*YES IT'S BUY-IN TIME AGAIN!
MOVI INGAME,A0
MOVE A0,@GAMSTATE,W ;TAKE US OUT OF GAME PLAY
MOVI IBUYINS,A0
MOVE A0,@P1DATA+PBUYINS,W
MOVE A0,@P2DATA+PBUYINS,W
MOVK 1,A0
MOVE A0,@BUYNOW,W
BUYLPOLP
MOVI BUYTICK,A11
BUYLPILP
MOVE *A12,A2,L
MOVE *A2(PENERGY),A0,L
JRGT BUYLPBAK
MOVE @NPLYRS,A0,W
DEC A0
JRNZ BUYLPBAK ;OTHER GUY BOUGHT IN
SLEEP BUYSLP
CALLR UPBMESS1 ;UPDATE BUYIN MESSAGE 1
CALLR UPBMESS2
DSJS A11,BUYLPILP
CALLR DECBTIME ;DECREMENT BUYIN TIME
JRGE BUYLPOLP ;WE ARE NOT DONE YET
*YOUR TIIIIIIIIIIIIIIME IS UP!
CALLR CLRBTIME
CALLR CLRBMESS
SOUND1 BUYMOFF
MOVI INGAMEOV,A0
MOVE A0,@GAMSTATE,W
JSRP CWINDOW
CLR A0
MOVE A0,@BUYNOW,W
BUYINLPDI
DIE
*
*SOMEBODY JUST BOUGHT IN
*IT IS TIME TO LOOP BACK TO THE BEGINNING
BUYLPBAK
CLR A0
MOVE A0,@BUYNOW,W
AUDIT AUDLOOP
CALLR CLRBTIME
CALLR CLRBMESS
SOUND1 BUYMOFF
JSRP CWINDOW
CALLA KILLWAVE
SOUND1 MUSICOFF
SOUND1 YAMOFF
CLR A0
MOVE A0,@PUPDATE,W
CLR A9
MOVE A9,@IRQSKYE,W ;CLEAR AUTO-ERASE COLOR
MOVK 1,A0
MOVE A0,@GAMERASE,W
MOVI SCRNMID,A10
MOVI SCRNMID,A11
MOVI 20,A0
JSRP SCREXP32 ;NOW GO THE CENTER
CLR A0
MOVE A0,@DISPLAYON,W
CALLA DMAQWAIT
CALLA MYOINIT
MOVI SCRNMID,A0
MOVE A0,@SCRNTL,L
MOVE A0,@SCRNLR,L
CALLA WRAMINIT ;INITIALIZE WAVE RAM
MOVE @LOOPWAVE,A0,W
JRN BLPCURR ;USE SAME WAVE
MOVE A0,@WAVE,W
MOVE @LOOPBACK,A10,L
MOVE @LOOPDISP,A7,L
MOVE *A10(0E0H),A6,L ;FIX THIS SOUND KLUDGE
JRUC BLPWWBK
BLPCURR
MOVE @WAVE,A0,W ;RELOAD CURRENT WAVE HERE
DEC A0
SLL 28,A0
SRL 23,A0
MOVE A0,A10
ADDI WAVEBGND,A10
MOVE *A10,A10,L
MOVE A0,A6
ADDI WAVMUSIC,A6
MOVE *A6,A6,L
MOVI MASTERDP,A7
BLPWWBK
CALLA GETWAVE ;SET UP WAVE DIFFICULTY PARAMS
MOVK 1,A0
MOVE A0,@PUPDATE,W
MOVE A6,A0
CALLA ONESND ;START ROOM MUSIC
MOVI BAKSTAKS,A1
MOVE A1,@BAKSTAKP,L ;INITIALIZE BACKGROUND STACK POINTER
MOVI OBJSTAKS,A1
MOVE A1,@OBJSTAKP,L ;INITIALIZE OBJECT STACK POINTER
CALLA BBINIT
CALLA INITBGND
MOVK 1,A0
MOVE A0,@DISPLAYON,W ;TURN THE DISPLAY PROC ON
*TIME TO RE-INITIALIZE PLAYER 1
MOVI P1DATA,A2
CALLR CLRPBODY
MOVI P1INITTL,A14
CALLA PLWAVEST
*TIME TO RESET PLAYER 2
MOVI P2DATA,A2
CALLR CLRPBODY
MOVI P2INITT,A14
CALLA PLWAVEST
CALLA SCORAREA ;OUTPUT THE SCORE AREA
CLR A0
MOVE A0,@PUPDATE,W
MOVI INPLAY,A0
MOVE A0,@GAMSTATE,W ;START YOUR ENGINES
MOVI MASTERID,A1 ;A7 SHOULD BE LOADED ABOVE
CALLA GETPRC ;GET THE DISPATCH PROC
CREATE BUPDPID,BBOFSCRN ;CREATE THE BACKGROUND UPDATE PROCESS
MOVK 32,A0
MOVI SCRNST,A10
MOVI SCRNEND,A11
JSRP SCREXP32 ;BLOW UP THE SCREEN AGAIN
SOUND1 ALLOFF
SOUND1 YAMOFF
MOVK 2,A0
MOVE A0,@GAMERASE,W ;TURN ON HALF SCREEN AUTOERASE
CREATE 0BACH,BSCHKG ;START THE SCROLL CHECKER
CREATE BUYCPID,BUYWAIT ;CREATE THE BUY-IN WAIT
DIE
**************************************************************************
* *
* CLRPBODY - CLEAR THE PLAYER IF HIS DEAD BODY WAS HANGING AROUND. *
* I.E. POBJ STUFFED, NO LIFE, NO OBJECT *
* A2 = PLINDX *
* *
**************************************************************************
CLRPBODY
PUSH A0
MOVE *A2(POBJ),A0,L
JRZ PBODCLRD ;NOBODY TO CLEAR
MOVE *A2(PLIVES),A0,W
JRGT PBODCLRD ;HE'S GOT LIFE
MOVE *A2(PENERGY),A0,L
JRGT PBODCLRD ;A LITTLE ENERGY LEFT
CLR A0
MOVE A0,*A2(POBJ),L ;O.K. WASTE HIM
MOVE A0,*A2(PLOBJ),L
MOVE @NPLYRS,A0,W
DEC A0 ;A MUST TO KEEP IN PACE
MOVE A0,@NPLYRS,W
CALLR PXFERCRD ;TRANSFER ANY HELD CARDS
PBODCLRD
PULL A0
RETS
**************************************************************************
* *
* BWAITCLD - START THE BUYIN WAIT PROCESS, USED AS A COLD START BY *
* THE DISPATCHERS IN LOOP BACK POINTS. *
* *
**************************************************************************
BWAITCLD
MOVI IBUYINS,A0 ;MAKE SURE BUY-IN IS ACTIVE
MOVE A0,@P1DATA+PBUYINS,W
MOVE A0,@P2DATA+PBUYINS,W
CREATE BUYCPID,BUYWAIT
RETS
**************************************************************************
* *
* BUYWAIT - WAIT AWHILE BEFORE CUTTING OFF BUYIN AGAIN *
* *
**************************************************************************
BUYWAIT
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA KILALL ;KILL THE OTHER GOONS
CLR A8
MOVI BUYTICK*BUYTIME,A9
BUYWAITLP
*** CALLA CR_CONTP ;ENOUGH TO CONTINUE
*** JRLO BUYWAITS
*** MOVE A8,A8
*** JRNZ BUYWAITS ;WE'VE ALREADY RESET THE TIMER ONCE
*** MOVI BUYTICK*BUYTIME,A9 ;RESET THE WAIT TIMER
*** MOVK 1,A8 ;AND FLAG IT
***BUYWAITS
SLEEP BUYSLP
DSJ A9,BUYWAITLP
CALLA CLRBUYIN ;CUT IF OFF AGAIN
*** CLR A0 ;CUT IT OFF AGAIN
*** MOVE A0,@P1DATA+PBUYINS,W
*** MOVE A0,@P2DATA+PBUYINS,W
DIE
BUYMUSIC
.WORD >F3FE,>01,>8041,0
BUYMOFF
.WORD >F3FE,>01,>8042,0
**************************************************************************
* *
* INIBMESS - INITIALIZE THE BUY IN MESSAGE *
* *
**************************************************************************
INIBMESS
MMTM SP,A0,A1,A2,A6,A8,A9,A10,A11
CALLA CR_CONTP ;ENOUGH TO CONTINUE?
JRLO INIBMIN ;BR = NO
MOVI PRESSMSG,A8
CLR A0
MOVE A0,@BTIMERST,W
JRUC INIBM1
INIBMIN
MOVI INSRTMSG,A8
MOVK 1,A0
MOVE A0,@BTIMERST,W
INIBM1
CALLR GWINCENT ;POSITION
MOVE A0,A2 ;KEEP
SUBI [50,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
MOVI 0F0F0H,A6
MOVI RD20FONT,A11 ;BIG OLD LETTERS
MOVK 1,A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT THE TIME
MOVI TEXTOID,A0
MOVI BMES1OID,A1
CALLA CHNGOID ;CHANGE THE OID
MOVI TOCONMSG,A8
MOVI 0F4F4H,A6
MOVE A2,A0
SUBI [22,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
JSRP STRCNRMO ;"TO"
MOVE A2,A0
ADDI [5,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
JSRP STRCNRMO ;"CONTINUE"
MOVI TEXTOID,A0
MOVI BMES2OID,A1
CALLA CHNGOID ;CHANGE THE OID
MMFM SP,A0,A1,A2,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* INIBTIME - INITIALIZE THE BUY IN TIMER *
* *
**************************************************************************
INIBTIME
MMTM SP,A0,A1,A6,A8,A9,A10,A11
CALLR CLRBTIME
MOVI BUYTIME,A8
MOVE A8,@BTIME,W ;STORE IT AWAY
CALLR HEXTOASC
CALLR GWINCENT ;POSITION
ADDI [35,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
MOVI 0F5F5H,A6
MOVI RD20FONT,A11 ;BIG OLD LETTERS
MOVK 1,A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT THE TIME
MOVI TEXTOID,A0
MOVI BTIMEOID,A1
CALLA CHNGOID ;CHANGE THE OID
MMFM SP,A0,A1,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* DECBTIME - DECREMENT THE BUY IN TIMER *
* RETURNS: *
* Z BIT SET = BUY IN TIME DONE *
* Z BIT CLR = HURRY WHILE SPECIALS LAST! *
* *
**************************************************************************
DECBTIME
MMTM SP,A0,A1,A6,A8,A9,A10,A11
CALLR CLRBTIME
MOVE @BTIME,A8,W
DEC A8
JRLT DECBTX
MOVE A8,@BTIME,W
CALLR HEXTOASC
CALLR GWINCENT ;POSITION
ADDI [35,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
MOVI 0F5F5H,A6
MOVI RD20FONT,A11 ;BIG OLD LETTERS
MOVK 1,A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT THE TIME
MOVI TEXTOID,A0
MOVI BTIMEOID,A1
CALLA CHNGOID ;CHANGE THE OID
MOVE @BTIME,A8,W ;SET STATUS
DECBTX
MMFM SP,A0,A1,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* UPBMESS1 - UPDATE THE "PRESS START" OR "INSERT COIN" MESSAGE. *
* RETURNS: *
* A11 = UPDATED SLEEP LOOP TIME FOR BUYIN THING *
* *
**************************************************************************
UPBMESS1
MMTM SP,A0,A1,A6,A8 ;MORE PUSHING TO COME
CALLA CR_CONTP ;ENOUGH TO CONTINUE?
JRLO UPBMIN ;BR = NO
*** MOVE @BTIMERST,A0,W
*** JRZ UPBPTW ;BR = DO NOT RESET TIMER, NOT A NEW COIN
*** CLR A0
*** MOVE A0,@BTIMERST,W
*** MOVI BUYTICK,A11 ;RESET BUY-IN LOOP TIMER
*** CALLR INIBTIME ;RE-INITIALIZE THE BUY-IN TIME
***UPBPTW
MOVI PRESSMSG,A8
JRUC UPBM1
UPBMIN
MOVI INSRTMSG,A8
UPBM1
MMTM SP,A9,A10,A11 ;WATCH OUT FOR THIS BOGUSNESS
CALLR GWINCENT ;POSITION
SUBI [50,0],A0
MOVE @WORLDTL,A1,L
SUB A1,A0 ;MAKE'UM SCREEN RELATIVE
MOVE A0,A9
CLR A0
MOVI 0F0F0H,A6
MOVI RD20FONT,A11 ;BIG OLD LETTERS
MOVK 1,A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT THE TIME
MOVI BMES1OID,A0
CLR A1
NOT A1
CALLA KILOBJ ;KILL OLD MESSAGE
MOVI TEXTOID,A0
MOVI BMES1OID,A1
CALLA CHNGOID ;CHANGE THE OID
MMFM SP,A0,A1,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* UPBMESS2 - UPDATE THE "TO CONTIMUE" MESSAGE, TO INSURE ALIGNMENT. *
* *
**************************************************************************
UPBMESS2
MMTM SP,A0,A1,A2,A6,A8,A9,A10,A11
MOVI RD20FONT,A11 ;BIG OLD LETTERS
MOVK 1,A10 ;ONE SPACE BETWEEN LETTERS
CALLR GWINCENT ;POSITION
MOVE A0,A2
MOVI TOCONMSG,A8
MOVI 0F4F4H,A6
SUBI [22,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
JSRP STRCNRMO ;"TO"
MOVE A2,A0
ADDI [5,0],A0 ;OFFSET FROM BOX CENTER
MOVE @WORLDTL,A1,L
SUB A1,A0
MOVE A0,A9
CLR A0
JSRP STRCNRMO ;"CONTINUE"
MOVI BMES2OID,A0
CLR A1
NOT A1
CALLA KILOBJ ;KILL OLD MESSAGE
MOVI TEXTOID,A0
MOVI BMES2OID,A1
CALLA CHNGOID ;CHANGE THE OID
MMFM SP,A0,A1,A2,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* CLRBMESS - CLEAR THE BUY-IN MESSAGE TEXT. *
* *
**************************************************************************
CLRBMESS
MMTM SP,A0,A1
MOVI BMES1OID,A0
CLR A1
NOT A1
CALLA KILOBJ
MOVI BMES2OID,A0
CALLA KILOBJ
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* CLRBTIME - CLEAR THE BUY-IN TIME TEXT. *
* *
**************************************************************************
CLRBTIME
MMTM SP,A0,A1
MOVI BTIMEOID,A0
CLR A1
NOT A1
CALLA KILOBJ
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* GWINCENT - GET THE CURRENT TEXT WINDOW CENTER POINT. *
* RETURNS: *
* A0 = CENTER PNT. *
* *
**************************************************************************
GWINCENT
MMTM SP,A1,A8
MOVI TEXTWOID,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRZ GWINCX
MOVE A0,A8
CALLA GETCPNT
MOVE A1,A0
GWINCX
MMFM SP,A1,A8
RETS
**************************************************************************
* *
* GAMEOTXT - PROCESS TO PUT "GAME OVER" UP AND KEEP IT CENTERED *
* *
**************************************************************************
GAMEOTXT
CLR A0
MOVI 0F5F5H,A6
MOVI GAMOVMSG,A8
MOVI [90+SKYTOPOF,255],A9
MOVK 2,A10
MOVI RD20FONT,A11 ;SET UP FONT
JSRP STRCNRMO ;"GAME OVER"
MOVI GOTXTOID,A0
CLR A1
NOT A1
CALLA KILOBJ ;KILL OLD MESSAGE
MOVI TEXTOID,A0
MOVI GOTXTOID,A1
CALLA CHNGOID ;CHANGE THE OID
SLOOP 1,GAMEOTXT
**************************************************************************
* *
* CHNGOID - CHANGE ALL MATCHING OID'S ON THE OBJECT LIST TO A NEW ONE. *
* A0 = OID TO CHANGE *
* A1 = NEW OID *
* *
**************************************************************************
CHNGOID
MMTM SP,A2,A3
MOVI OBJLST,A2
CHNGOLP
MOVE *A2,A2,L
JRZ CHNGOIDX ;BR = DONE WITH THE LIST
MOVE *A2(OID),A3,W
CMP A0,A3
JRNE CHNGOLP ;THIS IS NOT ONE OF THEM
MOVE A1,*A2(OID),W ;STUFF THE NEW ONE
JRUC CHNGOLP
CHNGOIDX
MMFM SP,A2,A3
RETS
**************************************************************************
* *
* DUMPWTCH - CREATE THE DUMPSTER MAN WATCH PROCESS *
* *
**************************************************************************
DUMPWTCH
CREATE INDPID,DUMPWTP
RETS
**************************************************************************
* *
* DUMPWTP - DUMPSTER MAN WATCH PROCESS, CONSTANTLY CHECKS DUMPCNT *
* WHEN IT IS 0 IT WILL CLEAR THE XSCROLLS *
* *
**************************************************************************
DUMPWTP
SLEEP 60 ;HOLD FOR A SECOND BEFORE STARTING
DUMPWLP
MOVE @DUMPCNT,A0,W
JRZ DUMPCLRX
SLOOP 4,DUMPWLP
DUMPCLRX
CLR A0
MOVE A0,@XSCROLLS,W ;LET'S CLEAR THE SCROLL STOPPER
DIE
**************************************************************************
* *
* AUDPLWAV - AUDIT THE PLAYER'S FOR THIS WAVE WHO HAVE NOT YET BEEN. *
* *
**************************************************************************
AUDPLWAV
PUSH A0
MOVE @WAVE,A0,W
AUDPLWVL
CALLR AUDPLYRS ;AUDIT ALL PLAYERS THIS WAVE
DSJS A0,AUDPLWVL ;AND ALL PREVIOUS WAVES
AUDPLWVX
PULL A0
RETS
**************************************************************************
* *
* AUDPLYRS - CLICK AN AUDIT COUNTER FOR EACH PLAYER THAT IS ACTIVE *
* AND HAS NOT YET BEEN AUDITED. *
* A0 = WAVE # TO AUDIT *
* *
**************************************************************************
AUDPLYRS
PUSH A2
MOVI P1DATA,A2
CALLR CKPAUD
MOVI P2DATA,A2
CALLR CKPAUD
PULL A2
RETS
*
*CKPAUD - CHECK PLAYER FOR AUDITABLITIY, AND CLICK IF O.K.
*A0 = WAVE # AUDIT
*A2 = PLINDX
CKPAUD
MMTM SP,A0,A1,A3,A4
CMPI AUDWLAST,A0
JRHI CKPAUDX
DEC A0
MOVE A0,A3
ADDI AUDWAVE1,A0 ;GET AUDIT # TO CLICK
MOVE *A2(POBJ),A1,L
JRZ CKPAUDX ;BR = NOT EVEN ACTIVE
MOVE *A2(PAUDIT),A1,W
BTST A3,A1
JRNE CKPAUDX ;THIS WAVE IS AUDITED
MOVK 1,A4
SLL A3,A4
OR A4,A1
MOVE A1,*A2(PAUDIT),W ;THE SCARLET WORD
CALLA AUD1
CKPAUDX
MMFM SP,A0,A1,A3,A4
RETS
**************************************************************************
* *
* FLYTOPL - SEND AN OBJECT TO THE PLAYER STATUS AREA. *
* A2 = PTR TO PLAYER DATA *
* A4 = TRAVEL TIME IN TICKS *
* A8 = PTR TO OBJECT *
* RETURNS WHEN THE OBJECT HAS MADE IT. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
FLYTOPL
PUSHP A2
CALLA PSTOP
MOVE *A2(PSCRAD),A3,L ;SET UP FOR EFFECT
MOVE A8,A0
CALLA GSCRNREL
SRL 16,A1
MOVX A1,A2
CALLA SLINEVEL ;GET THE VELOCITIES
FLYTOP1
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L ;STUFF THE VELOCITIES
MMTM A12,A1,A2
MOVE A8,A0
CALLA SCRNRELV ;MAKE THE VELOCITIES SCREEN RELATIVE
SLEEP 1
MMFM A12,A1,A2
CALLA SCRTST ;CHECK FOR OFF SCREEN
JREQ FLYTOP1
PULLP A2
RETP
**************************************************************************
* *
* BONUSCR - CONSTRUCT THE BONUS SCREEN AND INSERT IT ON THE OBJECT LIST. *
* A10 = [Y,X] POSITION OFFSET *
* *
* NOTE: DON'T CALL WITH A NULL BONUSTAB, BOYEEEE *
**************************************************************************
BONUSCR
MMTM SP,A0,A1,A2,A14
MOVI BONUSTAB,A14 ;GET THE BONUS SCREEN TABLE
BSCRNLP
CALLA GPALOBJ ;GET US AN OBJECT
JRNZ BSCRN1
CALLA GBPALOBJ ;TRY HERE, WE'LL TAKE WHAT WE CAN GET
JRNZ BSCRN1
ADDI INITSIZE+16,A14 ;NO DICE CHROME-DOME
JRUC BSCRN2
BSCRN1
CALLA STFOBJ
CALLA ADJSTWTL ;MAKE US BE, WHEREVER WE ARE!
MOVE *A14+,A1,W ;GET THE CONSTANT COLOR
MOVE A1,*A0(OCONST),W ;STUFF THE CONSTANT COLOR
MOVE *A0(OXPOS),A1,W
MOVE *A0(OYPOS),A2,W
SLL 16,A2
MOVY A2,A1
ADDXY A10,A1
MOVY A1,A2
SRL 16,A2
MOVE A2,*A0(OYPOS),W
MOVE A1,*A0(OXPOS),W
CALLA INSOBJ ;POP THAT SUCKER ON
BSCRN2
MOVE *A14,A1,W
INC A1
JRNZ BSCRNLP
MMFM SP,A0,A1,A2,A14
RETS
*
*THE BONUS SCREEN CONSTRUCTION TABLE
.INCLUDE "NARCBON.TBL" ;BONUS SCREEN SHITMAGES
BONUSTAB
.LONG 0,0,(0*10000H),(80*Y),0,BV17320,0,0
.WORD DMACAL,0,0,0,0B8B8H
.LONG 0,0,(493*10000H),(80*Y),0,BV17320,0,0
.WORD DMACAL,0,0,0,0B8B8H
.LONG 0,0,(17*10000H),(80*Y),0,BH47826,0,0
.WORD DMACAL,0,0,0,0B8B8H
.LONG 0,0,(17*10000H),(376*Y),0,BH47826,0,0
.WORD DMACAL,0,0,0,0B8B8H
.LONG 0,0,(253*10000H),(103*Y),0,BV8274,0,0
.WORD DMACAL,0,0,0,0B8B8H
.LONG 0,0,(17*10000H),(106*Y),10000H,BH2349,0,0
.WORD DMACAL,0,0,0,08585H
.LONG 0,0,(261*10000H),(106*Y),10000H,BH2349,0,0
.WORD DMACAL,0,0,0,08585H
.LONG 0,0,(17*10000H),(112*Y),0,BV7264,0,0
.WORD DMACAL,0,0,0,0C0C0H
.LONG 0,0,(245*10000H),(112*Y),0,BV5264,0,0
.WORD DMACAL,0,0,0,0C0C0H
.LONG 0,0,(261*10000H),(112*Y),0,BV5264,0,0
.WORD DMACAL,0,0,0,0C0C0H
.LONG 0,0,(486*10000H),(112*Y),0,BV7264,0,0
.WORD DMACAL,0,0,0,0C0C0H
.LONG 0,0,(24*10000H),(370*Y),0,BH2246,0,0
.WORD DMACAL,0,0,0,0CCCCH
.LONG 0,0,(266*10000H),(370*Y),0,BH2206,0,0
.WORD DMACAL,0,0,0,0CCCCH
*PLAYER ONE BORDER PARTS
.IF BLUEP1
*DRAW AS BLUE
.LONG 0,0,(88*10000H),(115*Y),0,BH15629,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(25*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(25*10000H),(366*Y),0,BH2164,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(241*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0FDFDH
.ELSE
*DRAW AS RED
.LONG 0,0,(88*10000H),(115*Y),0,BH15629,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(25*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(25*10000H),(366*Y),0,BH2164,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(241*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0F9F9H
.ENDIF
*PLAYER 2 BONUS BORDER PARTS
.IF BLUEP1
*DRAW AS RED
.LONG 0,0,(269*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(482*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(270*10000H),(115*Y),0,BH15629,0,0
.WORD DMACAL,0,0,0,0F9F9H
.LONG 0,0,(269*10000H),(366*Y),0,BH2164,0,0
.WORD DMACAL,0,0,0,0F9F9H
.ELSE
*DRAW AS BLUE
.LONG 0,0,(269*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(482*10000H),(112*Y),0,BV4258,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(270*10000H),(115*Y),0,BH15629,0,0
.WORD DMACAL,0,0,0,0FDFDH
.LONG 0,0,(269*10000H),(366*Y),0,BH2164,0,0
.WORD DMACAL,0,0,0,0FDFDH
.ENDIF
*BONUS SCREEN IMAGES
.LONG 0,0,(43*10000H),(83*Y),20000H,EVIDENCE,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(154*10000H),(83*Y),20000H,BONUS,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(288*10000H),(83*Y),20000H,EVIDENCE,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(404*10000H),(83*Y),20000H,BONUS,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(0*10000H),(106*Y),20000H,BADGE7a,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(19*10000H),(128*Y),30000H,MAXB,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(55*10000H),(145*Y),30000H,B357,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(397*10000H),(106*Y),20000H,BADGE7a,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(428*10000H),(127*Y),30000H,HITB,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(452*10000H),(145*Y),30000H,B999,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(17*10000H),(360*Y),20000H,BONANG1,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(261*10000H),(360*Y),20000H,BONANG1,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(493*10000H),(360*Y),20000H,BONANG1,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(251*10000H),(360*Y),20000H,BONANG1,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(237*10000H),(106*Y),20000H,BONANG3,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(276*10000H),(106*Y),20000H,BONANG3,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(1*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(16*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(248*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(263*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(491*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(506*10000H),(85*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(1*10000H),(235*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(16*10000H),(235*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(494*10000H),(235*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(509*10000H),(235*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(1*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(16*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(124*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(139*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(249*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(264*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(376*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(391*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.LONG 0,0,(494*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ,0,0,0,0
.LONG 0,0,(509*10000H),(382*Y),20000H,BONBOLT,0,0
.WORD DMAWNZ|M_FLIPH,0,0,0,0
.WORD 0FFFFH ;END IT ALL
*
*KLUDGED BONUS SCREEN IMAGE HEADERS
BV17320
.WORD 17,320,0,0
.LONG 02000000H,NARCS
BH47826
.WORD 478,26,0,0
.LONG 02000000H,NARCS
BV8274
.WORD 8,274,0,0
.LONG 02000000H,NARCS
BH15629
.WORD 156,29,0,0
.LONG 02000000H,NARCS
BH2349
.WORD 234,9,0,0
.LONG 02000000H,NARCS
BH2246
.WORD 224,6,0,0
.LONG 02000000H,NARCS
BH2206
.WORD 220,6,0,0
.LONG 02000000H,NARCS
BV7264
.WORD 7,264,0,0
.LONG 02000000H,NARCS
BV5264
.WORD 5,264,0,0
.LONG 02000000H,NARCS
BV4258
.WORD 4,258,0,0
.LONG 02000000H,NARCS
BH2164 .WORD 216,4,0,0
.LONG 02000000H,NARCS
*
*PLAYER TRANSPORT PLACEHOLDER INIT. ROUTINES
P1TINIT
.LONG 0,0,256*10000H,200*Y ;PLAYER 1 HELD AS PASSENGER
.WORD 0,0
.LONG jtpassen1,PZSIZ,DUMCOLL
.WORD DMAWNZ,P1PLACE
.LONG 0
P2TINIT
.LONG 0,0,256*10000H,200*Y ;PLAYER 2 HELD AS DRIVER
.WORD 0,0
.LONG ytdrive1,PZSIZ,DUMCOLL
.WORD DMAWNZ,P2PLACE
.LONG 0
*
*FLAIL ABOUT WHILE IN THE AIR
PFLAIL
.LONG flail1
.WORD 7
.LONG flail2
.WORD 7
.LONG flail3
.WORD 7
.LONG flail4
.WORD 7
.LONG 0
*
*SOME MESSAGES
INSRTMSG
.STRING "INSERT COIN"
.BYTE 0
PRESSMSG
.STRING "PRESS START"
.BYTE 0
TOCONMSG
.STRING "TO"
.BYTE 0
.STRING "CONTINUE"
.BYTE 0
.EVEN
.END