smashtv/GAL.ASM

1248 lines
22 KiB
NASM
Raw Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'GAL.ASM'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: JANUARY 29,1990
; MODIFIED: FOREVER....
; SOFTWARE: EUGENE JARVIS
;
; COPYRIGHT (C) 1990 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 "GALAGAS.TBL"
;
;SOUNDS
;
.REF EXP3HI,TING2,EXP3
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF ECON,ORB_LIT,FRANIM,BIG3A,SCRADD2,P1DATA,P2DATA
.REF PSTOP,ADPCS4,HALT,FLASHME,CIRCUIT
.REF GET_VALID_XY,GAMSTATE,WAVEYX,BEGINOBJ,BEGINOBJ2,EHALT
.REF RANDPER,RANDOM,RANGRAND,DRINF,SET_GATE_2,GET_WVADDR,DEXIT
.REF RANDU,SRAND
.REF FINDPAL,PALSET,GETFPAL
.REF GETPLYR,SCORPLAY,ORBBNDCK
.REF SMLEXP
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF SPWN_GAL1,SPWN_GAL2,SPWN_GAL3,GALBUL,GALKIL,SMRT_GAL
.DEF SPWN_GAL1A,GAL_CNT,MAXGAL,GALTYP,ZOOM4
.BSS GALTYP,16
.BSS MAXGAL,8 ;MAXIMUM ON SCREEN FOR CURRENT WAVE
.BSS GAL_CNT,16 ;GAL CNT ON SCREEN
.BSS GAL_DN,16 ;0=NO, 1=YES
.TEXT
SPWN_GAL3
;IS ONE SWARM ALREADY OUT?
;IF SO, SKIP THIS
MOVE @GAMSTATE,A0,W
CMPI INAMODE,A0
JREQ GALRET
CREATE GALPID,SWARMST ;START A SWARM
RETS
SPWN_GAL1A
MOVE @GAL_CNT,A2
MOVB @MAXGAL,A3
CMP A3,A2 ;SAUCERS MAXED OUT?
JRGT GALRET
CREATE GALPID,CHAINA
RETS
SPWN_GAL1
MOVE @GAL_CNT,A2
MOVB @MAXGAL,A3
CMP A3,A2 ;SAUCERS MAXED OUT?
JRGT GALRET
CREATE GALPID,CHAIN ;NOT REALLY A CHAIN!
GALRET RETS
SPWN_GAL2
*
*GET YOUR SAUCER GOING
*
MOVE @GAL_CNT,A2
MOVB @MAXGAL,A3
CMP A3,A2 ;SAUCERS MAXED OUT?
JRGT GALRET
; MOVI 1,A8
;GALSTLP
CREATE GALPID,GALDISP ;START ONE SAUCER
; DSJS A8,GALSTLP
RETS
*
*FORM A SWARM
*PDATA+>20=LINK TO HEAD (COUNT OF BALLS IN HEAD)
*PDATA+>60=X ACCEL RATE
*PDATA+>80=Y ACCEL RATE
*
SWARMST
CALLR SETUP_SWRM
CALLR INIT_HD ;GET INITIAL GUY
CREATE TYPGAL+SUBHEAD,HEAD
MOVE A0,*A8(OPLINK),L
MOVI 20,A9
MOVE A9,*A0(PDATA+>20) ;BALL COUNT
MOVE *A8(OXVAL),A10,L ;SAVE INITIAL COORD
MOVE *A8(OYVAL),A11,L
MOVE A0,A2
MOVI >2000,A0
CALLA RANDU
ADDI >2000,A0
MOVE A0,*A2(PDATA+>60),L ;GET ACCEL RATES
MOVE A0,*A2(PDATA+>80),L
CLR A0
MOVE A0,*A2(PDATA+>A0),L ;ZERO CURRENT ACCEL
MOVE A0,*A2(PDATA+>C0),L
MOVE A0,*A2(PDATA+>40),L
SWMSTLP
; CALLR SETUP_SWRM
MOVE A10,A0
MOVE A11,A1
MOVE A2,-*SP,L ;SAVE A2
CALLR INIT_BALL ;ENTRY POINT WITH EXISTING X,Y COORD
CREATE TYPGAL+SUBBALL,SWARM
MOVE *SP+,A2,L
MOVE A2,*A0(PDATA+>20),L ;LINK TO BOSS PROCESS
MOVE A0,*A8(OPLINK),L
MOVE A0,A1
MOVI >8000,A0
CALLA RANDU
ADDI >8000,A0
MOVE A0,*A1(PDATA+>60),L ;GET ACCEL RATES
MOVE A0,*A1(PDATA+>80),L
CLR A0
MOVE A0,*A1(PDATA+>A0),L ;ZERO CURRENT ACCEL
MOVE A0,*A1(PDATA+>C0),L
MOVE A0,*A2(PDATA+>40),L
DSJ A9,SWMSTLP
DIE
; SLEEP 400
; JRUC SWARMST
*
*SWARM O'BALLS
*
*PDATA+>20=LINK TO BOSS PROCESS
*PDATA+>60=X ACCEL RATE
*PDATA+>80=Y ACCEL RATE
*PDATA+>A0=X CURR ACCEL
*PDATA+>C0=Y CURR ACCEL
*
SWARM
CALLR SWMVEL
SWARML
MOVI 300,A0
CALLA RANDPER
JRNC SWARM1
CALLR SWMVEL
SWARM1
MOVE *A13(PDATA+>20),A2,L ;GET HEAD PROCESS
MOVE *A2(PA8),A2,L ;GET HEAD OBJECT
JREQ SWMX ;HEAD IS DEAD
MOVE *A13(PDATA+>A0),A4,L ;GET X ACCELL
MOVE *A8(OXVEL),A0,L
ADD A4,A0 ;ADD ACCELERATION
MOVE A0,A1
SRA 2,A1 ;DAMPING
SUB A1,A0
MOVE A0,*A8(OXVEL),L
MOVE *A13(PDATA+>C0),A4,L ;GET Y ACCELL
MOVE *A8(OYVEL),A0,L
ADD A4,A0 ;ADD ACCELERATION
MOVE A0,A1
SRA 2,A1 ;DAMPING
SUB A1,A0
MOVE A0,*A8(OYVEL),L
CALLA ORBBNDCK ;BOUNCE OFF WALLS
SLOOP 2,SWARML
*HEAD IS DEAD, BAG IT DUDES
SWMX
MOVK 15,A10 ;GET FLOAT TIME
SWMXL
CALLA ORBBNDCK ;BOUNCE OFF WALLS
SLEEP 4
DSJS A10,SWMXL
CALLA BLCLEAN
MOVI EXP3,A0
CALLA ONESND
CREATE 0,GALBLO
JAUC SUCIDE
*
*SWARM VELOCITY
*
*PDATA+>20=LINK TO BOSS PROCESS
*PDATA+>60=X ACCEL RATE
*PDATA+>80=Y ACCEL RATE
*PDATA+>A0=X CURR ACCEL
*PDATA+>C0=Y CURR ACCEL
SWMVEL
MOVE *A13(PDATA+>60),A4,L ;GET X ACCELERATION
MOVE *A13(PDATA+>20),A2,L ;GET HEAD PROCESS
MOVE *A2(PA8),A2,L ;GET HEAD OBJECT
JREQ SWMVELX ;HEAD IS DEAD
MOVE *A2(OXPOS),A1,W ;GET CORE POSITION
MOVI 12,A0 ;ADD RANDOM
CALLA SRAND
ADD A0,A1
MOVE *A8(OXPOS),A3,W
SUB A1,A3
JRN SWMV1
NEG A4
SWMV1
MOVE A4,*A13(PDATA+>A0),L
MOVE *A13(PDATA+>80),A4,L ;GET Y ACCELERATION
MOVE *A2(OYPOS),A1,W ;GET CORE POSITION
MOVI 12,A0 ;ADD RANDOM
CALLA SRAND
ADD A0,A1
MOVE *A8(OYPOS),A3,W
SUB A1,A3
JRN SWMV2
NEG A4
SWMV2
MOVE A4,*A13(PDATA+>C0),L
SWMVELX
RETS
*
*SWARM BOSS
*PDATA+>20=NUMBER OF SWARMERS LEFT
*PDATA+>60=X ACCEL RATE
*PDATA+>80=Y ACCEL RATE
*PDATA+>A0=X CURR ACCEL
*PDATA+>C0=Y CURR ACCEL
*
HEAD
MOVI BALLGAL,A9 ;ROTATE THE SUCKER
CALLA GETPLYR
MOVE A0,A11
CALLR HDSVEL
HEADL
MOVE A8,A8 ;HEAD OBJECT IS DEAD, WAIT AROUND
JREQ HEADIE
MOVI 60,A0
CALLA RANDPER
JRNC HEAD1
MOVI 60,A0
CALLA RANDPER
JRNC HEAD0
CALLA GETPLYR
MOVE A0,A11
HEAD0
CALLR HDSVEL
HEAD1
MOVE *A13(PDATA+>A0),A4,L ;GET X ACCELL
MOVE *A8(OXVEL),A0,L
ADD A4,A0 ;ADD ACCELERATION
MOVE A0,A1
SRA 3,A1 ;DAMPING
SUB A1,A0
MOVE A0,*A8(OXVEL),L
MOVE *A13(PDATA+>C0),A4,L ;GET Y ACCELL
MOVE *A8(OYVEL),A0,L
ADD A4,A0 ;ADD ACCELERATION
MOVE A0,A1
SRA 3,A1 ;DAMPING
SUB A1,A0
MOVE A0,*A8(OYVEL),L
CALLA ORBBNDCK ;BOUNCE OFF WALLS
HEAD2
MOVK 4,A1
JSRP FRANIM
JRNC HEADWT
MOVI BALLGAL,A9
JRUC HEAD2
HEADWT
SLOOP 1,HEADL
HEADIE
MOVE *A13(PDATA+>20),A0,W
JAEQ SUCIDE ;TOTALLY DEAD
SLOOP 4,HEADIE
*
*HEAD OF SWARM VELOCITY
*A11=PLAYER TO GO AFTER
*PDATA+>60=X ACCEL RATE
*PDATA+>80=Y ACCEL RATE
*PDATA+>A0=X CURR ACCEL
*PDATA+>C0=Y CURR ACCEL
*
HDSVEL
MOVE *A13(PDATA+>60),A4,L ;GET X ACCELERATION
MOVE *A11(OXPOS),A1,W ;GET PLAYER POSITION
MOVI 60,A0 ;ADD RANDOM
CALLA SRAND
ADD A0,A1
MOVE *A8(OXPOS),A3,W
SUB A1,A3
JRN HDSV1
NEG A4
HDSV1
MOVE A4,*A13(PDATA+>A0),L
MOVE *A13(PDATA+>80),A4,L ;GET Y ACCELERATION
MOVE *A11(OYPOS),A1,W ;GET PLAYER POSITION
MOVI 60,A0 ;ADD RANDOM
CALLA SRAND
ADD A0,A1
MOVE *A8(OYPOS),A3,W
SUB A1,A3
JRN HDSV2
NEG A4
HDSV2
MOVE A4,*A13(PDATA+>C0),L
RETS
*
*FORM A CHAIN
*
CHAIN
CALLA INIT_GAL ;GET INITIAL GUY
CALLR SETUP_GAL ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CREATE TYPGAL,CHNPROC
MOVE A0,*A8(OPLINK),L
MOVI 1,A9 ;8
CLR A1
MOVE A1,*A0(PDATA+>20),L ;CLEAR BACK LINK OF FIRST GUY
MOVE *A8(OXVAL),A10,L ;SAVE INITIAL COORD
MOVE *A8(OYVAL),A11,L
; MOVE @CHNTOT,A2
; INC A2
; MOVE A2,@CHNTOT
MOVI CLSENMY|TYPGAL|SUBCHN,A5 ;(OID)
MOVE A5,*A8(OID),W
;CHANGE TO OTHER PAL
PUSH A0
MOVI GALP2,A0 ;GPAL2
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
PULL A0
JRUC GOEND
CHAINA
;REAL TRAIN GALAGA ENEMY
MOVE @GALTYP,A1
JRZ CBA
CALLA INIT_GAL2 ;GET INITIAL GUY
;3RD CIRCUIT, CHANGE ARTWORK FOR THIS CHAIN.
;CHANGE TO OTHER PAL
MOVI SPDRP,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
JRUC CBAA
CBA
CALLA INIT_GAL ;GET INITIAL GUY
CBAA
CALLR SETUP_GALA ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CREATE TYPGAL,CHNPROC
MOVE A0,*A8(OPLINK),L
MOVI 8,A9 ;8
MOVE @GALTYP,A1
JRZ CBV
MOVK 3,A9
CBV
CLR A1
MOVE A1,*A0(PDATA+>20),L ;CLEAR BACK LINK OF FIRST GUY
MOVE *A8(OXVAL),A10,L ;SAVE INITIAL COORD
MOVE *A8(OYVAL),A11,L
; MOVE @CHNTOT,A2
; INC A2
; MOVE A2,@CHNTOT
MOVI CLSENMY|TYPGAL|SUBCHN,A5 ;(OID)
MOVE A5,*A8(OID),W
CHAINLP
MOVE A0,A2
MOVE A10,A0
MOVE A11,A1
MOVE A2,-*SP,L ;SAVE A2
CALLR INIT_GAL1 ;ENTRY POINT WITH EXISTING X,Y COORD
MOVE @GALTYP,A0
JRZ CBB
;3RD CIRCUIT, CHANGE ARTWORK FOR THIS CHAIN.
;CHANGE TO OTHER PAL
MOVI SPDRP,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
CBB
MOVI CLSENMY|TYPGAL|SUBCHN,A5 ;(OID)
MOVE A5,*A8(OID),W
CREATE TYPGAL,CHNPROC
MOVE @GAL_CNT,A5
INC A5
MOVE A5,@GAL_CNT
MOVE *SP+,A2,L
MOVE A0,*A8(OPLINK),L
MOVE A2,*A0(PDATA+>20),L ;BACK LINK TO PREVIOUS
MOVE A0,*A2(PDATA+>40),L ;FRONT LINK TO NEXT
DSJ A9,CHAINLP
GOEND:
CLR A1
MOVE A1,*A0(PDATA+>40),L ;CLEAR FRONT LINK OF LAST GUY
DIE
*
*GALAGA CHAIN PROCESS
*PDATA=HIT COUNT
*PDATA+>20=LINK TO PREVIOUS PROCESS
*PDATA+>40=LINK TO NEXT PROCESS
CHNPROC
CLR A0
MOVE A0,*A13(PDATA),L ;CLEAR BULLET HIT COUNT
MOVI GRENGAL,A9 ;GET ANIMATION POINTER
MOVE @GALTYP,A0
JRZ CP1
MOVI SPDRGAL,A9 ;GET ANIMATION POINTER
CP1 MOVE A9,A10
SLEEP 2
MOVE @EHALT,A0
JRNZ CHNPROC ;HALT GALS WHILE PLAYER ENTERS
JRUC CHN1
CHN:
MOVI 20,A0 ;GET NEW PLAYER TO SEEK
CALLA RANDPER
JRNC CHNV01 ;NO
CHN1
CALLA GETPLYR
MOVE A0,A11
CHNV01
MOVE *A13(PDATA+>20),A0,L
JREQ CHNV02 ;LEADER
CALLR CHNACC
JRUC CHNV03
CHNV02
CALLR GALACC
CHNV03
MOVE *A8(OXVEL),A0,L
MOVE *A8(OYVEL),A2,L
CHNV030
MOVE A0,A1
ABS A1
MOVE A2,A3
ABS A3
ADD A1,A3
MOVE @GALTYP,A4
JRZ GOB
CMPI >30000,A3 ;40000
JRUC GOB2
GOB
CMPI >20000,A3 ;40000
GOB2
JRLS CHNV03A
MOVE A0,A4
SRA 3,A4
SUB A4,A0
MOVE A2,A6
SRA 3,A6
SUB A6,A2
JRUC CHNV030
CHNV03A
MOVE A0,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
CALLA ORBBNDCK ;CHECK BOUNDARY COLLISION
SLEEP 2
CHNV04
MOVK 4,A1
JSRP FRANIM
JRNC CHN
MOVE A10,A9 ;RESTORE FRANIM LIST PNTR
JRUC CHNV04
*
*CHNACC
*A0=GUY TO FOLLOW PROCESS
*A8=GAL
*
CHNACC
MOVE *A0(PA8),A0,L ;GET OBJECT POINTER
MOVE *A0(OXVAL),A2,L
MOVE *A0(OYVAL),A3,L
MOVE *A8(OXVAL),A4,L
MOVE *A8(OYVAL),A5,L
SUB A4,A2
SUB A5,A3
SRA 6,A2
SRA 6,A3
MOVE @GALTYP,A1
JRZ CHG1
SLA 1,A2
SLA 1,A3
CHG1
MOVE *A8(OYVEL),A0,L
ADD A3,A0
MOVE A0,A1 ;DAMPING
SRA 3,A1
SUB A1,A0
MOVE A0,*A8(OYVEL),L
MOVE *A8(OXVEL),A0,L
ADD A2,A0
MOVE A0,A1 ;DAMPING
SRA 3,A1
SUB A1,A0
MOVE A0,*A8(OXVEL),L
RETS
*
*SAUCER START PROCESS
*
GALDISP
CALLR GETDRA
CALLA INIT_GALA
CALLR SETUP_GALB ;INC CNT, SET DIR, SET DEATH FLAG, ETC
*
* PURPLE GALAGA PROCESS
* A8=OBJECT
* A11=PLAYER TO SEEK
* A13=PROCESS
* PDATA=BULLET HIT COUNT
* PDATA+>40=XACC
* PDATA+>50=YACC
*
LUP_TOP:
CLR A0
MOVE A0,*A13(PDATA),L ;CLEAR BULLET HIT COUNT
MOVE A0,*A13(PDATA+>20),L ;NULL OUT LINKS
MOVE A0,*A13(PDATA+>40),L ;NULL OUT LINKS
MOVI PURPGAL,A9 ;GET ANIMATION POINTER
SLEEP 2
MOVE @EHALT,A0
JRNZ LUP_TOP ;HALT GALS WHILE PLAYER ENTERS
CALLA GETPLYR
MOVE A0,A11
CALLA GETGALV
MV:
; MOVI 100,A0 ;GET NEW VELOCITY?
; CALLA RANDPER
; JRNC MVV01 ;NO
; CALLR GETGALV
CALLR GALACC
MOVE *A8(OXVEL),A0,L
MOVE *A8(OYVEL),A2,L
PRP030
MOVE A0,A1
ABS A1
MOVE A2,A3
ABS A3
ADD A1,A3
CMPI >40000,A3 ;40000
JRLS PRP03A
MOVE A0,A4
SRA 3,A4
SUB A4,A0
MOVE A2,A6
SRA 3,A6
SUB A6,A2
JRUC PRP030
PRP03A
MOVE A0,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
MOVI 20,A0 ;GET NEW PLAYER TO SEEK
CALLA RANDPER
JRNC MVV01 ;NO
CALLA GETPLYR
MOVE A0,A11
MVV01
CALLA ORBBNDCK ;CHECK BOUNDARY COLLISION
SLEEP 2
MVV02
MOVK 4,A1
JSRP FRANIM
JRNC MV
MOVI PURPGAL,A9
JRUC MVV02
*
*GET SAUCER VELOCITY
*TOTALLY RANDOM VELOCITY
*RETURNS PDATA+>40 XACC; PDATA+>50 YACC
*
GETGALV
MOVI >20000,A0
CALLA SRAND
MOVE A0,*A8(OXVEL),L
MOVI >20000,A0
CALLA SRAND
MOVE A0,*A8(OYVEL),L
RETS
*
*COMPUTE DISTANCE TO PLAYER BEING SEEKED
*GET GALAGA ACCELERATION FOR ORBIT
*
GALACC
MOVE *A8(OXPOS),A2,W
MOVE *A8(OYPOS),A4,W
MOVE *A11(OXPOS),A3,W
MOVE *A11(OYPOS),A5,W
SUB A2,A3
MOVE A3,A6
SUB A4,A5
MOVE A5,A7
MPYS A3,A3
MPYS A5,A5
ADD A3,A5
MOVE A5,A1
CALLA SQROOT
MOVE A1,A2
MOVI >7FFFFFFFF,A5
DIVU A1,A5 ;CALC 1/D
SRL 15,A5 ;ADJUST MAGNITUDE
MOVE A6,A3
MPYS A5,A3 ;X ACCEL
MPYS A5,A7 ;Y ACCEL
SRA 5,A3 ;ADJUST MAGNITUDE
SRA 5,A7
MOVE A3,A4
MOVE A7,A5
NEG A5
SRA 4,A4 ;90 DEGREE ACCEL
SRA 4,A5
MOVE *A8(OYVEL),A0,L
ADD A4,A0
ADD A7,A0
MOVE A0,A1 ;DAMPING
SRA 7,A1
SUB A1,A0
MOVE A0,*A8(OYVEL),L
MOVE *A8(OXVEL),A0,L
ADD A5,A0
ADD A3,A0
MOVE A0,A1 ;DAMPING
SRA 7,A1
SUB A1,A0
MOVE A0,*A8(OXVEL),L
RETS
*
*OPEN THE DOOR
*RET A0=OXVAL, A1=OYVAL, A6=OXVEL, A7=OYVEL
*
GETDRA MOVK 3,A0
JRUC GD1
GETDOOR
MOVK 4,A0
GD1 CALLA RANDU
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 GAL 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
;NOW GIVE X/Y VEL FOR THIS GAL
MOVI GALXV,A7
ADD A2,A7
MOVE *A7,A6,L
ADDI GALYV-GALXV,A7
MOVE *A7,A7,L
RETS
;DOOR #
; 3
;1 2
; 4
GALXV: .LONG 0,10000H,-10000H,0,0
GALYV: .LONG 0,0,0,10000H,-10000H
;
;INITIAL HEAD POSITION,IMAGE SHAPE,AGE ETC....
;
INIT_HD:
CALLR GETDOOR
MOVI GA1B,A2 ;(OIMG)
MOVI >9E,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSENMY|TYPGAL|SUBHEAD,A5 ;(OID)
CALLA BEGINOBJ
JRUC CLR_MY_PAL
; MOVE *A8(OPAL),A0,L
; ANDI 0FFFFH,A0
; MOVE A0,*A8(OPAL),L
; RETS
;
;INITIAL SWARMER POSITION,IMAGE SHAPE, ETC....
;
INIT_BALL:
CLR A6 ;(OXVEL)
CLR A7 ;(OYVEL)
MOVI SPHERE,A2 ;(OIMG)
MOVI >9E,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSENMY|TYPGAL|SUBBALL,A5 ;(OID)
CALLA BEGINOBJ2
JRUC CLR_MY_PAL
; MOVE *A8(OPAL),A0,L
; ANDI 0FFFFH,A0
; MOVE A0,*A8(OPAL),L
; RETS
*
*INITIAL GAL POSITION, IMAGE SHAPE, AGE ETC....
*DO STFOBF AND GET A0 PNTR
*
INIT_GAL2:
CALLR GETDRA
JRUC INIT_GALA
INIT_GAL:
CALLR GETDOOR
INIT_GALA
CALLR IH1
CALLA BEGINOBJ
JRUC CLR_MY_PAL
; MOVE *A8(OPAL),A0,L
; ANDI 0FFFFH,A0
; MOVE A0,*A8(OPAL),L
; RETS
;
;A0=OXVAL
;A1=OYVAL
INIT_GAL1 ;ENTRY POINT WITH EXISTING X,Y COORD
CLR A6 ;(OXVEL)
CLR A7 ;(OYVEL)
CALLR IH1
MOVI GALC1,A2 ;SET IMAGE FOR GREEN DUDE
CALLA BEGINOBJ2
CLR_MY_PAL
MOVE *A8(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L
RETS
;
;STUFF NEEDED SHIT
;A0=OXVAL
;A1=OYVAL
;A6=OXVEL
;A7=OYVEL
IH1: ;ENTER HERE IF ON SCRN TANK
MOVI GB1,A2 ;(OIMG)
MOVI 9EH,A3 ;(OZPOS)
; MOVI 230,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSENMY|TYPGAL,A5 ;(OID)
RETS
SETUP_SWRM:
MOVI GALS3,A2
CALLA GET_WVADDR
JRUC SETA
SETUP_GALB:
MOVI GALS2,A2
CALLA GET_WVADDR
JRUC SETA
SETUP_GALA:
MOVI GALS1A,A2
CALLA GET_WVADDR
JRUC SETA
SETUP_GAL:
MOVI GALS1,A2
CALLA GET_WVADDR
SETA
;
; UPDATE GAL COUNT
;
MOVE @GAL_CNT,A2
INC A2
MOVE A2,@GAL_CNT
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS GAL
DEC A1
MOVE A1,*A0(16),W
RETS
SX: .LONG 0,-040000H,01960000H,0CA0000H,0CA0000H
SY: .LONG 0,0830000H,0830000H,20000H,01140000H
*
*CLEAN UP GAL MESS
*A8=GAL
*
GALCLEAN
MOVE *A8(OPLINK),A0,L ;LINK AROUND DUDE IN CHAIN
MOVE *A8(OID),A1,W
ZEXT A1,W
CMPI CLSENMY|TYPGAL|SUBHEAD,A1 ;(OID)
JRZ GALCLN00
CMPI CLSENMY|TYPGAL|SUBBALL,A1 ;(OID)
JRZ GALCLN00
MOVE *A0(PDATA+>40),A1,L
MOVE *A0(PDATA+>20),A2,L
JREQ GALCLN0 ;TEST FOR NULL LINK
MOVE A1,*A2(PDATA+>40),L
GALCLN0
MOVE A1,A1
JREQ GALCLN00
MOVE A2,*A1(PDATA+>20),L
GALCLN00
CALLA KILL ;KILLS PROCESS IN A0
GALCLN1
MOVE A8,A0
CALLA DELOBJ
MOVE @GAL_CNT,A0,W ;DELETE A FAT FROM CNT
DEC A0
MOVE A0,@GAL_CNT,W
RETS
*
*GAL HIT BY BULLET
*A8=GAL
*A0=BULLET THAT HIT US
*
GALBUL
MMTM SP,A0,A1,A2,A3,A7
MOVE *A8(OID),A1,W
ZEXT A1,W
CMPI CLSENMY|TYPGAL|SUBHEAD,A1 ;(OID)
JREQ GALBULHD
CMPI CLSENMY|TYPGAL|SUBBALL,A1 ;(OID)
JREQ GALBULBL
CMPI CLSENMY|TYPGAL|SUBCHN,A1 ;(OID)
JREQ GALBULCH
; JRUC GALBULCH
MOVE *A0(OXVEL),A1,L ;GIVE IT A PUSH
MOVE *A8(OXVEL),A2,L
SRA 1,A1
ADD A1,A2
MOVE A2,*A8(OXVEL),L
MOVE *A0(OYVEL),A1,L
MOVE *A8(OYVEL),A3,L
SRA 1,A1 ;2,A1
ADD A1,A3
MOVE A3,*A8(OYVEL),L
MOVE *A8(OPLINK),A7,L
MOVE *A0(OID),A1
ZEXT A1,W
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A1
JRZ GALBUL2
MOVE *A7(PDATA),A1,W ;INCREMENT HIT COUNT
INC A1
MOVE A1,*A7(PDATA),W
CMPI 2,A1 ;4
JRHS GALBUL2 ;TOO MANY HITS, BLOW IT UP
CALLR BULEXP
JRUC GALBULX
GALBULCH
;TING SND
MOVE *A0(OXVEL),A1,L ;GIVE IT A PUSH
MOVE *A8(OXVEL),A2,L
SRA 1,A1
ADD A1,A2
MOVE A2,*A8(OXVEL),L
MOVE *A0(OYVEL),A1,L
MOVE *A8(OYVEL),A3,L
SRA 1,A1 ;2,A1
ADD A1,A3
MOVE A3,*A8(OYVEL),L
MOVE *A8(OPLINK),A7,L
MOVE *A0(OID),A1
ZEXT A1,W
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A1
JRZ GALBUL2
MOVE *A7(PDATA),A1,W ;INCREMENT HIT COUNT
INC A1
MOVE A1,*A7(PDATA),W
CMPI 4,A1 ;4
JRHS GALBUL2 ;TOO MANY HITS, BLOW IT UP
CALLR BULEXP
MOVI TING2,A0
CALLA ONESND
JRUC GALBULX
*
*GAL IS HISTORY
*
GALBUL2
MOVI GALPT,A1 ;AMOUNT OF SCORE FOR ORB
CALLA SCORPLAY
CALLA GALCLEAN
CREATE 0,GALBLO
GALBULX
MMFM SP,A0,A1,A2,A3,A7
RETS
*
*HEAD HIT BY BULLET
*
GALBULHD
MOVI HEADPT,A1 ;AMOUNT OF SCORE FOR ORB
CALLA SCORPLAY
CALLA HDCLEAN
CREATE 0,GALBLO
MMFM SP,A0,A1,A2,A3,A7
RETS
*
*SWARM BALL HIT BY BULLET
*
GALBULBL
MOVI SWARMPT,A1 ;AMOUNT OF SCORE FOR ORB
CALLA SCORPLAY
CALLA BLCLEAN
CREATE 0,GALBLO
MMFM SP,A0,A1,A2,A3,A7
RETS
*
*CLEAN UP SWARM HEAD
*
HDCLEAN
MOVE *A8(OPLINK),A1,L
CLR A0
MOVE A0,*A1(PA8),L ;INDICATE OBJECT IS DEAD
MOVE A8,A0
CALLA DELOBJ
RETS
*
*CLEAN UP AFTER BALLS
*
BLCLEAN
MOVE *A8(OPLINK),A0,L ;GET PROCESS
CALLA KILL ;KILLS PROCESS IN A0
MOVE *A0(PDATA+>20),A1,L ;GET BOSS
DECW *A1(PDATA+>20) ;DECREMENT COUNT
MOVE A8,A0
CALLA DELOBJ
RETS
*
*FLATFACE BULLET EXPLOSION
*A0=BULLET
*A8=FACE PART
*
BULEXP
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
MOVI TING2,A0
CALLA ONESND
;FLASH SAUCER
MOVI 03F3F0000H,A9
CREATE 0,FLASHME
MOVE *A0(OYVAL),A1,L
MOVE *A0(OXVAL),A0,L
MOVI EXPb1,A2 ;(OIMG)
MOVI 231,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSNEUT,A5 ;(OID)
CLR A6 ;XV
CLR A7 ;YV
CALLA BEGINOBJ2
MOVI SMLEXP,A9
BULEXP1
CREATE 0,BEXPRC
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
RETS
*
*BULLET EXPLOSION
*A8=OBJECT
*A9=ANIMATION
BEXPRC
MOVI EXP3,A0 ;AUDIO BOMB EXPLODE
CALLA ONESND
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0 ;KILL THE SHIT AND DIE
CALLA DELOBJ
; CALLA DELPAL
JAUC SUCIDE
;SMART BOMB DEATH!
;A8=GAL
;A9=P1 OR P2DATA OF WHO SMARTED ME
; MOVI GALPT,A1 ;AMOUNT OF SCORE FOR ORB
; CALLA SCRADD2 ;DO IT!
; CALLR GALCLEAN
; CALLR OEXP
; RETS
*
*KILL GAL BECAUSE OF COLLISION WITH RING
*ENTER HERE FROM COLLISION ROUTINE - RINGS KILL GAL
*A8=GAL
*
GALKIL
MMTM SP,A0,A1,A2,A3,A7
MOVE *A8(OID),A1,W
ZEXT A1,W
CMPI CLSENMY|TYPGAL|SUBHEAD,A1 ;(OID)
JREQ GALBULHD
CMPI CLSENMY|TYPGAL|SUBBALL,A1 ;(OID)
JREQ GALBULBL
MOVI GALPT,A1 ;AMOUNT OF SCORE FOR GAL
CALLA SCORPLAY
CALLR GALCLEAN
CALLR OEXP2 ;CHUNKS
MMFM SP,A0,A1,A2,A3,A7
RETS
SMRT_GAL:
;SMART BOMB GALAGA
;A8=GAL
;A9=P1/P2DATA
MOVI GALPT,A1 ;AMOUNT OF SCORE FOR GAL
MOVE A9,A2 ;PLAYER
CALLA SCRADD2 ;DO IT!
CALLR GALCLEAN
CALLR OEXP2 ;CHUNKS
CLR A0
MOVE A0,@GAL_CNT
RETS
*
*ORB EXPLOSION PROCESS SMART BOMB, RINGS
*
OEXP2
OEXP
MOVI EXP3HI,A0
CALLA ONESND
CREATE 0,BIG3A
RETS
*
*GALAGA EXPLOSION PROCESS
*A8=ORB
*
GALBLO:
CLR A6
CLR A7
CALLA GETANIXY
ADDI 050000H,A2 ;A1=Y OFFSET
MOVE A2,A1
MOVE A3,A0
MOVI 199,A3 ;259
MOVI DMAWNZ|M_NOCOLL,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPNEUT,A5
MOVI EXPb1,A2
CALLA BEGINOBJ2
;CREATE EXPLOSION, AND THEN DIE
MOVI EXP3,A0
CALLA ONESND
MOVI ZOOM4,A9
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0
CALLA DELOBJ
DIE
ZOOM4:
.LONG BC1
.WORD NEWPALET|3
.LONG nup2
.LONG BC4
.WORD 3
.LONG MRM1
.WORD 3
.LONG MRM2
.WORD 3
.LONG MRM3
.WORD 3
.LONG MRM4
.WORD 3
.LONG CLD5
.WORD 3
.LONG CLD6
.WORD 3
.LONG CLD7
.WORD 3
.LONG CLD8
.WORD 3
.LONG CLD9
.WORD 3
.LONG CLD10
.WORD 3
.LONG CLD11
.WORD 3
.LONG 0
; .LONG EXPb1
; .WORD NEWPALET|3
; .LONG BULLET
; .LONG EXPb2
; .WORD NEWPALET|3
; .LONG BULLET
; .LONG EXPb3
; .WORD 4
; .LONG EXPb4
; .WORD 4
; .LONG EXPb5
; .WORD 4
; .LONG EXPb4
; .WORD 4
; .LONG EXPb3
; .WORD 5
; .LONG EXPb2
; .WORD 5
; .LONG EXPb1
; .WORD 5
; .LONG 0
*
*SQUARE ROOT ROUTINE
*A1= 32 BIT NUMBER UNSIGNED
*RETURNS: A1=SQUARE ROOT (16 BIT INTEGER)
*
SQROOT:
MMTM SP,A2,A3,A4,A5
LMO A1,A2 ;FIND # OF BITS
SUBK 31,A2
NEG A2
ADDK 2,A2
SRL 1,A2 ;GET RID OF GARBAGE
MOVI 32,A3
SUB A2,A3
NEG A3
MOVK 1,A4
RL 31,A4 ;SET MSB IN A5
SRL A3,A4
MOVE A4,A3
SQRL
SRL 1,A3
JREQ SQRX ;FINISHED ITERATING
MOVE A4,A5
MPYU A4,A5
CMP A5,A1
JRLO SQR1
JREQ SQRX
ADD A3,A4
JRUC SQRL
SQR1
SUB A3,A4
JRUC SQRL
SQRX
MOVE A4,A1
MMFM SP,A2,A3,A4,A5
RETS
*
*GALAGA ANIMATIONS
*
PURPGAL
.LONG GB1
.WORD 4
.LONG GB2
.WORD 4
.LONG GB3
.WORD 4
.LONG GB4
.WORD 4
.LONG GB5
.WORD 4
.LONG 0
GRENGAL
.LONG GALC1
.WORD 4
.LONG GALC2
.WORD 4
.LONG GALC3
.WORD 4
.LONG GALC4
.WORD 4
.LONG GALC5
.WORD 4
.LONG 0
SPDRGAL
.LONG glg1
.WORD 3
.LONG glg2
.WORD 2
.LONG glg3
.WORD 3
.LONG glg4
.WORD 2
.LONG glg5
.WORD 3
.LONG glg4
.WORD 2
.LONG glg3
.WORD 3
.LONG glg2
.WORD 2
.LONG 0
BALLGAL
.LONG GA1
.WORD 4
.LONG GA2
.WORD 4
.LONG GA3
.WORD 4
.LONG GA4
.WORD 4
.LONG GA5
.WORD 4
.LONG GA6
.WORD 4
.LONG 0
.END