2865 lines
77 KiB
NASM
2865 lines
77 KiB
NASM
|
.MLIB "GXMACS.LIB"
|
|||
|
.FILE "GXUTIL.ASM"
|
|||
|
.TITLE " <<< GENERATION X ---- GENERAL PURPOSE SUBROUTINES >>>"
|
|||
|
.WIDTH 132
|
|||
|
.OPTION B,D,L
|
|||
|
.MNOLIST
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
|
|||
|
* ALL RIGHTS RESERVED. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
* GET THE SYSTEM STUFF
|
|||
|
.INCLUDE "GX.INC"
|
|||
|
.INCLUDE "GXUNZIP.INC"
|
|||
|
.INCLUDE "IMGTBL.GLO"
|
|||
|
|
|||
|
.EVEN
|
|||
|
.TEXT
|
|||
|
* SYMBOLS IN HERE
|
|||
|
.DEF PASTE_ON_DAMAGE_OFFSET, PASTE_ON_DAMAGE_OFFSET_XYZ
|
|||
|
.DEF FragCenterCoors, PreFrag_Box_Offset
|
|||
|
|
|||
|
***** from GXD.ASM
|
|||
|
.REF WORLD_GRNDOFF
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CLRPDATA - CLEAR THE PDATA AREA OF A PROCESS BLOCK *
|
|||
|
* A13 = PTR TO PROCESS BLOCK *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CLRPDATA
|
|||
|
MMTM SP,A1,A6,A14
|
|||
|
MOVE A13,A14
|
|||
|
CLR A1
|
|||
|
ADDI PDATA,A14
|
|||
|
MOVI (PSDATA-PDATA)/16,A6
|
|||
|
CLRSHL
|
|||
|
SRL 1,A6
|
|||
|
JRNC CLRPDL
|
|||
|
MOVE A1,*A14+,W ;STUFF THE ODD WORD
|
|||
|
CLRPDL
|
|||
|
MOVE A1,*A14+,L
|
|||
|
DSJS A6,CLRPDL
|
|||
|
MMFM SP,A1,A6,A14
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* MIDPOINT - RETURN THE MIDPOINT BETWEEN TWO POINTS *
|
|||
|
* A0 = [Y,X] POINT 0 *
|
|||
|
* A1 = [Y,X] POINT 1 *
|
|||
|
* RETURNS *
|
|||
|
* A0 = [Y,X] MIDPOINT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
MIDPOINT
|
|||
|
PUSH a1
|
|||
|
addxy a1,a0
|
|||
|
sra 1,a0
|
|||
|
movx a0,a1
|
|||
|
sll 17,a1
|
|||
|
sra 17,a1
|
|||
|
movx a1,a0
|
|||
|
PULLQ a1
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET BOTTOM Y OF AN OBJECT *
|
|||
|
* A8 = OBJECT BLOCK PTR *
|
|||
|
* RETURN(S) *
|
|||
|
* A1 = 32 BIT UNIV BOTTOM Y *
|
|||
|
* STATUS SET ACCORDING TO THE BOTTOM Y *
|
|||
|
*NOTE: MAKE SURE OBLOCK IS INIT'D BEFORE CALLING *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GETBOTY
|
|||
|
PUSH A2
|
|||
|
MOVE *A8(OYPOS),A1,W ;GET Y POSITION
|
|||
|
move *A8(OUSIZEY),A14,W
|
|||
|
move *a8(OUANIOFFY),a2,W
|
|||
|
sub a2,a14 ; pixels from anim pt to bottom
|
|||
|
sll 15,a14 ; from pixels to world
|
|||
|
add a14,a1 ; world Y of bottom
|
|||
|
PULLQ A2
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_TSUL - TRUE SOUNDS UV LIBERTY *
|
|||
|
* *
|
|||
|
* GET THE TOTAL SIZE AND MOST UPPER LEFT SCREEN COORDINATE OF AN *
|
|||
|
* OBJECT (HANDLES MULTIPART ALSO) IN UNIVERSE COORDINATES *
|
|||
|
* *
|
|||
|
* IN: *
|
|||
|
* *
|
|||
|
* A8 = OBJECT *
|
|||
|
* *
|
|||
|
* OUT: *
|
|||
|
* *
|
|||
|
* A0 = LEFT X *
|
|||
|
* A1 = UPPER Y *
|
|||
|
* A2 = X SIZE *
|
|||
|
* A3 = Y SIZE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
GET_TSUL
|
|||
|
MMTM SP,A4,A5,A6,A7,A8,A9,A10
|
|||
|
CALLA GET_HEAD_PART
|
|||
|
|
|||
|
MOVE *A8(OCTRL),A14,W
|
|||
|
MOVE *A8(OXVAL),A0,L
|
|||
|
MOVE *A8(OYVAL),A1,L
|
|||
|
MOVE *A8(OIMG),A3,L
|
|||
|
MOVE *A3(IANIOFF),A4,L
|
|||
|
MOVE A4,A5
|
|||
|
SEXT A4,W
|
|||
|
SLL 15,A4 ;CONVERT TO WORLD X
|
|||
|
SRA 16,A5
|
|||
|
SLL 15,A5 ;CONVERT TO WORLD Y
|
|||
|
|
|||
|
MOVE *A3(ISIZE),A2,L
|
|||
|
MOVE A2,A3
|
|||
|
SEXT A2,W
|
|||
|
SLL 15,A2 ;CONVERT TO WORLD X
|
|||
|
SRA 16,A3
|
|||
|
SLL 15,A3 ;CONVERT TO WORLD Y
|
|||
|
|
|||
|
BTST B_FLIPH,A14
|
|||
|
JRZ GTSUL_GOX ;BR=WE'RE NOT H-FLIPPED
|
|||
|
ADD A4,A0 ;DEFAULT LEFT X
|
|||
|
NEG A2
|
|||
|
ADD A0,A2 ;DEFAULT RIGHT X
|
|||
|
SWAP A0,A2 ;SWAP 'EM
|
|||
|
JRUC GTSUL_CHECK_HEADY
|
|||
|
GTSUL_GOX
|
|||
|
SUB A4,A0 ;DEFAULT LEFT X
|
|||
|
ADD A0,A2 ;DEFAULT RIGHT X
|
|||
|
GTSUL_CHECK_HEADY
|
|||
|
BTST B_FLIPV,A14
|
|||
|
JRZ GTSUL_GOY ;BR=WE'RE NOT V-FLIPPED
|
|||
|
ADD A5,A1 ;DEFAULT UPPER Y
|
|||
|
NEG A3
|
|||
|
ADD A1,A3 ;DEFAULT LOWER Y
|
|||
|
SWAP A1,A3 ;SWAP 'EM
|
|||
|
JRUC GTSUL_LUPE
|
|||
|
GTSUL_GOY
|
|||
|
SUB A5,A1 ;DEFAULT UPPER Y
|
|||
|
ADD A1,A3 ;DEFAULT LOWER Y
|
|||
|
GTSUL_LUPE
|
|||
|
MOVE *A8(OPARTS),A8,L
|
|||
|
JRZ GTSUL_DONE ;BR = NO MORE PARTS
|
|||
|
|
|||
|
MOVE *A8(OCTRL),A14,W
|
|||
|
MOVE *A8(OXVAL),A4,L
|
|||
|
MOVE *A8(OYVAL),A5,L
|
|||
|
MOVE *A8(OIMG),A10,L
|
|||
|
MOVE *A10(IANIOFF),A6,L
|
|||
|
MOVE A6,A7
|
|||
|
SEXT A6,W
|
|||
|
SLL 15,A6 ;CONVERT TO WORLD X
|
|||
|
SRA 16,A7
|
|||
|
SLL 15,A7 ;CONVERT TO WORLD Y
|
|||
|
|
|||
|
MOVE *A10(ISIZE),A9,L
|
|||
|
MOVE A9,A10
|
|||
|
SEXT A9,W
|
|||
|
SLL 15,A9 ;CONVERT TO WORLD X
|
|||
|
SRA 16,A10
|
|||
|
SLL 15,A10 ;CONVERT TO WORLD Y
|
|||
|
|
|||
|
BTST B_FLIPH,A14
|
|||
|
JRZ GTSUL_PART_GOX ;BR=WE'RE NOT H-FLIPPED
|
|||
|
ADD A6,A4 ;LEFT X
|
|||
|
NEG A9
|
|||
|
ADD A4,A9 ;RIGHT X
|
|||
|
SWAP A4,A9
|
|||
|
JRUC GTSUL_PART_CHECKY
|
|||
|
GTSUL_PART_GOX
|
|||
|
SUB A6,A4 ;LEFT X
|
|||
|
ADD A4,A9 ;RIGHT X
|
|||
|
GTSUL_PART_CHECKY
|
|||
|
BTST B_FLIPV,A14
|
|||
|
JRZ GTSUL_PART_GOY ;BR=WE'RE NOT V-FLIPPED
|
|||
|
ADD A7,A5 ;UPPER Y
|
|||
|
NEG A10
|
|||
|
ADD A5,A10 ;LOWER Y
|
|||
|
SWAP A5,A10
|
|||
|
JRUC GTSUL_PART_CHECK
|
|||
|
GTSUL_PART_GOY
|
|||
|
SUB A7,A5 ;UPPER Y
|
|||
|
ADD A5,A10 ;LOWER Y
|
|||
|
GTSUL_PART_CHECK
|
|||
|
CMP A0,A4
|
|||
|
JRGE GTSUL_NOULX ;BR = LEAVE LEFT X ALONE
|
|||
|
MOVE A4,A0
|
|||
|
GTSUL_NOULX
|
|||
|
CMP A1,A5
|
|||
|
JRGE GTSUL_NOULY ;BR = LEAVE UPPER Y ALONE
|
|||
|
MOVE A5,A1
|
|||
|
GTSUL_NOULY
|
|||
|
CMP A2,A9
|
|||
|
JRLE GTSUL_NOLRX ;BR = LEAVE RIGHT X ALONE
|
|||
|
MOVE A9,A2
|
|||
|
GTSUL_NOLRX
|
|||
|
CMP A3,A10
|
|||
|
JRLE GTSUL_LUPE ;BR = LEAVE LOWER Y ALONE
|
|||
|
MOVE A10,A3
|
|||
|
JRUC GTSUL_LUPE
|
|||
|
GTSUL_DONE
|
|||
|
SUB A0,A2 ;COMPUTE X SIZE
|
|||
|
SUB A1,A3 ;COMPUTE Y SIZE
|
|||
|
MMFM SP,A4,A5,A6,A7,A8,A9,A10
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_CPNTU - RETURNS THE CENTER XY UNIVERSE POSITION OF A GIVEN IMAGE *
|
|||
|
* NOTE: ANIMATION POINT MUST BE IN THE CENTER OF THE OBJECT *
|
|||
|
* *
|
|||
|
* PASS: *
|
|||
|
* A8 = IMAGE OBLOCK *
|
|||
|
* RETURN(S) *
|
|||
|
* A2 = CENTER X *
|
|||
|
* A1 = CENTER Y *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_CPNTU
|
|||
|
MMTM SP,A0,A3
|
|||
|
CALLR GET_TSUL
|
|||
|
CALLR GETCENTU
|
|||
|
MMFM SP,A0,A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GETCPNTU - RETURNS THE CENTER XY UNIVERSE POSITION OF A GIVEN IMAGE *
|
|||
|
* A0 VERSION. *
|
|||
|
* A0 = IMAGE OBLOCK *
|
|||
|
* RETURN(S) *
|
|||
|
* A2 = CENTER X *
|
|||
|
* A1 = CENTER Y *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GETCPNTU
|
|||
|
PUSH A8
|
|||
|
MOVE A0,A8
|
|||
|
CALLR GET_CPNTU
|
|||
|
PULLQ A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_TSUL_SCRN - TRUE SOUNDS UV LIBERTY *
|
|||
|
* *
|
|||
|
* GET THE TOTAL SIZE AND MOST UPPER LEFT SCREEN COORDINATE OF AN *
|
|||
|
* OBJECT (HANDLES MULTIPART ALSO) IN SCREEN COORDINATES *
|
|||
|
* *
|
|||
|
* IN: *
|
|||
|
* *
|
|||
|
* A8 = OBJECT *
|
|||
|
* *
|
|||
|
* OUT: *
|
|||
|
* *
|
|||
|
* A0 = UPPER LEFT [Y, X] *
|
|||
|
* A1 = TOTAL SIZE [Y, X] *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
GET_TSUL_SCRN
|
|||
|
MMTM SP,A2,A8
|
|||
|
CALLA GET_HEAD_PART
|
|||
|
MOVE *A8(ODAG),A0,L ;ALWAYS THE UPPER LEFT
|
|||
|
MOVE *A8(OSIZE),A2,L
|
|||
|
MOVE A2,A1
|
|||
|
ADDXY A0,A1
|
|||
|
GTSULS_LUPE
|
|||
|
MOVE *A8(OPARTS),A8,L
|
|||
|
JRZ GTSULS_DONE ;BR = NO MORE PARTS
|
|||
|
MOVE *A8(ODAG),A14,L
|
|||
|
CMPI 02000200H,A14
|
|||
|
JREQ GTSULS_LUPE ;BR = OBJECT JUST CREATED
|
|||
|
CMPXY A0,A14
|
|||
|
JRXGE GTSULS_NOULX ;BR = LEAVE LEFT X ALONE
|
|||
|
MOVX A14,A0
|
|||
|
GTSULS_NOULX
|
|||
|
JRYGE GTSULS_NOULY ;BR = LEAVE UPPER Y ALONE
|
|||
|
MOVY A14,A0
|
|||
|
GTSULS_NOULY
|
|||
|
MOVE *A8(OSIZE),A2,L
|
|||
|
ADDXY A2,A14
|
|||
|
CMPXY A1,A14
|
|||
|
JRXLE GTSULS_NOLRX ;BR = LEAVE RIGHT X ALONE
|
|||
|
MOVX A14,A1
|
|||
|
GTSULS_NOLRX
|
|||
|
JRYLE GTSULS_LUPE ;BR = LEAVE LOWER Y ALONE
|
|||
|
MOVY A14,A1
|
|||
|
JRUC GTSULS_LUPE
|
|||
|
GTSULS_DONE
|
|||
|
SUBXY A0,A1
|
|||
|
MMFM SP,A2,A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_CPNT_SCRNREL - RETURNS THE SCREEN RELATIVE CENTER XY POSITION *
|
|||
|
* OF A GIVEN IMAGE. *
|
|||
|
* A8 = IMAGE OBLOCK *
|
|||
|
* RETURN(S) *
|
|||
|
* A3 = SCREEN RELATIVE CENTER Y:CENTER X *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_CPNT
|
|||
|
PUSH A3
|
|||
|
CALLR GET_CPNT_SCRNREL
|
|||
|
MOVE A1,A3
|
|||
|
PULL A3
|
|||
|
RETS
|
|||
|
|
|||
|
GET_CPNT_SCRNREL
|
|||
|
PUSH A0
|
|||
|
CALLR GET_TSUL_SCRN
|
|||
|
CALLR GETCENT
|
|||
|
MOVE A1,A3
|
|||
|
SLL 16,A0
|
|||
|
MOVY A0,A3
|
|||
|
PULLQ A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GETCPNT - RETURNS THE CENTER XY POSITION OF A GIVEN IMAGE *
|
|||
|
* A0 VERSION. *
|
|||
|
* A0 = IMAGE OBLOCK *
|
|||
|
* RETURN(S) *
|
|||
|
* A1 = CENTER Y:CENTER X *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GETCPNT
|
|||
|
PUSH A8
|
|||
|
MOVE A0,A8
|
|||
|
CALLR GET_CPNT
|
|||
|
PULLQ A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_BOTTOM_MID - GET THE MID POINT OF THE BOTTOM LINE OF AN IMAGE *
|
|||
|
* A8 = PTR TO IMAGE *
|
|||
|
* RETURNS: *
|
|||
|
* A1 = [Y,X] BOTTOM LINE MIDPOINT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_BOTTOM_MID:
|
|||
|
PUSH A0
|
|||
|
CALLR GETBOTY
|
|||
|
MOVE A1,A0
|
|||
|
CALLR GET_CPNT
|
|||
|
SLL 16,A0
|
|||
|
MOVY A0,A1 ;GET THE BOTTOM MIDPOINT
|
|||
|
PULL A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_INIT_CPNT - GET THE CENTER POINT OF AN OBJECT STORED WITHIN AN *
|
|||
|
* INITIALIZATION TABLE WITH RESPECT TO ITS CURRENT ANIMATION *
|
|||
|
* POINT. *
|
|||
|
* A8 = PTR TO OBJECT *
|
|||
|
* RETURNS: *
|
|||
|
* A1 = [Y,X] CENTER POINT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_INIT_CPNT:
|
|||
|
MMTM SP,A0,A2,A3,A5,A6
|
|||
|
CALLA GETANIXY ;OBJECT ANI PNT, A2=Y A3=X
|
|||
|
SRL 16,A3
|
|||
|
MOVX A3,A2 ;PACK [Y,X] INTO A2
|
|||
|
MOVE *A4(NEWIIMG),A5,L ;AND NOW THE IMAGE PTR
|
|||
|
MOVE *A5(IANIOFF),A6,L
|
|||
|
SUBXY A6,A2 ;FIND CORRECT UPPER LEFT CORNER
|
|||
|
MOVE A2,A0
|
|||
|
MOVE *A5(ISIZE),A1,L
|
|||
|
CALLA GETCENT ;GET THE CENTER PNT OF THIS BOX
|
|||
|
SLL 16,A0
|
|||
|
MOVY A0,A1 ;PACK IT UP IN A1
|
|||
|
MMFM SP,A0,A2,A3,A5,A6
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* GETCENTU - RETURNS THE CENTER POINT (UNIVERSE) OF A BOX *
|
|||
|
* *
|
|||
|
* PASS: *
|
|||
|
* A0 = LEFT X *
|
|||
|
* A1 = UPPER Y *
|
|||
|
* A2 = X SIZE *
|
|||
|
* A3 = Y SIZE *
|
|||
|
* *
|
|||
|
* RETURNS: *
|
|||
|
* A2 = CENTER X *
|
|||
|
* A1 = CENTER Y *
|
|||
|
* *
|
|||
|
* DESTROYS: *
|
|||
|
* A3 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GETCENTU
|
|||
|
SRL 1,A2
|
|||
|
ADD A0,A2
|
|||
|
SRL 1,A3
|
|||
|
ADD A3,A1
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GETCENT - RETURNS THE CENTER POINT OF A BOX *
|
|||
|
* A0 = UPPER LEFT Y:UPPER LEFT X *
|
|||
|
* A1 = Y_SIZE:X_SIZE *
|
|||
|
* RETURN(S) *
|
|||
|
* A0 = CENTER Y(LSW) *
|
|||
|
* A1 = CENTER X(LSW) *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GETCENT
|
|||
|
MOVE A2,-*SP,L
|
|||
|
MOVY A1,A2
|
|||
|
SRL 17,A2 ;YSIZE/2
|
|||
|
SLL 16,A2 ;BACK TO Y HALF
|
|||
|
SLL 16,A1 ;CLEAR Y
|
|||
|
SRL 17,A1 ;XSIZE/2
|
|||
|
MOVY A2,A1
|
|||
|
ADDXY A1,A0 ;OFFSET TO CENTER
|
|||
|
CLR A1
|
|||
|
MOVX A0,A1 ;RETURN THESE IN USEFUL POSITIONS
|
|||
|
SRL 16,A0
|
|||
|
MOVE *SP+,A2,L
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL_LOAD - USE SLINEVEL TO GET VELOCITIES FOR AN OBJECT AND *
|
|||
|
* LOAD THEM INTO THAT OBJECT. *
|
|||
|
* SAME AS SLINEVEL INPUTS AND *
|
|||
|
* A8 = PTR OBJECT *
|
|||
|
* RETURNS *
|
|||
|
* NOTHING *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL_LOAD
|
|||
|
MMTM SP,A1,A2
|
|||
|
CALLR SLINEVEL
|
|||
|
MOVE A1,*A8(OXVEL),L
|
|||
|
MOVE A2,*A8(OYVEL),L
|
|||
|
MMFM SP,A1,A2
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL - GET THE X & Y VELOCITIES TO MAKE AN OBJECT TRAVEL *
|
|||
|
* FROM PNT. A TO PNT. B ALONG THE SHORTEST PATH. *
|
|||
|
* A2 = PNT. A [Y,X] POSITION *
|
|||
|
* A3 = PNT. B [Y,X] POSITION *
|
|||
|
* A4 = DURATION(# OF TICKS TO GET FROM A TO B) *
|
|||
|
* RETURNS: *
|
|||
|
* A1 = X VEL (32 BITS) *
|
|||
|
* A2 = Y VEL (32 BITS) *
|
|||
|
* NOTE: DON'T CALL WITH THE A=B, IT'S A WAIST OF TIME AND UNDEFINED. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL
|
|||
|
PUSH A3
|
|||
|
SUBXY A2,A3 ;GET THE DIFFERENCE
|
|||
|
MOVX A3,A1 ;A1 = X DISTANCE
|
|||
|
SRL 16,A3
|
|||
|
SLL 16,A3 ;CLEAR OUT THE X PART
|
|||
|
DIVS A4,A3 ;A3 = Y VELOCITY(32 BITS)
|
|||
|
SLL 16,A1
|
|||
|
DIVS A4,A1 ;A1 = X VELOCITY(32 BITS)
|
|||
|
MOVE A3,A2 ;RETURN Y VEL HERE FOR CONSISTENCY
|
|||
|
PULLQ A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL_LOAD_2D - USE SLINEVEL TO GET VELOCITIES FOR AN OBJECT AND *
|
|||
|
* LOAD THEM INTO THAT OBJECT. *
|
|||
|
* SAME AS SLINEVEL_2D INPUTS *
|
|||
|
* A8 = PTR OBJECT *
|
|||
|
* RETURNS *
|
|||
|
* NOTHING *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL_LOAD_2D
|
|||
|
MMTM SP,A1,A3
|
|||
|
CALLR SLINEVEL_2D
|
|||
|
MOVE @XSCROLL,A14,L
|
|||
|
ADD A14,A1 ;COMPENSATE FOR XSCROLL
|
|||
|
MOVE A1,*A8(OXVEL),L
|
|||
|
MOVE @YSCROLL,A14,L
|
|||
|
SUB A14,A3 ; YSCROLL
|
|||
|
MOVE A3,*A8(OYVEL),L
|
|||
|
MMFM SP,A1,A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL_2D - GET THE X & Y VELOCITIES TO MAKE AN OBJECT TRAVEL *
|
|||
|
* FROM PNT. A TO PNT. B ALONG THE SHORTEST PATH. *
|
|||
|
* A1 = PNT. B X POSITION (32 BITS) *
|
|||
|
* A2 = PNT. A X POSITION (32 BITS) *
|
|||
|
* A3 = PNT. B Y POSITION (32 BITS) *
|
|||
|
* A4 = PNT. A Y POSITION (32 BITS) *
|
|||
|
* A5 = DURATION(# OF TICKS TO GET FROM A TO B) *
|
|||
|
* RETURNS: *
|
|||
|
* A1 = X VEL (32 BITS) *
|
|||
|
* A3 = Y VEL (32 BITS) *
|
|||
|
* NOTE: DON'T CALL WITH THE A=B, IT'S A WAIST OF TIME AND UNDEFINED. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL_2D
|
|||
|
SUB A2,A1 ;GET THE DIFFERENCES
|
|||
|
SUB A4,A3
|
|||
|
DIVS A5,A1 ;A1 = X VELOCITY (32 BITS)
|
|||
|
DIVS A5,A3 ;A3 = Y VELOCITY (32 BITS)
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL_LOAD_3D - USE SLINEVEL_3D TO GET VELOCITIES FOR AN OBJECT AND *
|
|||
|
* LOAD THEM INTO THAT OBJECT. *
|
|||
|
* SAME AS SLINEVEL_3D INPUTS AND *
|
|||
|
* A8 = PTR OBJECT *
|
|||
|
* RETURNS *
|
|||
|
* NOTHING *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL_LOAD_3D
|
|||
|
MMTM SP,A1,A2,A3,A4,A5,A6
|
|||
|
CALLR SLINEVEL_3D
|
|||
|
; MOVI XSCROLL,A14
|
|||
|
; MMFM A14,A2,A4,A6
|
|||
|
; sra ZFRAC,a2 ; compensate for new fraction
|
|||
|
; ADD A6,A1 ;COMPENSATE FOR XSCROLL
|
|||
|
; SUB A4,A3 ; YSCROLL
|
|||
|
; ADD A2,A5 ; ZSCROLL
|
|||
|
MOVE A1,*A8(OXVEL),L
|
|||
|
MOVE A3,*A8(OYVEL),L
|
|||
|
MOVE A5,*A8(OZVEL),L
|
|||
|
MMFM SP,A1,A2,A3,A4,A5,A6
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SLINEVEL_3D - GET THE X & Y & Z VELOCITIES TO MAKE AN OBJECT TRAVEL *
|
|||
|
* FROM PNT. A TO PNT. B ALONG THE SHORTEST PATH. *
|
|||
|
* A1 = PNT. B X POSITION (32 BITS) *
|
|||
|
* A2 = PNT. A X POSITION (32 BITS) *
|
|||
|
* A3 = PNT. B Y POSITION (32 BITS) *
|
|||
|
* A4 = PNT. A Y POSITION (32 BITS) *
|
|||
|
* A5 = PNT. B Z POSITION (32 BITS) *
|
|||
|
* A6 = PNT. A Z POSITION (32 BITS) *
|
|||
|
* A7 = DURATION(# OF TICKS TO GET FROM A TO B) *
|
|||
|
* RETURNS: *
|
|||
|
* A1 = X VEL (32 BITS) *
|
|||
|
* A3 = Y VEL (32 BITS) *
|
|||
|
* A5 = Z VEL (32 BITS) *
|
|||
|
* NOTE: DON'T CALL WITH THE A=B, IT'S A WAIST OF TIME AND UNDEFINED. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SLINEVEL_3D
|
|||
|
SUB A2,A1 ;GET THE DIFFERENCES
|
|||
|
SUB A4,A3
|
|||
|
SUB A6,A5
|
|||
|
DIVS A7,A1 ;A1 = X VELOCITY (32 BITS)
|
|||
|
DIVS A7,A3 ;A3 = Y VELOCITY (32 BITS)
|
|||
|
DIVS A7,A5 ;A5 = Z VELOCITY (32 BITS)
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* X_ETA - ROUTINE TO FIGURE THE NUMBER OF TICKS IT WILL TAKE TO COVER *
|
|||
|
* THE X DISTANCE FROM PNT. A TO PNT B. *
|
|||
|
* THE RESULTING VELOCITY IS SIGNED: *
|
|||
|
* POSITIVE IF PNT. A < PNT. B *
|
|||
|
* NEGATIVE IF PNT. A > PNT. B *
|
|||
|
* A1 = ABSOLUTE X VEL (32 BITS) *
|
|||
|
* A2 = PNT. A [Y,X] POSITION *
|
|||
|
* A3 = PNT. B [Y,X] POSITION *
|
|||
|
* RETURNS: *
|
|||
|
* Z = TIME IN TICKS IS LESS THAN ONE *
|
|||
|
* A1 = UNCHANGED *
|
|||
|
* A4 = 0 *
|
|||
|
* NZ = IT WILL TAKE 1 OR MORE TICKS *
|
|||
|
* A1 = VELOCITY OF CORRECT SIGN *
|
|||
|
* A4 = DURATION IN TICKS *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
X_ETA
|
|||
|
PUSH A3
|
|||
|
SUBXY A2,A3 ;GET THE DIFFERENCE
|
|||
|
SLL 16,A3
|
|||
|
DIVS A1,A3 ;A3 = WE NOW HAVE A TIME
|
|||
|
JRNN XETA_NN ;BR = NUMBER IS OK
|
|||
|
NEG A3 ;NEGATE THE TICKS FOR REAL
|
|||
|
NEG A1 ;NEGATE THE VELOCITY
|
|||
|
XETA_NN
|
|||
|
MOVE A3,A4 ;RETURN CORRECTLY
|
|||
|
PULL A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CK_OBJ_CENT - DETERMINE IF CENTER POINTS OF TWO OBJECTS ARE CLOSE. *
|
|||
|
* A0 = ONE OBJECT *
|
|||
|
* A8 = THE OTHER OBJECT *
|
|||
|
* RETURNS: *
|
|||
|
* NC = NOT EVEN CLOSE *
|
|||
|
* C = CLOSE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CK_OBJ_CENT:
|
|||
|
MMTM SP,A1,A2,A3,A8
|
|||
|
CALLR GET_CPNT ;CENTER POINT OF FIRST OBJECT
|
|||
|
MOVE A1,A3
|
|||
|
MOVE A0,A8
|
|||
|
CALLR GET_CPNT ;AND CENTER POINT OF THE SECOND
|
|||
|
MOVI [8,8],A2 ;FIX THE RANGE
|
|||
|
CALLR PNT_IN_RANGE
|
|||
|
MMFM SP,A1,A2,A3,A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CK_BOTTOM_CENT - DETERMINE IF BOTTOM MID POINT OF ONE OBJECT IS *
|
|||
|
* CLOSE TO THE CENTER OF ANOTHER OBJECT. *
|
|||
|
* A0 = ONE OBJECT *
|
|||
|
* A8 = THE OTHER OBJECT *
|
|||
|
* RETURNS: *
|
|||
|
* NC = NOT EVEN CLOSE *
|
|||
|
* C = CLOSE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CK_BOTTOM_CENT:
|
|||
|
MMTM SP,A0,A1,A2,A3,A8
|
|||
|
CALLR GET_CPNT ;GET THE CENTER POINT
|
|||
|
MOVE A1,A3
|
|||
|
MOVE A0,A8
|
|||
|
CALLR GETBOTY
|
|||
|
MOVE A1,A0
|
|||
|
CALLR GET_CPNT
|
|||
|
SLL 16,A0
|
|||
|
MOVY A0,A1 ;GET THE BOTTOM MIDPOINT
|
|||
|
MOVI [6,6],A2 ;FIX THE RANGE
|
|||
|
CALLR PNT_IN_RANGE
|
|||
|
MMFM SP,A0,A1,A2,A3,A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PNT_IN_RANGE - SEE IF ONE POINT IS IN A GIVEN [Y,X] RANGE OF ANOTHER *
|
|||
|
* POINT. *
|
|||
|
* A1 = [Y,X] POINT TO CHECK *
|
|||
|
* A2 = [Y RANGE,X RANGE] *
|
|||
|
* A3 = [Y,X] CENTER POINT OF RANGE *
|
|||
|
* RETURNS: *
|
|||
|
* NC = NOT IN RANGE *
|
|||
|
* C = IN RANGE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PNT_IN_RANGE:
|
|||
|
MMTM SP,A2,A3
|
|||
|
CALLR MAKEBOX ;MAKE A RANGE AREA
|
|||
|
CALLR PNTINBOX
|
|||
|
MMFM SP,A2,A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* MAKEBOX - GIVEN THE CENTER POINT OF A BOX AND HALF THE LENGTH AND *
|
|||
|
* WIDTH THIS FUNCTION WILL RETURN THE UL AND LR OF A BOX *
|
|||
|
* A2 = [HALF HEIGHT,HALF WIDTH] *
|
|||
|
* A3 = CENTER POINT OF BOX *
|
|||
|
* RETURNS: *
|
|||
|
* A2 = UPPER LEFT [Y,X] OF BOX *
|
|||
|
* A3 = LOWER RIGHT [Y,X] OF BOX *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
MAKEBOX:
|
|||
|
PUSH A1
|
|||
|
MOVE A3,A1
|
|||
|
ADDXY A2,A3 ;MAKE LOWER RIGHT
|
|||
|
SWAP A1,A2
|
|||
|
SUBXY A1,A2 ;MAKE UPPER LEFT
|
|||
|
PULL A1
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PNTINBOX - SEE IF THE GIVEN POINT IS CONTAINED WITHIN OR ON THE *
|
|||
|
* THE EDGE OF A GIVEN BOX. *
|
|||
|
* A1 = [Y,X] POINT *
|
|||
|
* A2 = UPPER LEFT [Y,X] OF BOX *
|
|||
|
* A3 = LOWER RIGHT [Y,X] OF BOX *
|
|||
|
* RETURNS: *
|
|||
|
* NC = NOT CONTAINED *
|
|||
|
* C = CONTAINED *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PNTINBOX:
|
|||
|
CMPXY A2,A1
|
|||
|
JRXLT PNTNOTINBOX
|
|||
|
JRYLT PNTNOTINBOX
|
|||
|
CMPXY A3,A1
|
|||
|
JRXGT PNTNOTINBOX
|
|||
|
JRYGT PNTNOTINBOX
|
|||
|
SETC
|
|||
|
RETS
|
|||
|
PNTNOTINBOX:
|
|||
|
CLRC
|
|||
|
RETS
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CHKRANGE - CHECK TO SEE IF AN UNSIGNED 32 BIT VALUE IS IN A *
|
|||
|
* GIVEN RANGE (INCLUSIVE) *
|
|||
|
* A1 = # *
|
|||
|
* A2 = LOWER BOUND *
|
|||
|
* A3 = UPPER BOUND *
|
|||
|
* RETURN(S) *
|
|||
|
* CARRY CLEAR (JxNC) = OUT OF RANGE *
|
|||
|
* CARRY SET (JxC) = IN RANGE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CHKRANGE
|
|||
|
CMP A2,A1 ;CHECK LOWER BOUND
|
|||
|
JRLO OUTOFRNG ;BR = # TOO LOW
|
|||
|
CMP A3,A1
|
|||
|
JRHI OUTOFRNG ;BR = # TOO HIGH
|
|||
|
|
|||
|
SETC ;# IN RANGE, YEAH!
|
|||
|
RETS
|
|||
|
OUTOFRNG
|
|||
|
CLRC
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* ALIGNOBJ - ALIGN OBJECT FROM PTA. TO PTB. *
|
|||
|
* A0 = POINT B [Y,X] *
|
|||
|
* A1 = POINT A [Y,X] *
|
|||
|
* A8 = PTR TO OBJECT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
ALIGNOBJ
|
|||
|
MMTM SP,A0,A1,A2
|
|||
|
SUBXY A1,A0
|
|||
|
MOVY A0,A1
|
|||
|
SRA 16,A1 ;ISOLATE THE Y COMPONENT
|
|||
|
SEXT A0 ;AND THE X
|
|||
|
MOVE *A8(OXPOS),A2,W
|
|||
|
ADD A0,A2
|
|||
|
SLL 16,A2 ;ZERO ALL FRACTIONALS
|
|||
|
MOVE A2,*A8(OXVAL),L
|
|||
|
MOVE *A8(OYPOS),A2,W
|
|||
|
ADD A1,A2
|
|||
|
SLL 16,A2 ;ZERO ALL FRACTIONALS
|
|||
|
MOVE A2,*A8(OYVAL),L
|
|||
|
MMFM SP,A0,A1,A2
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CENTEROBJ - CENTER AN OBJECT ON A POINT. *
|
|||
|
* A0 = POINT TO CENTER UPON *
|
|||
|
* A8 = OBJECT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CENTEROBJ:
|
|||
|
PUSH A1
|
|||
|
CALLR GET_CPNT
|
|||
|
CALLR ALIGNOBJ
|
|||
|
PULL A1
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* MYOINIT - INITIALIZE SUPPLEMENTAL OBJECT LIST HEADERS *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
MYOINIT
|
|||
|
MMTM SP,A0,A1,A2,A3,A4,A5
|
|||
|
|
|||
|
PUSHST
|
|||
|
|
|||
|
CALLA CLRPAL
|
|||
|
|
|||
|
MOVI T2FIXED,A0
|
|||
|
CALLA GETFPAL ;GET THE FIXED FOREGROUND PALETTE
|
|||
|
|
|||
|
MOVI REDPLAYR,A0
|
|||
|
CALLA GETFPAL ;FIX THE PLAYER 1 PALETTE
|
|||
|
|
|||
|
MOVI YELPLAYR,A0
|
|||
|
CALLA GETFPAL ;FIX THE PLAYER 2 PALETTE
|
|||
|
|
|||
|
MOVI BLUPLAYR,A0
|
|||
|
CALLA GETFPAL ;FIX THE PLAYER 3 PALETTE
|
|||
|
|
|||
|
MOVI TEXTPAL,A0 ;FIX THE TEXT PALETTE
|
|||
|
CALLA GETFPAL ;IF YOU CHANGE THIS, CHANGE TEXT_PAL
|
|||
|
DINT
|
|||
|
MOVE @INTENB,A0,W
|
|||
|
ANDNI X1E,A0 ;NO MORE DMA INTERRUPTS
|
|||
|
MOVE A0,@INTENB,W
|
|||
|
POPST
|
|||
|
CLR A0
|
|||
|
MOVE A0,@GAMERASE
|
|||
|
CALLR DMAWAIT ;WAIT ON DMA
|
|||
|
MOVI GXBOOM,A0 ;Fix the Smart Bomb effect palette
|
|||
|
CALLA GET_UNZIP_PAL
|
|||
|
CALLA IAUTOE
|
|||
|
|
|||
|
*INITIALIZE SUPPLEMENTAL LIST HEADERS
|
|||
|
MOVI SUPPLSTS,A1 ;GET THE SUPPLEMENTAL LIST AREA
|
|||
|
CLR A0
|
|||
|
MYOINITS:
|
|||
|
MOVE A0,*A1+,L
|
|||
|
CMPI SUPPLSTSX,A1
|
|||
|
JRLO MYOINITS
|
|||
|
|
|||
|
MMFM SP,A0,A1,A2,A3,A4,A5
|
|||
|
JAUC OINIT
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* RANDOM - GENERATE A RANDOM NUMBER *
|
|||
|
* RETURNS: *
|
|||
|
* A0 = 32 BIT RANDOM # *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
RANDOM:
|
|||
|
; PUSH A1
|
|||
|
MOVE @RAND,A0,L
|
|||
|
SLA 1,A0
|
|||
|
JRV RND2
|
|||
|
ORI 2,A0
|
|||
|
RND2: MOVE A0,@RAND,L
|
|||
|
CLR A14
|
|||
|
ADDC A14,A0 ;GET LAST BIT BACK TO MAKE 32
|
|||
|
MOVE @HCOUNT,A14,W
|
|||
|
RL A14,A0 ;RANDOM ROTATION
|
|||
|
MOVE A0,A0 ;SET STATUS BITS
|
|||
|
; MMFM SP,A1
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* RANDU - GENERATE A UNIFORMLY DISTRIBUTED RANDOM # BETWEEN 1 AND [A0] *
|
|||
|
* A0 = RANGE INPUT *
|
|||
|
* RETURNS: *
|
|||
|
* A0 = RANDOM # *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
RANDU: PUSH A1
|
|||
|
MOVE A0,A1
|
|||
|
CALLR RANDOM
|
|||
|
MPYU A1,A0
|
|||
|
INC A0
|
|||
|
MMFM SP,A1
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* RAND0 *
|
|||
|
* *
|
|||
|
* Generate a uniformly distributed random # between 0 and *
|
|||
|
* [A0 - 1]. *
|
|||
|
* *
|
|||
|
* A0 = Distribution range *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* A0 = Number (Status bits reflect value in A0) *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
RAND0:
|
|||
|
PUSH A1
|
|||
|
MOVE A0,A1
|
|||
|
CALLR RANDOM
|
|||
|
MPYU A1,A0
|
|||
|
MOVE A0,A0
|
|||
|
MMFM SP,A1
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*GET SIGNED RANDOM # IN RANGE +/- A0
|
|||
|
*CALLING PARAMETERS: A0
|
|||
|
*RETURNS A0
|
|||
|
*
|
|||
|
SRAND:
|
|||
|
PUSH A0
|
|||
|
SLL 1,A0
|
|||
|
CALLA RANDU
|
|||
|
PULLQ A14
|
|||
|
SUB A14,A0
|
|||
|
RETS
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* RANGRAND - GENERATE A RANDOM NUMBER IN A GIVEN RANGE. *
|
|||
|
* A0 = UPPER BOUND *
|
|||
|
* A1 = LOWER BOUND *
|
|||
|
* RETURNS *
|
|||
|
* A0 = RANDOM # *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
RANGRAND
|
|||
|
SUB A1,A0 ;NORMALIZE THE RANGE
|
|||
|
CALLR RANDU
|
|||
|
ADD A1,A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* RANGERND - GENERATE A RANDOM NUMBER IN A GIVEN RANGE.
|
|||
|
* A0 = VAL 1 (SIGNED, UPPER BOUND)
|
|||
|
* A1 = VAL 2 (SIGNED, LOWER BOUND)
|
|||
|
* RETURNS
|
|||
|
* A0 = RANDOM # BETWEEN VAL 1 AND VAL 2
|
|||
|
* CLOBBERS A1
|
|||
|
RANGERND
|
|||
|
CMP A1,A0
|
|||
|
JRGE VALSOK ;WANT A0 > A1
|
|||
|
SWAP A1,A0
|
|||
|
VALSOK
|
|||
|
SUB A1,A0
|
|||
|
CALLR RAND0
|
|||
|
ADD A1,A0
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*RANDPER - RANDOM % ROUTINE
|
|||
|
*CALLING PARAMETERS:
|
|||
|
*A0=PROBABILITY OF EVENT (0-1023) P(A0=1024) = 1; P(A0=1) = 1/1024.
|
|||
|
*RETURNS CS IF PROBABILITY IS TRUE, CC FOR FALSE
|
|||
|
*RETURNS A0 = ACTUAL RANDOM # 0-1023
|
|||
|
RANDPER:
|
|||
|
PUSH A0
|
|||
|
CALLA RANDOM
|
|||
|
SRL 22,A0
|
|||
|
PULLQ A14
|
|||
|
CMP A14,A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FILLAREA - FILL A GIVEN SQUARE AREA ON THE SCREEN WITH A COLOR *
|
|||
|
* A1 = [COLOR,PALETTE] *
|
|||
|
* A3 = DAG OF AREA [YPOS,XPOS] *
|
|||
|
* A4 = [Y,X] SIZE OF AREA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FILLAREA
|
|||
|
MMTM SP,A0,A1,A2,A4,A5,A7
|
|||
|
MOVI QDMAN,A7
|
|||
|
JRUC AREACON
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FILLAREA2 - FILL A GIVEN SQUARE AREA ON THE SCREEN WITH A COLOR *
|
|||
|
* ON BOTH DISPLAY PAGES. *
|
|||
|
* A1 = [COLOR,PALETTE] *
|
|||
|
* A3 = DAG OF AREA [YPOS,XPOS] *
|
|||
|
* A4 = [Y,X] SIZE OF AREA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FILLAREA2
|
|||
|
MMTM SP,A0,A1,A2,A4,A5,A7
|
|||
|
MOVI QDMAN2,A7
|
|||
|
JRUC AREACON
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* BLNKAREA - BLANK A GIVEN SQUARE AREA ON THE SCREEN *
|
|||
|
* A3 = DAG OF AREA [YPOS,XPOS] *
|
|||
|
* A4 = [Y,X] SIZE OF AREA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
BLNKAREA
|
|||
|
MMTM SP,A0,A1,A2,A4,A5,A7
|
|||
|
MOVI QDMAN,A7
|
|||
|
CLR A1 ;CONSTANT 0:PALETTE 0
|
|||
|
JRUC AREACON
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* BLNKAREA2 - BLANK A GIVEN SQUARE AREA ON BOTH DISPLAY PAGES. *
|
|||
|
* A3 = DAG OF AREA [YPOS,XPOS] *
|
|||
|
* A4 = [Y,X] SIZE OF AREA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
BLNKAREA2
|
|||
|
MMTM SP,A0,A1,A2,A4,A5,A7
|
|||
|
MOVI QDMAN2,A7
|
|||
|
CLR A1 ;CONSTANT 0:PALETTE 0
|
|||
|
JRUC AREACON
|
|||
|
|
|||
|
AREACON
|
|||
|
MOVI [0100H,0100H],A0
|
|||
|
MOVE A4,A2
|
|||
|
MOVI IROM,A4 ;SOMEWHERE IN IMAGE ROM
|
|||
|
MOVI DMACAL,A5
|
|||
|
SLL 16,A5
|
|||
|
CALL A7
|
|||
|
MMFM SP,A0,A1,A2,A4,A5,A7
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* OBJECT VELOCITY STOP ROUTINES *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PSTOP - STOP AN OBJECT, BY ZEROING ALL OF IT'S VELOCITIES *
|
|||
|
* A8 = PTR TO OBJECT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PSTOP
|
|||
|
JAUC CLR_VEL
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DRAWBOX - DRAW A BOX USING THE DMA *
|
|||
|
* A0 = [H,W] SIZE OF BOX *
|
|||
|
* A1 = [COLOR,PALETTE] *
|
|||
|
* A2 = LINE THICKNESS IN PIXELS *
|
|||
|
* A3 = [Y,X] SCREEN ADDRESS OF BOX *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DRAWBOX
|
|||
|
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A8,A9
|
|||
|
MOVE A0,A9
|
|||
|
MOVI DMACAL,A5 ;ALWAYS THIS COLOR
|
|||
|
SLL 16,A5
|
|||
|
MOVI IROM,A4 ;LET'S USE THIS AS DATA
|
|||
|
MOVI [0100H,0100H],A0 ;SET SCALE 1:1
|
|||
|
MOVE A3,A7
|
|||
|
MOVE A2,A8 ;KEEP PIXEL THICKNESS HERE
|
|||
|
SLL 16,A2
|
|||
|
MOVX A9,A2
|
|||
|
MOVE A2,A6
|
|||
|
CALLA QDMAN ;DRAW TOP LINE
|
|||
|
RL 16,A2
|
|||
|
MOVY A9,A2
|
|||
|
MOVE A2,A9
|
|||
|
CALLA QDMAN ;DRAW LEFT LINE
|
|||
|
SRL 16,A2
|
|||
|
SLL 16,A2
|
|||
|
RL 16,A8
|
|||
|
SUBXY A8,A2 ;ADJUST FOR PIXEL THICKNESS
|
|||
|
ADDXY A2,A3 ;MOVE TO LL CORNER
|
|||
|
MOVE A6,A2
|
|||
|
CALLA QDMAN ;DRAW BOTTOM LINE
|
|||
|
ZEXT A2
|
|||
|
DEC A2
|
|||
|
RL 16,A8
|
|||
|
SUBK 1,A8 ;BASE ON 1 PIXEL
|
|||
|
SUBXY A8,A2 ;ADJUST FOR PIXEL THICKNESS
|
|||
|
ADDXY A2,A7
|
|||
|
MOVE A7,A3 ;MOVE TO UR CORNER
|
|||
|
MOVE A9,A2
|
|||
|
CALLA QDMAN ;DRAW RIGHT LINE
|
|||
|
MMFM SP,A0,A2,A3,A4,A5,A6,A7,A8,A9
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DRAWBOX_OBJ - DRAW A BOX AS OBJECTS USING THE DISPLAY SYSTEM *
|
|||
|
* A0 = [H,W] SIZE OF BOX *
|
|||
|
* A1 = [COLOR,PALETTE] *
|
|||
|
* A2 = LINE THICKNESS IN PIXELS *
|
|||
|
* A3 = [Y,X] SCREEN ADDRESS OF BOX *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DRAWBOX_OBJ
|
|||
|
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A8
|
|||
|
MOVE A0,A4
|
|||
|
MOVE A3,A7
|
|||
|
MOVE A2,A8 ;KEEP PIXEL THICKNESS HERE
|
|||
|
SLL 16,A2
|
|||
|
MOVX A4,A2
|
|||
|
MOVE A2,A6
|
|||
|
|
|||
|
MOVI BOXLINE_INIT,A5
|
|||
|
CALLA CREATE_OBJ
|
|||
|
JRZ DBO_X
|
|||
|
MOVE A1,*A0(OPAL),L
|
|||
|
MOVE A3,*A0(OXPOS),W
|
|||
|
MOVE A3,*A0(OYVAL),L
|
|||
|
MOVE A2,*A0(OSIZE),L
|
|||
|
CALLA INSOBJ
|
|||
|
|
|||
|
RL 16,A2
|
|||
|
MOVY A4,A2
|
|||
|
MOVE A2,A4
|
|||
|
|
|||
|
MOVI BOXLINE_INIT,A5
|
|||
|
CALLA CREATE_OBJ
|
|||
|
JRZ DBO_X
|
|||
|
MOVE A1,*A0(OPAL),L
|
|||
|
MOVE A3,*A0(OXPOS),W
|
|||
|
MOVE A3,*A0(OYVAL),L
|
|||
|
MOVE A2,*A0(OSIZE),L
|
|||
|
CALLA INSOBJ
|
|||
|
|
|||
|
SRL 16,A2
|
|||
|
SLL 16,A2
|
|||
|
RL 16,A8
|
|||
|
SUBXY A8,A2 ;ADJUST FOR PIXEL THICKNESS
|
|||
|
ADDXY A2,A3 ;MOVE TO LL CORNER
|
|||
|
MOVE A6,A2
|
|||
|
|
|||
|
MOVI BOXLINE_INIT,A5
|
|||
|
CALLA CREATE_OBJ
|
|||
|
JRZ DBO_X
|
|||
|
MOVE A1,*A0(OPAL),L
|
|||
|
MOVE A3,*A0(OXPOS),W
|
|||
|
MOVE A3,*A0(OYVAL),L
|
|||
|
MOVE A2,*A0(OSIZE),L
|
|||
|
CALLA INSOBJ
|
|||
|
|
|||
|
ZEXT A2
|
|||
|
DEC A2
|
|||
|
RL 16,A8
|
|||
|
SUBK 1,A8 ;BASE ON 1 PIXEL
|
|||
|
SUBXY A8,A2 ;ADJUST FOR PIXEL THICKNESS
|
|||
|
ADDXY A2,A7
|
|||
|
MOVE A7,A3 ;MOVE TO UR CORNER
|
|||
|
MOVE A4,A2
|
|||
|
|
|||
|
MOVI BOXLINE_INIT,A5
|
|||
|
CALLA CREATE_OBJ
|
|||
|
JRZ DBO_X
|
|||
|
MOVE A1,*A0(OPAL),L
|
|||
|
MOVE A3,*A0(OXPOS),W
|
|||
|
MOVE A3,*A0(OYVAL),L
|
|||
|
MOVE A2,*A0(OSIZE),L
|
|||
|
CALLA INSOBJ
|
|||
|
|
|||
|
DBO_X
|
|||
|
MMFM SP,A0,A2,A3,A4,A5,A6,A7,A8
|
|||
|
RETS
|
|||
|
|
|||
|
BOXLINE_INIT
|
|||
|
.LONG BOXLINE,0
|
|||
|
.WORD OID_JUNK,DMACAL,M_SCRNOBJ|M_NOSCALE,0
|
|||
|
.LONG 0
|
|||
|
|
|||
|
.long T2FIXED
|
|||
|
BOXLINE:
|
|||
|
.word 4,4
|
|||
|
.long IROM
|
|||
|
.word 0,0,00H
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DTIME - USED TO DMA AN IMAGE *
|
|||
|
* DTIME2 - USED TO DMA AN IMAGE TO BOTH PAGES AT ONCE *
|
|||
|
* A1 = [CONSTANT COLOR,PALETTE(STUFFED IN DTIME)] *
|
|||
|
* A3 = DAG [Y,X] *
|
|||
|
* A5 = [CONTROL,OFFSET] *
|
|||
|
* A7 = ADDRESS OF IMAGE HEADER *
|
|||
|
* NOTE: SCALE IS ALWAYS 1:1 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DTIME
|
|||
|
MMTM SP,A0,A1,A2,A4,A6
|
|||
|
MOVI QDMAN,A6
|
|||
|
JRUC DTIME_G
|
|||
|
DTIME2
|
|||
|
MMTM SP,A0,A1,A2,A4,A6
|
|||
|
MOVI QDMAN2,A6
|
|||
|
|
|||
|
DTIME_G
|
|||
|
MOVE *A7(ICMAP),A0,L ;GET THE PALETTE
|
|||
|
CALLA FINDPAL ;GET THE CORRECT COLOR MAP #
|
|||
|
JRNZ DTIME1 ;BR = PALETTE WAS FOUND
|
|||
|
CLR A0 ;DEFAULT TO FIXED PALETTE
|
|||
|
DTIME1
|
|||
|
MOVX A0,A1
|
|||
|
|
|||
|
MOVI [0100H,0100H],A0 ;SCALE IS 1:1
|
|||
|
|
|||
|
PUSH A1
|
|||
|
MOVE A7,A1
|
|||
|
MOVE *A1(ISIZE),A2,L ;GRAB THE UNSCALED SIZE
|
|||
|
MOVE *A1(ICTRL),A14,W ;GET BPP AND COMPRESSION
|
|||
|
SLL 16,A14
|
|||
|
OR A14,A5
|
|||
|
PULLQ A1
|
|||
|
MOVE *A7(ISAG),A4,L
|
|||
|
|
|||
|
CALL A6 ;Q THIS SUCKAH!
|
|||
|
|
|||
|
MMFM SP,A0,A1,A2,A4,A6
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DMAWPAL - DMA AN OBJECT, ALLOCATING IT'S PALETTE *
|
|||
|
* A1 = [CONSTANT, 0] *
|
|||
|
* A3 = POSITION(DAG) *
|
|||
|
* A5 = [CONTROL,OFFSET] *
|
|||
|
* A7 = PTR TO IMAGE HEADER *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DMAWPAL:
|
|||
|
MMTM SP,A0,A1,A2,A4
|
|||
|
MOVE *A7(ICMAP),A0,L ;GET THE COLOR MAP WE WANT
|
|||
|
CALLA GETFPAL ;GET A PALETTE
|
|||
|
JRZ DMANOPAL
|
|||
|
MOVX A0,A1 ;TACK ON THE PALETTE
|
|||
|
JRUC DMAWPNOW
|
|||
|
DMANOPAL:
|
|||
|
SRL 16,A1
|
|||
|
SLL 16,A1 ;DEFAULT TO ZERO PALETTE
|
|||
|
DMAWPNOW:
|
|||
|
MOVE *A7(ISIZE),A2,L
|
|||
|
MOVE *A7(ISAG),A4,L
|
|||
|
MOVI [0100H,0100H],A0 ;SCALE IS 1:1
|
|||
|
CALLA QDMAN ;DMA THIS GUY
|
|||
|
MMFM SP,A0,A1,A2,A4
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DMAWAIT - WAIT ON THE DMA BUSY BIT TO CLEAR *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DMAWAIT
|
|||
|
; MOVE @DMAGOREG,A14,W ;DMA BUSY?
|
|||
|
; JRN DMAWAIT ;BR = YES
|
|||
|
; RETS
|
|||
|
|
|||
|
PUSH A1
|
|||
|
MOVI (4096*MICRO_SECOND)/4,A1 ;MAX WAIT FOR 400X256 DMA
|
|||
|
DW_DMA_WT
|
|||
|
MOVE @DMAGOREG,A14,L ;DMA STILL BUSY?
|
|||
|
JRNN DW_DMA_READY ;BR = NO, READY
|
|||
|
DSJS A1,DW_DMA_WT
|
|||
|
LOCKUP
|
|||
|
|
|||
|
CLR A14
|
|||
|
MOVE A14,@DMAGOREG,L
|
|||
|
MOVE A14,@DMAGOREG,L ;DMA off for sure
|
|||
|
|
|||
|
CALLA CLRDMAQ
|
|||
|
|
|||
|
DW_DMA_READY
|
|||
|
PULL A1
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DMAQWAIT - WAIT ON DMA QUEUE TO EMPTY, THEN DMA BUSY TO CLEAR *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DMAQWAIT
|
|||
|
; cmp B12,B13 ;Is Q Empty?
|
|||
|
; jrgt DMAQWAIT
|
|||
|
; MOVE @DMAGOREG,A14,W ;DMA BUSY?
|
|||
|
; JRN DMAQWAIT ;BR = YES
|
|||
|
; RETS
|
|||
|
|
|||
|
MMTM SP,B1,B2
|
|||
|
|
|||
|
DQW_DMA_NEXT_EL
|
|||
|
MOVI (4096*MICRO_SECOND)/4,B1 ;Max wait
|
|||
|
MOVE B13,B2
|
|||
|
DQW_Q_WT
|
|||
|
CMP B12,B13 ;Is Q Empty?
|
|||
|
JRLE DQW_Q_EMPTY
|
|||
|
|
|||
|
CMP B2,B13
|
|||
|
JRNE DQW_DMA_NEXT_EL ;BR = Queue is changing
|
|||
|
|
|||
|
DSJS B1,DQW_Q_WT
|
|||
|
|
|||
|
LOCKUP
|
|||
|
|
|||
|
CLR B2
|
|||
|
MOVE B2,@DMAGOREG,L
|
|||
|
MOVE B2,@DMAGOREG,L ;DMA off for sure
|
|||
|
|
|||
|
CALLA CLRDMAQ
|
|||
|
JRUC DQW_X
|
|||
|
|
|||
|
DQW_Q_EMPTY
|
|||
|
|
|||
|
MOVI (4096*MICRO_SECOND)/4,B1 ;MAX WAIT FOR 400X256 DMA
|
|||
|
DQW_DMA_WT
|
|||
|
MOVE @DMAGOREG,B2,L
|
|||
|
JRNN DQW_X ;BR = DMA is ready
|
|||
|
DSJS B1,DQW_DMA_WT
|
|||
|
|
|||
|
LOCKUP
|
|||
|
|
|||
|
CLR B2
|
|||
|
MOVE B2,@DMAGOREG,L
|
|||
|
MOVE B2,@DMAGOREG,L ;DMA off for sure
|
|||
|
|
|||
|
CALLA CLRDMAQ
|
|||
|
|
|||
|
DQW_X
|
|||
|
MMFM SP,B1,B2
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DMAHALT - HALT THE DMA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DMAHALT
|
|||
|
CLR A14
|
|||
|
MOVE A14,@DMAGOREG,L ;HALT THE DMA
|
|||
|
MOVE A14,@DMAGOREG,L ;CLEAR THE DMA
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
*
|
|||
|
*CMAPRS - RESET THE COLOR MAP SELECT
|
|||
|
CMAPRS CLR A0
|
|||
|
*CMAPSL - SELECT THE COLOR MAP(0-15 IN A0)
|
|||
|
CMAPSL MOVE A1,-*SP,L
|
|||
|
CALLA DMAWAIT
|
|||
|
MOVE A0,@CMAPSEL
|
|||
|
MOVE *SP+,A1,L
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*SCRCLR - CLEAR THE SCREEN WITH EUGENE
|
|||
|
*ONLY CALL WITH INTERRUPTS DISABLED AND THE DMA SHUT DOWN, OTHERWISE
|
|||
|
* USE CLR_SCRN
|
|||
|
SCRCLR CLR A0
|
|||
|
*SCRFIL - FILL SCREEN WITH A0
|
|||
|
SCRFIL:
|
|||
|
MMTM SP,A1,A2
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI SCREEN,A1,L
|
|||
|
MOVI (SCRNE-SCREEN)/32,A2,L
|
|||
|
SCRLP MOVE A0,*A1+,L
|
|||
|
DSJS A2,SCRLP
|
|||
|
MMFM SP,A1,A2
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*LAST2CLR - CLEAR LAST TWO LINES OF BIT MAP(I.E. SET AUTO ERASE COLOR)
|
|||
|
LAST2CLR
|
|||
|
CLR A0
|
|||
|
*
|
|||
|
*LAST2FIL - FILL LAST TWO LINES OF BIT MAP
|
|||
|
*A0 = FILL COLOR
|
|||
|
LAST2FIL
|
|||
|
MOVE A0,@ERASELOC,W ;STUFF DA COLOR
|
|||
|
RETS
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SETPPROC - SETUP TI'S PIXEL PROCESSING REGISTER'S (BFILE), TO MATCH *
|
|||
|
* THE ZUNIT SYSTEM. *
|
|||
|
* NOTE: IF YOU WANT TO DO ANY SPECIAL TRICKS, DON'T USE THIS. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SETPPROC
|
|||
|
PUSH A0
|
|||
|
MOVI OFFSETVAL,B4 ;Set up OFFSET register
|
|||
|
MOVI 0,B8 ;Set background color
|
|||
|
MOVI SCRN_PTCH,A0 ;Get Screen Pitch
|
|||
|
MOVE A0,B1
|
|||
|
MOVE A0,B3
|
|||
|
LMO A0,A0 ;Convert in temporary register
|
|||
|
MOVE A0,@CONVSP ;Move to CONVSP io register
|
|||
|
MOVE A0,@CONVDP ;Move to CONVDP io register
|
|||
|
PULL A0
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CLRBLOCK - CLEAR A BLOCK OF MEMORY. SIZE MUST BE A FACTOR OF 16 *
|
|||
|
* MAKE SURE BLOCK SIZE IS 32 BITS OR GREATER. *
|
|||
|
* A1 = START ADDRESS *
|
|||
|
* A2 = END ADDRESS *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CLRBLOCK:
|
|||
|
PUSH A3
|
|||
|
CLR A3
|
|||
|
CALLR FILBLOCK
|
|||
|
PULL A3
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FILBLOCK - FILL A BLOCK OF MEMORY. SIZE MUST BE A FACTOR OF 16 *
|
|||
|
* MAKE SURE BLOCK SIZE IS 32 BITS OR GREATER. *
|
|||
|
* A1 = START ADDRESS *
|
|||
|
* A2 = END ADDRESS *
|
|||
|
* A3 = FILL VALUE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FILBLOCK:
|
|||
|
MMTM SP,A1,A2
|
|||
|
SUB A1,A2
|
|||
|
SRL 5,A2
|
|||
|
JRNC FIL32LP
|
|||
|
MOVE A3,*A1+,W ;MOVE THE ODD WORD
|
|||
|
FIL32LP:
|
|||
|
MOVE A3,*A1+,L ;JUST MOVE LONG
|
|||
|
DSJS A2,FIL32LP
|
|||
|
MMFM SP,A1,A2
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CLR_SCRN - CLEAR THE WHOLE BIT MAP *
|
|||
|
* NOTE : TRASHES A0 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CLR_SCRN:
|
|||
|
CLR A0
|
|||
|
*
|
|||
|
*YOU PROVIDE THE COLOR IN A0
|
|||
|
FILL_SCRN:
|
|||
|
MMTM SP,A1,A2,A3
|
|||
|
MOVE @DISPLAYON,A3,W
|
|||
|
CLR A1
|
|||
|
MOVE A1,@DISPLAYON,W
|
|||
|
CALLR DMAQWAIT ;WAIT ON DMA
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI SCREEN,A1,L
|
|||
|
MOVI ((SCRNE-2000H)-SCREEN)/32,A2,L
|
|||
|
CLRLP MOVE A0,*A1+,L
|
|||
|
DSJS A2,CLRLP
|
|||
|
MOVE A3,@DISPLAYON,W
|
|||
|
MMFM SP,A1,A2,A3
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*CLEAR EVERYTHING UNDERNEATH THE STATUS AREA
|
|||
|
CLRPLAY
|
|||
|
CALLR CLRP_P0
|
|||
|
JRUC CLRP_P1
|
|||
|
|
|||
|
*
|
|||
|
*CLEAR EVERYTHING UNDERNEATH THE STATUS AREA ON PAGE 0 ONLY
|
|||
|
CLRP_P0
|
|||
|
MMTM SP,A0,A1,A2,A3
|
|||
|
CLR A0
|
|||
|
MOVE @DISPLAYON,A3,W
|
|||
|
MOVE A0,@DISPLAYON,W
|
|||
|
CALLA DMAQWAIT ;WAIT ON DMA
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI SCREEN+(SKYTOPOF*1000H),A1,L
|
|||
|
MOVI (PAGE0E-(SCREEN+(SKYTOPOF*1000H)))/32,A2,L
|
|||
|
CLRP0LP MOVE A0,*A1+,L
|
|||
|
DSJS A2,CLRP0LP
|
|||
|
MOVE A3,@DISPLAYON,W
|
|||
|
MMFM SP,A0,A1,A2,A3
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*CLEAR EVERYTHING UNDERNEATH THE STATUS AREA ON PAGE 1 ONLY
|
|||
|
CLRP_P1
|
|||
|
MMTM SP,A0,A1,A2,A3
|
|||
|
CLR A0
|
|||
|
MOVE @DISPLAYON,A3,W
|
|||
|
MOVE A0,@DISPLAYON,W
|
|||
|
CALLA DMAQWAIT ;WAIT ON DMA
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI PAGE0E+(SKYTOPOF*1000H),A1,L
|
|||
|
MOVI (SCRNE-(PAGE0E+(SKYTOPOF*1000H)))/32,A2,L
|
|||
|
JRUC CLRP0LP
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FILL_PAGE2 *
|
|||
|
* *
|
|||
|
* Fill screen page 2 with a given value *
|
|||
|
* *
|
|||
|
* A0 = Long word value to store *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FILL_PAGE2
|
|||
|
MMTM SP,A0,A1,A2,A3
|
|||
|
JRUC CP2_G
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CLEAR_PAGE2 *
|
|||
|
* *
|
|||
|
* Clear just screen page 2 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CLEAR_PAGE2
|
|||
|
MMTM SP,A0,A1,A2,A3
|
|||
|
CLR A0
|
|||
|
CP2_G
|
|||
|
MOVE @DISPLAYON,A3,W
|
|||
|
CLRM @DISPLAYON,W
|
|||
|
CALLA DMAQWAIT ;WAIT ON DMA
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI PAGE2_START,A1,L
|
|||
|
MOVI ((PAGE2_END + 1) - PAGE2_START)/32,A2,L
|
|||
|
JRUC CLRP0LP
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CLEAR_PAGE3 *
|
|||
|
* *
|
|||
|
* Clear just screen page 2 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CLEAR_PAGE3
|
|||
|
MMTM SP,A0,A1,A2,A3
|
|||
|
CLR A0
|
|||
|
MOVE @DISPLAYON,A3,W
|
|||
|
MOVE A0,@DISPLAYON,W
|
|||
|
CALLA DMAQWAIT ;WAIT ON DMA
|
|||
|
CLR A1
|
|||
|
MOVE A1,@CMAPSEL,W ;SELECT COLOR MAP 0
|
|||
|
MOVI PAGE3_START,A1,L
|
|||
|
MOVI ((PAGE3_END + 1) - PAGE3_START)/32,A2,L
|
|||
|
JRUC CLRP0LP
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FlshWyte *
|
|||
|
* *
|
|||
|
* Flash an object to a constant color using Anim to unflash. *
|
|||
|
* To use this function, obj must not be using OVAR5 or OVAR6. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FlshWyte:
|
|||
|
PUSH A1
|
|||
|
movb *A8(OFLAGS+B_ANIM-7),A14 ;already animating??
|
|||
|
jrnn FlashIt0 ;NO..
|
|||
|
|
|||
|
;save current anim info in OVAR5,OVAR6
|
|||
|
move *A8(AnimScr),A14,L
|
|||
|
cmpi UNFLASH,A14
|
|||
|
jreq SkWhite ;BR = already unflashing..
|
|||
|
move A14,*A8(OVAR5),L
|
|||
|
move *A8(AnimFrm),*A8(OVAR6),L
|
|||
|
jruc FlashIt
|
|||
|
FlashIt0
|
|||
|
CLRM *A8(OVAR6),L
|
|||
|
FlashIt
|
|||
|
; move A1,*A8(OCONST),W
|
|||
|
movi UNFLASH,A1
|
|||
|
calla STRT_ANIM
|
|||
|
CALLA OBJ_CONST
|
|||
|
SkWhite:
|
|||
|
PULLQ A1
|
|||
|
rets
|
|||
|
|
|||
|
*FLASH ANIM SCRIPT
|
|||
|
UNFLASH
|
|||
|
LW 1,4
|
|||
|
LWL 1,1|AFunc,UnFlash
|
|||
|
|
|||
|
****************************************************************************
|
|||
|
* UnFlash
|
|||
|
* Anim function used by FlshWyte to unflash an object and restore its
|
|||
|
* previous action
|
|||
|
UnFlash:
|
|||
|
move *A8(OCTRL),A1,W
|
|||
|
; move *A8(OFLAGS),A1,W
|
|||
|
ori M_WRNONZ,A1 ;Do Write Non-Zero Data
|
|||
|
andni M_CONNON,A1 ;Don't Replace Non-Zero Data with constant
|
|||
|
move A1,*A8(OCTRL),W
|
|||
|
; move A1,*A8(OFLAGS),W
|
|||
|
|
|||
|
move *A8(OVAR6),A1,L
|
|||
|
jrz UFPul
|
|||
|
;*** JUST RESTORE TO OLD ANIM SCRIPT ***
|
|||
|
move A1,*A8(AnimFrm),L
|
|||
|
move *A8(OVAR5),*A8(AnimScr),L
|
|||
|
jruc UnFlashX
|
|||
|
|
|||
|
UFPul calla PULL_ANIM
|
|||
|
UnFlashX
|
|||
|
rets
|
|||
|
|
|||
|
FRAGZOFF .set 0
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
FragCoorsSetup:
|
|||
|
;CLOBBERS A1,A2,A4
|
|||
|
MOVE *A8(OIMG),A4,L ;We must get ani pnt from 1:1 image
|
|||
|
MOVE *A4(IANIOFF),A2,L ;Got it
|
|||
|
MOVE *A4(ISIZE),A14,L
|
|||
|
|
|||
|
MOVE *A8(OFLAGS),A1,W
|
|||
|
BTST B_DBLSCL,A1
|
|||
|
JRZ FCS_NODUB ;BR=NO DOUBLE SCALE
|
|||
|
|
|||
|
MOVE A2,A1 ;DOUBLE SCALE ACTION ON THE ANIOFF
|
|||
|
SLL 1,A2 ;DOUBLE ANIOFFX
|
|||
|
SRA 16,A1
|
|||
|
SLL 1+16,A1 ;DOUBLE ANIOFFY
|
|||
|
MOVY A1,A2
|
|||
|
|
|||
|
MOVE A14,A4 ;DOUBLE SCALE ACTION ON THE SIZE
|
|||
|
SLL 1,A14 ;DOUBLE SIZEX
|
|||
|
SRA 16,A4
|
|||
|
SLL 1+16,A4 ;DOUBLE SIZEY
|
|||
|
MOVY A4,A14
|
|||
|
FCS_NODUB
|
|||
|
MOVE *A8(OCTRL),A1,W ;Do the flip thang
|
|||
|
|
|||
|
MOVE A14,B6
|
|||
|
SUBI 10001h,A14
|
|||
|
SUBXY A2,A14 ; adjusted anioff in a9
|
|||
|
|
|||
|
BTST B_FLIPH,A1
|
|||
|
JRZ FCS_NOHFLIP
|
|||
|
MOVX A14,A2
|
|||
|
FCS_NOHFLIP
|
|||
|
BTST B_FLIPV,A1
|
|||
|
JRZ FCS_NOVFLIP
|
|||
|
MOVY A14,A2
|
|||
|
FCS_NOVFLIP
|
|||
|
MOVE A2,A14
|
|||
|
SEXT A14,W
|
|||
|
SLL 15,A14 ;Multiply for world coords
|
|||
|
MOVE *A8(OXVAL),A1,L
|
|||
|
SUB A14,A1
|
|||
|
|
|||
|
MOVE B6,A14
|
|||
|
SEXT A14,W
|
|||
|
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
FragCenterCoors:
|
|||
|
;CLOBBERS A1,A2,A4
|
|||
|
;*** SET COORS ***
|
|||
|
CALLR FragCoorsSetup
|
|||
|
|
|||
|
;A1 = OXVAL - SIZEX - 1 - ANIOFFX
|
|||
|
;A2 = SIZE - [1,1] - ANIOFF
|
|||
|
;A14 = SIZEX - 1 - ANIOFFX
|
|||
|
;B6 = UNFLIPPED SIZE
|
|||
|
|
|||
|
SLL 15-1,A14 ;TRANSLATE AND DIVIDE BY 2
|
|||
|
ADD A14,A1
|
|||
|
SRA 16,A1
|
|||
|
move A1,B1 ;Minimum X
|
|||
|
move A1,B2 ;Maximum X
|
|||
|
|
|||
|
SRA 16,A2
|
|||
|
SLL 15,A2
|
|||
|
MOVE *A8(OYVAL),A1,L
|
|||
|
SUB A2,A1
|
|||
|
MOVE B6,A2
|
|||
|
SRA 16,A2
|
|||
|
SLL 15-1,A2 ;TRANSLATE AND DIVIDE BY 2
|
|||
|
ADD A2,A1
|
|||
|
SRA 16,A1
|
|||
|
move A1,B5 ;Minimum Y
|
|||
|
move A1,B6 ;Maximum Y
|
|||
|
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
FragLRCoors:
|
|||
|
;CLOBBERS A1,A2,A4
|
|||
|
;*** SET COORS ***
|
|||
|
CALLR FragCoorsSetup
|
|||
|
|
|||
|
;A1 = OXVAL - SIZEX - 1 - ANIOFFX
|
|||
|
;A2 = SIZE - [1,1] - ANIOFF
|
|||
|
;A14 = SIZEX - 1 - ANIOFFX
|
|||
|
;B6 = UNFLIPPED SIZE
|
|||
|
|
|||
|
SLL 15,A14 ;TRANSLATE
|
|||
|
ADD A14,A1
|
|||
|
SRA 16,A1
|
|||
|
move A1,B1 ;Minimum X
|
|||
|
move A1,B2 ;Maximum X
|
|||
|
|
|||
|
SRA 16,A2
|
|||
|
SLL 15,A2
|
|||
|
MOVE *A8(OYVAL),A1,L
|
|||
|
SUB A2,A1
|
|||
|
MOVE B6,A2
|
|||
|
SRA 16,A2
|
|||
|
SLL 15,A2 ;TRANSLATE
|
|||
|
ADD A2,A1
|
|||
|
SRA 16,A1
|
|||
|
move A1,B5 ;Minimum Y
|
|||
|
move A1,B6 ;Maximum Y
|
|||
|
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
FragBoxCoors:
|
|||
|
;CLOBBERS A1,A2,A4
|
|||
|
;*** SET COORS ***
|
|||
|
CALLR FragCoorsSetup
|
|||
|
|
|||
|
;A1 = OXVAL - SIZEX - 1 - ANIOFFX
|
|||
|
;A2 = SIZE - [1,1] - ANIOFF
|
|||
|
;A14 = SIZEX - 1 - ANIOFFX
|
|||
|
;B6 = UNFLIPPED SIZE
|
|||
|
|
|||
|
move A1,B1 ;Minimum X
|
|||
|
SRA 16,B1
|
|||
|
SLL 15,A14
|
|||
|
ADD A14,A1
|
|||
|
move A1,B2 ;Maximum X
|
|||
|
SRA 16,B2
|
|||
|
|
|||
|
SRA 16,A2
|
|||
|
SLL 15,A2
|
|||
|
MOVE *A8(OYVAL),A1,L
|
|||
|
SUB A2,A1
|
|||
|
move A1,B5 ;Minimum Y
|
|||
|
SRA 16,B5
|
|||
|
MOVE B6,A2
|
|||
|
SRA 16,A2
|
|||
|
SLL 15,A2
|
|||
|
ADD A2,A1
|
|||
|
move A1,B6 ;Maximum Y
|
|||
|
SRA 16,B6
|
|||
|
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* All PreFrag routines merely setup up the *
|
|||
|
* registers for Fragger. This is so that *
|
|||
|
* you may tweak any necessary parameters. *
|
|||
|
* So after PreFrag, call Fragger to kick *
|
|||
|
* the jams. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Gun - Setup a Fragger explosion from random points within *
|
|||
|
* the box centered around the players current *
|
|||
|
* cursor position. Uses Z position and all velocities *
|
|||
|
* of the given object. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A2 = Ptr to player data (has pt of gun) *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A4 = Y:X "Radius" of box. *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Gun
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
|
|||
|
mmtm SP,A5,A7
|
|||
|
|
|||
|
MOVE *A8(OZVAL),A1,L ;Make point Universe rel. at this Z
|
|||
|
|
|||
|
move *A2(PCURSORXY),A7,L ;Get [Y,X] Screen relative point.
|
|||
|
movx A7,A5
|
|||
|
sext A5
|
|||
|
sra 16,A7 ;Now we have 16.16 screen X
|
|||
|
|
|||
|
STOUXY A1,A5,A7 ;Use that funky Bill macro to convert
|
|||
|
|
|||
|
srl 16,A5
|
|||
|
movy A7,A5 ;Pack it up, Pack it in, Let me begin...
|
|||
|
|
|||
|
move A5,A14
|
|||
|
|
|||
|
subxy A4,A14
|
|||
|
move A14,B1 ;B1 min Xpos
|
|||
|
sext B1,W
|
|||
|
move A14,B5 ;B5 min Ypos
|
|||
|
sra 16,B5
|
|||
|
addxy A4,A5
|
|||
|
move A5,B2 ;B2 max Xpos
|
|||
|
sext B2,W
|
|||
|
move A5,B6 ;B6 max Ypos
|
|||
|
sra 16,B6
|
|||
|
|
|||
|
mmfm SP,A5,A7
|
|||
|
jruc CoorSet1 ;Finish off inside PreFrag_Center
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Offset - Setup a Fragger explosion offset from the animation *
|
|||
|
* point of the given object. Max velocity is relative to *
|
|||
|
* the objects current velocity in a given direction. *
|
|||
|
* If the object is in the AIR then blow fragments *
|
|||
|
* in all directions. *
|
|||
|
* If the object is on the GROUND then blow fragments *
|
|||
|
* up. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A4 = [Y, X] PIXEL OFFSET *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
PreFrag_Offset
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
|
|||
|
MOVE A4,B0
|
|||
|
SEXT B0,W
|
|||
|
SRA 1,B0 ;TRANSLATE SCREEN X TO WORLD INTEGER
|
|||
|
MOVE A8,B3
|
|||
|
MOVE *B3(OXPOS),B1,W
|
|||
|
ADD B0,B1
|
|||
|
MOVE B1,B2
|
|||
|
|
|||
|
MOVE A4,B0
|
|||
|
SRA 17,B0 ;TRANSLATE SCREEN Y TO WORLD INTEGER
|
|||
|
MOVE *B3(OYPOS),B5,W
|
|||
|
ADD B0,B5
|
|||
|
MOVE B5,B6
|
|||
|
|
|||
|
jruc CoorSet1
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Box_Offset *
|
|||
|
* *
|
|||
|
* Set up a Fragger explosion making a box based on the offsets *
|
|||
|
* given. Each offset is from the animation pnt of the calling *
|
|||
|
* object. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A4 = [Y,X] PIXEL OFFSET of Upper Left *
|
|||
|
* A5 = [Y,X] PIXEL OFFSET of Lower Right *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Box_Offset
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
|
|||
|
MOVE A4,B0
|
|||
|
SEXT B0,W
|
|||
|
SRA 1,B0 ;TRANSLATE SCREEN X TO WORLD INTEGER
|
|||
|
MOVE A8,B3
|
|||
|
MOVE *B3(OXPOS),B1,W
|
|||
|
MOVE B1,B2
|
|||
|
ADD B0,B1
|
|||
|
MOVE A5,B0
|
|||
|
SEXT B0,W
|
|||
|
SRA 1,B0 ;TRANSLATE SCREEN X TO WORLD INTEGER
|
|||
|
ADD B0,B2
|
|||
|
|
|||
|
MOVE A4,B0
|
|||
|
SRA 17,B0 ;TRANSLATE SCREEN Y TO WORLD INTEGER
|
|||
|
MOVE *B3(OYPOS),B5,W
|
|||
|
MOVE B5,B6
|
|||
|
ADD B0,B5
|
|||
|
MOVE A5,B0
|
|||
|
SRA 17,B0 ;TRANSLATE SCREEN Y TO WORLD INTEGER
|
|||
|
ADD B0,B6
|
|||
|
|
|||
|
jruc CoorSet1
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Center - Setup a Fragger explosion from the center of *
|
|||
|
* the given object. Max velocity is relative to *
|
|||
|
* the objects current velocity in a given direction. *
|
|||
|
* If the object is in the AIR then blow fragments *
|
|||
|
* in all directions. *
|
|||
|
* If the object is on the GROUND then blow fragments *
|
|||
|
* up. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Center
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
callr FragCenterCoors
|
|||
|
|
|||
|
CoorSet1:
|
|||
|
;*** SET ZVAL
|
|||
|
move *A8(OZVAL),A1,L
|
|||
|
move A1,B0 ;Give us our starting Z value
|
|||
|
**** addi FRAGZOFF,B0
|
|||
|
|
|||
|
;*** SET VELOCITIES ***
|
|||
|
move A0,A2 ;A2 = Base speed of the fragments
|
|||
|
|
|||
|
move *A8(OXVEL),A0,L ;Get objects current X velocity
|
|||
|
move A0,A1
|
|||
|
sub A2,A0
|
|||
|
move A0,B3 ;MIN XVel
|
|||
|
add A2,A1
|
|||
|
move A1,B4 ;MAX XVel
|
|||
|
|
|||
|
calla DIST_FROM_GROUND ;Is this object close to the ground?
|
|||
|
SUBI 010000H,A1
|
|||
|
jrn GrndFrag ;BR = Yes
|
|||
|
|
|||
|
;AIR BURST
|
|||
|
move *A8(OYVEL),A0,L ;Get objects current Y velocity
|
|||
|
move A0,A1
|
|||
|
sub A2,A0
|
|||
|
move A0,B7 ;MIN YVel
|
|||
|
add A2,A1
|
|||
|
move A1,B8 ;MAX YVel
|
|||
|
jruc PreFrgC_SetZ
|
|||
|
|
|||
|
;GROUND BURST - Do not incorporate objects YVel and decrease Maximum
|
|||
|
; downward velocity.
|
|||
|
GrndFrag:
|
|||
|
move A2,B7 ;MIN YVel - Remember, negative is UP
|
|||
|
neg B7
|
|||
|
move B7,B8 ;MAX YVel
|
|||
|
sra 2,B8
|
|||
|
PreFrgC_SetZ:
|
|||
|
|
|||
|
move *A8(OZVEL),A0,L ;Get objects current Z velocity
|
|||
|
move A0,A1
|
|||
|
sub A3,A0
|
|||
|
move A0,B9 ;MIN ZVel
|
|||
|
add A3,A1
|
|||
|
move A1,B10 ;MAX ZVel
|
|||
|
|
|||
|
mmfm SP,A0,A1,A2,A4
|
|||
|
rets
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_LR - Setup Fragger input to start fragments from LOWER RIGHT *
|
|||
|
* corner of given object. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_LR
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
callr FragLRCoors
|
|||
|
jruc CoorSet1
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Box - Setup Fragger input to start fragments from random *
|
|||
|
* points within the Bounding Box of the given object. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Box
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
callr FragBoxCoors
|
|||
|
jruc CoorSet1
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Up - Setup Fragger input to start fragments from the Center *
|
|||
|
* of the given object and blow fragments UP. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* A8 = Ptr to Object about which fragments are to be created. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Up
|
|||
|
mmtm SP,A0,A1,A2,A4
|
|||
|
callr FragBoxCoors ;clobbers A1,A2
|
|||
|
|
|||
|
;*** SET ZVAL
|
|||
|
move *A8(OZVAL),A1,L
|
|||
|
move A1,B0 ;Give us our ZVAL
|
|||
|
**** addi FRAGZOFF,B0
|
|||
|
|
|||
|
;*** SET VELOCITIES ***
|
|||
|
move *A8(OXVEL),A1,L
|
|||
|
move A1,B14
|
|||
|
move A0,B3 ;MIN XVel
|
|||
|
neg B3
|
|||
|
add B14,B3
|
|||
|
move A0,B4
|
|||
|
add B14,B4 ;MAX XVel
|
|||
|
|
|||
|
move A0,B7 ;MIN YVel
|
|||
|
abs B7
|
|||
|
neg B7
|
|||
|
move B7,B8 ;MAX YVel
|
|||
|
sra 2,B8
|
|||
|
|
|||
|
move *A8(OZVEL),A0,L ;Get objects current Z velocity
|
|||
|
move A0,A1
|
|||
|
sub A3,A0
|
|||
|
move A0,B9 ;MIN ZVel
|
|||
|
add A3,A1
|
|||
|
move A1,B10 ;MAX ZVel
|
|||
|
|
|||
|
mmfm SP,A0,A1,A2,A4
|
|||
|
rets
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PreFrag_Rain - Setup a Fragger explosion from above. *
|
|||
|
* *
|
|||
|
* A0 = Absolute value of Max X and Y Velocity (16.16) of chunks. *
|
|||
|
* A3 = Absolute value of Max Z Velocity (16.16) *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* B0 ZVal 16.16 *
|
|||
|
* B1 min Xpos 16 bit integer only *
|
|||
|
* B2 max Xpos 16 bit integer only *
|
|||
|
* B3 min Xvel 16.16 *
|
|||
|
* B4 max Xvel 16.16 *
|
|||
|
* B5 min Ypos 16 bit integer only *
|
|||
|
* B6 max Ypos 16 bit integer only *
|
|||
|
* B7 min Yvel 16.16 *
|
|||
|
* B8 max Yvel 16.16 *
|
|||
|
* B9 min Zvel 16.16 *
|
|||
|
* B10 max Zvel 16.16 *
|
|||
|
* *
|
|||
|
* Note: If the velocities aren't quite correct for your application, *
|
|||
|
* then use the Fragment function to adjust. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PreFrag_Rain
|
|||
|
|
|||
|
MOVE @ZBASE,B0,L
|
|||
|
ADDI 0E000H,B0
|
|||
|
MOVE @XBASE+16,B1,W
|
|||
|
MOVE B1,B2
|
|||
|
SUBI 85H,B1
|
|||
|
ADDI 85H,B2
|
|||
|
MOVE A0,B4
|
|||
|
MOVE B4,B3
|
|||
|
NEG B3
|
|||
|
MOVE @YBASE+16,B5,W
|
|||
|
SUBI 0B0H,B5
|
|||
|
MOVE @WORLD_GRNDOFF+16,B6,W
|
|||
|
ADD B6,B5
|
|||
|
MOVE B5,B6
|
|||
|
MOVE B3,B7
|
|||
|
MOVE B4,B8
|
|||
|
MOVE A3,B10
|
|||
|
MOVE B10,B9
|
|||
|
NEG B9
|
|||
|
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* Fragger - Create a fragment explosion process with the given *
|
|||
|
* parameters. *
|
|||
|
* *
|
|||
|
* PASS: *
|
|||
|
* B0 = OZVAL *
|
|||
|
* B1 = min Xpos *
|
|||
|
* B2 = max Xpos *
|
|||
|
* B3 = min Xvel *
|
|||
|
* B4 = max Xvel *
|
|||
|
* B5 = min Ypos *
|
|||
|
* B6 = max Ypos *
|
|||
|
* B7 = min Yvel *
|
|||
|
* B8 = max Yvel *
|
|||
|
* B9 = min Zvel *
|
|||
|
* B10 = max Zvel *
|
|||
|
* *
|
|||
|
* NOTE: min/max vals get sorted here, so you can pass them out of order. *
|
|||
|
* *
|
|||
|
* B14 = Ptr to explosion script, it is NULL terminated with each entry *
|
|||
|
* as follows: *
|
|||
|
* *
|
|||
|
* .long anim script (first frame of script used for init) *
|
|||
|
* .long func called after obj set up *
|
|||
|
* A0 = obj (0 for none). *
|
|||
|
* Must not trash: A8-A11 and ALL of B-File. *
|
|||
|
* .word OID *
|
|||
|
* .word # to create.5:# sleep tiks before next group.5:flags.6 *
|
|||
|
* *
|
|||
|
* flags: *
|
|||
|
* FRGBOG ;IF SET, THEN CHECK BOG, IF BOGGED, KILL SCRIPT *
|
|||
|
* FRGGCOL ;DO SET M_GCOLL (not set by default) *
|
|||
|
* FRGNOFLY ;DON'T SET OYACCEL (set by default) *
|
|||
|
* FRGNOFLP ;DON'T USE RndFlpX,RndFlpY of OBJECTS *
|
|||
|
* FRGRND ;Random frag count, between 0 and #-1 given. *
|
|||
|
* FRGPAL ;CALL FPSTFOBJ *
|
|||
|
* script flags that are currently undefined are reserved for future use *
|
|||
|
* script is teminated w/ .long 0 *
|
|||
|
* *
|
|||
|
* NOTE: if Sleep longer than 31 needed, set # to create to 0 *
|
|||
|
* if need to create more than 31, use sleep of 0 *
|
|||
|
* *
|
|||
|
* BIG NOTE: *
|
|||
|
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *
|
|||
|
* IF POSSIBLE, USE PreFrag routines to set up the BREGs for this func *
|
|||
|
* If a new case is needed, create another PreFrag function so *
|
|||
|
* that it may be shared by others in the future. *
|
|||
|
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *
|
|||
|
* *
|
|||
|
* Algorithm: *
|
|||
|
* *
|
|||
|
* IF (min Xpos = max Xpos) *
|
|||
|
* Xpos = min Xpos *
|
|||
|
* Xvel = RANGERND (min Xvel, max Xvel) *
|
|||
|
* ELSE *
|
|||
|
* Xpos = RANGERND (min Xpos, max Xpos) *
|
|||
|
* *
|
|||
|
* (Xpos - min Xpos) *
|
|||
|
* Xvel = min Xvel + --------------------- * (max Xvel - min Xvel) *
|
|||
|
* (max Xpos - min Xpos) *
|
|||
|
* SRAND ((max Xvel - min Xvel)/4) *
|
|||
|
* *
|
|||
|
* *** Y HANDLED SAME AS X *** *
|
|||
|
* *
|
|||
|
* RETURN: *
|
|||
|
* A0 = FragProc PROCESS ADDRESS *
|
|||
|
* IF PROCESS CREATION FAILED, THEN A0 = 0 AND Z FLAG IS SET *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
;THESE OFFSETS ARE FOR Fragger TO REFERENCE SCRIPT ENTRIES
|
|||
|
FRGFNC .set 20H
|
|||
|
FRGOID .set 40H
|
|||
|
FRGFLG .set 50H
|
|||
|
FRGSLP .set 56H
|
|||
|
FRGCNT .set 5BH
|
|||
|
FRGSIZE .set 60H
|
|||
|
|
|||
|
Fragger
|
|||
|
mmtm SP,A1,A7,A8
|
|||
|
cmp B1,B2
|
|||
|
jrge SkSwp1
|
|||
|
SWAP B1,B2
|
|||
|
SkSwp1:
|
|||
|
cmp B3,B4
|
|||
|
jrge SkSwp2
|
|||
|
SWAP B3,B4
|
|||
|
SkSwp2:
|
|||
|
cmp B5,B6
|
|||
|
jrge SkSwp3
|
|||
|
SWAP B5,B6
|
|||
|
SkSwp3:
|
|||
|
cmp B7,B8
|
|||
|
jrge SkSwp4
|
|||
|
SWAP B7,B8
|
|||
|
SkSwp4:
|
|||
|
cmp B9,B10
|
|||
|
jrge SkSwp5
|
|||
|
SWAP B9,B10
|
|||
|
SkSwp5
|
|||
|
move B14,A8 ;Script goes over in A8
|
|||
|
CREATE PID_FRAG,FragProc
|
|||
|
jrz Fragger_NoProc
|
|||
|
|
|||
|
move A0,B14
|
|||
|
addi FPDATA,B14
|
|||
|
mmtm B14,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 ;Push the pos and vel
|
|||
|
|
|||
|
MOVE A0,A0 ;CLEAR Z FLAG
|
|||
|
Fragger_NoProc
|
|||
|
mmfm SP,A1,A7,A8
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* FragProc - Process created by Fragger to actually do all of the *
|
|||
|
* dirty work of creating the fragments. *
|
|||
|
* A8 = Fragger script ptr *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
FragProc:
|
|||
|
move A13,B14
|
|||
|
addi PDATA,B14
|
|||
|
mmfm B14,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 ;load 'em all
|
|||
|
|
|||
|
FrgNoSlp:
|
|||
|
move *A8,A11,L ;get ptr to anim script
|
|||
|
jaz SUCIDE ;no script -> frag process is done
|
|||
|
|
|||
|
movb *A8(FRGCNT),A0 ;Load the fragment count this tick
|
|||
|
sll 27,A0
|
|||
|
srl 27,A0
|
|||
|
jrz FrgSlp ;BR = Count is 0 -> Try sleeping
|
|||
|
|
|||
|
movb *A8(FRGFLG),A10
|
|||
|
btst B_FRGBOG,A10 ;Should we heed the BOG state?
|
|||
|
JRZ FrgNoBogCk ;BR = No
|
|||
|
MOVE @CPUAVG,A14,W
|
|||
|
CMPI 200,A14 ;Are we Bogged?
|
|||
|
JALS SUCIDE ;BR = Yes, cancel the script
|
|||
|
|
|||
|
MOVE @DMAAVG,A14,W
|
|||
|
CMPI 100,A14 ;Are we Bogged?
|
|||
|
JALS SUCIDE ;BR = Yes, cancel the script
|
|||
|
|
|||
|
FrgNoBogCk
|
|||
|
btst B_FRGRND,A10 ;Random fragment count?
|
|||
|
jrz PreFragPLp ;BR = No, use the given value
|
|||
|
callr RAND0 ;Get the random value
|
|||
|
MOVE A0,A0
|
|||
|
jrz FrgSlp ;BR = Count is 0 -> Try sleeping
|
|||
|
PreFragPLp
|
|||
|
move A0,A9
|
|||
|
FragPLp:
|
|||
|
calla GETOBJ ;Grab an object
|
|||
|
jaz SUCIDE ;BR = There are no more, bail out.
|
|||
|
move B0,A3 ;OZVAL
|
|||
|
move A3,*A0(OZVAL),L
|
|||
|
|
|||
|
move *A11,A1,L ;Get the first frame of the animation
|
|||
|
|
|||
|
btst B_FRGPAL,A10 ;Is somebody else providing the pal?
|
|||
|
jrz NoPal ;BR = Yes, then don't stuff
|
|||
|
calla FPSTFOBJ0 ;Initialize object and allocate palette
|
|||
|
jruc DidPal
|
|||
|
NoPal
|
|||
|
calla STFOBJ0 ;Initialize object with no palette
|
|||
|
DidPal
|
|||
|
|
|||
|
orim DMAWNZ,*A0(OCTRL),W ;Setup the correct bitz
|
|||
|
|
|||
|
btst B_FRGNOFLP,A10 ;Should we randomly flip the object?
|
|||
|
jrnz SkFlps ;BR = No. How boring
|
|||
|
movi M_FLIPH|M_FLIPV,A14
|
|||
|
callr RANDFLIP ;Flip it any which way
|
|||
|
SkFlps:
|
|||
|
move A11,*A0(AnimScr),L ;Initialize the animation fields
|
|||
|
move A11,*A0(AnimFrm),L
|
|||
|
clr A1
|
|||
|
movb A1,*A0(AnimSlp)
|
|||
|
|
|||
|
btst B_FRGNOFLY,A10 ;Should we give this frag gravity?
|
|||
|
jrnz NoFly ;BR = No
|
|||
|
movi 02800H,A1
|
|||
|
move A1,*A0(OYACCEL),W ;Stuff a gravity value
|
|||
|
NoFly
|
|||
|
**** btst B_FRGCOL,A10
|
|||
|
**** jrnz SkNoColl
|
|||
|
ORIM M_NOCOLL,*A0(OFLAGS),W ;Object NOT collidable
|
|||
|
****SkNoColl:
|
|||
|
btst B_FRGGCO,A10 ;Make this object ground collidable?
|
|||
|
jrz SkNoGCol ;BR = No
|
|||
|
ORIM M_GCOLL,*A0(OFLAGS),W ;Stuff the ground coll flag
|
|||
|
SkNoGCol:
|
|||
|
calla INSANIM ;Set to animating
|
|||
|
|
|||
|
;*** SET X-POSITION, X-VELOCITY ***
|
|||
|
move B1,A4
|
|||
|
move B2,A5
|
|||
|
move B3,A6
|
|||
|
move B4,A7
|
|||
|
callr FrgPosVl ;rets A1 pos 16., A2 Vel 16.16
|
|||
|
move A1,*A0(OXPOS),W
|
|||
|
move A2,*A0(OXVEL),L
|
|||
|
;*** SET Y-POSITION, Y-VELOCITY ***
|
|||
|
move B5,A4
|
|||
|
move B6,A5
|
|||
|
move B7,A6
|
|||
|
move B8,A7
|
|||
|
callr FrgPosVl ;rets A1 pos 16., A2 Vel 16.16
|
|||
|
move A1,*A0(OYPOS),W
|
|||
|
move A2,*A0(OYVEL),L
|
|||
|
;*** Set Z-Position, Z-velocity
|
|||
|
move B0,A4
|
|||
|
move B0,A5
|
|||
|
move B9,A6
|
|||
|
move B10,A7
|
|||
|
callr FrgPosVl
|
|||
|
move A2,*A0(OZVEL),L
|
|||
|
|
|||
|
move *A8(FRGOID),*A0(OID),W ;Give this thing an I.D.
|
|||
|
|
|||
|
move *A8(FRGFNC),A14,L ;Grab the function vector.
|
|||
|
jrz NoFrgFnc ;Br = No function, No call
|
|||
|
call A14 ;Call the function
|
|||
|
NoFrgFnc:
|
|||
|
calla INSOBJ
|
|||
|
dsj A9,FragPLp
|
|||
|
FrgSlp:
|
|||
|
addi FRGSIZE,A8
|
|||
|
movb *A8(-FRGSIZE+FRGSLP),A0
|
|||
|
sll 27,A0
|
|||
|
srl 27,A0
|
|||
|
jrz FrgNoSlp ;If sleep is 0 -> CONTINUE W/ SCRIPT
|
|||
|
|
|||
|
calla PRCSLP
|
|||
|
jruc FragProc
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
FrgPosVl:
|
|||
|
;A4 min pos
|
|||
|
;A5 max pos
|
|||
|
;A6 min vel
|
|||
|
;A7 max vel
|
|||
|
;RETS A1 pos, A2 vel
|
|||
|
|
|||
|
;IF (min pos = max pos)
|
|||
|
; pos = min pos
|
|||
|
; vel = RANGERND (min vel, max vel)
|
|||
|
;ELSE
|
|||
|
; pos = RANGERND (min pos, max pos)
|
|||
|
;
|
|||
|
; (pos - min pos)
|
|||
|
; vel = min vel + --------------------- * (max vel - min vel) +
|
|||
|
; (max pos - min pos)
|
|||
|
; SRAND ((max vel - min vel)/4)
|
|||
|
PUSH A0
|
|||
|
cmp A4,A5
|
|||
|
jreq FixedPos
|
|||
|
|
|||
|
move A4,A0
|
|||
|
move A5,A1
|
|||
|
callr RANGERND
|
|||
|
move A0,A14 ;A14 = Pos
|
|||
|
sub A4,A0 ;A0 = pos-minpos
|
|||
|
sub A6,A7 ;A7 = maxvel - minvel
|
|||
|
mpys A7,A0
|
|||
|
sub A4,A5 ;A5 = maxpos-minpos
|
|||
|
divs A5,A0
|
|||
|
add A6,A0 ;A0 = top line of vel func above
|
|||
|
|
|||
|
;DO SRAND PORTION OF VEL FUNC
|
|||
|
move A0,A2
|
|||
|
move A14,A1
|
|||
|
sra 2,A7
|
|||
|
move A7,A0
|
|||
|
abs A0
|
|||
|
callr SRAND
|
|||
|
add A0,A2
|
|||
|
jruc FrgPVX
|
|||
|
FixedPos:
|
|||
|
move A6,A0
|
|||
|
move A7,A1
|
|||
|
callr RANGERND
|
|||
|
move A0,A2
|
|||
|
move A4,A1
|
|||
|
FrgPVX:
|
|||
|
move A1,A4
|
|||
|
move A2,A0
|
|||
|
movi 60000H,A1
|
|||
|
callr ABSMAX
|
|||
|
move A0,A2
|
|||
|
move A4,A1
|
|||
|
|
|||
|
PULLQ A0
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* RANDFLIP
|
|||
|
* A0 OBJ
|
|||
|
* A14 M_FLIPH or M_FLIPV or both
|
|||
|
RANDFLIP
|
|||
|
mmtm sp,a3,a4
|
|||
|
move @RAND,a4,W
|
|||
|
and a14,a4
|
|||
|
move *a0(OCTRL),a3,W
|
|||
|
andn a14,a3
|
|||
|
or a4,a3
|
|||
|
move a3,*a0(OCTRL),W
|
|||
|
mmfm sp,a3,a4
|
|||
|
rets
|
|||
|
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
MAX:
|
|||
|
;* returns max of A0,A1 in A0
|
|||
|
cmp A1,A0
|
|||
|
jrge GotMax
|
|||
|
move A1,A0
|
|||
|
GotMax:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
MIN:
|
|||
|
;* returns min of A0,A1 in A0
|
|||
|
cmp A1,A0
|
|||
|
jrle GotMin
|
|||
|
move A1,A0
|
|||
|
GotMin:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* With a pos or neg value if neg must be < -X
|
|||
|
* if pos must be > X
|
|||
|
ABSMIN:
|
|||
|
;parm A1 must be pos
|
|||
|
;A0 will be negated if A1 is neg
|
|||
|
move A0,A0
|
|||
|
jrn NegMinE
|
|||
|
cmp A1,A0
|
|||
|
jrge MINOKE
|
|||
|
move A1,A0
|
|||
|
rets
|
|||
|
NegMinE:
|
|||
|
neg A1
|
|||
|
cmp A1,A0
|
|||
|
jrle MINOKE
|
|||
|
move A1,A0
|
|||
|
MINOKE:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ABSMAX:
|
|||
|
;* returns A0 Clipped at the value A1 in either pos or neg direction
|
|||
|
;parm A1 must be pos
|
|||
|
;A0 will be negated if A1 is neg
|
|||
|
move A0,A0
|
|||
|
jrn NegMax
|
|||
|
cmp A1,A0
|
|||
|
jrle MAXOK
|
|||
|
move A1,A0
|
|||
|
rets
|
|||
|
NegMax:
|
|||
|
neg A1
|
|||
|
cmp A1,A0
|
|||
|
jrge MAXOK
|
|||
|
move A1,A0
|
|||
|
MAXOK:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ABSINC:
|
|||
|
move A0,A0
|
|||
|
jrn DECX
|
|||
|
inc A0
|
|||
|
rets
|
|||
|
DECX:
|
|||
|
dec A0
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ABSDEC:
|
|||
|
move A0,A0
|
|||
|
jrz ABSDECX
|
|||
|
jrn INCX
|
|||
|
dec A0
|
|||
|
rets
|
|||
|
INCX:
|
|||
|
inc A0
|
|||
|
ABSDECX:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ABSSUB:
|
|||
|
;* absolutely subtracts A1 from A0, A0 can't change signs
|
|||
|
move A0,A0
|
|||
|
jrz ABSSUBX
|
|||
|
jrn SUBX
|
|||
|
sub A1,A0
|
|||
|
jrp SUBX1
|
|||
|
clr A0
|
|||
|
SUBX1:
|
|||
|
rets
|
|||
|
SUBX:
|
|||
|
add A1,A0
|
|||
|
jrn SUBX2
|
|||
|
clr A0
|
|||
|
SUBX2:
|
|||
|
ABSSUBX:
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ABSADD:
|
|||
|
;* absolutely ADD A1 to A0
|
|||
|
move A0,A0
|
|||
|
jrn ADDX
|
|||
|
add A1,A0
|
|||
|
rets
|
|||
|
ADDX:
|
|||
|
sub A1,A0
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
MpyVel:
|
|||
|
;A0 16.16 val to multiply velocity by
|
|||
|
mmtm SP,A2,A3
|
|||
|
|
|||
|
move *A8(OXVEL),A2,L
|
|||
|
mpys A0,A2 ;A2 16.16, A0 16.16
|
|||
|
sll 16,A2 ;16 bit mantissa
|
|||
|
srl 16,A3 ;16 frac
|
|||
|
movy A2,A3 ;16.16 result
|
|||
|
move A3,*A8(OXVEL),L
|
|||
|
|
|||
|
move *A8(OYVEL),A2,L
|
|||
|
mpys A0,A2 ;A2 16.16, A0 16.16
|
|||
|
sll 16,A2 ;16 bit mantissa
|
|||
|
srl 16,A3 ;16 frac
|
|||
|
movy A2,A3 ;16.16 result
|
|||
|
move A3,*A8(OYVEL),L
|
|||
|
|
|||
|
mmfm SP,A2,A3
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
MpyXVel:
|
|||
|
;A0 16.16 val to multiply velocity by
|
|||
|
mmtm SP,A2,A3
|
|||
|
move *A8(OXVEL),A2,L
|
|||
|
mpys A0,A2 ;A2 16.16, A0 16.16
|
|||
|
sll 16,A2 ;16 bit mantissa
|
|||
|
srl 16,A3 ;16 frac
|
|||
|
movy A2,A3 ;16.16 result
|
|||
|
move A3,*A8(OXVEL),L
|
|||
|
mmfm SP,A2,A3
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
MpyYVel:
|
|||
|
mmtm SP,A2,A3
|
|||
|
move *A8(OYVEL),A2,L
|
|||
|
mpys A0,A2 ;A2 16.16, A0 16.16
|
|||
|
sll 16,A2 ;16 bit mantissa
|
|||
|
srl 16,A3 ;16 frac
|
|||
|
movy A2,A3 ;16.16 result
|
|||
|
move A3,*A8(OYVEL),L
|
|||
|
mmfm SP,A2,A3
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
ALL_COLLS_OFF:
|
|||
|
;REALLY MAKE SURE PART CAN NO LONGER COLLIDE
|
|||
|
;A8 ptr to OBJ
|
|||
|
PUSH A0
|
|||
|
move A8,A0
|
|||
|
COLLSOFFLP
|
|||
|
callr COLLSOFF
|
|||
|
move *A0(OPARTS),A0,L
|
|||
|
jrnz COLLSOFFLP
|
|||
|
PULLQ A0
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
COLLS_OFF:
|
|||
|
;REALLY MAKE SURE PART CAN NO LONGER COLLIDE
|
|||
|
;A8 ptr to OBJ
|
|||
|
;OLD PUSH A0
|
|||
|
;OLD move A8,A0
|
|||
|
;OLD callr COLLSOFF
|
|||
|
;OLD PULLQ A0
|
|||
|
;OLD rets
|
|||
|
|
|||
|
ORIM M_NOCOLL,*A8(OFLAGS),W
|
|||
|
CLRM *A8(OCVECT),L
|
|||
|
move a14,*A8(OGUNVECT),L
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
COLLSOFF:
|
|||
|
;MAKE COMPLETELY SURE PART CAN NO LONGER COLLIDE
|
|||
|
;A0 ptr to OBJ
|
|||
|
ORIM M_NOCOLL,*A0(OFLAGS),W
|
|||
|
CLRM *A0(OCVECT),L
|
|||
|
move a14,*A0(OGUNVECT),L
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SET_VECTORS - SET GUN AND COLLISION VECTORS OF HEAD AND PARTS *
|
|||
|
* *
|
|||
|
* PASS: *
|
|||
|
* A1 = GUNVECT *
|
|||
|
* A2 = CVECT *
|
|||
|
* A8 = HEAD OBJECT *
|
|||
|
* *
|
|||
|
* RETURN: *
|
|||
|
* NUTIN' *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
SET_VECTORS
|
|||
|
PUSH A0
|
|||
|
MOVE A8,A0
|
|||
|
SV_LUPE
|
|||
|
MOVE A1,*A0(OGUNVECT),L ;GUN VECTOR
|
|||
|
MOVE A2,*A0(OCVECT),L ;COLLISION VECTOR
|
|||
|
MOVE *A0(OPARTS),A0,L
|
|||
|
JRNZ SV_LUPE ;BR = YET ANOTHER PART
|
|||
|
PULLQ A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PASTE_ON_DAMAGE *
|
|||
|
* PASTE_ON_DAMAGE_XYZ *
|
|||
|
* *
|
|||
|
* Paste on a piece of damage to an object. This piece will *
|
|||
|
* become part of the multi-parter. Animation pnt of damage *
|
|||
|
* will be set at the current cursor pnt of the gun causing *
|
|||
|
* the damage. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player that did damage *
|
|||
|
* A8 = Object to paste damage onto *
|
|||
|
* B0 = Ptr to init table of damage piece *
|
|||
|
* *
|
|||
|
* NOTE: *
|
|||
|
* PASTE_ON_DAMAGE_XYZ DOES NOT USE THE CURSOR POSITION YOU MUST ALSO *
|
|||
|
* PROVIDE: *
|
|||
|
* A3 = UNIVERSE Z OF OBJECT TO PASTE ONTOP *
|
|||
|
* A5 = UNIVERSE X *
|
|||
|
* A9 = UNIVERSE Y *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* *
|
|||
|
* B0 = Pointing to the next word after init table *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PASTE_ON_DAMAGE_XYZ
|
|||
|
MMTM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
MMTM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
JRUC POD_XYZ
|
|||
|
PASTE_ON_DAMAGE
|
|||
|
MMTM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
MMTM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
|
|||
|
MOVE *A8(OZVAL),A3,L ;Make point Universe rel. at this Z
|
|||
|
|
|||
|
MOVE *A2(PCURSORXY),A9,L ;Get [Y,X] Screen relative point.
|
|||
|
MOVX A9,A5
|
|||
|
SEXT A5
|
|||
|
SRA 16,A9 ;Now we have 16.16 screen X
|
|||
|
|
|||
|
STOUXY A3,A5,A9 ;Use that funky Bill macro to convert
|
|||
|
POD_XYZ
|
|||
|
CALLA EASYMAKE
|
|||
|
JRZ POD_X ;BR = Creation failed, exit.
|
|||
|
|
|||
|
MOVE A5,A1 ;UNIVERSE X
|
|||
|
MOVE A9,A2 ;UNIVERSE Y
|
|||
|
SUBK 32,A3 ;ADJUST UNIVERSE Z
|
|||
|
|
|||
|
CALLA SETANIPU
|
|||
|
|
|||
|
CALLA INSPART
|
|||
|
|
|||
|
CALLA INSOBJ
|
|||
|
POD_X
|
|||
|
MMFM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
MMFM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PASTE_ON_DAMAGE_OFFSET *
|
|||
|
* PASTE_ON_DAMAGE_OFFSET_XYZ *
|
|||
|
* *
|
|||
|
* Paste on a piece of damage to an object. This piece will *
|
|||
|
* become part of the multi-parter. Animation pnt of damage *
|
|||
|
* will be set at the current cursor pnt of the gun causing *
|
|||
|
* the damage. OZOFF AND OPARTSXY WILL ALSO BE SET. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player that did damage *
|
|||
|
* A8 = Object to paste damage onto *
|
|||
|
* B0 = Ptr to init table of damage piece *
|
|||
|
* *
|
|||
|
* NOTE: *
|
|||
|
* PASTE_ON_DAMAGE_OFFSET_XYZ DOES NOT USE THE CURSOR POSITION YOU MUST *
|
|||
|
* ALSO PROVIDE: *
|
|||
|
* A5 = UNIVERSE X *
|
|||
|
* A9 = UNIVERSE Y *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* *
|
|||
|
* B0 = Pointing to the next word after init table *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
PASTE_ON_DAMAGE_OFFSET_XYZ
|
|||
|
MMTM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
MMTM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
CALLA GET_HEAD_PART
|
|||
|
MOVE *A8(OZVAL),A3,L ;Make point Universe rel. at this Z
|
|||
|
JRUC PODO_XYZ
|
|||
|
PASTE_ON_DAMAGE_OFFSET
|
|||
|
MMTM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
MMTM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
|
|||
|
CALLA GET_HEAD_PART
|
|||
|
|
|||
|
MOVE *A8(OZVAL),A3,L ;Make point Universe rel. at this Z
|
|||
|
|
|||
|
MOVE *A2(PCURSORXY),A9,L ;Get [Y,X] Screen relative point.
|
|||
|
MOVX A9,A5
|
|||
|
SEXT A5
|
|||
|
SRA 16,A9 ;Now we have 16.16 screen X
|
|||
|
|
|||
|
STOUXY A3,A5,A9 ;Use that funky Bill macro to convert
|
|||
|
PODO_XYZ
|
|||
|
CALLA EASYMAKE
|
|||
|
JRZ PODO_X ;BR = Creation failed, exit.
|
|||
|
|
|||
|
MOVE *A8(OXVAL),A1,L
|
|||
|
SUB A1,A5 ;X WORLD OFFSET
|
|||
|
SRA 15,A5 ;X SCREEN OFFSET
|
|||
|
|
|||
|
MOVE *A8(OYVAL),A2,L
|
|||
|
SUB A2,A9 ;Y WORLD OFFSET
|
|||
|
SRA 15,A9 ;Y SCREEN OFFSET
|
|||
|
SLL 16,A9
|
|||
|
MOVY A9,A5 ;OPARTSXY
|
|||
|
|
|||
|
MOVE *A8(OPARTSXY),A14,L
|
|||
|
ADD A14,A5 ;FROM OPARTSXY OF HEAD
|
|||
|
MOVE A5,*A0(OPARTSXY),L
|
|||
|
|
|||
|
MOVB *A8(OZOFF),A14
|
|||
|
SUBK 32,A14 ;FROM OZOFF OF HEAD
|
|||
|
MOVB A14,*A0(OZOFF)
|
|||
|
|
|||
|
CALLA SETOFFPU
|
|||
|
|
|||
|
CALLA INSPART
|
|||
|
|
|||
|
CALLA INSOBJ
|
|||
|
PODO_X
|
|||
|
MMFM SP,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
|||
|
MMFM SP,A0,A1,A2,A3,A5,A8,A9
|
|||
|
RETS
|
|||
|
|
|||
|
|
|||
|
.END
|
|||
|
|
|||
|
|