trog/TROGCOL.ASM

755 lines
19 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.

.MLIB "TROGMACS.LIB"
.FILE 'TROGCOL.ASM'
.TITLE " <<< T R O G -- COLLISION SCAN ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "TROGAEQU.ASM" ;Dino and Enemy specifics
.DEF COLL_START
.REF PXBARS, FREEZE_TIME
.text
**************************************************************************
* *
* PRESCAN0 - SETS UP OBJECT 0 PARAMETERS FOR COLXY AND COLXYZ *
* A0 = PTR TO OBJECT 0 *
* RETURNS: *
* CARRY CLEAR = DON'T SCAN THIS OBJECT *
* A4 - A5 UNTOUCHED *
* CARRY SET = SCAN AWAY *
* A3 = [ULY,ULX] *
* A4 = [LRY,LRX] *
* A5 = INWARD Z *
* A6 = OUTWARD Z *
* NOTE: ALWAYS TRASHES A14 *
* *
**************************************************************************
PRESCAN0
MOVE *A0(OFLAGS),A14,W
BTST B_NOCOLL,A14 ;IS THIS DUDE COLLIDABLE?
JRNE PRESCANF ;BR = NO, DON'T WORRY ABOUT HIM
SLL 28,A14
JRZ PRESCANF ;HE'S NOT EVEN TURNED ON
MOVE *A0(ODMAXY),A3,L ;SET UP OBJECT 0 BOX ULX,ULY
JREQ PRESCANF ;DMA VALUES ARE YET UNINITIALIZED
MOVE *A0(OSIZE),A4,L ;GET HIS SIZE
ADDXY A3,A4 ;OBJECT 0 LRX,LRY
*Z STUFF
MOVE *A0(OZPOS),A5,W ;GET Z MIDPOINT
MOVE *A0(OZMINUS),A14,W ;GET Z SIZE IN NEGATIVE DIRECTION
MOVE A5,A6
SUB A14,A5 ;INWARD Z
MOVE *A0(OZPLUS),A14,W ;Z SIZE IN POSITIVE DIRECTION
ADD A14,A6 ;OUTWARD Z
SETC
RETS
PRESCANF
CLRC
RETS
**************************************************************************
* *
* COLLISION CHECK IN 2-SPACE(COLXY) OR 3-SPACE(COLXYZ) *
* A0 =POINTER TO OBJECT BLOCK OF OBJECT TO BE CHECKED(OBJECT 0) *
* A1 =POINTER TO SUPPLEMENTAL LIST TO SCAN AGAINST (OBJECT 1) *
* RETURN(S) *
* Z = NO COLLISIONS THIS SCAN *
* NZ = COLLISIONS WERE DETECTED *
* C = COLLISION SCAN WAS ABORTED *
* NC = LIST WAS COMPLETELY SCANNED *
* IF A COLLISION IS DETECTED, THE OBJECTS COLLISION ROUTINE IS CALLED. *
* NOTE: TRASHES A14 *
* *
**************************************************************************
*
*2-D ENTRY PROVIDING OBJECT 0 PARAMS
*
COLXYP
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A8,A9,A11
CLR A9
JRUC COLLPREG
*
*3-D ENTRY PROVIDING OBJECT 0 PARAMS
*
COLXYZP
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A8,A9,A11
MOVK 1,A9
JRUC COLLPREG
COLXYZ0:
MOVE *A0(OFLAGS),A14,W
BTST B_NOCOLL,A14 ;IS THIS DUDE COLLIDABLE?
JRNE COLLX ;BR = NO, DON'T WORRY ABOUT HIM
SLL 28,A14
JRZ COLLX ;HE'S NOT EVEN TURNED ON
MOVE *A0(ODMAXY),A3,L ;SET UP OBJECT 0 BOX ULX,ULY
JREQ COLLX ;DMA VALUES ARE YET UNINITIALIZED
MOVE *A0(OSIZE),A4,L ;GET HIS SIZE
ADDXY A3,A4 ;OBJECT 0 LRX,LRY
*Z STUFF
MOVE *A0(OZPOS),A5,W ;GET Z MIDPOINT
MOVE *A0(OZMINUS),A14,W ;GET Z SIZE IN NEGATIVE DIRECTION
MOVE A5,A6
SUB A14,A5 ;INWARD Z
MOVE *A0(OZPLUS),A14,W ;Z SIZE IN POSITIVE DIRECTION
ADD A14,A6 ;OUTWARD Z
COLLPREG
CLR A11 ;CLEAR A11
MOVE *A1,A8,L ;GET OBJECT LIST
JRZ COLLX ;LIST IS NULL
COLLP:
MOVE *A8(OFLAGS),A14,W
BTST B_NOCOLL,A14 ;IS THIS DUDE COLLIDABLE?
JRNE COLLNO ;BR = NO, DON'T WORRY ABOUT HIM
SLL 28,A14
JRZ COLLNO ;NOT TURNED ON
CMP A0,A8
JREQ COLLNO ;BR = SAME DAMN OBJECT DUDE
MOVE *A8(ODMAXY),A7,L ;GET OBJECT 1 ULY,ULX
JREQ COLLNO ;BR = DON'T MESS
CMPXY A4,A7 ;COMPARE 0:(LRX,LRY) TO 1:(ULX,ULY)
JRXGE COLLNO
JRYGE COLLNO
MOVE *A8(OSIZE),A14,L ;GET DISPLAYED SIZE
ADDXY A14,A7 ;OBJECT 1 LRX,LRY
CMPXY A3,A7 ;COMPARE 0:(ULX,ULY) TO 1:(LRX,LRY)
JRXLE COLLNO
JRYLE COLLNO
*CHECK FOR Z COLLISION
MOVE A9,A9
JREQ COLLYES ;THIS IS A 2D COLLISION
MOVE *A8(OZPOS),A7 ;GET Z MIDPOINT
MOVE *A8(OZMINUS),A14,W ;SIZE IN THE MINUS DIRECTION
SUB A14,A7 ;GET INWARD Z1
CMP A7,A6 ;COMPARE
JRLE COLLNO ;OUTWARD Z0 < INWARD Z1
ADD A14,A7 ;GET BACK TO "MIDPOINT"
MOVE *A8(OZPLUS),A14,W ;SIZE IN PLUS DIRECTION
ADD A14,A7
CMP A7,A5
JRLT COLLYES ;OUTWARD Z1 > INWARD Z0
COLLNO:
MOVE *A8(OSLINK),A8,L
JRNZ COLLP
COLLX:
CLRC
COLLXXX
MOVE A11,A11
MMFM SP,A0,A2,A3,A4,A5,A6,A7,A8,A9,A11
RETS
COLLX_SETC
SETC
JRUC COLLXXX
COLLYES:
**************************************************************************
* *
* COLLSION LIST STRUCTURE *
* ----------------------- *
* .WORD I.D.0,MASK0 *
* .LONG ROUTINE0 *
* . *
* . *
* . *
* .WORD I.D.n,MASKn *
* .LONG ROUTINEn *
* .WORD 0 *
* .LONG DEFAULT_ROUTINE *
* *
**************************************************************************
*
*COLLISION VECTOR IS CALLED WITH THESE PARAMETERS
*A0 = PTR TO OBJECT 0
*A1 = I.D. OF OBJECT THAT COLLIDED WITH YOU (0 = DEFAULT CASE)
*A8 = PTR TO OBJECT 1
*NOTE: IF ROUTINE CALLED RETURNS WITH THE Z SET THEN THE
* COLLISION SCAN WILL END AFTER THIS.
*
**** CALLR PIXSCAN ;CHECK PIXEL SCAN
**** JRNC COLLNO ;NO COLLISION ...
INC A11 ;RETURN A COLLISION
MMTM SP,A0,A1,A6,A10
MOVE *A8(OSLINK),A10,L ;GET THE NEXT OBJECT IN THE LIST NOW!
MOVE *A0(OCVECT),A6,L
MOVE *A8(OID),A1,W ;GET THE OBJECT I.D. TO MATCH
CALLR COLLCALL
JRZ COLLENDR ;THIS MEANS END SCAN AFTER THE NEXT VECTOR CALL
SWAP A0,A8
MOVE *A0(OCVECT),A6,L
MOVE *A8(OID),A1,W ;GET THE OBJECT I.D. TO MATCH
CALLR COLLCALL
JRZ COLLNDR1 ;END SCAN IF FLAGGED TO DO SO
MOVE A10,A8 ;NEXT OBJECT, IS IT ZERO?
MMFM SP,A0,A1,A6,A10
JRNZ COLLP ;NO, KEEP ON TRUCKIN'
JRUC COLLX
*
*CEASE SCAN AFTER THIS COLLISION VECTOR CALL
COLLENDR
SWAP A0,A8
MOVE *A0(OCVECT),A6,L
MOVE *A8(OID),A1,W ;GET THE OBJECT I.D. TO MATCH
CALLR COLLCALL
COLLNDR1
MMFM SP,A0,A1,A6,A10
JRUC COLLX_SETC
*
*COLLCALL - CALL THE CORRECT COLLISION ROUTINE
*A0 = PTR TO OBJECT 0
*A1 = I.D. TO SCAN FOR IN THE VECTOR LIST
*A6 = COLLISION VECTOR LIST
*A8 = PTR TO OBJECT 1
*NOTE: IF ROUTINE CALLED RETURNS WITH THE Z BIT SET THEN THE
* COLLISION SCAN WILL END AFTER THIS.
COLLCALL
MMTM SP,A2,A3,A4
COLLCLP
MOVE *A6+,A2,W ;GET THE FIRST MATCH I.D.
JREQ COLLDEF ;AHHH THE DEFAULT CASE
MOVE *A6+,A4,W ;GET THE I.D. MASK -- 0'S DON'T CARE
MOVE A1,A3
AND A4,A3 ;MASK THE I.D.
AND A4,A2 ;MASK THE MATCH
CMP A3,A2
JREQ COLLDEF
ADDK 32,A6 ;SKIP PAST COLLISION VECTOR
JRUC COLLCLP
COLLDEF
MOVE *A6,A6,L ;GET THE VECTOR
CALL A6 ;CALL THE ROUTINE
MMFM SP,A2,A3,A4
RETS
**************************************************************************
* *
* COLL_START - ROUTINE TO START THE COLLISION PROCESSES *
* *
**************************************************************************
COLL_START:
MMTM SP,A0,A1,A7
CREATE COLLDPID,CDDETECT
CREATE COLLEPID,CEDETECT
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* DINOSAUR COLLISION DETECT PROCESS *
* *
**************************************************************************
CDDETECT
SLEEP 1
MOVI DINOS,A0
MOVE *A0,A0,L
JREQ CDDETECT ;THERE ARE NO DINOS TO SPEAK OF
JRUC CDD2
CDD1 MOVE *A0(OSLINK),A0,L ;GRAB NEXT DINO OBJECT
JREQ CDDETECT ;END OF LIST
CDD2
CALLR PRESCAN0
JRNC CDD1 ;DON'T WORRY ABOUT THIS DUDE
ADDI [3,0],A4 ;ADD THIS MUCH TO SCAN WALLS
MOVI P1BARS,A1 ;FIRST, SCAN AGAINST ALL WALLS
CALLR COLXYP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI P2BARS,A1
CALLR COLXYP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI P3BARS,A1
CALLR COLXYP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI P4BARS,A1
CALLR COLXYP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI PXBARS,A1
CALLR COLXYP
JRC CDDETECT ;EXIT SCAN NOW!
SUBI [3,0],A4
MOVI DINOS,A1
CALLR COLXYZP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI TROGS,A1
CALLR COLXYZP
JRC CDDETECT ;EXIT SCAN NOW!
MOVI ENEMIES,A1
CALLR COLXYZP
JRC CDDETECT ;EXIT SCAN NOW!
JRUC CDD1 ;CONTINUE PROCESSING
**************************************************************************
* *
* ENEMY COLLISION DETECT PROCESS *
* *
**************************************************************************
CEDETECT
SLEEP 3
**** MOVE @FREEZE_TIME,A0,W
**** JRNZ CEDETECT
MOVI TROGS,A0
MOVE *A0,A0,L
JREQ CEDETECT ;THERE ARE NO ENEMIES TO SPEAK OF
JRUC CED2
CED1
MOVE *A0(OSLINK),A0,L ;GRAB NEXT ENEMY OBJECT
JREQ CEDETECT ;END OF LIST
CED2
MOVE *A0(OPLINK),A4,L ;CHECK ENEMIES PROCESS
JRZ CED3 ;BR = DOES NOT HAVE A CONTROL
MOVB *A4(TFREEZE),A4 ;IS IT FROZEN?
JRNZ CED1 ;BR = YES, DON'T SCAN
CED3
CALLR PRESCAN0
JRNC CED1 ;DON'T WORRY ABOUT THIS DUDE
ADDI [5,0],A4 ;ADD THIS MUCH TO SCAN WALLS
MOVI P1BARS,A1 ;FIRST, SCAN AGAINST ALL WALLS
CALLR COLXYP
MOVI P2BARS,A1
CALLR COLXYP
MOVI P3BARS,A1
CALLR COLXYP
MOVI P4BARS,A1
CALLR COLXYP
MOVI PXBARS,A1
CALLR COLXYP
SUBI [5,0],A4
MOVI TROGS,A1
CALLR COLXYZP
MOVI ENEMIES,A1
CALLR COLXYZP
JRUC CED1 ;CONTINUE PROCESSING
*PIXEL SCANNER COMMENTED OUT 3/22/90 BY GNP
.IF 0
ODMAIMG .SET OIMG
ODMAFLG .SET OFLAGS
*
*COLLISION ROUTINE
*A0=OBJECT ZERO
*A8=OBJECT ONE
*RETURNS: CS= COLLISION, CC= NO COLLISION
*NOTE: PIXEL SCAN ONLY OCCURS IFF BOTH OBJECTS HAVE THEIR PIXSCAN FLAG SET.
* THIS ROUTINE TRASHES A14
*
PIXSCAN:
MOVE *A0(OFLAGS),A14,W
BTST B_PIXSCAN,A14
JREQ NOPIXSCAN ;BR = NO SCAN FOR THIS MAN
MOVE *A8(OFLAGS),A14,W
BTST B_PIXSCAN,A14 ;CHECK TO SEE IF OBJECT 1 IS PIXABLE
JRNE PIXSCANG ;BR = BOTH OBJEX SAY "SCAN ME!"
NOPIXSCAN:
SETC
RETS
*CREATE TIME SLICE WHILE LOCKING OUT INTERRUPTS
PIXSCANG
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13
MMTM SP,B0,B1
PUSHST
DINT
MOVE *A0(ODMAIMG),A9,L ;GET IMAGE 0 POINTER
MOVE *A8(ODMAIMG),A7,L ;GET IMAGE 1 POINTER
MOVE *A0(ODMAXY),A3,L ;SET UP OBJECT BOX ULX,ULY
MOVE *A8(ODMAXY),A4,L
MOVE *A0(ODMAFLG),A6
MOVE A6,B0 ;FLAGS FOR OBJECT 0
MOVE *A8(ODMAFLG),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)
ANDI >FFFFFFFC,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)
ANDI >FFFFFFFC,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:
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
**** EINT
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
**** EINT
CSFLAGS
SETC
CSHXXX:
MMFM SP,B0,B1
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13
RETS
.ENDIF
.END