nba-hangtime/DOC/NDSP1.DOC

777 lines
20 KiB
Plaintext
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.

STOPOBJS STOPOBJS
Description: Zero velocities of all objects on OBJLST
------------------------------------------------------------------------------
Input: none
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
STOPOBJS
MMTM SP,A0,A1
CLR A0
MOVI OBJLST,A1
SOBJS1
MOVE *A1,A1,L
JREQ SOBJSX
MOVE A0,*A1(OXVEL),L
MOVE A0,*A1(OYVEL),L
MOVE A0,*A1(OZVEL),L
JRUC SOBJS1
SOBJSX
MMFM SP,A0,A1
RETS
SHADST SHADST
Description: Start a shadow
------------------------------------------------------------------------------
Input: A8 --> object to shadow
Returns: A0 --> shadow obj (zero if no shadow was created)
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*START A SHADOW
*INPUTS
*A8=OBJECT TO SHADOW
*RETURNS:
*A0=PTR TO SHADOW, OR 0 IF NO SHADOW WAS CREATED
*
SHADST:
MMTM SP,A1
CALLR GETOBJ
JREQ SHADSTX ;NONE AVAIL
CALLR SHADCPY
SHADSTG
MOVI DUMCOLL,A1
MOVE A1,*A0(OCVECT),L ;DUMMY COLLISION
CALLR INSOBJ
MOVI OID_SHAD,A1,W
MOVE A1,*A0(OID),W ;SET ID
MOVI >FDFD0000,A1
MOVE A1,*A0(OPAL),L ;SET PALLETTE,COLOR
MOVE A8,*A0(OSHAD),L ;LINK TO SHADOWED OBJECT
MOVE A0,*A8(OSHAD),L ;LINK TO SHADOW
SHADSTX:
MMFM SP,A1
RETS
DFRMGRND DFRMGRND
Description: Calculate an objects distance from the ground
------------------------------------------------------------------------------
Input: A8 --> object
Returns: A1 = distance from the ground
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*
*CALC DISTANCE FROM GROUND
*A8=OBJECT
*A1 RET WITH HT ABOVE GROUND
*
DFRMGRND
PUSH A2
MOVE *A8(OSIZEY),A2,W
MOVE *A8(OYPOS),A1,W
ADD A2,A1
NEG A1
MMFM SP,A2
RETS
GETOBJ GETOBJ
Description: Get a free object block for use
------------------------------------------------------------------------------
Input: none
Returns: A0 --> object block
Z bit set if no blocks were available
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* GETOBJ - GET A FREE OBJECT BLOCK FOR USE *
* RETURNS *
* A0 = PTR TO OBJECT BLOCK *
* IF NO BLOCKS WERE AVAILABLE THEN THE Z FLAG IS SET *
* *
**************************************************************************
GETOBJ:
MMTM SP,A1,A2
MOVE @OFREE,A0,L ; pointer to next available obj block
jreq getox
move *A0,A2,L
move A2,@OFREE,L ; adjust pointer to free list
CLR A2 ; CLEAR OUT THE SHIT
MOVI (OBSIZ/16)-2,A1
ADDK 32,A0
SRL 1,A1
JRNC GETOBJ1
MOVE A2,*A0+,W
GETOBJ1
MOVE A2,*A0+,L
DSJS A1,GETOBJ1
SUBI OBSIZ,A0 ;RESTORE A0, SET NON ZERO FLAG
getox:
MMFM SP,A1,A2 ;DONT SCREW UP Z-FLAG
RETS
FREEOBJ FREEOBJ
Description: Put an object block back on the FREE list
------------------------------------------------------------------------------
Input: A0 --> object block
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
FREEOBJ
PUSH A2
MOVE @OFREE,A2,L
MOVE A2,*A0,L
MOVE A0,@OFREE,L ;BLOCK IS ON FREE LIST NOW
PULL A2
RETS
INSOBJ INSOBJ
Description: Insert an object block onto the OBJECT LIST
------------------------------------------------------------------------------
Input: A0 --> object block
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*INSERT FOREGROUND OBJECT
INSOBJ:
mmtm sp,a1,a2,a3,a4,a5
movi OBJLST,a4
INSOBJ0:
move *A0(OZVAL),A1,L ; GET Z POSITION
MOVE *A0(OYVAL),A5,L ; GET Y POSITION
ins_loop:
move a4,a2 ; ptr to PREV in a2
move *a2,a4,L ; ptr to NEXT in a4
jreq INS_AT_END ; bra if at end of list
MOVE *A4(OZVAL),A3,L ; ZPOS in A3
CMP A3,A1
jrgt ins_loop
JRLT INS_AT_END
MOVE *A4(OYVAL),A3,L ;TEST Y POSITION
CMP A3,A5
JRGT ins_loop
INS_AT_END:
move a4,*a0,L ; put NEXT link in new block
move a0,*a2,L ; put link to new in PREV block
mmfm sp,a1,a2,a3,a4,a5
rets
DELOBJ DELOBJ
Description: Delete an object block from the object list
------------------------------------------------------------------------------
Input: A0 --> object block to delete
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*DELETE FOREGROUND OBJECT
DELOBJ:
MMTM SP,A0,A2,A3,A4,A8
MOVI OBJLST,A4
del_loop:
move a4,a2 ; ptr to PREV in a2
move *a2,a4,L ; ptr to NEXT in a4
JRNZ DEL_CHK
LOCKUP
* CALLERR 5 ;REPORT THE PROBLEM
JRUC DELOBJX
***no_del:
*** jreq no_del ; ERROR if at end of list (HANG UP)
DEL_CHK
cmp a4,a0
jrne del_loop
move *a0,*a2,L ; put NEXT link in PREV block
move @OFREE,a2,L
move a2,*a0,L
move a0,@OFREE,L ; Return deleted block to free stack
DELOBJX
MMFM SP,A0,A2,A3,A4,A8
RETS
KILOBJ KILOBJ
Description: Kill a class from the object list
------------------------------------------------------------------------------
Input: A0 = object id (16 bits)
A1 = mask (16 bits)
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*KILL A CLASS FROM THE OBJECT LIST
KILOBJ:
MMTM SP,A0,A2,A3,A4,A5
MOVI OBJLST,A2,L
KILGEN
AND A1,A0 ;FORM MATCH
KILOBP:
MOVE A2,A3 ;SAVE PREVIOUS
MOVE *A2,A2,L ;GET NEXT
JREQ KILOBX ;ALL DONE
MOVE *A2(OID),A4
AND A1,A4 ;CAN DONT CARE BITS
CMP A0,A4 ;MATCH?
JRNE KILOBP ;NO
MOVE *A2,*A3,L ;LINK AROUND IN ACTIVE LIST
MOVE @OFREE,A5,L ;LINK INTO FREE LIST AT START
MOVE A5,*A2,L
MOVE A2,@OFREE,L ;POINT FREE TO CELL
MOVE A3,A2
JRUC KILOBP ;KILL THE REST
KILOBX:
MMFM SP,A0,A2,A3,A4,A5
RETS
EXISTOBJ EXISTOBJ
Description: Does an object from a certain class exist ?
------------------------------------------------------------------------------
Input: A0 = object ID (16 bits)
A1 = mask bits (16 bits, where 0 = DONT CARE)
Returns: A0 --> object (Z bit clear)
A0 = 0 means there is no object (Z bit set)
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
EXISTOBJ:
MMTM SP,A2,A3
SEXT A0
MOVI OBJLST,A2,L
AND A1,A0 ;FORM MATCH
EXISTOBP:
MOVE *A2,A2,L ;GET NEXT
JREQ EXISTOBX ;ALL DONE
MOVE *A2(OID),A3,W
AND A1,A3 ;CAN DONT CARE BITS
CMP A0,A3 ;MATCH?
JRNE EXISTOBP ;NO
EXISTOBX:
MOVE A2,A0
MMFM SP,A2,A3
RETS
MAKOBJ MAKOBJ
Description: Handy way to create an object
------------------------------------------------------------------------------
Input: a14 --> initialization table
Returns: Z bit clear = success !!
Z bit set = failure
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*
*MAKE AN OBJECT
*RETURN(S)
*A0 = OBJECT BLOCK PTR
*A14 = POINTS TO THE INITIALIZATION TABLE
*
MAKOBJ CALLA GETOBJ
JRZ MAKOBX ;NONE LEFT
CALLR STFOBJ
CALLR INSOBJ
MOVE A0,A0 ;RETURN NON-ZERO
MAKOBX RETS
GETSCRNREL GETSCRNREL
Description: Get screen relative X,Y coordinates of an object
------------------------------------------------------------------------------
Input: A0 --> object block
Returns: A1 = x relative value (32 bits)
A2 = y relative value (32 bits)
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* GSCRNREL - GET THE SCREEN RELATIVE X,Y COORDINATES OF AN OBJECT *
* IT IS ASSUMED THATE THE CURRENT X,Y COORDINATES ARE *
* WORLD ABSOLUTE. *
* A0 = PTR TO THE OBJECT BLOCK *
* RETURNS *
* A1 = X SCREEN RELATIVE, 32 BITS *
* A2 = Y SCREEN RELATIVE, 32 BITS *
* *
**************************************************************************
GSCRNREL
PUSH A5
MOVE @WORLDTLX,A5,L
MOVE *A0(OXVAL),A1,L
SUB A5,A1
MOVE @WORLDTLY,A5,L
MOVE *A0(OYVAL),A2,L
SUB A5,A2
PULL A5
RETS
SCRNRELV SCRNRELV
Description: Make X and Y velocities of an object releative to the screen
------------------------------------------------------------------------------
Input: A0 --> object
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* SCRNRELV - MAKE THE X & Y VELOCITIES OF AN OBJECT RELATIVE TO THE *
* SCREEN. IN OTHER WORDS, ADJUST THEM SO THAT THE CURRENT *
* SCROLL RATE DOESN'T AFFECT THEM. *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
SCRNRELV
MMTM SP,A1,A5
MOVE @SCROLLX,A5,L
MOVE *A0(OXVEL),A1,L
ADD A5,A1
MOVE A1,*A0(OXVEL),L
MOVE @SCROLLY,A5,L
MOVE *A0(OYVEL),A1,L
ADD A5,A1
MOVE A1,*A0(OYVEL),L
MMFM SP,A1,A5
RETS
GANISAG GANISAG
Description: Adjust current object image with respect to its animation
point and flip flags.
------------------------------------------------------------------------------
Input: A0 --> object block
A2 = new OYVAL
A3 = new OXVAL
A4 = new flags
Returns: A2 = adjusted OYVAL
A3 = adjusted OXVAL
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* GANISAG - ADJUST CURRENT OBJECT IMAGE WITH RESPECT TO IT'S *
* ANIMATION PNT. AND FLIP FLAGS *
* NOTE: CALL ONLY AFTER INITIALIZING WITH STFOBJ, OR SOMETHING. *
* A0 = PTR TO OBJECT BLOCK *
* A2 = NEW OYVAL *
* A3 = NEW OXVAL *
* A4 = NEW FLAGS *
* RETURNS *
* A2 = ADJUSTED OYVAL *
* A3 = ADJUSTED OXVAL *
* *
**************************************************************************
GANISAG
MMTM SP,A1,A4,A6,A7
MMTM SP,A2,A3
MOVE *A0(OIMG),A1,L
CALLR GSAGOF
MOVE A3,*A0(OSAG),L
MOVE A2,*A0(OSIZE),L
MOVE A4,*A0(OFLAGS),L
CALLR GANIOF
MMFM SP,A2,A3
SUB A6,A3
SUB A7,A2 ;ADJUST UPPER LEFT CORNER
MOVE A3,*A0(OXVAL),L
MOVE A2,*A0(OYVAL),L
MMFM SP,A1,A4,A6,A7
RETS
STRTOBJ STRTOBJ
Description: Create an object using an initialization table
------------------------------------------------------------------------------
Input: A0 ---> object block
A14 --> initialization table
Returns: A14 --> end of the initialization table
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* STRTOBJ - START AN OBJECT USING AN INITIALIZATION TABLE *
* A0 = PTR TO THE IMAGE *
* A14 = PTR TO INIT. TABLE *
* *
* START OBJECT INIT. TABLE FORMAT *
* .WORD X,Y,Z *
* .LONG OIMG,OZSIZ,OCVECT *
* .WORD OFLAGS,OID *
* *
* RETURNS A14 = POINTING TO WORD AFTER INIT TAB *
* *
**************************************************************************
STRTOBJ
MMTM SP,A1,A2,A3,A4,A6,A7,A9,A10
MOVE *A14+,A9,W ;GET OXPOS
SLL 16,A9 ;CONVERT TO OXVAL
MOVE *A14+,A10,W ;GET OYPOS
SLL 16,A10 ;CONVERT TO OYVAL
MOVE *A14+,A1,W
MOVE A1,*A0(OZPOS),W
JRUC STFOBJ0
GSAGOF GSAGOF
Description: Get SAG for an object
------------------------------------------------------------------------------
Input: A1 --> OIMG
A4 = flags
Returns: A2 = new OSIZE
A3 = new SAG
A4 = new offset:flags
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
GSAGOF:
MMTM SP,A5,A6,A7
ZEXT A4,W ;ZERO OFFSET IN A4
MOVE *A1(ISAG),A3,L ;GET TOP LEFT SAG
MOVE *A1(ISIZE),A2,L
CLR A5
MOVX A2,A5
ADDK 3,A5 ;ADJUST HOR SIZE FOR MORSEL
SRL 2,A5
SLL 2,A5
MOVX A5,A2
SLL 3,A5 ;ADJUST FOR BYTE ADDRESS
*HORIZONTAL FLIP CASE
GSAGH:
BTST B_FLIPH,A4
JREQ GSAGV ;NO H FLIP, TRY VERT FLIP
MOVE A5,A6
SUBK 8,A6
ADD A6,A3 ;ADD THS-1 TO SAG
MOVX A2,A6
SLL 1,A6
DEC A6 ;2*THS-1 TO OFFSET
SLL 16,A6 ;ADJUST FOR B16-31
ADDXY A6,A4
*VERTICAL FLIP CASE
GSAGV:
BTST B_FLIPV,A4
JREQ GSAGX ;NO VERT FLIP
MOVY A2,A6 ;GET HEIGHT
SRL 16,A6
DEC A6 ;FIRST ENTRY LAST ROW
MOVE A5,A7 ;GET THS
MPYS A6,A7 ;THS*(TVS-1)
ADD A7,A3 ;ADD TO SAG
MOVX A2,A6
SLL 1,A6
NEG A6 ;-2*THS
SLL 16,A6 ;ADJUST FOR B16-31
ADDXY A6,A4 ;ADD TO OFFSET
GSAGX:
MMFM SP,A5,A6,A7
RETS
ANI ANI
Description: Animation Subroutine
------------------------------------------------------------------------------
Input: A1 = new image pointer
A4 = new flags
A8 = object structure to be updated
Returns: none
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
ANI0: ;ENTRY FOR NO REPEAT CHECK
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A9,A11
CLR A11
MOVE *A8(OFLAGS),A5,W
MOVE *A8(OIMG),A2,L
JRUC ANIG1
ANI:
MMTM SP,A0,A2,A3,A4,A5,A6,A7,A9,A11
CLR A11
ANIG
MOVE *A8(OFLAGS),A5,W
MOVE *A8(OIMG),A3,L
CMP A1,A3
JRNE ANIG1 ; BR = NOT THE SAME IMAGE AS LAST TIME
ZEXT A4
ZEXT A5
CMP A4,A5
JREQ ANIG2 ;BR = EVERY THING IS THE SAME
ANIG1
SWAP A4,A5
SWAP A1,A3
MOVE *A8(OSIZE),A2,L
CALLR GANIOF ;GET OLD ANIMATION OFFSET
MMTM SP,A6,A7
MOVE A5,A4 ;NEW OFLAGS
MOVE A3,A1 ;NEW OIMG
CALLR GSAGOF ;GET SAG, OFFSET, HW
CALLR GANIOF ;GET NEW ANIMATION OFFSET
MMFM SP,A0,A5 ;BRING BACK OLD ANIMATION DELTA
SUB A6,A0 ;SUBTRACT NEW FROM OLD
SUB A7,A5
MOVE A8,A9 ;GET PUSH ADDRESS OF OFLAGS,OSAG,OSIZE
ADDI OFLAGS+>60,A9
CLR A7
MOVE A7,*A8(OXCLIP),W ;CLEAR PRECLIP
MMTM A9,A2,A3,A4 ;BLOW THIS STUFF OUT
MOVE A1,*A8(OIMG),L
MOVE *A8(OYVAL),A6,L
ADD A5,A6 ;ADJUST OYVAL, OXVAL FOR DELTA X
MOVE A6,*A8(OYVAL),L
MOVE *A8(OXVAL),A7,L
ADD A0,A7
MOVE A7,*A8(OXVAL),L
MOVE *A8(OSHAD),A0,L
JREQ ANINSHD ;BR = NO SHADOWS HERE
MOVE A11,A11 ;CHECK A11
JREQ ANISHAD
CALLR SHADCPY2 ;SHADOW FOR PART 2
JRUC ANINSHD
ANISHAD
CALLR SHADCPY ;SHADOW FOR PART 1
ANINSHD
ANIGX
MMFM SP,A0,A2,A3,A4,A5,A6,A7,A9,A11
RETS
ANIG2
MOVE *A8(OSHAD),A0,L
JREQ ANINSHD ;BR = NO SHADOWS HERE
* MOVE *A8(OZVEL),*A0(OYVEL),L
MOVE *A8(OZVEL),*A0(OZVEL),L
MOVE *A8(OXVEL),*A0(OXVEL),L ;COPY JUST THE VELOCITIES
JRUC ANIGX
GETANIXY GETANIXY
Description: Get the X and Y positions of an objects animation point
------------------------------------------------------------------------------
Input: A8 --> object block
Returns: A2 = animation point X value
A3 = animation point Y value
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
**************************************************************************
* *
* GETANIXY - GET THE X AND Y POSITIONS OF AN OBJECTS ANIMATION *
* POINT. *
* A8 = OBLOCK PTR. *
* RETURNS *
* A2 = APOINT OYVAL, 32 BITS *
* A3 = APOINT OXVAL, 32 BITS *
* *
**************************************************************************
GETANIXY
MMTM SP,A1,A4,A6,A7
MOVE *A8(OIMG),A1,L
MOVE *A8(OSIZE),A2,L
MOVE *A8(OFLAGS),A4,W
CALLR GANIOF
MOVE *A8(OXVAL),A3,L
MOVE *A8(OYVAL),A2,L
ADD A6,A3
ADD A7,A2
MMFM SP,A1,A4,A6,A7
RETS
GANIOF GANIOF
Description: Get animation offset
------------------------------------------------------------------------------
Input: A1 = OIMG
A2 = H:W
A4 = OFLAGS
Returns: A6 = X animation offset*64k
A7 = Y animation offset*64k
Found in: NDSP1.ASM
------------------------------------------------------------------------------
Comments:
*
*GET ANIMATION OFFSET
*A1=OIMG, A2=H:W, A4=OFLAGS
*
*OUTPUT:
*A6=X ANIMATION OFFSET X 64K
*A7=Y ANIMATION OFFSET X 64K
GANIOF:
MMTM SP,A2,A3
MOVE *A1(IANIOFF),A6,L
CLR A7 ;MAKE SURE A7 IS 0
MOVY A6,A7
SLL 16,A6 ;MOVE TO UPPER WORD
SUBI >00010001,A2 ;ADJUST FOR -1
CLR A3
MOVY A2,A3
SLL 16,A2 ;MOVE TO UPPER WORD
BTST B_FLIPH,A4
JRZ GANI1
NEG A6
ADD A2,A6 ;SUB THS-1 FOR H-FLIP
GANI1:
BTST B_FLIPV,A4
JRZ GANI2
NEG A7
ADD A3,A7 ;SUB TVS-1 FOR V-FLIP
GANI2:
MMFM SP,A2,A3
RETS