smashtv/POW2.ASM

325 lines
6.2 KiB
NASM
Raw Permalink Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'POW2.ASM (ORBITING LASER)'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL & ROBERT ASHWORTH
;
; 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 WOO2
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF PUTA7,FLASHME
.REF GETANIXY,AFONT0
.REF GPALOBJ,STFOBJ,INSOBJ,ADJSTWTL
.REF FRANIM,KILOBJ,KILALL
.REF SCRTST
.REF DELOBJ
.REF GETCOS
.REF GETSIN
.REF DO_BND
.REF EXISTP
.REF KILL
.REF ICNFLG
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF POW2ON,LSHIT
.DEF LASRX,LASRY,ALIGNXY
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS LASRX,32
.BSS LASRY,32
;
;EQUATES
;
ADLTA .EQU (411775/(160/2))
; LASER/BLADES DATA STRUCTURE
;
PTRX .EQU PDATA ;UHW ;LAST X
PTRY .EQU PDATA+16 ;UHW ;LAST Y
ANIMTIK .EQU PDATA+32 ;UHL ;FRAME SLEEP TIME
THETA .EQU PDATA+64 ;SHL ;CURRENT PROGRESSION
DELTA .EQU PDATA+96 ;SHL ;DELTA ANGLE
LEG .EQU PDATA+128 ;UHL LEG OF PLAYER WHO COLLECTED ME
;
;
;EQUATES FOR THIS FILE
;
;
.TEXT
;
POW2ON:
;FROM COLLISION ROUTINE!
MOVE A0,A9 ;LEG PTR OF WHO GOT ME
; MOVE *A0(OPLINK),A0,L
; MOVK 1,A1
; MOVB A1,*A0(LSRFLG) ;HELPER ON FLAG FOR THIS PLAYER;
MOVE A8,A0
CALLA DELOBJ
MOVI WOO2,A0
CALLA ONESND
MOVK 1,A11 ;1 ORBITING OBJECT
ALL1:
CREATE LSRPID,LASER
DSJS A11,ALL1
RETS
; DO LASER MOVEMENT LOGIC
;A11 = OFFSET FOR VECTOR POINT FOR STARTING POSITION OF LASER
LASER:
;A9=LEG IMG PNTR OF PLAYER WHO TOUCHED ME
MOVE *A9(OPLINK),A7,L
MOVK 1,A0
MOVB A0,*A7(BNDTYP)
MOVB A0,@ICNFLG
CALLA DO_BND
CLR A0
MOVB A0,*A13(ANIMTIK)
MOVI ADLTA,A0
MOVE A0,*A13(DELTA),L
CALLA SETPOINT
;
ENCIRCLE:
; MAKE LASER MOVE IN A CIRCLE AROUND PLAYER
CALLA ANILASER ;ANIMATE LASER
CALLR ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER
MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA
MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE
ADD A2,A0
CALLA GETCOS
MOVE A0,A11
MOVK 2,A0
MPYS A0,A11
MOVE A14,*A13(THETA),L
MOVE A14,A0
CALLA GETSIN
MOVE A0,A3
MOVK 2,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
ANILASER:
;ANIMATE LASER
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 FLASER,A9
NOTNEXT:
CALLA GETANIXY
MOVE A2,@LASRY,L
MOVE A3,@LASRX,L
RETS
;
LASERDIE:
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
;TURN HELPER WHITE, FLOAT AWAY
; CLR A0
; MOVE A0,*A8(OID)
FLYER:
; CALLR ANILASER ;DO ANIMATION
MOVI [>23,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRNZ LSER
MOVI 006060000H,A9
CREATE 0,FLASHME
SLOOP 10,FLYER
LSER:
CLR A0
MOVE A0,@LASRX,L
MOVE A0,@LASRY,L
MOVE A8,A0
CALLA DELOBJ ;KILL IMAGE
CLR A1
NOT A1 ;MASK FOR PROCESS EXIST ROUTINE
MOVK 2,A3 ;ASSUME CHAINSAW'S BOUNDARY
;MAKE THIS SMARTER!
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 SETAREA ;BR = DOES EXIST
MOVK 1,A3 ;ASSUME CHNSW'S BOUNDARY
;WHAT?
MOVI LSRPID,A0 ;LASER PROCESS ID
CALLA EXISTP
JRNZ SETAREA ;BR = DOES EXIST
CLR A3 ;ASSUME NORMAL BOUNDARY
SETAREA:
MOVE *A13(LEG),A0,L
MOVE *A0(OPLINK),A7,L
MOVB A3,*A7(BNDTYP)
CLR A2
MOVB A2,*A7(PRVBND)
CALLA DO_BND
DIE
ALIGNXY:
; KEEP LASER WITHIN X CENTERPOINT OF PLAYER
; PARMS:
;
; A8 = PTR TO PLINDX
;
MOVE *A13(PTRX),A4,W ;OLD X,Y VALUES
MOVE *A13(PTRY),A5,W
MOVE A8,A10
MOVE *A13(LEG),A8,L
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
SWAP A2,A3
SRL 16,A2
SRL 16,A3
MOVE A4,A4
JRZ PK
DIFF:
CMP A4,A2
JREQ DOY
JRGT ADDX ;NEW X POS > OLD X POS
SUBX:
SUB A2,A4
MOVE *A8(OXPOS),A6
SUB A4,A6
MOVE A6,*A8(OXPOS)
JRUC DOY
ADDX:
SUB A2,A4
NEG A4
MOVE *A8(OXPOS),A6
ADD A4,A6
MOVE A6,*A8(OXPOS)
DOY:
CMP A5,A3
JREQ PK ;NO DIFFERENCES IN X,Y BYE!
JRGT ADDY ;NEW Y POS > OLD Y POS
SUBY:
SUB A3,A5
MOVE *A8(OYPOS),A6
SUB A5,A6
MOVE A6,*A8(OYPOS)
JRUC PK
ADDY:
SUB A3,A5
NEG A5
MOVE *A8(OYPOS),A6
ADD A5,A6
MOVE A6,*A8(OYPOS)
PK:
MOVE A2,*A13(PTRX),W
MOVE A3,*A13(PTRY),W
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,A10
;A9=CORRECT LEG PTR
MOVE A9,*A13(LEG),L
;A7=A7 ALREADY?
MOVE *A9(OPLINK),A7,L ;LEGS HAVE SAME OPLINK AS TORSO!
;A7 NOW EQUALS TORSO PROC OF PLAYER WHO PICKED UP HELPER ICON
MOVE A0,*A7(LSRPTR),L
;THIS OKAY?
MOVE A9,A8
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
ADDI [5,0],A2
MOVE A2,*A8(OYVAL),L
SUBI [7,0],A3
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 FLASER,A9
RETS
LSHIT:
;CALLED FROM COLLISION ROUTINE
;ALSO CALLED FROM ROBO WHEN PLAYER DIES
;A8=HELPER IMG PNTR
MMTM SP,A0,A7,A13
;PUSHING ENOUGH STUFF HERE?
CLR A0
MOVE A0,*A8(OID)
MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK
;HELPER TO FLY OFF
;RESET HERE
MOVE *A13(LEG),A0,L ;GET LEG I SURROUND
MOVE *A0(OPLINK),A0,L ;GET PLAYER PROC
CLR A7
MOVE A7,*A0(LSRPTR),L ;ZERO PLAYER PROC LASER PNTR
MOVE A13,A0
MOVI LASERDIE,A7
CALLA PUTA7 ;THIS HLPR WILL NOW WAKE UP AT A7 ADDR
MMFM SP,A0,A7,A13
RETS
INITAB:
.LONG 0,0,HLPR1
.WORD 171,DMAWNZ,CLSPLYR|TYPLSR ;171
.LONG 0,0
;
;ANIMATION TABLE FOR LASER
;
FLASER:
.LONG HLPR1
.WORD 3
.LONG HLPR2
.WORD 3
.LONG HLPR3
.WORD 3
.LONG HLPR4
.WORD 3
.LONG HLPR5
.WORD 3
.LONG HLPR6
.WORD 3
.LONG 0
.END