smashtv/POW2.ASM

325 lines
6.2 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

.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