1340 lines
31 KiB
NASM
1340 lines
31 KiB
NASM
.FILE 'COLL2.ASM'
|
||
.TITLE "COLLISION ROUTINES"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
|
||
; INITIATED: JULY 17,1990
|
||
; MODIFIED: !
|
||
; SOFTWARE: THIS COLLISION ROUTINE WAS DEVELOPED BY TODD ALLEN.
|
||
; SOFTWARE: MARK TURMELL
|
||
;
|
||
; TODD ALLEN CREATED THESE COLLISION ROUTINES FOR OFFENDER
|
||
|
||
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
|
||
|
||
****************************************************************************
|
||
* When writing collision routines which are to be called from the collision
|
||
* scanner in this file, the following things should be taken into
|
||
* consideration:
|
||
* The collision routines are called, not created..
|
||
* The collision routine receives a ptr to the victims OBJ in A8
|
||
* The collision routine receives a ptr to the killers OBJ in A0
|
||
* The collision routine can destroy A0,A8 but should preserve all others.
|
||
* When OBJ1,OBJ2 collide, two routines are called, one with
|
||
* OBJ1 in A8 and the other with OBJ2 in A8. A collision routine
|
||
* should only affect the victim, and not the killer.
|
||
* If a victim object is deleted, it will not be scanned futher.
|
||
* If any other object is deleted, the collision scan will be aborted.
|
||
* To prevent multiple simultaneous collisions of the same victim
|
||
* object, the object ID of the victim object should be modified
|
||
* by the collision routine, if the victims nature is changed.
|
||
|
||
|
||
; GET THE SYSTEM STUFF
|
||
|
||
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
|
||
.INCLUDE "DISP.EQU" ;DISPLAY PROCESSOR EQUATES
|
||
.INCLUDE "\VIDEO\SYS\SYS.INC" ;ZUNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\GSP.INC" ;ZUNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS, YEAH!
|
||
.INCLUDE "GAME.EQU"
|
||
.INCLUDE "IMGTBL.GLO"
|
||
|
||
|
||
;SOUNDS
|
||
|
||
.REF HASND,ONOSND,OUCH,AWWSND2
|
||
|
||
;
|
||
;SYMBOLS EXTERNALLY DEFINED
|
||
;
|
||
.REF SPRAYON,EXTRA,RINGON,NSTPON,KEYON,SHOEON,SMRTON,BMBON
|
||
.REF KILL_PLYR,KILL_BULL,BNC_PLYR,BNC_PLYR2,KILL_GATE,BMLM2,PCNT
|
||
.REF GOT_HSTG,KILL_CRT,KILL_HULK,BAT_PLYR,DEL_BULL,TCSH,KILL_CRT2
|
||
.REF PUSH_FT,YKIL_FT,YKIL_FT2,FIREON,SPDGON,GRENON,HLPON,LSDMG
|
||
.REF KILL_HULKZ,KILL_CBALL,KILL_BULL2,I_FLM,YKIL_RNG,FND_PROXCHK
|
||
.REF HIT_TURET,HIT_TNK,HIT_TNK2,P1DATA,P2DATA
|
||
.REF FLAME_LAY,YKIL_LAY
|
||
.REF KILL_AHMDZ,KILL_AHMD,plyr_spiton
|
||
.ref slt_hit,slt_ringhit,slt_bbhit,spidegg_touch
|
||
|
||
;SYMBOLS DEFINED IN THIS FILE
|
||
;
|
||
.DEF COLLISIONS,SHORT_PLYR,OUT_FLG
|
||
;
|
||
;UNINITIALIZED RAM DEFINITIONS
|
||
;
|
||
.BSS PList,32*(NOBJ+1) ;list of objects of class player
|
||
.BSS NList,32*(NOBJ+1) ;list of objects of class neutral
|
||
.BSS EList,32*(NOBJ+1) ;list of objects of class enemy
|
||
.BSS DumObj,OBSIZ
|
||
.BSS OUT_FLG,16 ;1=DON'T CONT SCANNING THIS OBJECT
|
||
.BSS BRAM,16 ;RAM FOR THROWING OUT PLTK COLLIDES
|
||
;NOBJ=NUMBER OF OBJECTS TO DISPLAY
|
||
|
||
;
|
||
;EQUATES FOR THIS FILE
|
||
;
|
||
ODMAIMG .EQU OIMG
|
||
ODMAFLG .EQU OFLAGS
|
||
|
||
IBAT .EQU PDATA+464 ;UHW BAT FLAG 0=OFF, 1=ON
|
||
;SAME AS IN NEWHULK.ASM
|
||
|
||
|
||
****************************************************************************
|
||
|
||
COLLISIONS
|
||
SLEEP 1
|
||
|
||
move @WORLDTLX+16,A6 ;* COLLISION SCAN FOR OBJECTS ON SCREEN
|
||
movi 400,A14 ;End of Scan area
|
||
|
||
coll1 move A6,A7 ;A7 Sector Xmin
|
||
addi 128,A6 ;A6 Sector Xmax
|
||
|
||
subi 128,A14
|
||
jrnn XmaxOk
|
||
sub A14,A6
|
||
clr A14
|
||
XmaxOk
|
||
MOVI OBJLST,A0 ;OBJECT LIST TO CHECK
|
||
callr CScnRng
|
||
|
||
move A14,A14
|
||
jrp coll1
|
||
|
||
jruc COLLISIONS
|
||
|
||
|
||
CScnRng
|
||
;A0 ptr to OBJ LIST To SCAN
|
||
;A6 Xmax
|
||
;A7 Xmin
|
||
;Scan OBJ list, any collideable OBJ overlapping Xmin-Xmax put on
|
||
;either EList,PList or NList depending on class
|
||
;Call ColLists with each pair of lists
|
||
|
||
mmtm SP,A6,A7,A14 ;NECESSARY?
|
||
|
||
;*** BUILD COLLISION LISTS ***
|
||
movi PList,A9
|
||
movi EList,A10
|
||
movi NList,A11
|
||
|
||
MkLists move *A0,A0,L ;Get next obj
|
||
jrz GotLists
|
||
|
||
move *A0(OXPOS),A1
|
||
|
||
;*** OBJ CAN LIE ON max/min boundary, use unsigned compares
|
||
cmp A6,A1
|
||
jrhi MkLists
|
||
move *A0(OSIZEX),A2
|
||
add A2,A1
|
||
cmp A7,A1
|
||
jrlo MkLists
|
||
;IN RANGE
|
||
movb *A0(OFLAGS+B_NOCOLL-7),A2 ;Is object collideable
|
||
jrn MkLists
|
||
|
||
|
||
move *A0(OID),A2 ;Check Class
|
||
sll 16,A2
|
||
srl 32-2,A2 ;Only 2 class bits
|
||
subk 2,a2 ;Enemy
|
||
jrz AddE
|
||
addk 1,a2 ;Player
|
||
jrz AddP
|
||
|
||
;*** CLASS NEUTRAL
|
||
move A0,*A11+,L ;INSERT OBJ on NList
|
||
jruc MkLists
|
||
|
||
AddE ;*** CLASS ENEMY
|
||
move A0,*A10+,L ;INSERT OBJ on EList
|
||
jruc MkLists
|
||
|
||
AddP ;*** CLASS PLAYER
|
||
move A0,*A9+,L ;INSERT OBJ on PList
|
||
jruc MkLists
|
||
|
||
GotLists
|
||
;*** NULL TERMINATE EACH LIST ***
|
||
clr A0
|
||
move A0,*A9,L
|
||
move A0,*A10,L
|
||
move A0,*A11,L
|
||
|
||
;*** COLLIDE EACH PAIR OF LISTS ***
|
||
|
||
movi PList,A3
|
||
move *A3,A0,L
|
||
jrz NoPList
|
||
|
||
movi EList,A3 ;E/P
|
||
movi PList,A4
|
||
callr ColLists
|
||
jrc ScnRngX
|
||
movi NList,A3 ;N/P
|
||
movi PList,A4
|
||
callr ColLists
|
||
jrc ScnRngX
|
||
|
||
NoPList
|
||
|
||
;WHEN CHECKING NEUTRAL/ENEMY WAVES ONLY
|
||
;FOR TANKS AGAINST HULKS!
|
||
;ONLY FALL THROUGH WHEN WE NEED ENEMY TO ENEMY!
|
||
|
||
; MOVB @ENON,A3
|
||
; JRZ NoNList
|
||
; MOVB @PCNT,A3
|
||
;; ANDI 07H,A3 ;03 FOR MORE ACCURACY
|
||
; ANDI 0FH,A3 ;03 FOR MORE ACCURACY
|
||
;
|
||
; JRNZ NoNList
|
||
; movi EList,A3 ;E/N
|
||
; movi NList,A4
|
||
; callr ColLists
|
||
|
||
;NoNList:
|
||
; MOVB @ECON,A6 ;0=NOT ON, 1=ENEMY TO ENEMY NEEDED!
|
||
; JRZ ScnRngX
|
||
;;NEED TO CHECK ENEMY AGAINST ENEMY CLASS! FALL INTO THIS!
|
||
; MOVI EList,A3
|
||
; MOVI EList,A4
|
||
; CALLR ColLists
|
||
|
||
ScnRngX mmfm SP,A6,A7,A14
|
||
rets
|
||
|
||
SHORT_PLYR
|
||
;PLAYER HAS BEEN COLLIDED WITH
|
||
;TELL THIS COLLISION CHECK THAT PLAYER IS REALLY SHORTER THAN HE IS
|
||
;THEN RETURN CARRY SET IF STILL A HIT, CARRY CLEAR IF THIS SHOULD NOT BE
|
||
;A COLLISION.
|
||
;A0=OBJECT THAT HIT PLAYER
|
||
;A8=PLAYER LEGS IMAGE PTR
|
||
MOVE *A8(OYPOS),A7 ;A7 - OBJ1 Ymin
|
||
ADDK 3,A7 ;ADDI 0
|
||
MOVE *A0(OID),A11
|
||
zext a11
|
||
; CMPI CLSENMY|TYPORB,A11
|
||
; JRNE SP0
|
||
; SUBK 5,A7
|
||
; MOVE *A8(OSIZEY),A11,W ;A11 - OBJ1 Ymax
|
||
; SUBK 8,A11 ;MAKE LEGS SHORTER IN LENGTH!
|
||
; JRUC SP2
|
||
;SP0
|
||
CMPI CLSNEUT|TYPMINE,A11
|
||
JRNE SP1
|
||
ADDK 12,A7 ;15
|
||
MOVE *A8(OSIZEY),A11 ;A11 - OBJ1 Ymax
|
||
SUBK 19,A11 ;MAKE LEGS SHORTER IN LENGTH! ;21
|
||
JRUC SP2
|
||
SP1
|
||
move *A8(OSIZEY),A11 ;A11 - OBJ1 Ymax
|
||
SUBK 19,A11 ;SUBI 13 16 ;MAKE LEGS SHORTER IN LENGTH!
|
||
SP2 add A7,A11
|
||
move *A0(OYPOS),A6 ;CHECK OBJS A0,A8 for intersection
|
||
cmp A11,A6
|
||
jrgt CLRCR ;Y2Min > Y1Max
|
||
move *A0(OSIZEY),A11
|
||
add A11,A6
|
||
cmp A7,A6
|
||
jrlt CLRCR ;Y2Max < Y1Min
|
||
|
||
;NOW X CHECK
|
||
|
||
move *A8(OXPOS),A7 ;A9 - OBJ1 Xmin
|
||
ADDK 6,A7
|
||
move *A8(OSIZEX),A11 ;A10 - OBJ1 Xmax
|
||
SUBK 6,A11
|
||
add A7,A11
|
||
move *A0(OXPOS),A6 ;USE SIGNED COMPARES BECAUSE OBJS MAY LIE ON ZERO
|
||
cmp A11,A6
|
||
jrgt CLRCR ;X2Min > X1Max
|
||
move *A0(OSIZEX),A11
|
||
add A11,A6
|
||
cmp A7,A6
|
||
jrlt CLRCR ;X2Max < X1Min
|
||
|
||
SETC ;GOT A BOX INTERSECTION
|
||
RETS
|
||
CLRCR CLRC
|
||
RETS
|
||
|
||
|
||
********************************
|
||
* COLLIDE OBJECTS ON LIST A3 with those on LIST A4
|
||
* A3,A4 ptrs to null terminated tables of object ptrs
|
||
* rets Carry Set if scan must be terminated
|
||
|
||
ColLists
|
||
move A4,B4
|
||
CLstsLp0
|
||
move *A3+,A1,L
|
||
jrz ScnDone
|
||
|
||
; movb *A1(OFLAGS+B_INUSE-7),A14
|
||
; jrnn CLstsLp0
|
||
|
||
|
||
;*** LOAD UP COORS OF OBJ FROM FIRST LIST
|
||
move *A1(OYPOS),A7 ;A7=OBJ1 Ymin
|
||
jrz CLstsLp0 ;Deleted?
|
||
move *A1(OSIZEY),A11 ;A11=OBJ1 Ymax
|
||
add A7,A11
|
||
move *A1(OXPOS),A9 ;A9=OBJ1 Xmin
|
||
move *A1(OSIZEX),A10 ;A10=OBJ1 Xmax
|
||
add A9,A10
|
||
|
||
move B4,A4 ;Load head of second list
|
||
|
||
;OBJ IN A1 CAN'T LIE ACROSS max/min boundary
|
||
|
||
PScnLp1 move *A4+,A2,L
|
||
jrz CLstsLp0
|
||
|
||
; movb *A2(OFLAGS+B_INUSE-7),A14
|
||
; jrnn PScnLp1
|
||
|
||
;CHECK OBJS A1,A2 for intersection
|
||
move *A2(OYPOS),A6
|
||
jrz PScnLp1 ;Deleted?
|
||
cmp A11,A6
|
||
jrgt PScnLp1 ;Y2Min > Y1Max
|
||
move *A2(OSIZEY),A14
|
||
add A14,A6
|
||
cmp A7,A6
|
||
jrlt PScnLp1 ;Y2Max < Y1Min
|
||
|
||
move *A2(OXPOS),A6 ;USE SIGNED COMPARES BECAUSE OBJS MAY LIE ON ZERO
|
||
cmp A10,A6
|
||
jrgt PScnLp1 ;X2Min > X1Max
|
||
move *A2(OSIZEX),A14
|
||
add A14,A6
|
||
cmp A9,A6
|
||
jrlt PScnLp1 ;X2Max < X1Min
|
||
|
||
callr ColFuncs ;GOT A BOX INTERSECTION
|
||
jrz PScnLp1
|
||
;ADD THESE LINES BACK IF PIXSCAN IS USED IN GAME
|
||
|
||
movb *A1(OFLAGS+B_PIXSCAN-7),A14 ;Is PIXSCAN ON
|
||
jrn DoPScn0
|
||
movb *A2(OFLAGS+B_PIXSCAN-7),A14 ;Is PIXSCAN ON
|
||
jrnn SkPxScn0
|
||
DoPScn0
|
||
callr PIXSCANG
|
||
jrnc PScnLp1 ;BR=THIS WASN'T REALLY A COLLISION
|
||
SkPxScn0
|
||
;KILL TO MANY OBJECTS HERE?
|
||
|
||
CLR A6
|
||
MOVE A6,@OUT_FLG
|
||
|
||
; move @OFREE,A6,L
|
||
|
||
move B1,B1
|
||
jrz PObj2Col
|
||
move A1,A8
|
||
move A2,A0
|
||
call B1
|
||
|
||
PObj2Col
|
||
move B2,B2
|
||
jrz PCkFree
|
||
move A2,A8
|
||
move A1,A0
|
||
call B2
|
||
|
||
PCkFree
|
||
move @OUT_FLG,A8 ;OFREE,A8,L
|
||
; cmp A6,A8
|
||
jreq PScnLp1 ;* IF SAME OBJ, Continue scan
|
||
jruc CLstsLp0
|
||
ScnDone
|
||
clrc
|
||
|
||
ColLstsX
|
||
rets
|
||
|
||
|
||
****************************************************************************
|
||
ColFuncs:
|
||
;A1,A2 ptrs to objects
|
||
;returns B1 collision routine for obj A1
|
||
;returns B2 collision routine for obj A2
|
||
|
||
mmtm SP,A3,A4
|
||
callr ColFunc
|
||
move B0,B1
|
||
SWAP A1,A2
|
||
callr ColFunc
|
||
SWAP A1,A2
|
||
move B0,B2
|
||
or B1,B0 ;set z flag if both are zero
|
||
mmfm SP,A3,A4
|
||
rets
|
||
|
||
****************************************************************************
|
||
|
||
ColFunc ;return in B0 routine for obj A1 struck by obj A2
|
||
|
||
movb *A1(OID+8),A3
|
||
movb *A2(OID+8),A4
|
||
sll 27,A3
|
||
srl 17,A3 ;32 Long Word Align
|
||
sll 27,A4
|
||
srl 22,A4 ;Long Align
|
||
add A4,A3
|
||
addi TypeTbl,A3
|
||
|
||
CMPI TBLEND,A3
|
||
JRLO CONT
|
||
.IF DEBUG
|
||
LOCKUP
|
||
EINT
|
||
.ENDIF
|
||
MOVI TypeTbl,a3
|
||
|
||
CONT move *A3,A3,L
|
||
jump A3 ;Routine can trash A0/A3/A4/A8/A14
|
||
|
||
|
||
****************************************************************************
|
||
* These are the COLLISION FUNCTIONS
|
||
* A collision function is selected by the routine ColFunc
|
||
* which uses the TYPE field of the victims OID to select a subtable
|
||
* and indexes the subtable with the TYPE field of the killer.
|
||
* This gives a ptr to a COLLISION FUNCTION which returns
|
||
* the COLLISION ROUTINE to be called for the victim in B0.
|
||
* The COLLISION FUNCS can destroy registers A0,A3,A4,A8
|
||
****************************************************************************
|
||
|
||
TypeTbl:
|
||
;0000
|
||
;NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0100
|
||
;PLAYER
|
||
.LONG NULL, NULL, NULL, PLTR, PLGT, NULL, NULL, NULL
|
||
.LONG NULL, PLTR, PLHU, NULL, PLHU, NULL, NULL, PLTR
|
||
.LONG PLTK, NULL, PLMN, PLHU, NULL, PLSL, NULL, PLMN
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0200
|
||
;PLAYER BULLET
|
||
.LONG NULL, NULL, NULL, BLTR, BLTR, NULL, NULL, NULL
|
||
.LONG NULL, BLTR, BLHU, BLFN, NULL, NULL, NULL, BLTR
|
||
.LONG BLTK, BLTK, BLLY, BLFN, NULL, BLHU, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0300
|
||
;TREE TRUNK TYPE ITEMS
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0400
|
||
;GATES/DOORS
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0500
|
||
;TIME BOMBS (PLYR CLASS)
|
||
.LONG NULL, NULL, NULL, NULL, BMGT, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, BMLM
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0600
|
||
;HOSTAGES
|
||
.LONG NULL, HSPL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0700
|
||
;TEXT
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0800
|
||
;ICONS
|
||
.LONG NULL, ICPL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0900
|
||
;CRATE
|
||
.LONG NULL, NULL, CRBL, NULL, NULL, CRBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0A00
|
||
;HULK ENEMY
|
||
.LONG NULL, HUPL, HUBL, NULL, NULL, HUBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, HUBD, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0B00
|
||
;FIEND ENEMY
|
||
.LONG NULL, FNPL, FNBL, NULL, NULL, FNBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, FNBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0C00
|
||
;ENEMY SHOTS/CANNON BALL
|
||
.LONG NULL, CBPL, NULL, NULL, NULL, CBBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, CBLS, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0D00
|
||
;HELPER BLADE AROUND PLYRS/ LS
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, LSHU, LSHU, LSHU, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, LSHU, NULL, LSHU, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0E00
|
||
;GOO SHRAPNEL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, CBLS, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;0F00
|
||
;GROW FROM SLIME
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1000
|
||
;BIG TANK BASE
|
||
.LONG NULL, NULL, TKBL, NULL, NULL, TKBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1100
|
||
;TANK TORSO
|
||
.LONG NULL, NULL, TSBL, NULL, NULL, TSBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1200
|
||
;MINE LAYER
|
||
.LONG NULL, LYPL, LYBL, NULL, NULL, LYBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, LYBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1300
|
||
;AHMED FLAME THROWER
|
||
.LONG NULL, AHPL, AHBL, NULL, NULL, AHBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, AHBM, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1400
|
||
;FROG FACE
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1500
|
||
;SHAWN SKIPPER/GRUNT ENEMIES
|
||
.LONG NULL, SLPL, SLBL, NULL, NULL, SLBB, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, SLBB, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1600
|
||
;CANNON BALL THAT EXPLODES
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1700
|
||
;LAND MINES
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1800
|
||
;MUTOID MAN
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1900
|
||
;FLATFACE
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
;1A00
|
||
;PILE
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||
TBLEND
|
||
|
||
TKBL
|
||
;BIG TANK WITH BULLET
|
||
MOVE *A1(OID),A0
|
||
BTST 0,A0
|
||
JRNZ NULL
|
||
MOVI HIT_TNK,B0
|
||
RETS
|
||
|
||
TKBM ;BIG TANK WITH TIME BOMB
|
||
MOVE *A1(OID),A0
|
||
BTST 0,A0
|
||
JRNZ NULL
|
||
MOVI HIT_TNK2,B0
|
||
RETS
|
||
|
||
TSBL ;TURRET WITH BULLET
|
||
TSBM ;TURRET WITH TIME BOMB
|
||
MOVI HIT_TURET,B0
|
||
RETS
|
||
|
||
CBPL ;IF IT HIT RINGS THEN KILL IT
|
||
movb *a2(OID),a0
|
||
subk 3,a0 ;CHECK TO SEEK IF I'M HITTING RING NOT PLAYER
|
||
JRZ NULL
|
||
movb *a1(OID),a0
|
||
jrz CBLS
|
||
movi plyr_spiton,b0
|
||
rets
|
||
|
||
|
||
CBLS ;CANNON BALL / HELPER BLADE AROUND PLAYER
|
||
MOVE *A2(OIMG),A0,L
|
||
CMPI BLADE,A0 ;HELPER BLADE IMG
|
||
JRNE NULL
|
||
|
||
CBBM ;WITH BOMB
|
||
MOVI KILL_CBALL,B0
|
||
RETS
|
||
|
||
LSHU ;HELPER BLADE WITH ANYTHING
|
||
MOVE *A1(OIMG),A0,L
|
||
CMPI BLADE,A0
|
||
JRNE NULL ;MINE LAYER?
|
||
MOVI LSDMG,B0 ;THIS IS REALLY HELPER
|
||
RETS
|
||
|
||
|
||
LYPL ;IF MINE LAYER HIT RINGS THEN KILL IT
|
||
MOVE *A1(OID),A0
|
||
BTST 0,A0 ;CHECK FOR SUBFLM!
|
||
JRNZ NOKL
|
||
MOVB *A2(OID),A0 ;CHECK TO SEEK IF I'M HITTING RING NOT PLAYER
|
||
subk 3,a0
|
||
JREQ LHA
|
||
NOKL CLR B0
|
||
RETS
|
||
LHA MOVI YKIL_RNG,B0
|
||
RETS
|
||
|
||
|
||
LYBM MOVE *A1(OID),A0
|
||
BTST 0,A0 ;CHECK FOR SUBFLM!
|
||
JRNZ NOKL
|
||
MOVI YKIL_LAY,B0
|
||
RETS
|
||
|
||
LYBL MOVE *A1(OID),A0
|
||
BTST 0,A0 ;CHECK FOR SUBFLM!
|
||
JRNZ NOKL
|
||
MOVI FLAME_LAY,B0
|
||
RETS
|
||
|
||
FNPL ;IF FIEND HIT RINGS THEN KILL IT
|
||
MOVB *A2(OID),A0 ;CHECK TO SEEK IF I'M HITTING RING NOT PLAYER
|
||
subk 3,a0
|
||
JREQ KHA
|
||
MOVI FND_PROXCHK,B0
|
||
RETS
|
||
KHA
|
||
FNBM MOVI YKIL_FT2,B0
|
||
RETS
|
||
|
||
FNBL ;IF NON STOPPING BULLET, KILL FIEND OTHERWISE, PUSH HIM
|
||
MOVE *A2(OID),A0
|
||
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A0
|
||
JRZ FH0 ;BR=KILL FAT
|
||
MOVI PUSH_FT,B0 ;NOW PUSH FATMAN BACK IN DIR BULLET IS TRAVELING
|
||
RETS
|
||
FH0 MOVI YKIL_FT,B0
|
||
RETS
|
||
|
||
HUPL ;IF HULK HIT RINGS THEN KILL HULK
|
||
MOVB *A2(OID),A0 ;CHECK TO SEE IF HULK IS HITTING RING NOT PLAYER
|
||
subk 3,a0
|
||
JREQ KH
|
||
MOVE *A1(OPLINK),A0,L ;IS THIS HULK ALREADY SWINGING?
|
||
MOVE *A0(IBAT),A0
|
||
JRZ BPY
|
||
addk 1,a0 ;andi >FF
|
||
sll 32-8,a0 ;cmpi >FF
|
||
JRNZ NULL
|
||
BPY
|
||
MOVI BAT_PLYR,B0
|
||
RETS
|
||
KH MOVI KILL_HULKZ,B0
|
||
RETS
|
||
|
||
HUBM ;HULK/TIME BOMB
|
||
HUBL MOVI KILL_HULK,B0
|
||
RETS
|
||
|
||
HUBD ;KILL HULK, BUT NO POINTS GIVEN!
|
||
MOVI KILL_HULK,B0
|
||
RETS
|
||
|
||
AHPL ;IF AHMED HIT RINGS THEN KILL AHMED
|
||
MOVB *A2(OID),A0 ;CHECK TO SEE IF AHMED IS HITTING RING NOT PLAYER
|
||
subk 3,a0
|
||
JREQ AKH
|
||
MOVE *A1(OPLINK),A0,L
|
||
MOVE *A0(IBAT),A0 ;2=FLAMING,1=PUNCHING
|
||
subk 1,a0
|
||
JRZ NULL
|
||
;IF AHMED IS WALKING OR EVEN FLAMING, TURN AND DO PUNCH AT PLYR WHO TOUCHED ME
|
||
MOVI I_FLM,B0
|
||
RETS
|
||
|
||
AKH
|
||
AHBM ;AHMD/TIME BOMB/RINGS/PLAYER HELPER
|
||
MOVI KILL_AHMDZ,B0 ;WITH RING
|
||
RETS
|
||
|
||
AHBL MOVI KILL_AHMD,B0
|
||
RETS
|
||
|
||
|
||
********************************
|
||
* Shawn's enemy type collisons
|
||
|
||
SLPL movb *a1(OID),a0 ;Missile type?
|
||
subk 2,a0
|
||
jrz slpl5
|
||
movb *a2(OID),a0 ;Player ring
|
||
subk 3,a0
|
||
jrne NULL
|
||
slpl5 movi slt_ringhit,b0
|
||
rets
|
||
|
||
SLBL movi slt_hit,b0 ;Bullet
|
||
rets
|
||
|
||
SLBB movi slt_bbhit,b0 ;Blade, bomb
|
||
rets
|
||
|
||
|
||
CRBL ;CRATE/BULLET
|
||
MOVI KILL_CRT,B0 ;SHOOT CRATE
|
||
RETS
|
||
|
||
CRBM ;CRATE/TIME BOMB
|
||
MOVE @PCNT,A0
|
||
movk >f,a14
|
||
and a14,a0
|
||
JRNZ NULL
|
||
MOVI KILL_CRT2,B0 ;KILL CRATE DEAD
|
||
RETS
|
||
|
||
ICPL ;ICON AND PLAYER 1 COLLIDE
|
||
MOVE *A2(OPLINK),A0,L
|
||
MOVE *A0(PNUM),A0
|
||
MOVI P1DATA,A3
|
||
DEC A0
|
||
JRZ DB2
|
||
MOVI P2DATA,A3
|
||
DB2 MOVE *A3(TWPNS),A0
|
||
INC A0
|
||
MOVE A0,*A3(TWPNS)
|
||
MOVB *A1(OID),A0
|
||
SLL 5,A0
|
||
ADDI ICONTBL,A0
|
||
MOVE *A0,A0,L
|
||
MOVE A0,B0
|
||
RETS
|
||
|
||
;ICON SUB TYPES
|
||
ICONTBL .LONG NULL,FIREON,SPRAYON,SPDGON,EXTRA,GRENON,RINGON,NSTPON,KEYON
|
||
.LONG SHOEON,SMRTON,BMBON,TCSH,HLPON,0,0,spidegg_touch
|
||
|
||
PLHU
|
||
; MOVB @PCNT,A0
|
||
; ANDI 03,A0
|
||
; SLL 5,A0
|
||
; ADDI PTBL2,A0
|
||
; MOVE *A0,A0,L
|
||
; CALLA ONESND
|
||
MOVB *A1(OID),A0 ;CHECK TO SEE IF OID SAYS THIS IS A RING
|
||
subk 3,a0
|
||
JREQ NULL
|
||
MOVI KILL_PLYR,B0
|
||
RETS
|
||
|
||
;PTBL2 .LONG HASND,ONOSND,OUCH,AWWSND2
|
||
|
||
|
||
PLFN MOVB *A1(OID),A0 ;CHECK TO SEE IF OID SAYS THIS IS A RING
|
||
subk 3,a0
|
||
JREQ NULL
|
||
PLTR MOVI BNC_PLYR,B0 ;PLYR/TREE TRUNK/CRATE
|
||
RETS
|
||
|
||
PLGT MOVI BNC_PLYR2,B0 ;PLYR/GATE
|
||
RETS
|
||
|
||
PLTK MOVB *A1(OID),A0 ;PLYR/BIG TANK BASE
|
||
subk 3,a0 ;Ring?
|
||
JREQ PTK
|
||
MOVE *A2(OIMG),A0,L
|
||
CMPI T72TNK2,A0 ;DESTROYED TANK
|
||
JREQ PTK
|
||
MOVE @BRAM,A0
|
||
INC A0
|
||
MOVE A0,@BRAM
|
||
movk 3,a14
|
||
and a14,a0
|
||
JRNZ PTK
|
||
MOVI KILL_PLYR,B0
|
||
RETS
|
||
PTK MOVI BNC_PLYR2,B0
|
||
RETS
|
||
|
||
|
||
********************************
|
||
* Player hits shawn type
|
||
|
||
PLSL movb *a2(OID),a0
|
||
subk 1,a0
|
||
jrnz PLHU ;Not spid mom?
|
||
|
||
movb *a1(OID),a0
|
||
subk 3,a0
|
||
jrnz PTK ;Player ring?
|
||
move @BRAM,a0
|
||
addk 1,a0
|
||
move a0,@BRAM
|
||
movk 3,a14
|
||
and a14,a0
|
||
jrnz PTK
|
||
movi KILL_PLYR,b0
|
||
rets
|
||
|
||
|
||
PLMN ;PLYR/LAND MINE/MINE LAYER/FLAME FROM AHMED FLAME THROWER
|
||
MOVB *A1(OID),A0
|
||
subk 3,a0 ;Ring?
|
||
JREQ NULL
|
||
MOVI KILL_PLYR,B0
|
||
RETS
|
||
|
||
|
||
NULL CLR B0
|
||
RETS
|
||
|
||
|
||
HSPL ;HSTG/PLYR
|
||
MOVI GOT_HSTG,B0
|
||
RETS
|
||
|
||
BMLM ;BMB/LAND MINE
|
||
MOVI BMLM2,B0
|
||
RETS
|
||
|
||
BMGT ;TIME BOMB/GATES
|
||
MOVE *A2(OID),A0
|
||
CMPI CLSNEUT|TYPGATE|SUBLAY,A0 ;WILL BOUNCE OFF OF
|
||
JRZ NULL ;MIGHT BE SAND BAGS!
|
||
MOVI KILL_GATE,B0
|
||
RETS
|
||
|
||
BLHU ;BULLET/BAD GUYS
|
||
;CHECK THIS BULLETS ID AND COMPARE TO NON STOPPING BULLET!
|
||
;IF IT IS, DON'T KILL_BULL!
|
||
MOVE *A1(OID),A0
|
||
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A0
|
||
JRNE OKB
|
||
;THIS IS A NON STOPPING BULLET, DO NOT KILL, BUT INC THITS COUNT
|
||
;INC BULLET HIT TOTAL FOR THIS PLAYER
|
||
MOVE *A1(OPLINK),A0,L
|
||
MOVE *A0(MYPLYR),A0
|
||
MOVI P1DATA,A3
|
||
DEC A0
|
||
JRZ DB3
|
||
MOVI P2DATA,A3
|
||
DB3 MOVE *A3(THITS),A0
|
||
INC A0
|
||
MOVE A0,*A3(THITS)
|
||
CLR B0
|
||
RETS
|
||
|
||
OKB
|
||
BLFN ;BULLET/FIEND
|
||
MOVI DEL_BULL,B0
|
||
RETS
|
||
|
||
BLLY ;BULLET/MINE LAYER/FLAME FROM AHMED
|
||
MOVE *A2(OID),A0
|
||
BTST 0,A2 ;CHECK FOR SUBFLM!
|
||
JRNZ NULL
|
||
MOVI DEL_BULL,B0
|
||
RETS
|
||
|
||
BLTR ;BULLET/TREE TRUNK/CRATE
|
||
MOVE *A2(OID),A0 ;A2=IMG BULLET IS HITTING
|
||
BTST 0,A0
|
||
JRNZ NULL ;BR=SAND BAGS
|
||
MOVI KILL_BULL,B0 ;WITH POOF IMAGES
|
||
RETS
|
||
|
||
BLTK ;BULLET/TANK
|
||
MOVE *A2(OID),A0
|
||
BTST 0,A0
|
||
JRNZ NULL
|
||
MOVI KILL_BULL2,B0
|
||
RETS
|
||
|
||
|
||
|
||
****************************************************************************
|
||
*
|
||
*COLLISION ROUTINE
|
||
*A1=OBJECT ONE
|
||
*A2=OBJECT TWO
|
||
*RETURNS: CS= COLLISION, CC= NO COLLISION
|
||
*
|
||
* CLOBBERS A14
|
||
;PIXSCAN:
|
||
; movb *A1(OFLAGS+B_PIXSCAN-7),A14 ;Is PIXSCAN ON
|
||
; jrn PIXSCANG
|
||
; movb *A2(OFLAGS+B_PIXSCAN-7),A14 ;Is PIXSCAN ON
|
||
; jrn PIXSCANG ;BR = NO PIXSCAN, JUST RETURN YES
|
||
; setc
|
||
; rets
|
||
|
||
*CREATE TIME SLICE WHILE LOCKING OUT INTERRUPTS
|
||
PIXSCANG
|
||
;REALLY? C'MON
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13
|
||
MMTM SP,B0,B1
|
||
move A1,A0
|
||
move A2,A8
|
||
PUSHST
|
||
DINT
|
||
MOVE *A0(OIMG),A9,L ;GET IMAGE 0 POINTER
|
||
MOVE *A8(OIMG),A7,L ;GET IMAGE 1 POINTER
|
||
;SET UP OBJECT BOX ULX,ULY
|
||
move *A0(OXPOS),A3,W
|
||
move *A0(OYPOS),A14,W
|
||
sll 16,A14
|
||
movy A14,A3
|
||
move *A8(OXPOS),A4,W
|
||
move *A8(OYPOS),A14,W
|
||
sll 16,A14
|
||
movy A14,A4
|
||
|
||
MOVE *A0(OFLAGS),A6
|
||
MOVE A6,B0 ;FLAGS FOR OBJECT 0
|
||
MOVE *A8(OFLAGS),A6
|
||
MOVE A6,B1 ;FLAGS OBJECT 1
|
||
POPST
|
||
|
||
MOVE *A9(ISIZE),A5,L
|
||
MOVE *A7(ISIZE),A6,L
|
||
ADDXY A3,A5 ;NOW WE HAVE LRX0 AND LRY0
|
||
ADDXY A4,A6 ;LRX1,LRY1
|
||
CMPXY A6,A3 ;COMPARE (LRX1,LRY1) TO (TLX0,TLY0)
|
||
JRXGE CSFAIL
|
||
JRYGE CSFAIL
|
||
CMPXY A4,A5 ;COMPARE (TLX1,TLY1) TO (LRX0,LRY0)
|
||
JRXLE CSFAIL
|
||
JRYLE CSFAIL
|
||
MOVE A0,A10
|
||
*
|
||
*BOX HAS INTERSECTED
|
||
*PERFORM PIXEL SCAN
|
||
*A3=TLX0,TLY0
|
||
*A4=TLX1,TLY1
|
||
*A5=LRX0,LRX1
|
||
*A6=LRX1,LRY1
|
||
*A7=IMAGE 1 DATA HEADER POINTER
|
||
*A8=IMAGE 1 OBJECT POINTER
|
||
*A9=IMAGE 0 DATA HEADER POINTER
|
||
*A10=IMAGE 0 OBJECT POINTER
|
||
*B0=FLAGS OBJECT 0
|
||
*B1=FLAGS OBJECT 1
|
||
*
|
||
*CALCULATE XOFF0,XOFF1,XSCAN
|
||
*A11=XOFF0
|
||
*A12=XOFF1
|
||
*A13=XSCAN
|
||
*
|
||
MOVE A3,A2
|
||
SUBXY A4,A2
|
||
SEXT A2,W
|
||
JRNN CLX1
|
||
NEG A2
|
||
MOVE A2,A11 ;OBJECT 1 TO THE RIGHT
|
||
CLR A12
|
||
MOVE A4,A13 ;RIGHTMOST TOP LEFT
|
||
JRUC CLX2
|
||
CLX1: ;OBJECT 0 TO THE RIGHT
|
||
MOVE A2,A12
|
||
CLR A11
|
||
MOVE A3,A13 ;RIGHTMOST TOP LEFT
|
||
CLX2:
|
||
CMPXY A5,A6 ;FIND LEFTMOST LOWER RIGHT
|
||
JRXN CLX3
|
||
SUBXY A5,A13
|
||
JRUC CLX4
|
||
CLX3:
|
||
SUBXY A6,A13
|
||
CLX4:
|
||
SEXT A13,W
|
||
NEG A13
|
||
|
||
*CALCULATE YOFF0,YOFF1,YSCAN
|
||
*A3=TLX0,TLY0
|
||
*A4=TLX1,TLY1
|
||
*A5=LRX0,LRX1
|
||
*A6=LRX1,LRY1
|
||
*COMPUTE:
|
||
*A2=YOFF0
|
||
*A3=YOFF1
|
||
*A14=YSCAN
|
||
SRA 16,A3 ;BLOW AWAY X COORDS
|
||
SRA 16,A4
|
||
SRA 16,A5
|
||
SRA 16,A6
|
||
MOVE A3,A2
|
||
SUB A4,A2
|
||
JRNN CLY1
|
||
NEG A2
|
||
CLR A3 ;OBJECT 1 TO THE RIGHT
|
||
MOVE A4,A14 ;RIGHTMOST TOP LEFT
|
||
JRUC CLY2
|
||
CLY1: ;OBJECT 0 TO THE RIGHT
|
||
MOVE A3,A14
|
||
MOVE A2,A3
|
||
CLR A2
|
||
CLY2:
|
||
CMP A5,A6 ;FIND LEFTMOST LOWER RIGHT
|
||
JRN CLY3
|
||
SUB A5,A14
|
||
JRUC CLY4
|
||
CLY3:
|
||
SUB A6,A14
|
||
CLY4:
|
||
NEG A14
|
||
*
|
||
*A2=YOFF0
|
||
*A3=YOFF1
|
||
*A4=IMAGE SOURCE ADDRESS TEMP
|
||
*A5=WIDTH TEMP
|
||
*A7=IMAGE 1 DATA HEADER POINTER
|
||
*A8=IMAGE 1 OBJECT POINTER
|
||
*A9=IMAGE 0 DATA HEADER POINTER
|
||
*A10=IMAGE 0 OBJECT POINTER
|
||
*A11=XOFF0
|
||
*A12=XOFF1
|
||
*A13=XSCAN
|
||
*A14=YSCAN
|
||
*
|
||
*CALCULATE OBJECT 0 STARTAD, HINC0, VINC0
|
||
*
|
||
MOVE *A9(ISAG),A4,L ;GET IMAGE SOURCE ADDRESS
|
||
MOVE *A9(ISIZE),A5,W
|
||
ADDK 3,A5 ;CORRECT ERRONEOUS WIDTH (THANX, WARREN)
|
||
srl 2,A5
|
||
sll 2,A5
|
||
|
||
*CHECK OBJECT 0 FLIPS
|
||
*
|
||
BTST B_FLIPH,B0
|
||
JRNE CL0HF ;HORIZONTAL FLIP
|
||
BTST B_FLIPV,B0
|
||
JRNE CL0VF ;VERTICAL FLIP
|
||
*
|
||
*NO FLIP CASE
|
||
*A2=HINC0=8 (BYTE AT A TIME)
|
||
*A5=VINC0=W0-XSCAN
|
||
*A4=STARTAD0=IMAGEAD0+(YOFF0 X W0) + XOFF
|
||
*
|
||
MOVE A5,A1 ;GET WIDTH
|
||
MPYU A2,A1 ;MULT WIDTH X YOFF
|
||
ADD A11,A1 ;ADD IN X OFFSET
|
||
SLL 3,A1 ;CORRECT FOR BYTE ADDRESSING
|
||
ADD A1,A4 ;ADD TO SOURCE ADDRESS
|
||
MOVK 8,A2 ;HINC0
|
||
SUB A13,A5 ;VINC0=W0-XSCAN
|
||
SLL 3,A5 ;CORRECT FOR PIXEL ADDRESSING
|
||
JRUC CLOBJ1
|
||
*
|
||
*HORIZONTAL FLIP
|
||
*
|
||
*A2=HINC0=-8
|
||
*A5=VINC0=W0+XSCAN
|
||
*A4=STARTAD0=IMAGEAD0+(YOFF0 X W0) + W0-XOFF0-1
|
||
CL0HF BTST B_FLIPV,B0 ;VERT FLIP TOO?
|
||
JRNE CL0HVF ;HORIZ AND VERT FLIP
|
||
MOVE A5,A1 ;GET WIDTH
|
||
MPYU A2,A1 ;MULT WIDTH X Y OFFSET
|
||
ADD A5,A1 ;ADD IN WIDTH
|
||
SUB A11,A1 ;SUBTRACT X OFFSET
|
||
DEC A1 ;-1 MORE
|
||
SLL 3,A1 ;CORRECT FOR BYTE ADDRESSING
|
||
ADD A1,A4
|
||
MOVI -8,A2 ;HINC0
|
||
ADD A13,A5 ;VINC0=W0+XSCAN
|
||
SLL 3,A5 ;CORRECT FOR PIXEL ADDRESSING
|
||
JRUC CLOBJ1
|
||
*
|
||
*VERTICAL FLIP
|
||
*
|
||
*A2=HINC0=8
|
||
*A5=VINC0=-W0-XSCAN
|
||
*A4=STARTAD0=IMAGEAD0+(H0-YOFF0-1)W0+XOFF0
|
||
CL0VF: MOVE *A9(ISIZE+>10),A1 ;GET HEIGHT
|
||
SUB A2,A1 ;SUBTRACT YOFF0
|
||
DEC A1
|
||
MPYU A5,A1 ;MULTIPLY BY WIDTH
|
||
ADD A11,A1 ;ADD IN X OFFSET
|
||
SLL 3,A1 ;CORRECT FOR PIXEL ADDRESSING
|
||
ADD A1,A4 ;ADD TO SOURCE ADDRESS
|
||
NEG A5 ;-W0
|
||
SUB A13,A5 ;-XSCAN
|
||
SLL 3,A5 ;CORRECT FOR PIXEL ADDRESSING
|
||
MOVK 8,A2 ;HINC0
|
||
JRUC CLOBJ1
|
||
*
|
||
*VERTICAL AND HORIZONTAL FLIP
|
||
*
|
||
*A2=HINC0=-8
|
||
*A5=VINC0=-W0-XSCAN
|
||
*A4=STARTAD0=(H0-YOFF0-1)W0+W0-XOFF0-1
|
||
CL0HVF: MOVE *A9(ISIZE+>10),A1 ;GET HEIGHT
|
||
SUB A2,A1 ;SUBTRACT YOFF0
|
||
DEC A1
|
||
MPYU A5,A1 ;MULTIPLY BY WIDTH
|
||
ADD A5,A1 ;ADD IN WIDTH (W0)
|
||
SUB A11,A1 ;SUBTRACT XOFF0
|
||
DEC A1
|
||
SLL 3,A1 ;CORRECT FOR PIXEL ADDRESSING
|
||
ADD A1,A4 ;ADD TO SOURCE ADDRESS
|
||
NEG A5 ;-W0
|
||
ADD A13,A5 ;+XSCAN
|
||
SLL 3,A5 ;CORRECT FOR PIXEL ADDRESSING
|
||
MOVI -8,A2 ;HINC0
|
||
*
|
||
*CALCULATE OBJECT 1 STARTAD, HJUMP, VJUMP
|
||
*
|
||
*
|
||
*A2=HINC0
|
||
*A3=YOFF1, HINC1
|
||
*A4=STARTAD0
|
||
*A5=VINC0
|
||
*A6=STARTAD1
|
||
*A7=IMAGE 1 DATA HEADER POINTER
|
||
*A8=IMAGE 1 OBJECT POINTER
|
||
*A9=IMAGE 0 DATA HEADER POINTER
|
||
*A10=IMAGE 0 OBJECT POINTER
|
||
*A11=W1, VINC1
|
||
*A12=XOFF1
|
||
*A13=XSCAN
|
||
*A14=YSCAN
|
||
CLOBJ1:
|
||
MOVE *A7(ISAG),A6,L ;GET IMAGE SOURCE ADDRESS
|
||
MOVE *A7(ISIZE),A11
|
||
ADDK 3,A11 ;CORRECT ERRONEOUS WIDTH (THANX, WARREN)
|
||
srl 2,A11
|
||
sll 2,A11
|
||
*
|
||
*CHECK OBJECT 1 FLIPS
|
||
*
|
||
BTST B_FLIPH,B1
|
||
JRNE CL1HF ;HORIZONTAL FLIP
|
||
BTST B_FLIPV,B1
|
||
JRNE CL1VF ;VERTICAL FLIP
|
||
*
|
||
*NO FLIP CASE
|
||
*A3=HINC1=8 (BYTE AT A TIME)
|
||
*A11=VINC1=W1-XSCAN
|
||
*A6=STARTAD1=IMAGEAD1+(YOFF1 X W1) + XOFF1
|
||
*
|
||
MOVE A11,A1 ;GET WIDTH
|
||
MPYU A3,A1 ;MULT WIDTH X YOFF
|
||
ADD A12,A1 ;ADD IN X OFFSET
|
||
SLL 3,A1 ;CORRECT FOR BYTE ADDRESSING
|
||
ADD A1,A6 ;ADD TO SOURCE ADDRESS
|
||
MOVK 8,A3 ;HINC1
|
||
SUB A13,A11 ;VINC1=W1-XSCAN
|
||
SLL 3,A11 ;CORRECT FOR PIXEL ADDRESSING
|
||
JRUC CSH
|
||
*
|
||
*HORIZONTAL FLIP
|
||
*
|
||
*A3=HINC1=-8
|
||
*A11=VINC1=W1+XSCAN
|
||
*A6=STARTAD1=IMAGEAD1+(YOFF1 X W1) + W1-XOFF1-1
|
||
CL1HF BTST B_FLIPV,B1 ;VERT FLIP TOO?
|
||
JRNE CL1HVF ;HORIZ AND VERT FLIP
|
||
MOVE A11,A1 ;GET WIDTH
|
||
MPYU A3,A1 ;MULT WIDTH X Y OFFSET
|
||
ADD A11,A1 ;ADD IN WIDTH
|
||
SUB A12,A1 ;SUBTRACT X OFFSET
|
||
DEC A1 ;-1 MORE
|
||
SLL 3,A1 ;CORRECT FOR BYTE ADDRESSING
|
||
ADD A1,A6
|
||
MOVI -8,A3 ;HINC1
|
||
ADD A13,A11 ;VINC1=W1+XSCAN
|
||
SLL 3,A11 ;CORRECT FOR PIXEL ADDRESSING
|
||
JRUC CSH
|
||
*
|
||
*VERTICAL FLIP
|
||
*
|
||
*A3=HINC1=8
|
||
*A11=VINC1=-W1-XSCAN
|
||
*A6=STARTAD1=IMAGEAD1+(H1-YOFF1-1)W1+XOFF1
|
||
CL1VF: MOVE *A7(ISIZE+>10),A1 ;GET HEIGHT
|
||
SUB A3,A1 ;SUBTRACT YOFF1
|
||
DEC A1
|
||
MPYU A11,A1 ;MULTIPLY BY WIDTH
|
||
ADD A12,A1 ;ADD IN X OFFSET
|
||
SLL 3,A1 ;CORRECT FOR PIXEL ADDRESSING
|
||
ADD A1,A6 ;ADD TO SOURCE ADDRESS
|
||
NEG A11 ;-W1
|
||
SUB A13,A11 ;-XSCAN
|
||
SLL 3,A11 ;CORRECT FOR PIXEL ADDRESSING
|
||
MOVK 8,A3 ;HINC1
|
||
JRUC CSH
|
||
*
|
||
*VERTICAL AND HORIZONTAL FLIP
|
||
*
|
||
*A3=HINC1=-8
|
||
*A11=VINC1=-W1-XSCAN
|
||
*A6=STARTAD1=(H1-YOFF1-1)W1+W1-XOFF1-1
|
||
CL1HVF: MOVE *A7(ISIZE+>10),A1 ;GET HEIGHT
|
||
SUB A3,A1 ;SUBTRACT YOFF1
|
||
DEC A1
|
||
MPYU A11,A1 ;MULTIPLY BY WIDTH
|
||
ADD A11,A1 ;ADD IN WIDTH (W1)
|
||
SUB A12,A1 ;SUBTRACT XOFF1
|
||
DEC A1
|
||
SLL 3,A1 ;CORRECT FOR PIXEL ADDRESSING
|
||
ADD A1,A6 ;ADD TO SOURCE ADDRESS
|
||
NEG A11 ;-W1
|
||
ADD A13,A11 ;+XSCAN
|
||
SLL 3,A11 ;CORRECT FOR PIXEL ADDRESSING
|
||
MOVI -8,A3 ;HINC1
|
||
*
|
||
*SCAN COLLISION BOX AREA
|
||
*
|
||
*A0= TEMP DATA HOLDER
|
||
*A1= WIDTH COUNTER XSCAN
|
||
*A2=H INCREMENT IMAGE 0
|
||
*A3=H INCREMENT IMAGE 1
|
||
*A4=INDEX TO IMAGE 0
|
||
*A5=V INCREMENT IMAGE 0
|
||
*A6=INDEX TO IMAGE 1
|
||
*A7=IMAGE 1 DATA HEADER POINTER
|
||
*A8=IMAGE 1 OBJECT POINTER
|
||
*A9=IMAGE 0 DATA HEADER POINTER
|
||
*A10=IMAGE 0 OBJECT POINTER
|
||
*A11=V INCREMENT IMAGE 1
|
||
*A13=WIDTH COUNT XSCAN
|
||
*A14=HEIGHT COUNT YSCAN
|
||
*
|
||
CSH:
|
||
CMPI >80,A14 ;NO SCAN IF XSCAN, YSCAN VALUES OUT OF RANGE
|
||
JRHS CSFAIL
|
||
CMPI >80,A13
|
||
JRHS CSFAIL
|
||
PUSHST
|
||
DINT ;STOP DMA FUCK
|
||
MOVE @INTENB,A0,W
|
||
ANDNI X1E,A0
|
||
MOVE A0,@INTENB,W
|
||
POPST
|
||
CSH0:
|
||
MOVE @DMACTRL,A0,W ;DMA BUSY?
|
||
JRN CSH0 ;YES, WAIT
|
||
CSH1:
|
||
MOVE A13,A1 ;LOAD LINE COUNTDOWN HORIZ COUNTER
|
||
;CSHL: MOVB *A4,A0 ;CHECK IMAGE 0 CORRESPONDING NON ZEROES
|
||
; JREQ CSNXH
|
||
; MOVB *A6,A0 ;CHECK IMAGE 1
|
||
; JRNE CSHIT ;GOT A HIT
|
||
;CSNXH:
|
||
|
||
|
||
;FROM GEORGE 5/7/91
|
||
CSHL:
|
||
MOVB *A4,A0 ;CHECK IMAGE 0 CORRESPONDING NON ZEROES
|
||
.IF YUNIT
|
||
SLL 26,A0 ;MASK OFF TOP TWO BITS FROM PIXEL
|
||
.ELSE
|
||
MOVE A0,A0
|
||
.ENDIF
|
||
JREQ CSNXH
|
||
|
||
MOVB *A6,A0 ;CHECK IMAGE 1
|
||
.IF YUNIT
|
||
SLL 26,A0 ;MASK OFF TOP TWO BITS FROM PIXEL
|
||
.ELSE
|
||
MOVE A0,A0
|
||
.ENDIF
|
||
JRNE CSHIT ;GOT A HIT
|
||
CSNXH:
|
||
|
||
|
||
|
||
ADD A2,A4 ;ADD HORIZ INCREMENTS HINC0
|
||
ADD A3,A6 ;HINC1
|
||
DSJS A1,CSHL ;LOOP UNTIL HOR LINE DONE
|
||
|
||
ADD A5,A4 ;ADD VERT INCREMENTS
|
||
ADD A11,A6
|
||
DSJS A14,CSH1 ;LOOP UNTIL VERT DONE
|
||
CSFAIL:
|
||
MOVE B13,B13
|
||
JRZ CSFNODMA ;DON'T REACTIVATE DMA INTS
|
||
PUSHST
|
||
DINT
|
||
MOVE @INTENB,A0,W
|
||
ORI X1E,A0
|
||
MOVE A0,@INTENB,W
|
||
POPST
|
||
CSFNODMA
|
||
CLRC
|
||
JRUC CSHXXX
|
||
CSHIT:
|
||
MOVE B13,B13
|
||
JRZ CSFLAGS ;DON'T REACTIVATE DMA INTS
|
||
PUSHST
|
||
DINT
|
||
MOVE @INTENB,A0,W
|
||
ORI X1E,A0
|
||
MOVE A0,@INTENB,W
|
||
POPST
|
||
CSFLAGS
|
||
SETC
|
||
CSHXXX:
|
||
MMFM SP,B0,B1
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13
|
||
RETS
|
||
|
||
.END
|
||
|
||
|
||
|