452 lines
7.6 KiB
NASM
452 lines
7.6 KiB
NASM
.FILE 'WLMAN.ASM'
|
||
.TITLE 'ROBO-RAMA GAME PROGRAM'
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
;
|
||
; INITIATED: JAN 6, 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 EXP3HI
|
||
;
|
||
;SYMBOLS EXTERNALLY DEFINED
|
||
;
|
||
.REF GET_STANDT2,WAY
|
||
.REF FRANIM,GAMSTATE,EHALT,BOOM2,GETFPAL,GET_WVADDR,BEGINOBJ2
|
||
.REF WAVEYX,PCNT,RANGRAND,PLYROBJS,HALT
|
||
.REF XYSKOBJ,GETHDR,CVRT,ABALL,RANDPER,DOBLO,P1DATA,P2DATA
|
||
.REF TSO_EXP2,FLASHME,GETUGH
|
||
;
|
||
;SYMBOLS DEFINED IN THIS FILE
|
||
;
|
||
.DEF KILL_WLMN,ONSCRN_WLMN,RECOIL,DIOFF
|
||
;
|
||
;UNINITIALIZED RAM DEFINITIONS
|
||
;
|
||
;
|
||
;EQUATES/STRUCURES FOR THIS FILE TO FOLLOW
|
||
;
|
||
HITWLM .EQU 35 ;61
|
||
;
|
||
;WLMAN DATA STRUCTURE
|
||
;
|
||
SPDLY .EQU PDATA ;UHB
|
||
WAY01 .EQU PDATA+8 ;UHB
|
||
TDIR .EQU PDATA+16 ;UHW
|
||
TSK_DIR .EQU PDATA+32 ;UHW
|
||
MODE .EQU PDATA+48 ;UHB
|
||
FIRED .EQU PDATA+56 ;UHB
|
||
SLOW .EQU PDATA+64 ;UHB
|
||
ABSRB .EQU PDATA+72 ;UHB
|
||
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
|
||
;
|
||
;
|
||
.TEXT
|
||
;
|
||
WX .LONG [117,0],[285,0]
|
||
WY .LONG [-25,0],[-25,0]
|
||
;
|
||
ONSCRN_WLMN:
|
||
;A2=# OF ORBS TO CREATE ON SCREEN AT START OF WAVE
|
||
MOVE A2,A10
|
||
OH1 PUSH A10 ;CREATE A BUNCH OF THEM
|
||
CREATE WLMNPID,OWLMN
|
||
PULL A10
|
||
DSJNE A10,OH1
|
||
RETS
|
||
;
|
||
OWLMN:
|
||
;A10=1 OR 2
|
||
;A0 & A1 ARE SET UP
|
||
;ADD IN OFFSETS FOR THIS PARTICULAR ARENA
|
||
DEC A10
|
||
SLL 5,A10
|
||
MOVI WX,A0
|
||
ADD A10,A0
|
||
MOVE *A0,A0,L
|
||
MOVI WY,A1
|
||
ADD A10,A1
|
||
MOVE *A1,A1,L
|
||
;
|
||
MOVE @GAMSTATE,A2
|
||
CMPI INAMODE,A2
|
||
JREQ DMD
|
||
MOVE @WAVEYX,A2,L
|
||
; A2=PACKED OFFSETS
|
||
MOVX A2,A3
|
||
SLL 16,A3
|
||
ADD A3,A0 ;ADJUSTED A0 XVAL!
|
||
ANDI 0FFFF0000H,A2
|
||
ADD A2,A1 ;ADJUSTED A1 YVAL!
|
||
;
|
||
DMD
|
||
;A0,A1 ARE SETUP.
|
||
CALLR IH1 ;INIT WLMN (BEGINOBJ)
|
||
CALLA BEGINOBJ2 ;STUFF OBJ
|
||
;CHANGE TO PURPLE PALETTE
|
||
MOVI PURPTK,A0
|
||
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
ANDI 0FFFFH,A0
|
||
MOVE A0,*A8(OPAL),L ;STORE THE NEW PALETTE
|
||
CALLR SETUP_WLMN ;INC WLMN_CNT
|
||
CLR A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVB A0,*A13(SPDLY)
|
||
MOVB A0,*A13(FIRED)
|
||
MOVB A0,*A13(ABSRB)
|
||
MOVK 9,A0
|
||
MOVE A0,*A13(TDIR)
|
||
;
|
||
; LOOP TOP FOR WLMNS
|
||
;
|
||
LUP_TOP:
|
||
;TOP OF WLMN LOGIC
|
||
MOVE @HALT,A0
|
||
JRNZ WZ
|
||
MOVE @EHALT,A0
|
||
JRZ MV ;BR=HALT ALL WLMNS!!
|
||
;PLAYER IS WALKING INTO ARENA SO DO NOT ALLOW MOVEMENT!
|
||
WZ SLEEP 2
|
||
JRUC LUP_TOP
|
||
MV:
|
||
;SEE IF ANY PLAYER IS WITHIN X DISTANCE.
|
||
;IF SO, SEEK TO MOST APPROPRIATE ANGLE AND X% OF TIME FIRE FLAMES AT PLAYER.
|
||
;STOP/SLEEP
|
||
TLP_TOP:
|
||
MOVB *A13(MODE),A1
|
||
JREQ SIT
|
||
CMPI 1,A1
|
||
JREQ SPN
|
||
CMPI 2,A1
|
||
JREQ SHT
|
||
; JRUC $
|
||
SIT MOVI 120,B0
|
||
MOVI 250,B1
|
||
CALLA RANGRAND
|
||
CMPI 150,A0
|
||
JRNC SPP
|
||
;NO SITTING
|
||
MOVI 2,A0
|
||
SPP
|
||
CALLA PRCSLP
|
||
|
||
MOVK 1,B0
|
||
MOVK 3,B1
|
||
CALLA RANGRAND
|
||
DEC A0
|
||
MOVB A0,*A13(MODE)
|
||
CMPI 1,A0
|
||
JREQ R1
|
||
CMPI 2,A0
|
||
JRNE TAG
|
||
;SHOOT
|
||
MOVK 2,A0
|
||
MOVB A0,*A13(FIRED)
|
||
JRUC TAG
|
||
R1
|
||
;WILL SPIN TO PLAYER
|
||
MOVB @PCNT,A3
|
||
INC A3
|
||
MOVB A3,@PCNT
|
||
ANDI 01,A3
|
||
SLL 5,A3
|
||
MOVI PLYROBJS,A2
|
||
ADD A3,A2
|
||
MOVE *A2,A0,L ;GET FIRST ENTRY
|
||
JRNZ PX
|
||
XORI 32,A3
|
||
ADDI PLYROBJS,A3
|
||
MOVE *A3,A0,L
|
||
|
||
PX CALLA XYSKOBJ
|
||
MOVE A5,A1
|
||
MOVE A6,A2
|
||
CALLA GETHDR
|
||
SLL 3,A0
|
||
ADDI CVRT,A0
|
||
MOVB *A0,A0
|
||
;DIR TO FACE IN A0
|
||
;A0=DIR TO SEEK TO FACE PLAYER
|
||
MOVE *A13(TDIR),A1
|
||
CMP A0,A1
|
||
JREQ AIM2
|
||
;NOT =
|
||
; CMPI 5,A0
|
||
; JRLT $
|
||
; CMPI 14,A0
|
||
; JRLT TYU
|
||
; MOVK 13,A0
|
||
;TYU
|
||
MOVE A0,*A13(TSK_DIR),W
|
||
MOVE A0,A1
|
||
MOVE *A13(TDIR),A0,W
|
||
CALLA WAY
|
||
JRC DIT ;INC
|
||
;DEC=CLRC
|
||
CLR A1
|
||
MOVB A1,*A13(WAY01)
|
||
JRUC DIT0
|
||
DIT MOVK 1,A1
|
||
MOVB A1,*A13(WAY01)
|
||
DIT0
|
||
JRUC TAG
|
||
;DIE OFF
|
||
DIOFF:
|
||
;CALLED FROM ENDWAVE
|
||
CREATE 0,TSO_EXP2
|
||
SLEEP 2
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
DIE
|
||
|
||
AIM2
|
||
;ALREADY HERE!
|
||
MOVK 2,A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVK 4,B0
|
||
MOVK 10,B1
|
||
CALLA RANGRAND
|
||
MOVB A0,*A13(FIRED)
|
||
JRUC TAG
|
||
|
||
SPN MOVB *A13(SPDLY),A1
|
||
CMPI 7,A1
|
||
JRLT AF
|
||
MOVI 2,A1
|
||
AF
|
||
DEC A1
|
||
MOVB A1,*A13(SPDLY)
|
||
JRNN TAG
|
||
MOVK 2,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
MOVB *A13(WAY01),A1
|
||
JRNZ INCIT
|
||
|
||
;TANK IS DEC TO LEFT!
|
||
DECIT MOVE *A13(TDIR),A0,W
|
||
DEC A0
|
||
; CMPI 4,A0
|
||
; JREQ OUT2
|
||
; CALLA INHERE
|
||
MOVE A0,*A13(TDIR),W
|
||
JRUC OUT
|
||
INCIT
|
||
;TANK IS ROTATING TO RIGHT
|
||
MOVE *A13(TDIR),A0,W
|
||
INC A0
|
||
; CMPI 14,A0
|
||
; JREQ OUT2
|
||
; CALLA IC
|
||
MOVE A0,*A13(TDIR),W
|
||
|
||
OUT
|
||
MOVE *A13(TDIR),A0
|
||
PUSH A0
|
||
CALLA GET_STANDT2 ;DOES ANI OF CORRECT VIEW
|
||
PULL A0
|
||
MOVE *A13(TSK_DIR),A1
|
||
CMP A0,A1
|
||
JRNE TAG
|
||
;REACHED CORRECT SEEK ANGLE.
|
||
;SHOOT AT PLAYER NOW
|
||
MOVI 300,A0
|
||
CALLA RANDPER
|
||
JRC OUT3 ;DON'T FIRE
|
||
OUT2
|
||
MOVK 2,A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVK 1,B0
|
||
MOVK 3,B1
|
||
CALLA RANGRAND
|
||
MOVB A0,*A13(FIRED)
|
||
JRUC TAG
|
||
SHT
|
||
; MOVB *A13(SLOW),A0
|
||
; CALLA PRCSLP
|
||
SLEEP 6
|
||
|
||
MOVE *A13(TDIR),A9
|
||
CREATE 0,ABALL
|
||
CREATE 0,RECOIL
|
||
MOVB *A13(FIRED),A0
|
||
ANDI 0FH,A0
|
||
DEC A0
|
||
MOVB A0,*A13(FIRED)
|
||
JRNZ TAG
|
||
|
||
OUT3
|
||
CLR A0
|
||
MOVB A0,*A13(MODE)
|
||
; MOVB @PCNT,A0
|
||
; ANDI 01,A0
|
||
; SLL 4,A0
|
||
; ADDI SLOCNT,A0
|
||
; MOVE *A0,A0
|
||
; MOVE A0,*A13(SLOW)
|
||
; JRUC TAG
|
||
TAG
|
||
SLEEP 1
|
||
JRUC LUP_TOP
|
||
|
||
;SLOCNT .WORD 03,0AH
|
||
|
||
RECOIL MOVE A9,A0
|
||
SLL 4,A0
|
||
MOVI XCHG,A1
|
||
ADD A0,A1
|
||
MOVE *A1,A10,W ;X MOD
|
||
MOVI YCHG,A2
|
||
ADD A0,A2
|
||
MOVE *A2,A9,W
|
||
MOVE *A8(OYPOS),A0
|
||
ADD A9,A0
|
||
MOVE A0,*A8(OYPOS)
|
||
MOVE *A8(OXPOS),A0
|
||
ADD A10,A0
|
||
MOVE A0,*A8(OXPOS)
|
||
SLEEP 2
|
||
MOVE *A8(OYPOS),A0
|
||
SUB A9,A0
|
||
MOVE A0,*A8(OYPOS)
|
||
MOVE *A8(OXPOS),A0
|
||
SUB A10,A0
|
||
MOVE A0,*A8(OXPOS)
|
||
DIE
|
||
|
||
XCHG: .WORD 0,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2,2,2,2,1
|
||
YCHG: .WORD 0,2,2,2,1,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2
|
||
|
||
;WAY:
|
||
;SPIN LEFT OR RIGHT
|
||
;A1=SEEK DIR
|
||
;A0=DIR IMAGE IS FACING NOW
|
||
;812
|
||
;7 3
|
||
;654
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
; SUB A0,A1
|
||
; MOVE A1,A2
|
||
; ABS A1
|
||
; CMPI 9,A1 ;5
|
||
; JRLT N0
|
||
; NEG A2
|
||
;N0: BTST 31,A2
|
||
; JRZ IC
|
||
;INHERE: DEC A0
|
||
; JRP TDEC
|
||
; MOVK 16,A0 ;8
|
||
;TDEC CLRC ;MEANS DEC
|
||
; RETS
|
||
;IC: INC A0 ;ROTATE TOWARD PLAYER
|
||
; CMPI 17,A0 ;9
|
||
; JRNE T1
|
||
; MOVK 1,A0
|
||
;T1: SETC ;MEANS INC
|
||
; RETS
|
||
;
|
||
IH1: ;ENTER HERE IF ON SCRN TANK
|
||
;STUFF NEEDED SHIT
|
||
;A0=OXVAL
|
||
;A1=OYVAL
|
||
MOVI MTK6,A2 ;(OIMG) DOES NOT MATTER
|
||
MOVI 230,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT|TYPWLMN,A5 ;(OID)
|
||
CLR A6 ;(OXVEL)
|
||
CLR A7 ;(OYVEL)
|
||
RETS
|
||
;
|
||
SETUP_WLMN:
|
||
MOVI WLMN,A2
|
||
CALLA GET_WVADDR
|
||
|
||
; MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL FOR THIS WLMN
|
||
; MOVE A1,*A13(LEVEL),W
|
||
|
||
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS WLMN
|
||
DEC A1
|
||
MOVE A1,*A0(16),W
|
||
RETS
|
||
|
||
KILL_WLMN:
|
||
;CALLED FROM COLL2.ASM WHEN A WLMN COLLIDES WITH SOMETHING.
|
||
;VICTIM PNTR IN A8
|
||
;A8=WLMN IMAGE PTR
|
||
MMTM SP,A1,A7,A10
|
||
MOVE *A8(OPLINK),A10,L
|
||
|
||
MOVE *A0(OID),A7,W ;KILLERS OID
|
||
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
|
||
ANDI F_SUBT,A7
|
||
DEC A7
|
||
SLL 3,A7
|
||
ADDI PUNISHT,A7
|
||
MOVB *A7,A7
|
||
MOVB *A10(ABSRB),A1
|
||
ANDI 0FFH,A1
|
||
ADD A7,A1
|
||
MOVB A1,*A10(ABSRB)
|
||
CMPI HITWLM,A1
|
||
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
|
||
JRLT KPY
|
||
;ABSORBED ENOUGH HITS TO DESTROY IT
|
||
MOVE *A0(OPLINK),A10,L
|
||
CREATE 0,WLMN_EXP ;BULLETS DIR WILL BE IN A10
|
||
MOVE *A8(OPLINK),A0,L
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
MMFM SP,A1,A7,A10
|
||
RETS
|
||
KPY PUSH A9
|
||
CALLA GETUGH
|
||
MOVI 018180000H,A9
|
||
CREATE 0,FLASHME
|
||
PULL A9
|
||
MMFM SP,A1,A7,A10
|
||
RETS
|
||
|
||
PUNISHT:
|
||
.BYTE 3,3,5,20,20
|
||
.EVEN
|
||
|
||
WLMN_EXP:
|
||
;WLMN MUST KNOW WHO SHOT IT!
|
||
MOVI EXP3HI,A0
|
||
CALLA ONESND
|
||
MOVB *A10(MYPLYR),A0
|
||
; JAUC TSO_EXP
|
||
;A0=1 OR 2
|
||
MOVI WALPT,A1 ;AMOUNT OF SCORE
|
||
JAUC DOBLO
|
||
|
||
.END
|
||
|
||
|
||
|
||
|
||
|