.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