3513 lines
86 KiB
NASM
3513 lines
86 KiB
NASM
.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
|
||
|
||
|