526 lines
8.9 KiB
NASM
526 lines
8.9 KiB
NASM
.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
|
||
|
||
|
||
|
||
|