nba-hangtime/DOC/NDSP1.DOC

777 lines
20 KiB
Plaintext
Raw Permalink Normal View History

2021-04-06 14:43:14 -07:00
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