total-carnage/ATTRACT.ASM

2698 lines
52 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.

****************************************************************
*
* Software: ?
* Initiated: ?
*
* Modified: Shawn Liptak 8/6/91 - Hiscore display and entry
* Shawn Liptak 11/9/91 - Title screen
*
* COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/7/92 13:50
****************************************************************
.FILE 'ATTRACT.ASM'
.TITLE "ATTRACT MODE"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\GSP.INC"
.INCLUDE "MAC2.ASM" ;MACRO 2 DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "BGNDTBL.GLO" ;BACKGROUND EQUATES
.INCLUDE "GAME.EQU"
.include "audit.equ"
.include "shawn.hdr" ;Macros
.include "title.tbl"
;SOUNDS
.REF TOTCARN,BEEP1,BEEP2,CNTDOWN,RESTUFF_AUTOERASE
.REF PLYRONE,PLYRTWO,MUSICOFF
.ref WRPSND
;yousuck .word >f9a0,10,>80c5,0 ;You suck at this game!
;logosnd .word >f420,1,>804f,0 ;Logo spins
logosnd .word >f420,1,>8047,0 ;Logo spins
;exp1snd .word >fc80,10,>803e,0 ;Explosion
exp1snd .word >fc80,10,>803f,0 ;Explosion
;ttlgun .word >fca0,4,>8030,0 ;Title guy shoots gun
ttlgun .word >fca0,4,>8031,0 ;Title guy shoots gun
; SYMBOLS DEFINED IN THIS FILE
.DEF SYSINITL,WIPEOUT,STATUS,ATSTRT,P1START,P2START,ENTERON
.DEF NO_START,THIS_PLYR,RUNIN,ATSTRT2
.def hisclong
; SYMBOLS DEFINED EXTERNALLY
.ref timerp1,timerp1sd,timerp2,timerp2sd,TNT_TYPE,DELAYALL
.ref TAUNTOUT,TWAS1,KP_TAUNT,PLYRPRCS,FRANIMQ,AFTR_WRP
.ref GAMERASE,GAMSTATE,P1DATA,P2DATA,COLRPRC,HALT,CLRBPAL,KILBGND
.ref BAKMODS,BGND_UD1,BLAKOUT,KILL_CRD,CLR_SCRN,MAPOUT,MAPDN
.ref CR_CONTP,P_CONT,CR_STRTP,P_START,SOUNDSUP,WSPEED,WFLG,BOX_OUT
.ref WNDWON,CRD_SCRN,IRQSKYE,CLRPAL,PLYROBJS,AUTOEON,KPARWP,WORDS
.ref GETFPAL,AUTOEOFF,DMAQWAIT,CLRSWPRC,MYOINIT,AUD1,INFO_BOX
.ref CLRWORLD,SYNCFULL,SYSCOPY,GET_ADJ,CYCLE_TABLE,INIT_GAME
.ref P1CTRL,P2CTRL,GET_OUT,SCORETYP,BCDADD,SCORETYP,TBOMB
.ref DRAW_PLYR_TORSO,CNTDIG1,CNTDIG2,KILLP1,KILLP2,SCRIPTPLAY
.ref WARPOUT,INEXP,CYCLIFE,SHK_ON,INAWARP
.ref HISCBMOD,COLTAB,GETHIGH,PALSET,FPALRAM
.ref SYNCHALF,NOSHOOT
.ref FADE_DOWN,FADE_UP,FADEIN,FADEOUT,FB_FADEIN
.ref anim_script,anim_killall
.ref RNDRNGS
.ref WAVE
.ref WATR1,WATR2,WATR3
;RAM AREA FOR THIS FILE
.BSS RUNIN,16
.BSS STATUS,16 ;PLAYERS 0,1,2,3
.BSS ENTERON,16 ;INITIALS BEING ENTERD FLAG
.BSS NO_START,16 ;FLAG 0=OKAY, 1=NOT RIGHT NOW.
.BSS THIS_PLYR,16 ;FLAG = 1/2 FOR PLYR WHO BOUGHT IN
.bss palram ,11*15*16 ;Palette mem
.bss hisclong,16 ;!0=Show hiscore table longer
.BSS SEC_FLAG,16
OWSPD .SET 21 ;31 ;OPEN WINDOW SPEED (HIGHER THE SLOWER)
.TEXT
**************************************************************************
* *
* WIPEOUT - WIPES THE SYSTEM CLEAR OF ALL OTHER PROCESSES, OBJECTS *
* AND COORDINATES. IT RETURNS WITH AUTO-ERASE SHUT OFF, *
* DISPLAY PROCESSOR DISABLED
* COLOR RAM CLEARED, AND THE BIT MAP WIPED CLEAN. *
* THIS IS NICE TO USE WHEN SWITCHING BETWEEN STUFF. *
**************************************************************************
WIPEOUT
MMTM SP,A0,A1
CLR A0
; MOVE A0,@SCORE_FLAG,W ;INSURE SCORE DMA IS NOT PERFORMED
MOVE A0,@WFLG
MOVE A0,@P1CTRL
MOVE A0,@P2CTRL ;CLEAR PLAYER CPU CONTROLS
MOVE A0,@P1DATA+POBJ,L
MOVE A0,@P2DATA+POBJ,L
movi PLYRPRCS,a1
move a0,*a1+,L ;These must be cleared!
move a0,*a1+,L
movi PLYROBJS,a1
move a0,*a1+,L
move a0,*a1+,L
move a0,@TAUNTOUT
move a0,@INEXP
move a0,@NOSHOOT
move a0,@SHK_ON
move a0,@INAWARP
move a0,@CYCLIFE
move a0,@AFTR_WRP
move a0,@WARPOUT
MOVI PLIST_ID,A1
CLR A0
CALLA KILALL ;KILL ALL PROCS, EXCEPT FOR COINS
CALLA KILBGND ;WIPEOUT BACKGROUND BLOCKS
CLR A0
MOVE A0,@SOUNDSUP,W ;MAKE SURE SOUNDS ARE ALLOWED
MOVE A0,@GAMERASE,W
MOVE A0,@IRQSKYE,W
CALLA AUTOEOFF
; CLR A0
; MOVE A0,@DISPLAYON,W ;TURN THE DISPLAY PROCESSOR OFF
CALLA DMAQWAIT
PUSHST
DINT
CALLA CLRSWPRC
CALLA MYOINIT ;RE-INIT THE OBJECT LIST
CALLA CLRWORLD ;RESET THE WORLD
CALLA SYSINITL
CALLA CLR_SCRN
POPST
CALLA SYNCFULL ;NOW WAIT FOR VBLANK TO ZAP COLOR MAP
MOVI -4,A0
MOVE A0,@DPYSTRT ;RESET DISPLAY START POINT
MOVI OWSPD,A0
MOVE A0,@WSPEED
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* SYSINITL - INITIALIZE LOW BYTE OF SYSTEM CONTROL REGISTER *
* *
**************************************************************************
SYSINITL
MMTM SP,A0,A1
MOVE @SYSCOPY,A0,W
MOVI SYSCINIT,A1
SLL 24,A1
SRL 24,A1
OR A1,A0
MOVE A0,@SYSCOPY,W ;RE-INITIALIZE SYSTEM CONTROL REG
MOVE A0,@SYSCTRL,W
MMFM SP,A0,A1
RETS
;ATTRACT MODE START UP ROUTINE
ATSTRT2
MOVK 1,A0
MOVE A0,@GAMERASE
MOVE @GAMSTATE,A0
CMPI INDIAG,A0
JREQ ATSTRTX
MOVI INAMODE,A0
MOVE A0,@GAMSTATE,W
CALLA COLRPRC
CREATE AMDEPID,AMODE ;CREATE THE ATTRACT MODE
ATS3
CLR A0
MOVE A0,@HALT
MOVE A0,@ENTERON
.REF START
MOVE A0,@START
ATSTRTX
RETS
ATSTRT
MOVK 1,A0
MOVE A0,@GAMERASE
MOVE @GAMSTATE,A0
CMPI INDIAG,A0
JREQ ATSTRTX
MOVI INAMODE,A0
MOVE A0,@GAMSTATE,W
CALLA COLRPRC
CREATE AMDEPID,amode2 ;CREATE THE ATTRACT MODE
JRUC ATS3
; CYCLE BETWEEN MODES
AMODE
JSRP HSTDTABQ ;Show high scores with quick blindin
amode2
JSRP DO_CRD_SCRN ;DISPLAY INSERT COIN SCREEN
JSRP titlescreen
CALLA CLRBPAL
JSRP ATTPLAY2 ;DO ROAD ATTRACT MODE PLAY
JSRP DO_CRD_SCRN ;DISPLAY INSERT COIN SCREEN
CALLA CLRBPAL
JSRP HSTDTAB ;Show high scores
JSRP SHOWDOME ;SHOW PLEASURE DOME ENTRANCE!
JSRP ATTPLAY ;DO ORCUS ATTRACT MODE PLAY
JSRP DO_CRD_SCRN ;CREDIT INFO SCREEN
CALLA CLRBPAL
JSRP titlescreen
CALLA CLRBPAL
JSRP ATTPLAY3 ;DO REPORTER ATTRACT MODE
; JSRP SNK_PRVW
JSRP DO_CRD_SCRN ;CREDIT INFO SCREEN
CALLA CLRBPAL
JSRP HSTDTAB ;Show high scores
MOVI AMDEPID,A0
MOVE A0,*A13(PROCID)
jruc amode2
SHOWDOME
JSRP WNDWON
CALLA KILBGND ;KILL OLD BACKGROUND IF ANY EXISTED
CALLA CLNPAL
MOVI CLSNEUT|TYPTEXT|SUBWNDW,A0
CLR A1
NOT A1
CALLA KILOBJ
CLR A0
MOVE A0,@WFLG
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
MOVI 0D4H,a0
move a0,@WORLDTLX+16
movi 694H,a0
move a0,@WORLDTLY+16
SLEEPK 2
MOVI DMOD,A0
MOVE A0,@BAKMODS,L
CLR A1
MOVE A1,@DISPLAYON
CALLA BGND_UD1
MOVI PALCNO,A0
MOVK 2,A1
CALLA FADEIN
CLR A0
CALLA FB_FADEIN
SLEEPK 2
MOVK 1,A1
MOVE A1,@DISPLAYON
;START FOUNTAINS
.REF WATR1,WATR2,WATR3
SLEEP 30
********************************
* Start the pleasure dome fountain anims
movi fount_t,a8
fsalp CREATE0 fountain_ani
addi 80,a8
move *a8,a0,L
jrnz fsalp
SLEEP 5*60
JSRP WNDWON
CALLA KILBGND ;KILL OLD BACKGROUND IF ANY EXISTED
CALLA CLNPAL
MOVI CLSNEUT|TYPTEXT|SUBWNDW,A0
CLR A1
NOT A1
CALLA KILOBJ
CLR A0
MOVE A0,@WFLG
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
RETP
fount_t LWWW watr_l,66H,0B8H,DMAWNZ|M_NOCOLL
LWWW watr_l,127H,0B8H,DMAWNZ|M_NOCOLL|M_FLIPH
.long 0
watr_l LW WATR1,5
LW WATR2,5
LWL0 WATR3,5
SUBRP fountain_ani
move *a8+,a9,L
move *a8+,a0 ;X
move *a8+,a1 ;Y
sll 16,a0
sll 16,a1
move *a9,a2,L
movi 170,a3 ;Z
move *a8+,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ
move a9,a11
falp JSRP FRANIMQ
move a11,a9
jruc falp
PALCNO .LONG 5*32*32+5*32+5,0
DMOD
.long DOMEBMOD
.word 200,200
.long -1
;
; ATTPLAY - ATTRACT MODE GAME PLAY
; NOTE: CALL WITH JSRP
;
.BSS AWAVE,16
ATTPLAY3:
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
CREATE0 AMODWAVE3 ;START WAVE #1-3
SLEEP 18*60
JRUC ATTFIX
ATTPLAY2:
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
CREATE0 AMODWAVE2 ;START WAVE #1-3
SLEEP 30
MOVI P1DATA,A11 ;MARK PLAYER 1 FOR DEMO
MOVI AWAV2MOV,A9
JRUC ATTNEXT
ATTPLAY:
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
MOVE @AWAVE,A0,W
INC A0
CMPI 3,A0
JRLS ATTWGO
CLR A0
ATTWGO:
MOVE A0,@AWAVE,W
SLL 4,A0
ADDI WV_TBL,A0
MOVE *A0,A0 ;GET REAL GAME WAVE #
MOVE A0,@WAVE,W
CALLA CLNPAL
.REF AMODWAVE2,AMODWAVE,CLNPAL,FADE_STRT,AMODWAVE3
DROPBMB .EQU 01000H
CREATE0 AMODWAVE ;START WAVE #1-3
MOVI P1DATA,A11 ;MARK PLAYER 1 FOR DEMO
MOVI AWAV1MOV,A9
ATTNEXT:
MOVE *A9+,A0,W ;GET SOME JOYSTICK BITS
CMPI DROPBMB,A0
JRNZ ATTNB
;DROP A BMB
MOVE @P1DATA+BMB_CNT,A0
INC A0
MOVE A0,@P1DATA+BMB_CNT
PUSH A9
MOVK 1,A9
CREATE BMBPID,TBOMB
PULL A9
JRUC ATTNB1
ATTNB
CMPI -1,A0
JREQ ATTWXXX
MOVE A0,@P1CTRL,W
ATTNB1 MOVE *A9+,A10,W
JSRP ATTSLP ;PROCESS SLEEP TIME
JRUC ATTNEXT
WV_TBL .WORD 1,2,3,4
ATTWXXX:
CALLA INIT_SCORE
ATTFIX
CLR A1
NOT A1
MOVI CHNKPID,A0
CALLA KILALL
.REF INIT_SCORE,SCORE_FLAG
SLEEPK 2
CLR A0
MOVE A0,@SCORE_FLAG
JSRP WNDWON
MOVI ICONPID,A0
CLR A1
NOT A1
CALLA KILALL
SLEEP 2
CLR A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
CALLA WIPEOUT
CALLA RESTUFF_AUTOERASE
RETP
;
; ATTSLP - PROCESS ATTRACT MODE PLAYER SLEEP
; A10 = # TICKS TO SLEEP
; RETURNS:
; CARRY CLEAR = SLEEP COMPLETED
; CARRY SET = STILL SNOZZIN'
;
; NOTE: CALL WITH JSRP
;
ATTSLP:
PUSHP A10
ATTSLPL:
SLEEP 1
SETC
DSJS A10,ATTSLPL ;PROCESS SLEEP LOOP
CLRC
PULLP A10
RETP
AWAV1MOV:
;PLACE SCRIPT FOR WAVE ORCUS
.WORD 0,60*5
.WORD PUP|PLEFT,35H
.WORD PRYTE,35H
.WORD DROPBMB,1H
.WORD PFUP|PDOWN,40H
.WORD PFUP,20H
.WORD DROPBMB,1H
.WORD 0,5H
.WORD PFLEFT|PFUP,20H
.WORD DROPBMB,1H
.WORD PLEFT,20H
.WORD PFRYTE|PFUP|PUP,50H
.WORD DROPBMB,1H
.WORD DROPBMB,11H
.WORD PFUP|PFRYTE|PDOWN,20H
.WORD DROPBMB,1H
.WORD PFRYTE|PUP,20H
.WORD PFUP|PFRYTE|PDOWN,40H
.WORD PUP,26H
.WORD DROPBMB,1H
.WORD 0,20H
.WORD PFLEFT|PRYTE,25H
.WORD PUP,10H
.WORD PRYTE|PFDOWN,55H
.WORD DROPBMB,1H
.WORD PFUP|PDOWN,20H
.WORD PFRYTE|PLEFT,20H
.WORD PFRYTE|PUP,20H
.WORD DROPBMB,1H
.WORD PFRYTE|PDOWN,30H
.WORD PFRYTE|PFUP,20H
.WORD PLEFT,20H
.WORD DROPBMB,1H
.WORD PFDOWN|PFLEFT|PRYTE,15H
.WORD DROPBMB,1H
.WORD PUP,26H
.WORD PRYTE|PFDOWN,22H
.WORD PFUP|PDOWN,20H
.WORD PFRYTE|PFUP|PLEFT,30H
.WORD DROPBMB,11H
.WORD DROPBMB,1H
.WORD PFRYTE|PUP,20H
.WORD PFRYTE|PFUP|PDOWN,35H
.WORD DROPBMB,1H
.WORD PFLEFT|PFUP|PUP,20H
.WORD DROPBMB,1H
.WORD PFLEFT|PFUP|PDOWN,35H
.WORD PFRYTE|PDOWN,30H
.WORD PFRYTE,20H
.WORD DROPBMB,11H
.WORD DROPBMB,1H
.WORD PRYTE|PUP|PFDOWN,30H
.WORD PLEFT,20H
.WORD DROPBMB,1H
.WORD PFDOWN|PRYTE,15H
.WORD PUP,26H
.WORD PRYTE|PFDOWN,22H
.WORD PFUP|PDOWN,20H
.WORD PFRYTE|PLEFT,30H
.WORD PFLEFT|PFUP|PUP,20H
.WORD DROPBMB,1H
.WORD PFRYTE|PDOWN,35H
.WORD PFLEFT|PUP,20H
.WORD PFLEFT|PFUP|PDOWN,35H
.WORD 0FFFFH
AWAV2MOV:
;PLACE SCRIPT FOR ROAD
.WORD 0,60*2
.WORD PUP|PRYTE|PFRYTE,50H
.WORD PRYTE|PFRYTE,55H
.WORD PFUP|PDOWN,40H
.WORD PFRYTE,20H
.WORD DROPBMB,1H
.WORD 0,5H
.WORD PFRYTE,20H
.WORD DROPBMB,1H
.WORD PFRYTE|PUP,50H
.WORD DROPBMB,1H
.WORD PFUP|PFRYTE|PDOWN,20H
.WORD PFRYTE|PUP|PRYTE,20H
.WORD PFUP|PFRYTE|PDOWN,40H
.WORD PUP,26H
.WORD 0,20H
.WORD PFRYTE|PRYTE,35H
.WORD DROPBMB,1H
.WORD PUP,10H
.WORD PRYTE|PFDOWN,45H
.WORD PFUP|PDOWN,20H
.WORD PFRYTE|PUP,20H
.WORD DROPBMB,1H
.WORD DROPBMB,11H
.WORD PFRYTE|PDOWN,30H
.WORD PFRYTE|PFUP,20H
.WORD DROPBMB,1H
.WORD PLEFT,20H
.WORD PFDOWN|PFLEFT|PRYTE,15H
.WORD PUP,26H
.WORD DROPBMB,1H
.WORD PRYTE|PFDOWN,22H
.WORD PFUP|PDOWN,20H
.WORD PFRYTE|PLEFT,30H
.WORD PFRYTE|PUP|PRYTE,20H
.WORD PFRYTE|PDOWN|PRYTE,35H
.WORD DROPBMB,1H
.WORD PFLEFT|PFUP|PUP|PRYTE,20H
.WORD PFLEFT|PFUP|PDOWN|PRYTE,35H
.WORD DROPBMB,1H
.WORD PFRYTE|PDOWN,30H
.WORD PFRYTE,20H
.WORD PRYTE|PUP|PFDOWN,30H
.WORD PFDOWN|PRYTE,15H
.WORD PUP,26H
.WORD PRYTE|PFDOWN,22H
.WORD DROPBMB,11H
.WORD PFUP|PDOWN,20H
.WORD PFLEFT|PFUP|PUP,20H
.WORD PFRYTE|PDOWN,35H
.WORD DROPBMB,1H
.WORD PFLEFT|PUP,20H
.WORD PFLEFT|PFUP|PDOWN,35H
.WORD 0FFFFH
;DISSND .WORD >F3EE,>18,>80B0,0 ;KEY MELODY TYPE SND
;
; .REF CYCSPECT
;SNK_PRVW
; CREATE COLRPID,CYCSPECT ;START COLOR CYCLE PROCESS
; calla KILBGND ;Kill old background if any existed
;
; ADJUST ADJMUSIC ;GET MUSIC ON OFF FOR DEMO
; MOVE A0,A0
; JRNZ NONO
; CLR A0
; MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
; movi DISSND,a0 ;DO DISARM SOUND IF NOT BLOWING
; calla ONESND
; MOVK 1,A0
; MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
;NONO
; MOVI RD15FONT,A11 ;FONT TABLE
; CLR A0
; MOVE A0,@WRLD
; MOVK 2,A10 ;Y,X SPACING BETWEEN CHARCTERS
; CLR A0
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [25-5,0200],A9 ;SCRN Y/X
; MOVI LINE1,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [45-5,0200],A9 ;SCRN Y/X
; MOVI LINE2,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [70-5,0200],A9 ;SCRN Y/X
; MOVI LINE3,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [90-5,0200],A9 ;SCRN Y/X
; MOVI LINE4,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [110-5,0200],A9 ;SCRN Y/X
; MOVI LINE5,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [130-5,0200],A9 ;SCRN Y/X
; MOVI LINE6,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [150-5,0200],A9 ;SCRN Y/X
; MOVI LINE7,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [170-5,0200],A9 ;SCRN Y/X
; MOVI LINE8,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [190-5,0200],A9 ;SCRN Y/X
; MOVI LINE9,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [210-5,0200],A9 ;SCRN Y/X
; MOVI LINE10,A8
; JSRP STRCNRMO
;
; MOVI 3E3EH,A6 ;COLOR CYCLE DIGITS
; MOVI [235-5,0200],A9 ;SCRN Y/X
; MOVI LINE11,A8
; JSRP STRCNRMO
;
; SLEEP 12*60
;
; MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
; CLR A1
; NOT A1
; CALLA KILOBJ
; RETP
;
;LINE1 .BYTE "GAME PLAYERS:",0
;LINE2 .BYTE "THIS IS A TEST GAME!",0
;LINE3 .BYTE "TOTAL CARNAGE IS HERE!",0
;
;LINE4 .BYTE "GET A SNEAK PEEK AND BE",0
;LINE5 .BYTE "THE FIRST TO PLAY!",0
;LINE6 .BYTE "THE CARNAGE CAN ONLY BE",0
;LINE7 .BYTE "FOUND HERE IN CHICAGO.",0
;LINE8 .BYTE "PLAYING WITH A PARTNER",0
;LINE9 .BYTE "WILL HELP YOU SURVIVE",0
;LINE10 .BYTE "THE CARNAGE! GOOD LUCK!",0
;LINE11 .BYTE "YOU'LL NEED IT!",0
; .EVEN
TOTCARN2 .WORD >F9F0,120,>80F0,0 ;"TOTAL CARNAGE"
********************************
* Title page
SUBRP titlescreen
calla KILBGND ;Kill old background if any existed
movi title_as,a8
CREATE ANIMPID,anim_script ;P1
; SLEEP 30 ;DEBUG
SLEEP 1020
calla anim_killall
RETP
title_as
; ASSNDD yousuck
ASLAB 49
ASNEW titlemdnew_t ;>Midway logo
ASDSJ
ASASM
move @OBJLST,a0,L ;>Set up logo lines
move *a0(OSAG),a2,L
move *a0(OYPOS),a3
t40 movk 1,a1
move a1,*a0(OSIZEY)
move a2,*a0(OSAG),L
move a3,*a0(OYPOS)
addi 200*8,a2
addk 1,a3
btst 0,a3
jrz t50
move *a0(OXPOS),a1 ;Move to rgt
addi 400+200,a1
move a1,*a0(OXPOS)
move *a0(OID),a1
addk 1,a1
move a1,*a0(OID)
t50 move *a0,a0,L
jrnz t40
ASENDASM
ASLAB 75 ;>Slide in logo
ASXY 8,0,4,0
ASXY 9,0,-4,0
ASDSJS1
ASTXT tpresents_st
ASSLP 50
ASASM
CALLA logo_setflpv
SLEEP 96
CALLA logo_negyv
SLEEP 48
CALLA logo_negyv
SLEEPK 24
CALLA logo_negyv
SLEEPK 12
CALLA logo_negyv
SLEEPK 6
CALLA logo_setxv
; ASENDASM
; ASSNDD exp1snd
ADJUST ADJMUSIC ;GET MUSIC ON OFF FOR DEMO
MOVE A0,A0
JRNZ NONO1
CLR A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
movi exp1snd,a0
calla ONESND
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
NONO1
ASENDASM
ASTXTK
ASSLP 20
ASASM
ADJUST ADJMUSIC ;GET MUSIC ON OFF FOR DEMO
MOVE A0,A0
JRNZ NONO2
CLR A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
movi TOTCARN2,a0
calla ONESND
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
NONO2
ASENDASM
; ASSNDD TOTCARN
ASNEW titlenew_t
ASHIDE >54
ASLAB 67
ASXY >10,0,-6,0
ASXY >40,>1f,6,0
ASDSJS1
ASDELM 8,1
ASRUN ttlshoot_as
ASLAB 136
ASXY >40,>1f,3,0
ASDSJS1
ASSLP 60*7
ASLAB 43
ASXY >10,0,0,6
ASXY >40,>f,0,8
ASXY >50,>f,0,7
ASDSJS1
ASEND
titlemdnew_t
ASITEMN -199,100,MIDWAY,50,DMAWNZ,8
.word -1000
TX .set -808
TY .set 0+1
TGY .set 50 ;93
titlenew_t
ASITEMN 418,6+1,TITPC1,50,DMAWNZ,>10
ASITEMN 630,6+1,TITPC2,50,DMAWNZ,>10
ASITEMN TX,TY,BLOCKSIZE,30,DMAWNZ,>40
ASITEMN TX+200,TY,BLOCKSIZE,30,DMAWNZ,>40
ASITEMN TX+400,TY,BLOCKSIZE,30,DMAWNZ,>40
ASITEMN TX+600,TY,BLOCKSIZE,30,DMAWNZ,>40
ASITEMN TX,TY+255,BLOCKSIZE,30,DMAWNZ+M_FLIPV,>40
ASITEMN TX+200,TY+255,BLOCKSIZE,30,DMAWNZ+M_FLIPV,>40
ASITEMN TX+400,TY+255,BLOCKSIZE,30,DMAWNZ+M_FLIPV,>40
ASITEMN TX+600,TY+255,BLOCKSIZE,30,DMAWNZ+M_FLIPV,>40
ASITEMN TX+54,TY+238,COPYR,100,DMAWNZ,>40
ASITEMN TX+68,TY+TGY,TTLHED1,70,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC1,70,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC2,70,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC3,40,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC4,40,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC5,40,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC6,40,DMAWNZ,>50
ASITEMN TX+68,TY+TGY,TTLPC7,40,DMAWNZ,>50
ASITEMN TX+67,TY+TGY,TTLPC8,40,DMAWNZ,>50
ASITEMN TX+66,TY+TGY,TTLPC9,40,DMAWNZ,>50
ASITEMN TX+67,TY+TGY,TTLPC10,40,DMAWNZ,>50
ASITEMN TX+68+330,TY+TGY+105,TTLBLAST,44,DMAWNZ,>54
ASITEMN TX+68+330,TY+TGY+104,TTLBLAST,44,DMAWNZ+M_FLIPV,>54
.word -1000
tpresents_st
XYTXT 0,200,160,37,"PRESENTS"
.word -1
ttlshoot_as
; ASSLP 40
; ASLAB 5
; ASLAB 8 ;>Pop up
; ASXY >50,>f,1,-5
; ASDSJS1
; ASXY >50,>f,1,-3
; ASSLP1
ASLAB 12*4 ;>Fire
ASXY >50,>f,-2,0
ASSVL FLASH
ASPAL >50
ASPAL >54
ASSHOW >54
ASSLP1
ASASM
ADJUST ADJMUSIC ;GET MUSIC ON OFF FOR DEMO
MOVE A0,A0
JRNZ NONO3
CLR A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
movi ttlgun,a0
calla ONESND
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
NONO3
ASENDASM
; ASSNDD ttlgun
ASXY >50,>f,-2,0
ASSVL BLASTP
ASPAL >54
ASSLP1
ASXY >50,>f,2,0
ASSVL FLASH
ASPAL >54
ASSLP1
ASXY >50,>f,2,0
ASHIDE >54
ASSVL TTLCOLR
ASPAL >50
ASDSJS1
; ASLAB 8 ;>Duck
; ASXY >50,>f,-1,5
; ASDSJS1
; ASXY >50,>f,-1,2
; ASSLP1
; ASXY >50,>f,0,1
; ASSLP1
; ASSLPR 60,90
; ASDSJ
ASEND
SUBRP logo_setflpv
move @OBJLST,a2,L ;>Flip logo lines
movi >8000,a3
lsfvlp movb *a2(OID),a0
subk 1,a0
jreq lsfv50 ;Txt?
move a3,*a2(OYVEL),L
subi >555,a3
lsfv50 move *a2,a2,L
jrnz lsfvlp
rets
SUBRP logo_negyv
; ASENDASM
; ASSNDD logosnd
; ASASM
ADJUST ADJMUSIC ;GET MUSIC ON OFF FOR DEMO
MOVE A0,A0
JRNZ NONO4
CLR A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS ON
movi logosnd,a0
calla ONESND
MOVK 1,A0
MOVE A0,@SOUNDSUP,W ;TURN ALL SOUNDS OFF
NONO4
move @OBJLST,a2,L ;>Flip logo lines
lnyvlp movb *a2(OID),a0
subk 1,a0
jreq lnyv50 ;Txt?
move *a2(OYVEL),a0,L
neg a0
sll 1,a0 ;*2
move a0,*a2(OYVEL),L
lnyv50 move *a2,a2,L
jrnz lnyvlp
rets
SUBRP logo_setxv
move @OBJLST,a2,L ;>Flip logo lines
lsxvlp movk 7,a0
sll 16,a0
move *a2(OID),a1
btst 0,a1
jrz lsxv50
neg a0
lsxv50 move a0,*a2(OXVEL),L
move *a2,a2,L
jrnz lsxvlp
rets
********************************
DO_CRD_SCRN
JSRP CRD_SCRN ;SHOW CREDITS SCREEN SUPERIMPOSED
; SLEEP 1*60
SLEEP 6*60
CALLA KILL_CRD
CALLA CLR_SCRN
RETP
**************************************************************************
* *
* PxSTART - PLAYER START SWITCH PROCESSES *
* *
**************************************************************************
*PLAYER 1 START
P1START:
MOVE @TAUNTOUT,A1
JRZ P1TAG0
IN2
;CHECK TO SEE IF TAUNT IN RACKUP
MOVE @TNT_TYPE,A0
JANZ SUCIDE
MOVE @KP_TAUNT,A0,L
CMPI 1,A1
JRNZ TNT1
MOVI TWAS1,A7
CLR A1
CALLA XFERPROC
DIE
TNT1 MOVK 3,A0 ;GET OUT OF TAUNT!
MOVE A0,@TAUNTOUT
DIE
P1TAG0 MOVE @INFO_BOX,A0,L
JRZ P1TAG
P2IN2
;INFO BOX IS OUT, TAKE IT OFF, IGNORE THIS START!
MOVI BOX_OUT,A7
CLR A1
CALLA XFERPROC
DIE
P1TAG
MOVE @WFLG,A0 ;WINDOW GROW FLAG
JANZ SUCIDE
MOVE @ENTERON,A0 ;NEVER START WHEN INITIALS BEING
JANZ SUCIDE ;ENTERED
MOVE @MAPOUT,A0,L
JRZ P1OK
P2IN
;MAP IS OUT, TAKE IT OFF, IGNORE THIS START!
MOVI MAPDN,A7
CALLA GETA8
CALLA GETA9
CALLA GETA10
CLR A1
CALLA XFERPROC
CLR A0
MOVE A0,@MAPOUT,L
JAUC SUCIDE
P1OK MOVE @STATUS,A0 ;1/2 OR 3 FOR WHO IS PLAYING NOW
BTST 0,A0 ;TEST IF 0 BIT IS SET (1)
JRZ P1A
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRZ INTRO_EXIT
MOVE @WARPOUT,A0
JRZ ABM
CMPI 1,A0
JANZ SUCIDE
WRPIN MOVE @KPARWP,A0,L
MOVE *A0(PDATA),A10 ;INDEX 0-5
;CHECK FOR RIGHT SIDE OF SCREEN
;SCRN EDGE OK
CMPI 4,A10
JRZ DONE
INC A10
MOVE A10,*A0(PDATA)
MOVI BEEP1,A0
CALLA ONESND
JAUC SUCIDE
ABM
;PLACE TIME BOMB HERE
MOVE @PLYRPRCS,A0,L
MOVE *A0(DEAD),A0
JRNZ YESSND
MOVK 1,A9
MOVE @P1DATA+BMB_CNT,A0
JRZ YESSND
MOVE @HALT,A0
JANZ SUCIDE ;YESSND
;PLACE BOMB ON GROUND
MOVE @P1DATA+BMBSUSED,A0
INC A0
MOVE A0,@P1DATA+BMBSUSED
CREATE BMBPID,TBOMB
DIE
DONE MOVK 1,A0
MOVE A0,@WORDS+4*16
DIE
P1A
;NOT ALREADY IN GAME, SEE IF WE CAN START P1 UP!
MOVI P1DATA,A2
JRUC PXSTART
*PLAYER 2 START
P2START:
MOVE @TAUNTOUT,A1
JRNZ IN2
MOVE @INFO_BOX,A0,L
JRNZ P2IN2
MOVE @WFLG,A0 ;WINDOW GROW FLAG
JANZ SUCIDE
MOVE @ENTERON,A0 ;INITIALS BEING ENTERED
JANZ SUCIDE
MOVE @MAPOUT,A0,L
JRNZ P2IN
MOVE @STATUS,A0 ;1/2 OR 3 FOR WHO IS PLAYING NOW
BTST 1,A0 ;TEST IF 1 BIT IS SET (2)
JRZ P2A
MOVE @GAMSTATE,A0
CMPI ININTRO,A0
JRZ INTRO_EXIT
MOVE @WARPOUT,A0
JRZ NOW
CMPI 2,A0
JRZ WRPIN
DIE
NOW
;PLACE TIME BOMB HERE
MOVE @PLYRPRCS+32,A0,L
MOVE *A0(DEAD),A0
JRNZ YESSND
MOVK 2,A9
MOVE @P2DATA+BMB_CNT,A0
JRZ YESSND
MOVE @HALT,A0
JANZ SUCIDE ;YESSND
;PLACE BOMB ON GROUND
MOVE @P2DATA+BMBSUSED,A0
INC A0
MOVE A0,@P2DATA+BMBSUSED
CREATE BMBPID,TBOMB
DIE
YESSND
MOVI BEEP2,A0 ;NO BOMBS LEFT SND
CALLA ONESND
DIE
P2A
;NOT ALREADY IN GAME, SEE IF WE CAN START P2 UP!
MOVI P2DATA,A2
PXSTART:
MOVE @GAMSTATE,A0,W
CMPI INGAMEOV,A0
JAZ SUCIDE
CMPI INDIAG,A0
JRNE PSTARTG
;GAME IN DIAGNOSTICS MODE! DO NOT START A GAME.
DIE
INTRO_EXIT
;IF IN INTRO, TELL CODE TO EXIT EARLY.
;TELL INTRO TO STOP NOW!
CLR A1
NOT A1
MOVI INTROPID,A0
CALLA EXISTP
JAZ SUCIDE
;YES, FOUND INTRO PROC
MOVI GET_OUT,A7 ;WAKE UP AT GET_OUT
CLR A1
CALLA XFERPROC
DIE
DEC_DIGIT
;MAYBE INC BUYIN TIMER TO GIVE MORE TIME
MOVE @CNTDIG1,A0
JRZ DEC1
CMPI 10,A0
JRZ DEC1
INC A0
MOVE A0,@CNTDIG1
MOVI CNTDOWN,A0
CALLA ONESND
DEC1
MOVE @CNTDIG2,A0
JRZ DEC2
CMPI 10,A0
JRZ DEC2
INC A0
MOVE A0,@CNTDIG2
MOVI CNTDOWN,A0
CALLA ONESND
DEC2 DIE
;DEC_DIGIT
;;MAYBE DEC BUYIN TIMER FASTER!
; MOVE @CNTDIG1,A0
; CMPI 6,A0
; JRC DEC1
; DEC A0
; MOVE A0,@CNTDIG1
; MOVI CNTDOWN,A0
; CALLA ONESND
;DEC1
; MOVE @CNTDIG2,A0
; CMPI 6,A0
; JRC DEC2
; DEC A0
; MOVE A0,@CNTDIG2
; MOVI CNTDOWN,A0
; CALLA ONESND
;DEC2 DIE
PSTARTG
CMPI INAMODE,A0
JREQ PXSTRTNEW ;BR=FRESH START FROM ATTRACT MODE
move *a2(PSCORE),a0,L
jrnz psg50 ;Continue?
calla CR_STRTP ;Credits to start
jrlo DEC_DIGIT ;No?
calla P_START ;Take credits
MOVK 1,A10 ;AT LEAST 5 MEN FOR .50 CENTS
MOVE @GAMSTATE,A0
CMPI ININTRO,A0 ;IF IN INTRO, THE REGULAR START UP
JRZ psg80
CALLR AUD_BOSS_ROAD
movk AUD1STRT,a0 ;Mid game start
calla AUD1
jruc psg80
AUD_BOSS_ROAD
movk AUDBOSS1SC,a0 ;Starts/continues
move @WAVE,a1
subk 16,a1
jreq psg20
subk 17-16,a1
jrne psg30
movk AUDROAD1SC,a0 ;Starts/continues
psg20 calla AUD1
psg30 RETS
psg50
CMPI P1DATA,A2
JRZ psg52
move @CNTDIG2,A0
JRNZ STILL_CNTIN ;CNTDWN DIGIT STILL GOING?
JRZ psg54
psg52 move @CNTDIG1,A0
JRNZ STILL_CNTIN
psg54
;TRY TO CHARGE 50 CENTS!
; calla CR_STRTP ;Credits to start
calla CR_CONTP ;Credits to CONTINUE
jrlo DEC_DIGIT ;No?
calla P_CONT ;Take credits
; calla P_START ;Take credits
CALLR AUD_BOSS_ROAD
movk AUD1STRT,a0 ;Mid game start
calla AUD1
; MOVK 1,A10 ;5 PLAYERS FOR 50 CENTS
CLR A10 ;NOT 5 PLAYERS FOR 25 CENTS
jruc psg80
STILL_CNTIN
;TRY TO CHARGE 25 CENTS - CNTDWN TIMER STILL GOING
calla CR_CONTP ;Credits to continue
jrlo DEC_DIGIT ;No?
calla P_CONT ;Take credits
CALLR AUD_BOSS_ROAD
AUDIT AUD1CONT ;Audit plyr 1 continue
CLR A10 ;NOT 5 PLAYERS FOR 25 CENTS
psg80 CMPI P1DATA,A2
JRNE P2STARTA
;THIS IS PLAYER 1 BUYING IN TO A GAME IN PROGRESS (OR A CONTINUE)
;IF GAME IS NOT SHOWING PLAYFIELD AREA, VOCALLY INDICATE PLAYER HAS BOUGHT
;IN BUT DELAY HIS CREATION UNTIL PLAYFIELD SCREEN IS SHOWN. IF HE NEEDS TO
;APPREAR IN A VIEWSCRN OR SOMETHING, THEN THAT IS A SPECIAL CASE TURN ON
;OF THE PLAYER.
MOVI PLYRONE,A0 ;WELCOME PLAYER 1 AUDIO
CALLA ONESND
CALLA SET_P1BUYIN
MOVI P1DATA,A11
CALLA GET_LIVES
;ZERO STATS IF CNTDWN TIMER NOT GOING?
CALLR ZERO_TIMERS
; MOVE @CNTDIG1,A0
; JRNZ NO_ZER
; CALLA ZERO_STATS
;NO_ZER
MOVI DG1PID,A0
CLR A1
MOVE A1,@CNTDIG1
MOVE A1,*A11(CNTD) ;CNTDWN FLAG
NOT A1
CALLA KILALL
;ZERO COUNTDOWN DIGIT FOR PLYR 1
DIE
ZERO_STATS
MOVK 3,A0
MOVE A0,*A11(BMB_CNT)
CLR A0
MOVE A0,*A11(CASHCNT),W
MOVE A0,*A11(TFLAGS),W ;US FLAGS PICKED UP
MOVE A0,*A11(PSCORE),L
MOVE A0,*A11(THSTGS) ;TOTAL HOSTAGES
MOVE A0,*A11(THITS) ;TOTAL SUCCESSFUL SHOTS FIRED
MOVE A0,*A11(TWPNS) ;TOTAL WEAPONS PICKED UP
MOVE A0,*A11(TEARNED) ;TOTAL EXTRA MEN EARNED
MOVE A0,*A11(BMBSUSED) ;TOTAL BOMBS/CRUISE MISSILES USED
MOVE A0,*A11(TBIGSTF) ;TOTAL BIG STUFF DESTROYED
MOVE A0,*A11(TMISLS) ;TOTAL MISSILE STRIKES CALLED IN
MOVE A0,*A11(TMINEDTH) ;TOTAL LAND MINE DEATHS
MOVE A0,*A11(TSHOTS) ;TOTAL SHOTS FIRED
MOVE A0,*A11(TKEYS) ;TOTAL KEYS COLLECTED
MOVE A0,*A11(WAVEPTS) ;POINTS SCORE THIS WAVE (FOR BONUS)
CMPI P1DATA,A11
JRZ P1TIMR
MOVE A0,@timerp2
MOVE A0,@timerp2sd ;Player 2 seconds since death
RETS
P1TIMR MOVE A0,@timerp1
MOVE A0,@timerp1sd ;Player 1 seconds since death
RETS
ZERO_TIMERS
;ZERO BOZO MODE TIMERS
CLR A0
CMPI P1DATA,A11
JRZ P1TIMRX
MOVE A0,@timerp2
MOVE A0,@timerp2sd ;Player 2 seconds since death
RETS
P1TIMRX MOVE A0,@timerp1
MOVE A0,@timerp1sd ;Player 1 seconds since death
RETS
P2STARTA
MOVI PLYRTWO,A0 ;WELCOME PLAYER 2 AUDIO
CALLA ONESND
CALLA SET_P2BUYIN
MOVI P2DATA,A11
CALLA GET_LIVES
CALLR ZERO_TIMERS
; MOVE @CNTDIG2,A0
; JRNZ NO_ZER2
; CALLA ZERO_STATS
;NO_ZER2
MOVI DG2PID,A0
CLR A1
MOVE A1,@CNTDIG2
MOVE A1,*A11(CNTD) ;CNTDWN FLAG
NOT A1
CALLA KILALL
DIE
SET_P1BUYIN:
MOVK 1,A2
MOVK 1,A8
MOVI P1PID,A0
JRUC SET_OUT
SET_P2BUYIN:
MOVK 2,A2
MOVK 2,A8
MOVI P2PID,A0
SET_OUT
MOVE A8,@THIS_PLYR ;FLAG FOR BUY IN BOX CLOSE DOWN
CLR A1
NOT A1
CALLA KILALL ;KILL SCOREBOARD MESSAGE PROCESS
MOVE @STATUS,A1
OR A2,A1 ;TELL STATUS WORD THAT PLYR X IS ON!
MOVE A1,@STATUS
MOVE @SCORETYP,A1
OR A2,A1
MOVE A1,@SCORETYP ;FOR DISPLAYING OF SCORES OR TEXT
CREATE0 ALL_PLYR_STUFF
RETS
ALL_PLYR_STUFF
;A8=1 OR 2 FOR PLYR
;IF FLAG SET, DELAY TURN ON OF NEW PLAYER UNTIL FLAG CLEARED
MOVE @GAMSTATE,A0
CMPI ININTRO,A0 ;IF IN INTRO, THE REGULAR START UP
JRZ ALL_OUT2 ;CODE WILL START THIS PLAYER!
;IN GAME! TRY TO START.
MOVE @NO_START,A0
JREQ OKAY ;DELAY START FOR SOME REASON.
;PLAYER TRYED TO START WHEN WE DON'T WANT HIM TO.
;DELAY STARTING PLAYER UNTIL WE RESET NO_START FLAG TO 0.
CREATE0 DELAY_START
DIE
DELAY_START
SLEEPK 1
MOVE @NO_START,A0
JRNE DELAY_START ;LOOP UNTIL FLAG RESET
;FALL IN HERE WHEN IT IS OKAY TO START A PLAYER
OKAY:
;OKAY TO TRY AND START THIS PLAYER RIGHT NOW.
;A8=1 OR 2 FOR START STUFF
;START PLAYER AT BOTTOM OF SCREEN - IN SAFE SPOT.
CMPI 1,A8
JRNZ NEXT1
CALLA KILLP1 ;KILL OLD PLYR1 IF ANY
CREATE PLY1PID,DRAW_PLYR_TORSO
MOVE @WORLDTLY,A3,L
CMPI [127EH,0],A3
JRZ ALL_OUT ;BR=STARTING AT PARACHUTES!
MOVE @RUNIN,A10,W ;INDICATES FROM BOTTOM OR LEFT
;A10=0 FOR COME IN FROM BOTTOM
CREATE SCRPID,SCRIPTPLAY
DIE
NEXT1 CALLA KILLP2 ;KILL OLD PLYR2 IF ANY
CREATE PLY2PID,DRAW_PLYR_TORSO
MOVE @WORLDTLY,A3,L
CMPI [127EH,0],A3
JRZ ALL_OUT ;BR=STARTING AT PARACHUTES!
MOVE @RUNIN,A10,W ;INDICATES FROM BOTTOM OR LEFT
;A10=0 FOR COME IN FROM BOTTOM
CREATE SCRPID,SCRIPTPLAY
ALL_OUT
DIE
ALL_OUT2
;A8=1 OR 2 FOR PLYR
; MOVI PLY1PID,A0
; CLR A1
; NOT A1
; CMPI 1,A8
; JRZ AL2O
; MOVI PLY2PID,A0
;AL2O LOCKUP
; EINT
; CALLA EXISTP
;* Z BIT SET = NO MATCH, A0 = 0
; JRNZ ALL_OUT
;;START ME!
; LOCKUP
; EINT
DIE
*****************************************************************************
PXSTRTNEW
CALLA CR_STRTP ;CHECK FOR ENOUGH CREDITS TO START
JALO SUCIDE ;BR=NOPE!
CALLA P_START ;AUDIT CREDITS (TAKE THEM AWAY!)
MOVE A2,A11
FCALL SECURITY,B0
MOVE @SEC_FLAG,A14,W
JRZ PXSTRT_SEC_OK
AUDIT AUDSECURITY ;SHOW THE SECURITY BREECH
DIE
PXSTRT_SEC_OK
;NEW START FROM ATTRACT MODE, ZERO BOTH SCORES!
MOVE A11,A2
MOVK 1,A10 ;5 LIVES FOR .50 CENTS
CALLA GET_LIVES ;GET LIVES PER CREDIT
MOVI P2DATA,A11
CALLA SET_1ST
MOVI P1DATA,A11
CALLA SET_1ST
movk 1,a1 ;A1=Flag for status
cmpi P1DATA,a2
jreq P1GAME ;P1?
;PLYR2 FALLS IN HERE
**************************************************************************
* PLAYER 2 GAME START - COLD FROM ATTRACT MODE OR GAME OVER MODE *
**************************************************************************
MOVK 2,A1 ;A1 IS P2 FLAG FOR STATUS
**************************************************************************
* PLAYER 1 GAME START - COLD FROM ATTRACT MODE OR GAME OVER MODE *
**************************************************************************
P1GAME
GAMESTR:
;GAME START PROCESS
;A1 = PLAYERS TO START,1 = PLAYER 1,2 = PLAYER 2
MOVE A1,@STATUS,W
MOVE A1,@SCORETYP,W
MOVI ININTRO,A0 ;NOT IN ATTRACT MODE ANYMORE!
MOVE A0,@GAMSTATE,W ;FLAG ININTRO
;POSSIBLY DO SOME OTHER KIND OF WIPE (NOT WNDON) IF FROM CREDITS SCREEN!
MOVI CP_PID2,A0 ;ARE WE SHOWING THE CREDIT PAGE?
CLR A1
MOVE A1,@SCORE_FLAG
NOT A1
CALLA KILALL
MOVI CP_PID1,A0 ;ARE WE SHOWING THE CREDIT PAGE?
CALLA KILALL
MOVI AMDEPID,A0 ;ARE WE SHOWING THE CREDIT PAGE?
CALLA KILALL
MOVI TOTCARN,A0 ;WELCOME PLAYER AUDIO
CALLA ONESND
MOVK 15H,A0
MOVE A0,@WSPEED
JSRP WNDWON ;GROW WINDOW
CLR A0
MOVE A0,@IRQSKYE ;BACKGROUND COLOR
CALLA CLRPAL
SLEEPK 1
CALLA WIPEOUT ;CLEAN SYSTEM OUT
MOVK 1,A0
MOVE A0,@GAMERASE ;AUTOERASE FLAG
CALLA AUTOEON
CALLA COLRPRC ;INIT FIXED PAL 0 AND MAYBE 2ND PAL
SLEEPK 2 ;8/1/91
CREATE INTROPID,INIT_GAME ;INITIALIZE GAMEPLAY
DIE
GET_LIVES:
;A11=P1/P2DATA
ADJUST ADJLIVES ;GET LIVES PER GAME
MOVE A0,A1
DEC A1
MOVE A10,A10
JRZ GETL
ADJUST ADJCSTRT ;CREDITS REQUIRED TO START
;RETURN 1,2
SUBK 1,A0
JRZ GETL
MOVE *A11(PSCORE),A0
JRNZ GETL ;MID GAME START WHEN PLAYER HAS A
;SCORE - SOMEBODY LET TIMER EXPIRE.
ADDK 1,A1 ;ALSO CHANGE IN AUDIT.ASM
GETL MOVE A1,*A11(PLIVES),W
MOVE *A11(BMB_CNT),A0
cmpi 4,A0 ;CAN CARRY MAXIMUM OF 20 BMBS
JRNC NOADD
ADDK 3,A0
MOVE A0,*A11(BMB_CNT) ;BOMBS PER CREDIT
NOADD
;SET RAM PTS AREA TO START
CLR A0
MOVE A0,*A11(PTSRAM),W
RETS
SET_1ST
;FIRST FREE MAN AT X POINTS
;A11=P1 OR P2DATA AREA
MMTM SP,A0,A1
CALLA ZERO_STATS
MOVI >100000,A1 ;FIRST FREE MAN AT 100000
CALLA BCDADD
MOVE A0,*A11(PNEXTREP),L
MMFM SP,A0,A1
RETS
********************************
* Show high score tables
SUBRP HSTDTABQ
clr a0
jruc hst5
SUBRP HSTDTAB
movk 1,a0
hst5 move a0,-*a12
clr a0
move a0,@GAMERASE
move a0,@IRQSKYE ;Black
movi ->1004,a0 ;Start display at bottom of screen
move a0,@DPYSTRT
calla CLR_SCRN
calla KILBGND ;Kill old background
SLEEPK 1
clr a1
calla KILOBJ ;Kill all objs (Screen mem is clr)
calla COLRPRC
movi FPALRAM+PALRSIZ,a2 ;>Steal pals 1-3
movi junkp,a1
movk 3,a3
hst30 move a1,*a2+,L
dsj a3,hst30
movi SCRNEND,a0 ;[256,405]
move a0,@SCRNLR,L
movk 10,a0
move a0,@WORLDTLX+16
movi 1000,a0
move a0,@WORLDTLY+16
SLEEPK 2
movi hiscbg_t,a0 ;Show high score screen
move a0,@BAKMODS,L
calla BGND_UD1
callr palcyc_init
JSRP GETHIGH ;Prints high scores
SLEEPK 2
clr a0
move a0,@DISPLAYON
movi -4,a0 ;Show screen
move a0,@DPYSTRT
move *a12+,a0
jrnz hst90 ;Do flyin?
callr vidhwfx_blindin
jruc hst120
hst90 move @SWITCH,a0
movk >11,a1
and a1,a0
jrz hst100
callr vidhwfx_flyin
jruc hst120
hst100 callr vidhwfx_zoomin
hst120
movk 1,a0
move a0,@DISPLAYON
clr a0
move a0,@WFLG ;Plyr can start
CREATE CYCPID,palcyc
; SLEEP 10 ;DEBUG
SLEEP 60*9+20
move @hisclong,a0
jrz hst200
SLEEP 60*9+20
clr a0
move a0,@hisclong
SLEEP 40
SOUND1 MUSICOFF
hst200
callr vidhwfx_flyout
movi CYCPID,a0
calla KIL1C
RETP
hiscbg_t
.long HISCBMOD
.word 10,1002
.long -1
hscolorsc_t
COLORW 02,29,02, 03,29,03, 04,29,04
COLORW 05,30,05, 04,29,04, 03,29,03, 02,29,02
COLORW 01,29,01, 00,29,00, 00,28,00, 00,27,00
COLORW 00,26,00, 00,25,00, 00,24,00, 00,23,00
COLORW 30,09,30, 30,10,30, 30,11,30
COLORW 31,13,31, 30,11,30, 30,10,30, 30,09,30
COLORW 30,08,30, 30,07,30, 30,06,30, 30,05,30
COLORW 30,04,30, 30,03,30, 30,02,30, 30,01,30
COLORW 31,11,00, 31,12,00, 31,13,00
COLORW 31,15,00, 31,13,00, 31,12,00, 31,11,00
COLORW 31,10,00, 31,09,00, 31,08,00, 31,07,00
COLORW 31,06,00, 31,05,00, 31,04,00, 31,03,00
.word -1
hscolori_t ;Blue
COLORW 00,09,31, 00,10,31, 00,11,31
COLORW 00,12,31, 00,11,31, 00,10,31, 00,09,31
COLORW 00,08,31, 00,07,31, 00,06,31, 00,05,31
COLORW 00,04,31, 00,03,31, 00,02,31, 00,01,31
junkp .word 1,0
********************************
* Palette cycle code
SUBRP palcyc_init
movi hscolorsc_t+30*16,b0
movi palram,a1 ;>Set palram
movk 10,a3
psi40 move b0,a0
movk 15,a2
psi50 move *a0+,*a1+
dsj a2,psi50
dsj a3,psi40
movi hscolori_t,a0
movk 15,a2
psi100 move *a0+,*a1+
dsj a2,psi100
CREATE CYCPID,hiscore_cyc
CREATE CYCPID,paldump
rets
SUBRP palcyc
movi hscolorsc_t,a10
ps20 movi palram+15*16,a9
movk 9,a8
ps40 movk 15,a11
ps50 CREATE CYCPID,palnewcol
SLEEPK 1
addk 16,a9 ;Next slot
addk 16,a10 ;Next color in set
dsj a11,ps50
subi 15*16,a10 ;Back to 1st in set
dsj a8,ps40
SLEEP 60
addi 15*16,a10 ;Next set
move *a10,a0 ;End of color tables = Neg
jrnn ps20
jruc palcyc
SUBRP palnewcol ;A9=*palram, A10=*New color
movi 120,a8 ;>Fade old down
move *a9,a11 ;Get old
pp50 move a11,*a9
move a9,a0
move a9,a1
CALLA palnewc_set
SLEEPK 1
subk 8,a8
cmpi 16,a8
jrgt pp50
pp100 move a10,a1 ;>Fade new up
move a9,a0
CALLA palnewc_set
SLEEPK 1
addk 4,a8
cmpi 128,a8
jrls pp100
DIE
SUBRP palnewc_set
move a8,a2
movk 1,a14
jruc color_fade
********************************
* Cycle the #1 score colors
SUBRP hiscore_cyc
hsc10 movi COLTAB,a8
hsc30 move *a8+,a7
jrn hsc10
movi palram,a4
move a4,a0
addk 16,a0
movk 14,a2
hsc40 move *a0+,*a4+ ;Shift colors down
dsj a2,hsc40
move a7,*a4+
SLEEPK 2
jruc hsc30
********************************
* Dump palram each frame (process)
SUBRP paldump
movi palram,a0 ;*Color
movi >101,a1 ;Palette 1, Color 1
movi 60,a2 ;# Colors
calla PALSET
movi palram+60*16,a0
movi >201,a1 ;Palette 2, Color 1
movi 60,a2
calla PALSET
movi palram+120*16,a0
movi >301,a1 ;Palette 3, Color 1
movi 45,a2
calla PALSET
SLEEPK 1
jruc paldump
********************************
* Fade a palette
* Each color in palette will be multiplied by a2 then divided by 128
* A0=*Ram for pal, A1=*Palette, A2=Brightness (0-128)
SUBRP color_fade
PUSH a3,a4,a5,a6,a7,a8,a9,a10,a11
movi >7c00,a4 ;A4=Mask for 5 bits of red
movi >03e0,a6 ;A6=Mask for 5 bits of green
movk >1f,a8 ;A8=Mask for 5 bits of blue
move a4,a9
move a6,a10
move a8,a11
sll 7,a9 ;A9=post mult max for 5 bits of red
sll 7,a10 ;A10=post mult max for 5 bits of green
sll 7,a11 ;A11=post mult max for 5 bits of blue
fp100 move *a1+,a3
move a3,a5 ;A3=Red
move a3,a7 ;A5=Green
and a4,a3 ;A7=Blue
and a6,a5
and a8,a7
mpyu a2,a3
mpyu a2,a5
mpyu a2,a7
cmp a9,a3
jrle redok
move a9,a3
redok cmp a10,a5
jrle greenok
move a10,a5
greenok cmp a11,a7
jrle blueok
move a11,a7
blueok and a9,a3
and a10,a5
or a5,a3
or a7,a3
srl 7,a3
move a3,*a0+ ;Save color
dsj a14,fp100
PULL a3,a4,a5,a6,a7,a8,a9,a10,a11
rets
********************************
* Video hardware effects
FXNUML .equ 254
.bss vhfxmem ,FXNUML*16 ;Video line effect list
.bss vhfxlnv ,FXNUML*16 ;Velocity
SUBR vidhwfx_flyin
move @HEBLNK,a10
movi FXNUML/2,a0 ;>Clr effect list and init lines
movi vhfxmem,a3
movi vhfxlnv,a4
move @HSBLNK,a1
sub a10,a1
subk 1,a1
sll 4,a1 ;*16
clr a2
vffi100 move a1,*a3+ ;Set X
move a2,*a4+ ;Set vel
addk 1,a1
move a1,*a3+ ;Set X
move a2,*a4+ ;Set vel
subk 1,a1
dsj a0,vffi100
movk 2,b2 ;B2=#Lines active
; movk 1,b4 ;B4=Spawn delay
; move b4,b3 ;B3=Spawn cntdn
movi >10f,a11
vffi200 move @COINS,a0
ori >34,a0
not a0
jrnz vffix
clr a0
move a0,@TIMER
movi VCOUNT,a7 ;A7=*VCNT
movi HEBLNK,a6 ;A6=*Dest reg
movi vhfxmem,a3
movk 21,a1 ;1st line
movi FXNUML,a5
DINT
vffi230 addk 1,a1
move *a3+,a2 ;Get X start of line
srl 4,a2 ;/16
add a10,a2
vffi260 move *a7,a0 ;Wait on vcnt
cmp a1,a0
jrnz vffi260
move a2,*a6 ;Stuff value
dsj a5,vffi230
EINT
movi vhfxlnv,a3 ;>Move lines
movi vhfxmem,a8
move b2,b0
vffi400 move *a8,a0 ;Get X
move *a3,a1
add a1,a0 ;New pos
jrge vffi500
clr a0
; cmpi >1f,a11 ;No bounce at end
; jrls vffi500
sra 1,a1
neg a1
vffi500 subk 2,a1 ;New vel
; movk 3,a2
; and a11,a2
; jrnz vffi530
; move a1,a2
; sra 3,a2 ;1/8 drag
; sub a2,a1
vffi530 move a1,*a3+
move a0,*a8+ ;New X
dsj b0,vffi400
cmpi FXNUML,b2
jrhs vffi700
; dsj b3,vffi700
addk 2,b2 ;2 New
; movk 1,b3
; subk 6,b4
; jrle vffi700
; move b4,b3
; subk 1,b2 ;Only 1
vffi700 dsj a11,vffi200
vffix move a10,@HEBLNK
rets
SUBRP vidhwfx_flyout
clr a0
move a0,@GAMERASE ;Off
move a0,@DISPLAYON ;^
calla SYNCHALF
calla SYNCFULL ;At top and DMA should be done!
move @HSBLNK,a9
subk 2,a9 ;A9=Highest HEBLNK allowed
move @HEBLNK,a10
movi FXNUML,a0 ;>Clr effect list and init lines
movi vhfxmem,a3
movi vhfxlnv,a4
clr a1
clr a2
vffo100 move a1,*a3+ ;Set X
move a2,*a4+ ;Set vel
addk 1,a2
dsj a0,vffo100
movk 2,b2 ;B2=#Lines active
; movk 1,b4 ;B4=Spawn delay
; move b4,b3 ;B3=Spawn cntdn
movi >4f,a11
vffo200 move @COINS,a0
ori >34,a0
not a0
jrnz vffox
movi VCOUNT,a7 ;A7=*VCNT
movi HEBLNK,a6 ;A6=*Dest reg
movi vhfxmem,a3
movk 21,a1 ;1st line
movi FXNUML,a5
DINT
vffo230 addk 1,a1
move *a3+,a2 ;Get X start of line
srl 4,a2 ;/16
add a10,a2
cmp a9,a2
jrls vffo260
move a9,a2
vffo260 move *a7,a0 ;Wait on vcnt
cmp a1,a0
jrnz vffo260
move a2,*a6 ;Stuff value
dsj a5,vffo230
EINT
movi vhfxlnv,a3 ;>Move lines
movi vhfxmem,a8
move b2,b0
vffo400 move *a8,a0 ;Get X
move *a3,a1
add a1,a0 ;New pos
jrge vffo500
clr a0
; cmpi >1f,a11 ;No bounce at end
; jrls vffo500
sra 1,a1
neg a1
vffo500 addk 1,a1 ;New vel
; movk 3,a2
; and a11,a2
; jrnz vffo530
; move a1,a2
; sra 3,a2 ;1/8 drag
; sub a2,a1
vffo530 move a1,*a3+
move a0,*a8+ ;New X
dsj b0,vffo400
cmpi FXNUML,b2
jrhs vffo700
; dsj b3,vffo700
addk 4,b2 ;2 New
; movk 1,b3
; subk 6,b4
; jrle vffo700
; move b4,b3
; subk 1,b2 ;Only 1
vffo700 dsj a11,vffo200
vffox
movk 1,a0
move a0,@GAMERASE ;On
calla SYNCFULL ;At top
calla KILBGND
clr a1
calla KILOBJ ;Kill all objs
calla SYNCFULL ;At top
move a10,@HEBLNK ;Set normal
movk 1,a0
move a0,@DISPLAYON ;ON
rets
********************************
* Zoom into screen
SUBRP vidhwfx_zoomin
movi FXNUML,a0 ;>Clr effect list and init lines
movi vhfxmem,a3
movi vhfxlnv,a4
move @DPYSTRT,a1
vfzi100 move a1,*a3+ ;Set Addr
move a1,*a4+ ;^
subk >10,a1
dsj a0,vfzi100
movi >10000,b2 ;B2=#Lines per addr
; movk 1,b4 ;B4=Spawn delay
; move b4,b3 ;B3=Spawn cntdn
movi >10f,a11
vfzi200 move @COINS,a0
ori >34,a0
not a0
jrnz vfzix
movi VCOUNT,a7 ;A7=*VCNT
movi DPYADR,a6 ;A6=*Dest reg
movi vhfxmem,a3
movk 21,a1 ;1st line
movi FXNUML,a5
DINT
vfzi230 addk 1,a1
move *a3+,a2 ;Get X start of line
vfzi260 move *a7,a0 ;Wait on vcnt
cmp a1,a0
jrnz vfzi260
move a2,*a6 ;Stuff value
dsj a5,vfzi230
EINT
; movi vhfxlnv,a3 ;>Move lines
movi vhfxmem,a8
movi FXNUML,a2
clr b0
vfzi400 move b0,a3
srl 16,a3
cmpi FXNUML,a3
jrlo vfzi430
movi FXNUML-1,a3
vfzi430 sll 4,a3 ;*16
addi vhfxlnv,a3
move *a3,a0 ;Get addr
move a0,*a8+ ;Set addr
add b2,b0
dsj a2,vfzi400
addi >200,b2 ;Inc line skip
; jrgt vfzi550
; movi >100,b2
; subi >200,b2 ;Decrease line skip
; jrgt vfzi550
; movi >100,b2
vfzi550
; cmpi FXNUML,b2
; jrhs vfzi700
; dsj b3,vfzi700
addk 1,b2
; movk 1,b3
; subk 6,b4
; jrle vfzi700
; move b4,b3
; subk 1,b2 ;Only 1
vfzi700 dsj a11,vfzi200
vfzix move a10,@HEBLNK
rets
********************************
* Show screen by droping lines (BOGUS)
NOTINUSE
.bss vhfxln ,FXNUML*32 ;Line current pos, velocity
SUBRP vidhwfx_linein
move @DPYCTL,a10
movi FXNUML,a0 ;>Clr effect list and init lines
movi vhfxmem,a3
movi vhfxln,a4
clr a1
movi -8,a2
vhf100 move a1,*a3+
move a2,*a4+ ;Set pos (3 bits fraction)
move a1,*a4+ ;Set vel
dsj a0,vhf100
movk 1,b2 ;B2=#Lines active
movi 45,b4 ;B4=Spawn delay
move b4,b3 ;B3=Spawn cntdn
movi >12f,a11
vhf200 move @COINS,a0
ori >34,a0
not a0
jrnz vhfx
movi VCOUNT,a7 ;A7=*VCNT
movi DPYCTL,a6 ;A6=*Dest reg
movi vhfxmem,a3
movk 21,a1 ;1st line
movi FXNUML,a5
DINT
vhf230 addk 1,a1
move a10,a2
move *a3+,a0 ;Get effect for line
jrnz vhf260
sll 17,a2 ;Clr ENV bit
srl 17,a2
vhf260 move *a7,a0 ;Wait on vcnt
cmp a1,a0
jrnz vhf260
move a2,*a6 ;Stuff value
dsj a5,vhf230
movi FXNUML,a0 ;>Clr effect list
movi vhfxmem,a3
clr a1
vhf300 move a1,*a3+
dsj a0,vhf300
EINT
movi vhfxln,a3 ;>Move lines
movi vhfxmem,a8
movi FXNUML*8,a5 ;A5=Line #*8
move b2,b0
move a5,a2
jruc vhf410
vhf400 move *a3(-32),a2
vhf410 move *a3+,a0
move *a3,a1
add a1,a0 ;New pos
cmp a2,a0
jrlt vhf450
move a2,a0
subk 8,a0
jruc vhf470
vhf450 cmp a5,a0
jrlt vhf500
move a5,a0
vhf470 cmpi >2f,a11 ;No bounce at end
jrls vhf500
neg a1
vhf500 addk 4,a1 ;Add vel
movk 3,a2
and a11,a2
jrnz vhf530
move a1,a2
sra 3,a2 ;1/8 drag
sub a2,a1
vhf530 move a1,*a3+
move a0,*a3(-32) ;New pos
sra 3,a0 ;Get int part
jrle vhf550
sll 4,a0 ;*16
addi vhfxmem-16,a0
movk 1,a2
move a2,*a0 ;Effect on
vhf550 subk 8,a5
dsj b0,vhf400
cmpi FXNUML,b2
jrhs vhf700
dsj b3,vhf700
addk 4,b2 ;4 New
movk 1,b3
subk 6,b4
jrle vhf700
move b4,b3
subk 3,b2 ;Only 1
vhf700 dsj a11,vhf200
vhfx move a10,@DPYCTL
rets
.endif
********************************
* Show screen with blind effect
SUBRP vidhwfx_blindin
move @DPYCTL,a10
movi FXNUML,a0 ;>Clr effect list
movi vhfxmem,a3
move a3,a9 ;A9=*Next line to show
clr a1
vhfb100 move a1,*a3+
dsj a0,vhfb100
movk 18,a11
vhfb200 move @COINS,a0
ori >34,a0
not a0
jrnz vhfbx
movi VCOUNT,a7 ;A7=*VCNT
movi DPYCTL,a6 ;A6=*Dest reg
movi vhfxmem,a3
movk 21,a1 ;1st line
movi FXNUML,a5
DINT
vhfb230 addk 1,a1
move a10,a2
move *a3+,a0 ;Get effect for line
jrnz vhfb260
sll 17,a2 ;Clr ENV bit
srl 17,a2
vhfb260 move *a7,a0 ;Wait on vcnt
cmp a1,a0
jrnz vhfb260
move a2,*a6 ;Stuff value
dsj a5,vhfb230
EINT
movk 14,a5
move a9,a3
movk 1,a0
vhfb400 move a0,*a3 ;Line on
addi 18*16,a3
dsj a5,vhfb400
addk 16,a9
dsj a11,vhfb200
vhfbx move a10,@DPYCTL
rets
********************************
* Get initials from players
.ref STRT_S,WNDWOFF,GETINIT,ISHSTD,INITTIM
.ref GETINIT1,GETINIT2
.ref WRLD,BAKBITS,STRT_CRM
SUBR INITIALS
JSRP WNDWON
movi junkp,a1 ;>Steal PAL 1
move a1,@FPALRAM+PALRSIZ,L
movi hscolorsc_t+30*16,a0 ;*Red
movi >101,a1 ;Palette 1, Color 1
movk 15,a2 ;# Colors
calla PALSET
clr a0
move a0,@TNT_TYPE
move a0,@WORLDTLX+16
movi 1000,a0
move a0,@WORLDTLY+16
SLEEPK 2
movi hiscoreinit_t,a0 ;Show home base view screen
move a0,@BAKMODS,L
calla BGND_UD1
calla STRT_S ;Static color cycle
calla STRT_CRM ;Start headquarters cycle
CALLA intgrid_prt ;Print grid
movk 4,a0
move a0,@IRQSKYE ;Dark blue
clr a0
move a0,@WRLD ;Do world adj
movk 1,a0
move a0,@ENTERON
movk 30,a0
move a0,@WSPEED
JSRP WNDWOFF
calla ISHSTD
jrz in70
move a0,b0 ;P1=1, P2=2, Both=3
calla INITTIM
srl 1,b0
jrnc in30
CREATE HISCPID,GETINIT1 ;GET PLAYER 1 INITS
in30 srl 1,b0
jrnc in70
CREATE HISCPID,GETINIT2 ;GET PLAYER 2 INITS
in70 JSRP GETINIT ;Wait on initials
calla KILBGND
movi INTROPID,a0
calla KIL1C
movi HISCPID,a0
calla KIL1C
movi CYCPID,a0
calla KIL1C
clr a1
calla KILOBJ ;Kill all objs
SLEEPK 1
calla MYOINIT
movi WRPSND,a0
calla ONESND
RETP
hiscoreinit_t
.long HISCOREBMOD ;Module name
.word 6,1000 ;X,Y start pos
.long -1
********************************
* print initials letter grid
.bss intgridbuf ,16 ;Print buffer
.ref INITMAT,RD15FONT,STRCNRMO
SUBRP intgrid_prt
movi INITMAT,a4
movi >2525,a6
movi [44,149],a9 ;Scrn y/x
movk [0,1],a10 ;Spacing
movi RD15FONT,a11
movk 5,a2
igp30 movk 6,a3
igp50 clr a0 ;No sleep
movi intgridbuf,a8
movb *a4,*a8
PUSH a9
JSRP STRCNRMO ;Print, objs
PULL a9
addk 8,a4
addk 21,a9 ;Next X
dsj a3,igp50
subi 6*21,a9 ;1st X
addi [22,0],a9 ;Next Y
dsj a2,igp30
rets
**************************************************************************
* *
* SECURITY - AND FINALLY ... THERE IS SECURITY! *
* B0 = RETURN ADDRESS *
* SETS GLOBAL SEC_FLAG TO 1 IF BREECH! *
* NOTE: TRASHES A0,A1,A2,A3,A4,A6 *
*
* Modified and added table for Total Carnage. 1/8/92 CMM *
**************************************************************************
SECURITY
CLR A0
MOVE A0,@SEC_FLAG,W
MOVI SECBTAB,A0
GETST A6
DINT
MOVI SECCHIP/2,A3 ;A3 points to sec chip
SLL 1,A3
SECLOOP
MOVB *A0,A1
ADDK 8,A0
SLL 24,A1 ; STRIP OUT THE CRUD leaving
SRL 24,A1 ;16 bits, right justified
CMPI >FF,A1 ;ff signifies no more commands
JREQ SECCHX ; WE ARE DONE
MOVE A1,A2
SLL 8,A1 ;align with register in chip
ANDI >0F00,A1
MOVE A1,*A3,W
CMPI >0600,A1 ;is this a seed cycle?
JREQ SESEED
CMPI >0400,A1 ;is this a READ cycle?
JRNE SECLOOP ;NO READ CYCLE
MOVE *A3,A4,W ;CHECK OUT READ DATA
SLL 16,A4 ;mask off all but
SRL 24,A4 ;8 bits
ANDI >0F0,a2 ;isolate read value
ORI >0A,A2 ;or in number of TC Chip
CMP A4,A2
JREQ SECLOOP
SECERR ;BOGUS SHIT = ERROR
MOVK 1,A0
MOVE A0,@SEC_FLAG,W
SECCHX
PUTST A6
FRET B0
;seed code is by itself so that a seed value equal to a special
;command value passes thru alright.
SESEED
MOVB *A0,A1 ;get seed value from table
ADDK 8,A0
SLL 24,A1 ; STRIP OUT THE CRUD leaving
SRL 24,A1 ;16 bits, right justified
MOVE A1,A2
SLL 8,A1 ;align with register in chip
ANDI >0F00,A1
MOVE A1,*A3,W
JRUC SECLOOP
**************************************************************************
* *
* SECURITY EXERCISE TABLE *
* *
**************************************************************************
SECBTAB
;current register value is at end of comment column
.BYTE >F ;CLEAR THE SUCKER 0
.BYTE >F ;CLEAR THE SUCKER 0
.BYTE >F ;CLEAR THE SUCKER 0
.BYTE >8 ;CLOCK IT
.BYTE >44 ;READ A 4 14
.BYTE >6 ;LOAD SEED
.BYTE >3 ;LOAD A 3 13
.BYTE >8 ;CLOCK IT 1E
.BYTE >8 ;CLOCK IT 05
.BYTE >8 ;CLOCK IT 03
.BYTE >8 ;CLOCK IT 06
.BYTE >64 ;READ AN 6
.BYTE >C ;CLOCK IT 11
.BYTE >C ;CLOCK IT 1D
.BYTE >D4 ;READ AN D
.BYTE >5 ;NOP 1D
.BYTE >7 ;NOP 1D
.BYTE >5 ;NOP 1D
.BYTE >7 ;NOP 1D
.BYTE >7 ;NOP 1D
.BYTE >7 ;NOP 1D
.BYTE >D4 ;READ AN D
.BYTE >C ;CLOCK IT 17
.BYTE >8 ;CLOCK IT 18
.BYTE >6 ;LOAD SEED
.BYTE >6 ;LOAD A 6 16
.BYTE >5 ;NOP 16
.BYTE >64 ;READ A 6
.BYTE >C ;CLOCK IT 09
.BYTE >8 ;CLOCK IT 09
.BYTE >C ;CLOCK IT 09
.BYTE >8 ;CLOCK IT 09
.BYTE >94 ;READ A 9
.BYTE >9 ;RRX IT 04
.BYTE >44 ;READ A 4
.BYTE >9 ;RRX IT 12
.BYTE >24 ;READ A 2
.BYTE >9 ;RRX IT 09
.BYTE >94 ;READ A 9
.BYTE >9 ;RRX IT 04
.BYTE >D ;ROR IT 02
.BYTE >D ;ROR IT 01
.BYTE >14 ;READ A 1
.BYTE >9 ;RRX IT 00
.BYTE >9 ;RRX IT 10
.BYTE >9 ;RRX IT 08
.BYTE >84 ;READ A 8
.BYTE >9 ;RRX IT 14
.BYTE >9 ;RRX IT 0A
.BYTE >A4 ;READ A A
.BYTE >9 ;RRX IT 15
.BYTE >9 ;RRX IT 1A
.BYTE >9 ;RRX IT 0D
.BYTE >AD ;READ A D
.BYTE >9 ;RRX IT 06
.BYTE >A6 ;READ A 6
.BYTE >9 ;RRX IT 13
.BYTE >A3 ;READ A 3
.BYTE >9 ;RRX IT 19
.BYTE >A9 ;READ A 9
.BYTE >9 ;RRX IT 1C
.BYTE >AC ;READ A C
.BYTE >9 ;RRX IT 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >7 ;NOP 0E
.BYTE >AE ;READ A E
.BYTE >9 ;RRX IT 17
.BYTE >A7 ;READ A 7
.BYTE >9 ;RRX IT 1b
.BYTE >AB ;READ A B
.BYTE >8 ;CLOCK IT 12
.BYTE >A2 ;READ A 2
.BYTE >8 ;CLOCK IT 0F
.BYTE >AF ;READ A F
.BYTE >8 ;CLOCK IT 0C
.BYTE >AC ;READ A C
.BYTE >FF ;ITS ALL OVER
.BYTE >FF ;ITS ALL OVER (extra for safety with seed)
.EVEN
.REF GET_AUD,DEF_PAGE,ADD_DUMP
**************************************************************************
* *
* ERRORLOG - THIS SHOULD BE CALLED IN PLACE OF ANY JRxx $ *
* IN CASE OF ERROR. IF WE ARE IN DEBUG MODE *
* IT WILL HANG, IF NOT, THE ERROR WILL BE LOGGED *
* AND IT WILL RETURN. *
* A1 = RETURN ADDRESS OF CALLING ROUTINE *
* A2 = ERROR CODE *
**************************************************************************
ERRORLOG
;TURMELL
;; .IF DEBUG
; LOCKUP
; EINT
;; .ENDIF
MMTM SP,A2,A3,A4,A5,A6,A7
SLL 16,A2
ERRLOGG ;A8 IS IN A8
MOVE A13,A7 ;PROC. BLOCK IN A7
MOVE *A7(PROCID),A6,W
SLL 16,A6
MOVE *A8(OID),A3,W
MOVX A3,A6 ;A6 = [PROCID:*A8(OID)]
; MOVE @CIRCUIT,A5,W
; SLL 16,A5
MOVE @WAVE,A3,W
MOVX A3,A5 ;A5 = [CIRCUIT#:WAVE#,)]
MOVI AUD1STRT,A4 ;PLAY #
CALLR GETAUD4
SLL 16,A4
MOVE *A0(OID),A3,W ;A4 = [STRT#:*A0(OID)]
MOVX A3,A4
MOVE @GAMSTATE,A3,W ;A2 = [STATUS:GAMSTATE]
MOVX A3,A2
MOVE @STATUS,A3,W ;A2 = [ERROR CODE:STATUS]
MOVX A3,A2
MOVE *SP(0C0H),A3,L ;A3=GET THE RETURN ADDRESS
MOVE *SP(0E0H),A1,L ;A1=CALLING ADDRESS
CALLA ADD_DUMP
MMFM SP,A2,A3,A4,A5,A6,A7
RETS
**************************************************************************
* *
* GETAUD4 - GET AN AUDIT *
* A4 = AUDIT # *
* RETURNS: *
* A4 = AUDIT *
* *
**************************************************************************
GETAUD4
MMTM SP,A0,A1
MOVE A4,A0
CALLA GET_AUD
CALLA DEF_PAGE ;POINT AT DEFAULT PAGE.
MOVE A1,A4
MMFM SP,A0,A1
RETS
.end