321 lines
6.1 KiB
NASM
321 lines
6.1 KiB
NASM
.FILE 'LZRORB.ASM'
|
||
.TITLE 'ROBO-RAMA GAME PROGRAM'
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
;
|
||
; INITIATED: DECEMBER 20, 1989
|
||
; MODIFIED: !
|
||
; SOFTWARE: EUGENE JARVIS
|
||
;
|
||
; 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"
|
||
.INCLUDE "MARK.EQU"
|
||
|
||
;
|
||
;SYMBOLS EXTERNALLY DEFINED
|
||
;
|
||
.REF ECON,ORB_LIT,DELPAL
|
||
.REF GET_VALID_XY,GAMSTATE,WAVEYX,BEGIN_OBJ,BEGIN_OBJ2,EHALT
|
||
.REF RANGRAND,DRINF,SET_GATE_2,GET_WVADDR,DEXIT
|
||
;
|
||
;SYMBOLS DEFINED IN THIS FILE
|
||
;
|
||
.DEF SPAWN_ORB,KILL_ORB,ONSCRN_ORB,ORB_CNT,ORB_DN,MAXORB
|
||
|
||
;
|
||
;UNINITIALIZED RAM DEFINITIONS
|
||
;
|
||
.BSS MAXORB,8 ;MAXIMUM ON SCREEN FOR CURRENT WAVE
|
||
.BSS ORB_CNT,16 ;ORB CNT ON SCREEN
|
||
.BSS ORB_DN,16 ;0=NO, 1=YES
|
||
|
||
;
|
||
;EQUATES/STRUCURES FOR THIS FILE TO FOLLOW
|
||
;
|
||
HSPEED .EQU 08000H
|
||
;
|
||
;ORB DATA STRUCTURE
|
||
;
|
||
|
||
.TEXT
|
||
;
|
||
;COLORS 1-7 COLOR CYCLE IN 'ORBP' PALETTE
|
||
;
|
||
ONSCRN_ORB:
|
||
;A2=# OF ORBS TO CREATE ON SCREEN AT START OF WAVE
|
||
CREATE 0,ORB_LIT
|
||
MOVB A2,@ECON ;YES ENEMY TO ENEMY!
|
||
OH1 PUSH A2 ;CREATE A BUNCH OF THEM
|
||
CREATE ORBPID,OORB
|
||
PULL A2
|
||
DSJNE A2,OH1
|
||
RETS
|
||
|
||
OORB:
|
||
;OORB IS CALLED AT THE START OF A WAVE TO PLACE X # OF ORBS ON SCREEN
|
||
;AT THE BEGINNING OF A WAVE
|
||
|
||
;CLEAR ANY STRUCTURE VARIABLES HERE
|
||
|
||
CLR A11 ;A11 CLR=SKIP CIRCLE TABLE ALIGNMENT
|
||
CALLA GET_VALID_XY ;MAKE SURE NEW ORB IS NOT
|
||
;OVERLAPPING ANY EXISTING SHAPE
|
||
;WHICH IS ALREADY ON SCRN AT START
|
||
;A0 & A1 ARE SET UP
|
||
;ADD IN OFFSETS FOR THIS PARTICULAR ARENA
|
||
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 ORB (BEGIN_OBJ)
|
||
CALLA BEGIN_OBJ2 ;STUFF OBJ
|
||
CALLR SETUP_ORB ;INC ORB_CNT
|
||
|
||
JRUC LUP_TOP
|
||
|
||
SPAWN_ORB:
|
||
;CALLED TO SEND OUT 1 ORB FROM A RANDOM DOOR.
|
||
;SPAWN ORB IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
|
||
;ALL THE BAD GUYS THROUGHOUT A WAVE
|
||
MOVE @ORB_DN,A0 ;0=STILL SOME TO COME OUT
|
||
;1=ALL FINISHED!
|
||
JRNZ ORB_OUT
|
||
MOVE @ORB_CNT,A2 ;MOVE BYTE (# ORB ON SCRN) TO A2
|
||
MOVB @MAXORB,A3
|
||
CMP A3,A2 ;ORBS MAXED OUT?
|
||
JRGT ORB_OUT ;
|
||
|
||
CREATE ORBPID,AORB ;START ONE ORB
|
||
ORB_OUT:
|
||
RETS
|
||
;
|
||
AORB:
|
||
;YES A NEW ORB WILL APPEAR
|
||
;THIS ORB WAS SPAWNED FROM 'WAVE OVERLORD' CODE
|
||
CALLA INIT_ORB
|
||
CALLR SETUP_ORB ;INC CNT, SET DIR, SET DEATH FLAG, ETC
|
||
|
||
;
|
||
; LOOP TOP FOR ORBS
|
||
;
|
||
LUP_TOP:
|
||
;TOP OF ORB LOGIC
|
||
MOVE @EHALT,A0
|
||
JRZ MV ;BR=HALT ALL ORBS!!
|
||
;PLAYER IS WALKING INTO ARENA SO DO NOT ALLOW MOVEMENT!
|
||
SLEEP 2
|
||
JRUC LUP_TOP
|
||
MV:
|
||
SLEEP 1
|
||
JRUC LUP_TOP
|
||
|
||
MOVE A8,A0
|
||
CALLA DELPAL
|
||
CALLA DELOBJ
|
||
DIE
|
||
|
||
|
||
|
||
INIT_ORB:
|
||
;INITIAL ORB POSITION,IMAGE SHAPE,AGE ETC....
|
||
;DO STFOBF AND GET A0 PNTR
|
||
MOVI 1,B0 ;DOORS 1-4
|
||
MOVI 4,B1
|
||
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
|
||
MOVE A0,A1
|
||
SLL 5,A1
|
||
ADDI DRINF,A1
|
||
MOVE *A1,A1,L
|
||
MOVB *A1,A1
|
||
JRZ G
|
||
CMPI 06,A1
|
||
JRGE G
|
||
;DOOR THIS GUY WILL BE SENT TO IS CLOSING RIGHT NOW. SO SEND HIM TO DOOR 4
|
||
MOVI 4,A0 ;DOOR 4
|
||
G
|
||
PUSH A0 ;A0=DOOR 1-4
|
||
MOVI >1F,A1 ;TIME FOR DOOR TO REMAIN OPEN
|
||
;OPEN DOOR
|
||
CALLA SET_GATE_2
|
||
|
||
;NOW PLACE ORB BEHIND APPROPRIATE DOOR
|
||
PULL A2
|
||
|
||
MOVI SX,A1
|
||
SLL 5,A2 ;INTO DOOR X/Y TABLES
|
||
ADD A2,A1
|
||
MOVE *A1,A0,L
|
||
MOVI SY,A1
|
||
ADD A2,A1
|
||
MOVE *A1,A1,L
|
||
;A0=OXVAL
|
||
;A1=OYVAL
|
||
PUSH A2 ;INDEX BASED ON DOOR 1-4
|
||
CALLR IH1
|
||
CALLA BEGIN_OBJ
|
||
PULL A2
|
||
;NOW GIVE X/Y VEL FOR THIS ORB
|
||
MOVI ORBXV,A0
|
||
ADD A2,A0
|
||
MOVE *A0,A0,L
|
||
MOVE A0,*A8(OXVEL),L
|
||
ADDI ORBYV,A2
|
||
MOVE *A2,A0,L
|
||
MOVE A0,*A8(OYVEL),L
|
||
RETS
|
||
;DOOR #
|
||
; 3
|
||
;1 2
|
||
; 4
|
||
|
||
ORBXV: .LONG 0,04000H,-04000H,0,0
|
||
ORBYV: .LONG 0,0,0,04000H,-04000H
|
||
|
||
|
||
IH1: ;ENTER HERE IF ON SCRN TANK
|
||
;STUFF NEEDED SHIT
|
||
;A0=OXVAL
|
||
;A1=OYVAL
|
||
MOVI ORB1,A2 ;(OIMG) DOES NOT MATTER
|
||
MOVI 230,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSENMY|TYPORB,A5 ;(OID)
|
||
CLR A6 ;(OXVEL)
|
||
CLR A7 ;(OYVEL)
|
||
RETS
|
||
|
||
SETUP_ORB:
|
||
;
|
||
; UPDATE ORB COUNT
|
||
;
|
||
MOVE @ORB_CNT,A0
|
||
INC A0
|
||
MOVE A0,@ORB_CNT
|
||
|
||
MOVI ORB,A2
|
||
CALLA GET_WVADDR
|
||
|
||
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL FOR THIS ORB
|
||
; MOVE A1,*A13(LEVEL),W
|
||
|
||
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS ORB
|
||
DEC A1
|
||
MOVE A1,*A0(16),W
|
||
JRNZ BZ
|
||
|
||
;END OF THIS WAVES ORB CNT
|
||
MOVK 1,A1
|
||
MOVE A1,@ORB_DN
|
||
|
||
CREATE 0,DEXIT ;TURNS ON ARROW, ETC.
|
||
;CREATE THIS ONLY WHEN ALL ENEMIES
|
||
;ARE GONE!
|
||
;
|
||
BZ
|
||
RETS
|
||
|
||
SX: .LONG 0,-020000H,01880000H,0CA0000H,0CA0000H
|
||
SY: .LONG 0,0540000H,0540000H,-280000H,0E80000H
|
||
|
||
KILL_ORB:
|
||
;CALLED FROM COLL2.ASM WHEN A ORB COLLIDES WITH SOMETHING.
|
||
ONSCRN_ORBS:
|
||
;THIS TURNS ON MULTIPLE ORBS OFF SCREEN JUST BEFORE SCREEN SCROLLS THEM ON.
|
||
;VICTIM PNTR IN A8
|
||
|
||
;COME IN HERE IF SMART BOMB (TURMELL TO HANDLE)
|
||
;A8=ORB IMAGE PTR
|
||
CREATE 0,ORB_EXP ;BULLETS DIR WILL BE IN A10
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
MOVE *A8(OPLINK),A0,L
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
RETS
|
||
|
||
ORB_EXP:
|
||
MOVE @ORB_CNT,A3 ;DELETE A ORB FROM CNT
|
||
DEC A3
|
||
MOVE A3,@ORB_CNT
|
||
|
||
;ORB MUST KNOW WHO SHOT IT!
|
||
; MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
|
||
; MOVB *A10(PNUM),A0
|
||
; CMPI 1,A0
|
||
; JREQ CGA
|
||
; MOVI P2DATA,A2
|
||
;CGA
|
||
; MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
|
||
; MOVI >10,A1 ;AMOUNT OF SCORE
|
||
; CALLA SCRADD2 ;DO IT!
|
||
|
||
CLR A6
|
||
CLR A7
|
||
|
||
CALLA GETANIXY
|
||
ADDI 0350000H,A2 ;A1=Y OFFSET
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI 199,A3 ;259
|
||
MOVI DMAWNZ|M_NOCOLL|M_FLIPV,A4 ;NON-ZERO VALUE
|
||
MOVI CLSNEUT|TYPNEUT,A5
|
||
MOVI EXPb1,A2
|
||
|
||
CALLA BEGIN_OBJ2
|
||
|
||
;CREATE EXPLOSION, AND THEN DIE
|
||
|
||
MOVI BOOM2,A9
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
DIE
|
||
|
||
;
|
||
;FRANIM LISTS FOR ORB ROTATES
|
||
;
|
||
ROTUP:
|
||
;ORB ROTATE VERTICAL FROM SIDE TO SIDE ORIENTATION
|
||
.LONG ORB2
|
||
.WORD 3
|
||
.LONG ORB3
|
||
.WORD 3
|
||
.LONG ORB4
|
||
.WORD 3
|
||
.LONG 0
|
||
ROTSD:
|
||
;ORB ROTATE TO SIDE FROM TOP ORIENTATION
|
||
.LONG ORB3
|
||
.WORD 3
|
||
.LONG ORB2
|
||
.WORD 3
|
||
.LONG ORB1
|
||
.WORD 3
|
||
.LONG 0
|
||
|
||
.END
|
||
|
||
|
||
|
||
|