smashtv/BACKUP/SHELL.ASM

321 lines
6.1 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 '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