total-carnage/BACKUP/FBUTIL.ASM

1872 lines
51 KiB
NASM
Raw Normal View History

2021-04-06 15:15:31 -07:00
.FILE 'UTIL.ASM'
.TITLE " <<< FOOTBALL GENERAL PURPOSE SUBROUTINES >>>"
**************************************************************************
* *
* COPYRIGHT (C) 1988 WILLIAMS ELECTRONICS GAMES, INC. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.WIDTH 132
.OPTION B,D,L
.MNOLIST
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "SYSEQU.ASM" ;SYS.INC and GSP.INC
.INCLUDE "MACROS.HDR" ;Macros, Yeah!
.INCLUDE "MAINEQU.ASM"
.INCLUDE IMGTBL.GLO
.EVEN
.TEXT
*EUGENE'S SCORE ROUTINES
*
*BCD ADD ROUTINE
*A0=SCORE (8 DIGIT BCD) 32 BITS
*A1=NUMBER TO ADD TO A0 (8 DIGIT BCD)
*PACKED BCD FORMAT 4-BITS/ DIGIT
BCDADD:
MMTM SP,A1,A3,A4,A5,A6
MOVK 8,A5 ;DO 8 DIGITS
CLRC ;CLEAR THE CARRY
MOVK 0Ah,A6
BCDLP:
MOVK 0Fh,A3
MOVK 0Fh,A4
AND A1,A3 ;MASK GARBAGE
AND A0,A4
ADDC A3,A4
CMP A6,A4 ;NEED TO ADJUST?
JRLO BCDAD1
ADDK 6,A4
SRL 4,A0
SLL 28,A4
ADD A4,A0
SRL 4,A1
SETC
DSJS A5,BCDLP
JRUC BCDADX
BCDAD1:
SRL 4,A0
SLL 28,A4
ADD A4,A0
SRL 4,A1
CLRC
DSJS A5,BCDLP
BCDADX:
MMFM SP,A1,A3,A4,A5,A6
RETS
*
*PLAYER SCORE ROUTINE
*A1=SCORE VALUE
*A2=PLAYER INDEX
;SCORE:
; MMTM SP,A0,A2
; MOVE @GSTATE,A0,W
; CMPI INAMODE,A0
; JREQ SCOREX ;NO SCORING IN ATTRACT MODE
; MOVE *A2(PSCORE),A0,L ;GET SCORE
; CALLR BCDADD ;ADD IN NEW VALUE
; CALLR REPCK ;CHECK REPLAY
; MOVE A0,*A2(PSCORE),L ;STORE SCORE
;* CALLR OUTSCR ;OUTPUT CURRENT PLAYER SCORE
;SCOREX
; MMFM SP,A0,A2
; RETS
;
;*
;*PLAYER SCORE IMMEADIATE ROUTINE, DOESN'T WAIT FOR SCORE REFRESH
;*DO NOT USE THIS DURING HEAVY GAME ACTION PLEASE
;*A1=SCORE VALUE
;*A2=PLAYER INDEX
;SCRIMM:
; MMTM SP,A0,A2
; MOVE @GSTATE,A0,W
; CMPI INAMODE,A0
; JREQ SCRIMMX ;NO SCORING IN ATTRACT MODE
; MOVE *A2(PSCORE),A0,L ;GET SCORE
; CALLR BCDADD ;ADD IN NEW VALUE
; MOVE A0,*A2(PSCORE),L ;STORE SCORE
; CALLR OUTSCR ;OUTPUT CURRENT PLAYER SCORE
;SCRIMMX
; MMFM SP,A0,A2
; RETS
;*
;*OUTPUT SCORE TO SCREEN
;*A0=CURRENT PLAYER SCORE
;*A2=PLINDX=PLAYER DATA AREA
;*
;OUTSCR:
; MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A14
; MOVK 8,A6 ;DIGIT COUNT
; MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
; MOVI SCRSPC,A4 ;SPACING BETWEEN DIGITS
; CLR A7 ;INIT BLANKING FLAG
; MOVI 9|8000H,A5 ;CONTROL REGISTER
;
;OUTSCL:
; MOVE A0,A1
; SRL 28,A1
; JRNE OUTSC1 ;NON-ZERO DIGIT
; CMPI 2,A6
; JRLS OUTSC1 ;LAST DIGITS - OUTPUT ANYWAY
; MOVE A7,A7 ;BLANKING OVER?
; JREQ OUTSC2 ;NO
;OUTSC1:
; INC A7 ;BLANKING IS OVER
; SLL 7,A1 ;MULTIPLY BY 128
; MOVE A1,A14
; ADDI RRD0,A14 ;ADDRESS OF IMAGE HEADER
;
; MOVE @GSTATE,A1,W
; CMPI INAMODE,A1
; JREQ OUTSC10 ;BR = NO FLASH SCORE DURING AMODE
;
; MOVE *A2(POBJ),A1,L ;IS THE PLAYER ACTIVE
; JRNE OUTSC1A ;BR = YES, DO A FLASHY SCORE
;OUTSC10
; MOVI 0F9F90000H,A1 ;CONSTANT COLOR:PALETTE SELECT
; JRUC OUTSC1B
;OUTSC1A
; MOVI 0F5F50000H,A1 ;CONSTANT COLOR:PALETTE SELECT
;OUTSC1B
; CALLA DTIME ;OUTPUT THE SUCKER
;OUTSC2:
; ADDXY A4,A3 ;SPACE TO NEXT DIGIT
; SLL 4,A0
; DSJ A6,OUTSCL
; MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A14
; RETS
**************************************************************************
* *
* OBJECT BLOCK INITIALIZATION ROUTINES *
* *
**************************************************************************
**************************************************************************
* *
* SHVELCPY - COPY VELOCITIES TO SHADOW (IF ANY) *
* A8=OBJECT *
* *
**************************************************************************
SHVELCPY:
MMTM SP,A0,A1
MOVE *A8(OSHAD),A0,L
JREQ SHVLCPX
MOVE *A8(OXVEL),*A0(OXVEL),L
MOVE *A8(OZVEL),*A0(OZVEL),L
SHVLCPX:
MMFM SP,A0,A1
RETS
*
*SHVELFLP - COPY SHADOW VELOCITY AND FLIP HIM
*A8=OBJECT
*A3=OXVEL
SHVELFLP:
CALLR SHVELCPY
MOVE *A8(OXVEL+>10),A14,W ;TEST X VELOCITY
*FLIPDUDE
*A8=OBJECT, N=SIGN OF XVEL
FLP:
JAN YFLP
JAUC NOYFLP
**************************************************************************
* *
* OBJOFF - TURN AN OBJECT "OFF" I.E. SET DMA OUTPUT TO 0 *
* A0 = PTR TO OBJECT BLOCK *
* *
**************************************************************************
OBJOFF
PUSH A4
MOVE *A0(OFLAGS),A4,W
SRL 4,A4
SLL 4,A4
MOVE A4,*A0(OFLAGS),W
PULL A4
RETS
**************************************************************************
* *
* OBJON - TURN AN OBJECT "ON" I.E. SET DMA OUTPUT TO WRITE <> 0 *
* A0 = PTR TO OBJECT BLOCK *
* *
**************************************************************************
OBJON
PUSH A4
MOVE *A0(OFLAGS),A4,W
SRL 4,A4
SLL 4,A4
ADDK 2,A4
MOVE A4,*A0(OFLAGS),W
PULL A4
RETS
**************************************************************************
* *
* Z POSITIONING ROUTINES *
* *
**************************************************************************
*
*XZCHK
*CALLING PARAMETERS:
*A8=OBJECT SEEKING
*A0=OBJECT SEEKED
*A5=X RANGE
*A6=Z RANGE
*RETURNS:
*CARRY SET IF HE IS CLOSE ENOUGH
*A1=DELTA X
*A2=DELTA Z
*A3=ABS DELTA X
*A4=ABS DELTA Z
XZCHK:
MOVE A0,A4
CALLR GETANIX ;GET X ANIMATION POINT
MOVE A0,A3
SWAP A4,A8
CALLR GETANIX
MOVE A0,A1
MOVE A8,A0
MOVE A4,A8
MOVE *A8(OZPOS),A4,W
MOVE *A0(OZPOS),A2,W
SUB A4,A2
SUB A3,A1
MOVE A1,A3
MOVE A2,A4
ABS A3
ABS A4
CMP A5,A3
JRNC XZCHKX
CMP A6,A4
XZCHKX:
RETS
**************************************************************************
* *
* 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
**************************************************************************
* *
* GET BOTTOM Y OF AN OBJECT *
* A8 = OBJECT BLOCK PTR *
* RETURN(S) *
* A1 = 16 BIT BOTTOM Y IN LSW *
* STATUS SET ACCORDING TO THE BOTTOM Y *
*NOTE: MAKE SURE OBLOCK IS INIT'D WITH GSAGOF BEFORE CALLING *
* *
**************************************************************************
GETBOTY
PUSH A2
MOVE *A8(OYPOS),A1,W ;GET Y POSITION
MOVE *A8(OSIZEY),A2,W ;GET THE CURRENT SIZE
ADD A2,A1 ;A1 = BOTTOM Y
MMFM SP,A2
RETS
**************************************************************************
* *
* GETCPNT - RETURNS THE CENTER XY POSITION OF A GIVEN IMAGE *
* A8 = IMAGE OBLOCK *
* RETURN(S) *
* A1 = CENTER Y:CENTER X *
* *
**************************************************************************
GETCPNT MOVE A0,-*SP,L
MOVE *A8(OYPOS),A0,W
SLL 16,A0
MOVE *A8(OXPOS),A1,W
MOVX A1,A0
MOVE *A8(OSIZE),A1,L
CALLR GETCENT
SLL 16,A0
MOVY A0,A1
MOVE *SP+,A0,L
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
**************************************************************************
* *
* GETSCRRX - THE THE WORLD X COORDINATE OF THE SCREEN RIGHT END *
* RETURNS *
* A0 = SCREEN RIGHT X, 32 BITS *
* *
**************************************************************************
GETSCRRX
PUSH A2
MOVE @SCRNLR,A0,W
MOVE @WORLDTL,A2,W
ADD A2,A0 ;GET SCREEN LOWER RT.
SLL 16,A0
PULL A2
RETS
*
*GETANIX - GET ANIMATION POINT X COORD
*CALLING PARMS: A8=OBJECT
*RETURNS A0=16 BIT WORLD COORD OF UPPER LEFT
*
GETANIX:
MMTM SP,A1,A2
MOVE *A8(OIMG),A1,L
MOVE *A1(IANIOFF),A2,W
MOVE *A8(OFLAGS),A0,W
BTST B_FLIPH,A0
JRZ GETAX1
MOVE *A1(ISIZE),A0,W
SUB A2,A0
DEC A0
MOVE A0,A2
GETAX1:
MOVE *A8(OXPOS),A0,W
ADD A2,A0
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* GETZMID - GET THE Z MIDPOINT OF AN OBJECT. *
* A8 = PTR TO OBJECT *
* RETURNS: *
* A0 = 32 BIT Z CENTER *
* *
**************************************************************************
;GETZMID
; MMTM SP,A1,A2
* THIS OBJECT FIELD HAS BEEN REDEFINED, IF YOU STILL WANNA USE THIS
* ROUTINE YOU WILL HAVE TO MODIFY IT FOR THE NEW "OZSIZE" (EJB-5/5/90)
; MOVE *A8(OZSIZ),A2,L
; MOVY A2,A1 ;A1 = OZPLUS
; SRL 16,A1
; ZEXT A2
; ADD A1,A2 ;A2 = TOTAL Z WIDTH
; SLL 15,A2 ;DIVIDE FOR HALF
; SLL 16,A1
; MOVE *A8(OZVAL),A0,L
; ADD A1,A0 ;GET TO THE EDGE
; SUB A2,A0 ;GO BACK TO MIDPOINT
; MMFM SP,A1,A2
; RETS
**************************************************************************
* *
* CLRWORLD - CLEAR ALL WORLD COORDINATES AND SCROLL VELOCITIES. *
* *
**************************************************************************
CLRWORLD
PUSH A0
CLR A0
MOVE A0,@SCROLLX,L ;X SCROLL VALUE
MOVE A0,@SCROLLY,L ;Y SCROLL VALUE
MOVE A0,@WORLDTLX,L ;TOP LEFT X SCREEN COORD (WORLD)
MOVE A0,@WORLDTLY,L ;TOP LEFT Y SCREEN COORD (WORLD)
MOVE A0,@WORLDTL,L
MOVE A0,@BAK2TLY,L ;TOP LFT Y SLOW SCROLL BACKGROUND
MOVE A0,@BAK2TLX,L ;TOP LFT X SLOW SCROLL BACKGROUND
MOVI SCRNST,A0
MOVE A0,@SCRNTL,L
MOVE A0,@SCRNTL2,L
MOVE A0,@SCRNTL3,L
MOVI SCRNEND,A0
MOVE A0,@SCRNLR,L
MOVE A0,@SCRNLR2,L
MOVE A0,@SCRNLR3,L
PULL A0
RETS
**************************************************************************
* *
* GETSCRBY - THE THE WORLD Y COORDINATE OF THE SCREEN BOTTOM *
* RETURNS *
* A0 = SCREEN BOTTOM Y *
* *
**************************************************************************
GETSCRBY
PUSH A2
MOVE @SCRNLR+16,A0,W
MOVE @WORLDTL+16,A2,W
ADD A2,A0 ;GET SCREEN BOTTOM Y
SLL 16,A0 ;MAKE IT A 32 BIT VALUE
PULL A2
RETS
**************************************************************************
* *
* SETYPOS - SETUP OBJECTS Y POSITION SO HES ON THE GROUND * *
* A0 = OBJECT BLOCK *
* *
**************************************************************************
SETYPOS MOVE A1,-*SP,L
MOVE *A0(OSIZEY),A1,W
NEG A1
SLL 16,A1
MOVE A1,*A0(OYVAL),L
MOVE *SP+,A1,L
RETS
**************************************************************************
* *
* MYOINIT - INITIALIZE SUPPLEMENTAL OBJECT LIST HEADERS *
* *
**************************************************************************
MYOINIT
MMTM SP,A0,A1,A2,A3,A4,A5
PUSHST
DINT
MOVE @INTENB,A0,W
ANDNI X1E,A0 ;NO MORE DMA INTERRUPTS
MOVE A0,@INTENB,W
POPST
CLR A0
MOVE A0,@GAMERASE
CALLA AUTOEOFF ;DISABLE AUTOERASE
CALLR DMAWAIT ;WAIT ON DMA
MOVI ERASECOL,A1
SLL 16,A1 ;CONSTANT:PALETTE
MOVI [2,511],A2 ;HEIGHT:WIDTH
MOVI [510,0],A3 ;DAG
MOVI 2000000H,A4 ;SAG
MOVI DMAREGS,A0
MMTM A0,A1,A2,A3,A4 ;STORE TO LAST 2 LINES OF BITMAP
CLR A5 ;STUFF OFFSET
MOVE A5,-*A0,W
MOVI DMACAL,A5 ; CONTROL &
MOVE A5,-*A0,W ; GO!
CALLA CLRPAL ; CLEAR PALETTE RAM
CLR A0
MOVE A0,@SL_OFFENSE,L
MOVE A0,@SL_DEFENSE,L ; RE-INIT SUPPLEMENTAL LISTS
MOVK 1,A0
MOVE A0,@GAMERASE
CALLA AUTOEON ; AUTOERASE / GAME ERASE ON !!!
MOVI boonpal,A0
CALLA GETFPAL ; FOOTBALL FIXED PALETTE !!
MMFM SP,A0,A1,A2,A3,A4,A5
JAUC OINIT
**************************************************************************
* *
* ADDSUPP - ADD OBJECT TO A SUPPLEMENTAL LIST *
* A0 = PTR TO OBJECT *
* A1 = MEMORY LOCATION OF SUPPLEMENTAL LIST HEADER *
* *
**************************************************************************
ADDSUPP
MOVE *A1(0),*A0(OSLINK),L ;LINK SLIST TO THIS BLOCK
MOVE A0,*A1,L ;NEW HEAD OF THE SLIST
RETS
**************************************************************************
* *
* DELSBOBJ - DELETE OBJECT FROM SUPPLEMENTAL BACKGROUND LIST *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
;DELSBOBJ
; PUSH A1
; MOVI BACKSLST,A1
; CALLR DELSUPP
; PULL A1
; RETS
**************************************************************************
* *
* DELSUPP - DELETE OBJECT FROM THE SUPPLEMENTAL LIST *
* A0 = PTR TO OBJECT *
* A1 = MEMORY LOCATION OF SUPPLEMENTAL LIST HEADER *
* *
**************************************************************************
DELSUPP
MMTM SP,A1,A2
MOVE A1,A2
MOVE *A1,A1,L ;SPECIAL CASE THE HEADER
JRNZ DELSCHK1
LOCKUP
JRUC DELSX
DELSCHK1
CMP A1,A0
JRNE DELSLUP
MOVE *A1(OSLINK),*A2(0),L ;LINK AROUND THIS GUY
DELSX
MMFM SP,A1,A2
RETS
DELSLUP
MOVE A1,A2 ;SAVE PREVIOUS
MOVE *A1(OSLINK),A1,L ;SEARCHING FOR THE ELEMENT IN THE LIST
JRNZ DELSCHK2
LOCKUP
JRUC DELSX
DELSCHK2
CMP A1,A0
JRNE DELSLUP ;NOT FOUND KEEP LOOKING
MOVE *A1(OSLINK),*A2(OSLINK),L ;LINK AROUND THIS GUY
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* ISSUPP - IS AN OBJECT ON A SUPPLEMENTAL LIST *
* A0 = PTR TO OBJECT *
* A1 = MEMORY LOCATION OF SUPPLEMENTAL LIST HEADER *
* RETURNS: *
* Z BIT SET = NOT ON *
* Z BIT CLR = IS ON *
* *
**************************************************************************
ISSUPP
PUSH A1
MOVE *A1,A1,L ;SPECIAL CASE THE HEADER
JREQ ISEND
CMP A1,A0
JRNE ISSEARCH
ISFOUND
MOVE A1,A1 ;SET Z BIT
ISEND
PULL A1
RETS
ISSEARCH
MOVE *A1(OSLINK),A1,L ;SEARCHING FOR THE ELEMENT IN THE LIST
JREQ ISEND ;ELEMENT DOES NOT EXIST
CMP A1,A0
JRNE ISSEARCH ;NOT FOUND KEEP LOOKING
JRUC ISFOUND ;FOUND RETURN
**************************************************************************
* *
* ISSUPPID - IS AN OBJECT ON A SUPPLEMENTAL LIST(SEARCH BY OBJECT I.D.) *
* A0 = OBJECT I.D. *
* A1 = MEMORY LOCATION OF SUPPLEMENTAL LIST HEADER *
* RETURNS: *
* Z BIT SET = NOT ON *
* A1 = ZERO *
* Z BIT CLR = IS ON *
* A1 = PTR TO OBJECT *
* *
**************************************************************************
ISSUPPID
PUSH A2
MOVE *A1,A1,L ;SPECIAL CASE THE HEADER
JREQ ISENDID
MOVE *A1(OID),A2,W
CMP A2,A0
JRNE ISSRCHID
ISFNDID
MOVE A1,A1 ;SET Z BIT
ISENDID
PULL A2
RETS
ISSRCHID
MOVE *A1(OSLINK),A1,L ;SEARCHING FOR THE ELEMENT IN THE LIST
JREQ ISENDID ;ELEMENT DOES NOT EXIST
MOVE *A1(OID),A2,W
CMP A2,A0
JRNE ISSRCHID ;NOT FOUND KEEP LOOKING
JRUC ISFNDID ;FOUND RETURN
**************************************************************************
* *
* CNTSUPP - COUNT THE NUMBER OF OBJECTS ON GIVEN SUPPLEMENTAL LIST. *
* A1 = SUPPLEMENTAL LIST *
* RETURNS: *
* A0 = OBJECT CNT *
* *
**************************************************************************
CNTSUPP
PUSH A1
CLR A0
MOVE *A1,A1,L
JRZ CNTSUPPX
CNTSUPPL
INC A0
CMPI NOBJ,A0
JRHS CNTSUPPX ;WE'VE MAXED, SOMETHING IS WRONG
MOVE *A1(OSLINK),A1,L
JRNZ CNTSUPPL
CNTSUPPX
PULL A1
RETS
**************************************************************************
* *
* 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 A1
ADDC A1,A0 ;GET LAST BIT BACK TO MAKE 32
MOVE @HCOUNT,A1
RL A1,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
*
*GET SIGNED RANDOM # IN RANGE +/- A0
*CALLING PARAMETERS: A0
*RETURNS A0
*
SRAND:
MMTM SP,A1
MOVE A0,A1
SLL 1,A0
CALLA RANDU
SUB A1,A0
MMFM SP,A1
RETS
**************************************************************************
* *
* RANGRAND - GENERATE A RANDOM NUMBER IN A GIVEN RANGE. *
* B0 = LOWER BOUND *
* B1 = UPPER BOUND *
* RETURNS *
* A0 = RANDOM # *
* *
**************************************************************************
RANGRAND
PUSH A1
PUSH B1
SUB B0,B1 ;NORMALIZE THE RANGE
MOVE B1,A0 ;SET RANGE FOR RANDU
CALLR RANDU
MOVE B0,A1
ADD A1,A0
PULL B1
PULL A1
RETS
*
*RANDPER - RANDOM % ROUTINE
*CALLING PARAMETERS:
*A0=PROBABILITY OF EVENT (0-1000) P(A0=1000) = 1; P(A0=1) = 1/1000.
*RETURNS CS IF PROBABILITY IS TRUE, CC FOR FALSE
*RETURNS A0 = ACTUAL RANDOM # 0-999
RANDPER:
MMTM SP,A1,A2
MOVE A0,A2
CALLA RANDOM
MOVI 1000,A1
MPYU A1,A0
CMP A2,A0
MMFM SP,A1,A2
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,A1,A2,A4,A5
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,A1,A2,A4,A5
CLR A1 ;CONSTANT 0:PALETTE 0
AREACON
MOVE A4,A2
MOVI 2000000H,A4 ;SOMEWHERE IN IMAGE ROM
MOVI DMACAL,A5
CALLA QDMAN
MMFM SP,A1,A2,A4,A5
RETS
**************************************************************************
* *
* PFRAME - GET NEXT FRAME FROM ANIMATION LIST *
* A8 = POINTER TO OBJECT BLOCK *
* A11 = POINTER TO NEXT FRAME IN THE ANIMATION LIST *
* RETURN(S) *
* A5 = TICKS FOR THIS FRAME *
* C BIT SET(JxC) = END OF LIST WAS HIT *
* N BIT SET(JxN) = SPECIAL FRAME ENCOUNTERED *
* *
**************************************************************************
PFRAME MMTM SP,A1,A4
MOVE *A11+,A1,L ;LOAD NEXT FRAME
JRNE PFRAME1 ;NOT THE END OF THE LIST
SETC ;SET CARRY FLAG
JRUC PFRAMEX
PFRAME1
MOVE *A8(OFLAGS),A4,W
CALLA ANI ;SETUP NEW FRAME
PFRAME2
MOVE *A11+,A5,W ;LOAD SLEEP TICKS PER FRAME
CLRC
PFRAMEX MMFM SP,A1,A4
RETS
PSTOP
MMTM SP,A0,A1
CLR A1 ; NO VELOCITY
MOVE A1,*A8(OXVEL),L ; IN THE "X" DIRECTION (AND DESIGN)
MOVE A1,*A8(OYVEL),L ; STOP MOVEMENT
MOVE A1,*A8(OZVEL),L ; STOP MOVEMENT
MOVE A1,*A8(OXACC),L ; NO ACCELERATION
MOVE A1,*A8(OZACC),L
MOVE *A8(OSHAD),A0,L
JREQ PSTOPX
MOVE A1,*A0(OXVEL),L ; STOP THE SHADOW
MOVE A1,*A0(OYVEL),L
MOVE A1,*A0(OZVEL),L ; STOP MOVEMENT
PSTOPX
MMFM SP,A0,A1
RETS
*
*YFLP - SET OBJECT Y-FLIP, A8:OBJECT BLOCK PTR
YFLP MMTM SP,A1,A4
MOVE *A8(OFLAGS),A4
ORI M_FLIPH,A4
JRUC STUFLAGS
*
*NOYFLP - CLEAR OBJECT Y-FLIP, A8:OBJECT BLOCK PTR
NOYFLP MMTM SP,A1,A4
MOVE *A8(OFLAGS),A4
ANDNI M_FLIPH,A4
STUFLAGS
MOVE *A8(OIMG),A1,L ;GET THE CURRENT IMAGE POINTER
CALLA ANI ;SETUP THE "NEW" IMAGE
UNFLPD MMFM SP,A1,A4
RETS
**************************************************************************
* *
* SYNCUP - SYNCHRONIZE WITH THE NEXT DISPLAY INTERRUPT, I.E. *
* WAIT UNTIL THE NEXT INTERRUPT IS FINISHED BEFORE RETURNING *
* *
**************************************************************************
SYNCUP MOVE A0,-*SP,L
CLR A0
MOVE A0,@INTSYNC0,L ;CLEAR HALF SCREEN SYNC
SYNCUP1 MOVE @INTSYNC0,A0,L
JREQ SYNCUP1 ;END HASN'T HIT YET
MOVE *SP+,A0,L
RETS
**************************************************************************
* *
* SYNCHALF - SYNCHRONIZE WITH THE HALF SCREEN INTERRUPT *
* *
**************************************************************************
SYNCHALF
MMTM SP,A0,A1
MOVI INTSYNC0,A1
JRUC SYNCSD
**************************************************************************
* *
* SYNCFULL - SYNCHRONIZE WITH THE FULL SCREEN INTERRUPT *
* *
**************************************************************************
SYNCFULL
MMTM SP,A0,A1
MOVI INTSYNC1,A1
SYNCSD CLR A0
MOVE A0,*A1,W ;CLEAR HALF SCREEN SYNC
SYNCSD1 MOVE *A1,A0,W
JREQ SYNCSD1 ;END HASN'T HIT YET
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* DTIME - USED TO DMA AN IMAGE *
* A1 = [CONSTANT COLOR,PALETTE(STUFFED IN DTIME)] *
* A3 = DAG [Y,X] *
* A5 = [OFFSET,CONTROL] *
* A14 = ADDRESS OF IMAGE HEADER *
* *
**************************************************************************
DTIME:
MMTM SP,A0,A1
MOVE *A14(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
CALLA QDMA ;QUEUE THIS SUCKAH
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* DMAWAIT - WAIT ON THE DMA BUSY BIT TO CLEAR *
* *
**************************************************************************
DMAWAIT
PUSH A0
DMAWAITL
MOVE @DMACTRL,A0,W ;DMA BUSY?
JRN DMAWAITL ;BR = YES
PULL A0
RETS
**************************************************************************
* *
* DMAQWAIT - WAIT FOR DMA QUEUES TO EMPTY, THEN WAIT FOR DMA TO FINISH *
* THE LAST ONE. *
* *
**************************************************************************
;DMAQWAIT
; PUSH A0
;DMAQWT1
; MOVE @TOPQ0CNT,A0,W
; JRNE DMAQWT1
; MOVE @TOPQ1CNT,A0,W
; JRNE DMAQWT1
; MOVE @BOTQ0CNT,A0,W
; JRNE DMAQWT1
; MOVE @BOTQ1CNT,A0,W
; JRNE DMAQWT1
; PULL A0
;DMAQWT2
; MOVE B13,B13
; JRZ DMAWAIT
; JRUC DMAQWT2
**************************************************************************
* *
* DMAHALT - HALT THE DMA *
* *
**************************************************************************
DMAHALT
PUSH A0
CLR A0
MOVE A0,@DMACTRL,W ;HALT THE DMA
PULL A0
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
**************************************************************************
* *
* CRINIT - COLOR RAM INITIALIZATION, FIRST CLEAR ALL COLOR RAM, THEN *
* FILL WITH PALETTES. *
* *
**************************************************************************
CRINIT
MMTM SP,A0,A1,A2,A6
MOVI COLRAM,A1
CLR A0
MOVI 10000H,A6,L
*CLEAR ALL COLOR PALETTES
CRINIT1
MOVE A0,*A1+,L ;STUFF TWO WORDS AT A TIME
DSJS A6,CRINIT1
MMFM SP,A0,A1,A2,A6 ;<----
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
**************************************************************************
* *
* 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
************ CLEAR SCREEN ROUTINE *********************
CLR_SCRN
clr_scrn:
CLR A0
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
*COLLISION VECTOR LISTS
DUMCOLL .WORD 0
.LONG DUMRTSG
DUMRTSG
CLR A0 ;DON'T STOP SCAN
CLRC ;AND DON'T DELETE
RETS
**************************************************************************
* *
* FRANIM - ANIMATION SCRIPT PROCESSOR *
* A1 = COMMAND: 00 = PROCESS CURRENT FRAME. *
* 01 = PROCESS TO END OF LIST. *
* 02 = PROCESS X # OF FRAMES OR TO END. A1 = [# FRMS,CMD] *
* 03 = INFINITELY LOOP ON THE LIST. *
* 04 = PROCESS CURRENT FRAME, NO SLEEP(TIME RETRN'D IN A0 *
* A8 = PTR TO OBJECT BLOCK *
* A9 = PTR TO CURRENT FRAME *
* RETURN(S) *
* CARRY SET IF END OF ANIMATION LIST WAS HIT *
* A9 = POINTING TO NEXT FRAME, IF NOT AT END OF LIST *
* SETS EPARENT OF THE SPAWNED CHILD POINTING TO THIS PROCESS *
* NOTE: CALL WITH JSRP, IT SLEEPS *
* *
* ANIMATION SCRIPT FORMAT *
* .LONG IMAGE_HEADER<-- IF = 0 END OF SCRIPT *
* .WORD SLEEP_TIME <-- BITS 0 - 7 ARE THE SLEEP TIME. *
* <-- BITS 8 -15 ARE THE FLAGS: *
* BIT # DESCRIPTION SIZE *
* ----- ----------- ---- *
* 8 NEW SCRIPT ADDRESS (32) *
* 9 UNUSED *
* 10 UNUSED *
* 11 DELTA Y (16) *
* 12 PACKED DELTAS FOR X&Z (16) *
* 13 NEW PALETTE ADDRESS (32) *
* 14 NEW FLIP BITS (16) *
* 15 SPAWN PROCESS W/OFFSETS (80) *
* .WORD XOFF,YOFF,PROCID *
* .LONG PROCADDR *
* FLAG HIERARCHY: 15 --> 8 *
* OPTIONS SHOULD FOLLOW IN THIS ORDER. *
* *
**************************************************************************
FRANIM
MMTM A12,A3,A11
MOVE A9,A11 ;SAVE ENTRYPOINT FOR INFINITE CASE
FRAN1
MOVE A1,A3
MOVE *A9+,A1,L ;GET THE FRAME
JREQ FRANND ;BR = END WAS HIT
MMTM SP,A2,A4,A5,A6,A7,A10,A14
MOVE *A8(OFLAGS),A4,W ;GRAB THE FLAGS
MOVE *A9+,A0,W
MOVE A0,A14 ;XFER FLAGS HERE
SLL 24,A0
SRL 24,A0 ;WIPE OFF THE FLAGS
SRL 8,A14 ;STRIP THE SLEEP TIME
SLL 24,A14 ;MOVE FLAGGIES UP HERE
JRZ FRANANI ;BR = NO FLAGS
SLL 1,A14
JRNC FRANNOSP
*SPAWN A PROCESS
MMTM SP,A0,A1
MOVE *A9+,A10,L ;X AND Y FIRING OFFSETS PASSED IN A10
MOVE *A9+,A1,W ;GET PROCESS ID
MOVE *A9+,A7,L ;PROCESS STARTING ADDRESS
CALLA GETPRC ;SPAWN THE PROCESS
*** JREQ FRSPAWNF ;BR = FAILED TO SPAWN
*** MOVE A13,*A0(EPARENT),L ;RETURN LINK TO PARENT PROCESS
FRSPAWNF
MMFM SP,A0,A1
FRANNOSP
SLL 1,A14
JRNC FRANNOBI
*STUFF SOME NEW FLAGS
MOVE *A9+,A2,W ;GET THE NEW FLIP FLAGS
ANDNI (M_FLIPV+M_FLIPH),A4 ;CLEAR THE CURRENT FLIP STATUS
OR A2,A4 ;SET DESIRED BITS
FRANNOBI:
SLL 1,A14
JRNC FRANNOPA
*ACTIVATE A NEW PALETTE
PUSH A0
MOVE *A9+,A0,L ;GET THE PALETTE ADDRESS
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
JRZ FRAN2B ;NO PALETTE AVAILABLE
MOVE A0,A7 ;SAVE HERE
MOVE A8,A0
CALLA DELPAL
MOVE A7,*A8(OPAL),W ;STORE THE NEW PALETTE
FRAN2B
PULL A0
FRANNOPA
SLL 1,A14
JRNC FRANNDXZ
*ADD DELTA X AND Z
MOVE *A9+,A7,W ;GET THE DELTAS
MOVE A7,A6
SLL 24,A6
SRA 24,A6 ;BRING THE SIGN BACK DOWN
JRZ FNODX ;BR = THERE'S NO DELTA HERE
BTST B_FLIPH,A4
JREQ FNOFDX
NEG A6 ;HE'S FLIPPED, NEGATE
FNOFDX
MOVE *A8(OXPOS),A5,W
ADD A6,A5
MOVE A5,*A8(OXPOS),W ;ADJUST X POSITION
FNODX
SRA 8,A7
JRZ FRANNDXZ ;BR = NO Z OFFSET
BTST B_FLIPV,A4
JREQ FNOFDZ
NEG A7
FNOFDZ
MOVE *A8(OZPOS),A5,W
ADD A7,A5
MOVE A5,*A8(OZPOS),W ;ADJUST Z POSITION
MOVE *A8(OYPOS),A5,W
ADD A7,A5
MOVE A5,*A8(OYPOS),W ;ADJUST MATCHING Y POSITION
FRANNDXZ
SLL 1,A14
JRNC FRANNDY
*ADD DELTA Y
MOVE *A9+,A7,W
JRZ FRANNDY
BTST B_FLIPV,A4
JREQ FNOFDY
NEG A7
FNOFDY
MOVE *A8(OYPOS),A5,W
ADD A7,A5
MOVE A5,*A8(OYPOS),W ;ADJUST Y POSITION
FRANNDY
SLL 3,A14 ;GET TO BIT 8, SKIP BITS 9 AND 10
JRNC FRANNNA ;BR = NO NEW SCRIPT ADDRESS
MOVE *A9,A9,L ;LOAD IN THE NEW SCRIPT ADDRESS
FRANNNA:
*JUST TO THE ANIMATION
FRANANI:
CALLA ANI ;SETUP NEW ANIMATION
MMFM SP,A2,A4,A5,A6,A7,A10,A14
MOVE A3,A1 ;GET THE COMMAND BACK
CMPI 4,A1 ;ONE FRAME, NO SLEEP?
JREQ FRAN3 ;YES
PUSHP A1
CALLA PRCSLP ;SLEEP THE PROPER TIME
PULLP A1
CMPI 1,A1
JREQ FRAN1 ;BR = LOOP 'TIL END OF LIST
JRLT FRAN3 ;BR = ONE FRAME AT A TIME
CMPI 3,A1
JREQ FRAN1
SUBI 010000h,A1 ;DECREMENT FRAME COUNT
CLR A0
CMPXY A0,A1
JRYGT FRAN1 ;FRAME COUNT HAS NOT BEEN EXHAUSTED
FRAN3 CLRC ;CLEAR END FLAG
JRUC FRANX
FRANND MOVE A3,A1
CMPI 3,A1
JRNE FRAN4 ;BR = EXIT
MOVE A11,A9 ;GET THE STARTING POINTER BACK
JRUC FRAN1 ;LOOP INFINITELY
FRAN4 SETC ;OTHERWISE, RETURN WITH END FLAG SET
FRANX
MMFM A12,A3,A11
RETP
**************************************************************************
* *
* FRAMSKIP - SKIP TO THE NEXT FRAME OF AN ANIMATION SCRIPT *
* A9 = SCRIPT PTR *
* RETURNS: *
* C CLR = A9 IS POINTING TO NEXT FRAME *
* C SET = SCRIPT END WAS HIT, A9 POINTS TO NEXT WORD *
* *
**************************************************************************
FRAMSKIP
MMTM SP,A1
MOVE *A9+,A1,L ;GET THE FRAME
JREQ FRAMSSC ;BR = END WAS HIT
MOVE *A9+,A1,W
SRL 8,A1 ;STRIP THE SLEEP
SLL 24,A1 ;MOVE FLAGGIES UP HERE
JRZ FRAMSANI ;BR = NO FLAGS
SLL 1,A1
JRNC FRAMSNSP
ADDI 32+16+32,A9 ;PROCESS SPAWN
FRAMSNSP
SLL 1,A1
JRNC FRAMSNF
ADDK 16,A9 ;NEW FLAGS
FRAMSNF
SLL 1,A1
JRNC FRAMSNP
ADDK 32,A9 ;NEW PALETTE
FRAMSNP
SLL 1,A1
JRNC FRAMSNXZ
ADDK 16,A9 ;DELTA X & DELTA Z
FRAMSNXZ
SLL 1,A1
JRNC FRAMSNY
ADDK 16,A9 ;DELTA Y
FRAMSNY
SLL 3,A1
JRNC FRAMSNNSA
MOVE *A9,A9,L ;JUMP TO NEW FRAME
FRAMSNNSA:
FRAMSANI:
CLRC
JRUC FRAMSND
FRAMSSC
SETC
FRAMSND
MMFM SP,A1
RETS
**************************************************************************
* *
* AUTOEOFF - TURN OFF AUTO ERASE *
* NOTE: BE SURE THE DIRQ IS OFF BEFORE CALLING *
* *
**************************************************************************
AUTOEOFF
PUSH A0
PUSHST
DINT
MOVE @SYSCOPY,A0,W
ORI AUTOERAS,A0 ;DISABLE AUTO ERASE
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
POPST
MOVE A0,@SYSCTRL,W
PULL A0
RETS
**************************************************************************
* *
* AUTOEON - TURN ON AUTO ERASE *
* NOTE: BE SURE THE DIRQ IS OFF BEFORE CALLING *
* *
**************************************************************************
AUTOEON
PUSH A0
MOVE @NOAUTOE,A0,W
JRNE AUTOEON1 ;BR = DEBUGGER MAN SAYS NO AUTOERASE
PUSHST
DINT
MOVE @SYSCOPY,A0,W
ANDNI AUTOERAS,A0 ;AUTO ERASE IS ENABLED LOW
MOVE A0,@SYSCOPY,W ;STORE EVERYWHERE I DID GO
POPST
MOVE A0,@SYSCTRL,W
AUTOEON1
PULL A0
RETS
**************************************************************************
* *
* COPYOBJ - COPIES THE CONTENTS OF ONE OBJECT BLOCK TO THE OTHER. *
* A0 = PTR TO DESTINATION BLOCK *
* A8 = PTR TO SOURCE BLOCK *
* *
**************************************************************************
COPYOBJ
MMTM SP,A0,A6,A8
MOVI OBSIZ,A6,W ;GET THE SIZE OF THE BLOCK IN WORDS
ADDI 64,A0
ADDI 64,A8 ;DON'T COPY THE LINKS
SRL 4,A6 ;DIVIDE BY 16
SUBK 4,A6 ;SUBTRACT TO ACCOUNT FOR THE 1st TWO LINKS
COPYOBJL
MOVE *A8+,*A0+,W ;MOVE A WORD
DSJS A6,COPYOBJL
MMFM SP,A0,A6,A8
PUSH A6 ;KLUDGE TO ZERO MISPLACED LINKS
CLR A6
MOVE A6,*A0(OSHAD),L
PULL A6
RETS
*****************************************************
*
*AUTO-ANIMATOR
*A13=PLAYER PROCESS
*A8=PLAYER OBJECT
*A9=CURRENT ANI SCRIPT
*A10=CURRENT SCRIPT BASE
*
AUTOANI:
MOVE *A13(P_GOAL),A0,L
JRNE AUTOBL ;ACTIVE GOAL
MOVE *A13(PLGOZ),A0,W
JRNE AUTOZ
*GO UNTIL X COORD GOAL
AUTOX:
MOVE *A8(OXPOS),A0,W ;CURRENT XPOS
MOVE *A13(PLGOX),A1,W ;GOAL
MOVE *A8(OXVEL+>10),A2,W ;DIRECTION TO ACHEIVE
SUB A1,A0
XOR A0,A2
JRN AUTOEND ;WE MADE IT TO THE END
JRUC AUTOSLL
*GO UNTIL Z COORD GOAL
AUTOZ:
MOVE *A13(PLGOX),A0,W ;GOAL
JRNE AUTOXZ
MOVE *A8(OZPOS),A0,W ;CURRENT XPOS
MOVE *A13(PLGOZ),A1,W ;GOAL
MOVE *A8(OZVEL+>10),A2,W ;DIRECTION TO ACHEIVE
SUB A1,A0
XOR A0,A2
JRN AUTOEND ;WE MADE IT TO THE END
JRUC AUTOSLL
*GO UNTIL COMBINED X,Z GOAL
AUTOXZ:
MOVE *A8(OXPOS),A0,W ;CURRENT XPOS
MOVE *A13(PLGOX),A1,W ;GOAL
MOVE *A8(OXVEL+>10),A2,W ;DIRECTION TO ACHEIVE
SUB A1,A0
XOR A0,A2
JRN AUTOXZ1 ;WE MADE IT TO THE END
JRUC AUTOSLL
*GO UNTIL Z COORD GOAL
AUTOXZ1:
MOVE *A8(OZPOS),A0,W ;CURRENT XPOS
MOVE *A13(PLGOZ),A1,W ;GOAL
MOVE *A8(OZVEL+>10),A2,W ;DIRECTION TO ACHEIVE
SUB A1,A0
XOR A0,A2
JRN AUTOEND ;WE MADE IT TO THE END
JRUC AUTOSLL
*SEEK OFFSET FROM BALL
AUTOBL:
MOVE *A13(P_GOAL),A0,L ;ARE WE AT GOAL OFFSET?
MOVE *A0(OXPOS),A1,W
MOVE *A0(OSIZEX),A2,W
SRL 1,A2
ADD A2,A1 ;SEEK CENTER
MOVE *A0(OZPOS),A2,W
MOVE *A13(PLGOX),A3,W
ADD A3,A1
MOVE *A13(PLGOZ),A3,W
ADD A3,A2
MOVE *A8(OXPOS),A3,W
MOVE *A8(OSIZEX),A4,W
SRL 1,A4
ADD A4,A3 ;SEEK CENTER
MOVE *A8(OZPOS),A4,W
SUB A3,A1
SUB A4,A2
ABS A1
ABS A2
CMPI 4,A1
JRHS AUTOBLOF1
CMPI 4,A2
JRLS AUTOEND ;WE ARE THERE
AUTOBLOF1:
MOVI 100,A0
CALLA RANDPER
JRNC AUTOSLL
AUTOBLOFST:
MOVE *A13(P_GOAL),A0,L
MOVE *A13(PLGOX),A1,W
MOVE *A13(PLGOZ),A2,W
CALLA XZSKOBOF ;GET NEW SEEK VELOCITIES
MOVE A5,*A8(OXVEL),L
MOVE A6,*A8(OZVEL),L ;STORE 'EM
CALLA SHVELCPY
CALLA GETADIR ;GET ANIMATION DIRECTION
JRUC AUTOSLL
AUTOSLL
DECW *A13(P_ANICOUNT)
JRNE AUTOSLP
MOVE *A13(P_ANIRATE),*A13(P_ANICOUNT),W
AUTOSL1:
MOVK 4,A1
JSRP FRANIM
JRNC AUTOSLP ;NOT END OF SCRIPT CONTINUE
MOVE A10,A9
JRUC AUTOSL1 ;RESET SCRIPT TO BEGINNING
AUTOSLP
SLOOP 1,AUTOANI
AUTOEND RETP
GETDIRAC
MMTM SP,A1,A2,A3,A4,A5,A6,A7
MOVE *A8(OXACC),A1,L
MOVE *A8(OZACC),A2,L
JRUC GAD0
*
* GET ANIMATION DIRECTION
* A8=OBJECT
* A9=CURRENT SCRIPT POINTER
* A10=CURRENT SCRIPT BASE
* A13(P_ANITAB)=ANIMATION TABLE BASE
*
GETADIR:
MMTM SP,A1,A2,A3,A4,A5,A6,A7
MOVE *A8(OXVEL),A1,L
MOVE *A8(OZVEL),A2,L
GAD0
MOVE A1,A3
MOVE A2,A4
ABS A3 ;UNSIGNED COMPARE
ABS A4
MOVE A3,A5
ADD A4,A5
JRNE GAD1
CLR A3 ;STANDING CASE
JRUC GETADX
GAD1
MOVK 3,A5
MOVK 3,A7
MPYU A3,A5 ;CALC 3*X
MPYU A4,A7 ;CALC 3*Y
CMP A7,A3 ;XV GT 3*YV ?
JRHS GADX
CMP A5,A4
JRHS GADZ
*DIAGONAL XZ VELOCITY CASE
SRL 31,A1 ;4 QUADRANTS= 0-3
SRL 31,A2
SLL 1,A2
ADD A1,A2
ADDK 5,A2
MOVE A2,A3
JRUC GETADX
*X VELOCITY CASE
GADX
MOVK 1,A3
MOVE A1,A1
JRNN GETADX ;XV + CASE
MOVK 2,A3
JRUC GETADX
*Z VELOCITY CASE
GADZ
MOVK 3,A3
MOVE A2,A2
JRNN GETADX
MOVK 4,A3
*HAVE OFFSET IN A3, LOAD UP THE NEW ANIMATION FROM TABLE
GETADX
SLL 5,A3
MOVE *A13(P_ANITAB),A2,L
ADD A2,A3
MOVE *A3,A3,L
CMP A3,A10 ;NEW SCRIPT?
JREQ GETADXX ;NOPE...DON'T RESET IT !!!
MOVE A3,A9 ;YES, RESET FOR NEW SCRIPT
MOVE A9,A10
GETADXX
MMFM SP,A1,A2,A3,A4,A5,A6,A7
RETS
*
*SEEK OBJECT WITH OFFSET
*A0=OBJECT SEEKED
*A1=X OFFSET
*A2=Y OFFSET
*A8=OBJECT SEEKING
XZSKOBOF
MOVE *A0(OXPOS),A5,W
MOVE *A0(OSIZEX),A6,W
SRL 1,A6
ADD A6,A5 ;SEEK CENTER
MOVE *A0(OZPOS),A6,W
ADD A1,A5
ADD A2,A6
JRUC XZSEEK
*SEEK XZ OF ACTIVE OBJECT
*A8=OBJECT SEEKING
*A0=OBJECT SEEKED
*
XZSKOBJ
MOVE *A0(OXPOS),A5,W
MOVE *A0(OSIZEX),A6,W
SRL 1,A6
ADD A6,A5 ;SEEK CENTER
MOVE *A0(OZPOS),A6,W
*
*SEEK X-Z COORDINATE
*A8=OBJECT SEEKING
*A5=X COORD TO SEEK
*A6=Z COORD TO SEEK
*RETURNS
*A5=X VEL
*A6=Z VEL
*
XZSEEK
MMTM SP,A0,A1,A2,A3,A4,A7
MOVE *A8(OXPOS),A3,W
MOVE *A8(OSIZEX),A4,W
SRL 1,A4
ADD A4,A3 ;SEEK CENTER
MOVE *A8(OZPOS),A4,W
SUB A3,A5 ;FIND DIFFERENCE
SUB A4,A6
MOVE A6,A3 ;SAVE THE SUCKERS
MOVE A5,A1
ABS A5
ABS A6
ADD A5,A6 ;CALC SUM ABS(DX+DY)
SLL 16,A1 ;SHIFT TO ACCOMODATE FRACTIONAL VELOCITY
SLL 16,A3
DIVS A6,A1 ;GENERATE SPEED RATIOS
DIVS A6,A3
MOVE A1,A2
ABS A2
SLL 16,A2
SRL 28,A2 ;CORRECT FOR SQUARE ROOT
SLL 4,A2
ADDI XZSQTAB,A2
MOVE *A2,A2,W
MOVI 2,A5 ;MULTIPLY BY VELOCITY FACTOR
MPYU A2,A5
MPYS A5,A3
MPYS A1,A5 ;FINAL X VEL
SRA 4,A3
SRA 4,A5
MOVE A3,A6 ;FINAL Y VEL
MMFM SP,A0,A1,A2,A3,A4,A7
RETS
*CORRECT FOR ANGULAR VELOCITIES
XZSQTAB .WORD >10,>11,>12,>13,>14,>15,>16,>17
.WORD >17,>16,>15,>14,>13,>12,>11,>10
**************************************************************************
* *
* GPALOBJ - GET A PALETTE AND AN OBJECT BLOCK *
* A14 = PTR TO PLAYER INITIALIZATION TABLE. *
* RETURNS: *
* A0 = PTR TO OBJECT *
* Z BIT SET = FAILURE,A0 = 0 *
* *
**************************************************************************
;GPALOBJ
; PUSH A2
; CALLA GETOBJ
; JRZ GPLOXX ; OBJECT BLOCK FAILURE
;
; CALLA STRTOBJ ; STUFF IT
;
; MOVE A0,-*SP,L ; SAVE A0
; MOVE *A0(OIMG),A0,L
; MOVE *A0(ICMAP),A0,L ; GET PALETTE NAME
; CALLR GETFPAL ; GET A PALETTE
; JRZ GPALOBJX ; NONE AROUND
; MOVE A0,A2
; MOVE *SP+,A0,L
; MOVE A2,*A0(OPAL),W
; JRUC GPLOXX
;GPALOBJX
; CALLA FREEOBJ
; CLR A0
; MMFM SP,A0
;GPLOXX
; MMFM SP,A2
; RETS
**************************************************************************
* *
* FADEALL *
* *
* FADE EVERYTHING USING A GIVEN FADE ENTRY *
* *
* ENTRY *
* A0 LIST OF PALETTES *
* A11 FADE MULT TABLE *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
FADEALL:
mmtm SP,A0,A1,A2,A6,A7,A8,A9,A11
JRUC Fader
**************************************************************************
* *
* FADEIN *
* *
* FADE A LIST OF PALETTES FROM BLACK TO THEIR CURRENT COLORS *
* *
* ENTRY *
* A0 PTR TO NULL TERMINATED LIST **NOT** TO FADE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
FADEIN:
mmtm SP,A0,A1,A2,A6,A7,A8,A9,A11
movi FadeIn,A11
jruc Fader
**************************************************************************
* *
* FADEOUT *
* *
* FADE A LIST OF PALETTES DOWN TO BLACK *
* *
* ENTRY *
* A0 PTR TO NULL TERMINATED LIST **NOT** TO FADE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
FADEOUT:
mmtm SP,A0,A1,A2,A6,A7,A8,A9,A11
movi FadeOut,A11
Fader:
move A0,A6
;* WALK EUGENES PALETTE TABLE, START PROC TO FADE EACH PALETTE *
clr A9 ;palette slot
dec A9
movi PALRAM-PALRSIZ,A2 ;base of eugenes palette table
PalLp:
addi PALRSIZ,A2
inc A9
cmpi NUMPAL,A9
jrge PalLpX
move *A2(PALCNT),A1,W ;is palette allocated?
jrz PalLp
move *A2(PALID),A8,L ;Ptr to palette
;*** SKIP FADING PALS IN LIST POINTED TO BY A6
move A6,A7
jrz SkFPalX
SkPalLp:
move *A7+,A1,L
jrz SkFPalX
cmp A1,A8
jreq PalLp
jruc SkPalLp
SkFPalX:
CREATE PID_FX,FADEPROC
jruc PalLp
PalLpX:
mmfm SP,A0,A1,A2,A6,A7,A8,A9,A11
rets
**************************************************************************
* *
* FADE_ONLY *
* *
* FADE ONLY A CERTAIN PALETTE *
* *
* ENTRY *
* A0 PALETTE TO BE FADED *
* A11 MULTIPLIER FOR PALETTES *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALLA *
* *
**************************************************************************
FADE_ONLY:
mmtm SP,A0,A1,A2,A6,A7,A8,A9,A11
move A0,A6
;* WALK EUGENES PALETTE TABLE, START PROC TO FADE EACH PALETTE *
clr A9 ;palette slot
dec A9
movi PALRAM-PALRSIZ,A2 ;base of eugenes palette table
FOPalLp:
addi PALRSIZ,A2
inc A9
cmpi NUMPAL,A9
jrge FOPalLpX
move *A2(PALCNT),A1,W ;is palette allocated?
jrz FOPalLp
move *A2(PALID),A8,L ;Ptr to palette
CMP A6,A8
JRNZ FOPalLp ; BR = NOT THE ONE FOR ME
CREATE PID_FX,FADEPROC
jruc FOPalLp
FOPalLpX:
mmfm SP,A0,A1,A2,A6,A7,A8,A9,A11
rets
**************************************************************************
* *
* FADEPROC *
* *
* PROCESS TO ACTUALLY FADE A PALETTE *
* *
* ENTRY *
* A8 PTR TO PALETTE TO BE FADED *
* A9 PALETTE SLOT OF PALETTE *
* A11 FADE MULTIPLIER TABLE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
FADEPROC:
sll 24,A9 ;B8-15 DEST PAL | B0-7 START COLOR
srl 16,A9
.IF YUNIT
MOVE A9,A2
SRL 12,A2
SLL 14,A2
SLL 20,A9
SRL 20,A9
ADD A2,A9
.ENDIF
FadePLp:
;**** SET UP FADED PAL IN PROCESS DATA SPACE ****
move *A11+,A2,W ;A2 - Color Multiplier
jrn FadePrcX
move A13,A0
addi PDATA,A0 ;A0 - Dest Ram for Pal
move A8,A1 ;A1 - Src for Pal
callr FadePal
;**** GET FADED PALETTE XFERRED TO PALRAM ****
move A9,A1 ;B8-15 DEST PAL | B0-7 START COLOR
move A13,A0
addi PDATA,A0 ;SRC FOR XFER
move *A0+,A2,W ;GET # COLORS IN PALETTE
calla PALSET ;SETUP PALETTE TRANSFER
SLEEP 1
jruc FadePLp
FadePrcX:
SLEEP 1 ;give last xfer a chance to go
DIE
**************************************************************************
* *
* FADEPAL *
* *
* APPLY THE COLOR MULTIPLIER AND DO ONE ITERATION ON THE PALETTE *
* *
* ENTRY *
* A0 DESTINATION RAM FOR PALETTE *
* A1 SOURCE FOR PALETTE *
* A2 COLOR MULTIPLIER *
* *
* EXIT *
* NOTHING *
* *
* NOTE: EACH COLOR IN PALETTE WILL BE MULTIPLIED BY A2 THEN *
* DIVIDED BY 128 *
* *
**************************************************************************
FadePal:
mmtm SP,A8,A9,A10,A11
move *A1+,A14,W
move A14,*A0+,W
sll 23,A14 ;top bits of field are flags
srl 23,A14 ; only 9 bits needed for # colors
movi >7C00,A4 ;A4 - Pre Mult Mask for 5 bits of red
movi >03E0,A6 ;A6 - Pre Mult Mask for 5 bits of green
movi >001F,A8 ;A8 - Pre Mult Mask for 5 bits of blue
move A4,A9
move A6,A10
move A8,A11
sll 7,A9 ; A9 - Post Mult Max for 5 bits of red
sll 7,A10 ;A10 - Post Mult Max for 5 bits of green
sll 7,A11 ;A11 - Post Mult Max for 5 bits of blue
FadeLp:
move *A1+,A3,W ;A3 - RED
move A3,A5 ;A5 - GREEN
move A3,A7 ;A7 - BLUE
and A4,A3
and A6,A5
and A8,A7
mpyu A2,A3
mpyu A2,A5
mpyu A2,A7
cmp A9,A3
jrle RedOk
move A9,A3
RedOk:
cmp A10,A5
jrle GreenOk
move A10,A5
GreenOk:
cmp A11,A7
jrle BlueOk
move A11,A7
BlueOk:
and A9,A3
and A10,A5
; and A11,A7 ;unnecessary cause bottom bits will get >> 7
or A5,A3
or A7,A3
srl 7,A3
move A3,*A0+,W
dsjs A14,FadeLp
mmfm SP,A8,A9,A10,A11
rets
FadeIn .word 0,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,>FFFF
FadeOut .word 120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,>FFFF