smashtv/SNAKE.ASM

526 lines
8.9 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 'SNAKE.ASM'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,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 SCRM
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GPALOBJ,GETFPAL,SETUP_DIR,DO_DIFF2,INTO,BEGINOBJ,BEGINOBJ2
.REF ADJSTWTL,GET_VALID_XY,INFOTBL,BOOM3
.REF RANGRAND,FRANIM,ADDRPCS,BOOM2
.REF P2DATA,P1DATA,SCRADD2
.REF GAMSTATE,WAVEYX
.REF HALT,EHALT
.REF SET_GATE_2,RANDPER,KP_LS,KP_RS,KP_TS
.REF WAVE,GET_WVADDR
.REF OVERLORD,KILOBJ
.REF PCTOT,XVEL,YVEL,NEWV
.REF FROMDR,PLYROBJS,PLYRPRCS
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF KILL_SNK,KILL_SK1
.DEF SPWN_SNK,SNK_DN
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS SNK_DN,16
.BSS TMP,16
.BSS INDEX,8
.BSS PCNTA,8
;
;EQUATES FOR THIS FILE
;
;SNAKE SMALL DATA STRUCTURE
;
DIS .EQU PDATA
DIR .EQU PDATA+16 ;OBJECT DIRECTION
ZHITS .EQU PDATA+32
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
HSPD .EQU PDATA+96
H2SPD .EQU PDATA+128
VSPD .EQU PDATA+160
V2SPD .EQU PDATA+192
;
;
HSPEED .EQU 08000H
.TEXT
KILL_SNK:
;A8=SNK IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A10,A7
MOVE A0,A10
MOVE *A8(OPLINK),A1,L
; MOVE *A1(ZHITS),A7
; INC A7
; MOVE A7,*A1(ZHITS)
; CMPI 2,A7
; JRC OUT
;ABSORBED ENOUGH HITS
MOVI CLSNEUT,A0
MOVE A0,*A8(OID)
MOVI DMAWNZ|M_NOCOLL,A0
MOVE A0,*A8(OFLAGS)
MOVE *A8(OPLINK),A0,L
MOVI SNK_EXP,A7
CLR A1
CALLA XFERPROC
MOVE A8,A0
CALLA DELOBJ
OUT
MMFM SP,A1,A10,A7
RETS
SNK_EXP:
; MOVE *A10(OID),A9,W ;KILLERS OID
; MOVE *A10(OXVEL),A6,L
; MOVE *A10(OYVEL),A7,L
CLR A6
CLR A7
MOVE *A10(OPLINK),A10,L
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
MOVB *A10(MYPLYR),A0 ;GET PLAYER #
CMPI 1,A0
JREQ CGA
CMPI 2,A0
JRNZ CGA2
MOVI P2DATA,A2
CGA
MOVI SNKPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
CGA2
MOVI SCRM,A0
CALLA ONESND
CALLA GETANIXY
; ADDI 010000H,A2 ;A2=Y OFFSET
; ADDI 010000H,A3
MOVI BOOMSK,A9
MOVE A2,A1
MOVE A3,A0
MOVI 101,A3 ;259
MOVI DMAWNZ|M_NOCOLL,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPNEUT,A5
MOVI SNKDTH1,A2
CALLA BEGINOBJ2
BIGEXP2
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0
CALLA DELOBJ
DIE
BOOMSK
.LONG SNKDTH1
.WORD 2
.LONG SNKDTH2
.WORD 2
.LONG SNKDTH3
.WORD 2
.LONG SNKDTH4
.WORD 2
.LONG SNKDTH5
.WORD 2
.LONG 0
STATON
;0=LEFT,1=RIGHT,2=EITHER
.BYTE 0,2,1,0,0,0,0,0,1,2,0,0,0,1,0,2,0,2,0,0,0,0
.EVEN
SPWN_SNK:
;SPAWN HULKS IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
;SEND GANGS OUT IN 3 DIFFERENT DIRECTIONS!
MOVE @SNK_DN,A0
JRNZ RET9
MOVE @WAVE,A0
SLL 3,A0
ADDI STATON,A0
MOVB *A0,A0
JRZ STATL
CMPI 1,A0
JRZ STATR
;FROM EITHER SIDE!
MOVB @PCNTA,A0
DEC A0
MOVB A0,@PCNTA
ANDI 7,A0
SLL 3,A0
ADDI DRTAB,A0
MOVB *A0,A9
CMPI 3,A9
JRNZ STATIN
MOVI >17,A1
MOVK 3,A0
CALLA SET_GATE_2
JRUC STATINA
DRTAB .BYTE 1,1,1,2,2,2,3,3
.EVEN
STATR
MOVK 2,A9 ;1=FROM RGT
JRUC STATIN
STATL
;FROM LEFT FACE
MOVK 1,A9 ;1=FROM LEFT
STATIN
CREATE 0,OPENCLS ;OPEN AND CLOSE MOUTH
STATINA
MOVI SNK,A2
CALLA GET_WVADDR
MOVE *A0(16),A0 ;GET HULKS LEFT TO RELEASE THIS WAVE!
CMPI 24,A0 ;MIN HULKS BEFORE GANG
JRLT GH1 ;RELEASE ALL OF THEM!
MOVK 18,B0 ;11 ;# OF HULKS IN A GANG
MOVK 23,B1 ;18
CALLA RANGRAND
GH1:
ANDI 1FH,A0
PUSH A0
CREATE SNKPID,GSNK
PULL A0
DSJNE A0,GH1
RET9 RETS
OPENCLS
;A9=1 FOR LEFT FACE, 2=RGT FACE
CMPI 1,A9
JRZ P0
MOVI FACR2,A14
CALLR STUFF
MOVE A8,A9
MOVI FACR1,A14
CALLR STUFF
JRUC POUT
P0
MOVI FACL2,A14
CALLR STUFF
MOVE A8,A9
MOVI FACL1,A14
CALLR STUFF
POUT
SLEEP 80
MOVE @HALT,A0
JRNZ POUT
MOVE A8,A0
CALLA DELOBJ
MOVE A9,A0
CALLA DELOBJ
DIE
STUFF
CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE
CALLA STFOBJ ;STUFF OBJECT DATA
MOVE A13,*A0(OPLINK),L
CALLA INSOBJ ;INSERT OBJECT INTO LIST
MOVE A0,A8
CALLA ADJSTWTL
RETS
FACL1:
.LONG 680000H,0E0000H,STATUE
.WORD 290,DMAWNZ+M_NOCOLL,0
.LONG 0,0
FACL2:
.LONG 5F0000H,210000H,WWLFC1B
.WORD 20,DMAWNZ+M_NOCOLL,0
.LONG 0,0
FACR1:
.LONG 1280000H,0E0000H,STATUE
.WORD 290,DMAWNZ+M_FLIPH+M_NOCOLL,0
.LONG 0,0
FACR2:
.LONG 1310000H,210000H,WWLFC1B
.WORD 20,DMAWNZ+M_FLIPH+M_NOCOLL,0
.LONG 0,0
;
GXL: .LONG 740000H,01080000H,0C00000H
GXR: .LONG 840000H,01180000H,0D00000H
GYT: .LONG 01E0000H,01E0000H,080000H
GYB: .LONG 0220000H,0220000H,0100000H
GSNK:
;GHULK PUTS X # OF HULKS BEHIND A DOOR IN GANG FORMATION!
;A0=DOOR TO GANG UP ON
;A9=1 FOR LEFT,2 FOR RIGHT,3 FOR MIDDLE
;DIR WILL BE EITHER 5 6 4
MOVK 1,B0
MOVI 50,B1
CALLA RANGRAND
CALLA PRCSLP
MOVI 3,B0
MOVI 6,B1
CALLA RANGRAND
MOVE A0,*A13(DIR)
DEC A9
SLL 5,A9
MOVI GXL,A1
ADD A9,A1
MOVE *A1,A2,L ;GET X LEFT BOUNDARY
MOVI GXR,A1
ADD A9,A1
MOVE *A1,A3,L ;GET X RIGHT SIDE BOUNDARY
MOVI GYT,A1
ADD A9,A1
MOVE *A1,A4,L ;GET Y TOP
MOVI GYB,A1
ADD A9,A1
MOVE *A1,A5,L ;GET Y BOT
MOVE A2,B0
MOVE A3,B1
CALLA RANGRAND
MOVE A0,A6 ;A6 IS X
MOVE A4,B0
MOVE A5,B1
CALLA RANGRAND
MOVE A0,A1 ;A1 IS Y
MOVE A6,A0
CALLR IH1
CALLA BEGINOBJ
CALLA SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVE A7,B0 ;A7=LOW LEVEL FROM TABLE
ADDI 4,A7
MOVE A7,B1
CALLA RANGRAND
MOVE A0,*A13(LEVEL)
MOVI HSPEED,A1
CALLA DO_DIFF2
MOVE *A13(DIR),A0
CALLA INTO
CALLR GET_RUN
SLEEP 2
MOVE A9,A10
;
; LOOP TOP FOR HULKS
;
LUP_TOP:
;TOP OF HULK LOGIC
MOVE @HALT,A0
JRNZ CHECK_NEXT
;NORMAL OPERATION FOLLOWS
MOVK 1,A1
JSRP FRANIM
;CHECK TO SEE IF OFF BOTTOM OF SCREEN
;IF SO, DIE OFF
;CHECK FOR LEFT OR RIGHT WALLS
;IF TOUCHING, TURN TO FACE DOWN
MOVI [>1,>40],A2 ;BOUNDS CHECK
MOVI [>F0,>146],A3
CALLA SCRTSTG
JRZ GETR
CMPI 4,A0
JRZ KOFF
MOVE *A13(DIR),A0
CMPI 5,A0
JRZ GETR
DOWNIT MOVK 5,A0
MOVE A0,*A13(DIR)
CALLR GET_RUN
MOVK 5,A0
CALLA INTO
MOVE A9,A10
JRUC CHECK_NEXT
GETR
MOVE *A13(DIS),A0
DEC A0
MOVE A0,*A13(DIS)
JRZ DOWN
MOVE A10,A9
CHECK_NEXT:
SLEEP 1
JRUC LUP_TOP
DOWN DEC A0
MOVE A0,*A13(DIS)
JRUC DOWNIT
KOFF
;KILL OFF SNAKE
MOVE A8,A0
CALLA DELOBJ
DIE
;
SETUP_HULK:
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
;IF THIS IS AN ONSCREEN HULK, THEN ANY DIR IS OKAY!
;
; UPDATE HULK COUNT
;
CLR A0
MOVE A0,*A13(ZHITS)
MOVK 1,B0
MOVK 8,B1
CALLA RANGRAND
MOVE A0,*A13(DIS)
MOVI SNK,A2
CALLA GET_WVADDR
MOVE *A0(32),A7,W ;GET DIFFICULTY LEVEL
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS HULK
ANDI 03FFH,A1
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES HULK CNT
MOVK 1,A1
MOVE A1,@SNK_DN
BZ
RETS
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS HULKS DIRECTION
;
MOVE *A13(DIR),A4
DEC A4
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
ADDI WALK_LIST,A4 ;CALCULATE OFFSET IN TABLE
MOVE *A4,A9,L ;MOVE TABLE VALUE INTO A9
;NEW ANIMATION SCRIPT
RETS
IH1: ;ENTER HERE IF ON SCRN HULK
MOVI BSNK6A,A2 ;DOES NOT MATTER
MOVI 129,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPSNK,A5
CLR A6
CLR A7
RETS
KILL_SK1
;A8=HULK IMAGE TO SMART BOMB
;A9=P1DATA OR P2DATA FOR SCORE UPDATE
;ENTER HERE WITH SMART BOMB
CREATE 0,HSMRT ;BULLETS DIR WILL BE IN A10
;HULK_EXP WHEN IT WAKES UP
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A8(OID)
MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILLS PROCESS IN A0
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
HSMRT
MOVE A9,A2
;A2=P1DATA OR P2DATA
MOVI SNKPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
MOVI BOOM3,A9
MOVE *A8(OYPOS),A0
ADDI 01AH,A0 ;A2=Y OFFSET
MOVE A0,*A8(OYPOS)
JRUC BIGEXP2
;8 1 2
;7 3
;6 5 4
;
WALK_LIST:
.LONG 0,0,0,T_PWK_DNRGT,T_PWK_DN
.LONG T_PWK_DNLFT,0,0
;
;GRUNT ANIMATION TABLES
;
T_PWK_DN:
.LONG BSNK6A
.WORD FLIPBITS|02,0
.LONG BSNK6B
.WORD 2
.LONG BSNK6C
.WORD 2
.LONG BSNK6D
.WORD 2
.LONG BSNK6E
.WORD 2
.LONG BSNK6F
.WORD 2
.LONG BSNK6G
.WORD 2
.LONG BSNK6H
.WORD 2
.LONG BSNK6I
.WORD 2
.LONG 0
T_PWK_DNLFT:
.LONG BSNK8A
.WORD FLIPBITS|02,0
.LONG BSNK8B
.WORD 2
.LONG BSNK8C
.WORD 2
.LONG BSNK8D
.WORD 2
.LONG BSNK8E
.WORD 2
.LONG BSNK8F
.WORD 2
.LONG BSNK8G
.WORD 2
.LONG BSNK8H
.WORD 2
.LONG BSNK8I
.WORD 2
.LONG 0
T_PWK_DNRGT:
.LONG BSNK8A
.WORD FLIPBITS|02,M_FLIPH
.LONG BSNK8B
.WORD 2
.LONG BSNK8C
.WORD 2
.LONG BSNK8D
.WORD 2
.LONG BSNK8E
.WORD 2
.LONG BSNK8F
.WORD 2
.LONG BSNK8G
.WORD 2
.LONG BSNK8H
.WORD 2
.LONG BSNK8I
.WORD 2
.LONG 0
.END