1872 lines
51 KiB
NASM
1872 lines
51 KiB
NASM
|
.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
|
|||
|
|
|||
|
|