.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