revolution-x/GXCONTRL.ASM

3513 lines
86 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

.MLIB "GXMACS.LIB"
.FILE "GXCONTRL.ASM"
.TITLE "<<< GENERATION X ---- CONTROL ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GX.INC"
.INCLUDE "GXSTRING.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXCONTRL.TBL"
.INCLUDE "GXCONTRL.H"
*ROUTINES IN THIS MODULE
.DEF PFIRE, PBOMB, RECOIL_OFF, GO_CALIBRATE, INITIALIZE_CALIBRATION
.DEF GUN_CALIBRATE, PLAYER_CURSOR, PLAYER_RECOIL_OFF
.DEF ENEMYP_COLL, A_CHANGE_POID, GO_DRIVER, CURSOR_OFF, CURSOR_ON
.DEF BFLASH0_ANIM, bulit9
.REF GPLAYD, SLEEP_SWITCHX, CLR_PSTARTESC
.REF COLOR_START, SWITCH_ESCAPE, DIGSRT, MAIN_GO
.REF PLAYER_KILL
***** from GXRAM.ASM
.REF GUNS_OFF
.REF P1POTVALS, P2POTVALS, P3POTVALS
.REF RAM_CAL_START, RAM_CAL_END
.REF P1_CAL_UL, P1_CAL_LR, P1_QUADS, P1_MULTS
.REF P2_CAL_UL, P2_CAL_LR, P2_QUADS, P2_MULTS
.REF P3_CAL_UL, P3_CAL_LR, P3_QUADS, P3_MULTS
*SYMBOLS IN APPLAYER.ASM
.REF GET_POID
*SYMBOLS IN APSCORE.ASM
.REF OUT_BOMBS
*SYMBOLS IN APHSTD.ASM
.REF INITHIT
*SYMBOLS IN APMENU.ASM
.REF M_CALIBRATE, MESS_DRIVER, WAIT_BUT, SCR_BOX_OBJ, SCR_REV_OBJ
.REF MESS_TITLE
.ref _in_driver_test
.ref _cabinet_type
*SYMBOLS IN GXDTST.ASM
.REF READ_DIP
.ref DIAG_ESCAPE
**** from GXPLAYER.ASM
.REF P_LED_OFF, P_LED_ON
.TEXT
**************************************************************************
* *
* PFIRE - PLAYER FIRE PROCESS. HANDLE SOUND, RECOIL AND DETECTION. *
* *A13(PROCID) =001S SSSS IIII 00PP new *
* 0010 0PPP IIII SSSS old *
* WHERE: *
* PPP = PLAYER # *
* IIII = ID (FIRE OR BOMB) *
* SSSS = SWITCH # *
* *
**************************************************************************
PFIRE
INCM @SWITCH_ESCAPE,W ;GLOBAL ESCAPE
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0
JREQ PFIRE_GAMEOVER
CMPI INBONUS,A0
JREQ PFIRE_GAMEOVER ;BR = We are in the bonus screen
CMPI INEPILOG,A0
JREQ PFIRE_GO_GO
CMPI INPLAY,A0
JRNE PROCESS_SWITCH_RESET
PFIRE_GO_GO
MOVE @PAUSE_GAME,A14,W ;GAME PAUSED?
JRNZ PROCESS_SWITCH_RESET ;BR = YES
MOVE @GUNS_OFF,A14,W ;Are the guns turned off?
JRNZ PROCESS_SWITCH_RESET ;BR = Yes, then no firing
CALLR EXTRACT_PLAYERD
MOVE *A2(POBJ),A8,L
JRZ PROCESS_SWITCH_RESET
MOVE *A2(PFIRING),A1,W
JRNZ PFIRE_DIE
INC A1
MOVE A1,*A2(PFIRING),W
SLL 4,A0
; MOVE A0,A1
; ADDI PRECOIL_TAB,A0
; MOVE *A0,A0,W
; MOVK GUN_COIL_ON,A14
; SLL 16,A14
; MOVY A14,A0
; CALLA COIL_DRIVE
; MOVE A1,A0
MOVI SIGHT_ANIM,A1 ;MAKE THE SIGHT BLINK WHITE
CALLA STRT_ANIM
MOVE *A2(PPLASMASHOTS),A14,W
JRZ PFIRE_BULLETS
*PLAYER FIRING PLASMA SHOTS HERE
SOUND1 SND_SUPER_GUN
MOVE A2,A8 ;STORE PLAYER DATA FOR SLEEPS
MOVE *A2(PCURSORXY),A3,L
CALLR PCOLL_SINGLE ;SEE IF WE HIT ANYBODY
DECM *A2(PPLASMASHOTS),W ;Dec after 'cause this is a flag
MOVE @WAVEIRQS,A7,L
MOVE @GUN_ONE_SHOT,A14,W
JRNZ PFIRE_MAKEPLASMA ;BR=ALWAYS MAKE IN ONE SHOT
MOVE A7,A1
MOVE *A2(PTRACETIME),A14,L
SUB A14,A1
CMPK 8,A1
JRLT PFIRE_NOTRACER ;BR=TOO SOON TO MAKE TRACER
PFIRE_MAKEPLASMA
CREATE PID_IND,PLASMA_LAUNCH
JRUC PFIRE_NOTRACER
*PLAYER FIRING NORMAL SHOTS HERE
PFIRE_BULLETS
SOUND1 SND_PFIRE_MULTI
MOVE A2,A8 ;STORE PLAYER DATA FOR SLEEPS
MOVE *A2(PCURSORXY),A3,L
CLR A10
.if DEBUG
PUSH A2
.endif
CALLR PCOLL_SINGLE ;SEE IF WE HIT ANYBODY
.if DEBUG
PULLQ A14
CMP A14,A2
LOCKON NE ;WE FUCKED UP THE PLAYER DATA AREA!
MOVE A0,A0
.endif
; JRNZ PFIRE_TRACER ;BR=WE HIT SOMETHING SO DON'T CHECK GRND
; MOVE @HORIZON,A14,W
; MOVE *A2(PCURSORXY),A3,L
; MOVE A3,A4
; SRA 16,A4
; CMP A14,A4 ;IS THE CURSOR ABOVE THE HORIZON?
; JRLT PFIRE_TRACER ;BR=ABOVE HORIZON
; MOVI GROUND_HIT_INIT,A5
; CALLA CREATE_OBJ
; JRZ PFIRE_TRACER
; MOVE @YWORLD,A1,L ;WE HAVE WORLD Y
; MOVE @YBASE,A14,L
; ADD A14,A1
; MOVE A1,A5
; MOVE @YHALF,A14,W
; SUB A14,A4
; DIVS A4,A1 ;GET WORLD Z
; SEXT A3,W
; STOWX A1,A3 ;GET WORLD X
; MOVE @ZBASE,A14,L ;TRANSLATE COORDINATES TO UNIVERSE
; ADD A14,A1
; MOVE A1,*A0(OZVAL),L
; MOVE A5,*A0(OYVAL),L
; MOVE @XBASE,A14,L
; ADD A14,A3
; MOVE A3,*A0(OXVAL),L
; MOVE A8,A1
; MOVE A0,A8
; CALLA GET_POID
; ORM A0,*A8(OID),W ;SET PLAYER FIELD IN OID
; MOVE @RAND,A0,W ;RANDOM FLIP
; ANDI M_FLIPH,A0
; MOVE *A8(OCTRL),A14,W
; OR A0,A14
; MOVE A14,*A8(OCTRL),W
; CALLA INSERT_OBJ
; MOVE A1,A8
;PFIRE_TRACER
MOVE @WAVEIRQS,A7,L
MOVE @GUN_ONE_SHOT,A14,W
JRNZ PFIRE_MAKETRACER ;BR=ALWAYS MAKE TRACER IN ONE SHOT MODE
MOVE A7,A1
MOVE *A2(PTRACETIME),A14,L
SUB A14,A1
CMPK 8,A1
JRLT PFIRE_NOTRACER ;BR=TOO SOON TO MAKE TRACER
PFIRE_MAKETRACER
MOVE A7,*A2(PTRACETIME),L
CREATE PID_IND,TRACER_LAUNCH
PFIRE_NOTRACER
SLEEP 2
PFIRE_CLR
CLRM *A8(PFIRING),W
MOVE @GUN_ONE_SHOT,A14,W
JRNZ PFIRE_DIE
PROCESS_SWITCH_RESET
MOVE *A13(PROCID),A11,W ;RETRIEVE I.D.
SLL 19,A11
SRL 27,A11 ;ISOLATE SWITCH #
CLR A0
BSET A11,A0
PUSHST
DINT
ORM A0,@SWTEMP1,L
ORM A0,@SWTEMP2,L ;CLEAR THE SWITCH DEBOUNCE TO RE-TRIGGER
POPST
PFIRE_DIE
DIE
GROUND_HIT_INIT
.LONG STRIFE1_GRY,DUMCOLL
.WORD OID_JUNK,DMAWNZ,0,0
.LONG C_STRTANIM,GROUND_HIT_ANIM
GROUND_HIT_ANIM
LW STRIFE2,3
LW STRIFE3,3
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* PFIRE_GAMEOVER - SPECIAL PFIRE ENTRY TO BE USED DURING INITIAL ENTRY *
* AND MAYBE DIAGNOSTICS *
* *A13(PROCID) =001S SSSS IIII 00PP new *
* 0010 0PPP IIII SSSS old *
* WHERE: *
* PPP = PLAYER # *
* IIII = ID (FIRE OR BOMB) *
* SSSS = SWITCH # *
* *
**************************************************************************
PFIRE_GAMEOVER
MOVE @PAUSE_GAME,A14,W ;GAME PAUSED?
JRNZ PFIRE_DIE ;BR = YES
MOVE @GUNS_OFF,A14,W ;Are the guns turned off?
JRNZ PROCESS_SWITCH_RESET ;BR = Yes, then no firing
CALLR EXTRACT_PLAYERD
MOVE *A2(POBJ),A8,L
JRZ PFIRE_DIE
SLL 4,A0
MOVE A0,A1
ADDI PRECOIL_TAB,A0
MOVE *A0,A0,W
MOVK GUN_COIL_ON,A14
SLL 16,A14
MOVY A14,A0
CALLA COIL_DRIVE
MOVE A1,A0
MOVI SND_PFIRE_MULTI,A0
CALLA ONESND
MOVE A2,A8 ;STORE PLAYER DATA FOR SLEEPS
MOVE *A2(PCURSORXY),A3,L
MOVE @GAME_STATE,A14
CMPI INGAMEOV,A14
JRNE NOT_IN_HI_INPUT
MMTM SP,A3
CALLR CHECK_CHARHIT ;SEE IF WE HIT ANYBODY
MMFM SP,A3
JRUC PFIREG_NOFLASH
NOT_IN_HI_INPUT
CALLR PCOLL_SINGLE
JRZ PFIREG_NOFLASH ;BR = DIDN'T HIT ANYONE
MOVE A0,A10 ;SEND OBJECT IN A10
CREATE PID_INDE,BULLET_FLASH
JRUC PFIREG_TRACER
PFIREG_NOFLASH
PFIREG_TRACER
CREATE PID_IND,TRACER_LAUNCH
MOVE @WAVETIME,A14,W
MOVE A14,*A2(PLASTLED),W ;MAKE UPDATE A CURRENT AFFAIR
DIE
**************************************************************************
* *
* CHECK_CHARHIT *
* *
* CHECK FOR A VALID HIT ON THE ALPHA-GRID *
* *
**************************************************************************
CHECK_CHARHIT
MMTM SP,A8,A9,A11
CLR A0
MOVY A3,A9
SRL 16,A9
CLR A11
MOVX A3,A11
CMPI HS_YMIN,A9
JRLO MISS_CHAR
CMPI HS_YMAX,A9
JRHI MISS_CHAR
CMPI HS_XMIN,A11
JRLO MISS_CHAR
CMPI HS_XMAX,A11
JRHI MISS_CHAR
CMPI HS_YBLANK,A9
JRLO HIT_CHAR
CMPI HS_XBLANK,A11
JRLO HIT_CHAR
CALLR PCOLL_SINGLE
MMFM SP,A8,A9,A11
RETS
HIT_CHAR
CALLA INITHIT ;VALID HIT
MISS_CHAR
MMFM SP,A8,A9,A11
RETS
*
*RECOIL COIL MASK TABLE
PRECOIL_TAB
.WORD P1_RECOIL,P2_RECOIL,P3_RECOIL
SND_PFIRE_MULTI
.WORD 0F104H,31,0A4ABH,0 ;Multi-channel gunshot
; .WORD 0F104H,82,0A106H,0 ;Multi-channel gunshot
SND_SUPER_GUN
.WORD 0F121H,50,0A4B1H,0 ;Super gun sound
*
*ANIMATION TO MAKE PLAYER SIGHT FLASH WHITE
*
SIGHT_ANIM
LWL 1,2|AFunc,A_OBJ_CNZ
LWL 1,1|AFunc,A_OBJON_PULL
**************************************************************************
* *
* A_OBJ_CNZ - ANIM FUNC TO MAKE AN OBJECT WRITE CONSTANT ON NON-ZERO *
* DATA. *
* *
**************************************************************************
A_OBJ_CNZ
MOVE *A8(OCTRL),A14,W
SRL 4,A14
SLL 4,A14
ORI DMACNZ,A14
MOVE A14,*A8(OCTRL),W
RETS
**************************************************************************
* *
* A_OBJON_PULL - ANIM FUNC TO TURN AN OBJECT ON NORMAL WRITE AND *
* PULL FROM ANIM. *
* *
**************************************************************************
A_OBJON_PULL
CALLA OBJ_ON_WNZ
JAUC PULL_ANIM
**************************************************************************
* *
* BULLET_FLASH - PROCESS TO CREATE AND FLASH A BULLET HIT. *
* A8 = PTR TO PLAYER DATA DOING THE FLASHING *
* A10 = PTR TO OBJECT THAT THIS BULLET WILL FLASH ON *
* *
**************************************************************************
BULLET_FLASH
MOVE *A10(OZVAL),A7,L ;PLACE FLASH ONTOP OF OBJECT
DEC A7
MOVI BFLASH0_INIT,A5
**************************************************************************
* *
* PROJECTILE_IMPACT - PROCESS ENTRYPOINT TO CREATE, ANIMATE, AND DELETE *
* A PLAYER PROJECTILE IMPACT. *
* A3 = [Y,X] POINT TO PLACE OBJECT UPON. *
* A5 = IMAGE INIT TABLE *
* A7 = OZVAL OF IMPACT IMAGE (Must be universe pos) *
* A8 = PTR TO PLAYER DATA AREA *
* A10 = PTR TO OBJECT THAT THIS BULLET WILL IMPACT *
* *
**************************************************************************
PROJECTILE_IMPACT
CALLA CREATE_OBJ
JAZ DUMDIE
MOVE A7,*A0(OZVAL),L
MOVE *A8(PCURSORXY),A1,L
MOVE A8,A2
MOVE A0,A8
CALLA SET_SCRN_POS
CALLA GET_POID
ORM A0,*A8(OID),W
CALLA RANDOM
ANDI M_FLIPH|M_FLIPV,A0 ;GET SOME RANDOM FLIP BITS
CALLA SET_FLPS
CALLA INSERT_OBJ
DIE
**************************************************************************
* *
* BFLASH DATA *
* *
**************************************************************************
*BULLET FLASH, INITIALIZATION TABLE
BFLASH0_INIT
.LONG bulit9,DUMCOLL
.WORD OID_JUNK,DMAWNZ,0,0
.LONG C_STRTANIM,BFLASH0_ANIM
*BULLET FLASH, ANIMATION SCRIPT, FOR USE ON ANIOBJS
BFLASH0_ANIM
; LW bulit9,4
LW 1,4
LW bulit10,4
LW bulit11,4
LWL 1,AFunc,DELETE_OBJ
**************************************************************************
* *
* PLASMA_LAUNCH - PROCESS TO LAUNCH A PLAYER PLASMA BALL *
* A8 = PTR TO PLAYER DATA AREA *
* *
**************************************************************************
PLASMA_LAUNCH
MOVI PLASMA_INIT,A5
CALLA CREATE_OBJ
JAZ DUMDIE
MOVE A8,A2
MOVE A0,A8
JRUC TL_G
**************************************************************************
* *
* TRACER_LAUNCH - PROCESS TO LAUNCH A PLAYER TRACER *
* A8 = PTR TO PLAYER DATA AREA *
* *
**************************************************************************
TRACER_LAUNCH
MOVE @NPLAYERS,A14,W
DEC A14
JRNZ TL_3P ;BR = This is a 3 player model
MOVI TAB_TRACER_2P,A1
JRUC TL_LOAD
TL_3P
MOVI TAB_TRACER_3P,A1
TL_LOAD
MOVE A8,A2
CALLA GPLAYNUM
SLL 5,A0
ADD A1,A0
MOVE *A0,A5,L
CALLA CREATE_OBJ
JAZ DUMDIE
MOVE A0,A8
TL_G
MOVIM PIZPOS+1,*A8(OZPOS),W
MOVE *A2(PCURSORXY),A6,L
MOVE A6,A7
MOVE *A2(PLAUNCHPOS),A3,L ;NOW WE HAVE A START POSITION
SUBXY A3,A7
MOVY A7,A5 ;KEEP Y DIFFERENCE
SEXT A7,W
SRA 1,A7
ADDXY A7,A3 ;ADJUST X TO MATCH YOUR GUN
CALLA OBJ_TO_PNT
CALLA INSERT_OBJ
MOVE A3,A2
MOVE A6,A3
MOVI TANIM_TICKS,A4
SRA 20,A5 ;USE Y DIFFERENCE TO ALTER
SUB A5,A4 ;FLIGHT TIME
CALLA SLINEVEL_LOAD
SLEEPR A4
CALLA DELETE_OBJ
DIE
*
* Tracer bullet animations
*
TAB_TRACER_3P
.LONG R_TRACER_INIT, Y_TRACER_INIT, B_TRACER_INIT
TAB_TRACER_2P
.LONG R_TRACER_INIT, B_TRACER_INIT, B_TRACER_INIT
R_TRACER_INIT
.LONG TRCR_R1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_SCRNOBJ|M_NOSCALE,0 ;NEED M_NOSCALE FOR ANIM
.LONG C_STRTANIM,TRACER_ANIM
B_TRACER_INIT
.LONG TRCR_B1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_SCRNOBJ|M_NOSCALE,0 ;NEED M_NOSCALE FOR ANIM
.LONG C_STRTANIM,TRACER_ANIM
Y_TRACER_INIT
.LONG TRCR_Y1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_SCRNOBJ|M_NOSCALE,0 ;NEED M_NOSCALE FOR ANIM
.LONG C_STRTANIM,TRACER_ANIM
*TRACER BULLET INITIALIZATION TABLE
;TRACER_INIT
; .LONG p1tracer1,DUMCOLL
; .WORD OID_JUNK,DMAWNZ,M_SCRNOBJ|M_NOSCALE,0 ;NEED M_NOSCALE FOR ANIM
; .LONG C_STRTANIM,TRACER_ANIM
TANIM_TICKS EQU 8 ;BASE DURATION OF TRACER ANIMATION
TRACER_ANIM
LW 1,1
LW TRCR_R2,1
LW TRCR_R3,1
LW TRCR_R4,1
LW TRCR_R5,1
LW TRCR_R6,1
LW TRCR_R7,1
LW TRCR_R8,2
LW TRCR_R9,2
LW TRCR_R10,2
LW TRCR_R11,2
LW TRCR_R12,2
LWL TRCR_R13,1|AFunc,PULL_ANIM
*PLASMA BALL INITIALIZATION TABLE
PLASMA_INIT
.LONG firebal1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_SCRNOBJ|M_NOSCALE,0
.LONG C_STRTANIM,PLASMA_ANIM
PLASMA_ANIM
LW 1,3
LW firebal2,3
LW firebal3,3
LW firebal4,3
LW firebal5,3
LW firebal6,3
LW firebal7,3
LW firebal8,3
LWL firebal9,1|AFunc,PULL_ANIM
**************************************************************************
* *
* PBOMB - PLAYER BOMB PROCESS. HANDLE SOUND AND DETECTION. *
* *A13(PROCID) =001S SSSS IIII 00PP new *
* 0010 0PPP IIII SSSS old *
* WHERE: *
* PPP = PLAYER # *
* IIII = ID (FIRE OR BOMB) *
* SSSS = SWITCH # *
* *
**************************************************************************
MIRV_CNT .EQU 3
OVERLOAD_MAX_ROCKETS .EQU 2 ;# of onscreen rockets during overload
PBOMB
INCM @SWITCH_ESCAPE,W ;GLOBAL SWITCH ESCAPE
MOVE @PAUSE_GAME,A14,W ;GAME PAUSED?
JRNZ PBOMB_DIE ;BR = YES
MOVE @GUNS_OFF,A14,W ;Are the guns turned off?
JRNZ PBOMB_DIE ;BR = Yes, then no bombing
MOVE @GAME_STATE,A0,W
CMPI INPLAY,A0
JREQ PBOMB_GO
CMPI INDIAG,A0
JRNE PBOMB_DIE
PBOMB_GO
CALLR EXTRACT_PLAYERD
MOVE *A2(POBJ),A8,L
JRZ PBOMB_DIE
MOVB *A2(PROCKCNT),A0
MOVE @OVERLOADED,A14,W
JRZ PBOMB_NORMAL_LOAD
; CALLR OVERLOAD_CHECK
; JRZ PBOMB_NORMAL_LOAD
CMPK OVERLOAD_MAX_ROCKETS,A0 ;Too many rockets for overload?
JRLO PBOMBS_AWAY ;BR = No, you may let it go
JRUC PBOMB_DIE
PBOMB_NORMAL_LOAD
MOVE @CURPLYRS,A14,W ;Get current number of players playing
JRNZ PBNL_PLAYERS ;BR = Players are playing
INC A14 ;Protect against underflow
PBNL_PLAYERS
DEC A14
SLL 30,A14
SRL 27,A14
ADDI TAB_MAX_ROCKETS,A14 ;Base the max allowed on the players
MOVB *A14,A14
CMP A14,A0 ;Enuff rockets on screen?
JRHS PBOMB_DIE ;BR = Yes, no more yet
PBOMBS_AWAY
; CLR A9
MOVK RTYPE_CD,A9
MOVE *A2(PBOMB2),A0,W
JRZ CK_PBOMB1
DECM *A2(PBOMB2),W
MOVK RTYPE_LD,A9
JRUC MASTER_MIRV
MOVE A2,A8
CREATE PID_INDE,ROCKET_LAUNCH
MOVI PLAUNCH_SND_TAB,A0
CALLA PLAYER_SND
SLEEP 1
; SOUND1 PMIRV_SND
; SOUND1 PLAUNCH2_SND
JRUC REVCO
MIRV_THING
DEC A0
MOVE A0,*A2(PBOMB2),W
*FIRING A MIRV MISSLE HERE
MOVK MIRV_CNT,A6 ;THIS MANY MIRVS
MOVI PID_INDE,A1
MOVI MIRV_LAUNCH,A7
MOVK 10,A10 ;INITIAL MIRV SLEEP TIME
MOVE A2,A11 ;PASS PLAYER INFO
MOVE @(SUPPLSTS+2*020H),A8,L ;ENEMIES
JRZ MIRV_DUMP ;BR = JUST DUMP THE MIRVS
MIRV_SEARCH
MOVE *A8(OGUNVECT),A14,L ;DOES HE WANT TO BE SHOT
JRZ MIRV_NXT ;BR = NO
MOVE *A8(OPART1),A14,L ;HEAD OR SOLO OBJECT?
JRZ MIRV_GO ;BR = SOLO
CMP A14,A8
JRNE MIRV_NXT ;BR = NOT HEAD
MIRV_GO
MOVB *A8(OFLAGS+B_DEAD-7),A14 ;IS THIS OBJECT DEAD?
JRN MIRV_NXT ;BR = YES
CALLA SCRTST ;IS THIS OBJECT ON SCREEN?
JRNZ MIRV_NXT ;BR = NAY
CALLA GETPRC
ADDK 10,A10
DEC A6 ;ONE LESS TO LAUNCH
JRZ MASTER_MIRV ;BR = ONE LESS MEANS NO MORE
MIRV_NXT
MOVE *A8(OSLINK),A8,L
JRNZ MIRV_SEARCH
*DUMP ANY EXTRA MIRVs HERE
*A6 > 0 A MUST
MIRV_DUMP
CMPI MIRV_CNT,A6 ;DID WE DISPATCH ANY MIRVS?
JRHS NO_MIRVS ;BR = NO
JRUC MASTER_MIRV
NO_MIRVS
INCM *A2(PBOMB2),W ;RESTORE THE MIRV
JRUC MASTER_MIRV
CK_PBOMB1
MOVE *A2(PBOMB1),A0,W ;DEFAULT SPECIAL WEAPON
JRNZ FIRE_PBOMB1 ;BR = FIRE IT
;*MAKE EMPTY CLICK FOR SHOTGUN IF WE ARE IN PRESENT DAY
; MOVE @WAVE,A14,W
; CMPI PRESENT_WAVE,A14
; JRLO PBOMB_DIE
; SOUND1 SHOTGUN_EMPTY_SND
JRUC PBOMB_DIE
*FIRE THE WEAPON WE OWN
FIRE_PBOMB1
.if BILL=0
DEC A0
.else
DEC A0
.endif
MOVE A0,*A2(PBOMB1),W
MOVI SND_PCD_MULTI,A0
CALLA ONESND
jruc PB_Fire
MASTER_MIRV
MOVI SND_PLD_MULTI,A0
CALLA ONESND
PB_Fire
MOVE A2,A8 ;KEEP FOR SLEEPS
CALLA P_LED_OFF
CREATE PID_INDE,ROCKET_LAUNCH
CREATE PID_IND,DELAYED_LED_ON
SLEEP 1
; SOUND1 PMIRV_SND
; SOUND1 PLAUNCH2_SND
REVCO
MOVE A8,A2
*A2 = PLAYER SHOOTING THIS BOMB
CALLA OUT_BOMBS
INCM *A2(PROCKSFIRED),W ;CLICK ANOTHER
PBOMB_DIE
DIE
*
* Table of max onscreen rockets per player per curplyrs.
* (i.e. Value for 1 player, 2 players, etc.)
*
TAB_MAX_ROCKETS
; .BYTE 3,2,2,1
.BYTE 4,4,3,1
**************************************************************************
* *
* DELAYED_LED_ON *
* *
* Process to turn on the players LED after a brief delay. *
* LED is turned on only if player has bombs. *
* *
* A8 = Ptr to player *
* *
**************************************************************************
DELAYED_LED_ON
SLEEP 6
MOVE *A8(PBOMB1),A14,W
JRNZ DLE_ON
MOVE *A8(PBOMB2),A14,W
JRNZ DLE_ON
MOVE A8,A2
CALLA P_LED_OFF
DIE
DLE_ON
MOVE A8,A2
CALLA P_LED_ON
DIE
**************************************************************************
* *
* MIRV_LAUNCH - PROCESS TO LAUNCH A MIRV ROCKET AT AN OBJECTS CENTER. *
* IF THERE IS NO OBJECT, THEN WE GO RANDOM. *
* A8 = OBJECT TO HIT (0 = NO OBJECT) *
* A10 = SLEEP TIME BEFORE FIRING *
* A11 = PTR TO PLAYER FIRING *
* *
**************************************************************************
MIRV_LAUNCH
MOVE A10,A10
JRZ ML_NOS
SLEEPR A10
ML_NOS
MOVI ROCKET_INIT,A5
CALLA CREATE_OBJ
JAZ DUMDIE
MOVE A0,A9 ;STORE ROCKET OBJECT HERE
MOVIM PIZPOS+1,*A0(OZPOS),W
MOVE A11,*A0(OPLAYER),L ;KEEP PLAYER INFO
CLR A6
; MOVB A6,*A9(RL_TARGET_PLANE) ;CLEAR BLOW UP PLANE #
; MOVB A6,*A9(RL_BGND_FLAG) ;CLEAR BACKGROUND FLAG
MOVIM RANIM_TICKS,*A9(RL_DURATION),W ;DEFAULT DURATION
MOVKB 1,*A9(RL_TYPE) ;IS A MIRV
MOVE A11,A2 ;PLACE THE PLAYER DATA
; SOUND1 PMIRV_SND
; SOUND1 PLAUNCH2_SND
MOVE A8,A8
JRZ ML_RAND
**** MOVI PLOCKON_SND_TAB,A0
**** CALLA PLAYER_SND
CALLR GET_MULTI_CPNT ;GET THAT NEW CENTER POINT
; MOVB *A8(OPLANE),A5 ;PASS THE PLANE
MOVE A5,A1
; CALLA PNT_SCRNREL ;MAKE THE POINT SCREEN RELATIVE
MOVE A8,A0
JRUC RL_TARGET_OKD
ML_RAND
MOVI SCRLFT,A0
MOVI SCRRGT,A1
CALLA RANGERND
MOVE A0,A3
MOVI SKYTOPOF,A0
MOVI SCRBOT,A1
CALLA RANGERND
SLL 16,A0
MOVY A0,A3
MOVE A8,A0
JRUC RL_SKIP_TARG
**************************************************************************
* *
* GET_MULTI_CENT - GET THE CENTER POINT OF A MULTI PART OBJECT. *
* A8 = PTR TO ANY PART. *
* RETURNS *
* A3 = CENTER POINT *
* *
**************************************************************************
GET_MULTI_CPNT
MMTM SP,A0,A1,A2,A8
MOVE *A8(OPART1),A0,L
JRNZ GMC_HEAD
MOVE *A8(OXPOS),A3,W
MOVE *A8(OYPOS),A14,W
SLL 16,A14
MOVY A14,A3
MOVE A3,A2
MOVE *A8(OSIZE),A14,L
ADDXY A14,A2
JRUC GMC_CALC_CENT
GMC_HEAD
MOVE A0,A8
MOVI 7FFF7FFFH,A3 ;THESE ARE THE STORES
CLR A2
GMC_LP
MOVE *A8(OXPOS),A1,W
MOVE *A8(OYPOS),A14,W
SLL 16,A14
MOVY A14,A1
CMPXY A3,A1 ;TEST UPPER LEFTS
JRXGT GMC_NONEW_ULX ;BR = X NOT LOWER
MOVX A1,A3
GMC_NONEW_ULX
JRYGT GMC_NONEW_ULY ;BR = Y NOT LOWER
MOVY A1,A3
GMC_NONEW_ULY
MOVE *A8(OSIZE),A14,L
ADDXY A14,A1
CMPXY A2,A1 ;TEST LOWER RIGHTS
JRXLT GMC_NONEW_LRX ;BR = X NOT HIGHER
MOVX A1,A2
GMC_NONEW_LRX
JRYLT GMC_NONEW_LRY ;BR = Y NOT HIGHER
MOVY A1,A2
GMC_NONEW_LRY
MOVE *A8(OPARTS),A8,L
JRNZ GMC_LP
GMC_CALC_CENT
SUBXY A3,A2 ;GET THE DIFF
HALFXY A2 ;MAKE IT HALF
ADDXY A2,A3 ;ADD IT BACK
MMFM SP,A0,A1,A2,A8
RETS
PLAUNCH_SND_TAB
.LONG SND_P1LAUNCH,SND_P2LAUNCH
SND_P1LAUNCH
.WORD 0F125H,30,08086H,0 ;ROCKET LAUNCH SOUND PLAYER 1
SND_P2LAUNCH
.WORD 0F225H,30,08087H,0 ;ROCKET LAUNCH SOUND PLAYER 2
;PCD_SND_TAB
; .LONG SND_P1CD,SND_P2CD
;SND_P1CD
; .WORD 0F126H,60,0808EH,0 ;CD LAUNCH SOUND PLAYER 1
;SND_P2CD
; .WORD 0F226H,60,0808FH,0 ;CD LAUNCH SOUND PLAYER 2
SND_PCD_MULTI
.WORD 0F126H,70,0A4AEH,0 ;Multi-channel player CD sound
SND_PLD_MULTI
.WORD 0F127H,101,0A490H,0 ;Multi-channel player LD sound
;PMIRV_SND
; .WORD 0F030H,40,080C1H,0 ;MIRV LAUNCH SOUND
;PBOMB_SND_TAB
; .LONG SND_P1BOMB,SND_P2BOMB
;SND_P1BOMB
; .WORD 0F126H,60,08384H,0 ;BOMB SOUND PLAYER 1
;SND_P2BOMB
; .WORD 0F226H,60,08385H,0 ;BOMB SOUND PLAYER 2
SND_PBOMB
.WORD 0F126H,60,0A384H,0 ;Player generic bomb explode sound
;SHTGUN_SND_TAB
; .LONG SHTGUN1_SND,SHTGUN2_SND,SHTGUN2_SND
;SHTGUN1_SND
; .WORD 0F425H,60,080D3H,0 ;SHOTGUN SOUND PLAYER 1
;SHTGUN2_SND
; .WORD 0F525H,60,080EFH,0 ;SHOTGUN SOUND PLAYER 2
;SHOTGUN_EMPTY_SND
; .WORD 0F220H,20,08097H,0 ;SHOTGUN EMPTY CLICK
;PLAUNCH2_SND
; .WORD 0F220H,30,080C7H,0 ;ROCKET LAUNCH, YAMAHA PART
;PLOCKON_SND_TAB
; .LONG P1LOCKON_SND,P2LOCKON_SND
;P1LOCKON_SND
; .WORD 0F126H,10,083D7H,0 ;PLAYER 1 LOCK ON SOUND
;P2LOCKON_SND
; .WORD 0F226H,10,083D7H,0 ;PLAYER 2 LOCK ON SOUND
;PGRENADE_SND_TAB
; .LONG P1GRENADE_SND,P2GRENADE_SND,P2GRENADE_SND
;P1GRENADE_SND
; .WORD 0F425H,30,08031H,0 ;GRENADE SOUND PLAYER 1
;P2GRENADE_SND
; .WORD 0F525H,30,08036H,0 ;GRENADE SOUND PLAYER 2
**************************************************************************
* *
* ROCKET_LAUNCH - PROCESS TO LAUNCH A PLAYER ROCKET *
* A8 = PTR TO PLAYER DATA AREA *
* A9 = ROCKET TYPE *
* *
**************************************************************************
RVELEXP EQU 12 ;ROCKET VELOCITY EXPONENT
RTYPE_INITS
.LONG ROCKET_INIT,CD_INIT,LD_INIT
ROCKET_LAUNCH
MOVE A9,A14
SLL 5,A14
ADDI RTYPE_INITS,A14
MOVE *A14,A5,L ;GET INIT TABLE ADDRESS
CALLA CREATE_OBJ
JAZ DUMDIE ;BR=WHOOPS! CAN'T DO IT.
MOVB A9,*A0(RL_TYPE) ;SAVE TYPE
; MOVI 08010801H,A14 ;SET Z DEPTH FOR COLLISION
; MOVI 00400040H,A14 ;SET Z DEPTH FOR COLLISION
; MOVI 00e000e0H,A14 ;12/18/93 (Warren)
MOVI 01C001C0H,A14 ;2/1/94 (ill)
MOVE A14,*A0(OZDEPTH),L
MOVE A0,A9 ;STORE ROCKET OBJECT HERE
move @ZBASE,a14,L
addi ZMAX_REAL,a14
move a14,*A0(OZVAL),L
MOVE A8,*A0(OPLAYER),L ;KEEP PLAYER INFO
CLR A6
MOVE A6,*A9(RL_GROUND_Z),L
MOVB A6,*A9(RL_SHOTGUN) ;SNOT A SHOTGUN
MOVIM RANIM_TICKS,*A9(RL_DURATION),W ;DEFAULT DURATION
MOVE *A8(PCURSORXY),A3,L
MOVE A3,A10
MOVE A8,A2 ;A MOST COOL SPOT FOR PDATA
CALLR ROCKET_COLL ;SEE IF WE LOCKED_ON
MOVE A0,*A9(RL_INTENDED_OBJ),L ;Store ptr to intended object
JRNZ RL_TARGET_OKD ;BR = Yes, Lock Dude! Lock!
; MOVE @ZFAR,A5,L
MOVI 039000H,A5 ;FARTHEST Z DISTANCE IN SPACE
MOVE A10,A3 ;TRANSLATE Y SCREEN TO UNIVERSE
SRA 16,A3
MOVE A3,A6
TOWORLDY A5,A3
MOVE @YBASE,A14,L
SUB A14,A3
move @ZBASE,a11,L
MOVE @HORIZON,A14,W
CMP A14,A6
JRLO RL_GRND_X ;BR=ABOVE THE HORIZON
MOVE @YWORLD,A3,L ;GET UNIVERSE Y TO GROUND
MOVE A3,A5
ZFROMY A6,A5 ;GET Z AT GROUND Y
add a11,a5
MOVE A5,*A9(RL_GROUND_Z),L
SUB a11,a5
RL_GRND_X
MOVE A10,A1 ;GET UNIVERSE X
SEXT A1,W
TOWORLDX A5,A1
MOVE @XBASE,A14,L
ADD A14,A1
MOVE A1,*A9(RL_GROUND_X),L
ADD a11,a5 ;TRANSLATE Z WORLD TO UNIVERSE
JRUC RL_SKIP_TARG
;; MOVE B0,B0 ;DID WE LOCK ON A FOREGROUND
;; JRNZ RL_NO_LOCKON_SOUND_YET ;BR = NO
;
; MOVE A0,A1
; MOVI PLOCKON_SND_TAB,A0
;; CALLA PLAYER_SND
;**** SOUND1 PLOCKON_SND ;PARTY SOUND
; MOVE A1,A0
; JRUC RL_NO_LOCKON_SOUND
;RL_NO_LOCKON_SOUND_YET
;
;; MOVKB 1,*A9(RL_BGND_FLAG)
; MOVE *A0(OZVAL),A14,W ;DESTRUCTIBLE BACKGROUND?
;; MOVE A14,*A9(RL_BGND_Z),W ;STORE HERE FOR EXPLODE
; JRZ RL_NO_LOCKON_SOUND
;*TARGETED A BG BLOCK THAT WILL REACT TO A ROCKET HIT, SO TAKE BACKGROUND
; MOVE A0,A1
; MOVI PLOCKON_SND_TAB,A0
;; CALLA PLAYER_SND
;**** SOUND1 PLOCKON_SND ;PARTY SOUND
; MOVE A1,A0
;
;; MOVB *A0(OPLANE),A5
;; JRUC RL_TARGET_OKD
;*TARGETED A BACKGROUND BLOCK THAT ISN'T AFFECTED BY ROCKETS, SO TAKE FOREGROUND
;RL_NO_LOCKON_SOUND
;; CALLR GET_MATCHING_FGND ;DID WE FIND AN O.K. PLANE?
;; JRC RL_TARGET_OKD ;BR = SURE'NUFF
;; CLR A0
;; JRUC RL_SKIP_TARG
;*
;*COME HERE DARLING, WHEN YOU ARE READY TO SEEK AND DESTROY
;*A2 = PTR TO PLAYER
;*A3 = [Y,X] SCREEN TARGET
;*A5 = TARGET PLANE
RL_TARGET_OKD
;; MOVB A5,*A9(RL_TARGET_PLANE)
;;*CALCULATE A COMPARABLE ROCKET DURATION
;; MOVE A5,A6
;; SUBK 7,A6
;; JRN RL_ABS_DUR
;; CLR A6
;RL_ABS_DUR
;; ABS A6
;; SLL 1,A6
;; MOVI RANIM_TICKS,A14
;; SUB A6,A14
;; MOVE A14,*A9(RL_DURATION),W
MOVE A0,A6 ;SAVE 'DAT OBJECT
*CREATE A TARGET SIGHT
*A2 = PTR TO PLAYER DATA
*A10 = [Y,X] SCREEN POINT TO HIT
RL_SIGHT_CREATE
; MOVI PLOCKON_SND_TAB,A0
; CALLA PLAYER_SND
MOVI RTARGET_INIT,A5 ;CREATE TARGET OBJECT
CALLA CREATE_OBJ
JRZ RL_SKIP_TARG ;BR = VE HAVE TO SKEEP
MOVE A6,*A0(SIGHT_TARGET_OBJ),L
MOVE A9,*A0(SIGHT_ROCKET_OBJ),L
MOVE *A6(OZVAL),A5,L ;PLACE SIGHT IN FRONT
DEC A5
MOVE A5,*A0(OZVAL),L
MOVE A10,A1
CALLA SET_SCRNPOS ;SET SIGHT AT CURSOR
CALLA INSOBJ
MOVE *A6(OXVAL),A4,L ;GET TARGET-SIGHT X OFFSET
MOVE *A0(OXVAL),A1,L
MOVE A1,A14
SUB A4,A14
MOVE A14,*A0(SIGHT_X_OFFSET),L
MOVE *A6(OYVAL),A4,L ;GET TARGET-SIGHT Y OFFSET
MOVE *A0(OYVAL),A3,L
MOVE A3,A14
SUB A4,A14
MOVE A14,*A0(SIGHT_Y_OFFSET),L
*
*A0 = PTR TO TARGET SIGHT OBJECT (0 = NOTHING TARGETED)
*A2 = PTR TO PLAYER DATA
*A10 = [Y,X] SCREEN POINT TO HIT
*
RL_SKIP_TARG
MOVE A9,A8 ;NOW LET'S MESS WITH THE ROCKET
MOVE A0,*A8(RL_TARGET_OBJ),L
MOVE A0,A4
MOVB *A2(PROCKCNT),A14
INC A14
MOVB A14,*A2(PROCKCNT)
MOVB *A8(RL_TYPE),A14
JRNZ RL_PALOK ;BR=THIS IS THE CD (TEMPORARY)
CMPI P1DATA,A2 ;IS THIS PLAYER ONE?
JREQ RL_PALOK ;BR = NO
MOVE A8,B0
MOVE *A2(PPALID),A0,L
MOVE A0,B1
CALLA CHANGE_PAL ;CHANGE TO THE CORRECT PALETTE
MOVE *A8(RL_TARGET_OBJ),A8,L
JRZ RL_NO_SIGHT_PAL_CHANGE
MOVE B1,A0
CALLA CHANGE_PAL ;SIGHT MUST HAVE CORRECT PAL
RL_NO_SIGHT_PAL_CHANGE
MOVE B0,A8
RL_PALOK
CALLA GET_POID
ORM A0,*A8(OID),W
MOVE A4,A0
MOVE *A2(PLAUNCHPOS),A9,L ;NOW WE HAVE A START POSITION
SRA 16,A9 ;GET Y START
MOVE @YHALF,A14,W ;TRANSLATE SCREEN TO WORLD
SUB A14,A9
MOVI ZMAX_REAL,A14
SETF 16,1,1
MPYS A14,A9
SETF 32,1,1
MOVE @YBASE,A14,L ;TRANSLATE TO UNIVERSE
SUB A14,A9
MOVE A9,A4
MOVE A4,*A8(OYVAL),L ;STARTING UNIVERSE Y
MOVE *A2(PRLAUNCHX),A2,W
SLL 8,A2 ;UNPACK WORLD X COORDINATE
MOVE @XBASE,A14,L ;TRANSLATE TO UNIVERSE
ADD A14,A2
MOVE A2,*A8(OXVAL),L ;STARTING UNIVERSE X
MOVE *A8(OZVAL),A14,L
SUB A14,A5 ;GET Z DISTANCE
SRA RVELEXP,A5 ;DIVIDE BY Z VELOCITY
MOVE A0,A0
JRNZ RL_TARG ;BR = TARGET, ADD TIME
MOVE A5,A5
JRNZ RL_TIMEOK ;BR = NO TARGET, NONZERO TIME
RL_TARG
INC A5
RL_TIMEOK
MOVE A5,*A8(RL_DURATION),W
* A1 = PNT. B X POSITION (32 BITS) *
* A2 = PNT. A X POSITION (32 BITS) *
* A3 = PNT. B Y POSITION (32 BITS) *
* A4 = PNT. A Y POSITION (32 BITS) *
* A5 = DURATION(# OF TICKS TO GET FROM A TO B) *
CALLA SLINEVEL_LOAD_2D
MOVI 1 << RVELEXP,A14
MOVE A14,*A8(OZVEL),L ;SET Z VELOCITY
MOVE @WAVEIRQS,A14,L
MOVE A14,*A8(RL_LAUNCH_TIME),L ;STORE AWAY TIME OF LAUNCH
CALLA INSERT_OBJ
DIE
*ROCKET BOMB INITIALIZATION TABLE
ROCKET_INIT
CD_INIT
.LONG GXCD1,DUMCOLL
.WORD OID_PROCKET,DMAWNZ,M_OFSCRN,0
.LONG C_STRTANIM
.LONG CD_ANIM
LD_INIT
.LONG GXLD1,DUMCOLL
.WORD OID_PROCKET,DMAWNZ,M_OFSCRN,0
.LONG C_STRTANIM
.LONG LD_ANIM
RANIM_TICKS EQU 28 ;TOTAL DURATION OF ROCKET ANIMATION IN TICKS
LD_ANIM
LWL 1,1|AFunc,A_CREATE_FLAME_TAIL
CD_ANIM
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,2|AFunc,A_ROCKET_UPDATE
LWL 1,1|AFunc,RU_DONE
**************************************************************************
* *
* A_CREATE_FLAME_TAIL *
* *
* Anim func to create the flame tail and tack it on to the *
* LD. *
* *
* A8 = Ptr to the Lazer Disc *
* *
**************************************************************************
A_CREATE_FLAME_TAIL
CALLA CREATE_COPY ;Copy the Lazer Disc
JRZ ACFT_X
MOVIM OID_JUNK,*A0(OID),W
CALLA COLLSOFF ;Collisions off
ORIM M_NOPARTANI,*A0(OFLAGS),W
MOVI ANIM_FLAME_TAIL,A1
CALLA STRTANIM
CALLA INSPART
CALLA INSOBJ
ACFT_X
RETS
ANIM_FLAME_TAIL
LWLL FLMTAIL1,5|AFunc,A_CHANGE_PAL+2,P_LDTAIL
AFT_LOOP
LW FLMTAIL2,5
LW FLMTAIL3,5
LWLL FLMTAIL1,5|AFunc,A_AnimFrm+2,AFT_LOOP
**************************************************************************
* *
* A_ROCKET_UPDATE *
* *
* Anim func to keep the rocket on path to it's target. *
* *
* A8 = Ptr to rocket obj. *
* *A8(RL_TARGET_OBJ),L = Target we are tracking *
* *A8(RL_LAUNCH_TIME),L = WAVEIRQS at time of launch *
* *A8(RL_TYPE) = Projectile type *
* AARG+,W = Smoke trail type (0 = none) *
* *
**************************************************************************
A_ROCKET_UPDATE
; CALLA GETAFARG_WORD ;PULL AN ARGUMENT
;
; SLL 5,A0
; MOVB *A8(RL_TYPE),A14
; JRZ RU_SHMOKE_BOMB
; ADDI FIRE_TABLE,A0
; JRUC RU_TRAIL
;RU_SHMOKE_BOMB
; ADDI SMOKE_TABLE,A0
;RU_TRAIL
; MOVE *A0,A5,L
* A1 = PNT. B X POSITION (32 BITS) *
* A2 = PNT. A X POSITION (32 BITS) *
* A3 = PNT. B Y POSITION (32 BITS) *
* A4 = PNT. A Y POSITION (32 BITS) *
* A5 = DURATION(# OF TICKS TO GET FROM A TO B) *
MOVE *A8(RL_GROUND_Z),A0,L
JRZ RU_NOGROUND ;BR=GROUND IS NOT THE TARGET
MOVE *A8(OYVAL),A14,L
MOVE @YWORLD,A1,L
CMP A1,A14
JRLT RU_BLOW_SMOKE ;BR=NOT BELOW THE GROUND Y
; MOVE *A8(OZVAL),A14,L
; CMP A0,A14
; JRLT RU_BLOW_SMOKE
MOVE *A8(RL_GROUND_X),*A8(OXVAL),L ;IMPACT ON THE GROUND
MOVE @YWORLD,A14,L
MOVE A14,*A8(OYVAL),L
MOVE A0,*A8(OZVAL),L
CALLA PSTOP
JRUC RU_NO_TARGET
RU_NOGROUND
MOVE *A8(RL_LAUNCH_TIME),A1,L ;CHECK TIME SINCE LAUNCH
MOVE @WAVEIRQS,A2,L
SUB A1,A2
MOVE *A8(RL_DURATION),A5,W
SUB A2,A5
JRLE RU_DONE ;BR=EXCEEDED MAX TIME. BYE, BYE!
MOVE *A8(RL_TARGET_OBJ),A0,L
JRZ RU_BLOW_SMOKE ;BR=NO OBJECT TARGETED
MOVE *A0(OZVAL),A2,L ;CHECK Z POSITION
MOVE *A8(OZVAL),A4,L
CMP A2,A4
JRGE RU_DONE ;BR=BEHIND THE OBJECT
MOVE *A8(OXVAL),A2,L
MOVE *A8(OYVAL),A4,L
MOVE *A0(OXVAL),A1,L
MOVE *A0(OYVAL),A3,L
CALLA SLINEVEL_LOAD_2D ;UPDATE X, Y VELOCITIES
RU_BLOW_SMOKE
; MOVB *A8(RL_TYPE),A14
; JRZ RU_DO_SMOKE ;BR=NOT THE CD
MOVE *A8(OCTRL),A14,W
XORI M_FLIPH,A14 ;FLIP CD
MOVE A14,*A8(OCTRL),W
RETS
;RU_DO_SMOKE
; CALLA GETAFARG_WORD ;PULL AN ARGUMENT
; JRZ RU_SKIP_SMOKE ;BR=NO SMOKE THIS TIME
;
; MOVI smoke1e_INIT,A5
; CALLA CREATE_OBJ
; JRZ RU_SKIP_SMOKE ;BR=CAN'T MAKE SMOKE
; MOVE *A8(OXVAL),*A0(OXVAL),L
; MOVE *A8(OYVAL),*A0(OYVAL),L
; MOVE *A8(OZVAL),A14,L
; DEC A14
; MOVE A14,*A0(OZVAL),L
; CALLA INSOBJ
;RU_SKIP_SMOKE
; RETS
*ROCKET IS DONE TRAVELING, MAKE IT EXPLODE OR DELETE
RU_DONE
MOVE *A8(RL_TARGET_OBJ),A0,L ;DID WE HAVE A TARGET?
JRNZ RU_EXPLODE ;BR = NO, JUST CRUISE
CALLR DELETE_ROCKET
RETS
RU_EXPLODE
MOVE A0,A9 ;SAVE THIS POINTER
MOVE *A0(OXVAL),*A8(OXVAL),L ;MOVE ROCKET TO SIGHT POSITION
MOVE *A0(OYVAL),*A8(OYVAL),L
MOVE *A0(OZVAL),*A8(OZVAL),L
CALLA DELOBJ ;WASTE THE SIGHT (TARGET)
MOVE *A9(SIGHT_TARGET_OBJ),A0,L
JRNZ RU_MATCH_TARGET ;BR=NO TARGET, IMPACT ON GROUND
CALLA PSTOP ;STOP THAT ROCKET
JRUC RU_NO_TARGET
RU_MATCH_TARGET
MOVE *A0(OZVAL),A14,L ;PLACE IN FRONT OF OBJECT
SUBI 080H,A14
MOVE A14,*A8(OZVAL),L
MOVE *A0(OPART1),A14,L
JRZ RU_GOT_HEAD ;BR=WE HAVE THE OBJECTS HEAD
MOVE A14,A0
RU_GOT_HEAD
MOVE *A0(OXVEL),*A8(OXVEL),L ;GIVE ME THE VELOCITY DUDE
MOVE *A0(OYVEL),*A8(OYVEL),L
MOVE *A0(OZVEL),*A8(OZVEL),L
RU_NO_TARGET
MOVE *A8(OFLAGS),A14,W ;PLACE OFF SCREEN TO CHANGE
ORI M_OFSCRN,A14
MOVE A14,*A8(OFLAGS),W
MOVI REXPLO,A0
CALLA CHANGE_PAL
MOVE *A8(OPARTS),A0,L
JRNZ RU_TAIL_TO_EXPLO
CALLA CREATE_COPY ;GET OTHER HALF OF EXPLOSION
JRNZ RU_START_EXP
CALLR DELETE_ROCKET ;NOT AVAIL. NO EXPLOSION
RETS
RU_START_EXP
MOVE *A8(OCVECT),*A0(OCVECT),L ;STUFF VECTORS AND INSERT
MOVE *A8(OGUNVECT),*A0(OGUNVECT),L
CALLA INSPART
CALLA INSOBJ
MOVI hEXPA_ANIM,A1 ;GO BOOM!
CALLA STRT_ANIM
MOVE *A0(OCTRL),A14,W ;FLIP OTHER HALF
XORI M_FLIPH,A14
MOVE A14,*A0(OCTRL),W
RETS
*
* Come here when projectile already has a second part
* A0 = Ptr to second part
*
RU_TAIL_TO_EXPLO
CALLA CKPULLANIM
PUSH A8
MOVE A0,A8
MOVE *A8(OFLAGS),A14,W ;PLACE OFF SCREEN TO CHANGE
ORI M_OFSCRN,A14
MOVE A14,*A8(OFLAGS),W
MOVI REXPLO,A0
CALLA CHANGE_PAL
MOVE A8,A0
PULLQ A8
MOVE *A8(OCVECT),*A0(OCVECT),L ;STUFF VECTORS AND INSERT
MOVE *A8(OGUNVECT),*A0(OGUNVECT),L
MOVE *A8(OZVAL),*A0(OZVAL),L
MOVE *A8(OXVAL),*A0(OXVAL),L
MOVE *A8(OYVAL),*A0(OYVAL),L
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRNZ RTTE_CLR_FLIP
ORIM M_FLIPH,*A0(OCTRL),W
JRUC RTTE_CONT
RTTE_CLR_FLIP
ANDNIM M_FLIPH,*A0(OCTRL),W
RTTE_CONT
ANDNIM M_NOPARTANI|M_NOCOLL,*A0(OFLAGS),W
MOVE *A8(OID),A1,W
CALLA CHANGEOID
MOVI hEXPA_ANIM,A1 ;GO BOOM!
JAUC STRT_ANIM
**************************************************************************
* *
* DELETE_ROCKET - ROUTINE TO DELETE THE PLAYERS ROCKET BOMB. *
* A8 = PTR TO ROCKET OBJECT. *
* *A8(OPLAYER),L = PTR TO PLAYER DATA (0 = NO PLAYER INVOLVED?) *
* *
**************************************************************************
DELETE_ROCKET
PUSH A2
MOVE *A8(OPLAYER),A2,L
JRZ DR_NOP
MOVB *A2(PROCKCNT),A14
JRZ DR_NOP
DEC A14
MOVB A14,*A2(PROCKCNT)
DR_NOP
PULLQ A2
JAUC DELETE_OBJ
**************************************************************************
* *
* A_CHANGE_POID - ANIM FUNC TO CHANGE OID OF AN OBJECT OWNED BY A *
* PLAYER (I.E. IT PRESERVES THE PLAYER FIELD). *
* A0 = NEW OBJECT I.D. FOR CHANGE_POID *
* A8 = PTR TO OBJECT *
* AARG+,W = NEW OBJECT I.D. *
* *
**************************************************************************
A_CHANGE_POID
CALLA GETAFARG_WORD
CHANGE_POID
MOVE *A8(OID),A14,W
ANDI MASK_PLAYER,A14
OR A14,A0 ;FORM NEW OID
MOVE A0,A1 ;Move to the proper place
JAUC CHANGE_OID ;NOW CHANGE TO THE NEW ONE
**************************************************************************
* *
* BOG_CHECK - ANIMATION FUNC TO CHECK IF THE PROCESS SYSTEM IS *
* BOGGED. IF IT IS, THEN THE OBJECT WILL BE *
* DELETED. *
* *
**************************************************************************
BOG_CHECK
MOVE @CPUAVG,A14,W
CMPI 200,A14
JALS DELETE_OBJ
RETS
**************************************************************************
* *
* ROCKET_BOG_CHECK - ANIMATION FUNC TO CHECK IF THE PROCESS SYSTEM IS *
* BOGGED. IF IT IS, THEN THE ROCKET WILL BE *
* DELETED. *
* *
**************************************************************************
ROCKET_BOG_CHECK
MOVE @CPUAVG,A14,W
CMPI 200,A14
JRLS DELETE_ROCKET
RETS
**************************************************************************
* *
* A_BOMB_CLR_VEL - ANIM FUNC TO CLEAR THE BOMB VELOCITIES THEN *
* GIVE IT THE CURRENT SCROLLX *
* A8 = PTR TO BOMB EXPLOSION *
* *
**************************************************************************
;A_BOMB_CLR_VEL
; CALLA CLR_VEL
; MOVE @SCROLLX,A0,L
; MOVE A0,*A8(OXVEL),L
; RETS
**************************************************************************
* *
* A_UPDATE_EXPLO - UPDATE EXPLOSION VELOCITIES *
* A_UPDATE_EXPLO_AND_OID - UPDATE EXPLOSION VELOCITIES AND CHANGE *
* TO EXPLOSION OID *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_UPDATE_EXPLO_AND_OID
MOVI OID_PEXPLOSION,A0
CALLR CHANGE_POID
A_UPDATE_EXPLO
MOVE *A8(RL_INTENDED_OBJ),A0,L
JRZ AUE_DONE
MOVE *A0(OCTRL),A14,W
JRNN AUE_ABORT ;BR = OBJECT NOT ACTIVE
MOVE *A0(OPART1),A14,L
JRZ AUE_VEL
MOVE A14,A0
AUE_VEL
MOVE *A0(OXVEL),*A8(OXVEL),L ;GIVE ME THE VELOCITY DUDE
MOVE *A0(OYVEL),*A8(OYVEL),L
MOVE *A0(OZVEL),*A8(OZVEL),L
AUE_DONE
RETS
AUE_ABORT
CLR A14
MOVE A14,*A8(RL_INTENDED_OBJ),L
RETS
**************************************************************************
* *
* A_TEST *
* *
**************************************************************************
A_TEST
RETS
A_TEST2
RETS
**************************************************************************
* *
* SCRIPTS FOR PLAYER 50/50 EXPLOSION *
* *
**************************************************************************
*
*EXPLOSION SCRIPT FOR PLANE A 50/50 EXPLOSION
*
hEXPA_ANIM
; LWL REXPLOA1h,1|AMulti|AFunc,A_UPDATE_EXPLO
LW REXPLOA1h,1|AMulti
LW REXPLOA1h,3
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL REXPLOA3h,1|AMulti|AFunc,A_UPDATE_EXPLO
LWLL REXPLOA3h,1|AMulti|AFunc,A_SOUNDZ+2,SND_PBOMB
LW REXPLOA3h,3
; LWLL REXPLOA3h,3|AFunc,A_SOUNDZ+2,SND_PBOMB
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL REXPLOA4h,1|AMulti|AFunc,A_UPDATE_EXPLO_AND_OID
; LWL 1,1|AFunc,A_TEST
LWLW REXPLOA4h,1|AMulti|AFunc,A_CHANGE_POID+1,OID_PEXPLOSION
LWLW REXPLOA4h,3|AFunc,A_CHANGE_POID+1,OID_PEXPLOSION
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL REXPLOA5h,1|AMulti|AFunc,A_UPDATE_EXPLO
LW REXPLOA5h,1|AMulti
LW REXPLOA5h,3
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL REXPLOA6h,1|AMulti|AFunc,A_UPDATE_EXPLO
LW REXPLOA6h,1|AMulti
LW REXPLOA6h,3
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL REXPLOA8h,1|AMulti|AFunc,A_UPDATE_EXPLO
LW REXPLOA8h,1|AMulti
LW REXPLOA8h,3
; LWL 1,1|AFunc,A_TEST2
; LWL 1,1|AFunc,A_UPDATE_EXPLO
; LWL 1,1|AFunc,A_UPDATE_EXPLO
LWLW REXPLOA9h,1|AMulti|AFunc,A_CHANGE_POID+1,OID_JUNK
LWLW REXPLOA9h,3|AFunc,A_CHANGE_POID+1,OID_JUNK
LW REXPLOA10h,1|AMulti
LW REXPLOA10h,3
LWL REXPLOA11h,1|AMulti|AFunc,ROCKET_BOG_CHECK
LW REXPLOA11h,3
LW REXPLOA12h,1|AMulti
LW REXPLOA12h,3
LWL 1,1|AFunc,DELETE_ROCKET
*ROCKET BOMB TARGET INIT
RTARGET_INIT
.LONG p1roksight,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_NOSCALE,0
.LONG C_STRTANIM,RL_SIGHT_ANIM
RL_SIGHT_ANIM
LWL 1,1|AFunc,SIGHT_UPDATE
.LONG 0
**************************************************************************
* *
* SIGHT_UPDATE - ANIM FUNC FOR SIGHT THAT KEEPS THE SIGHT WITH *
* THE TARGETED OBJECT. *
* A8 = PTR TO SIGHT OBJECT *
* *A8(OPARTSXY),L = OFFSET FROM SIGHT UL TO TARGET ANI PNT *
* *A8(SIGHT_TARGET_OBJ),L = PTR TO TARGET OBJ *
* *
**************************************************************************
SIGHT_UPDATE
MOVE *A8(SIGHT_TARGET_OBJ),A0,L
JRZ SU_X
MOVE *A0(OCTRL),A4,W
JRN SU_DO ;BR = OBJECT ACTIVE
CLRM *A8(SIGHT_TARGET_OBJ),L
MOVE *A8(SIGHT_ROCKET_OBJ),A0,L
CLRM *A0(RL_INTENDED_OBJ),L ;Clear projectile pointer also
JRUC SU_X
SU_DO
MOVE *A0(OXVAL),A1,L
MOVE *A8(SIGHT_X_OFFSET),A3,L
ADD A1,A3 ;OFFSET X
MOVE A3,*A8(OXVAL),L
MOVE *A0(OYVAL),A1,L
MOVE *A8(SIGHT_Y_OFFSET),A3,L
ADD A1,A3 ;OFFSET Y
MOVE A3,*A8(OYVAL),L
MOVE *A0(OZVAL),A1,L ;KEEP IT IN FRONT
DEC A1
MOVE A1,*A8(OZVAL),L
SU_X
RETS
**************************************************************************
* *
* EXTRACT_PLAYERD - EXTRACT THE PLAYER NUMBER FROM THE CURRENT PROCESS *
* I.D. AND RETRIEVE A POINTER TO HIS DATA AREA. *
* A13 = PTR TO PLAYER SWITCH PROCESS *
* RETURNS *
* A0 = PLAYER # *
* A2 = PTR TO PLAYER DATA *
* *
**************************************************************************
EXTRACT_PLAYERD
MOVE *A13(PROCID),A0,W
SLL PNUM_SLL,A0
SRL PNUM_SRL,A0
DEC A0
JAUC GPLAYD ;GET THE PLAYERS DATA AREA
**************************************************************************
* *
* PLAYER_RECOIL_OFF - ROUTINE TO TURN A PLAYERS RECOIL OFF. *
* A2 = PTR TO PLAYER DATA AREA *
* *
**************************************************************************
PLAYER_RECOIL_OFF
PUSH A0
CALLR GET_PLAYER_COIL
MOVI COIL_OFF_TIME,A14
SLL 16,A14
MOVY A14,A0
CALLA COIL_DRIVE
PULLQ A0
RETS
**************************************************************************
* *
* GET_PLAYER_COIL - ROUTINE TO GET THE RECOIL EQUATE FOR A SPECIFIC *
* PLAYER. *
* A2 = PTR TO PLAYER DATA AREA *
* RETURNS *
* A0 = COIL EQUATE *
* *
**************************************************************************
GET_PLAYER_COIL
CALLA GPLAYNUM
SLL 4,A0
ADDI PRECOIL_TAB,A0
MOVE *A0,A0,W
RETS
**************************************************************************
* *
* RECOIL_OFF *
* *
* Turn off all of the Gun coils and clear the gun trigger *
* debounce RAM. *
* *
* *
**************************************************************************
RECOIL_OFF
MMTM SP,A0,A1
MOVI COIL_OFF_TIME,A1 ;Gotta do it this way 'cause the
SLL 16,A1 ;symbol is global
CLR A0 ;MOVK P1_RECOIL,A0
MOVY A1,A0
CALLA COIL_DRIVE
MOVK P2_RECOIL,A0
MOVY A1,A0
CALLA COIL_DRIVE
MOVK P3_RECOIL,A0
MOVY A1,A0
CALLA COIL_DRIVE
CLR A0
BSET P1TRIGGER,A0
BSET P2TRIGGER,A0
BSET P3TRIGGER,A0
PUSHST
DINT
ORM A0,@SWTEMP1,L
ORM A0,@SWTEMP2,L ;CLEAR THE SWITCH DEBOUNCE TO RE-TRIGGER
POPST
MMFM SP,A0,A1
RETS
*
* CURSOR_OFF
*
* Turn the players cursor off. If it exists
*
* A2 = Ptr to player
*
CURSOR_OFF
PUSH A0
MOVE *A2(POBJ),A0,L
JRZ CO_X
ORIM M_NODISP,*A0(OFLAGS),W
CO_X
PULLQ A0
RETS
*
* CURSOR_ON
*
* Turn the players cursor on. If it exists
*
* A2 = Ptr to player
*
CURSOR_ON
PUSH A0
MOVE *A2(POBJ),A0,L
JRZ CON_X
ANDNIM M_NODISP,*A0(OFLAGS),W
CON_X
PULLQ A0
RETS
**************************************************************************
* *
* PLAYER_CURSOR - PROCESS TO TRACK THE PLAYER CURSORS. CONVERTS *
* POTENTIOMETER VALUES TO [Y,X] SCREEN COORDINATES. *
* *
* NOTE: PROCESS I.D. MUST BE PID_CURSOR *
* *
**************************************************************************
PLAYER_CURSOR
MOVI PID_CURSOR,A0
CALLA KILLPROC_ALL
PC_LP
CALLR READ_ALL_POTS
MOVI P1DATA,A2
MOVI P1POTVALS,A4
MOVI P1_QUADS,A5
MOVI P1_MULTS,A6
CALLR CURSOR_UPDATE
MOVI P2DATA,A2
MOVI P2POTVALS,A4
MOVI P2_QUADS,A5
MOVI P2_MULTS,A6
CALLR CURSOR_UPDATE
MOVI P3DATA,A2
MOVI P3POTVALS,A4
MOVI P3_QUADS,A5
MOVI P3_MULTS,A6
CALLR CURSOR_UPDATE
SLOOP 1,PC_LP
**************************************************************************
* *
* CURSOR_UPDATE - ROUTINE TO UPDATE A PLAYERS CURSOR POSITION BASED *
* ON CURRENT POTENTIOMETER VALUES. *
* A2 = PTR TO PLAYER DATA AREA *
* A4 = PTR PLAYER POT VALUES *
* A5 = PTR TO PLAYER QUADRANT CALIBRATION LIST *
* A6 = PTR TO PLAYER CONVERSION MULTIPLIERS *
* *
**************************************************************************
CURSOR_UPDATE
MMTM SP,A1,A2,A3,A7,A8,A9,A11
MOVE A2,A9 ;KEEP PLAYER SPOT
MOVE *A4,A1,L ;GET CURRENT POT READING
MOVE *A5+,A11,L ;GET UPPER LEFT CORNER FOR XLATION
MOVE *A5+,A7,L ;GET LOWER RIGHT FOR BOUNDS CHECKING
*DO A MINIMUM BOUNDRY COMPARE
CMPXY A11,A1
JRXGE CU_NOXMIN
MOVX A11,A1
CU_NOXMIN
JRYGE CU_CK_MAX
MOVY A11,A1
*DO A MAXIMUM BOUNDRY COMPARE
CU_CK_MAX
CMPXY A7,A1
JRXLE CU_NOXMAX
MOVX A7,A1
CU_NOXMAX
JRYLE CU_CONTINUE
MOVY A7,A1
CU_CONTINUE
SUBXY A11,A1 ;XLATE COORDS TO A ZERO BASE
CLR A3
MOVX A1,A3
MOVE *A6+,A2,W ;GET X COORD MULTIPLIER
SETF 16,1,1
MPYU A2,A3
SRL 8,A3
MOVY A1,A7
SRL 16,A7
MOVE *A6+,A2,W ;GET Y COORD MULITPLIER
MPYU A2,A7
SETF 32,1,1
SLL 8,A7
MOVY A7,A3
MOVE *A9(POBJ),A8,L ;GRAB THE OBJECT
JRZ CU_X ;BR = NONE TO BE HAD
MOVE *A9(PDEAD),A14,W
JRZ CU_NOTDEAD
MOVE A9,A11
CREATEP PID_INDW|PID_INDE,PLAYER_KILL ;KILL OFF THE PLAYER
CU_NOTDEAD
*Do a boundry check here to insure that the cursor stays on screen
MOVE @SCRNTL,A14,L
CMPXY A14,A3 ;Bounds check on upper left
JRXGE CU_LEFTX_OK ;BR = Left X is O.K.
MOVX A14,A3 ;Set cursor on boundry
CU_LEFTX_OK
JRYGE CU_TOPY_OK
MOVY A14,A3 ;Set cursor on boundry
CU_TOPY_OK
MOVE @SCRNBR,A14,L
CMPXY A14,A3 ;Bounds check on bottom right
JRXLE CU_RIGHTX_OK ;BR = Right X is O.K.
MOVX A14,A3 ;Set cursor on boundry
CU_RIGHTX_OK
JRYLE CU_POSITION_CURSOR
MOVY A14,A3 ;Set cursor on boundry
CU_POSITION_CURSOR
CALLA OBJ_TO_PNT ;Put that rascal on the point
CU_X
MOVE A3,*A9(PCURSORXY),L ;STORE FOR THE WORLD
MMFM SP,A1,A2,A3,A7,A8,A9,A11
RETS
**************************************************************************
* *
* GUN_WATCH - PROCESS TO READ GUN POTENTIOMETER VALUES AND STORE THEM *
* FOR GLOBAL ACCESS. *
* *
**************************************************************************
GUN_WATCH
MOVI PID_GUN,A0
CALLA KILLPROC_ALL ;KILL ANY OTHER OCCURANCES OF THIS PROC
GUN_LOOP
CALLR READ_ALL_POTS
SLOOP 1,GUN_LOOP
**************************************************************************
* *
* PCOLL_SINGLE - ENTRYPOINT TO CHECK A SINGLE POINT AGAINST ALL OF *
* THE EXISTING FOREGROUND OBJECTS. COLLISION IS *
* ONLY CALLED ON THE CLOSEST TO THE SCREEN *
* A2 = PTR TO PLAYER *
* A3 = [Y,X] SCREEN RELATIVE POINT *
* Z = NO COLLISION *
* A0 = 0 *
* NZ = COLLISION OCCURED *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
PCOLL_SINGLE
MMTM SP,A7,A8
MOVI POINT_COLL_SINGLE,A7
JRUC PCOLL_E
**************************************************************************
* *
* PCOLL_ALL - ENTRYPOINT TO CHECK A SINGLE POINT AGAINST ALL OF *
* THE EXISTING FOREGROUND OBJECTS. COLLISION IS *
* ONLY CALLED ON ANY OBJECTS COLLIDING WITH POINT. *
* A2 = PTR TO PLAYER *
* A3 = [Y,X] SCREEN RELATIVE POINT *
* RETURNS *
* Z ALWAYS *
* *
* *
* THIS ROUTINE NEEDS TO BE UPDATED - GEORGE. (1/20/94) *
* *
* *
**************************************************************************
PCOLL_ALL
MMTM SP,A7,A8
MOVI POINT_COLL_ALL,A7
JRUC PCOLL_E
**************************************************************************
* *
* ROCKET_COLL - ENTRYPOINT TO CHECK A SINGLE POINT AGAINST ALL OF *
* THE EXISTING OBJECTS. IF AN OBJECT IS FOUND TO BE *
* IN VIOLATION IT IS PASSED BACK *
* A2 = PTR TO PLAYER *
* A3 = [Y,X] SCREEN RELATIVE POINT *
* RETURNS *
* Z = NO COLLISION *
* A0 = 0 *
* NZ = COLLISION *
* A0 = OBJECT *
* *
**************************************************************************
ROCKET_COLL
MMTM SP,A7,A8
MOVI ROCKET_POINT_COLL,A7
JRUC PCOLL_E
**************************************************************************
* *
* PCOLL_E - ENTRYPOINT TO CHECK A SINGLE POINT AGAINST ALL OF *
* THE EXISTING OBJECTS (FOREGROUND & BACKGROUND). *
* A2 = PTR TO PLAYER *
* A3 = [Y,X] SCREEN RELATIVE POINT *
* A7 = PTR TO COLLISION ROUTINE TO USE *
* RETURNS *
* Z = NO COLLISIONS OCCURED *
* NZ = COLLISIONS OCCURED *
* *
**************************************************************************
PCOLL_E
MOVI FGLIST,A8
CALL A7
MMFM SP,A7,A8
RETS
**************************************************************************
* *
* POINT_COLL_SINGLE - ROUTINE TO CHECK IF ANY OBJECT COLLIDES *
* WITH THE GIVEN POINT. THIS ROUTINE WILL DO *
* ONLY THE FIRST COLLISION SCANNING FROM THE *
* BOTTOM OF THE PLANE LIST. *
* A2 = PTR TO PLAYER DOING THE POINT CHECK *
* A3 = [Y,X] POINT IN SCREEN RELATIVE FORM *
* A8 = PTR TO DISPLAY PLANE STRUCTURE *
* RETURNS *
* Z = NO COLLISION *
* A0 = 0 *
* NZ = COLLISION OCCURED *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
POINT_COLL_SINGLE
MMTM SP,A1,A3,A6,A7,A8,A9
MOVE A8,A7 ;KEEP THE PLANE HEAD FOR END CHECK
CLR A0
PCS_LP
MOVE *A8(OLINK),A8,L
CMP A8,A7 ;ARE WE BACK TO THE BEGINNING?
JREQ PCS_X ;BR = YES
MOVE *A8(OGUNVECT),A6,L ;VUNERABLE TO GUNS?
JRZ PCS_LP ;BR = NO
MOVB *A8(OFLAGS),A14
JRN PCS_LP ;BR = OFF SCREEN
; MOVE *A8(OCTRL),A14,W ; OLD WAY
; SLL 28,A14
; JRZ PCS_LP ;BR = OBJECT IS OFF
btst B_NODISP,a14 ; NEW WAY (NODISP FLAG)
JRNZ PCS_LP ;BR = OBJECT IS OFF
MOVE *A8(ODAG),A1,L ;OBJECT'S SCREEN X-Y
MOVE A3,A9 ;WE MUST KEEP
SUBXY A1,A9 ;GET [Y,X] OFFSET INTO BOX
JRXLT PCS_LP ;BR = POINT TO THE LEFT OF BOX
JRYLT PCS_LP ;BR = POINT TO THE BELOW THE BOX
MOVE *A8(OSIZE),A14,L
ADDXY A1,A14 ;OBJECT BOX LR
CMPXY A14,A3
JRXGT PCS_LP ;BR = POINT TO THE RIGHT OF BOX
JRYGT PCS_LP ;BR = POINT BELOW THE BOX
CALLR POINT_SCAN ;NOW SCAN FOR PIXELS
JRZ PCS_LP ;BR = NO PIXEL COLLISION
* CALL GUN COLLISION
* A2 = PTR PLAYER DATA AREA
* A6 = GUN VECTOR
PUSH A8
CALL A6 ;CALL ON THE COLLISION ROUTINE
PULLQ A0 ;SET NZ FLAG AND PASS IT BACK MY MAN
PCS_X
MMFM SP,A1,A3,A6,A7,A8,A9
RETS
**************************************************************************
* *
* POINT_COLL_ALL - ROUTINE TO CHECK IF ANY OBJECT COLLIDES *
* WITH THE GIVEN POINT. THIS ROUTINE WILL DO *
* ALL THE COLLISIONS SCANNING FROM THE *
* FRONT OF THE PLANE LIST. *
* A2 = PTR TO PLAYER DOING THE POINT CHECK *
* A3 = [Y,X] POINT IN SCREEN RELATIVE FORM *
* A8 = PTR TO DISPLAY PLANE STRUCTURE *
* RETURNS *
* Z ALWAYS *
* *
**************************************************************************
POINT_COLL_ALL
MMTM SP,A1,A3,A4,A6,A7,A8,A9
MOVE *A8(P_YPOS),A4,L
MOVE *A8(P_XPOS),A14,L
SRL 16,A14
MOVX A14,A4 ;A4 = WORLD TOP LEFT [Y,X] OF PLANE
ADDXY A4,A3 ;MAKE POINT CORRESPOND TO THIS WORLD
MOVE A8,A7 ;KEEP THE PLANE HEAD FOR END CHECK
PCA_LP
MOVE *A8,A8,L
PCA_LPLD
CMP A8,A7 ;ARE WE BACK TO THE BEGINNING?
JREQ PCA_X ;BR = YES
MOVE *A8(OGUNVECT),A6,L ;VUNERABLE TO GUNS?
JRZ PCA_LP ;BR = NO
MOVE *A8(OXPOS),A1,W
MOVE *A8(OYPOS),A14,W
SLL 16,A14
MOVY A14,A1 ;OBJECT BOX UL
MOVE *A8(OFLAGS),A14,W
BTST B_SCRNOBJ,A14
JRZ PCA_WORLD
ADDXY A4,A1 ;MAKE TARGET WORLD RELATIVE
PCA_WORLD
SLL 28,A14
JRZ PCA_LP
MOVE A3,A9 ;WE MUST KEEP
SUBXY A1,A9 ;GET [Y,X] OFFSET INTO BOX
JRXLT PCA_LP ;BR = POINT TO THE LEFT OF BOX
JRYLT PCA_LP ;BR = POINT TO THE BELOW THE BOX
MOVE *A8(OSIZE),A14,L
ADDXY A1,A14 ;OBJECT BOX LR
CMPXY A14,A3
JRXGT PCA_LP ;BR = POINT TO THE RIGHT OF BOX
JRYGT PCA_LP ;BR = POINT BELOW THE BOX
CALLR POINT_SCAN ;NOW SCAN FOR PIXELS
JRZ PCA_LP ;BR = NO PIXEL COLLISION
* CALL GUN COLLISION
* A2 = PTR PLAYER DATA AREA
* A6 = GUN VECTOR
MOVE *A8,A1,L ;GET NEXT IN CASE WE TRASH OLD
MOVE *A1(OID),A9,W ;KEEP
MMTM SP,A1,A7,A9
CALL A6 ;CALL ON THE COLLISION ROUTINE
MMFM SP,A1,A7,A9
MOVE A1,A8
*** DO WE HAVE TO ABORT THE SCAN DUE TO CH CH CH CHANGES? ***
MOVB *A8(OCTRL+B_INUSE-7),A14
; MOVB *A8(OFLAGS+B_INUSE-7),A14
JRNN PCA_X ;NEW OBJECT DELETED?
MOVE *A8(OID),A14,W
CMP A14,A9 ;OID CHANGED?
JRNE PCA_X
MOVE *A8(OGUNVECT),A14,L ;OCVECT CLEARED?
JRNZ PCA_LPLD
PCA_X
MMFM SP,A1,A3,A4,A6,A7,A8,A9
RETS
**************************************************************************
* *
* ROCKET_POINT_COLL - ROUTINE TO CHECK IF ANY OBJECT COLLIDES *
* WITH THE GIVEN POINT. THE GUN VECTOR IS *
* NOT CALLED. BUT THE OBJECT IS RETURNED. *
* A2 = PTR TO PLAYER DOING THE POINT CHECK *
* A3 = [Y,X] POINT IN SCREEN RELATIVE FORM *
* A8 = PTR TO DISPLAY PLANE STRUCTURE *
* RETURNS *
* Z = NO COLLISION *
* A0 = 0 *
* NZ = COLLISION OCCURED *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
ROCKET_POINT_COLL
MMTM SP,A1,A3,A4,A7,A8,A9
MOVE A8,A7 ;KEEP THE PLANE HEAD FOR END CHECK
CLR A0
RPC_LP
MOVE *A8(OLINK),A8,L
CMP A8,A7 ;ARE WE BACK TO THE BEGINNING?
JREQ RPC_X ;BR = YES
MOVE *A8(OGUNVECT),A14,L ;VUNERABLE TO GUNS?
JRZ RPC_LP ;BR = NO
MOVB *A8(OFLAGS),A14
JRN RPC_LP ;BR = OFF SCREEN
; MOVE *A8(OCTRL),A14,W ; OLD WAY
; SLL 28,A14
; JRZ RPC_LP ;BR = OBJECT IS OFF
btst B_NODISP,a14 ; NEW WAY Uses NODISP flag
JRNZ RPC_LP ;BR = OBJECT IS OFF
MOVE *A8(ODAG),A1,L
MOVE A3,A9 ;WE MUST KEEP
SUBXY A1,A9 ;GET [Y,X] OFFSET INTO BOX
JRXLT RPC_LP ;BR = POINT TO THE LEFT OF BOX
JRYLT RPC_LP ;BR = POINT TO THE BELOW THE BOX
MOVE *A8(OSIZE),A14,L
ADDXY A1,A14 ;OBJECT BOX LR
CMPXY A14,A3
JRXGT RPC_LP ;BR = POINT TO THE RIGHT OF BOX
JRYGT RPC_LP ;BR = POINT BELOW THE BOX
CALLR POINT_SCAN ;NOW SCAN FOR PIXELS
JRZ RPC_LP ;BR = NO PIXEL COLLISION
MOVE A8,A0 ;PASS IT BACK MY MAN
RPC_X
MMFM SP,A1,A3,A4,A7,A8,A9
RETS
**************************************************************************
* *
* POINT_SCAN - ROUTINE TO DO A SINGLE POINT PIXEL SCAN AGAINST AN OBJECT *
* A8 = PTR TO OBJECT *
* A9 = [Y,X] OFFSET OF POINT FROM UPPER LEFT *
* RETURNS *
* Z = NO COLLISION *
* NZ = COLLISION ON A PIXEL BASIS *
* *
**************************************************************************
POINT_SCAN
MMTM SP,A0,A1,A2,A3,A4,A5,A9
MOVE *A8(OSAG),A0,L ;FREEZE SAG FAST!
MOVB *A8(OFLAGS+B_NOPIXSCAN-7),A14
JRN PS_HIT ;BR = OBJECT DOES NOT NEED PIXEL SCAN
CLR A3
MOVX A9,A3
SRA 16,A9 ;CLEAR X WORD
SETF 16,1,1
MOVE *A8(OSCALEX),A2,W ;ASSUME X AND Y AT SAME SCALE
MPYS A2,A9
SRA 8,A9 ;SCALE Y OFFSET TO 1:1 IMAGE
MPYS A2,A3
SRA 8,A3 ;SCALE X OFFSET TO 1:1 IMAGE
MOVE *A8(OCTRL),A2,W ;GET BITS PER PIXEL
MOVE A2,A4
SLL 17,A4
SRL 29,A4
JRNZ PS_NOT_EIGHT ;BR=NOT EIGHT BITS PER PIXEL
MOVK 8,A4
PS_NOT_EIGHT
MOVE *A8(OUSIZEX),A1,W ;GET UNSCALED HORIZONTAL SIZE
MPYU A4,A1 ;LENGTH OF LINE * BITS PER PIXEL
BTST B_FLIPH,A2 ;ARE WE FLIPPED?
JRZ PS_VTST ;BR = NO HFLIP
NEG A3 ;X OFFSET IS CALCULATED
MOVE A1,A14
SUB A4,A14 ;MINUS ONE PIXEL
ADD A14,A0 ;OFFSET OSAG TO TOP-RIGHT EDGE OF IMAGE
PS_VTST
BTST B_FLIPV,A2
JRZ PS_MULT ;BR = NO VFLIP
NEG A9
MOVE *A8(OUSIZEY),A5,W ;GET UNSCALED VERTICAL SIZE
DEC A5 ;HEIGHT OF IMAGE MINUS ONE LINE
MPYU A1,A5 ;MULTIPLY BY LINE * BITS PER PIXEL
ADD A4,A5 ;PLUS ONE PIXEL
ADD A5,A0 ;OFFSET OSAG TO BOTTOM-LEFT EDGE OF IMAGE
PS_MULT
MPYS A1,A9 ;NOW WE HAVE THE Y OFFSET
ADD A9,A0 ;ADD TO SAG
MPYS A4,A3 ;A3 = BIT OFFSET * PIXEL SIZE
ADD A3,A0 ;A0 IS NOW THE CORRECT PIXEL ADDRESS
SETF 32,1,1
*DE-ACTIVATE THE DMA FOR THE PIXEL READ
GETST A3
DINT ;STOP DMA FUCK
; SETF 1,0,0
; CLR A14
; MOVE A14,@INTENB+B_X1E ;Disable the DMA interrupt
; SETF 16,1,0 ;WORD SIGN EXTEND
MOVE @INTENB,A14,W
ANDNI X1E,A14
MOVE A14,@INTENB,W
PUTST A3
MOVI (4096*MICRO_SECOND)/4,A1 ;MAX WAIT FOR 400X256 DMA
PS_DMA_WT
MOVE @DMAGOREG,A14,L ;DMA STILL BUSY?
; JRN PS_DMA_WT ;BR = YES, WAIT
JRNN PS_DMA_READY ;BR = NO, READY
DSJS A1,PS_DMA_WT
LOCKUP
CLR A0 ;TIME OUT!
JRUC PS_REENABLE
PS_DMA_READY
; MOVE @DMAGOREG,A14,L ;DMA STILL BUSY?
; JRN PS_DMA_WT ;BR = YES, WAIT
MOVB *A0,A0 ;GET THE PIXEL
PS_REENABLE
CMP B12,B13
JRLS PS_NODMA ;DON'T REACTIVATE DMA INTS
GETST A3
DINT
; SETF 1,0,0
; MOVK 1,A14
; MOVE A14,@INTENB+B_X1E ;Re-enable the DMA interrupts
; SETF 16,1,0 ;WORD SIGN EXTEND
MOVE @INTENB,A14,W
ORI X1E,A14
MOVE A14,@INTENB,W
PUTST A3
PS_NODMA
MOVE A0,A0
PS_X
MMFM SP,A0,A1,A2,A3,A4,A5,A9
RETS
*SPECIAL CASE COLLISION FOR NON-PIXEL SCANNING OBJECTS
PS_HIT
CLRZ
JRUC PS_X
**************************************************************************
* *
* ENEMYP_COLL - CHECK A SCREEN RELATIVE POINT FOR COLLISIONS FROM *
* THIS OBJECT FORWARD. *
* A3 = [Y,X] SCREEN RELATIVE POINT *
* A8 = PTR TO ENEMY OBJECT CALLING *
* RETURNS *
* Z = NO COLLISION, A0 = 0 *
* NZ = COLLISION, A0 = PTR TO OBJECT IN THE WAY *
* *
**************************************************************************
ENEMYP_COLL
MMTM SP,A1,A7,A8,A9
CLR A0
MOVI FGLIST,A7
EC_LP
MOVE *A8(OBLINK),A8,L
CMP A8,A7 ;ARE WE BACK TO THE BEGINNING?
JREQ EC_X ;BR = HELL YEAH!
MOVE *A8(OGUNVECT),A14,L ;VUNERABLE TO GUNS?
JRZ EC_LP ;BR = NO
MOVB *A8(OFLAGS),A14
JRN EC_LP ;BR = OFF SCREEN
; MOVE *A8(OCTRL),A14,W ; OLD WAY
; SLL 28,A14 ;IS THE OBJECT EVEN TURNED ON?
; JRZ EC_LP ;BR = NO
btst B_NODISP,a14 ; new way uses NODISP flag
JRNZ EC_LP ;BR = OBJECT IS OFF
MOVE *A8(ODAG),A1,L ;OBJECT BOX UL
MOVE A3,A9 ;WE MUST KEEP
SUBXY A1,A9 ;GET [Y,X] OFFSET INTO BOX
JRXLT EC_LP ;BR = POINT TO THE LEFT OF BOX
JRYLT EC_LP ;BR = POINT TO THE BELOW THE BOX
MOVE *A8(OSIZE),A14,L
ADDXY A1,A14 ;OBJECT BOX LR
CMPXY A14,A3
JRXGT EC_LP ;BR = POINT TO THE RIGHT OF BOX
JRYGT EC_LP ;BR = POINT BELOW THE BOX
CALLR POINT_SCAN ;NOW SCAN FOR PIXELS
JRZ EC_LP ;BR = NO PIXEL COLLISION
MOVE A8,A0 ;PASS IT BACK MY MAN
EC_X
MMFM SP,A1,A7,A8,A9
RETS
**************************************************************************
* *
* GUN CALIBRATION ROUTINES *
* *
**************************************************************************
.BSS CALIBRATE_NO_ABORT,16 ;IF <> 0, CANNOT ABORT CALIBRATION
.bss filler,16 ; to keep long word aligned
**************************************************************************
* *
* GUN_CALIBRATE - PROCESS TO BE CREATED AT GAME POWER UP TO CALIBRATE *
* THE GUNS. IT WILL RESET THE PROCESS SYSTEM AND JUMP *
* TO MAIN_GO WHEN IT IS DONE. *
* *
**************************************************************************
GUN_CALIBRATE
CALLA DIGSRT
MOVI CREADFAIL_MESS,A8
JSRP LM_PRINTF
SOUND1 CALFAIL_SND
MOVI 300,A0
JSRP SLEEP_SWITCHX
MOVKM 1,@CALIBRATE_NO_ABORT,W
JSRP CALIBRATE_JUMP
CALLR RECOIL_OFF
CALLA PINIT ;RESET SYSTEM
MOVI STCKST,SP,L ;RESET THE SYSTEM STACK
JAUC MAIN_GO ;AND JUMP TO GAME UP
CREADFAIL_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+30,COLOR_PLF,STRCNRM,0
.STRING "** CMOS RAM ERROR **\n\n"
.STRING "\bUNABLE TO READ\n"
.STRING "GUN CALIBRATION VALUES.",0
.WORD COLOR_DECAY
**************************************************************************
* *
* GO_CALIBRATE - THIS ROUTINE IS USED BY THE DIAGNOSTIC SYSTEM TO *
* CALIBRATE THE GUN POTENTIOMETERS. THE CALIBRATION VALUES *
* ARE STORED IN CMOS FOR LATER USE. *
* *
**************************************************************************
GO_CALIBRATE
CLRM @CALIBRATE_NO_ABORT,W
CALIBRATE_JUMP
CALLA MYOINIT
PAGEON
CALLA SINGLE_PLANE ;START US ONE PLANE OF FOREGROUND
CALLA CLR_SCRN
CLRM @SCRNTL,L ;RE-ADJUST SCREEN BOUNDRIES
MOVKM 3,@GAMERASE,W ;AUTO-ERASE FULL
CREATE PID_IND,POT_PRINT ;CREATE THE POT VALUE
CREATE PID_GUN,GUN_WATCH ;CREATE THE GUN WATCHER PROCESS
JSRP SCR_REV_OBJ
MOVI MESS_TITLE,A8 ;SET PARAMETERS
CALLA LM_SETUP ;GET PARAMS
MOVI STRCNRMO,A1
MOVI M_CALIBRATE,A8
JSRP PRINTF
MOVE @CALIBRATE_NO_ABORT,A0,W ;ABORT ALLOWED
JRNZ CALSKIP_SKIP ;BR = NO
MOVI CALSKIP_MESS,A8
JSRP LM_PRINTF
CALSKIP_SKIP
ALLPLYR CLR_PSTARTESC ;CLEAR ESCAPE FLAGS
MOVI RAM_CAL_START,A1
MOVI RAM_CAL_END,A2
CALLA CLRBLOCK ;Clear RAM values
MOVI CALIBRATE_TABLE,A10
CAL_COORD_LOOP
JSRP CALIBRATE_COORD
JRNZ CAL_ABORT ;BR = CALIBRATION ABORTED
MOVE *A10,A0,L
JRNZ CAL_COORD_LOOP
CLR A3 ;ERROR COUNT
*
*LET'S STORE ALL OF OUR VALUES IN CMOS RAM
*
CAL_CMOS_RETRY
MOVI RAM_CAL_START,A2
MOVI CALIBRATE_START,A0
CAL_CMOS_LOOP
MOVE *A2+,A1,L
CALLA STORE_AUDIT
INC A0 ;NEXT AUDIT DUDE
CMPI RAM_CAL_END,A2
JRLO CAL_CMOS_LOOP
*
*LET'S CHECK TO MAKE SURE THE VALUES WERE STORED CORRECTLY.
*
MOVI CALIBRATE_START,A0
MOVI RAM_CAL_START,A2
CRC_LOOP
CALLA GET_AUD
MOVE @BAD_AUD,A14,W ;IS THIS VALUE BAD?
JRNZ CAL_CMOS_FAIL ;BR = YES
CMPM *A2+,A1,L ;DOES IT MATCH THE RAM VALUE?
JRNE CAL_CMOS_FAIL ;BR = NO, DO FAILURE
INC A0 ;NEXT AUDIT DUDE
CMPI CALIBRATE_END+1,A0
JRLO CRC_LOOP
*
*FALL HERE IF CMOS STORAGE WENT O.K.
*
CALLR CAL_RESET
CALLR INITIALIZE_CALIBRATION
SLEEP 10
MOVI CALSUCC_MESS,A8 ;FLASH SUCCESS MESSAGE
JSRP LM_PRINTF
SLEEP 40
SOUND1 CALSUCC_SND
SLEEP 100
JRUC CAL_CLR_X
*
*CMOS ERROR CONDITION, CHECK IF WE SHOULD TRY AGAIN
*
CAL_CMOS_FAIL
INC A3
CMPI 3,A3
JRHI CAL_CMOS_FUCKED
MOVI CALIBRATE_START,A0
MOVI CALIBRATE_END,A1
CALLA CLR_AUDR ;BLOW THE VALUES FOR GOOD MEASURE
JRUC CAL_CMOS_RETRY
*
*FALL HERE IF THERE WERE TOO MANY ERRORS STORING VALUES
*
CAL_CMOS_FUCKED
CALLR CAL_RESET
SLEEP 10
MOVI CALFAIL_MESS,A8 ;FLASH FAILURE MESSAGE
JSRP LM_PRINTF
SOUND1 CALFAIL_SND
MOVI 5000,A0 ;WAIT A LONG TIME, UNLESS HE PULLS
JSRP SLEEP_SWITCHX
JRUC CAL_CLR_X
CAL_ABORT
CALLR CAL_RESET
SLEEP 10
MOVI CALABORT_MESS,A8 ;FLASH ABORT MESSAGE
JSRP LM_PRINTF
SOUND1 CALABORT_SND
SLEEP 100
CAL_CLR_X
CALLA CLR_SCRN
RETP
*
*CMOS CALIBRATION SOUNDS
*
CALFAIL_SND
.WORD 0F3F0H,66,0881FH,0 ;CALIBRATION STORAGE FAILURE
CALSUCC_SND
.WORD 0F3F0H,58,08817H,0 ;CALIBRATION SUCCESS
CALABORT_SND
.WORD 0F3F0H,33,08819H,0 ;CALIBRATION ABORT
**************************************************************************
* *
* INITIALIZE_CALIBRATION - READ CMOS CALIBRATION VALUES INTO RAM. DETECT *
* IF CMOS VALUES ARE BOGUS. *
* RETURNS: *
* Z = CALIBRATION VALUES ARE O.K. *
* NZ = FAILURE, CALIBRATION VALUES ARE BOGUS *
* NOTE: TRASHES A14 *
* *
**************************************************************************
INITIALIZE_CALIBRATION
MMTM SP,A0,A1,A2,A3
MOVI CALIBRATE_START,A0
MOVI RAM_CAL_START,A2
IC_LOOP
CALLA GET_AUD
MOVE @BAD_AUD,A14,W ;IS THIS VALUE BAD?
JRNZ IC_X ;BR = YES
MOVE A1,*A2+,L
INC A0 ;NEXT AUDIT DUDE
CMPI CALIBRATE_END+1,A0
JRLO IC_LOOP
MOVE @P1_CAL_UL,A0,L
MOVE @P1_CAL_LR,A1,L
MOVI [SCREEN_HEIGHT,SCREEN_WIDTH],A3
MOVI P1_QUADS,A4
MOVI P1_MULTS,A5
CALLR CALC_QUADRANTS
MOVE @P2_CAL_UL,A0,L
MOVE @P2_CAL_LR,A1,L
CALLR CALC_QUADRANTS
MOVE @P3_CAL_UL,A0,L
MOVE @P3_CAL_LR,A1,L
CALLR CALC_QUADRANTS
SETZ ;MARK THE SUCCESS
IC_X
MMFM SP,A0,A1,A2,A3
RETS
**************************************************************************
* *
* CALC_QUADRANTS - ROUTINE TO CALCULATE THE PLAYER POTENTIOMETER QUADRAN *
* BOUNDRIES, AND CONVERSION FACTORS. *
* A0 = [Y,X] UPPER LEFT CALIBRATION POINT *
* A1 = [Y,X] LOWER RIGHT CALIBRATION POINT *
* A2 = [Y,X] CENTER CALIBRATION POINT *
* A3 = [Y,X] QUADRANT SIZE *
* A4 = PTR TO PLAYER QUADRANT RAM *
* A5 = PTR TO PLAYER CONVERSION MULTIPLIER RAM *
* RETURNS: *
* A4 = NEXT UL, LR STORAGE *
* A5 = NEXT MULTIPLIER STORAGE *
* NOTE: TRASHES A14 *
* *
**************************************************************************
CALC_QUADRANTS
MMTM SP,A0,A1,A3,A7,A8
**** MOVE A0,A7
**** MOVE A1,A8 ;KEEP UPPER LEFT AND LOWER RIGHT
**** PUSH A4
CALLR CALC_FACTOR_AND_STORE ;CALCULATE FULL SCREEN FIRST
**** PULL A4
**** HALFXY A3
**** MOVE A2,A1
**** CALLR CALC_FACTOR_AND_STORE ;CALCULATE 1st QUADRANT
**** MOVX A2,A0 ;2nd QUADRANT UL
**** MOVX A8,A1 ;2nd QUADRANT LR
**** CALLR CALC_FACTOR_AND_STORE ;CALCULATE 2nd QUADRANT
**** MOVE A2,A0 ;3rd QUADRANT UL
**** MOVE A8,A1 ;3rd QUADRANT LR
**** CALLR CALC_FACTOR_AND_STORE ;CALCULATE 3rd QUADRANT
**** MOVX A7,A0
**** MOVX A2,A1
**** CALLR CALC_FACTOR_AND_STORE ;CALCULATE 4th QUADRANT
MMFM SP,A0,A1,A3,A7,A8
RETS
**************************************************************************
* *
* CALC_FACTOR_AND_STORE - ROUTINE TO CALCULATE CONVERSION FACTORS FOR *
* A QUADRANT AND STORE. *
* A0 = [Y,X] QUADRANT UL *
* A1 = [Y,X] QUADRANT LR *
* A3 = [Y,X] QUADRANT SIZE *
* A4 = PTR TO UL AND LR STORAGE *
* A5 = PTR TO CONVERSION FACTOR STORAGE *
* RETURNS: *
* A4 = NEXT UL, LR STORAGE *
* A5 = NEXT MULTIPLIER STORAGE *
* *
**************************************************************************
CALC_FACTOR_AND_STORE
PUSH A6
MOVE A0,*A4+,L ;STORE 1st QUADRANT BOUNDRIES
MOVE A1,*A4+,L
CALLR CALC_POT_FACTOR
MOVE A6,*A5+,L ;STORE 1st QUADRANT MULTIPLIERS
PULL A6
RETS
**************************************************************************
* *
* CALC_POT_FACTOR - ROUTINE TO CALCULATE A POT TO SCREEN FACTOR *
* A0 = [Y,X] POTENTIOMETER UPPER LEFT CORNER OF AREA *
* A1 = [Y,X] POTENTIOMETER LOWER RIGHT CORNER OF AREA *
* A3 = [Y,X] SIZE OF AREA *
* RETURNS: *
* A6 = [Y,X] POT FACTORS *
* NOTE: TRASHES A14 *
* *
**************************************************************************
CALC_POT_FACTOR
MMTM SP,A2,A4,A5
CALLR CALC_XY_DIFF
CLR A14
CLR A5
MOVX A2,A14
MOVX A3,A5
SLL 8,A5
DIVU A14,A5
MOVX A5,A4
CLR A5
MOVY A2,A14
MOVY A3,A5
SRL 16,A14
SRL 8,A5
DIVU A14,A5
SLL 16,A5
MOVY A5,A6
MOVX A4,A6
MMFM SP,A2,A4,A5
RETS
**************************************************************************
* *
* CALC_XY_DIFF - ROUTINE TO CALCULATE THE ABSOLUTE XY DIFFERENCE OF *
* TWO VALUES *
* A0 = VALUE 1 *
* A1 = VALUE 2 *
* RETURNS: *
* A2 = ABSOLUTE XY DIFFERENCE *
* NOTE: TRASHES A14 *
* *
**************************************************************************
CALC_XY_DIFF
PUSH A1
SUBXY A0,A1
MOVE A1,A2
ABSXY A2
PULL A1
RETS
**************************************************************************
* *
* CAL_RESET - ROUTINE TO RESET THE PROCESSES AND OBJECTS DURING *
* CALIBRATION. *
* *
**************************************************************************
CAL_RESET
CALLA KILL_DESTRUCTIBLES ;KILL EVERYTHING CREATED
CALLA COLOR_START
CALLA MYOINIT ;WASTE OBJECTS
PAGEOFF ;TURN 'DAT CRAZY PAGE FLIP OFF
JAUC CLR_SCRN
**************************************************************************
* *
* CALIBRATE_COORD - PUT UP A CALIBRATION POINT AND WAIT FOR THE PROPER *
* SWITCH INPUT. *
* A10 = PTR TO CALIBRATION ENTRY *
* RETURNS: *
* Z = CALIBRATION OBTAINED *
* NZ = CALIBRATION ABORTED BY START BUTTON *
* A10 = PTR TO WORD AFTER CALIBRATION ENTRY *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
CALIBRATE_COORD
CALLA DIPINIT ;Update DIPswitch RAM values
MOVE *A10+,A0,W ;GET PLAYER NUMBER
MOVE A0,@STRING1,W
DEC A0
CMPM @NPLAYERS,A0,W ;GAME SUPPORTING THIS MANY PLAYERS?
JRHI CC_X ;BR = NO
MOVE *A10+,A0,W ;GET STRING COLOR
MOVE A0,@STRING3,W
MOVE *A10+,A0,L ;GET EMBEDDED STRING
MOVE A0,@STRING2,L
PUSHP A10
MOVI PCAL_MESS,A8
JSRP LM_PRINTF
PULLP A10
MOVI CTARGET_INIT,A5
CALLA CREATE_OBJ ;CREATE THE TARGET
MOVE A0,A8
MOVIM COLOR_PLF,*A8(OPAL),L
MOVIM OID_BMES2,*A8(OID),W
MOVE *A8(OCTRL),A0,W
SRL 4,A0
SLL 4,A0
ORI DMACNZ,A0
MOVE A0,*A8(OCTRL),W
MOVE *A10+,A3,L
CALLA OBJ_TO_PNT ;ALIGN THE TARGET
CALLA INSERT_OBJ
MOVE *A10+,A11,L ;GET THE LOCATION OF THE POT VALUES
MOVE *A10+,A8,L ;GET LOCATION TO STORE THIS CRAP
MOVE *A10+,A9,W ;GET THE SWITCH BIT NUMBER
CC_WAIT
SLEEP 1
MOVE @CALIBRATE_NO_ABORT,A0,W
JRNZ CC_NO_ABORT
MOVI P1DATA,A2
MOVE @NPLAYERS,A0,W
CC_ESC_CK
MOVE *A2(PSTARTESC),A14,W
JRNE CC_ABORT
ADDI PDSIZE,A2
DEC A0
JRNN CC_ESC_CK
CC_NO_ABORT
CALLA READ_SW1_SW2 ; XUNIT
BTST A9,A0
JRNE CC_WAIT
MOVE *A11+,*A8+,L ;COPY THIS AWAY
MOVI OID_BMES2,A0
CALLA KILOBJ_ALL
SOUND1 COORD_SND ;ACKNOWLEDGE
CC_HOLD
SLEEP 1
CALLA READ_SW1_SW2 ; XUNIT
BTST A9,A0
JREQ CC_HOLD ;BR = WAIT WHILE BOZO HOLDS ON
SLEEP 10
CC_X
SETZ
RETP
CC_ABORT
MOVI OID_BMES2,A0
CALLA KILOBJ_ALL
CLRZ
RETP
*CALIBRATION TARGET OBJECT INITIALIZATION TABLE
CTARGET_INIT
.LONG calsight,DUMCOLL
.WORD OID_JUNK, DMAWNZ, M_SCRNOBJ|M_NOSCALE, 0
.LONG 0
*
*SOUND TO MAKE UPON ENTERING A COORDINATE
*
COORD_SND
.WORD 0F3F0H,61,08814H,0 ;COOL SOUND
**************************************************************************
* *
* CALIBRATION TABLE ENTRY *
* ----------------------- *
* .WORD PLAYER NUMBER, PLAYER COLOR *
* .LONG MESSAGE, POSITION, POT VALUE LOCATION, RAM BUFFER LOC *
* .WORD SWITCH BIT NUMBER *
* *
**************************************************************************
CALIBRATE_TABLE
.WORD 1,COLOR_BLUE
.LONG UL_MESS,[5,5],P1POTVALS,P1_CAL_UL
.WORD P1TRIGGER
.WORD 1,COLOR_BLUE
.LONG LR_MESS,[250,395],P1POTVALS,P1_CAL_LR
.WORD P1TRIGGER
.WORD 2,COLOR_RED
.LONG UL_MESS,[5,5],P2POTVALS,P2_CAL_UL
.WORD P2TRIGGER
.WORD 2,COLOR_RED
.LONG LR_MESS,[250,395],P2POTVALS,P2_CAL_LR
.WORD P2TRIGGER
.WORD 3,COLOR_YELLOW
.LONG UL_MESS,[5,5],P3POTVALS,P3_CAL_UL
.WORD P3TRIGGER
.WORD 3,COLOR_YELLOW
.LONG LR_MESS,[250,395],P3POTVALS,P3_CAL_LR
.WORD P3TRIGGER
.LONG 0
.IF GERMAN
PCAL_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+40,COLOR_PRGB,STRCNRMO,OID_BMES2
.STRING "\*bSPIELER %d PISTOLE\d\b\n\n"
.STRING "PISTOLE AUF\n"
.STRING "\b%p ZIEL RICHTEN\n"
.STRING "\bUND TRIGGER ZIEHEN.",0
.LONG STRING3
.LONG STRING1
.LONG RD7FONT
.WORD COLOR_GREY
.WORD COLOR_LF
.LONG STRING2
.WORD COLOR_GREY
UL_MESS
.STRING "OBERES LINKES",0
.EVEN
****CENT_MESS
**** .STRING "MITTLERES",0
**** .EVEN
LR_MESS
.STRING "UNTERES RECHTES",0
.EVEN
CALIBRATE_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF,COLOR_PWHITE,STRCNRMO,OID_JUNK
CALSKIP_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+200,COLOR_PWHITE,STRCNRMO,OID_JUNK
.STRING "ZUM VERLASSEN START DR{CKEN",0
.EVEN
CALABORT_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+80,COLOR_PDECAY,STRCNRM,OID_TEXT
.STRING "KALIBRIERUNG FEHLGESCHLAGEN.",0
.EVEN
CALSUCC_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+80,COLOR_PLF,STRCNRM,OID_TEXT
.STRING "KALIBRIERUNG ERFOLGREICH!",0
.EVEN
CALFAIL_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+30,COLOR_PLF,STRCNRM,OID_TEXT
.STRING "** CMOS RAM-FEHLER **\n\n"
.STRING "\bPISTOLEN-KALIBRIERUNGSWERTE\n"
.STRING "K]NNEN NICHT GESCHRIEBEN WERDEN.\n\n"
.STRING "\bPISTOLEN SIND NICHT AUSGERICHTET.\d\n\n\n"
.STRING "\bSPIELFORTSETZUNG MIT BELIEBIGEM KNOPF.",0
.WORD COLOR_DECAY
.WORD COLOR_RGB
.LONG RD7FONT
.WORD COLOR_WHITE
.ELSE
PCAL_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+40,COLOR_PRGB,STRCNRMO,OID_BMES2
.STRING "\*bPLAYER %d GUN\d\b\n\n"
.STRING "AIM THE GUN AT THE\n"
.STRING "\b%p TARGET\n"
.STRING "\bAND PULL TRIGGER.",0
.LONG STRING3
.LONG STRING1
.LONG RD7FONT
.WORD COLOR_GREY
.WORD COLOR_LF
.LONG STRING2
.WORD COLOR_GREY
UL_MESS
.STRING "UPPER LEFT",0
.EVEN
****CENT_MESS
**** .STRING "CENTER",0
**** .EVEN
LR_MESS
.STRING "LOWER RIGHT",0
.EVEN
CALIBRATE_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF,COLOR_PWHITE,STRCNRMO,OID_JUNK
CALSKIP_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+200,COLOR_PWHITE,STRCNRMO,OID_JUNK
.STRING "HIT START TO ABORT",0
.EVEN
CALABORT_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+80,COLOR_PDECAY,STRCNRM,OID_TEXT
.STRING "CALIBRATION ABORTED.",0
.EVEN
CALSUCC_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+80,COLOR_PLF,STRCNRM,OID_TEXT
.STRING "CALIBRATION SUCCESSFUL!",0
.EVEN
CALFAIL_MESS
MESS_MAC RD15FONT,2,200,SKYTOPOF+30,COLOR_PLF,STRCNRM,OID_TEXT
.STRING "** CMOS RAM ERROR **\n\n"
.STRING "\bUNABLE TO WRITE\n"
.STRING "CALIBRATION VALUES.\n\n"
.STRING "\bGUNS ARE NOT ALIGNED.\d\n\n\n"
.STRING "\bPRESS ANY BUTTON TO CONTINUE.",0
.WORD COLOR_DECAY
.WORD COLOR_RGB
.LONG RD7FONT
.WORD COLOR_WHITE
.ENDIF
**************************************************************************
* *
* POT_PRINT - PROCESS TO CONSTANTLY PRINT POTENTIOMETER VALUES. *
* *
**************************************************************************
POT_PRINT
CALLA DIPINIT ;Update DIPswitch RAM values
CALLR LOAD_P2_OFFSET ;GET THE OFFSET FOR PLAYER 2
MOVE @NPLAYERS,A0,W
MOVI POT_MESS,A8
PP_TITLE_LOOP
PUSHP A0
JSRP LM_PRINTF ;PRINT TITLES
JSRP LM_PRINTF
PULLP A0
DEC A0
JRGE PP_TITLE_LOOP
POT_PRINT_LOOP
MOVI OID_BMES1,A0
MOVI OID_BONUS,A1
CALLA CHANGE_OIDS ;CHANGE NEW TO OLD
CALLR LOAD_P2_OFFSET ;GET THE OFFSET FOR PLAYER 2
MOVE @NPLAYERS,A0,W
MOVI POT_VAL_MESS,A8
PP_VALUE_LOOP
PUSHP A0
JSRP LM_PRINTF ;PRINT ALL FOUR NEW
JSRP LM_PRINTF
PULLP A0
DEC A0
JRGE PP_VALUE_LOOP
MOVI OID_BONUS,A0
CALLA KILOBJ_ALL ;KILL OLD
SLOOP 3,POT_PRINT_LOOP
**************************************************************************
* *
* LOAD_P2_OFFSET - LOAD THE OFFSET FOR PLAYER 2'S CALIBRATION VALUES *
* BASED ON NPLAYERS. *
* RETURNS *
* RAMTEMP1 - STUFFED WITH [Y,X] OFFSET *
* *
**************************************************************************
LOAD_P2_OFFSET
MOVE @NPLAYERS,A14,W
SLL 4,A14
ADDI PP_P2_TITLE_OFFSET,A14
MOVE *A14,A14,W
SLL 16,A14
SRL 16,A14
MOVE A14,@RAMTEMP1,L
RETS
*
*PLAYER POTENTIOMETER MESSAGES
*
PP_P2_TITLE_OFFSET ;TABLE OF OFFSETS FOR PLAYER 2's VALUES
.WORD 0,0,-120 ;BASED ON THE VALUE OF NPLAYERS
POT_MESS
MESS_MAC RD15FONT,2,30,123+SKYTOPOF,COLOR_PBLUE,STRLNRMO,OID_TEXT
.STRING "P1 X =",0
.EVEN
MESS_MAC RD15FONT,2,30,143+SKYTOPOF,COLOR_PBLUE,STRLNRMO,OID_TEXT
.STRING "P1 Y =",0
.EVEN
MESS_MAC RD15FONT,2,270,123+SKYTOPOF,COLOR_PRED,STRLNRMO,OID_TEXT
.STRING "\*fP2 X =",0
.LONG RAMTEMP1
.EVEN
MESS_MAC RD15FONT,2,270,143+SKYTOPOF,COLOR_PRED,STRLNRMO,OID_TEXT
.STRING "\*fP2 Y =",0
.LONG RAMTEMP1
.EVEN
MESS_MAC RD15FONT,2,270,123+SKYTOPOF,COLOR_PYELLOW,STRLNRMO,OID_TEXT
.STRING "P3 X =",0
.EVEN
MESS_MAC RD15FONT,2,270,143+SKYTOPOF,COLOR_PYELLOW,STRLNRMO,OID_TEXT
.STRING "P3 Y =",0
.EVEN
*
*PLAYER POTENTIOMETER VALUE MESSAGES
*
POT_VAL_MESS
MESS_MAC RD15FONT,2,90,123+SKYTOPOF,COLOR_PBLUE,STRLNRMO,OID_BMES1
.STRING "%d",0
.LONG P1POTVALS
MESS_MAC RD15FONT,2,90,143+SKYTOPOF,COLOR_PBLUE,STRLNRMO,OID_BMES1
.STRING "%d",0
.LONG P1POTVALS+16
MESS_MAC RD15FONT,2,330,123+SKYTOPOF,COLOR_PRED,STRLNRMO,OID_BMES1
.STRING "\*f%d",0
.LONG RAMTEMP1
.LONG P2POTVALS
MESS_MAC RD15FONT,2,330,143+SKYTOPOF,COLOR_PRED,STRLNRMO,OID_BMES1
.STRING "\*f%d",0
.LONG RAMTEMP1
.LONG P2POTVALS+16
MESS_MAC RD15FONT,2,330,123+SKYTOPOF,COLOR_PYELLOW,STRLNRMO,OID_BMES1
.STRING "%d",0
.LONG P3POTVALS
MESS_MAC RD15FONT,2,330,143+SKYTOPOF,COLOR_PYELLOW,STRLNRMO,OID_BMES1
.STRING "%d",0
.LONG P3POTVALS+16
**************************************************************************
* *
* READ_ALL_POTS - ROUTINE TO READ ALL OF THE GUN POTS IN ONE PASS. *
* NOTHING *
* RETURNS: *
* NOTHING *
* Note: This routine trashes registers A0-A5. *
* *
**************************************************************************
READ_ALL_POTS
MOVI A2D_PORT,A4
MOVI INT_REG,A5
MOVK 8,A0 ;We need to have Bit 4 set always
MOVI P1POTVALS,A2 ;Array of Last values
READ_ALL_LOOP
CALLR READ_POT
BTST 0,A0 ;IS THIS AN X POT?
JRNZ READ_ALL_STORE ;BR = NO
NOT A1 ;INVERT X SO VALUE GROWS LEFT TO RIGHT
SLL 24,A1
SRL 24,A1
READ_ALL_STORE
MOVE *A2,A3,W ;GET THE LAST VALUE
MOVE A3,A14
SUB A1,A14
JRN RAP_POT_INCREASE
*
*Range check when the Pot value has decreased
*
CMPK 4,A14 ;IS THE VALUE CHANGE SMALL?
JRHI RAP_STORE_VALUE ;BR= No, store new value immediately
*Be careful of this next compare, we must act on a lower threshold when
*moving in this direction for some reason.
CMPK 2,A14
JRLO RA_SAME_AS_LAST
JRUC RAP_AVERAGE_5050
*
*Range check when the Pot value has increased
*
RAP_POT_INCREASE
ABS A14
CMPK 4,A14 ;IS THE VALUE CHANGE SMALL?
JRHI RAP_STORE_VALUE ;BR = Too big, must take effect
CMPK 2,A14
JRLS RA_SAME_AS_LAST ;BR = Too small, just keep last
*
*The change was small so we will Average the new pot reading with the old.
*This evens out the input from the potentiometer because it naturally
*bounces around quite a bit from tick to tick.
*
RAP_AVERAGE_5050
ADD A3,A1 ;LETS GET THE AVERAGE OF BOTH
SRL 1,A1
JRUC RAP_STORE_VALUE
RA_SAME_AS_LAST
MOVE A3,A1
RAP_STORE_VALUE
MOVE A1,*A2+,W ;Save in array for next tick
INC A0 ;Next pot
CMPK 8+5,A0 ;Have we hit'em all?
JRLS READ_ALL_LOOP ;BR = No, do another.
RETS
*
*This is here in case you would like to check the effect of the 25% to 75%
*weighting scheme.
*
RAP_AVERAGE_2575
SRL 2,A1 ;TAKE 25% OF THE NEW READING
MOVI 3,A14
SETF 2,1,1
MPYU A14,A3
SETF 32,1,1
SRL 2,A3 ;AND 75% OF THE OLD READING
ADD A3,A1 ;AND MAKE A NEW READING
JRUC RAP_STORE_VALUE
**************************************************************************
* *
* READ_POT - ROUTINE TO READ A GIVEN GUN POT. THIS IS A STRAIGHT LINE *
* PIECE THAT IS GUARANTEED TO CAUSE PROBLEMS. JUST FOR *
* TEST RIGHT NOW. *
* A0 = CHANNEL TO READ: *
* 0+8 = PLAYER 1 X *
* 1+8 = PLAYER 1 Y *
* 2+8 = PLAYER 2 X *
* 3+8 = PLAYER 2 Y *
* 4+8 = PLAYER 2 X *
* 5+8 = PLAYER 2 Y *
* A4 = A/D Port address *
* A5 = Poll register for A/D conversion done bit *
* RETURNS *
* A1 = 8 BIT A/D VALUE READ *
* *
**************************************************************************
**************************************************************************
* *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* *
* DO NOT PUT POT READING CODE *
* INTO THE INTERRUPTS WHILE THE *
* A/Ds ARE SHARING THE SOUND PORT. *
* WAIT FOR THE T-UNIT, WE WILL HAVE *
* DEDICATED ADDRESSES THEN. *
* *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE *
* *
**************************************************************************
READ_POT
MOVE A0,*A4,L
MSECWT 70
RP_CONVERT_WAIT
MOVE *A5,A14,L
BTST B_A2D,A14 ;DO WE HAVE VALUE?
JRNZ RP_CONVERTED ;BR = YES
DSJS A1,RP_CONVERT_WAIT
RP_CONVERTED
MSECWT 1
MOVE *A4,A1,L ;GET THE CONVERTED DATA
SLL 24,A1
SRL 24,A1
RETS
**************************************************************************
* *
* GO_DRIVER - THIS ROUTINE IS USED BY THE DIAGNOSTIC SYSTEM TO *
* TEST THE ATTACHED DRIVER BOARD. *
* *
**************************************************************************
GO_DRIVER
movk 1,a0
move a0,@_in_driver_test,1
CALLA MYOINIT
PAGEON
CALLA SINGLE_PLANE ;START US ONE PLANE OF FOREGROUND
CALLA CLR_SCRN
CLRM @SCRNTL,L ;RE-ADJUST SCREEN BOUNDRIES
MOVKM 3,@GAMERASE,W ;AUTO-ERASE FULL
CALLA SCR_BOX_OBJ
JSRP SCR_REV_OBJ
CALLA DRIVER_CLR
CREATE PID_IND,POT_PRINT ;CREATE THE POT VALUE
CREATE PID_GUN,GUN_WATCH ;CREATE THE GUN WATCHER PROCESS
CREATE PID_IND,COIL_CYCLE ;CYCLE THROUGH THE COILS
MOVI MESS_TITLE,A8 ;SET PARAMETERS
CALLA LM_SETUP ;GET PARAMS
MOVI STRCNRMO,A1
MOVI MESS_DRIVER,A8
JSRP PRINTF
MOVI DRIVEXIT_MESS,A8
JSRP LM_PRINTF
MOVI REPEATCOIL_MESS,A8
JSRP LM_PRINTF
JSRP WAIT_BUT
CALLA KILL_DESTRUCTIBLES
CALLA CLRDMAQ
CALLA MYOINIT
PAGEOFF
DISPON
CALLA CLR_SCRN
SOUND1 DIAG_ESCAPE
RETP
.IF GERMAN
DRIVEXIT_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+200,COLOR_PWHITE,STRCNRMO,OID_JUNK
.STRING "BELIEBIGER KNOPF ZUM VERLASSEN",0
.EVEN
REPEATCOIL_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+90,COLOR_PGREEN,STRCNRMO,OID_JUNK
.STRING "HALTE SERVICE-KREDIT ZUM WIEDERHOLEN DER SPULE",0
.EVEN
.ELSE
DRIVEXIT_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+200,COLOR_PWHITE,STRCNRMO,OID_JUNK
.STRING "ESCAPE OR BOMB BUTTON TO EXIT",0
.EVEN
REPEATCOIL_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+90,COLOR_PGREEN,STRCNRMO,OID_JUNK
.STRING "HOLD ENTER OR TRIGGER TO REPEAT",0
.EVEN
.ENDIF
**************************************************************************
* *
* COIL_CYCLE - PROCESS TO CYCLE THROUGH EACH COIL, LED AND FLASH LAMP. *
* *
**************************************************************************
COIL_CYCLE
MOVI COIL_CYCLE_TAB,A3
COIL_CYCLE_LP
MOVI COIL_MESS,A8
CALLA LM_SETUP
MOVE *A3,A8,L
JRZ COIL_CYCLE_RESET
PUSH A3
JSRP PRINTF
PULL A3
MOVE *A3(20H),A0,L
MOVE *A3(40H),A14,L
CALL A14
PUSHP A3
SLEEP 40
PULLP A3
MOVI OID_INFOTEXT,A0
CALLA KILOBJ_ALL
MOVE @COINS,A0,W
; ANDI 40H,A0 ;HOLDING SERVICE SWITCH
sll 16,a0
ori 0ffffh,a0
move @SWITCH,a1,W
and a1,a0
move @SWITCH2,a1,W
and a1,a0
not a0
move @_cabinet_type,a1,1
jrz _x_cc
andi 00001010H,a0
jruc _x_cc1
_x_cc:
andi 00101010H,A0 ;HOLDING ENTER OR TRIGGER BUTTONS
_x_cc1:
; JRZ COIL_REPEAT ;BR = YES, HOLD THIS COIL
jrnz COIL_REPEAT
ADDI 96,A3
calla READ_DIP
btst 12,a0
jrz COIL_REPEAT
cmpi (COIL_CYCLE_TAB+(96*2)),a3
jrz COIL_CYCLE_RESET
COIL_REPEAT
JRUC COIL_CYCLE_LP
COIL_CYCLE_RESET
LED_CYCLE
MOVI LED_CYCLE_TAB,A3
LED_CYCLE_LP
MOVI LED_MESS,A8
CALLA LM_SETUP
MOVE *A3,A8,L
JRZ LED_CYCLE_RESET
PUSH A3
JSRP PRINTF
PULL A3
MOVE *A3(20H),A0,L
MOVE *A3(40H),A14,L
CALL A14
PUSHP A3
SLEEP 40
PULLP A3
MOVI OID_INFOTEXT,A0
CALLA KILOBJ_ALL
MOVE @COINS,A0,W
; ANDI 40H,A0 ;HOLDING SERVICE SWITCH
sll 16,a0
ori 0ffffh,a0
move @SWITCH,a1,W
and a1,a0
move @SWITCH2,a1,W
and a1,a0
not a0
move @_cabinet_type,a1,1
jrz _x_cc2
andi 00001010h,a0
jruc _x_cc3
_x_cc2:
ANDI 00101010H,A0 ;HOLDING ENTER OR TRIGGER BUTTONS
_x_cc3:
; JRZ LED_REPEAT ;BR = YES, HOLD THIS LED
jrnz LED_REPEAT ;BR = YES, HOLD THIS LED
ADDI 96,A3
calla READ_DIP
btst 12,a0
jrz LED_REPEAT
cmpi (LED_CYCLE_TAB+(96*2)),a3
jrz LED_CYCLE_RESET
LED_REPEAT
JRUC LED_CYCLE_LP
LED_CYCLE_RESET
SLOOP 25,COIL_CYCLE
COIL_CYCLE_TAB
.LONG LEFT_COIL_MESS,[4,P1_RECOIL],COIL_DRIVE
.LONG CENTER_COIL_MESS,[4,P2_RECOIL],COIL_DRIVE
.LONG RIGHT_COIL_MESS,[4,P3_RECOIL],COIL_DRIVE
.LONG 0
LED_CYCLE_TAB
.LONG LEFT_LED_MESS,[10,P1_LED],COIL_DRIVE
.LONG CENTER_LED_MESS,[10,P2_LED],COIL_DRIVE
.LONG RIGHT_LED_MESS,[10,P3_LED],COIL_DRIVE
.LONG 0
LED_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+55,COLOR_PWHITE,STRCNRMO,OID_INFOTEXT
LEFT_LED_MESS
.STRING "PLAYER 1 GUN LED",0
.EVEN
CENTER_LED_MESS
.STRING "PLAYER 2 GUN LED",0
.EVEN
RIGHT_LED_MESS
.STRING "PLAYER 3 GUN LED",0
.EVEN
COIL_MESS
MESS_MAC RD7FONT,2,200,SKYTOPOF+55,COLOR_PWHITE,STRCNRMO,OID_INFOTEXT
LEFT_COIL_MESS
.STRING "PLAYER 1 GUN RECOIL",0
.EVEN
CENTER_COIL_MESS
.STRING "PLAYER 2 GUN RECOIL",0
.EVEN
RIGHT_COIL_MESS
.STRING "PLAYER 3 GUN RECOIL",0
.EVEN
.END