smashtv/CHASER.ASM

338 lines
5.8 KiB
NASM
Raw Permalink Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'CHASER.ASM'
.TITLE 'ROBO-RAMA GAME PROGRAM CHASER'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 13,1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL
;
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
;
;SOUNDS
;
.REF TING,EXP1,LEGOSND
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GETADIR,CIRCUIT,PLYROBJS,DOCHS,BLOW
.REF BEGINOBJ,SET_GATE_2
.REF RANGRAND,RANDPER,EHALT,WAVE
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF STRT_CHSR,HIT_CHSR,SCRL,KILL_CHSR,KC2
;
;EQUATES FIRST ORIGINATED IN THIS FILE
;
MAXPCS .EQU 1
LSTPC .EQU MAXPCS-1
;
;DATA STRUCTURE OF MASTER PIECE POINTER
;
BLDVW .EQU PDATA ;UHB BLADE VIEW 0-3
CDELAY .EQU PDATA+8 ;UHB DELAY BEFORE UPDATING
DLY .EQU PDATA+16 ;UHL DLY VEL UPDATE FOR THIS CNT
GDIE .EQU PDATA+48 ;UHB GONNA DIE FLAG
NONO .EQU PDATA+56 ;UHB 1=COMING OUT,0=DO NOT ENTER SAFE AREA
;
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS TRAM1,32*MAXPCS+32
.BSS SCRL,8
.BSS TRAM2,32*MAXPCS
SX: .LONG -080000H,01980000H,0C20000H,0C20000H
SY: .LONG 0700000H,0700000H,-20000H,0F00000H
CIDS: .LONG CID1,CID2,CID3 ;CIRCUIT INFO FOR CHASER DOOR
CID1:
.WORD 3,2,1,3,2,1,2,1,1,1 ;WAVE 1-10 (DOOR CHASER COMES FROM)
CID2:
.WORD 1,1,2,1,2,1,1,1,1,1,1,3,1,1,1,2,1,2
CID3:
.WORD 1,1,2,1,2,1,1,1,1,1,1,3,1,1,1,2,1,2,1,1,1,1
HIT_CHSR
MMTM SP,A1
MOVE *A0(OPLINK),A10,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
MOVE *A8(OPLINK),A0,L
MOVE A10,*A0(DLY),L
MOVI TING,A0
CALLA ONESND
MMFM SP,A1
RETS
KILL_CHSR
MMTM SP,A1
MOVE *A8(OPLINK),A0,L
MOVB *A0(GDIE),A1
JRNE NX
;
MOVK 1,A1
MOVB A1,*A0(GDIE)
CREATE KCHAS,KCHS
NX MMFM SP,A1
RETS
KC2 ;COMES HERE IF RING HIT CHASER
MMTM SP,A1
MOVE *A8(OPLINK),A0,L
MOVB *A0(GDIE),A1
JRNE NX2
;
MOVK 1,A1
MOVB A1,*A0(GDIE)
CREATE 0,KCHS1
NX2 MMFM SP,A1
RETS
KCHS
SLEEP 30
KCHS1 MOVE *A8(OPLINK),A0,L
CALLA KILL
MOVI EXP1,A0
CALLA ONESND
CLR A1
NOT A1
MOVI CHSR2PID,A0
CALLA EXISTP
JRNZ NXO
;DID NOT FIND AGAIN PROC
CREATE CHSR2PID,AGAIN
NXO
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE A0,*A8(OID)
JAUC BLOW
AGAIN
SLEEP 60*4 ;6
;SEND OUT ANOTHER ROUND OF THESE CHASER GUYS
CREATE CHSR2PID,DOCHS
MOVI LEGOSND,A0 ;LETS GO
CALLA ONESND
DIE
STRT_CHSR:
;A9=0 OR 32
MOVE @CIRCUIT,A0
SLL 5,A0
ADDI CIDS,A0
MOVE *A0,A0,L
MOVE @WAVE,A1
DEC A1
SLL 4,A1
ADD A1,A0
MOVE *A0,A0,W
;COME OUT OF DOOR OTHER THAN EXIT DOORS
MOVE A0,A8
MOVI 25,A1 ;OPEN TIME
CALLA SET_GATE_2
MOVI TRAM1,A11
CMPI 32,A9
JRNE TRW
MOVI TRAM2,A11
TRW MOVI PLYROBJS,A0
ADD A9,A0
MOVE *A0,A0,L
MOVE A0,*A11,L ;MOVE OBJECT BLOCK PTR INTO TOP OF RAM STACK
MOVI MAXPCS,A9 ;CHASER LENGTH
MOVK 1,A10
LPA:
CREATE CHSRPID,CHASER
INC A10
CMP A9,A10
JRLE LPA
DIE
;JERK: .LONG [0,5],[0,-5],[5,0],[-5,0]
CHASER:
DEC A8 ;A8=DOOR 1-4
SLL 5,A8
MOVI SX,A0
ADD A8,A0
MOVE *A0,A0,L ;X
ADDI SY,A8
MOVE *A8,A1,L ;Y
MOVI BLD1,A2
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPCHSR,A5
CLR A6
CLR A7
MOVE A7,*A13(DLY),L
CALLA BEGINOBJ
MOVE A10,A0
SLL 5,A0
;A11=TRAM PTR
ADD A11,A0
MOVE A8,*A0,L
MOVK 1,A0
MOVB A0,*A13(CDELAY)
MOVB A0,*A13(NONO)
MOVB A0,*A13(BLDVW)
CLR A0
MOVB A7,*A13(GDIE)
SLEEP 2
LPTP:
;CHECK MAGIC BOXES
;DO NOT ALLOW ENTRY
; MOVI [>43,>41],A2
; MOVI [>DC,>151],A3
; CALLA SCRTSTG
; JRZ C32
;
;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG!
;
; DEC A0
; SLL 5,A0
; ADDI JERK,A0
; MOVE *A0,A0,L
; MOVY A0,A1
; SRL 16,A1
; CLR A2
; MOVX A0,A2
; MOVE *A8(OXPOS),A3
; ADD A2,A3
; MOVE A3,*A8(OXPOS)
; MOVE *A8(OYPOS),A3
; ADD A1,A3
; MOVE A3,*A8(OYPOS)
;
;
;C32
MOVB @SCRL,A0
JRZ LOO
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
JRUC NO_SK
LOO MOVE *A13(DLY),A0,L
JRZ LPO
;BULLET HAS HIT BLADE
CLR A1
MOVE A1,*A13(DLY),L
MOVE *A0(BLTDIR),A0
SLL 4,A0
MOVI CHSX,A1
ADD A0,A1
MOVE *A1,A1,W
MOVE *A8(OXPOS),A2
ADD A1,A2
MOVE A2,*A8(OXPOS)
MOVI CHSY,A1
ADD A0,A1
MOVE *A1,A1,W
MOVE *A8(OYPOS),A0
ADD A1,A0
MOVE A0,*A8(OYPOS)
LPO
MOVB *A13(CDELAY),A1
ANDI 07H,A1
DEC A1
MOVB A1,*A13(CDELAY)
JRNE NO_SK
MOVI 15,A1
MOVB A1,*A13(CDELAY)
MOVE A10,A1
LPTP2 DEC A1
MOVE A1,A0
SLL 5,A0
ADD A11,A0
MOVE *A0,A0,L ;OBJ TO SK
JRZ LPTP2
CALLR PLTLINE
MOVE A5,*A8(OXVEL),L
MOVE A6,*A8(OYVEL),L
NO_SK
;UPDATE VIEW OF BLADE
MOVB *A13(BLDVW),A0
ANDI 07H,A0
INC A0
MOVB A0,*A13(BLDVW)
CMPI 4,A0 ;4
JRNE KP_GO
CLR A0
MOVB A0,*A13(BLDVW)
KP_GO
MOVI CHSRIMG,A1
SLL 5,A0
ADD A0,A1
MOVE *A1,A1,L ;GET NEW OIMG FOR THIS CHASER PIECE
MOVE *A8(OFLAGS),A4
CALLA ANI
SLEEP 3
JRUC LPTP
CHSX .WORD 0,0,6,5,6,0,-5,-6,-6
CHSY .WORD 0,-5,-6,0,6,5,6,0,-6
;8 1 2
;7 3
;6 5 4
;A10 SHOULD BE 1-8!
CHSRIMG:
.LONG BLB4,BLB3
.LONG BLB2,BLB1
.LONG BLB4,BLB3
.LONG BLB2,BLB1
; PLTLINE - MAKE AN OBJECT TRAVEL FROM PNT. A TO PNT. B
;
; A8 = OBJECT SEEKING
; A0 = OBJECT SEEKED
; RETURNS:
; A5 = X VEL UHL
; A6 = Y VEL UHL
PLTLINE:
MOVE *A0(OXPOS),A5,W
MOVE *A0(OYPOS),A6,W
; ADDI 15,A6
MOVE *A8(OXPOS),A3,W
MOVE *A8(OYPOS),A4,W
SUB A3,A5 ;FIND DIFFERENCE
SUB A4,A6
MOVE A6,A3 ;
MOVE A5,A1
ABS A5
ABS A6
ADD A5,A6 ;CALC SUM ABS(DX+DY)
SLL 16,A1 ;SHIFT TO ACCOMODATE FRACTIONAL VELOCITY
SLL 16,A3
DIVS A6,A1 ;GENERATE SPEED RATIOS
DIVS A6,A3
MOVI 8,A2
MOVK 3,A5 ;MULTIPLY BY VELOCITY FACTOR
MPYU A2,A5
MPYS A5,A3
MPYS A1,A5 ;FINAL X VEL
SRA 4,A3
SRA 4,A5
MOVE A3,A6 ;FINAL Y VEL
RETS
.END