smashtv/POW1.ASM

296 lines
6.0 KiB
NASM
Raw Permalink Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'POW1.ASM (BLADE ATTACK)'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,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"
;
;SOUND HEADERS USED
;
.REF ICON,BLDS,YAMOFF,TING
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF ALIGNXY
.REF GETANIXY,AFONT0
.REF GPALOBJ,STFOBJ,INSOBJ,ADJSTWTL
.REF FRANIM,KILOBJ
.REF SCRTSTG,PUTA7
.REF DELOBJ
.REF GETCOS
.REF GETSIN
.REF DO_BND
.REF EXISTP
.REF KILALL
.REF KILL,ICNFLG
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF POW1ON,CHAINHIT,FLYSLUP,CHAINHIT2,PCNT
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS PCNT,8
;
;EQUATES
;
MAXHITS .EQU 5 ;MAXIMUM HITS PER CHNSW CAN TAKE
ADLTA .EQU (411775/(160/3)) ;RADIUS OF CIRCLE
;
;EQUATES FOR THIS FILE
;
;
.TEXT
;
POW1ON:
;CHECK HERE FOR COLL2 USAGE OF THESE REGISTERS! DO_BND?!?!
MMTM SP,A1,A7
MOVE A0,A9
MOVE *A0(OPLINK),A0,L
MOVB *A0(PNUM),A10 ;A10=1 OR 2
MOVK 1,A1
MOVB A1,*A0(BLDFLG) ;BLADES ON FLAG FOR THIS PLAYER
MOVB A1,@ICNFLG ;ICON GOT FLAG
CREATE 0,DOSAWS ;PASS PLAYER PNTR WHO TOUCHED ME
MOVE A8,A0
CALLA DELOBJ
MOVI BLDS,A0
CALLA ONESND
MMFM SP,A1,A7
RETS
;
DOSAWS:
;A9=PLAYER PNTR WHO TOUCHED ME
MOVE A10,A8
MOVE *A9(OPLINK),A10,L
MOVK 2,A1 ;BLADES INTO BNDTYP
MOVB A1,*A10(BNDTYP)
MOVE A10,A7 ;DO BND NEEDS PLYR PRC IN A7
CALLA DO_BND
MOVK 5,A11 ;5 ORBITING OBJECTS
SAWLUP:
SLEEP >B
CREATE CHNSWPID,CHAINSAW
DSJS A11,SAWLUP
; MOVI BLDS,A0
; CALLA ONESND
DIE
;
; DO CHNSW MOVEMENT LOGIC
;A11 = OFFSET FOR STARTING POSITION OF CHNSW
;A10=THIS PLAYER PROCESS PTR
;A8=PNUM 1 OR 2
CHAINSAW:
CLR A0
MOVB A8,*A13(MYPLYR) ;PLAYER # I SURROUND
MOVE A10,*A13(PLYRPC),L ;KEEP PLAYER PROCESS PTR
MOVB A0,*A13(HITS)
MOVB A0,*A13(ANIMTIK)
MOVI ADLTA,A0
MOVE A0,*A13(DELTA),L
CALLA SETPOINT
;
ENCIRCLE:
; MAKE CHNSW MOVE IN A CIRCLE AROUND PLAYER
CALLR ANICHNSW ;ANIMATE CHNSW
; MOVB @PCNT,A0
; ANDI 1,A0
; JRZ IP
CALLA ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER
;IP
MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA
MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE
ADD A2,A0
CALLA GETCOS
MOVE A0,A11
MOVK 5,A0
MPYS A0,A11
MOVE A14,*A13(THETA),L
MOVE A14,A0
CALLA GETSIN
MOVE A0,A3
MOVK 5,A0
MPYS A0,A3
MOVE A3,A10
MOVE *A8(OXVAL),A3,L
MOVE *A8(OYVAL),A4,L
ADD A11,A3
ADD A10,A4
MOVE A3,*A8(OXVAL),L
MOVE A4,*A8(OYVAL),L
SLOOP 1,ENCIRCLE
FLYSLUP2:
;COLLISION ROUTINE SENDS BLADE HERE
NEG A11
NEG A10
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
MOVI TING,A0
CALLA ONESND
JRUC FLY1
FLYSLUP:
;COLLISION ROUTINE SENDS BLADE HERE
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
FLY1:
CALLR ANICHNSW ;ANIMATE FAST SAW
MOVI [>23,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRNZ CHNSWDIE
SLOOP 1,FLY1
CHNSWDIE:
MOVE A8,A0
CALLA DELOBJ ;KILL CHAINSAW IMAGE
CLR A1
NOT A1 ;MASK FOR PROCESS EXIST ROUTINE
MOVK 2,A3 ;ASSUME CHAINSAW'S BOUNDARY
;
;MAKE THIS JUST A CHECK OF A FLAG FOR EFFICIENCY!
;
MOVE *A13(PROCID),A2,W ;SAVE CURRENT PROCESS ID
MOVI DUM_ID,A0
MOVE A0,*A13(PROCID),W ;REPLACE ID FOR THIS PROCESS
MOVI CHNSWPID,A0 ;CHAINSAW PROCESS
CALLA EXISTP
JRNZ DNBL ;BR = STILL A BLADE AROUND
;TURN OFF BLADE SOUND
MOVI YAMOFF,A0
CALLA ONESND
;RESET BLADE FLAG FOR THIS PLAYER
MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND
CLR A0
MOVB A0,*A7(BLDFLG)
MOVK 1,A3 ;ASSUME HELPER BOUNDARY
MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND
MOVI LSRPID,A0 ;CHNSW PROCESS ID
CLR A1
NOT A1
CALLA EXISTP
JRNZ SETBND ;BR = DOES EXIST
CLR A3 ;ASSUME NORMAL BOUNDARY
JRUC SET2
SETBND:
;SOMEONE HAS A HELPER, IS IT ME?
MOVE *A0(TORSO),A1,L ;PLAYER THIS HELPER SURROUNDS
MOVE *A1(OPLINK),A1,L
CMP A1,A7
JREQ SET2 ;BR=YES! I HAVE HELPER ALSO!
CLR A3
SET2
MOVB A3,*A7(BNDTYP)
CLR A2
MOVB A2,*A7(PRVBND)
CALLA DO_BND
DNBL
DIE
;
;ANIMATE CHNSW ROUTINE
;
ANICHNSW:
MOVB *A13(ANIMTIK),A0
DEC A0
MOVB A0,*A13(ANIMTIK)
JRNN NOTNEXT
;FALLS HERE IF NEGATIVE
MOVK 4,A1
JSRP FRANIM ;1 FRAME STEP
MOVB A0,*A13(ANIMTIK) ;SAVE SLEEP TIME BETWEEN FRAMES
JRNC NOTNEXT
MOVI BLADES,A9
NOTNEXT:
RETS
;
SETPOINT:
MOVI INITAB,A14
CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE
CALLA STFOBJ ;STUFF OBJECT DATA
MOVE A13,*A0(OPLINK),L
CALLA ADJSTWTL ;PUT US IN THE WORLD
CALLA INSOBJ ;INSERT OBJECT INTO LIST
MOVE A0,A8
MOVE A8,A10
;A9=PLAYER WHO TURNED ME ON
MOVE *A9(OPLINK),A0,L
MOVE *A0(TSO_PTR),A8,L
MOVE A8,*A13(TORSO),L ;PLACE TORSO PTR INTO BLADE PDATA
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
SUBI [13,0],A2
SUBI [4,0],A3
MOVE A2,*A8(OYVAL),L ;INITIAL POSITION OFFSET OF OBJECT
MOVE A3,*A8(OXVAL),L
CLR A0
MOVE A0,*A13(PTRX),W ;OLD X,Y VALUES
MOVE A0,*A13(PTRY),W
MOVE A0,*A13(THETA),L
MOVI BLADES,A9
RETS
CHAINHIT2:
;CALLED FROM COLLISION ROUTINE
MOVE *A8(OPLINK),A0,L ;GET PROCESS ID BACK
;BLADE TO FLY OFF
;RESET HERE
MOVI FLYSLUP2,A7
CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR
RETS
;
CHAINHIT:
;CALLED FROM COLLISION ROUTINE
MMTM SP,A1,A13
MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK
MOVB *A13(HITS),A1
INC A1
MOVB A1,*A13(HITS)
CMPI MAXHITS,A1
JRLT HO
;BLADE TO FLY OFF
;RESET HERE
MOVE A13,A0
MOVI FLYSLUP,A7
CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR
HO MMFM SP,A1,A13
RETS
INITAB:
.LONG 0,0,BLD1
.WORD 170,DMAWNZ,CLSPLYR|TYPPRSM
.LONG 0,0
;
;ANIMATION TABLE FOR CHAINSAW
;
BLADES .LONG BLD4
.WORD 1
.LONG BLD3
.WORD 1
.LONG BLD2
.WORD 1
.LONG BLD1
.WORD 1
.LONG 0
.END