7578 lines
183 KiB
NASM
7578 lines
183 KiB
NASM
.MLIB "GXMACS.LIB"
|
||
.FILE "GXD.ASM"
|
||
.TITLE "<<< GENERATION X -- DISPLAY PROCESSOR VER. 5.0 >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
NUM_SIZES .set 3 ; Full, Half and Qrtr and NOT Eighth
|
||
|
||
|
||
|
||
*
|
||
*GSP DMA OBJECT HANDLER
|
||
*VERSION 1.0 BY WARREN DAVIS 9/1/87
|
||
*VERSION 2.01 BY EUGENE JARVIS 10/25/87
|
||
*VERSION 3.0 BY EUGENE JARVIS 12/20/87
|
||
*VERSION 3.1 BY EUGENE JARVIS 7/4/88
|
||
*VERSION 3.2 BY EUGENE JARVIS 8/8/88
|
||
*VERSION 3.3 BY TODD ALLEN 3/26/89
|
||
*VERSION 4.0 BY TODD ALLEN 10/20/90
|
||
*VERSION 5.0 BY WARREN DAVIS & BILL DOZER 6/20/92
|
||
****************************************
|
||
*FILES REQUIRED FOR ASSEMBLY
|
||
.include "GX.INC"
|
||
|
||
***** In this file
|
||
|
||
.if DEBUG
|
||
.DEF CkOFREE
|
||
.endif
|
||
.DEF INVELADD
|
||
.DEF OBJ_ON_WNZ_MULTI, REPOS_OBJ, GET_ANIPU, OBJ_CONST_MULTI
|
||
.DEF CALCULATE_HORIZON, SET_ODAG_MULTI, WORLD_GRNDOFF
|
||
|
||
***** In GXRAM.ASM
|
||
|
||
.REF SKIPDISP, DMACFIGCOPY
|
||
|
||
***** In GXPALL.ASM
|
||
|
||
.REF FREEPALCNT, FINDPAL
|
||
|
||
***** In GXC.ASM
|
||
|
||
.ref PULLANIMFUNC
|
||
|
||
***** In GXUNZIP.ASM
|
||
.ref SYNCIRQ,CLIPSND
|
||
|
||
OLD_WAY .set 0
|
||
;
|
||
* GLOBAL VARIABLES
|
||
*
|
||
.sect "OFIXED"
|
||
|
||
;* OBJ PLANES HAVE FOLLOWING STUCTURE
|
||
; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
; ³ÚÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄ¿³
|
||
; ÉÍËÍÍ» ÉÍËÍÍËÍÍ ÉÍËÍÍËÍÍ ÉÍËÍÍËÍÍ
|
||
; º º º º º º º º º º º º
|
||
; ÈÍÊÍͼ ÈÍÊÍÍÊÍÍ ÈÍÊÍÍÊÍÍ ÈÍÊÍÍÊÍÍ
|
||
; ÀÄÄÅÄÄÄÄÄÄÅÄÄÙ ÀÄÄÅÄÄÄÄÄÄÄÄÅÄÄÙ
|
||
; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
|
||
; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
|
||
|
||
L6 .MACRO ;No more L7, sorry Dozer.
|
||
.LONG 0,0,0,0,0,0
|
||
.word 0
|
||
.ENDM
|
||
;P_LSTHD, P_LSTTL, P_XPOS, P_YPOS, P_XYOFF, P_XRATE, P_FLAGS
|
||
FGLIST
|
||
L6
|
||
FGLISTX
|
||
|
||
BGLISTS
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
L6
|
||
BGLISTSX
|
||
|
||
;# OF ENTRIES MUST = 2**#bits of SUPP field in OID
|
||
SUPPLSTS
|
||
.long 0,0,0,0,0,0,0,0
|
||
.long 0,0,0,0,0,0,0,0
|
||
.long 0,0,0,0,0,0,0,0
|
||
.long 0,0,0,0,0,0,0,0
|
||
SUPPLSTSX
|
||
|
||
OFREE .long 0 ;LIST OF FREE OBJECTS
|
||
ENDOFREE .long 0 ;PTR TO LAST OBJ ON FREE LIST
|
||
ANIOBJS .long 0 ;LIST OF OBJECTS for ANIM PROCESS
|
||
.BSS ANIFUNCS,040h*NOBJ+020h,1 ;list of ANIM FUNCTIONS TO BE CALLED
|
||
;+020h for list terminating 0
|
||
.BSS ANIFUNCSX,0
|
||
.def ANIFUNCSX
|
||
|
||
|
||
.IF DEBUG
|
||
.def CLIPTIM,VELTIM,SCALETIM,PROCTIM
|
||
.ENDIF
|
||
*
|
||
.IF DEBUG
|
||
.bss CLIPTIM,16 ; % of screen time for clip loop
|
||
.bss VELTIM,16 ; % of screen time for vel loop
|
||
.bss SCALETIM,16 ; % of screen time for scale
|
||
.bss PROCTIM,16 ; % of screen time for processes
|
||
.ENDIF
|
||
.bss DMATMP,16 ; VLINE at which DMA is done for frame
|
||
.bss DMALFT,16 ; % of DMA TIME left (0-1000)
|
||
.bss DMAAVG,16 ; Average % DMA TIME left
|
||
.bss HORIZON,16 ; VLINE separating sky from ground.
|
||
.BSS HORIZON_BASE,16 ; INITIAL VALUE OF ABOVE LOCATION
|
||
.BSS SRT_HORIZON,16 ; VERSION USED BY SRT_CLR ONLY
|
||
.BSS BGPLANECT,16 ;# of bgnd planes
|
||
.BSS OFREECNT,16 ;# objects on free list
|
||
.BSS SCRNTL,32 ;TOP LEFT [Y,X] SCREEN (SCRN COORD.)
|
||
.BSS SCRNBR,32 ;LOWER RIGHT [Y,X] SCREEN (SCRN COORD.)
|
||
.BSS OBJSTR,NOBJ*OBSIZ ;OBJECT SPACE START
|
||
.BSS OBJSTRX,0 ;OBJECT SPACE END
|
||
.BSS DMAQCUR,32 ;CURRENT DMAQ
|
||
|
||
QSIZE .SET NOBJ*BQCELL ;SIZE OF A QUEUE
|
||
|
||
.BSS DMAQ,QSIZE ;MISC. NON-SYNC DMA QUEUE
|
||
.BSS QDMAFLG,16 ;SPECIAL DMAQ BEING UPDATED=1
|
||
.BSS DISPLAYON,16 ;DO DISPLAY PROCESSING WHEN != 0
|
||
.BSS DMAIQSTR,(5*NOBJ)*6*020h ;SPACE TO STORE DMAINT Q
|
||
.BSS DMAIQBOT,0 ;
|
||
.BSS DMAIQSTR2,(5*NOBJ)*6*020h ;SPACE TO STORE DMAINT Q
|
||
.BSS DMAIQBOT2,0 ;
|
||
.BSS DMAIQACT,32 ;ACTIVE DMA Q
|
||
|
||
.BSS XBASE,32 ;BASE POSITIONS
|
||
.BSS YBASE,32
|
||
.BSS ZBASE,32
|
||
.BSS XSCROLL,32 ;SCROLL VELOCITIES
|
||
.BSS YSCROLL,32
|
||
.BSS ZSCROLL,32
|
||
.BSS XSACCEL,32 ;SCROLL ACCELERATIONS
|
||
.BSS YSACCEL,32
|
||
.BSS ZSACCEL,32
|
||
.BSS YWORLD,32 ;GROUND PLANE WORLD Y
|
||
.BSS ZFAR,32 ;FARTHEST Z POSITION ON SCREEN
|
||
; .BSS ZFARU,32 ;FARTHEST Z UNIVERSE POSITION
|
||
.BSS ZCLOSE,32 ;CLOSEST Z POSITION ON SCREEN
|
||
.BSS ZBASE_HR,32 ;hi res version of ZBASE
|
||
.BSS YHALF,16 ;HALF Y VALUE FOR TRANSLATION
|
||
|
||
.BSS WORLD_GRNDOFF,32 ;Added in ground coll and Shadows
|
||
|
||
.BSS INVELADD,16 ;we're VELADDing or we just did
|
||
*LOCAL VARS
|
||
|
||
.text
|
||
|
||
**************************************************************************
|
||
CLRDMAQ
|
||
;*** GET STUFF READY FOR DMAINTS ***
|
||
PUSHST
|
||
DINT
|
||
movi DMAREGS,B11
|
||
movi DMAIQBOT2,B13 ;DMAQTL Assume Q2
|
||
MOVE @DMAIQACT,B12,L ;DMAQHD
|
||
CMPI DMAIQBOT,B12
|
||
JRHI DIS_THE_INT
|
||
movi DMAIQBOT,B13 ;DMAQTL
|
||
DIS_THE_INT
|
||
setf 1,0,0
|
||
clr B14
|
||
move B14,@(INTENB+B_X1E),0 ;disable interrupt no that we're done
|
||
POPST
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DISPLAY *
|
||
* *
|
||
* DO MANUAL DMAs *
|
||
* PLOT ROAD *
|
||
* ADD VELOCITIES, GRAVITY *
|
||
* DISPLAY THE FOREGROUND & BACKGROUND PLANES *
|
||
* *
|
||
* CALLED AT END OF SCREEN INTERRUPT *
|
||
* *
|
||
* NOTE: IT IS ASSUMED THAT THE DMA IS STOPPED UPON ENTRY *
|
||
* *
|
||
* DOUBLE NOTE: A14 IS USED THROUGHOUT THIS ROUTINE AS SCREEN TOP/LEFT, *
|
||
* THEREFORE, DO NOT USE MACROS THAT TRASH A14!! *
|
||
* *
|
||
**************************************************************************
|
||
DISPLAY:
|
||
MOVE @DISPLAYON,A0,W
|
||
JREQ DISPX ;BR = STOP ALL NEW DISPLAY PROCESSING
|
||
|
||
callr CLRDMAQ
|
||
|
||
;DELETED CALL TO SET_DAM_WINDOW
|
||
|
||
; MOVE @PAUSE_GAME,A14,W ;ARE WE IN PAUSE MODE?
|
||
; JRNZ SkSCROLL
|
||
|
||
;ADJUST WORLD COORS FOR SCROLL
|
||
; move @SCROLLX,A14,L
|
||
; move @WORLDX,A1,L
|
||
; add A14,A1
|
||
; move A1,@WORLDX,L
|
||
|
||
; move @WORLDY,A0,L
|
||
; srl 16,A1
|
||
; movx A1,A0
|
||
; move A0,@WORLDXY,L
|
||
|
||
; callr BgScroll ;update P_XPOS for backplanes
|
||
;SkSCROLL
|
||
MOVE @SCRNTL,A14,L ;GET SCREEN BOUNDARIES
|
||
MOVE @SCRNBR,A13,L ;THESE MUST STAY VALID FROM HERE THRU CLIP
|
||
|
||
movi DMAGOREG,B1
|
||
|
||
*
|
||
* Dump the MANUAL DMA Queue. The DMA clip window will be opened all of
|
||
* the way. Therefore these DMAs do not heed the normal object world
|
||
* constraints.
|
||
*
|
||
MOVE @QDMAFLG,A2 ;Q BEING MODIFIED?
|
||
JRNE DISPMANX ;YES, DON'T SCREW WITH IT
|
||
MOVE @DMAQCUR,A8,L
|
||
MOVI DMAQ+QSIZE,A1
|
||
CMP A1,A8 ;ANYTHING IN THE QUEUE?
|
||
JREQ DISPMANX ;NONE
|
||
MOVE A1,@DMAQCUR,L ;RESET TOP OF QUEUE
|
||
|
||
MOVI [2*SCRHGHT,0],A2
|
||
MOVE A2,@DMAWINDOW,L ;FULL HEIGHT WINDOW
|
||
|
||
MOVE @DMACFIGCOPY,A2,L ; XUNIT
|
||
ANDNI DMAWIN,A2
|
||
MOVE A2,@DMACONFIG,L ; XUNIT CONFIGURE DMA TO ADJUST WINDOW WIDTH
|
||
|
||
.if CENTER_SCREEN
|
||
|
||
MOVI [511,SCRLFT],A0
|
||
|
||
.else
|
||
|
||
MOVI [SCRRGT,SCRLFT],A0
|
||
|
||
.endif
|
||
|
||
MOVE A0,@DMAWINDOW,L ;FULL WIDTH
|
||
ORI DMAWIN,A2
|
||
; MOVE A2,@DMACFIGCOPY,L ; XUNIT
|
||
MOVE A2,@DMACONFIG,L ; XUNIT LEAVE CONFIG'D FOR TOP/BOT ADJUSTMENT
|
||
|
||
DMANLP:
|
||
|
||
subi 32*6,A1
|
||
|
||
move A1,A0
|
||
mmfm A0,A9,A6,A5,A4,A3,A2
|
||
|
||
movi DMAREGS,A7
|
||
|
||
;*** WAIT FOR DMA NOT BUSY ***
|
||
|
||
DMAWT1: MOVE *B1,B14,L ;DMA BUSY?
|
||
JRN DMAWT1 ;BR = YES
|
||
|
||
;STUFF DMA REGS
|
||
mmtm A7,A2,A3,A4,A5,A6,A9
|
||
;A2 Y-SCALE:X-SCALE
|
||
;A3 CONST:PALETTE
|
||
;A4 Y-SIZE:X-SIZE
|
||
;A5 DAG
|
||
;A6 SAG
|
||
;A9 CONTROL:OFFSET
|
||
|
||
DMAWT2: MOVE *B1,B14,L ;DMA BUSY?
|
||
JRN DMAWT2 ;BR = YES
|
||
|
||
CMP A8,A1 ;HAVE WE EMPTIED THE QUEUE?
|
||
JRHI DMANLP ;BR = NO, LET'S DO SOME MORE
|
||
|
||
DISPMANX:
|
||
|
||
move @NO_MIRROR,B5,W ;Are we mirroring
|
||
jrz SetMir ;BR = Yes
|
||
movi DCLIP_NOMIRROR,B5 ;Clip routine for no mirror
|
||
jruc MirDun
|
||
SetMir
|
||
movi DCLIP_MIRROR,B5 ;Clip routine for mirror
|
||
MirDun
|
||
*Note: B5 must stay valid from here through PutPlanes
|
||
|
||
*SET THE DMA WINDOW FOR OBJECT CLIPPING
|
||
MOVE A14,A0 ;GET THE SCREEN WINDOW TOP
|
||
SRL 16,A0 ;POSITION IT PROPERLY
|
||
MOVY A13,A0 ;GET THE SCREEN WINDOW BOTTOM Y
|
||
move @PAGE,A7,W
|
||
jrz DISP_DMA_WIN
|
||
ADDI [SCRHGHT,SCRHGHT],A0
|
||
DISP_DMA_WIN
|
||
MOVE A0,@DMAWINDOW,L ;SET WORLD HEIGHT
|
||
|
||
MOVE A13,A0
|
||
SLL 16,A0
|
||
MOVX A14,A0 ;Get the screen [Right,Left] values
|
||
|
||
.if CENTER_SCREEN
|
||
|
||
; ADDXYI [CENTER_XSHIFT,CENTER_XSHIFT],A0
|
||
ADDXYI [CENTER_XSHIFT+8,CENTER_XSHIFT-8],A0 ;Must buffer, so we don't see DMA
|
||
;clipping bug. This only works when
|
||
;Bitmap is centered
|
||
.endif
|
||
|
||
MOVE @DMACFIGCOPY,A7,L
|
||
ANDNI DMAWIN,A7
|
||
MOVE A7,@DMACONFIG,L ;CONFIGURE DMA TO ADJUST WINDOW WIDTH
|
||
MOVE A0,@DMAWINDOW,L ;FULL WIDTH
|
||
|
||
ORI DMAWIN,A7
|
||
MOVE A7,@DMACONFIG,L ;LEAVE CONFIG'D FOR TOP/BOT ADJUSTMENT
|
||
|
||
MOVE @SKIPDISP,A0,W ;IS THE DISPLAY TURNED OFF?
|
||
jrnz CHK_SYNCSND ; was DISPX ;BR = YES
|
||
|
||
;BREGS USED IN DISPLAY LOOP
|
||
;B0 YMINTBL pointer
|
||
;B1 DMAGOREG
|
||
;B2 immediate val DMAREGS
|
||
;B3 non-zero to set new window
|
||
;B4 WORLDTL-in disp loop
|
||
;B5 MIRROR/NOMIRROR JUMP
|
||
;B6 is NOW USED for scale mama processing check
|
||
;B7 FGND PLANE TBL INDEX
|
||
;B8 BGND PLANE TBL INDEX
|
||
;B9 SCRATCH
|
||
;B10 SCREEN_WIDTH-1, used in DCLIP loop for MIRROR
|
||
;B11,B12,B13 ALWAYS USED FOR DMA INTERRUPT
|
||
;B14 SCRATCH
|
||
|
||
;AREGS FOR DISPLAY LOOP
|
||
*A0 CURRENT OBJ
|
||
*A1<-OFFSET
|
||
*A2<-AMOUNT TO CLIP OFF BOTTOM, RIGHT (BC,RC)
|
||
*A3<-AMOUNT TO CLIP OFF TOP, LEFT (TC,LC)
|
||
*A4 LIST START
|
||
*A5 Page Offset
|
||
*A6<-SCREEN TOP LEFT (SCREEN COORDINATES); THEN TOTAL HORIZ. SIZE
|
||
*A7=scratch register
|
||
*A8 M_FLIPH (used to set flags for mirror)
|
||
*A9<- VS : HS
|
||
*A10<- DAG (Y : X)
|
||
*A11<- SAG
|
||
*A12<- control word b0-15; offset b16-31
|
||
*A13 ENTERS AS the window BOTTOM RT
|
||
*A14 ENTERS AS the window TOP LEFT
|
||
|
||
*** MOVE @SCRNTL,A14,L ;GET SCREEN BOUNDARIES
|
||
*** MOVE @SCRNBR,A13,L
|
||
|
||
; MOVE @ROADPAL,A7,W
|
||
; JRZ NO_ROAD1 ;CHECK IF ROAD SHOULD BE PAVED
|
||
; CALLA START_ROAD ;YEAH! PAVE THE MOTHER!
|
||
;NO_ROAD1
|
||
|
||
;movi M_FLIPH,A8 ;I TOOK DIS OUT
|
||
|
||
move @PAGEADDR,A5,L
|
||
|
||
movi DMAREGS,B2
|
||
|
||
callr PrePutPlanes
|
||
|
||
**** move @NO_MIRROR,B5,W
|
||
**** jrnz SetNoMir
|
||
**** movi DCLIP_MIRROR,B5
|
||
**** jruc MirSet
|
||
****SetNoMir
|
||
**** movi DCLIP_NOMIRROR,B5
|
||
****MirSet
|
||
|
||
movi SCREEN_WIDTH-1,B10 ; for DCLIP_MIRROR
|
||
|
||
calla PutPlanes
|
||
|
||
DISPX:
|
||
|
||
CALLR VELADD ;VELOCITY UPDATE OF FOREGROUND OBJS
|
||
|
||
|
||
; MOVE @ROADPAL,A2,W
|
||
; JRZ NO_ROAD2 ;CHECK IF ROAD SHOULD BE PAVED
|
||
; CALLA DO_ROAD ;FOR NEXT DISPLAY CALL
|
||
; RETS
|
||
;NO_ROAD2
|
||
move @GAMERASE,A0,W ; negative indicates horizon method
|
||
JRNN D_NO_HORIZON
|
||
CALLR CALCULATE_HORIZON
|
||
D_NO_HORIZON
|
||
RETS
|
||
|
||
|
||
|
||
* If the display system is turned off,
|
||
* check to see if a movie clip wants
|
||
* to make a sound call
|
||
*
|
||
CHK_SYNCSND:
|
||
move @SYNCIRQ,a14
|
||
jrz DISPX ; not waiting
|
||
move @WAVEIRQS,a8
|
||
cmp a8,a14 ; did we reach desired spot?
|
||
jrgt DISPX ; no
|
||
move @CLIPSND,a0,L
|
||
calla ONESND
|
||
clr a14
|
||
move a14,@SYNCIRQ ; clear it
|
||
jruc DISPX
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BgScroll *
|
||
* *
|
||
* Update all of the infinity planes' positions. *
|
||
* *
|
||
* X is based on the current UNIVX position. (not implemented) *
|
||
* Y is based off of the HORIZON line. *
|
||
* *
|
||
**************************************************************************
|
||
BgScroll:
|
||
movi BGLISTS,A0
|
||
move @BGPLANECT,A1,W ;Get the current plane count
|
||
jrz ScrollPlnX ;BR = there are no infinity planes
|
||
|
||
MOVE @HORIZON,A14,W
|
||
MOVE @HORIZON_BASE,A13,W
|
||
SUB A14,A13
|
||
SLL 16,A13 ;Update the horizon offset
|
||
|
||
MOVE @XSCROLL,A14,L
|
||
ScrollLp
|
||
;*** UPDATE SCROLL POSITION OF FGND PLANE ***
|
||
MOVE *A0(P_XRATE),A2,L ;plane X scroll multiplier
|
||
JRZ BGS_SKIP_XSCROLL
|
||
MPYS A14,A2 ;64 bit mpy, result -> A2:A3
|
||
SLL 16,A2 ;16.16 * 16.16 -> 32.32, want 16.16
|
||
SRL 16,A3
|
||
MOVX A3,A2
|
||
MOVE *A0(P_XPOS),A3,L ;old X position
|
||
ADD A2,A3
|
||
MOVE A3,*A0(P_XPOS),L ;new accumulated X value
|
||
|
||
BGS_SKIP_XSCROLL
|
||
;*** Update Y position of plane
|
||
move A13,*A0(P_YPOS),L ;New horizon based Y position
|
||
|
||
addi PLNSIZ,A0
|
||
dsjs A1,ScrollLp
|
||
ScrollPlnX
|
||
rets
|
||
|
||
**************************************************************************
|
||
PrePutPlanes:
|
||
;Set up B9 as index into BGLISTS
|
||
|
||
move @BGPLANECT,B14,W ;# of bgnd planes
|
||
movi PLNSIZ,B9
|
||
mpyu B14,B9
|
||
addi BGLISTS-PLNSIZ,B9
|
||
move B9,B8
|
||
; calla SET_FIRST_HILL ; set up first hill
|
||
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INIT_HORIZON - INITIALIZE THE HORIZON LINE THIS WAVE. *
|
||
* *
|
||
**************************************************************************
|
||
INIT_HORIZON:
|
||
clr a0
|
||
dec a0
|
||
move a0,@GAMERASE ; negative indicates horizon method
|
||
CALLR CALCULATE_HORIZON
|
||
CALLR CALCULATE_HORIZON_BASE
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CALCULATE_HORIZON - CALCULATE THE CURRENT HORIZON LINE, BASED *
|
||
* ON THE CURRENT STATE OF THE WORLD. *
|
||
* RETURNS: *
|
||
* A1 = CURRENT HORIZON *
|
||
* NOTE: TRASHES A0 *
|
||
* *
|
||
**************************************************************************
|
||
CHANGE_ZFAR:
|
||
move a0,@ZFAR,L ; (must be WORLD referenced!)
|
||
|
||
MOVK 1,A14 ;FORCE UNIVERSE UPDATE
|
||
MOVE A14,@UNIVERR,W
|
||
|
||
jruc CALC_HORZ_FROM_Z
|
||
CALCULATE_HORIZON
|
||
MOVE @ZFAR,A0,L
|
||
CALC_HORZ_FROM_Z:
|
||
MOVE @YWORLD,A1,L
|
||
MOVE @YBASE,A14,L
|
||
ADD A14,A1
|
||
divs a0,a1
|
||
MOVE @YHALF,A14,W
|
||
ADD A14,A1
|
||
; srl 1,a1
|
||
; sll 1,a1 ; HORIZON MUST BE EVEN (for SRT_CLR)
|
||
move a1,@HORIZON,W ;THE REAL DEAL
|
||
srl 1,a1
|
||
sll 1,a1 ; HORIZON MUST BE EVEN (for SRT_CLR)
|
||
CMPI 0FEH,A1
|
||
JRLE IH_OK
|
||
MOVI 0FEH,A1
|
||
IH_OK
|
||
MOVE A1,@SRT_HORIZON,W ;SPECIAL CROPPED VERSION FOR SRT_CLEAR
|
||
RETS
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CALCULATE_HORIZON_BASE - CALCULATE THE CURRENT HORIZON BASE LINE, BASE *
|
||
* ON THE INTIAL STATE OF THE WORLD. *
|
||
* RETURNS: *
|
||
* A1 = HORIZON BASE *
|
||
* NOTE: TRASHES A0 *
|
||
* *
|
||
**************************************************************************
|
||
CALCULATE_HORIZON_BASE
|
||
MOVE @YWORLD,A1,L
|
||
MOVE @ZFAR,A0,L
|
||
divs a0,a1
|
||
MOVE @YHALF,A14,W
|
||
ADD A14,A1
|
||
move a1,@HORIZON_BASE,W ;THE REAL DEAL
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* VELOCITY ADD AND SCREEN BOUNDARY CHECK *
|
||
* *
|
||
* a0 = Obj Block *
|
||
* a1 = ZFAR (univ) *
|
||
* a2 = End of Obj List *
|
||
* a3 = scratch *
|
||
* a4 = SCRATCH *
|
||
* a5 = XBASE *
|
||
* a6 = M_OFSCRN (const) *
|
||
* a7 = Multi part obj block *
|
||
* a8 = ZPOS *
|
||
* a9 = YPOS *
|
||
* a10 = XPOS *
|
||
* a11 = YVEL *
|
||
* a12 = XVEL *
|
||
* a13 = ZVEL *
|
||
* a14 = OFLAGS *
|
||
* *
|
||
* B0 = PRIMARY X LEFT SHIFT VALUE FOR UNIVERSE CHECK *
|
||
* B1 = PRIMARY Y LEFT SHIFT VALUE FOR UNIVERSE CHECK *
|
||
* B2 = SCRATCH *
|
||
* B3 = ZMAX_REAL2 (UNIVERSE) *
|
||
* B4 = ZMAX_KLUDGE (UNIVERSE) *
|
||
* b5 = avail *
|
||
* B6 = SCRATCH *
|
||
* B7 = SECONDARY X LEFT SHIFT VALUE FOR UNIVERSE CHECK *
|
||
* B8 = SECONDARY Y LEFT SHIFT VALUE FOR UNIVERSE CHECK *
|
||
* B9 = YBASE *
|
||
* B14 = SCRATCH *
|
||
* *
|
||
**************************************************************************
|
||
VELADD:
|
||
MOVE @PAUSE_GAME,A14,W ;ARE WE IN PAUSE MODE?
|
||
JRNZ VADDX
|
||
|
||
MOVK 1,A14
|
||
MOVE A14,@INVELADD,W ;we're VELADDing
|
||
|
||
INCM @WAVEVEL,W ; tell the world we been here
|
||
|
||
MOVE @YBASE,B9,L
|
||
|
||
MOVE @ZFAR,A1,L
|
||
MOVI FGLIST,A0
|
||
move a0,a2
|
||
; move @ZSCROLL,b5,L
|
||
move @ZBASE,a4,L
|
||
add a4,a1
|
||
MOVE A4,B3
|
||
MOVE A4,B4
|
||
ADDI ZMAX_REAL2,B3
|
||
ADDI ZMAX_KLUDGE,B4
|
||
move @XBASE,a5,L
|
||
movi M_OFSCRN,a6
|
||
jruc VADD
|
||
|
||
.align
|
||
|
||
;***** OBJECT VELOCITY ADD LOOP *****
|
||
DVEL
|
||
move *A0(OPART1),A3,L ; Is this a multi parter?
|
||
jrz SkMultiV ; jump if no
|
||
|
||
cmp A3,A0 ;HEAD OBJ?
|
||
jrne VADD ;If No, go to next object
|
||
|
||
;*** MULTI PART OBJ ***
|
||
move A3,A7
|
||
ADDI OZVEL,A3 ;add in OZVEL
|
||
MMFM A3,A11,A12,A13 ;LOAD A13:OZVEL, A12:OXVEL, A11:0YVEL
|
||
|
||
; MOVE *A0(OFLAGS),A14,W
|
||
; BTST B_SCRNOBJ,A14
|
||
; JRNZ MultiVLp
|
||
;
|
||
; MOVE B5,A3
|
||
; sub A3,A13 ; Use ZSCROLL as ZVEL
|
||
MultiVLp
|
||
move A7,A3 ;get obj base in A3 for pull of vals
|
||
MOVE *A7(OFLAGS),A14,W
|
||
|
||
addi OXVAL,A3
|
||
MMFM A3,A8,A9,A10 ;LOAD A10:OXPOS, A9:OYPOS, A8:OZPOS
|
||
andn a6,a14 ; Assume onscreen
|
||
|
||
BTST B_SCRNOBJ,A14
|
||
JRNZ zokM
|
||
|
||
MOVE B4,A4
|
||
BTST B_DBLSCL,A14
|
||
JRZ VAM_NODUB ;BR=NOT DOUBLE SCALE
|
||
MOVE B3,A4
|
||
VAM_NODUB
|
||
ADD A13,A8 ;ADD Z VELOCITY TO ZVAL
|
||
cmp a4,a8 ; Don't allow ZVAL to get too low
|
||
jrlt mrkoffM
|
||
cmp A1,a8 ;COMPARE AGAINST ZFAR
|
||
jrle zokM
|
||
mrkoffM:
|
||
or a6,a14 ; Mark as offscreen
|
||
zokM:
|
||
ADD A12,A10 ;ADD X VELOCITY TO XVAL
|
||
btst B_SHAD,a14 ; Shadows don't use Y vel
|
||
jrnz SkYVAdd1
|
||
ADD A11,A9 ;ADD Y VELOCITY TO YVAL
|
||
SkYVAdd1
|
||
MMTM A3,A8,A9,A10
|
||
|
||
BTST B_SCRNOBJ,A14
|
||
JRZ NOT_SCRNOBJ_MULTI
|
||
SRL 16,A10
|
||
MOVY A9,A10
|
||
MOVE A10,*A7(ODAG),L
|
||
NOT_SCRNOBJ_MULTI
|
||
*
|
||
* removed off screen check from here... WARREN 1/7/94
|
||
*
|
||
move a14,*a7(OFLAGS)
|
||
NOFLAGS_SCRNOBJ
|
||
* Check to see if we got out of order
|
||
MOVE A13,A13
|
||
JRZ VAM_NO_ZMOTION ;BR = We did not move in Z
|
||
JRP VAM_ZPLUS
|
||
|
||
MOVE *A7(OBLINK),A14,L
|
||
CMP A2,A14
|
||
JREQ VAM_NO_ZMOTION
|
||
|
||
MOVE *A14(OZVAL),A14,L
|
||
CMP A14,A8
|
||
JRGE VAM_NO_ZMOTION ;BR = Still in line
|
||
JRUC VAM_SET_NOT_SORTED
|
||
|
||
VAM_ZPLUS
|
||
MOVE *A7,A14,L
|
||
CMP A2,A14
|
||
JREQ VAM_NO_ZMOTION
|
||
MOVE *A14(OZVAL),A14,L
|
||
CMP A14,A8
|
||
JRLE VAM_NO_ZMOTION ;BR = Still in line
|
||
VAM_SET_NOT_SORTED
|
||
MOVE A6,*A7(ONOT_SORTED),W
|
||
VAM_NO_ZMOTION
|
||
move *A7(OPARTS),A7,L
|
||
jrnz MultiVLp
|
||
|
||
jruc CkGrav_multi
|
||
|
||
SkMultiV:
|
||
*LOAD A13:OZVEL, A12:OXVEL, A11:0YVEL, A10:OXPOS, A9:OYPOS, A8:OZPOS
|
||
move A0,A3 ;get obj base in A3 for pull of vals
|
||
ADDI OZVEL,A3 ;ADD IN OZVEL
|
||
|
||
MOVE *A0(OFLAGS),A14,W
|
||
andn a6,a14 ; Assume onscreen first
|
||
|
||
MMFM A3,A8,A9,A10,A11,A12,A13
|
||
|
||
BTST B_SCRNOBJ,A14
|
||
JRNZ zok
|
||
|
||
MOVE B4,A4
|
||
BTST B_DBLSCL,A14
|
||
JRZ VA_NODUB ;BR=NOT DOUBLE SCALE
|
||
MOVE B3,A4
|
||
VA_NODUB
|
||
ADD A13,A8 ;ADD Z VELOCITY TO ZVAL
|
||
cmp a4,a8 ; Don't allow ZVAL to get too low
|
||
jrlt mrkoff
|
||
cmp A1,a8 ;COMPARE AGAINST ZFAR
|
||
jrle zok
|
||
mrkoff:
|
||
or a6,a14 ; Mark as offscreen
|
||
zok:
|
||
ADD A12,A10 ;ADD X VELOCITY TO XVAL
|
||
btst B_SHAD,a14 ; Shadows don't use Y vel
|
||
jrnz SkYVAdd0
|
||
ADD A11,A9 ;ADD Y VELOCITY TO YVAL
|
||
SkYVAdd0
|
||
MMTM A3,A8,A9,A10
|
||
|
||
BTST B_SCRNOBJ,A14
|
||
JRZ NOT_SCRNOBJ
|
||
SRL 16,A10
|
||
MOVY A9,A10
|
||
MOVE A10,*A0(ODAG),L
|
||
NOT_SCRNOBJ
|
||
*
|
||
* removed off screen check from here... WARREN 1/7/94
|
||
*
|
||
move a14,*a0(OFLAGS)
|
||
|
||
* Check to see if we got out of order
|
||
MOVE A13,A13
|
||
JRZ VAS_NO_ZMOTION ;BR = We did not move in Z
|
||
JRP VAS_ZPLUS
|
||
|
||
MOVE *A0(OBLINK),A14,L
|
||
CMP A2,A14
|
||
JREQ VAS_NO_ZMOTION
|
||
|
||
MOVE *A14(OZVAL),A14,L
|
||
CMP A14,A8
|
||
JRGE VAS_NO_ZMOTION ;BR = Still in line
|
||
JRUC VAS_SET_NOT_SORTED
|
||
|
||
VAS_ZPLUS
|
||
MOVE *A0,A14,L
|
||
CMP A2,A14
|
||
JREQ VAS_NO_ZMOTION
|
||
MOVE *A14(OZVAL),A14,L
|
||
CMP A14,A8
|
||
JRLE VAS_NO_ZMOTION ;BR = Still in line
|
||
VAS_SET_NOT_SORTED
|
||
MOVE A6,*A0(ONOT_SORTED),W
|
||
VAS_NO_ZMOTION
|
||
|
||
CkGrav_multi
|
||
move *A0(OYACCEL),A3,W
|
||
jrz SkGrav
|
||
add A3,A11
|
||
move A11,*A0(OYVEL),L
|
||
SkGrav
|
||
|
||
VADD:
|
||
move *A0,A0,L ;GET NEXT ONE FOLKS
|
||
cmp A0,A2
|
||
JRNE DVEL
|
||
*
|
||
*UPDATE SCROLL VALUES
|
||
*
|
||
MOVI XSCROLL,A7
|
||
MMFM A7,A4,A5,A6 ;GET SCROLL VELOCITIES
|
||
MOVI XBASE,A14
|
||
|
||
MMFM A14,A2,A3 ;GET BASE POSITIONS
|
||
addk 32,a14
|
||
move @ZBASE_HR,a1,L
|
||
ADD A4,A1 ;UPDATE Z BASE
|
||
move a1,@ZBASE_HR,L
|
||
sra ZFRAC,a1 ; convert Z to lores
|
||
ADD A6,A3 ;UPDATE X BASE
|
||
ADD A5,A2 ;UPDATE Y BASE
|
||
JRNN D_YOK ;BR=NOT GOING UNDER GROUND
|
||
CLR A2 ;RESET TO GROUND
|
||
D_YOK
|
||
MMTM A14,A1,A2,A3 ;STORE BASE POSTIONS
|
||
MOVI XSACCEL,A14
|
||
MMFM A14,A1,A2,A3 ;GET SCROLL ACCELERATIONS
|
||
ADD A1,A4 ;UPDATE Z SCROLL
|
||
ADD A2,A5 ;UPDATE Y SCROLL
|
||
ADD A3,A6 ;UPDATE X SCROLL
|
||
MMTM A7,A4,A5,A6 ;STORE SCROLL VELOCITIES
|
||
|
||
callr BgScroll ;Update positions for Infinity planes
|
||
VADDX
|
||
RETS
|
||
|
||
.text
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INFINITY_PLANES - COMPUTE DAGs FOR ALL OF THE INFINITY OBJECTS *
|
||
* BASED ON THEIR PLANES CURRENT POSITION. ALSO HANDLES *
|
||
* THE HORIZON LINE OFFSET FOR US. *
|
||
* *
|
||
* REGISTER USAGE: *
|
||
* A0 = OBJECT PTR *
|
||
* A4 = PLANE POINTER *
|
||
* A5 = BECOMES ODAG FOR EACH OBJECT *
|
||
* A6 = [Y,X] WORLD OFFSET *
|
||
* A14 = SCRATCH *
|
||
* *
|
||
* B9 = PLANE COUNTER *
|
||
* *
|
||
**************************************************************************
|
||
INFINITY_PLANES
|
||
MOVI BGLISTS,A4
|
||
MOVE @BGPLANECT,B9,W ;GET THE NUMBER OF PLANES
|
||
JRZ IP_X ;BR = NONE, LET'S BOOK
|
||
; MOVE @HORIZON,A14,W
|
||
; MOVE @HORIZON_BASE,A7,W
|
||
; SUB A14,A7
|
||
; SLL 16,A7 ;ADD THIS HORIZON OFFSET TO EVERYTHING
|
||
.ALIGN
|
||
IP_PLNLP
|
||
move *A4(P_YPOS),A6,L
|
||
move *A4(P_XPOS),A14,L
|
||
srl 16,A14
|
||
movx A14,A6 ;B4 = WORLD TOP LEFT [Y,X]
|
||
move *A4(P_XYOFF),A14,L
|
||
|
||
addxy A14,A6
|
||
; ADDXY A7,A6
|
||
MOVE A4,A0 ;LIST TO PROCESS
|
||
JRUC IP_NEXT
|
||
IP_DOOBJ
|
||
move *A0(OYPOS),A5,W
|
||
sll 16,A5
|
||
move *A0(OXPOS),A14,W
|
||
movx A14,A5 ;COMBINED WORLD COORDS
|
||
subxy A6,A5 ;NOW ADJUST TO SCREEN
|
||
MOVE A5,*A0(ODAG),L ;STUFF THE NEW DAG
|
||
IP_NEXT
|
||
MOVE *A0,A0,L ;GET NEXT LINK
|
||
CMP A0,A4
|
||
JRNE IP_DOOBJ ;DONE?
|
||
move B8,A0 ;Get Obj List Head
|
||
ADDI PLNSIZ,A4
|
||
DSJ B9,IP_PLNLP
|
||
IP_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCALE_MAMA - compute scale factor algorithmically , then Scrn Pos *
|
||
* *
|
||
**************************************************************************
|
||
*
|
||
* a0 = obj
|
||
* a1 = scratch
|
||
* a2 = new YSCALE
|
||
* a3 = 10000h for inverse scale computation
|
||
* B3 = OZVAL
|
||
* a4 = start of FGLIST
|
||
* a5 = SCRN TL
|
||
* B5 = OYVAL
|
||
* a6 = new XSCALE
|
||
* a7 =
|
||
* B7 = OXVAL
|
||
* B8 = XBASE
|
||
* a8 = OFLAGS
|
||
* a9 = scratch, then ODAG
|
||
* B10 = YBASE
|
||
* a10 = IHOFF change limit
|
||
* a11 = scratch
|
||
* a12 = Scrn BR
|
||
* a13 = inverse scale
|
||
* B14 = ZBASE
|
||
* a14 = IHDRSIZ
|
||
|
||
LIMIT1 .set 01C0h ; IHOFF grow limit
|
||
|
||
|
||
SCALE_MAMA:
|
||
MOVI FGLIST,A0
|
||
MOVE A0,A4
|
||
movi LIMIT1,a10 ; Change to next half size
|
||
movi IHDRSIZ,a14
|
||
movi 10000h,a3 ; for inverse scale computation
|
||
movi OXVAL,B0
|
||
movi ZMAX,B2 ; index base for ROADX and ROADY tables
|
||
movi HALFX,B4
|
||
MOVE @YHALF,B6,W
|
||
move @XBASE,b8,L
|
||
move @YBASE,b10,L
|
||
move @ZBASE,b14,L
|
||
MOVE @SCRNTL,A5,L ;GET SCREEN BOUNDARIES
|
||
MOVE @SCRNBR,A12,L ; FOR OFSCRN COMPUTATION in COMP_SCRN_POS
|
||
JRUC SCL_NXT_OBJ
|
||
.align
|
||
SCALE_LP
|
||
MOVE *A0(OFLAGS),A8,W
|
||
|
||
btst B_OFSCRN,a8 ; if OFSCRN, do not scale or compute DEST
|
||
jrnz SCL_NXT_OBJ
|
||
BTST B_SCRNOBJ,A8
|
||
JRNZ SCL_NXT_OBJ
|
||
move A0,B1 ;get obj base in b1 for pull of vals
|
||
add B0,B1 ; offset by OXVAL
|
||
MMFM B1,B3,B5,B7 ;LOAD B7:OXPOS, B5:OYPOS, B3:OZPOS
|
||
; .if DEBUG
|
||
; LOCKON N
|
||
; .endif
|
||
sub b14,b3 ; convert to world
|
||
|
||
MOVE *A0(OSCALEX),A7 ; previous X scale in a7
|
||
|
||
BTST B_NOSCALE,A8
|
||
JRNZ KEEP_OLD_SCALE
|
||
|
||
BTST B_MANSCALE,A8
|
||
JRZ SkpSclLod
|
||
|
||
ORI M_NOSCALE,a8 ; reset rescale signal
|
||
move a8,*a0(OFLAGS)
|
||
move *a0(ONuManScl),a6
|
||
clr a7 ; force new scale
|
||
jruc ManScaleSt
|
||
|
||
SkpSclLod:
|
||
move B3,a6 ; save ZPOS for DAG computation
|
||
sra Z2SCALE,a6 ; compute scale factor
|
||
BTST B_DBLSCL,A8
|
||
JRZ ManScaleSt
|
||
srl 1,a6 ; double the scale if DBLSCL set
|
||
*
|
||
* Compute and Set IHOFF
|
||
*
|
||
ManScaleSt:
|
||
movk NUM_SIZES-1,a1 ; Full, Half, qrtr or eighth
|
||
clr a11 ; assume no new IHOFF at first
|
||
ihoflp:
|
||
cmp a10,a6 ;
|
||
jrlt ihoff_fnd
|
||
add a14,a11 ; IHOFF points to next img
|
||
srl 1,a6 ; adjust scale accordingly
|
||
dsjs a1,ihoflp
|
||
|
||
ihoff_fnd:
|
||
move *a0(OIHOFF),a1 ; see if it has changed
|
||
cmp a1,a11
|
||
jreq ChkNxtScl
|
||
*
|
||
* Set New IHOFF
|
||
*
|
||
move a11,*a0(OIHOFF) ; switch to smaller image
|
||
move *a0(OIMG),a9,L
|
||
add a11,a9
|
||
|
||
addi ISIZE,a9
|
||
mmfm a9,a1,a2,a11 ; ISIZE in a11, ISAG in a2, IANIOFF in a1
|
||
|
||
move A11,*A0(OSIZE),L
|
||
MOVE A11,*A0(OUSIZE),L
|
||
move a2,*A0(OSAG),L
|
||
MOVE A1,*A0(OANIOFF),L
|
||
MOVE A1,*A0(OUANIOFF),L
|
||
|
||
ChkNxtScl:
|
||
cmp a6,a7 ; new X scale in a6
|
||
JRNE DO_NEW_SCALE
|
||
KEEP_OLD_SCALE
|
||
MOVE *A0(OSIZE),a9,L
|
||
MOVE *A0(OANIOFF),a1,L
|
||
JRUC COMP_SCRN_POS
|
||
|
||
DO_NEW_SCALE
|
||
MOVE A6,*A0(OSCALEX)
|
||
MOVE A6,*A0(OSCALEY)
|
||
|
||
MOVE *A0(OUSIZE),A9,L ;Unscaled size in a1
|
||
MOVE *A0(OUANIOFF),A1,L ;Unscaled animation pnt in A1
|
||
|
||
move a3,a13 ;10000h
|
||
divu a6,a13 ;Inverse of scale in a13
|
||
|
||
BTST B_SHAD,A8 ;Is this a shadow object?
|
||
JRZ NORMAL_SCALE ;BR = No, then do normal calculation
|
||
|
||
move a3,a7 ;10000h
|
||
sll SLL_SHADOW,a6 ;Shrink it another 75% in Y
|
||
MOVE A6,*A0(OSCALEY),W ;Need to make sure this changes
|
||
divu a6,a7 ;Inverse of Y scale in A7
|
||
|
||
setf 12,1,1 ;change FS1 to quicken multiplies
|
||
clr a11
|
||
movx A9,a11
|
||
mpyu A13,A11 ;Scale the X size, result in A11
|
||
srl 8,a11
|
||
srl 8,A9
|
||
mpyu a7,A9 ;Scale the Y size, result in A1
|
||
movx a11,A9 ;Recombine sizes for storage
|
||
|
||
move A1,A11
|
||
sext a11
|
||
mpys A13,A11 ;Scale the X animation pnt
|
||
sra 8,a11
|
||
sra 16,A1
|
||
mpys a7,A1 ;Scale the Y animation pnt
|
||
JRUC NORMAL_SCALE_FINISH
|
||
|
||
NORMAL_SCALE
|
||
setf 12,1,1 ; change FS1 to quicken multiplies
|
||
clr a11
|
||
movx A9,a11
|
||
mpyu A13,A11 ; result in a11
|
||
srl 8,a11
|
||
srl 8,A9
|
||
mpyu a13,A9
|
||
movx a11,A9
|
||
|
||
move A1,A11
|
||
sext a11
|
||
mpys A13,A11 ; result in a11
|
||
sra 8,a11
|
||
sra 16,A1
|
||
mpys a13,A1
|
||
NORMAL_SCALE_FINISH
|
||
sll 8,A1
|
||
movx a11,A1
|
||
setf 32,0,1 ; restore FS1 !!!
|
||
MOVE A1,*A0(OANIOFF),L
|
||
MOVE A9,*A0(OSIZE),L
|
||
nochg:
|
||
|
||
; ANIOFF is in A1
|
||
; SIZE is in a9
|
||
|
||
COMP_SCRN_POS: ; Compute Screen Position
|
||
|
||
sub B8,B7 ; Universe to World X
|
||
add B10,B5 ; Universe to World Y
|
||
|
||
DIVS B3,B5 ;TRANSLATE 3-D WORLD IN SCRN COORDINATES
|
||
ADD B6,B5 ; add YHALF
|
||
MOVE B5,B9
|
||
SLL 16,B9
|
||
DIVS B3,B7
|
||
ADD B4,B7 ; add HALFX
|
||
MOVX B7,B9
|
||
|
||
; ANIOFF is in A1
|
||
; SIZE is in a9
|
||
;
|
||
;BIG NOTE: On 10/6/93 A slight change was made that requires
|
||
; A1 to be ANIOFF and A9 to be OSIZE at this point.
|
||
; This eliminates the need for the following two
|
||
; lines. If the road version of COMP_SCRN_POS is
|
||
; re-instated it should be changed such that it does
|
||
; not trash A1 and A9.
|
||
;
|
||
; MOVE *A0(OSIZE),a9,L
|
||
; MOVE *A0(OANIOFF),a1,L
|
||
|
||
subi 10001h,a9
|
||
move a9,a7 ; save for ofscrn check 12/22/93
|
||
subxy a1,a9 ; adjusted anioff in a9
|
||
|
||
move *a0(OCTRL),a6
|
||
btst B_FLIPH,a6
|
||
jrz noh
|
||
movx a9,a1
|
||
noh:
|
||
|
||
btst B_FLIPV,a6
|
||
jrz nov
|
||
movy a9,a1
|
||
nov:
|
||
move b9,a9
|
||
subxy a1,a9
|
||
|
||
move a9,*a0(ODAG),L ; save DAG for Clipping computation
|
||
CMPXY A12,A9 ; IS IT LOWER THAN LOWER RT?
|
||
JRYGE offs ; LOWER
|
||
JRXGE offs ; TO THE RIGHT
|
||
addxy a9,a7 ; get lower right of obj in a7
|
||
CMPXY A5,A7
|
||
JRYLE offs ;ABOVE...
|
||
JRXLE offs ;TO THE LEFT..
|
||
|
||
SCL_NXT_OBJ:
|
||
MOVE *a0,a0,L ; save a word MOVE *A0(OLINK),A0,L
|
||
CMP A0,A4
|
||
JRNE SCALE_LP
|
||
|
||
RETS
|
||
|
||
offs:
|
||
ori M_OFSCRN,a8
|
||
move a8,*a0(OFLAGS)
|
||
|
||
MOVE *a0,a0,L ; save a word MOVE *A0(OLINK),A0,L
|
||
CMP A0,A4
|
||
JRNE SCALE_LP
|
||
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ODAG - SET THE ODAG FIELD *
|
||
* *
|
||
* PASS: *
|
||
* A8 = OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_ODAG
|
||
MMTM SP,A0,A1,A2,A3,A4,A5
|
||
|
||
MOVE A8,A14
|
||
ADDI OXVAL,A14
|
||
MMFM A14,A0,A1,A3 ;LOAD A3:OXPOS, A1:OYPOS, A0:OZPOS
|
||
|
||
MOVI XBASE,A14
|
||
MMFM A14,A2,A4,A5 ;LOAD A5:XBASE, A4:YBASE, A2:ZBASE
|
||
|
||
sub A5,A3 ; Universe to World X
|
||
add A4,A1 ; Universe to World Y
|
||
sub A2,A0 ; convert to world
|
||
|
||
DIVS A0,A1 ;TRANSLATE 3-D WORLD IN SCRN COORDINATES
|
||
MOVE @YHALF,A14,W
|
||
ADD A14,A1 ; add YHALF
|
||
MOVE A1,A2
|
||
SLL 16,A2
|
||
DIVS A0,A3
|
||
ADDI HALFX,A3 ; add HALFX
|
||
MOVX A3,A2
|
||
|
||
; ANIOFF is in A1
|
||
; SIZE is in a4
|
||
|
||
MOVE *A8(OSIZE),a4,L
|
||
MOVE *A8(OANIOFF),a1,L
|
||
subi 10001h,a4
|
||
subxy a1,a4 ; adjusted anioff in a4
|
||
|
||
move *a8(OCTRL),a5
|
||
btst B_FLIPH,a5
|
||
jrz SO_noh
|
||
movx a4,a1
|
||
SO_noh:
|
||
|
||
btst B_FLIPV,a5
|
||
jrz SO_nov
|
||
movy a4,a1
|
||
SO_nov:
|
||
subxy a1,a2
|
||
|
||
move a2,*a8(ODAG),L ; save DAG for Clipping computation
|
||
|
||
MMFM SP,A0,A1,A2,A3,A4,A5
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ODAG_MULT - SET THE ODAG FIELD FOR AN ENTIRE MULTI-PARTER *
|
||
* *
|
||
* PASS: *
|
||
* A8 = OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_ODAG_MULTI
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A8
|
||
|
||
CALLA GET_HEAD_PART
|
||
SOM_PART_LUPE
|
||
MOVE A8,A14
|
||
ADDI OXVAL,A14
|
||
MMFM A14,A0,A1,A3 ;LOAD A3:OXPOS, A1:OYPOS, A0:OZPOS
|
||
|
||
MOVI XBASE,A14
|
||
MMFM A14,A2,A4,A5 ;LOAD A5:XBASE, A4:YBASE, A2:ZBASE
|
||
|
||
sub A5,A3 ; Universe to World X
|
||
add A4,A1 ; Universe to World Y
|
||
sub A2,A0 ; convert to world
|
||
|
||
DIVS A0,A1 ;TRANSLATE 3-D WORLD IN SCRN COORDINATES
|
||
MOVE @YHALF,A14,W
|
||
ADD A14,A1 ; add YHALF
|
||
MOVE A1,A2
|
||
SLL 16,A2
|
||
DIVS A0,A3
|
||
ADDI HALFX,A3 ; add HALFX
|
||
MOVX A3,A2
|
||
|
||
; ANIOFF is in A1
|
||
; SIZE is in a4
|
||
|
||
MOVE *A8(OSIZE),a4,L
|
||
MOVE *A8(OANIOFF),a1,L
|
||
subi 10001h,a4
|
||
subxy a1,a4 ; adjusted anioff in a4
|
||
|
||
move *a8(OCTRL),a5
|
||
btst B_FLIPH,a5
|
||
jrz SOM_noh
|
||
movx a4,a1
|
||
SOM_noh:
|
||
|
||
btst B_FLIPV,a5
|
||
jrz SOM_nov
|
||
movy a4,a1
|
||
SOM_nov:
|
||
subxy a1,a2
|
||
|
||
move a2,*a8(ODAG),L ; save DAG for Clipping computation
|
||
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ SOM_PART_LUPE ;BR=NO MORE PARTS
|
||
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A8
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* REPOS_OBJ - REPOSITION AN EXISTING OBJECT IN THE UNIVERSE *
|
||
* *
|
||
* PASS: *
|
||
* A1 = NEW UNIVERSE Z OF HEAD *
|
||
* A2 = NEW UNIVERSE Y OF HEAD *
|
||
* A3 = NEW UNIVERSE X OF HEAD *
|
||
* A8 = OBJECT (HEAD OR PART) *
|
||
* *
|
||
**************************************************************************
|
||
REPOS_OBJ
|
||
MMTM SP,A1,A2,A3,A4,A5,A6,A8
|
||
CALLA GET_HEAD_PART ;NICE HEAD!
|
||
MOVE A8,A14
|
||
ADDI OXVAL,A14
|
||
MMFM A14,A4,A5,A6 ;A6=OXVAL, A5=OYVAL, A4=OZVAL
|
||
MMTM A14,A1,A2,A3
|
||
SUB A1,A4 ;Z DELTA
|
||
SUB A2,A5 ;Y DELTA
|
||
SUB A3,A6 ;X DELTA
|
||
JRUC RO_NXT
|
||
|
||
RO_PART_LUPE
|
||
|
||
MOVE *A8(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;Is this a shadow object?
|
||
JRZ RO_NOSHAD ;BR = No, do it normally
|
||
|
||
MOVE *A8(OXVAL),A14,L
|
||
SUB A6,A14
|
||
MOVE A14,*A8(OXVAL),L
|
||
|
||
MOVE *A8(OZVAL),A14,L
|
||
SUB A4,A14
|
||
MOVE A14,*A8(OZVAL),L
|
||
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ RO_PART_LUPE ;BR = Got another to do
|
||
JRUC RO_DONE ;Jump out on done
|
||
|
||
RO_NOSHAD
|
||
MOVE A8,A14
|
||
ADDI OXVAL,A14
|
||
MMFM A14,A1,A2,A3 ;A3=OXVAL, A2=OYVAL, A1=OZVAL
|
||
SUB A4,A1 ;SUBTRACT Z DELTA
|
||
SUB A5,A2 ;SUBTRACT Y DELTA
|
||
SUB A6,A3 ;SUBTRACT Z DELTA
|
||
MMTM A14,A1,A2,A3 ;A3=OXVAL, A2=OYVAL, A1=OZVAL
|
||
|
||
RO_NXT
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ RO_PART_LUPE ;BR = Got another to do
|
||
|
||
RO_DONE
|
||
MMFM SP,A1,A2,A3,A4,A5,A6,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCALEZ - SCALE AN OBJECT DEPENDING ON IT'S Z, BUT DON'T SWITCH IMGS*
|
||
* SET_SCALEM - SCALE AN OBJECT, BUT DON'T SWITCH IMAGES *
|
||
* IN: A1, DA SCALE (ONLY FOR SET_SCALEM) *
|
||
* OUT: NUTIN' *
|
||
* *
|
||
**************************************************************************
|
||
SET_SCALEZ
|
||
PUSH A1
|
||
MOVE *A8(OZVAL),A1,L
|
||
move @ZBASE,a14,L ;CONVERT Z TO SCALE
|
||
sub a14,a1
|
||
SRA Z2SCALE,A1
|
||
MOVE A1,A14
|
||
SLL 16,A1
|
||
ADD A14,A1
|
||
CALLR SET_SCALEM
|
||
PULLQ A1
|
||
RETS
|
||
SET_SCALEM
|
||
MMTM SP,A2,A3,A4,A5,A8
|
||
CLR A2
|
||
MOVX A1,A2 ; XSCALE in A2
|
||
MOVE A1,A3
|
||
SRL 16,A3 ; YSCALE IN A3
|
||
SET_PARTM
|
||
MOVE A1,*A8(OSCALE),L
|
||
MOVE *A8(OUSIZEX),A5,W
|
||
SLL 8,A5
|
||
clr a4
|
||
DIVU A2,A4
|
||
MOVE A4,*A8(OSIZEX),W
|
||
MOVE *A8(OUANIOFFX),A5,W
|
||
SLL 8,A5
|
||
clr a4
|
||
divs A2,A4
|
||
MOVE A4,*A8(OANIOFFX),W
|
||
MOVE *A8(OUSIZEY),A5,W
|
||
SLL 8,A5
|
||
clr a4
|
||
divu A3,A4
|
||
MOVE A4,*A8(OSIZEY),W
|
||
MOVE *A8(OUANIOFFY),A5,W
|
||
SLL 8,A5
|
||
clr a4
|
||
divs A3,A4
|
||
MOVE A4,*A8(OANIOFFY),W
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ SET_PARTM
|
||
MMFM SP,A2,A3,A4,A5,A8
|
||
RETS
|
||
|
||
|
||
; NEW
|
||
*
|
||
* a0 = obj
|
||
* a14 = new IHOFF (0 or IHDRSIZ)
|
||
*
|
||
SwitchScaledImg:
|
||
PUSH A1
|
||
move a14,*a0(OIHOFF) ; switch to smaller image
|
||
move *a0(OIMG),a1,L
|
||
add a14,a1
|
||
|
||
move *A1(ISIZE),A14,L
|
||
MOVE A14,*A0(OUSIZE),L
|
||
move *A1(ISAG),*A0(OSAG),L
|
||
move *A1(IANIOFF),A14,L
|
||
move A14,*A0(OUANIOFF),L
|
||
; move *a0(OFLAGS),a14
|
||
; ori M_OFSCRN,a14
|
||
; move a14,*a0(OFLAGS)
|
||
; movi 2000h,a1
|
||
; move a1,*a0(ODAG),L ; place offscreen
|
||
PULL A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCALE_WARREN *
|
||
* *
|
||
* Scale an object (including switching images). *
|
||
* Handles multi or single parters *
|
||
* *
|
||
**************************************************************************
|
||
SET_SCALE_WARREN
|
||
MMTM SP,A0,A2,A3,A4,A5
|
||
MOVE A8,A0
|
||
SCALE_PART_LUPE
|
||
MOVE *A0(OZVAL),A5,L
|
||
move @ZBASE,a14,L
|
||
sub a14,a5
|
||
sra Z2SCALE,a5 ; assume normal size image
|
||
;Bill start 11/12/1993
|
||
MOVE *A0(OFLAGS),A14,W
|
||
BTST B_DBLSCL,A14
|
||
JRZ SSW_IHOFF
|
||
srl 1,a5 ; double the scale if DBLSCL set
|
||
SSW_IHOFF
|
||
;Bill end 11/12/1993
|
||
*
|
||
* Compute and Set IHOFF
|
||
*
|
||
movk NUM_SIZES-1,a2 ; Full, Half, qrtr or eighth
|
||
clr a14 ; assume no new IHOFF at first
|
||
SSihoflp:
|
||
cmpi LIMIT1,a5 ;
|
||
jrlt got_ihoff
|
||
addi IHDRSIZ,a14 ; IHOFF points to next img
|
||
srl 1,a5 ; adjust scale accordingly
|
||
dsjs a2,SSihoflp
|
||
got_ihoff:
|
||
move *a0(OIHOFF),a4 ; see if it has changed
|
||
cmp a4,a14
|
||
jreq noadj
|
||
calla SwitchScaledImg
|
||
noadj:
|
||
move a5,a2 ; turn scale into a long word
|
||
sll 16,a2
|
||
movx a5,a2
|
||
|
||
move a2,*a0(OSCALE),L
|
||
zext a2
|
||
move *a0(OUSIZE),a3,L
|
||
movx a3,a5 ; we know upper half of a5 is clear
|
||
sll 8,a5 ; X size in a5
|
||
divu a2,a5
|
||
srl 16,a3
|
||
sll 8,a3 ; Y size in a3
|
||
divu a2,a3
|
||
sll 16,a3
|
||
movy a3,a5
|
||
move a5,*a0(OSIZE),L
|
||
|
||
move *a0(OUANIOFF),a3,L
|
||
movx a3,a5
|
||
sext a5
|
||
sll 8,a5 ; X ani off in a5
|
||
divs a2,a5
|
||
sra 16,a3
|
||
sll 8,a3 ; Y ani off in a3
|
||
divs a2,a3
|
||
sll 16,a3
|
||
movy a3,a5
|
||
move a5,*a0(OANIOFF),L
|
||
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ SCALE_PART_LUPE ;BR=YES THIS IS A MULTIPARTER
|
||
MMFM SP,A0,A2,A3,A4,A5
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCALE_MANUAL *
|
||
* Just like SET_SCALE_WARREN, but *
|
||
* Instead of computing scale based on Z, you supply the scale *
|
||
* SCALE FACTOR in a5 *
|
||
* *
|
||
* This routine stores OSCALE, sets and stores IHOFF and *
|
||
* sets the RESCALE FLAG *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_SCALE_MANUAL:
|
||
|
||
move *a8(OFLAGS),a14
|
||
btst B_SCRNOBJ,a14
|
||
jrz new_way
|
||
|
||
MMTM SP,A0,a1,A3,A4,A9
|
||
MOVE A8,A0
|
||
|
||
SSM_lkfrst:
|
||
move *a0(OFLAGS),a14
|
||
btst B_MANSCALE,a14
|
||
jrnz SSM_dofirst
|
||
move *a0(OPARTS),a0,L
|
||
jrz SSM_X
|
||
jruc SSM_lkfrst
|
||
|
||
|
||
SSM_dofirst:
|
||
*
|
||
* Compute and Set IHOFF
|
||
*
|
||
movk NUM_SIZES-1,a14 ; Full, Half, qrtr or eighth
|
||
clr a3 ; assume no new IHOFF at first
|
||
SSihoflpm:
|
||
cmpi LIMIT1,a5 ;
|
||
jrlt got_ihoffm
|
||
addi IHDRSIZ,a3 ; IHOFF points to next img
|
||
srl 1,a5 ; adjust scale accordingly
|
||
dsjs a14,SSihoflpm
|
||
got_ihoffm:
|
||
move *a0(OIHOFF),a1 ; see if it has changed
|
||
cmp a1,a3
|
||
jreq noadjm
|
||
move a3,a14
|
||
calla SwitchScaledImg
|
||
noadjm:
|
||
movi 10000h,a3 ;10000h
|
||
divu a5,a3 ;Inverse of scale in a3
|
||
move a3,a4
|
||
|
||
SSM_multlpSO:
|
||
move *a0(OFLAGS),a14
|
||
btst B_MANSCALE,a14
|
||
jrz SSM_nxtSO
|
||
|
||
move a5,*a0(OSCALEX)
|
||
move a5,*a0(OSCALEY)
|
||
|
||
MOVE *A0(OUSIZE),A9,L ;Unscaled size in a9
|
||
MOVE *A0(OUANIOFF),A1,L ;Unscaled animation pnt in A1
|
||
|
||
setf 12,1,1 ; change FS1 to quicken multiplies
|
||
clr a3
|
||
movx A9,a3
|
||
mpyu A4,A3 ; result in a3
|
||
srl 8,a3
|
||
srl 8,A9
|
||
mpyu a4,A9
|
||
movx a3,A9
|
||
|
||
move A1,A3
|
||
sext a3
|
||
mpys A4,A3 ; result in a3
|
||
sra 8,a3
|
||
sra 16,A1
|
||
mpys a4,A1
|
||
|
||
sll 8,A1
|
||
movx a3,A1
|
||
setf 32,0,1 ; restore FS1 !!!
|
||
MOVE A1,*A0(OANIOFF),L
|
||
MOVE A9,*A0(OSIZE),L
|
||
|
||
SSM_nxtSO:
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ SSM_multlpSO ;BR=YES THIS IS A MULTIPARTER
|
||
SSM_X
|
||
MMFM SP,A0,A1,A3,A4,A9
|
||
RETS
|
||
|
||
new_way:
|
||
PUSH A7
|
||
MOVE *a8(OPART1),A7,L
|
||
jrnz SSM_multlp
|
||
move a8,a7
|
||
SSM_multlp:
|
||
move *a7(OFLAGS),a14
|
||
btst B_MANSCALE,a14
|
||
jrz SSM_nxt
|
||
|
||
move a5,*a7(ONuManScl) ; new manual scale
|
||
|
||
andni M_NOSCALE,a14 ; force rescaling
|
||
move a14,*a7(OFLAGS)
|
||
SSM_nxt:
|
||
MOVE *A7(OPARTS),A7,L
|
||
JRNZ SSM_multlp ;BR=YES THIS IS A MULTIPARTER
|
||
|
||
PULLQ A7
|
||
RETS
|
||
|
||
|
||
|
||
;STBL:
|
||
; .word 0B3H, 016EH, 0C7H, 0149H, 0DEH, 0127H, 0100H, 0100H
|
||
; .word 0126H, 0DEH, 0149H, 0C7H, 016EH, 0B3H, 0196H, 0A1H
|
||
; .word 01BAH, 094H, 01E5H, 087H, 0210H, 07CH, 0238H, 073H
|
||
; .word 0266H, 06AH, 028FH, 064H, 02BDH, 05DH, 02F2H, 056H
|
||
; .word 031AH, 052H, 0347H, 04EH, 0379H, 049H, 03B1H, 045H
|
||
; .word 03F1H, 040H, 0415H, 03EH, 0463H, 03AH, 048FH, 038H
|
||
; .word 04BFH, 035H, 052AH, 031H, 0567H, 02FH, 05ABH, 02DH
|
||
; .word 05F5H, 02AH, 0647H, 028H, 0647H, 028H, 06A2H, 026H
|
||
; .word 0709H, 024H, 077CH, 022H, 0800H, 020H
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET THE DAM DMA WINDOW ALREADY! *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_DAM_WINDOW
|
||
|
||
MOVE @DMAGOREG,A0,L ;DMA BUSY?
|
||
JRN SET_DAM_WINDOW
|
||
|
||
MOVE @(SCRNBR+16),B14,W ; bottom in b14
|
||
SLL 16,B14
|
||
MOVE @(SCRNTL+16),B9,W ; top in b9
|
||
MOVX B9,B14 ; bottom:top in b14
|
||
move @PAGE,B5,W
|
||
jrz SETWIN ;BR=NO THIS IS PAGE ONE
|
||
ADDI [SCRHGHT,SCRHGHT],B14
|
||
SETWIN
|
||
MOVE b14,@DMAWINDOW,L
|
||
RETS
|
||
|
||
|
||
|
||
OB_GUNV .set 0
|
||
OB_COLL .set 1
|
||
OB_ANIM .set 2
|
||
OB_CFUNC .set 3
|
||
OB_POS .set 4
|
||
OB_WPOS .set 5
|
||
OB_SPOS .set 6
|
||
OB_GRND .set 7
|
||
OB_OID .set 8
|
||
OB_DUMCOLL .set 9
|
||
OB_PRVANIM .set 10
|
||
OB_INSERT .set 11
|
||
OB_OPARTS .set 12
|
||
OB_PRVGUNV .set 13
|
||
|
||
****************************************************************************
|
||
* The "NEW" MULTIMAKE
|
||
*
|
||
* Uses a Create Script to allocate and initialize obj(s)
|
||
*
|
||
* B0 = ptr to Create Script w/ following format
|
||
*
|
||
* .byte OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
* PRCCNT must be >= # of procs that will be allocated in CFUNCS
|
||
* FOR each IMGPALCNT...
|
||
* .long IMG->PAL ;PAL TO BE FOUND OR HAVE AVAILABLE SLOT FOR
|
||
* FOR each PALCNT...
|
||
* .long PAL ;PAL TO BE FOUND OR HAVE AVAILABLE SLOT FOR
|
||
* .word OID, GLOBAL_OPTIONS (OM_COLL | OM_DUMCOLL,
|
||
* OM_POS | OM_SPOS | OM_WPOS, OM_GRND
|
||
* OM_INSERT )
|
||
*
|
||
* OM_COLL to supply a default coll vector for all objects.
|
||
* otherwise, 0 is used.)
|
||
* OM_POS if you want to supply a position (universe default).
|
||
* OM_WPOS if the supplied position is world.
|
||
* [OM_GRND if you want the supplied world Y to be offset
|
||
* from YWORLD]
|
||
* OM_SPOS if the supplied position is screen.
|
||
* OM_SPOS takes priority.
|
||
* OM_DUMCOLL to use DUMCOLL as the default collision vector.
|
||
* OM_INSERT to call INSERT_OBJ when completed
|
||
*
|
||
* FOR each OBJCNT...
|
||
* .long IMG
|
||
* .word OCTRL, OFLAGS, OZOFF
|
||
* .word OPTIONS
|
||
* (OM_OID, OM_OPARTS, OM_COLL, OM_GUNV, OM_ANIM,
|
||
* OM_PRVANIM, OM_PRVGUNV, OM_CFUNC)
|
||
*
|
||
* OM_OID requires a word to follow the option word.
|
||
* OM_OPARTS requires 2 words to follow (OPARTSX and Y)
|
||
* OM_COLL, OM_GUNV, OM_ANIM, OM_CFUNC require a long word
|
||
* to follow the option word.
|
||
* OM_PRVANIM requires that a previous object had OM_ANIM set.
|
||
* OM_PRVGUNV requires that a previous GUN vect had OM_GUNV set.
|
||
*
|
||
* NOTE: DATA WHICH FOLLOWS THE OPTION WORD MUST APPEAR IN THE CORRECT
|
||
* ORDER! (namely, OID, COLL, GUNV, ANIM, xPOS, CFUNC)
|
||
*
|
||
* MULTIMAKE automatically links all objs together as multi-parter w/
|
||
* 1st obj as head obj
|
||
*
|
||
* A10-A11 passed to each PROC created unless they are modified by CFUNCS
|
||
*
|
||
* RETURNS
|
||
* A8 = ptr to head obj of uninserted multi-parter.
|
||
* Immediately follow with INSERT_OBJ to insert.
|
||
* Zflag set if not enough OBJS, PROCS or PALS
|
||
* !!!!!!!! assume ALL B REGS TRASHED !!!!!!!!!
|
||
*
|
||
*
|
||
* CFUNC - Create Functions
|
||
* A0 = new obj , initialized and linked into MULTI-PARTER
|
||
* A8 = ptr to first obj of script (head of MULTI-PARTER)
|
||
* B0 = ptr to Create Script, must adjust B0 as CFUNC parms read.
|
||
* Can trash all A regs but A7,A8,A9,A10,A11,A12,A13
|
||
* (and a2 if PRVGUNV is set)
|
||
* Must preserve ALL BREGS except B14 and B0 which must point
|
||
* after CFUNC parms
|
||
*
|
||
MULTIMAKE:
|
||
mmtm sp,a2,a4,a6,a7,A9,a10,a11
|
||
clr A8 ;First Obj
|
||
|
||
;*** CHECK OBJCNT
|
||
movb *B0,B7 ;B7 # objs to allocate
|
||
move b7,a6
|
||
move @OFREECNT,a14,W
|
||
cmp a14,a6
|
||
jrgt MAKEX
|
||
addk 8,B0
|
||
|
||
;*** CHECK PRCCNT
|
||
movb *B0,B1 ;B1 >= # of procs to allocate
|
||
move @PFREECNT,B2,W
|
||
cmp B2,B1
|
||
jrgt MAKEX
|
||
addk 8,B0
|
||
|
||
move @FREEPALCNT,B3,W
|
||
;FOR EACH PAL NOT FOUND, DEC FREEPALCNT - JRN MAKEX
|
||
movb *B0,B1 ;IMGPALCNT
|
||
addk 8,B0
|
||
movb *B0,B2 ;PALCNT
|
||
addk 8,B0
|
||
|
||
inc B1
|
||
ImgPalLp
|
||
dec B1
|
||
jrle SkImgPalCk
|
||
move *B0+,B4,L
|
||
move B4,A0
|
||
move *A0(ICMAP),A0,L
|
||
calla FINDPAL
|
||
jrnz ImgPalLp
|
||
;*** PAL NOT FOUND ***
|
||
dec B3
|
||
jrn MAKEX
|
||
jruc ImgPalLp
|
||
SkImgPalCk
|
||
|
||
inc B2
|
||
PalLp
|
||
dec B2
|
||
jrle SkPalCk
|
||
move *B0+,B4,L
|
||
move B4,A0
|
||
calla FINDPAL
|
||
jrnz PalLp
|
||
;*** PAL NOT FOUND ***
|
||
dec B3
|
||
jrn MAKEX
|
||
jruc PalLp
|
||
SkPalCk
|
||
move *B0+,B14,W ;Load OID
|
||
move b14,a11 ; default OID
|
||
*
|
||
* Process Options for All Parts of Multiparter (OID, COLL, POS)
|
||
*
|
||
move @ZBASE,b8,L
|
||
clr b10 ; default collision vector
|
||
move *b0+,b2 ; options for all objects
|
||
btst OB_DUMCOLL,b2
|
||
jrz NxtGopt1X
|
||
movi DUMCOLL,b10
|
||
jruc NxtGopt1
|
||
NxtGopt1X:
|
||
btst OB_COLL,b2
|
||
jrz NxtGopt1
|
||
move *b0+,b10,L ; user-supplied default collision vector
|
||
NxtGopt1:
|
||
btst OB_POS,b2
|
||
jrz NxtGopt2
|
||
btst OB_SPOS,b2
|
||
jrz world_or_uni
|
||
mmfm b0,b4,b5 ; b5 contains screen XY, b4 contains world Z
|
||
jruc NxtGopt2
|
||
world_or_uni:
|
||
mmfm b0,b4,b5,b6 ; position (flag determines screen, world or univ)
|
||
btst OB_WPOS,b2 ; universe if WPOS not set
|
||
jrz NxtGopt2a
|
||
add b8,b4
|
||
move @YBASE,b14,L
|
||
sub b14,b5
|
||
move @XBASE,b14,L
|
||
add b14,b6
|
||
NxtGopt2a: ; Allow Grnd offset on UNIV pos
|
||
btst OB_GRND,b2
|
||
jrz NxtGopt2 ; reference Y to ground?
|
||
MOVE @WORLD_GRNDOFF,B14,L
|
||
ADD B14,B5
|
||
move @YWORLD,b14,L
|
||
add b14,b5
|
||
NxtGopt2: ; KEEP FLAGS IN B2 DURING OBJECT CREATION
|
||
|
||
;THERE IS ENOUGH OBJS, PROCS AND PALS SO GO AHEAD AND ALLOCATE
|
||
clr a7 ;OBJECT #
|
||
clr a2 ; previous gunvector
|
||
MkObjLp
|
||
inc a7
|
||
move *B0+,B1,L
|
||
move B1,A1
|
||
callr GETOBJ
|
||
callr FPSTFOBJ0
|
||
move A0,B1
|
||
movb a7,*A0(OPARTID) ;store # of PART
|
||
|
||
move *B0+,B14,W ;Load OCTRL
|
||
MOVE *B0+,B9,W ;Load OFLAGS
|
||
MOVE B9,*B1(OFLAGS),W
|
||
btst B_FLIPH,B14
|
||
jrnz MkFlp
|
||
btst B_FLIPV,B14
|
||
jrz SkMkFlp
|
||
MkFlp
|
||
move B14,A4
|
||
PUSH A8
|
||
move A0,A8
|
||
;A1 still set from above
|
||
calla ANI
|
||
PULLQ A8
|
||
jruc MkFlagsOk
|
||
SkMkFlp
|
||
move *B1(OCTRL),B3,W
|
||
OR B14,B3
|
||
move B3,*B1(OCTRL),W
|
||
MkFlagsOk
|
||
clr b3 ; assume no OPARTSXY
|
||
|
||
MOVE *B0+,B14,W ; Load OZOFF
|
||
MOVB B14,*B1(OZOFF)
|
||
sll 16,b14
|
||
movy b14,b2
|
||
|
||
move A8,A8 ; is first obj in a0?
|
||
jrnz SkMkFirst ; jump if no
|
||
*
|
||
* First part only (b9 = OFLAGS, b2 = GBL OPTION flgs)
|
||
*
|
||
btst OB_SPOS,b2
|
||
jrz noposadj
|
||
btst B_SCRNOBJ,b9 ; translate from screen to univ if
|
||
jrnz onlyZadj ; NOT a screen object
|
||
clr b3
|
||
movx b5,b3
|
||
TOWORLDX b4,b3
|
||
move b3,b6
|
||
move @XBASE,b14,L
|
||
add b14,b6 ; UNIV X in b6
|
||
sra 16,b5
|
||
move @YHALF,b14 ; TOWORLDY
|
||
sub b14,b5 ; TOWORLDY
|
||
mpys b4,b5 ; TOWORLDY
|
||
move @YBASE,b14,L
|
||
sub b14,b5 ; UNIV Y in b5
|
||
onlyZadj:
|
||
add b8,b4
|
||
noposadj:
|
||
move A0,A8
|
||
jruc SkINSPART
|
||
SkMkFirst
|
||
**** callr INSPART
|
||
MOVE A0,*A9(OPARTS),L ;LINK NEW OBJECT AT END
|
||
SkINSPART
|
||
MOVE A8,*A0(OPART1),L ;VALIDATE HEAD PTR
|
||
MOVE A0,A9 ;KEEP PREVIOUS PART FOR PART LINKUP
|
||
*
|
||
* Process Optional parameters
|
||
*
|
||
move *b0+,b7 ; option flags
|
||
|
||
move a11,a14
|
||
btst OB_OID,b7 ; check for: SUPPLIED OID
|
||
jrz NxtOpt6 ; jump if default
|
||
move *b0+,b14 ; if not default
|
||
move b14,a14
|
||
NxtOpt6:
|
||
move a14,*a0(OID)
|
||
|
||
clr b3
|
||
btst OB_OPARTS,b7
|
||
jrz NxtOpt7
|
||
move *b0+,b3,L
|
||
move b3,*b1(OPARTSXY),L
|
||
NxtOpt7:
|
||
move b10,b14
|
||
btst OB_COLL,b7 ; check for: COLLISION VECTOR
|
||
jrz NxtOpt2 ; jump if default
|
||
move *b0+,b14,L ; if not default
|
||
NxtOpt2:
|
||
move b14,*b1(OCVECT),L
|
||
|
||
clr b14 ;
|
||
btst OB_PRVGUNV,b7 ; check for: USE PREVIOUS ANIMATION
|
||
jrz no_prev_gunv ;
|
||
move a2,b14 ;
|
||
jruc NxtOpt1 ;
|
||
no_prev_gunv:
|
||
btst OB_GUNV,b7 ; check for: GUNVECTOR
|
||
jrz NxtOpt1
|
||
move *b0+,b14,L
|
||
move b14,a2 ;
|
||
NxtOpt1: ; switched with below
|
||
move b14,*b1(OGUNVECT),L ; switched with above
|
||
|
||
btst OB_PRVANIM,b7 ; check for: USE PREVIOUS ANIMATION
|
||
jrnz prev_anim
|
||
btst OB_ANIM,b7 ; check for: SUPPLIED ANIMATION
|
||
jrz NxtOpt3
|
||
move *b0+,b14,L
|
||
move b14,a10
|
||
prev_anim:
|
||
move a10,a1
|
||
callr STRTANIM
|
||
NxtOpt3:
|
||
|
||
btst OB_POS,b2 ; was a position supplied?
|
||
jrz NxtOpt4
|
||
*
|
||
* adjust position based on OPARTSXY (b3) and OZOFF (MSW b2)
|
||
*
|
||
btst OB_SPOS,b2 ; set only if a screen object
|
||
jrz pos_is_uni ; coords are universe
|
||
btst B_SCRNOBJ,b9 ; skip following if not screen obj
|
||
jrz pos_is_uni
|
||
addxy b5,b3 ; Y:X in b3
|
||
move b3,b6
|
||
move *b1(OANIOFF),b14,L
|
||
subxy b14,b6
|
||
move b6,*b1(ODAG),L
|
||
;
|
||
; Future note:
|
||
; The following should save the animation point adjusted by OPARTSXY
|
||
; (b5) as the position of a screen obj, NOT THE DAG (b6)!
|
||
;
|
||
move b6,*b1(OXPOS),W
|
||
srl 16,b6
|
||
move b6,*b1(OYPOS),W
|
||
jruc do_z
|
||
|
||
pos_is_uni:
|
||
move b3,b14
|
||
jrz oparts_is_0
|
||
btst B_NOSCALE,b9 ; OPARTSXY will need adjustment
|
||
jrz nodoadj ; if the NOSCALE bit is set
|
||
*** SCALE OPARTSXY
|
||
*** b4 = Z
|
||
*** b3 = OPARTSXY
|
||
sub b8,b4 ; back to world
|
||
cmpi 8000h,b4
|
||
jrz nodoadj ; skip multiplies in this case
|
||
sext b3 ; OPARTSX in b3
|
||
mpys b4,b3 ; multiply by Z
|
||
add b6,b3
|
||
move b3,*b1(OXVAL),L
|
||
move b14,b3 ; OPARTSY in b3
|
||
sra 16,b3
|
||
mpys b4,b3
|
||
add b5,b3
|
||
move b3,*b1(OYVAL),L
|
||
add b8,b4
|
||
jruc do_z
|
||
|
||
oparts_is_0:
|
||
move b6,*b1(OXVAL),L
|
||
move b5,*b1(OYVAL),L
|
||
jruc do_z
|
||
|
||
nodoadj:
|
||
movx b3,b14 ; OPARTS X
|
||
sext b14
|
||
sll 15,b14
|
||
add b6,b14 ; adjust X by OPARTSX
|
||
move b14,*b1(OXVAL),L
|
||
move b3,b14
|
||
sra 16,b14 ; OPARTS Y
|
||
sll 15,b14
|
||
add b5,b14 ; adjust Y by OPARTSY
|
||
move b14,*b1(OYVAL),L
|
||
do_z:
|
||
movy b2,b14
|
||
sra 16,b14 ; OZOFF
|
||
add b4,b14 ; adjust Z by ZOFF
|
||
move b14,*b1(OZVAL),L
|
||
|
||
NxtOpt4:
|
||
btst OB_CFUNC,b7 ; check for: CREATE FUNCTION
|
||
jrz NxtOpt5
|
||
move *B0+,B7,L ; Load CFUNC
|
||
jrz NxtOpt5
|
||
PUSH A8
|
||
call B7 ; DO CFUNC
|
||
PULLQ A8
|
||
NxtOpt5:
|
||
|
||
MkNxtObj
|
||
dsj a6,MkObjLp
|
||
CMPK 1,a7 ;MORE THAN ONE OBJECT CREATED?
|
||
JRNE MAKEX ;BR = YES, IT IS MULTI
|
||
CLR A14
|
||
MOVE A14,*A8(OPART1),L ;MAKE IT LOOK SINGLE
|
||
MAKEX
|
||
mmfm sp,a2,a4,a6,a7,A9,a10,a11
|
||
move A8,A8 ;Set Z Flag
|
||
jrz MM_ABT
|
||
btst OB_INSERT,b2
|
||
jrnz INSERT_OBJ
|
||
inc a14 ; clr z flag
|
||
MM_ABT:
|
||
rets
|
||
|
||
|
||
|
||
|
||
****************************************************************************
|
||
* EASYMAKE for single part objects
|
||
*
|
||
* Uses a Create Script to allocate and initialize obj(s)
|
||
*
|
||
* B0 = ptr to Create Script w/ following format
|
||
*
|
||
* .long IMG
|
||
* .word OCTRL, OFLAGS
|
||
* .word OPTIONS
|
||
* (OM_OID, OM_COLL, OM_GUNV, OM_ANIM,
|
||
* OM_UPOS, OM_WPOS, OM_GRND, OM_SPOS,
|
||
* OM_DUMCOLL, OM_INSERT)
|
||
*
|
||
* OM_OID requires a word to follow the option word.
|
||
* OM_COLL, OM_GUNV, OM_ANIM require a long word
|
||
* to follow the option word.
|
||
*
|
||
* OM_OID to supply an OID (otherwise, OID_JUNK is used)
|
||
* OM_COLL to supply a coll vector.
|
||
* OM_GUNV to supply a gun vector.
|
||
* OM_ANIM to supply an animation script.
|
||
* OM_UPOS to supply a universe position.
|
||
* OM_WPOS to supply a world position.
|
||
* [OM_GRND if you want the supplied world Y to be offset
|
||
* from YWORLD]
|
||
* OM_SPOS to supply a screen position.
|
||
* OM_DUMCOLL to use DUMCOLL as a coll. vector (if neither
|
||
* OM_COLL or OM_DUMCOLL are specified, 0 is used.)
|
||
* OM_CFUNC to call a special function.
|
||
* OM_INSERT to call INSERT_OBJ when completed
|
||
*
|
||
* NOTE: DATA WHICH FOLLOWS THE OPTION WORD MUST APPEAR IN THE CORRECT
|
||
* ORDER! (namely, OID, COLL, GUNV, ANIM, xPOS, CFUNC)
|
||
*
|
||
*
|
||
* RETURNS
|
||
* A0 = ptr to obj
|
||
* Immediately follow with INSERT_OBJ to insert if OM_INSERT not specified.
|
||
*
|
||
* !!!!!!!! assume ALL B REGS TRASHED
|
||
* !!!!!!!! also A0, A1, and A14 TRASHED
|
||
*
|
||
* CFUNC - Create Functions
|
||
* gets new obj in A0, it is initialized.
|
||
* ptr to Create Script in B0, must inc B0 as CFUNC parms read.
|
||
* Is free to trash all A regs but A8 - A13
|
||
* Must preserve all BREGS except B14 and
|
||
* B0 which must point after CFUNC parms
|
||
*
|
||
EASYMAKE:
|
||
move *B0+,B1,L ; get IMG
|
||
move B1,A1
|
||
callr GETOBJ
|
||
jrz EASY_ABT
|
||
callr FPSTFOBJ0
|
||
mmtm sp,a4,a8
|
||
move A0,B1
|
||
move @ZBASE,b8,L
|
||
|
||
move *B0+,B14,W ;Load OCTRL
|
||
MOVE *B0+,B2,W ;Load OFLAGS
|
||
MOVE B2,*B1(OFLAGS),W
|
||
btst B_FLIPH,B14
|
||
jrnz EMkFlp
|
||
btst B_FLIPV,B14
|
||
jrz ESkMkFlp
|
||
EMkFlp
|
||
move B14,A4
|
||
move A0,A8
|
||
;A1 still set from above
|
||
calla ANI
|
||
jruc EMkFlagsOk
|
||
ESkMkFlp
|
||
move *B1(OCTRL),B3,W
|
||
OR B14,B3
|
||
move B3,*B1(OCTRL),W
|
||
EMkFlagsOk
|
||
*
|
||
* Process Optional parameters
|
||
*
|
||
move *b0+,b9 ; option flags
|
||
|
||
movi OID_JUNK,a14
|
||
btst OB_OID,b9 ; check for: SUPPLIED OID
|
||
jrz ENxtOpt6 ; jump if default
|
||
move *b0+,b14 ; if not default
|
||
move b14,a14
|
||
ENxtOpt6:
|
||
move a14,*a0(OID)
|
||
|
||
clr b14
|
||
btst OB_DUMCOLL,b9
|
||
jrz ENxtOpt2A
|
||
movi DUMCOLL,b14
|
||
jruc ENxtOpt2
|
||
ENxtOpt2A:
|
||
btst OB_COLL,b9 ; check for: COLLISION VECTOR
|
||
jrz ENxtOpt2 ; jump if default
|
||
move *b0+,b14,L ; if not default
|
||
ENxtOpt2:
|
||
move b14,*b1(OCVECT),L
|
||
|
||
btst OB_GUNV,b9 ; check for: GUNVECTOR
|
||
jrz ENxtOpt1
|
||
move *b0+,b14,L
|
||
move b14,*b1(OGUNVECT),L
|
||
ENxtOpt1:
|
||
|
||
btst OB_ANIM,b9 ; check for: SUPPLIED ANIMATION
|
||
jrz ENxtOpt3
|
||
move *b0+,b14,L
|
||
move b14,a1
|
||
callr STRTANIM
|
||
ENxtOpt3:
|
||
btst OB_POS,b9 ; was a position supplied?
|
||
jrz ENxtOpt4
|
||
|
||
******************************
|
||
* *
|
||
* Get supplied position *
|
||
* *
|
||
******************************
|
||
|
||
btst OB_SPOS,b9
|
||
jrz E_world_or_uni
|
||
mmfm b0,b4,b5 ; b5 contains screen XY, b4 contains world Z
|
||
btst B_SCRNOBJ,b2 ; translate from screen to univ if
|
||
jrnz E_do_scrnobj ; NOT a screen object
|
||
clr b3
|
||
movx b5,b3
|
||
TOWORLDX b4,b3
|
||
move b3,b6
|
||
move @XBASE,b14,L
|
||
add b14,b6 ; UNIV X in b6
|
||
sra 16,b5
|
||
move @YHALF,b14 ; TOWORLDY
|
||
sub b14,b5 ; TOWORLDY
|
||
mpys b4,b5 ; TOWORLDY
|
||
move @YBASE,b14,L
|
||
sub b14,b5 ; UNIV Y in b5
|
||
add b8,b4 ; UNIV Z in b4
|
||
|
||
jruc ENxtOpt7
|
||
|
||
E_do_scrnobj:
|
||
move b5,b6
|
||
move *b1(OANIOFF),b14,L
|
||
subxy b14,b6
|
||
move b6,*b1(ODAG),L
|
||
move b6,*b1(OXPOS),W
|
||
srl 16,b6
|
||
move b6,*b1(OYPOS),W
|
||
add b8,b4 ; turn world into univ
|
||
jruc E_do_z
|
||
|
||
E_world_or_uni:
|
||
mmfm b0,b4,b5,b6 ; position (flag determines screen, world or univ)
|
||
btst OB_WPOS,b9 ; universe if WPOS not set
|
||
jrz ENxtOpt7a
|
||
add b8,b4
|
||
move @YBASE,b14,L
|
||
sub b14,b5
|
||
move @XBASE,b14,L
|
||
add b14,b6
|
||
ENxtOpt7a: ; allow Ground offset for Univ pos.
|
||
btst OB_GRND,b9
|
||
jrz ENxtOpt7 ; reference Y to ground?
|
||
MOVE @WORLD_GRNDOFF,B14,L
|
||
ADD B14,B5
|
||
move @YWORLD,b14,L
|
||
add b14,b5
|
||
ENxtOpt7:
|
||
move b6,*b1(OXVAL),L
|
||
move b5,*b1(OYVAL),L
|
||
E_do_z:
|
||
move b4,*b1(OZVAL),L
|
||
|
||
ENxtOpt4:
|
||
|
||
btst OB_CFUNC,b9 ; check for: CREATE FUNCTION
|
||
jrz ENxtOpt5
|
||
move *B0+,B7,L ; Load CFUNC
|
||
jrz ENxtOpt5
|
||
PUSH A0
|
||
call B7 ; DO CFUNC
|
||
PULLQ A0
|
||
ENxtOpt5:
|
||
|
||
; CLR A14
|
||
; MOVE A14,*A0(OPART1),L ;MAKE IT LOOK SINGLE
|
||
|
||
mmfm sp,a4,a8
|
||
|
||
btst OB_INSERT,b9
|
||
; jrnz INSOBJ
|
||
JRZ EM_NOINSERT
|
||
CALLR INSOBJ
|
||
EM_NOINSERT
|
||
; inc a14 ; clr z flag
|
||
MOVE A0,A0 ;Clear the Z flag
|
||
EASY_ABT:
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCRNOBJ *
|
||
* IN: A1, [Y,X] *
|
||
* A2, long ZVAL *
|
||
* a8, object *
|
||
* OUT: NUTN' *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_SCRNOBJ
|
||
MMTM SP,A8,A0
|
||
MOVE A1,A0
|
||
SS_PART_LUPE
|
||
MOVE A0,A1
|
||
MOVE *A8(OANIOFF),A14,L
|
||
SUBXY A14,A1
|
||
MOVE A1,*A8(ODAG),L
|
||
MOVE A1,*A8(OXPOS),W
|
||
SRL 16,A1
|
||
MOVE A1,*A8(OYPOS),W
|
||
MOVE A2,*A8(OZVAL),L
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ SS_PART_LUPE
|
||
MMFM SP,A8,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCRNPOS *
|
||
* IN: A1, DA SCREEN POSITION *
|
||
* A0, DA OBJECT *
|
||
* OUT: NUTN' *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_SCRNPOS
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR SET_SCRN_POS
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_SCRN_POS *
|
||
* IN: A1, DA SCREEN POSITION *
|
||
* A8, DA OBJECT *
|
||
* OUT: NUTN' *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_SCRN_POS
|
||
MMTM SP,A2,A3,A4,A5
|
||
|
||
MOVE A1,A3
|
||
|
||
SEXT A3,W
|
||
MOVE *A8(OZVAL),A2,L
|
||
move @ZBASE,a14,L
|
||
sub a14,a2 ; get world Z in a2
|
||
TOWORLDX A2,A3
|
||
MOVE @XBASE,A14,L
|
||
ADD A14,A3
|
||
MOVE A3,*A8(OXVAL),L
|
||
|
||
MOVE A1,A5
|
||
SRA 16,A5
|
||
TOWORLDY A2,A5
|
||
MOVE @YBASE,A14,L
|
||
SUB A14,A5
|
||
MOVE A5,*A8(OYVAL),L
|
||
MOVE A8,A4
|
||
move @ZBASE,a14,L
|
||
add a14,a2
|
||
|
||
PUSH A1
|
||
CALLR SET_OBJSU
|
||
PULLQ A1
|
||
|
||
MMFM SP,A2,A3,A4,A5
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_SCALED_SIZE - RETURNS THE SCALED SIZE OF AN IMAGE. *
|
||
* A0 = SCALE FACTOR [Y,X] *
|
||
* A2 = UNSCALED SIZE [Y,X] *
|
||
* RETURNS *
|
||
* A6 = [Y,X] SCALED SIZE *
|
||
* *
|
||
**************************************************************************
|
||
GET_SCALED_SIZE
|
||
PUSH A5
|
||
|
||
MOVX A0,A14 ;GET X-SCALE FACTOR
|
||
SEXT A14
|
||
MOVX A2,A5 ;GET UNSCALED X-SIZE
|
||
SEXT A5
|
||
SLL 8,A5
|
||
DIVS A14,A5 ;(in case using for ani pts)
|
||
MOVX A5,A6 ;SEND BACK SCALED X-SIZE
|
||
|
||
MOVY A0,A14 ;GET Y-SCALE FACTOR
|
||
SRA 16,A14
|
||
MOVY A2,A5 ;GET UNSCALED Y-SIZE
|
||
SRA 16,A5
|
||
SLL 8,A5
|
||
DIVS A14,A5 ;(in case using for ani pts)
|
||
SLL 16,A5
|
||
MOVY A5,A6 ;SEND BACK SCALED Y-SIZE
|
||
|
||
PULLQ A5
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TO_YSCALE - SCALE A VALUE TO THE SAME SCALE AS AN OBJECTS YSCALE *
|
||
* A1 = 12 BIT INTEGER VALUE TO SCALE *
|
||
* A8 = OBJECT *
|
||
* RETURNS: *
|
||
* A1 = [16.16] SCALE VALUE *
|
||
* *
|
||
**************************************************************************
|
||
TO_YSCALE
|
||
MOVE *A8(OSCALEY),A14,W
|
||
SLL 20,A1
|
||
DIVS A14,A1
|
||
SLL 4,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TO_XSCALE - SCALE A VALUE TO THE SAME SCALE AS AN OBJECTS XSCALE *
|
||
* A1 = 12 BIT INTEGER VALUE TO SCALE *
|
||
* A8 = OBJECT *
|
||
* RETURNS: *
|
||
* A1 = [16.16] SCALE VALUE *
|
||
* *
|
||
**************************************************************************
|
||
TO_XSCALE
|
||
MOVE *A8(OSCALEX),A14,W
|
||
SLL 20,A1
|
||
DIVS A14,A1
|
||
SLL 4,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MANUAL DMA ROUTINES *
|
||
* ------------------- *
|
||
* *
|
||
* THESE ROUTINES ARE USED TO FIRE OFF A SINGLE DMA *
|
||
* ALONG WITH THE NORMAL "OBJECTS" BEING DISPLAYED. *
|
||
* THEY ARE USED AS FOLLOWS: *
|
||
* *
|
||
* QDMA (QDMA2) - *
|
||
* A1 = [CONSTANT COLOR,PALETTE] *
|
||
* A3 = DESTINATION [Y,X] *
|
||
* A5 = [CONTROL,OFFSET] *
|
||
* A14= ADDRESS OF IMAGE HEADER (THE REST OF *
|
||
* THE INFO WILL BE TAKEN FROM HERE). *
|
||
* *
|
||
* *
|
||
* QDMAN (QDMAN2) - *
|
||
* A0 = SCALE [Y,X] *
|
||
* A1 = [CONSTANT COLOR,PALETTE] *
|
||
* A2 = [HEIGHT,WIDTH] *
|
||
* A3 = DESTINATION [Y,X] *
|
||
* A4 = SOURCE ADDRESS *
|
||
* A5 = [CONTROL,OFFSET] *
|
||
* *
|
||
* *
|
||
* NOTE: QDMA2 AND QDMAN2 DMA TWICE, ONE TO EACH DISPLAY *
|
||
* PAGE. *
|
||
* *
|
||
**************************************************************************
|
||
QDMAN:
|
||
MMTM SP,A0,A2,A3,A4,A5,A6,A13
|
||
JRUC QDMANE
|
||
QDMA:
|
||
MMTM SP,A0,A2,A3,A4,A5,A6,A13
|
||
MOVI [0100H,0100H],A0 ;SCALE IS 1:1
|
||
MOVE *A14(ISIZE),A2,L ;GET VSIZE:HSIZE
|
||
MOVE *A14(ISAG),A4,L ;GET SAG
|
||
MOVE *A14(ICTRL),A13,W
|
||
SLL 16,A13
|
||
OR A13,A5 ;OR IN THE VITAL SHIT
|
||
QDMANE:
|
||
CALLR GET_SCALED_SIZE ;GET THE SCALED SIZE FOR US
|
||
MOVE @NO_MIRROR,A13,W ;ARE WE MIRRORING?
|
||
JRNZ QDMANE_2 ;BR = NO
|
||
MOVX A3,A13 ;SLIDE TO OTHER SIDE
|
||
ADDXY A6,A13
|
||
ZEXT A13
|
||
SUBI (SCREEN_WIDTH - 1),A13 ;ADJUST COORDINATE
|
||
NEG A13
|
||
MOVX A13,A3 ;RETURN ADJUSTED X
|
||
XORI M_FLIPH << 16,A5 ;FLIP THE SUCKER
|
||
|
||
QDMANE_2
|
||
CLR A13
|
||
BTST B_FLIPH+16,A5
|
||
JREQ NOHF
|
||
MOVX A6,A13
|
||
DEC A13
|
||
NOHF BTST B_FLIPV+16,A5
|
||
JREQ NOVF
|
||
MOVY A6,A13
|
||
SUBI 10000h,A13
|
||
NOVF ADDXY A13,A3
|
||
|
||
MOVE @PAGEADDR,A13,L ;GET THE CURRENT PAGE ADDRESS
|
||
|
||
MOVE @NOPGFLIP,A6,W ;IS PAGE FLIPPING ACTIVE?
|
||
JRNZ QD_NOPFLP ;BR = NO
|
||
|
||
XORI TOGGLE_PAGE_XY,A13 ;XUNIT COMPENSATE FOR BEING 1 PAGE BEHIND
|
||
|
||
QD_NOPFLP
|
||
addxy A13,A3 ;DO PAGE OFFSET
|
||
|
||
MOVK 1,A13
|
||
MOVE A13,@QDMAFLG,W ;Q BEING MODIFIED
|
||
MOVE @DMAQCUR,A13,L
|
||
CMPI DMAQ,A13
|
||
JRLS QDMAX ;Q OVERLOAD, CAN IT
|
||
|
||
MMTM A13,A0,A1,A2,A3,A4,A5
|
||
MOVE A13,@DMAQCUR,L
|
||
QDMAX:
|
||
CLR A13
|
||
MOVE A13,@QDMAFLG,W
|
||
MMFM SP,A0,A2,A3,A4,A5,A6,A13
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* THESE ARE THE DOUBLE-PAGE VERSIONS *
|
||
* *
|
||
**************************************************************************
|
||
QDMAN2:
|
||
MMTM SP,A0,A2,A3,A4,A5,A6,A13
|
||
JRUC QDMANE2
|
||
QDMA2:
|
||
MMTM SP,A0,A2,A3,A4,A5,A6,A13
|
||
MOVI [0100H,0100H],A0 ;SCALE IS 1:1
|
||
MOVE *A14(ISIZE),A2,L ;GET VSIZE:HSIZE
|
||
MOVE *A14(ISAG),A4,L ;GET SAG
|
||
MOVE *A14(ICTRL),A13,W
|
||
SLL 16,A13
|
||
OR A13,A5 ;OR IN THE VITAL SHIT
|
||
QDMANE2:
|
||
CALLR GET_SCALED_SIZE ;GET THE SCALED SIZE FOR US
|
||
MOVE @NO_MIRROR,A13,W ;ARE WE MIRRORING?
|
||
JRNZ QDMANE2_2 ;BR = NO
|
||
MOVX A3,A13 ;SLIDE TO OTHER SIDE
|
||
ADDXY A6,A13
|
||
ZEXT A13
|
||
SUBI (SCREEN_WIDTH - 1),A13 ;ADJUST COORDINATE
|
||
NEG A13
|
||
QDMANE2_1A
|
||
MOVX A13,A3 ;RETURN ADJUSTED X
|
||
XORI M_FLIPH << 16,A5 ;FLIP THE SUCKER
|
||
QDMANE2_2
|
||
CLR A13
|
||
BTST B_FLIPH+16,A5
|
||
JREQ NOHF2
|
||
MOVX A6,A13
|
||
DEC A13
|
||
NOHF2 BTST B_FLIPV+16,A5
|
||
JREQ NOVF2
|
||
MOVY A6,A13
|
||
SUBI 10000h,A13
|
||
NOVF2 ADDXY A13,A3
|
||
|
||
MOVK 1,A13
|
||
MOVE A13,@QDMAFLG,W ;Q BEING MODIFIED
|
||
MOVE @DMAQCUR,A13,L
|
||
CMPI DMAQ,A13
|
||
JRLS QDMA2X ;Q OVERLOAD, CAN IT
|
||
|
||
;XUNIT ST
|
||
ADDXYI PAGE0ADR,A3
|
||
|
||
MMTM A13,A0,A1,A2,A3,A4,A5
|
||
;*** Q it for PAGE 2 also
|
||
|
||
ADDI PAGE1ADR-PAGE0ADR,A3
|
||
;XUNIT END
|
||
|
||
CMPI DMAQ,A13
|
||
JRLS QDMA2X ;Q OVERLOAD, CAN IT
|
||
MMTM A13,A0,A1,A2,A3,A4,A5
|
||
MOVE A13,@DMAQCUR,L
|
||
QDMA2X:
|
||
CLR A13
|
||
MOVE A13,@QDMAFLG,W
|
||
MMFM SP,A0,A2,A3,A4,A5,A6,A13
|
||
RETS
|
||
|
||
**************************************************************************
|
||
|
||
.ALIGN
|
||
|
||
**************************************************************************
|
||
* YZSORT
|
||
* SORT EACH SCREEN OBJECT LIST IN Z:Y PRIORITY
|
||
* IF OBJ DOESN'T HAVE NOAUTOZ SET, MOVE FROM LIST TO LIST BASED ON Z COOR
|
||
* CALL FROM EXEC LOOP
|
||
YZSORT:
|
||
|
||
.IF DEBUG
|
||
callr CkOFREE
|
||
callr CkAnim
|
||
.ENDIF
|
||
|
||
YZPlnLp
|
||
; MOVE @ZSCROLL,A2,L
|
||
|
||
movi FGLIST,A10 ;NEW
|
||
move A10,A0 ;A10 START OF LIST
|
||
|
||
CLR A9 ;This will be our flag clear reg
|
||
MOVE A9,@INVELADD,W
|
||
|
||
;PRESTUFF Z,Y OF PREVIOUS OBJ
|
||
; MOVI 07FFFFFFFH,A6 ;HIGHEST POSSIBLE Z (POS)
|
||
MOVI 080000000H,A6 ;LOWEST POSSIBLE Z
|
||
; MOVI 080000000H,A5 ;LOWEST POSSIBLE Y (NEG)
|
||
MOVI 07FFFFFFFH,A5 ;HIGHEST POSSIBLE Y
|
||
MOVE A5,A4
|
||
JRUC YZLP
|
||
|
||
YZLP0:
|
||
MOVE *A1(OZVAL),A8,L ;NEXT OBJ Z
|
||
MOVE *A1(OYVAL),A7,L ;NEXT OBJ Y
|
||
|
||
CMP A6,A8
|
||
JRGT priok
|
||
JRLT PRISWAP
|
||
; JRLT priok
|
||
; JRGT PRISWAP
|
||
|
||
CMP A5,A7
|
||
JRLE priok ;BOTTOM OBJECTS TAKE PRIORITY OF TOP
|
||
PRISWAP:
|
||
*
|
||
* This is the other half of my fiendish plot
|
||
*
|
||
MOVE @INVELADD,A14,W
|
||
JRNZ YZPlnLp ;BR=we VELADDed, so restart
|
||
|
||
PUSHST
|
||
dint
|
||
|
||
; MOVE A2,A2
|
||
; JRZ NOTIMER_CHECK
|
||
;
|
||
; MOVE @TIMER,A14,W
|
||
; JRNZ YZ_ABORT
|
||
*
|
||
* George is trying something here. Take this out and try restarting
|
||
* the sort if a VELADD occurs. Let's just see what the fuck happens 5/2/94.
|
||
*
|
||
; MOVE @INVELADD,A14,W
|
||
; JRNZ YZ_ABORT ;BR=we VELADDed, so get outta dodge
|
||
|
||
NOTIMER_CHECK
|
||
;unlink A0 from list
|
||
move *A0(OBLINK),A14,L
|
||
move A1,*A14,L ;LINK FORWARD OVER A0
|
||
move A14,*A1(OBLINK),L ;LINK BACKWARD OVER A0
|
||
|
||
move *A1,A14,L
|
||
move A14,*A0,L ;INSERT A0 AFTER A1
|
||
move A0,*A1,L ;
|
||
move A1,*A0(OBLINK),L ;
|
||
move A0,*A14(OBLINK),L ;
|
||
|
||
POPST
|
||
|
||
MOVE A4,A5
|
||
JRUC YZLP
|
||
priok:
|
||
|
||
; MOVE A6,A9
|
||
MOVE A9,*A0(ONOT_SORTED),W ;Mark this object as sorted
|
||
|
||
move A1,A0
|
||
move A8,A6 ;Z
|
||
move A7,A5 ;Y
|
||
YZLP:
|
||
move *A0,A1,L ;next link in A1
|
||
cmp A1,A10
|
||
jrne YZLP0
|
||
|
||
RETS
|
||
|
||
;YZ_ABORT
|
||
; POPST
|
||
; RETS
|
||
|
||
**************************************************************************
|
||
* END OF DISPLAY SYSTEM
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* DISPLAY UTILITY ROUTINES
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_BPLANE - GET THE OBJ LIST FOR THE GIVEN BACKGROUND PLANE. *
|
||
* A1 = PLANE # *
|
||
* RETURNS *
|
||
* A0 = PLANE OBJ LIST *
|
||
* *
|
||
**************************************************************************
|
||
GET_BPLANE
|
||
move A1,A0
|
||
movi PLNSIZ,A14
|
||
mpyu A14,A1
|
||
addi BGLISTS,A1
|
||
SWAP A1,A0
|
||
rets
|
||
|
||
****************************************************************************
|
||
* FINDOID
|
||
* A0 - SUPP LIST
|
||
* A1 - OID MASK
|
||
* A2 - PATTERN TO MATCH
|
||
* RETS A0 pts to obj, else ZFLAG set
|
||
FINDOID:
|
||
PUSH A3
|
||
and A1,A2
|
||
FindLp:
|
||
move *A0(OSLINK),A0,L
|
||
jrz FindOidX
|
||
move *A0(OID),A3,W
|
||
and A1,A3
|
||
cmp A2,A3
|
||
jrne FindLp
|
||
FindOidX:
|
||
PULLQ A3
|
||
move A0,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SetOnGrnd - PLACE IMAGE SO THAT IS ON THE GROUND *
|
||
* *
|
||
* PASS: *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
SetOnGrnd:
|
||
PUSH A0
|
||
MOVE @YWORLD,A14,L
|
||
MOVE @WORLD_GRNDOFF,A0,L
|
||
ADD A0,A14
|
||
MOVE *A8(OGRNDOFF),A0,L
|
||
SUB A0,A14
|
||
MOVE A14,*A8(OYVAL),L
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ONGRND - SAME AS SetOnGrnd EXCEPT ALIGNS A MULTI-PARTER, ASSUMING *
|
||
* THAT THE HEAD OBJECT IS PASSED. *
|
||
* A8 = PTR TO OBJECT (HEAD IF MULTI-PARTER) *
|
||
* *
|
||
**************************************************************************
|
||
SET_ONGRND
|
||
MMTM SP,A1,A2,A3
|
||
MOVE *A8(OXVAL),A3,L
|
||
MOVE @YWORLD,A2,L
|
||
MOVE @WORLD_GRNDOFF,A0,L
|
||
ADD A0,A2
|
||
MOVE *A8(OGRNDOFF),A0,L
|
||
SUB A0,A2
|
||
MOVE *A8(OZVAL),A1,L
|
||
CALLR REPOS_OBJ
|
||
MMFM SP,A1,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DIST_FROM_GROUND - RETURNS THE DISTANCE BETWEEN THE BOTTOM OF THE *
|
||
* GIVEN OBJECT AND THE GROUND AT THE OBJECTS CURRENT *
|
||
* ZVAL. *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* A1 = SHL DISTANCE (STATUS BITS REFLECT THE SIGN OF A1) *
|
||
* *
|
||
**************************************************************************
|
||
DIST_FROM_GROUND
|
||
PUSH A0
|
||
MOVE *A8(OYVAL),A14,L
|
||
MOVE *A8(OGRNDOFF),A1,L
|
||
SUB A1,A14
|
||
MOVE @YWORLD,A1,L
|
||
MOVE @WORLD_GRNDOFF,A0,L
|
||
ADD A0,A1
|
||
SUB A14,A1
|
||
PULL A0
|
||
RETS
|
||
|
||
*REMOVED SetPlaneXPos:
|
||
|
||
*REMOVED SETPLANE
|
||
|
||
*REMOVED SET_PLANE
|
||
|
||
*REMOVED SETPLANE_FB
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETPLANE_BB - ROUTINE TO SET AN OBJECT ON AN ARBITRARY PLANE. COORDINA *
|
||
* AND VELOCITY ADJUSTED ACCORDINGLY. *
|
||
* FOR OBJECTS CURRENTLY ON BACKGROUND TO BE SET ON *
|
||
* BACKGROUND. *
|
||
* (FOR NOAUTOZ OBJECTS ONLY!) *
|
||
* A0 = PTR TO OBJECT *
|
||
* A2 = NEW BACKGROUND PLANE # *
|
||
* *
|
||
**************************************************************************
|
||
SETPLANE_BB
|
||
PUSH A1
|
||
callr PULLOBJ ;PULL FROM CURRENT FOREGROUND
|
||
move A0,A1
|
||
callr CHGPLANE_BB ;SWITCH TO THE BACKGROUND
|
||
callr INSBOBJ ;NOW INSERT ON THE BACKGROUND
|
||
PULLQ A1
|
||
rets
|
||
|
||
*REMOVED SETPLANE_BF
|
||
|
||
*REMOVED SETPLANE_BF_MULTI
|
||
|
||
*REMOVED ChgPlane
|
||
|
||
*ENTRY JUST TO CHANGE THE VALUES
|
||
*A3 = DESTINATION PLANE OBJ LIST
|
||
*A5 = CURRENT PLANE OBJ LIST
|
||
ChgPlane_G
|
||
move *A1(OXPOS),A7,W
|
||
move *A5(P_XPOS+010h),A6,W ;A5 X POSITION OF CURRENT PLANE
|
||
sub A6,A7 ;X position now screen rel
|
||
move *A3(P_XPOS+010h),A6,W ;A5 X POSITION OF NEW PLANE
|
||
add A6,A7 ;X position adjusted to new plane
|
||
MOVE A7,*A1(OXPOS),W ;STUFF ME BABY!
|
||
|
||
move *A5(P_XRATE),A5,L ;A5 XRATE OF CURRENT PLANE
|
||
move *A3(P_XRATE),A3,L ;A3 XRATE OF NEW PLANE
|
||
move *A1(OXVEL),A6,L
|
||
mpys A3,A6 ;A6,A7 = 16.16 x 16.16 XVAL
|
||
divs A5,A6
|
||
move A6,*A1(OXVEL),L
|
||
|
||
mmfm SP,A3,A5,A6,A7
|
||
rets
|
||
|
||
*REMOVED CHGPLANE_FB
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHGPLANE_BB - CHANGE OBJECT FROM A BACKGROUND TO A BACKGROUND PLANE. *
|
||
* Adjust the X position of an object for changing planes *
|
||
* Adjust the X velocity of an objext for changing planes *
|
||
* Stuff the new plane #. *
|
||
* Caller must take care of changing links (PULLOBJ, INSOBJ).. *
|
||
* A1 obj (*A1(OPLANE) gives current BACKGROUND plane #) *
|
||
* A2 BACKGROUND plane # to go to *
|
||
* *
|
||
**************************************************************************
|
||
CHGPLANE_BB
|
||
mmtm SP,A3,A5,A6,A7
|
||
; movb *A1(OPLANE),A5
|
||
; movb A2,*A1(OPLANE)
|
||
movi PLNSIZ,A3
|
||
mpyu A3,A5
|
||
addi BGLISTS,A5
|
||
mpyu A2,A3
|
||
addi BGLISTS,A3
|
||
JRUC ChgPlane_G
|
||
|
||
*REMOVED CHGPLANE_BF
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STOREOPLANE - STORE THE GIVEN VALUE IN ALL OF THE OPLANE FIELDS OF *
|
||
* THE GIVEN OBJECT, MULTI-PART OR NOT. *
|
||
* A0 = PTR TO STARTING PART *
|
||
* A1 = OPLANE VALUE *
|
||
* *
|
||
**************************************************************************
|
||
STOREOPLANE
|
||
; MOVB A1,*A0(OPLANE)
|
||
MOVE *A0(OPARTS),A14,L
|
||
JRZ SP_X
|
||
SP_LP
|
||
; MOVB A1,*A14(OPLANE)
|
||
MOVE *A14(OPARTS),A14,L
|
||
JRNZ SP_LP
|
||
SP_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STORE_OPLANE - STORE THE GIVEN VALUE IN ALL OF THE OPLANE FIELDS OF *
|
||
* THE GIVEN OBJECT, MULTI-PART OR NOT. *
|
||
* A8 VERSION *
|
||
* A1 = OPLANE VALUE *
|
||
* A8 = PTR TO STARTING PART *
|
||
* *
|
||
**************************************************************************
|
||
STORE_OPLANE
|
||
PUSH A0
|
||
MOVE A8,A0
|
||
CALLR STOREOPLANE
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCRTST *
|
||
* *
|
||
* Test if an object is on-screen. If object is head of a *
|
||
* multi-parter, then the whole thing must be on/off the screen. *
|
||
* *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Z = Onscreen *
|
||
* *
|
||
**************************************************************************
|
||
SCRTST:
|
||
PUSH A8
|
||
|
||
MOVE *A8(OPART1),A14,L ;Is this a multi-part object?
|
||
JRZ ST_SINGLE_TEST ;BR = No
|
||
CMP A14,A8 ;Do we have the head part
|
||
JRNE ST_SINGLE_TEST ;BR = No, just check this part
|
||
*
|
||
* We are checking a multi-parter here
|
||
*
|
||
ST_MULTI_LOOP
|
||
MOVE *A8(OLINK),A14,L ;Is the object inserted?
|
||
JRZ ST_NEXT_PART ;BR = No
|
||
|
||
MOVB *A8(OFLAGS),A14 ;Is this part on-screen?
|
||
JRNN ST_ONSCREEN ;BR = Yes, then that's good enough
|
||
|
||
ST_NEXT_PART
|
||
MOVE *A8(OPARTS),A8,L ;Get the next part
|
||
JRNZ ST_MULTI_LOOP ;BR = We got it and we're going in
|
||
JRUC ST_OFF ;The whole thing is off
|
||
*
|
||
* Checking just the given object
|
||
*
|
||
ST_SINGLE_TEST
|
||
MOVB *A8(OFLAGS),A14
|
||
JRNN ST_ONSCREEN
|
||
ST_OFF
|
||
CLRZ ;Return NZ when off screen
|
||
JRUC ST_X
|
||
ST_ONSCREEN
|
||
SETZ
|
||
ST_X
|
||
PULL A8 ;Pull must preserve the Status
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* OINIT
|
||
* INITIALIZE FREE LIST, OBJ PLANES, ANIOBJS, QUEUES
|
||
OINIT:
|
||
MMTM SP,A0,A1,A2,A3 ;SAVE REG
|
||
|
||
PUSHST
|
||
DINT
|
||
MOVE @INTENB,A0,W
|
||
ANDNI X1E,A0 ;NO MORE DMA INTERRUPTS
|
||
MOVE A0,@INTENB,W
|
||
POPST
|
||
|
||
MOVI SCRNST,A0,L ;INIT SCREEN TOP LEFT [Y,X]
|
||
MOVE A0,@SCRNTL,L
|
||
MOVI SCRNEND,A0,L ;INIT SCREEN LOWER RIGHT [Y,X]
|
||
MOVE A0,@SCRNBR,L
|
||
|
||
movi DMAIQBOT,B12
|
||
move B12,B13 ;set dma Q to be clear so DMAWAIT won't hang
|
||
MOVE B12,@DMAIQACT,L ;INIT ACTIVE DMA Q
|
||
|
||
MOVI DMAQ+QSIZE,A1
|
||
MOVE A1,@DMAQCUR,L ;INIT MISC DMA QUEUE
|
||
|
||
MOVI DEFAULT_WXBUFFER,A14
|
||
MOVE A14,@WXBUFFER,L
|
||
|
||
MOVI DEFAULT_WYBUFFER,A14
|
||
MOVE A14,@WYBUFFER,L
|
||
|
||
CLR A0
|
||
MOVE A0,@ANIOBJS,L
|
||
|
||
MOVE A0,@XBASE,L
|
||
MOVE A0,@YBASE,L
|
||
MOVE A0,@ZBASE,L
|
||
MOVE A0,@ZBASE_HR,L
|
||
MOVE A0,@XSCROLL,L
|
||
MOVE A0,@YSCROLL,L
|
||
MOVE A0,@ZSCROLL,L
|
||
MOVE A0,@XSACCEL,L
|
||
MOVE A0,@YSACCEL,L
|
||
MOVE A0,@ZSACCEL,L
|
||
|
||
MOVE A0,@BGPLANECT,W
|
||
|
||
MOVE A0,@HORIZON,W
|
||
MOVE A0,@HORIZON_BASE,W
|
||
|
||
MOVE A0,@INVELADD,W ;INIT VELADD FLAG
|
||
|
||
MOVE A0,@WORLD_GRNDOFF,L ;Clear this thing
|
||
|
||
; MOVE A0,@ROADPAL,W
|
||
; move a0,@ROADFLG,W
|
||
;
|
||
; movi ROADOFFY,a1
|
||
; move a1,@ROADY,L
|
||
; movi ROADOFFX,a2
|
||
; move a2,@ROADX,L
|
||
; movi 512,a3 ; number of long words
|
||
;oinitrdoff:
|
||
; move a0,*a1+,L ; clear 2 words at a time
|
||
; move a0,*a2+,L ; clear 2 words at a time
|
||
; dsjs a3,oinitrdoff
|
||
|
||
|
||
PUSHST
|
||
DINT
|
||
|
||
;*** CLEAR OUT FG PLANE, BG PLANES ***
|
||
movi FGLIST,A1
|
||
movi (BGLISTSX-FGLIST)/010h,A2
|
||
ClrFGLp
|
||
move A0,*A1+,W
|
||
dsjs A2,ClrFGLp
|
||
|
||
;*** INITIALIZE LINK FIELDS OF PLNS ***
|
||
movi FGLIST,A1
|
||
movi BGLISTSX,A2
|
||
InitPlns
|
||
move A1,*A1,L ;Make P_LSTHD point at P_LSTHD
|
||
move A1,*A1(020h),L ;Make P_LSTTL point at P_LSTHD
|
||
addi PLNSIZ,A1
|
||
cmp A2,A1
|
||
jrlt InitPlns
|
||
|
||
POPST
|
||
|
||
;*** CLEAR OUT OBJ SPACE ***
|
||
movi OBJSTR,A1
|
||
movi NOBJ*OBSIZ/010h,A2
|
||
CLROBST move A0,*A1+,W
|
||
dsjs A2,CLROBST
|
||
|
||
MOVI OBJSTR,A1,L
|
||
MOVE A1,@OFREE,L ;SETUP FREE LIST
|
||
movi NOBJ,A3 ;Init FREECNT to # of objs
|
||
move A3,@OFREECNT ;
|
||
oinitl:
|
||
MOVE A1,A2
|
||
ADDI OBSIZ,A1,W
|
||
MOVE A1,*A2,L ;LINK EM UP
|
||
DSJS A3,oinitl ;CONTINUE FOR NPROC
|
||
MOVE A0,*A2,L ;ZERO LAST LINK
|
||
move A2,@ENDOFREE,L ;keep ptr to last obj on free list
|
||
|
||
CALLA INIT_DUMMY_UNIVERSE
|
||
|
||
MMFM SP,A0,A1,A2,A3 ;RESTORE REGS
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* CkOFREE
|
||
* WALK FREE LIST, VERIFY LENGTH AND THAT EACH OBJ'S INUSE BIT IS CLEAR
|
||
* LOCKUP ON ERROR
|
||
.IF DEBUG
|
||
CkOFREE:
|
||
mmtm SP,A0,A1,A2
|
||
clr A1
|
||
move @OFREE,A0,L
|
||
jrz GotFreCt
|
||
CntFree inc A1
|
||
movb *A0(OCTRL+B_INUSE-7),A2
|
||
LOCKON N
|
||
move *A0,A0,L
|
||
jrnz CntFree
|
||
GotFreCt:
|
||
move @OFREECNT,A0,W
|
||
cmp A0,A1
|
||
LOCKON NE
|
||
mmfm SP,A0,A1,A2
|
||
rets
|
||
.ENDIF
|
||
|
||
|
||
**************************************************************************
|
||
* IsAnObj
|
||
* CHECK A0 FOR BEING AN OBJECT PTR
|
||
* LOCKS UP IF BAD OBJ
|
||
IsAnObj:
|
||
PUSH A0
|
||
subi OBJSTR,A0
|
||
LOCKON N
|
||
cmpi OBJSTRX,A0
|
||
LOCKON GE
|
||
movi OBSIZ,A14
|
||
modu A14,A0
|
||
LOCKON NZ
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETOBJ
|
||
* GET A FREE OBJECT BLOCK FOR USE
|
||
*
|
||
* RETURNS A0 = PTR TO OBJECT BLOCK
|
||
* IF NO BLOCKS WERE AVAILABLE THEN THE Z FLAG IS SET
|
||
GETOBJ:
|
||
MOVE @OFREE,A0,L ; pointer to next available obj block
|
||
jreq getox
|
||
.IF DEBUG
|
||
callr IsAnObj
|
||
movb *A0(OCTRL+B_INUSE-7),A14
|
||
LOCKON N
|
||
.ENDIF
|
||
move @OFREECNT,A14,W ;dec obj free list count
|
||
dec A14 ;
|
||
move A14,@OFREECNT,W ;
|
||
LOCKON N
|
||
jrp SkClrEnd
|
||
move @ENDOFREE,A14,L
|
||
cmp A14,A0
|
||
LOCKON NE
|
||
clr A14
|
||
move A14,@ENDOFREE,L
|
||
SkClrEnd:
|
||
move *A0,A14,L
|
||
move A14,@OFREE,L ; adjust pointer to free list
|
||
|
||
;*** CLEAR OUT THE VITAL PART OF THE OBJECT BLOCK ***
|
||
clr A14
|
||
movi OCLRSIZ,B14
|
||
srl 5,B14
|
||
jrnc SkObjWord
|
||
move A14,*A0+,W
|
||
SkObjWord
|
||
srl 1,B14
|
||
jrnc SkObjLong
|
||
move A14,*A0+,L
|
||
SkObjLong
|
||
ObjClrLp
|
||
move A14,*A0+,L
|
||
move A14,*A0+,L
|
||
dsjs B14,ObjClrLp
|
||
subi OCLRSIZ,A0
|
||
|
||
; move @TIME,A14,W
|
||
; move A14,*A0(OTIME),W
|
||
|
||
MOVKM 1,*A0(ONOT_SORTED),W ;Flag object as out of order
|
||
|
||
movi DMAWNZ|M_INUSE,A14
|
||
move A14,*A0(OCTRL),L ;init offset:flags
|
||
|
||
move A0,A0 ; clear Z flag
|
||
getox:
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLRODATA - ROUTINE TO CLEAR THE ODATA AREA OF AN OBJECT. *
|
||
* A0 VERSION *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
CLRODATA
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR CLR_ODATA
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLR_ODATA - ROUTINE TO CLEAR THE ODATA AREA OF AN OBJECT *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* Z bit Clear *
|
||
* *
|
||
**************************************************************************
|
||
CLR_ODATA
|
||
MMTM SP,A1,A2
|
||
MOVE A8,A1
|
||
MOVE A1,A2
|
||
ADDI ODATA,A1
|
||
ADDI ODATAX,A2
|
||
CALLA CLRBLOCK
|
||
CLRM *A8(OPLAYER),L
|
||
MOVE A8,A8 ;Clear Z for compatability
|
||
MMFM SP,A1,A2
|
||
RETS
|
||
|
||
****************************************************************************
|
||
* SET_OPLANE
|
||
*
|
||
* set OPLANE field for each obj of a multi-parter
|
||
* A8 ptr to head obj
|
||
* A1 OPLANE value
|
||
SET_OPLANE:
|
||
move A8,A14
|
||
SETPLNLP
|
||
; movb A1,*A14(OPLANE)
|
||
move *A14(OPARTS),A14,L
|
||
jrnz SETPLNLP
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INSERT_OBJ - If head of multi-parter, entire multi-parter inserted. *
|
||
* If sub-part of multi-parter, just sub-part inserted. *
|
||
* OID is checked to insert object on supplemental list. *
|
||
* A8 = OBJ *
|
||
* RETURNS *
|
||
* nothing *
|
||
* *
|
||
**************************************************************************
|
||
INSERT_OBJ:
|
||
PUSH A0
|
||
move *A8(OPART1),A0,L
|
||
jrz SkInsMulti
|
||
cmp A0,A8 ;Is Part Head Obj
|
||
jrne SkInsMulti
|
||
|
||
InsMulti
|
||
;* TO INSERT A HEAD OBJECT, INSERT SUBPARTS FIRST
|
||
;* THIS COULD BE MADE MORE EFFICIENT BY INSERTING ENTIRE MULTI-PARTER
|
||
;* TOGETHER INSTEAD OF CALLING INSOBJ FOR EACH PIECE
|
||
move *A0(OPARTS),A0,L
|
||
jrz SkInsMulti
|
||
callr INSOBJ ;INSERT Sub-Part
|
||
jruc InsMulti
|
||
SkInsMulti
|
||
move A8,A0
|
||
callr INSOBJ
|
||
PULLQ A0
|
||
rets
|
||
****************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INSERT_ON_OBJ - SAME AS INSERT_OBJ, EXCEPT, SUB-PARTS WILL ONLY BE *
|
||
* INSERTED IF THEY ARE ON, I.E. DMA WILL WRITE. *
|
||
* A8 = PTR TO OBJ *
|
||
* *
|
||
**************************************************************************
|
||
INSERT_ON_OBJ
|
||
PUSH A0
|
||
MOVE *A8(OPART1),A0,L ;CHECK FOR HEAD
|
||
JRZ SkInsMulti
|
||
CMP A0,A8 ;IS IT?
|
||
JRNE SkInsMulti ;BR = NO
|
||
IOO_LP
|
||
;* TO INSERT A HEAD OBJECT, INSERT SUBPARTS FIRST, IF THEY'RE ON.
|
||
;* THIS COULD BE MADE MORE EFFICIENT BY INSERTING ENTIRE MULTI-PARTER
|
||
;* TOGETHER INSTEAD OF CALLING INSOBJ FOR EACH PIECE
|
||
MOVE *A0(OPARTS),A0,L ;GET SUB-PART
|
||
JRZ SkInsMulti ;BR = NO MORE
|
||
|
||
; MOVE *A0(OCTRL),A14,W ; OLD WAY
|
||
; SLL 28,A14 ;IS THIS OBJECT ON?
|
||
; JRZ IOO_LP ;BR = NO, THEN DON'T INSERT YET
|
||
|
||
move *a0(OFLAGS),a14
|
||
btst B_NODISP,a14
|
||
jrnz IOO_LP
|
||
|
||
CALLR INSOBJ ;INSERT LOS SUB-PART
|
||
JRUC IOO_LP ;AND DO NEXT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* REINSBOBJ - INSERT AN OBJECT ON THE BACKGROUND LIST. *
|
||
* A0 = PTR TO OBJECT *
|
||
* *A0(OPLANE) = PLANE NUMBER TO INSERT UPON *
|
||
* *
|
||
**************************************************************************
|
||
REINSBOBJ:
|
||
mmtm SP,A1,A2,A3,A4,A5
|
||
;tell background system to delete
|
||
move *A0(OFLAGS),A4,W
|
||
andni M_BNODEL,A4
|
||
move A4,*A0(OFLAGS),W
|
||
jruc INSBOBJE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INSBOBJ - INSERT AN OBJECT ON THE BACKGROUND LIST. *
|
||
* A0 = PTR TO OBJECT *
|
||
* *A0(OPLANE) = PLANE NUMBER TO INSERT UPON *
|
||
* *
|
||
**************************************************************************
|
||
INSBOBJ:
|
||
mmtm SP,A1,A2,A3,A4,A5
|
||
;tell background system not to delete
|
||
move *A0(OFLAGS),A4,W
|
||
ori M_BNODEL,A4
|
||
move A4,*A0(OFLAGS),W
|
||
INSBOBJE
|
||
*DO SOME ERROR CHECKING FIRST
|
||
callr IsAnObj
|
||
move *A0,A4,L
|
||
LOCKON NZ ;obj is already inserted
|
||
|
||
movi BGLISTS,A3
|
||
; movb *A0(OPLANE),A1
|
||
movi PLNSIZ,A14
|
||
mpyu A14,A1 ;Plane # * planesize
|
||
add A1,A3 ; + base of plane table
|
||
|
||
jruc InsGotPln
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INSPLANE - INSERT AN OBJECT ON A GIVEN PLANE, DISREGARDS OPLANE *
|
||
* AND ZVAL. *
|
||
* A0 = OBJ to insert *
|
||
* B0 = ptr to plane *
|
||
* RETURNS *
|
||
* nothing *
|
||
* *
|
||
**************************************************************************
|
||
INSPLANE:
|
||
mmtm SP,A1,A2,A3,A4,A5
|
||
move B0,A3
|
||
jruc InsGotPln
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INSOBJ - Insert obj into doubly linked object list *
|
||
* List is sorted by increasing Z and increasing Y *
|
||
* OID is checked to insert object on supplemental list *
|
||
* A0 = OBJ *
|
||
* *A0(OPLANE) = Plane # if no AUTOZ *
|
||
* RETURNS *
|
||
* nothing *
|
||
* *
|
||
**************************************************************************
|
||
INSOBJ:
|
||
mmtm SP,A1,A2,A3,A4,A5
|
||
;ERROR CHECKS
|
||
callr IsAnObj
|
||
|
||
move *A0,A4,L
|
||
jrnz INSOBJX ;obj is already inserted
|
||
|
||
movi FGLIST,A3
|
||
InsGotPln
|
||
move A3,A4
|
||
move *A0(OZVAL),A1,L ; GET Z POSITION
|
||
ins_zloop:
|
||
move *A3,A3,L
|
||
cmp A3,A4
|
||
jreq do_ins ; bra if at end of list
|
||
|
||
MOVE *A3(ONOT_SORTED),A2,W
|
||
JRNZ ins_zloop ;BR = Don't base off un-sorted object
|
||
|
||
move *A3(OZVAL),A2,L ; ZPOS in A3
|
||
cmp A2,A1
|
||
jrgt ins_zloop
|
||
jrlt do_ins
|
||
|
||
move *A0(OYVAL),A5,L ; GET Y POSITION
|
||
jruc ins_ytest
|
||
ins_yloop
|
||
move *A3,A3,L
|
||
cmp A3,A4
|
||
jreq do_ins ; bra if at end of list
|
||
|
||
MOVE *A3(ONOT_SORTED),A2,W
|
||
JRNZ ins_yloop ;BR = Don't base off un-sorted object
|
||
|
||
move *A3(OZVAL),A2,L ; ZPOS in A3
|
||
cmp A2,A1
|
||
jrlt do_ins
|
||
ins_ytest
|
||
move *A3(OYVAL),A2,L ;TEST Y POSITION
|
||
cmp A2,A5
|
||
jrlt ins_yloop
|
||
do_ins
|
||
PUSHST
|
||
DINT
|
||
move *A3(OBLINK),A2,L ; get ptr to previous
|
||
|
||
move A3,*A0,L ;IF BACK LINKS USED FROM INTERRUPT
|
||
move A0,*A2,L ; THIS WILL NEED TO BE DINT
|
||
move A0,*A3(OBLINK),L ;
|
||
move A2,*A0(OBLINK),L ;
|
||
CLR A4
|
||
MOVE A4,*A0(ONOT_SORTED),W ;Mark object as sorted
|
||
POPST
|
||
|
||
callr INSSUPP ;INSERT ON SUPPLEMENTAL LIST
|
||
INSOBJX
|
||
mmfm SP,A1,A2,A3,A4,A5
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* PULL_OBJ
|
||
* PULLS OBJECT FROM A DOUBLY LINKED OBJECT LIST
|
||
* MULTI-PART PIECES ARE NOT UNLINKED
|
||
* IF HEAD OF MULTI-PARTER, ENTIRE MULTI-PARTER PULLED
|
||
* IF SUB-PART OF MULTI-PARTER, JUST SUB-PART PULLED
|
||
* OID IS CHECKED TO PULL OBJECT FROM SUPPLEMENTAL LIST
|
||
*
|
||
* A8 = OBJ to be pulled
|
||
* RETS nothing
|
||
PULL_OBJ:
|
||
PUSH A0
|
||
move *A8(OPART1),A0,L
|
||
jrz SkPullMulti
|
||
cmp A0,A8 ;Is Part Head Obj
|
||
jrne SkPullMulti
|
||
|
||
PullMulti ;* TO PULL A HEAD OBJECT, PULL ANY SUBPARTS FIRST
|
||
move *A0(OPARTS),A0,L
|
||
jrz SkPullMulti
|
||
callr PULLOBJ ;Pull Sub-Part
|
||
jruc PullMulti
|
||
SkPullMulti
|
||
move A8,A0
|
||
callr PULLOBJ
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PULLOBJ *
|
||
* *
|
||
* Pull an object from the Doubly linked object list. *
|
||
* If object is not inserted, then nothing is done. *
|
||
* Object is also pulled from the supplemental list *
|
||
* defined by its OID. *
|
||
* OLINK is cleared to mark object as not inserted. *
|
||
* *
|
||
* A0 = Ptr to object *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Nothing *
|
||
* *
|
||
**************************************************************************
|
||
PULLOBJ:
|
||
;PULL OBJ OUT OF ACTIVE OBJ LIST
|
||
;No zero checks needed because there will always be ptrs from both ends
|
||
move *A0(OLINK),A14,L ;IS OBJ INSERTED?
|
||
jrz SkPULLOBJ
|
||
PUSH A1
|
||
PUSHST
|
||
DINT ;Interrupts off now
|
||
move *A0(OBLINK),A1,L ;A1 - Prev Obj
|
||
move *A0,A14,L ;A14 - Next Obj
|
||
move A14,*A1,L ;LINK FORWARD AROUND OBJ A0
|
||
move A1,*A14(OBLINK),L ;LINK BACKWARD AROUND OBJ A0
|
||
clr A14
|
||
move A14,*A0(OLINK),L ;OBJ NOT INSERTED
|
||
POPST
|
||
|
||
; callr PULLSHAD
|
||
|
||
callr PULLSUPP ;PULL FROM SUPPLEMENTAL LIST
|
||
PULLQ A1
|
||
SkPULLOBJ
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELETE_OBJ *
|
||
* *
|
||
* Delete an object from the object list and put it on the *
|
||
* end of the FREE list. *
|
||
* *
|
||
* If object is HEAD of a multi-parter the entire multi-parter *
|
||
* is pulled from the object list and put on the FREE list *
|
||
* but it is not disassembled as a multi-parter. *
|
||
* *
|
||
* If object is a sub-part of a multi-parter, object is *
|
||
* unlinked from the multi-parter, pulled from the object list *
|
||
* and put on the FREE list. *
|
||
* *
|
||
* If object is solo then it is pulled from the object list and *
|
||
* put on the FREE list. *
|
||
* *
|
||
* All objects: *
|
||
* *
|
||
* - Pulled from the Animation list, if Animating. *
|
||
* - Shadow pulled and freed, if object has a shadow. *
|
||
* - Palette is deallocated. *
|
||
* *
|
||
* Entrypoints: *
|
||
* *
|
||
* DELETE_OBJ_PROC - Kills controlling process. *
|
||
* ZAP_OBJ - Skips the OPLINK safety check. *
|
||
* *
|
||
* A8 = Ptr to object to be freed *
|
||
* *
|
||
* Returns: *
|
||
* Nothing *
|
||
* *
|
||
**************************************************************************
|
||
DELETE_OBJ:
|
||
;Delete this symbol - FREE_OBJ:
|
||
.IF DEBUG
|
||
move *A8(OPLINK),A14,L
|
||
jrz ZAP_OBJ
|
||
cmp A14,A13
|
||
LOCKON NE
|
||
.ENDIF
|
||
JRUC ZAP_OBJ
|
||
|
||
*
|
||
*Entrypoint: Kills linked process before deleting
|
||
*
|
||
DELETE_OBJ_PROC
|
||
CALLA OBJPROC_KILL
|
||
*
|
||
* Fall through to ZAP_OBJ!
|
||
|
||
*
|
||
*Entrypoint: If OPLINK should not be checked
|
||
*
|
||
ZAP_OBJ:
|
||
PUSH A0
|
||
move *A8(OPART1),A0,L
|
||
jrz SkFreeMulti
|
||
cmp A0,A8 ;Is Part Head Obj
|
||
jreq FreeMulti
|
||
callr PULL_PART ;SubPart just gets unlinked
|
||
jruc SkFreeMulti
|
||
FreeMulti ;* TO FREE A HEAD OBJECT, FREE ANY SUBPARTS FIRST (don't unlink)
|
||
move *A0(OPARTS),A0,L
|
||
jrz SkFreeMulti
|
||
MOVE *A0(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;This wouldn't happen to be a shadow?
|
||
JRNE FreeMulti ;BR = Yes, let it's source sweat it
|
||
callr ZAPOBJ ;Delete Sub-Part
|
||
jruc FreeMulti
|
||
SkFreeMulti
|
||
move A8,A0
|
||
callr ZAPOBJ
|
||
PULLQ A0
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* DELOBJ
|
||
* FREEOBJ
|
||
* FREEGOBJ
|
||
* IF OPLINK SET, IT MUST POINT TO CURRENT PROCESS
|
||
* OID IS CHECKED TO PULL OBJECT FROM SUPPLEMENTAL LIST
|
||
* PUTS OBJ ON END OF FREE LIST
|
||
* INUSE BIT CLEARED
|
||
* FREEGOBJ (free garbage obj) Skips the following checks
|
||
* IF PART ON AN OBJLST, IT IS PULLED
|
||
* IF PART WAS ON ANIM, IT IS PULLED
|
||
* SHADOW OBJ IS FREED
|
||
* PALETTE IS DEALLOCATED
|
||
* ERRORS if obj not valid ptr, obj is already free
|
||
*
|
||
* A0 = OBJ to be deleted/freed
|
||
* RETS nothing
|
||
**************************************************************************
|
||
FREEGOBJ:
|
||
callr IsAnObj
|
||
move *A0(OCTRL),A14,W
|
||
andni M_INUSE,A14
|
||
move A14,*A0(OCTRL),W
|
||
clr A14
|
||
move A14,*A0,L ;OBJ GOES TO END OF FREE LIST, PTS AT NOTHING
|
||
jruc DOFREE
|
||
**************************************************************************
|
||
DELOBJ:
|
||
FREEOBJ:
|
||
.IF DEBUG
|
||
; MOVE *A0(OID),A14,W
|
||
; CMPI OID_UNIV,A14
|
||
; JREQ ZAPOBJ
|
||
move *A0(OPLINK),A14,L
|
||
jrz ZAPOBJ
|
||
cmp A14,A13
|
||
LOCKON NE
|
||
.ENDIF
|
||
ZAPOBJ:
|
||
* ENTRY POINT IF PLINK SHOULD NOT BE CHECKED
|
||
|
||
callr IsAnObj
|
||
|
||
;CLEAR INUSE BIT TO MARK OBJ AS ON FREE LIST
|
||
move *A0(OCTRL),A14,W
|
||
btst B_INUSE,A14
|
||
|
||
jrnz inuse_ok
|
||
CALLA DUMPPRINT
|
||
rets
|
||
inuse_ok:
|
||
|
||
andni M_INUSE,A14
|
||
move A14,*A0(OCTRL),W
|
||
move *A0(OFLAGS),A14,W
|
||
;PULL FROM ANIM IF NECESSARY
|
||
btst B_ANIM,A14
|
||
jrz NoAnim
|
||
callr PULLANIM
|
||
NoAnim
|
||
callr PULLOBJ
|
||
callr DELSHAD
|
||
calla DELPAL
|
||
|
||
DOFREE
|
||
;PUT OBJ ON FREE LIST
|
||
move @OFREECNT,A14,W ;inc obj free list count
|
||
inc A14 ;
|
||
move A14,@OFREECNT,W ;
|
||
|
||
move @ENDOFREE,A14,L
|
||
jrz HdLink1
|
||
move A0,*A14,L
|
||
jruc DidLink1
|
||
HdLink1
|
||
move A0,@OFREE,L
|
||
DidLink1
|
||
move A0,@ENDOFREE,L
|
||
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELSHAD *
|
||
* *
|
||
* Delete a given objects shadow. *
|
||
* *
|
||
* A0 = Ptr to the object that is being shadowed. *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Nothing *
|
||
* *
|
||
**************************************************************************
|
||
DELSHAD
|
||
move *A0(OSHAD),A14,L
|
||
jreq DELSHADX ;BR = NO SHADOW EXISTS
|
||
|
||
PUSH A1
|
||
|
||
MOVE *A0(OFLAGS),A1,W
|
||
BTST B_SHAD,A1 ;Is calling object a shadow?
|
||
LOCKON NE ;Shadows can't have shadows!
|
||
|
||
move *A14(OSHAD),A1,L
|
||
cmp A1,A0 ;Do these objects belong together?
|
||
LOCKON NE ;Shadow doesn't belong to this object
|
||
|
||
clr A1
|
||
move A1,*A14(OSHAD),L
|
||
move A1,*A0(OSHAD),L
|
||
|
||
move A0,A1
|
||
move A14,A0
|
||
CALLR PULLPART
|
||
callr DELOBJ
|
||
move A1,A0
|
||
|
||
PULLQ A1
|
||
DELSHADX
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PULLSHAD *
|
||
* *
|
||
* Pull a given objects shadow from the display list. *
|
||
* *
|
||
* A0 = Ptr to the object that is being shadowed. *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Nothing *
|
||
* *
|
||
**************************************************************************
|
||
PULLSHAD
|
||
move *A0(OSHAD),A14,L
|
||
jreq PULLSHADXX ;BR = NO SHADOW EXISTS
|
||
|
||
PUSH A1
|
||
|
||
MOVE *A0(OFLAGS),A1,W
|
||
BTST B_SHAD,A1 ;Is calling object a shadow?
|
||
LOCKON NE ;Shadows can't have shadows!
|
||
|
||
move *A14(OSHAD),A1,L
|
||
cmp A1,A0
|
||
LOCKON NE
|
||
|
||
move *A14,A1,L ;IS SHADOW INSERTED?
|
||
jrz PULLSHADX
|
||
|
||
move A0,A1
|
||
move A14,A0
|
||
callr PULLOBJ
|
||
move A1,A0
|
||
PULLSHADX
|
||
PULLQ A1
|
||
PULLSHADXX
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELETE_SHADOW *
|
||
* *
|
||
* Delete the entire shadow of an object. Object may *
|
||
* be a single or multi parter. *
|
||
* *
|
||
* A8 = Ptr to object being shadowed. *
|
||
* *
|
||
**************************************************************************
|
||
DELETE_SHADOW
|
||
PUSH A0
|
||
MOVE A8,A0
|
||
DS_LOOP
|
||
MOVE *A0(OFLAGS),A1,W
|
||
BTST B_SHAD,A1 ;Is this a shadow?
|
||
JRNZ DS_NXT ;BR = Yes
|
||
|
||
CALLR DELSHAD ;Delete shadow for this object
|
||
DS_NXT
|
||
MOVE *A0(OPARTS),A0,L ;Get next
|
||
JRNZ DS_LOOP ;Br = And there is one to do
|
||
PULLQ A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_SHAD *
|
||
* *
|
||
* Routine to create a shadow object for a given object. *
|
||
* Shadow object is doubly linked to its parent via OSHAD. *
|
||
* Shadow object is also added as a sub-part to the parent *
|
||
* object or multi-parter. *
|
||
* Shadow is inserted on the object list. *
|
||
* *
|
||
* A8 = Ptr to object that needs to be shadowed. *
|
||
* *
|
||
* Returns *
|
||
* Z = No shadow created (A0 = 0) *
|
||
* NZ = Shadow success (A0 = Ptr to shadow object) *
|
||
* *
|
||
**************************************************************************
|
||
GET_SHAD
|
||
PUSH A2
|
||
MOVE *A8(OZVAL),A2,L
|
||
INC A2
|
||
CALLR SHADOW_INIT
|
||
JRZ GS_X
|
||
MOVKB 1,*A0(OZOFF) ;We do this just in case
|
||
MOVE A0,A0
|
||
GS_X
|
||
PULL A2
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_SHAD_MULTI *
|
||
* *
|
||
* Routine to create a shadow made of many parts, from an *
|
||
* object of many parts. Each shadow is created to the *
|
||
* description of GET_SHAD. *
|
||
* *
|
||
* A8 = Ptr to head of multi-parter *
|
||
* *
|
||
* Returns *
|
||
* Z = Not all shadows created *
|
||
* NZ = All shadows created *
|
||
* *
|
||
**************************************************************************
|
||
GET_SHAD_MULTI
|
||
MMTM SP,A2,A3,A4,A8
|
||
CLR A3 ;This will become max OZOFF
|
||
CLR A4 ;This will be a part counter
|
||
MOVE A8,A0
|
||
;First we must find the largest ZOFF of all the parts and up it 1
|
||
GSM_Z_LOOP
|
||
MOVE *A0(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;Did we hit a previous shadow?
|
||
JRNZ GSM_NO_COUNT ;BR = Yes, then just skip it
|
||
MOVB *A0(OZOFF),A14
|
||
CMP A3,A14 ;Is this ZOFF greater?
|
||
JRLE GSM_NOT_GREATER ;BR = No, let's not worry about it
|
||
MOVE A14,A3 ;Keep it, we may use it.
|
||
GSM_NOT_GREATER
|
||
INC A4
|
||
GSM_NO_COUNT
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ GSM_Z_LOOP
|
||
INC A3
|
||
;Now we have the OZOFF that we want
|
||
MOVE *A8(OZVAL),A2,L
|
||
MOVB *A8(OZOFF),A14
|
||
SUB A14,A2
|
||
ADD A3,A2 ;Offset for the correct Z
|
||
GSM_SHADOW_LOOP
|
||
MOVE *A8(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;Did we hit a previous shadow?
|
||
JRNZ GSM_NO_CREATE ;BR = Yes, then just skip it
|
||
|
||
CALLR SHADOW_INIT ;Get a shadow for this part
|
||
JRZ GSM_X ;BR = We are out of shadows for today
|
||
JRC GSM_NO_SHADOW ;BR = Shadow no allowed
|
||
MOVB A3,*A0(OZOFF)
|
||
GSM_NO_SHADOW
|
||
DEC A4
|
||
JRZ GSM_X
|
||
GSM_NO_CREATE
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ GSM_SHADOW_LOOP
|
||
GSM_X
|
||
MOVE A0,A0
|
||
MMFM SP,A2,A3,A4,A8
|
||
RETS
|
||
|
||
|
||
*
|
||
*Entrypoint: Used for shadow creation. You provide the ZVAL
|
||
*A2 = OZVAL
|
||
*Returns:
|
||
* Z = No shadow object could be created
|
||
* NZ & NC = Everthing went O.K. Shadow is in A0
|
||
* NZ & C = No shadow created for some reason. A0 is bogus
|
||
*
|
||
SHADOW_INIT
|
||
MOVE *A8(OFLAGS),A14,W
|
||
BTST B_NOSHADOW,A14 ;Object allowed to have a shadow?
|
||
JRNZ GS_NO_CREATE ;BR = No
|
||
|
||
;Can't already have a shadow, or be a shadow
|
||
MOVE *A8(OSHAD),A14,L ;Do we have, or are, a shadow?
|
||
JRNZ GS_NO_CREATE
|
||
|
||
callr GETOBJ ;Grab an object
|
||
jrz GETSHADX ;BR = No objects left
|
||
|
||
;INIT SHADOW OBJ
|
||
|
||
CALLR COPY_OBJ ;Make a copy of 'da mastah
|
||
|
||
MMTM SP,A1,A5
|
||
|
||
CLR A5
|
||
CALLA INC_PALCNT ;Mark use of palette 0 to remain sane
|
||
|
||
MOVE A5,*A0(OGUNVECT),L
|
||
MOVE A5,*A0(OCVECT),L
|
||
|
||
MOVI COLOR_BLACK,A14
|
||
SLL 16,A14
|
||
MOVE A14,*A0(OPAL),L ;Shadow will be constant color
|
||
|
||
MOVE *A0(OCTRL),A5,W
|
||
; MOVE *A0(OCTRL),A14,W
|
||
; MOVE A14,A5
|
||
; SLL 28,A14 ;Is the object turned on?
|
||
; JRZ SI_STUF_CTRL ;BR = No, just stuff as is
|
||
|
||
SRL 4,A5
|
||
SLL 4,A5
|
||
ADDK DMACNZ&0Fh,A5
|
||
SI_STUF_CTRL
|
||
MOVE A5,*A0(OCTRL),W
|
||
|
||
MOVE @YWORLD,A5,L
|
||
MOVE @WORLD_GRNDOFF,A14,L
|
||
ADD A14,A5
|
||
MOVE A5,*A0(OYVAL),L ;Set this sucker on the ground
|
||
|
||
MOVE A2,*A0(OZVAL),L ;Stuff the given Z Position
|
||
|
||
;Do the initial scaling in case the object doesn't move in Z
|
||
|
||
MOVI 10000H,a5 ;10000h
|
||
MOVE *A0(OSCALEY),A1,W
|
||
SLL SLL_SHADOW,A1 ;Shrink it another 75% in Y
|
||
MOVE A1,*A0(OSCALEY),W ;Need to make sure this changes
|
||
DIVU A1,A5 ;Inverse of Y scale in A5
|
||
|
||
MOVE *A0(OUSIZEY),A1,W
|
||
MPYU a5,a1 ;Scale the Y size, result in A1
|
||
SRL 8,A1
|
||
MOVE A1,*A0(OSIZEY),W
|
||
|
||
MOVE *A0(OUANIOFFY),A1,W
|
||
MPYS A5,A1 ;Scale the Y animation pnt
|
||
SRA 8,a1
|
||
MOVE A1,*A0(OANIOFFY),W
|
||
|
||
MMFM SP,A1,A5
|
||
|
||
;STUFF FLAGS FOR SHAD
|
||
move *A0(OFLAGS),A14,W
|
||
ori M_SHAD,A14
|
||
move A14,*A0(OFLAGS),W
|
||
|
||
;I.D. PLEASE
|
||
MOVIM OID_SHAD,*A0(OID),W
|
||
|
||
;DOUBLY LINK OSHADS
|
||
move A8,*A0(OSHAD),L
|
||
move A0,*A8(OSHAD),L
|
||
|
||
;LINK SHADOW TO PARENT AS MULTI-PARTER
|
||
callr INSPART
|
||
|
||
callr INSOBJ
|
||
|
||
MOVE A0,A0 ;Set return flags
|
||
CLRC
|
||
GETSHADX
|
||
rets
|
||
*
|
||
*Z must be set here
|
||
*
|
||
GS_NO_CREATE
|
||
SETC ;Flag the failure
|
||
RETS
|
||
|
||
;6/17
|
||
**************************************************************************
|
||
* *
|
||
* FPSTFOBJ0 *
|
||
* FIND PAL AND THEN.. *
|
||
* STFOBJ0 *
|
||
* INIT OBJ W/ STARTING FRAME *
|
||
* A0 = PTR TO THE OBJ *
|
||
* A1 = PTR TO 1st Frame *
|
||
* *
|
||
* Z = FAILURE IN SOME WAY OR ANOTHER. *
|
||
* NZ = SUCCESS *
|
||
* *
|
||
**************************************************************************
|
||
FPSTFOBJ0:
|
||
PUSH A2
|
||
move A0,A2
|
||
move *A1(ICMAP),A0,L
|
||
calla GETFPAL
|
||
JRNZ STFOBJ_PAL ;BR = WE HAVE PALETTE!
|
||
MOVE A2,A0 ;ERROR CONDITION, RESTORE OBJECT
|
||
SETZ ;Z TO FLAG ERROR
|
||
JRUC STFOBJX ;RETURN
|
||
STFOBJ_PAL
|
||
move A0,*A2(OPAL),W
|
||
move A2,A0
|
||
jruc STFOBJE
|
||
STFOBJ0
|
||
PUSH A2
|
||
STFOBJE
|
||
move A1,*A0(OIMG),L
|
||
|
||
;*A0(OIHOFF) IS ZERO.
|
||
; move *a0(OIHOFF),a14
|
||
; add a14,a1
|
||
|
||
move *A1(ISIZE),A14,L
|
||
move A14,*A0(OSIZE),L
|
||
MOVE A14,*A0(OUSIZE),L
|
||
move *A1(ISAG),*A0(OSAG),L
|
||
MOVE *A1(ICTRL),*A0(OCTRL),W
|
||
|
||
MOVE *A1(IANIOFF),A14,L
|
||
MOVE A14,*A0(OANIOFF),L
|
||
move A14,*A0(OUANIOFF),L
|
||
clr a14
|
||
move A14,*A0(OPARTSXY),L
|
||
|
||
MOVI 01000100H,A14
|
||
MOVE A14,*A0(OSCALE),L
|
||
sll 1,a14
|
||
move a14,*a0(ODAG),L ; place offscreen
|
||
|
||
MOVE A0,A0
|
||
STFOBJX
|
||
PULL A2
|
||
RETS
|
||
|
||
****************************************************************************
|
||
* CFUNCS (creation funcs) for MULTIMAKE
|
||
****************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* C_SET_GUNVECT *
|
||
* *
|
||
* THE FOLLOWING STUFFS THE OGUNVECT FIELD. *
|
||
* *
|
||
* REQUIRES: *
|
||
* *
|
||
* .LONG GUN VECTOR *
|
||
* *
|
||
**************************************************************************
|
||
|
||
C_SET_GUNVECT
|
||
MOVE *B0+,B14,L
|
||
MOVE B14,A14
|
||
MOVE A14,*A0(OGUNVECT),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* C_SET_SCRNOBJ *
|
||
* *
|
||
* THE FOLLOWING SETS UP A SINGLE SCREEN OBJECT. *
|
||
* *
|
||
* REQUIRES: *
|
||
* *
|
||
* .WORD X POSITION *
|
||
* .WORD Y POSITION *
|
||
* .WORD Z POSITION *
|
||
* *
|
||
**************************************************************************
|
||
|
||
C_SET_SCRNOBJ
|
||
MOVE *B0+,B14,L
|
||
MOVE B14,A1 ;[Y,X] POSITION
|
||
MOVE *A0(OANIOFF),A14,L
|
||
SUBXY A14,A1
|
||
MOVE A1,*A0(ODAG),L
|
||
MOVE A1,*A0(OXPOS),W
|
||
SRL 16,A1
|
||
MOVE A1,*A0(OYPOS),W
|
||
MOVE *B0+,B14,W ;Z INTEGER POSITION
|
||
MOVE B14,A1
|
||
MOVE A1,*A0(OZPOS),W
|
||
RETS
|
||
|
||
|
||
****************************************************************************
|
||
* C_GETPRC
|
||
* MULTIMAKE CFUNC - GET A PROCESS AND LINK IT TO THE OBJECT JUST MADE
|
||
* REQUIRES
|
||
* .word PROCID
|
||
* .long WAKEUP
|
||
* After CFUNC entry of MULTIMAKE script
|
||
C_GETPRC
|
||
move *B0+,B14,W ;PROCID
|
||
move B14,A1
|
||
move *B0+,B14,L ;WAKEUP
|
||
move B14,A7
|
||
PUSH A8
|
||
move A0,A8
|
||
calla GETPRC
|
||
move A0,*A8(OPLINK),L
|
||
PULLQ A8
|
||
rets
|
||
|
||
****************************************************************************
|
||
* C_ANIM
|
||
* MULTIMAKE CFUNC - PUT OBJ JUST MADE ON ANIM
|
||
*
|
||
* REQUIRES
|
||
* .long ANIM_INIT_TABLE w/ format of
|
||
* After CFUNC entry of MULTIMAKE script
|
||
C_ANIM
|
||
move *B0+,B14,L ;ANIM_INIT_TABLE
|
||
move B14,A1
|
||
callr STFANIM
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* C_STRTANIM - OBJECT CREATE CFUNC TO DO A QUICK START OF AN ANIM. *
|
||
* CLEARS STUFFS SCRIPT AND LOOP BACK THE SAME. CLEARS *
|
||
* ANISLP. *
|
||
* REQUIRES *
|
||
* .LONG ANIM SCRIPT PTR *
|
||
* *
|
||
**************************************************************************
|
||
C_STRTANIM
|
||
MOVE *B0+,B14,L
|
||
MOVE B14,A1
|
||
CALLR STRTANIM
|
||
RETS
|
||
**************************************************************************
|
||
* *
|
||
* C_STRTANIM_GUNVECT - START AN ANIMATION AND STUFF A GUN VECTOR *
|
||
* *
|
||
* REQUIRES: *
|
||
* .LONG ANIM SCRIPT PTR, GUN VECTOR *
|
||
* *
|
||
**************************************************************************
|
||
C_STRTANIM_GUNVECT
|
||
CALLR C_STRTANIM
|
||
JRUC C_SET_GUNVECT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_FLPS - SET THE FLIP BITS OF ALL OBJECTS IN A MULTI-PARTER. *
|
||
* A8 ptr to HEAD OBJ of MULTI-PARTER *
|
||
* A0 New flip bits *
|
||
* *
|
||
**************************************************************************
|
||
SET_FLPS
|
||
mmtm SP,A4,A8
|
||
FlpLp
|
||
move *A8(OCTRL),A4,L
|
||
andni M_FLIPH|M_FLIPV,A4
|
||
or A0,A4
|
||
CALLR SET_OCTRL_OPARTSXY
|
||
move *A8(OPARTS),A8,L
|
||
jrnz FlpLp
|
||
mmfm SP,A4,A8
|
||
|
||
MMTM SP,A1,A2,A3
|
||
CALLR SET_OBJSU
|
||
MMFM SP,A1,A2,A3
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TOGGLE_FLPS - ROUTINE TO TOGGLE THE SPECIFIED FLIP BITS OF AN OBJECT. *
|
||
* A0 = FLIP BITS TO TOGGLE *
|
||
* A8 = PTR TO HEAD OBJECT OF MULTI-PARTER *
|
||
* *
|
||
**************************************************************************
|
||
TOGGLE_FLPS
|
||
MMTM SP,A4,A8
|
||
TF_LP
|
||
MOVE *A8(OCTRL),A4,W
|
||
XOR A0,A4
|
||
CALLR SET_OCTRL_OPARTSXY
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ TF_LP
|
||
MMFM SP,A4,A8
|
||
|
||
MMTM SP,A1,A2,A3
|
||
CALLR SET_OBJSU
|
||
MMFM SP,A1,A2,A3
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_FLIP - SET THE FLIP BITS OF ONE OBJECT. *
|
||
* A8 = PTR TO OBJECT *
|
||
* A0 = NEW FLIP BITS *
|
||
* *
|
||
**************************************************************************
|
||
SET_FLIP
|
||
PUSH A4
|
||
MOVE *A8(OCTRL),A4,L
|
||
ANDNI M_FLIPH|M_FLIPV,A4
|
||
OR A0,A4
|
||
CALLR SET_OCTRL_OPARTSXY
|
||
PULLQ A4
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TOGGLE_FLIP - ROUTINE TO TOGGLE THE SPECIFIED FLIP BITS OF AN OBJECT. *
|
||
* A0 = FLIP BITS TO TOGGLE *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
TOGGLE_FLIP
|
||
PUSH A4
|
||
MOVE *A8(OCTRL),A4,L
|
||
XOR A0,A4
|
||
CALLR SET_OCTRL_OPARTSXY
|
||
PULLQ A4
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_OCTRL_OPARTSXY - SET NEW OCTRL AND ADJUST OPARTSXY FOR FLIPPING *
|
||
* PASS: *
|
||
* A4 = NEW OCTRL *
|
||
* RETURNS: *
|
||
* NUTIN' *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SET_OCTRL_OPARTSXY
|
||
PUSH A0
|
||
move *A8(OCTRL),A0,W
|
||
xor A4,A0
|
||
btst B_FLIPH,A0
|
||
jrz SOO_NOX
|
||
|
||
move *A8(OPARTSXY),A14,W
|
||
NEG A14
|
||
move A14,*A8(OPARTSXY),W
|
||
SOO_NOX
|
||
btst B_FLIPV,A0
|
||
jrz SOO_NOY
|
||
|
||
move *A8(OPARTSXY+010H),A14,W
|
||
NEG A14
|
||
move A14,*A8(OPARTSXY+010H),W
|
||
SOO_NOY
|
||
MOVE A4,*A8(OCTRL),W
|
||
PULLQ A0
|
||
RETS
|
||
|
||
|
||
|
||
****************************************************************************
|
||
* CNTRANIP
|
||
* Stuff ANIOFF W/ center point of object
|
||
* A0 = OBJ
|
||
CNTRANIP
|
||
move *A0(OSIZEX),A14,W
|
||
srl 1,A14
|
||
move A14,*A0(OANIOFFX),W
|
||
move *A0(OSIZEY),A14,W
|
||
srl 1,A14
|
||
move A14,*A0(OANIOFFY),W
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* GETANIXY
|
||
* GET THE X AND Y POSITIONS OF AN OBJECTS ANIMATION PT.
|
||
* A8 = OBJ
|
||
* RETS A2=ANI OYPOS (16), A3=ANI OXPOS (16)
|
||
GETANIXY
|
||
move *A8(OYPOS),A2,W
|
||
sll 16,A2
|
||
move *A8(OXPOS),A3,W
|
||
movx A3,A2
|
||
move *A8(OANIOFF),A3,L
|
||
addxy A3,A2
|
||
move A2,A3
|
||
sra 16,A2
|
||
sext A3,W
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIXYL
|
||
* GET THE X AND Y LONG POSITIONS OF AN OBJECTS ANIMATION PT.
|
||
* A8 = OBJ
|
||
* RETS A2=ANI OYPOS (16.16), A3=ANI OXPOS (16.16)
|
||
GETANIXYL
|
||
move *A8(OANIOFFX),A14,W
|
||
sll 16,A14
|
||
move *A8(OXVAL),A3,L
|
||
add A14,A3
|
||
move *A8(OANIOFFY),A14,W
|
||
sll 16,A14
|
||
move *A8(OYVAL),A2,L
|
||
add A14,A2
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIXL
|
||
* GET THE X ANIMATION PT OF AN OBJ (16.16).
|
||
* A8 = OBJ
|
||
* RETS A0=ANI OXPOS (16.16)
|
||
GETANIXL
|
||
move *A8(OXVAL),A0,L
|
||
move *A8(OANIOFFX),A14,W
|
||
sll 16,A14
|
||
add A14,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIX
|
||
* GET ANIMATION POINT X COOR (16)
|
||
* A8 = OBJ
|
||
* RETS A0=ANI OXPOS (16)
|
||
GETANIX
|
||
move *A8(OXPOS),A0,W
|
||
move *A8(OANIOFFX),A14,W
|
||
add A14,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIYL
|
||
* GET THE Y ANIMATION PT OF AN OBJ (16.16).
|
||
* A8 = OBJ
|
||
* RETS A0=ANI OYPOS (16.16)
|
||
GETANIYL
|
||
move *A8(OYVAL),A0,L
|
||
move *A8(OANIOFFY),A14,W
|
||
sll 16,A14
|
||
add A14,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIY
|
||
* GET ANIMATION POINT Y COOR (16)
|
||
* A8 = OBJ
|
||
* RETS A0=ANI OYPOS (16)
|
||
GETANIY
|
||
move *A8(OYPOS),A0,W
|
||
move *A8(OANIOFFY),A14,W
|
||
add A14,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* MATCHOPARTSXY
|
||
* Parms
|
||
* A8 ptr to BASE OBJ
|
||
* A0 ptr to obj which is to have its OPARTSXY set so that its offset pt
|
||
* is at the same point as the BASE OBJ
|
||
MATCHOPARTSXY
|
||
PUSH A1
|
||
move *A8(OPARTSXY),A1,W
|
||
move *A0(OXPOS),A14,W
|
||
sub A14,A1
|
||
move *A8(OXPOS),A14,W
|
||
add A14,A1
|
||
move A1,*A0(OPARTSXY),W
|
||
|
||
move *A8(OPARTSXY+010h),A1,W
|
||
move *A0(OYPOS),A14,W
|
||
sub A14,A1
|
||
move *A8(OYPOS),A14,W
|
||
add A14,A1
|
||
move A1,*A0(OPARTSXY+010h),W
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* MATCHANIP
|
||
* Parms
|
||
* A8 ptr to BASE OBJ
|
||
* A0 ptr to obj which is to have its position set so that its anim pt
|
||
* is at the same coors as the BASE OBJ
|
||
MATCHANIP:
|
||
PUSH A1
|
||
move *A8(OANIOFF),A1,L
|
||
move *A0(OANIOFF),A14,L
|
||
subxy A14,A1
|
||
move *A8(OYPOS),A14,W
|
||
rl 16,A1
|
||
addxy A1,A14
|
||
move A14,*A0(OYPOS),W
|
||
rl 16,A1
|
||
|
||
move *A8(OXPOS),A14,W
|
||
addxy A1,A14
|
||
move A14,*A0(OXPOS),W
|
||
|
||
;UPDATE FRACTIONAL PORTIONS TOO!
|
||
move *A8(OXVAL),*A0(OXVAL),W
|
||
move *A8(OYVAL),*A0(OYVAL),W
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIP
|
||
* A0 PTR TO OBJ
|
||
* RETURNS A1 = Y:X ANI POINT
|
||
GETANIP:
|
||
MOVE *A0(ODAG),A1,L
|
||
move *A0(OANIOFF),A14,L
|
||
addxy A14,A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GET_ANIP
|
||
* A8 PTR TO OBJ
|
||
* RETURNS A1 = Y:X ANI POINT
|
||
GET_ANIP:
|
||
MOVE *A8(ODAG),A1,L
|
||
move *A8(OANIOFF),A14,L
|
||
addxy A14,A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_ANIP_SCRNREL - ROUTINE TO GET THE SCREEN RELATIVE ANIMATION POINT *
|
||
* OF AN OBJECT. *
|
||
* A8 PTR TO OBJ *
|
||
* RETURNS A1 = Y:X SCREEN RELATIVE ANI POINT *
|
||
* *
|
||
**************************************************************************
|
||
GET_ANIP_SCRNREL:
|
||
PUSH A2
|
||
CALLR GET_SCRNREL
|
||
SRL 16,A1
|
||
MOVY A2,A1
|
||
MOVE *A8(OANIOFF),A14,L
|
||
ADDXY A14,A1
|
||
PULLQ A2
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETANIP_SCRNREL - ROUTINE TO GET THE SCREEN RELATIVE ANIMATION POINT *
|
||
* OF AN OBJECT (A0 VERSION) *
|
||
* A0 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* A1 = Y:X SCREEN RELATIVE ANI POINT *
|
||
* *
|
||
**************************************************************************
|
||
GETANIP_SCRNREL
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR GET_ANIP_SCRNREL
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ADD_OFF2ANIP - ROUTINE TO ADD A GIVEN OFFSET TO THE ANIMATION PNT *
|
||
* OF AN OBJECT, AND RETURN THAT POINT. FLIPS ARE *
|
||
* ACCOUNTED FOR. *
|
||
* A4 = [Y,X] OFFSET POINT *
|
||
* A8 = PTR TO OBJECT WE ARE OFFSETING FROM *
|
||
* RETURNS *
|
||
* A3 = [Y,X] POINT *
|
||
* *
|
||
**************************************************************************
|
||
ADD_OFF2ANIP
|
||
MMTM SP,A1,A4
|
||
MOVE *A8(OCTRL),A1,W ;ADJUST LAUNCH OFFSET IF NECESSARY
|
||
BTST B_FLIPH,A1
|
||
JREQ AO_CKV
|
||
NEGX A4
|
||
AO_CKV
|
||
BTST B_FLIPV,A1
|
||
JREQ AO_OFF
|
||
NEGY A4
|
||
AO_OFF
|
||
CALLA GET_ANIP
|
||
MOVE A1,A3
|
||
ADDXY A4,A3
|
||
MMFM SP,A1,A4
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* GETOFFP
|
||
* Get object's position using offset point.
|
||
* Uses OPARTSXY if M_OPARTSXY of OFLAGS2 set.
|
||
* Else uses OANIOFF (GETANIP).
|
||
* A0 OBJ
|
||
* RETURNS A1 = Y:X OBJECT OFFSET POINT
|
||
GETOFFP:
|
||
movb *A0(OFLAGS+B_OPARTSXY-7),A14
|
||
jrnn GETANIP
|
||
|
||
;USE OPARTSXY
|
||
move *A0(OYPOS),A1,W
|
||
sll 16,A1
|
||
move *A0(OXPOS),A14,W
|
||
movx A14,A1
|
||
move *A0(OPARTSXY),A14,L
|
||
addxy A14,A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* SET_OPARTSXY
|
||
* A8 obj
|
||
* A1 OPARTSXY OFFSET
|
||
* ADJUSTS OFFSET FOR CURRENT FLIP
|
||
SET_OPARTSXY
|
||
PUSH A0
|
||
move A8,A0
|
||
callr SETOPARTSXY
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETOPARTSXY *
|
||
* *
|
||
* Set the OPARTSXY field of an object to the given values. *
|
||
* Adjusts for current flip. *
|
||
* *
|
||
* A0 = Ptr to object *
|
||
* A1 = New OPARTSXY *
|
||
* *
|
||
* Returns: *
|
||
* A1 = *A0(OPARTSXY),L = New OPARTSXY, flip adjusted *
|
||
* *
|
||
**************************************************************************
|
||
SETOPARTSXY:
|
||
movb *A0(OCTRL+B_FLIPH-7),A14
|
||
jrnn SkHFlpOf
|
||
NEGX A1
|
||
SkHFlpOf
|
||
movb *A0(OCTRL+B_FLIPV-7),A14
|
||
jrnn SkVFlpOf
|
||
NEGY A1
|
||
SkVFlpOf
|
||
move A1,*A0(OPARTSXY),L
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GET_OFFP
|
||
* Get object's position using offset point.
|
||
* Uses OPARTSXY if M_OPARTSXY of OFLAGS2 set.
|
||
* Else uses OANIOFF (GETANIP).
|
||
* A8 OBJ
|
||
* RETURNS A1 = Y:X OBJECT OFFSET POINT
|
||
GET_OFFP:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr GETOFFP
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* SETANIP
|
||
* SET OBJ POSITION SO ANIPT IS ON A POINT.
|
||
*
|
||
* A1 = Y:X POINT
|
||
* A0 = PTR TO OBJECT
|
||
SETANIP:
|
||
PUSH A1
|
||
move *A0(OANIOFF),A14,L
|
||
subxy A14,A1
|
||
move A1,*A0(OXPOS),W
|
||
srl 16,A1
|
||
move A1,*A0(OYPOS),W
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIXP - SET OBJ POSITION SO ANIPT IS ON AN X POINT. *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER. *
|
||
* A1 = X POINT *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* A1 = [Y,X] WORLD ANIMATION POINT *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIXP:
|
||
PUSH A0
|
||
callr GETANIY ;A0 ANI OYPOS
|
||
sll 16,A0
|
||
movy A0,A1
|
||
jruc SET_ANIPe
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIYP - SET OBJ POSITION SO ANIPT IS ON A Y POINT. *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER. *
|
||
* A1 = Y POINT *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* A1 = [Y,X] WORLD ANIMATION POINT *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIYP:
|
||
PUSH A0
|
||
CALLR GETANIX ;A0 ANI OXPOS
|
||
SLL 16,A1
|
||
MOVX A0,A1
|
||
JRUC SET_ANIPe
|
||
|
||
**************************************************************************
|
||
* SET_ANIP
|
||
* SET OBJ POSITION SO ANIPT IS ON A POINT.
|
||
* WILL ADJUST ENTIRE MULTI-PARTER.
|
||
*
|
||
* A1 = Y:X POINT
|
||
* A8 = PTR TO OBJECT
|
||
SET_ANIP:
|
||
PUSH A0
|
||
SET_ANIPe
|
||
move A8,A0
|
||
callr SETANIP
|
||
callr SETOBJS
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* MATCHOFFP
|
||
* Parms
|
||
* A8 ptr to BASE OBJ
|
||
* A0 ptr to obj which is to have its position set so that its anim pt
|
||
* is at the same coors as the BASE OBJ
|
||
MATCHOFFP:
|
||
PUSH A1
|
||
callr GET_OFFP
|
||
callr SETOFFP
|
||
|
||
;UPDATE FRACTIONAL PORTIONS TOO!
|
||
move *A8(OXVAL),*A0(OXVAL),W
|
||
move *A8(OYVAL),*A0(OYVAL),W
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* SETOFFP
|
||
* Set object's position using offset point.
|
||
* Uses OPARTSXY if M_OPARTSXY of OFLAGS2 set.
|
||
* Else uses OANIOFF (SETANIP).
|
||
* A0 OBJ
|
||
* A1 = Y:X OBJECT OFFSET POINT
|
||
* RETURNS nothing
|
||
SETOFFP:
|
||
movb *A0(OFLAGS+B_OPARTSXY-7),A14
|
||
jrnn SETANIP
|
||
|
||
PUSH A1
|
||
;USE OPARTSXY
|
||
move *A0(OPARTSXY),A14,L
|
||
subxy A14,A1
|
||
move A1,*A0(OXPOS),W
|
||
srl 16,A1
|
||
move A1,*A0(OYPOS),W
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* SET_OFFP
|
||
* Set object's position using offset point.
|
||
* Uses OPARTSXY if M_OPARTSXY of OFLAGS2 set.
|
||
* Else uses OANIOFF (SETANIP).
|
||
* A8 OBJ
|
||
* A1 = Y:X OBJECT OFFSET POINT
|
||
* RETURNS nothing
|
||
SET_OFFP:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr SETOFFP
|
||
callr SETOBJS
|
||
PULLQ A0
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
SET_OBJS:
|
||
;UPDATE POS AMONG PARTS OF A MULTI-PART OBJ
|
||
;A8 ptr to an obj
|
||
mmtm SP,A0,A1,A8
|
||
jruc SetObjE
|
||
SETOBJS:
|
||
;UPDATE POS AMONG PARTS OF A MULTI-PART OBJ
|
||
;A0 ptr to an obj
|
||
mmtm SP,A0,A1,A8
|
||
move A0,A8
|
||
|
||
SetObjE
|
||
callr GET_OFFP ;A1 OBJ OFFSET OF A8
|
||
move *A8(OPART1),A0,L
|
||
jruc Part1
|
||
|
||
PartsLp:
|
||
move *A0(OPARTS),A0,L
|
||
Part1:
|
||
jrz PartsX
|
||
cmp A0,A8
|
||
jreq PartsLp
|
||
|
||
;* UPDATE THE POSITIONS
|
||
callr SETOFFP
|
||
;UPDATE FRACTIONAL PORTIONS TOO!
|
||
move *A8(OXVAL),*A0(OXVAL),W
|
||
move *A8(OYVAL),*A0(OYVAL),W
|
||
jruc PartsLp
|
||
|
||
PartsX:
|
||
mmfm SP,A0,A1,A8
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
**************************************************************************
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIPXU *
|
||
* SET OBJ POSITION'S X ANIMATION POINT IN THE UNIVERSE *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER * *
|
||
* *
|
||
* PASS: *
|
||
* A1 = UNIVERSE X *
|
||
* A8 = OBJECT (HEAD OR PART) *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIPXU
|
||
MMTM SP,A2,A3
|
||
MOVE *A8(OYVAL),A2,L
|
||
MOVE *A8(OZVAL),A3,L
|
||
CALLR SET_ANIPU
|
||
MMFM SP,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIPYU *
|
||
* SET OBJ POSITION'S Y ANIMATION POINT IN THE UNIVERSE *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER * *
|
||
* *
|
||
* PASS: *
|
||
* A1 = UNIVERSE Y *
|
||
* A8 = OBJECT (HEAD OR PART) *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIPYU
|
||
MMTM SP,A1,A2,A3
|
||
MOVE A1,A2
|
||
MOVE *A8(OXVAL),A1,L
|
||
MOVE *A8(OZVAL),A3,L
|
||
CALLR SET_ANIPU
|
||
MMFM SP,A1,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIPZU *
|
||
* SET OBJ POSITION'S Z ANIMATION POINT IN THE UNIVERSE *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER * *
|
||
* *
|
||
* PASS: *
|
||
* A1 = UNIVERSE Z *
|
||
* A8 = OBJECT (HEAD OR PART) *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIPZU
|
||
MMTM SP,A1,A2,A3
|
||
MOVE A1,A3
|
||
MOVE *A8(OXVAL),A1,L
|
||
MOVE *A8(OYVAL),A2,L
|
||
CALLR SET_ANIPU
|
||
MMFM SP,A1,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SET_ANIPU *
|
||
* SET OBJ POSITION'S ANIMATION POINT IN THE UNIVERSE *
|
||
* WILL ADJUST ENTIRE MULTI-PARTER * *
|
||
* *
|
||
* PASS: *
|
||
* A1 = UNIVERSE X *
|
||
* A2 = UNIVERSE Y *
|
||
* A3 = UNIVERSE Z *
|
||
* A8 = OBJECT (HEAD OR PART) *
|
||
* *
|
||
**************************************************************************
|
||
SET_ANIPU
|
||
PUSH A0
|
||
MOVE A8,A0
|
||
callr SETOFFPU
|
||
move *A8(OPART1),A0,L
|
||
JRUC Part1U
|
||
|
||
**************************************************************************
|
||
SET_OBJSU
|
||
;UPDATE POS AMONG PARTS OF A MULTI-PART OBJ
|
||
;A8 ptr to an obj
|
||
PUSH A0
|
||
callr GET_OFFPU ;A1 OBJ OFFSET OF A8
|
||
move *A8(OPART1),A0,L
|
||
jruc Part1U
|
||
PartsLpU
|
||
move *A0(OPARTS),A0,L
|
||
Part1U
|
||
jrz PartsXU
|
||
cmp A0,A8
|
||
jreq PartsLpU
|
||
;* UPDATE THE POSITIONS
|
||
callr SETOFFPU
|
||
jruc PartsLpU
|
||
PartsXU
|
||
PULLQ A0
|
||
rets
|
||
SETOBJSU
|
||
;UPDATE POS AMONG PARTS OF A MULTI-PART OBJ
|
||
;A0 ptr to an obj
|
||
MMTM SP,A1,A2,A3,A8
|
||
move A0,A8
|
||
CALLR SET_OBJSU
|
||
MMFM SP,A1,A2,A3,A8
|
||
RETS
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETOFFPU *
|
||
* Set object's position in the UNIVERSE using offset point. *
|
||
* Uses OPARTSXY if M_OPARTSXY of OFLAGS set. *
|
||
* *
|
||
* PASS: *
|
||
* A0 = OBJECT *
|
||
* A1 = UNIVERSE X *
|
||
* A2 = UNIVERSE Y *
|
||
* A3 = UNIVERSE Z *
|
||
* *
|
||
**************************************************************************
|
||
SETOFFPU
|
||
move *A0(OPARTSXY),A14,L
|
||
JRZ SETOFFPU_NOPARTSXY ;BR=NO OPARTSXY
|
||
;USE OPARTSXY
|
||
PUSH A4
|
||
MOVE A14,A4
|
||
|
||
SEXT A14,W
|
||
SLL 15,A14
|
||
ADD A1,A14
|
||
move A14,*A0(OXVAL),L
|
||
|
||
MOVE *A0(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;Is this a shadow object?
|
||
JRNZ SOFFP_SKIPY ;BR = Yes, don't fuck with Y
|
||
|
||
SRA 16,A4
|
||
SLL 15,A4
|
||
ADD A2,A4
|
||
move A4,*A0(OYVAL),L
|
||
SOFFP_SKIPY
|
||
|
||
MOVB *A0(OZOFF),A14
|
||
ADD A3,A14
|
||
move A14,*A0(OZVAL),L
|
||
|
||
PULLQ A4
|
||
rets
|
||
SETOFFPU_NOPARTSXY
|
||
move A1,*A0(OXVAL),L
|
||
MOVE *A0(OFLAGS),A14,W
|
||
BTST B_SHAD,A14 ;Is this a shadow object?
|
||
JRNZ SOFFPNP_SKIPY ;BR = Yes, don't fuck with Y
|
||
move A2,*A0(OYVAL),L
|
||
SOFFPNP_SKIPY
|
||
MOVB *A0(OZOFF),A14
|
||
ADD A3,A14
|
||
move A14,*A0(OZVAL),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETANIPU *
|
||
* SET OBJ POSITION'S ANIMATION POINT IN THE UNIVERSE *
|
||
* *
|
||
* PASS: *
|
||
* A0 = OBJECT *
|
||
* A1 = UNIVERSE X *
|
||
* A2 = UNIVERSE Y *
|
||
* A3 = UNIVERSE Z *
|
||
* *
|
||
**************************************************************************
|
||
SETANIPU
|
||
move A1,*A0(OXVAL),L
|
||
move A2,*A0(OYVAL),L
|
||
move A3,*A0(OZVAL),L
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GET_ANIPU
|
||
* GET_OFFPU
|
||
* Get object's UNIVERSE position (USES OPARTSXY IF SET IN OFLAGS)
|
||
* A8 OBJ
|
||
* RETURNS
|
||
* A1 = UNIVERSE X *
|
||
* A2 = UNIVERSE Y *
|
||
* A3 = UNIVERSE Z *
|
||
GET_ANIPU:
|
||
GET_OFFPU:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr GETOFFPU
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETANIPU
|
||
* GETOFFPU
|
||
* Get object's UNIVERSE position (USES OPARTSXY IF SET IN OFLAGS)
|
||
* A0 OBJ
|
||
* RETURNS
|
||
* A1 = UNIVERSE X *
|
||
* A2 = UNIVERSE Y *
|
||
* A3 = UNIVERSE Z *
|
||
GETANIPU:
|
||
GETOFFPU:
|
||
move *A0(OXVAL),A1,L
|
||
move *A0(OYVAL),A2,L
|
||
move *A0(OZVAL),A3,L
|
||
MOVB *A0(OZOFF),A14
|
||
SUB A14,A3
|
||
|
||
; movb *A0(OFLAGS+B_OPARTSXY-7),A14
|
||
; jrnn GET_U_DONE
|
||
|
||
move *A0(OPARTSXY),A14,L
|
||
JRZ GET_U_DONE ;BR=NO OPARTSXY
|
||
|
||
PUSH A4
|
||
MOVE A14,A4
|
||
SEXT A14,W
|
||
SLL 15,A14
|
||
SUB A14,A1
|
||
|
||
SRA 16,A4
|
||
SLL 15,A4
|
||
SUB A4,A2
|
||
PULLQ A4
|
||
|
||
GET_U_DONE
|
||
rets
|
||
|
||
**************************************************************************
|
||
**************************************************************************
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
* INITPART
|
||
* Makes obj a multi-parter w/ self
|
||
* A8 = OBJ to be made the head object of a multi-parter
|
||
INITPART
|
||
clr A14
|
||
move A14,*A8(OPARTS),L
|
||
move A8,*A8(OPART1),L
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CNTMPART - COUNT THE NUMBER OF PARTS CONTAINED IN THIS *
|
||
* MULTI-PARTER. RETURNS 0 IF NOT A MULTI-PARTER. *
|
||
* A0 = PTR TO ANY PART *
|
||
* RETURNS *
|
||
* Z = NOT A MULTI-PARTER *
|
||
* A1 = 0 *
|
||
* NZ = MULTI-PARTER *
|
||
* A1 = NUMBER OF PARTS *
|
||
* *
|
||
**************************************************************************
|
||
CNTMPART:
|
||
PUSH A0
|
||
clr A1
|
||
move *A0(OPART1),A0,L
|
||
jrz CntPartsX
|
||
CntParts:
|
||
inc A1
|
||
move *A0(OPARTS),A0,L
|
||
jrnz CntParts
|
||
CntPartsX
|
||
MOVE A1,A1
|
||
PULL A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* INSPART
|
||
* A0 ptr to an obj (or multi-parter) to be added to a multi-parter
|
||
* A8 obj to be head or obj in a multiparter, which contains head obj
|
||
INSPART:
|
||
mmtm SP,A0,A1,A2,A3,A8
|
||
move *A8(OPART1),A1,L
|
||
jrnz SkMkHd
|
||
callr INITPART
|
||
jruc IGotHd
|
||
SkMkHd
|
||
move A1,A8
|
||
IGotHd
|
||
.IF DEBUG
|
||
callr CkMPART
|
||
.ENDIF
|
||
|
||
move *A8(OPART1),A1,L
|
||
move *A0(OPART1),A2,L
|
||
jrnz InsParts
|
||
move A0,A2
|
||
|
||
InsParts
|
||
;*** ADD A LIST OF OBJS TO ANOTHER LIST ***
|
||
move A2,A3
|
||
InsPLp
|
||
move A2,A0
|
||
move A1,*A0(OPART1),L
|
||
move *A0(OPARTS),A2,L
|
||
jrnz InsPLp
|
||
*THIS MAKES ANY NEWLY INSERTED PARTS GO TO THE END OF THE MULTI-PARTER
|
||
INS_TO_END_LP
|
||
MOVE A1,A2 ;KEEP PREVIOUS PART
|
||
MOVE *A1(OPARTS),A1,L ;ANY MORE PARTS?
|
||
JRNZ INS_TO_END_LP ;BR = YES
|
||
**** move *A1(OPARTS),*A0(OPARTS),L
|
||
**** move A3,*A1(OPARTS),L
|
||
MOVE A3,*A2(OPARTS),L ;WE KNOW WE'RE AT THE END
|
||
|
||
.IF DEBUG
|
||
callr CkMPART
|
||
.ENDIF
|
||
|
||
mmfm SP,A0,A1,A2,A3,A8
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* CkMPART1
|
||
* Checks if obj is part of invalid multi-parter
|
||
* checks that obj is valid head obj
|
||
*
|
||
* A8 = OBJ to be checked
|
||
CkMPART1
|
||
mmtm SP,A6,A7,A8
|
||
move *A8(OPART1),A7,L
|
||
jrz CkMPARTX
|
||
cmp A8,A7
|
||
LOCKON NZ
|
||
jruc CkMPARTE
|
||
**************************************************************************
|
||
* CkMPART
|
||
* Checks if obj is part of invalid multi-parter
|
||
*
|
||
* A0 = OBJ to be checked
|
||
CkMPART:
|
||
mmtm SP,A6,A7,A8
|
||
move *A0(OPART1),A7,L
|
||
jrz CkMPARTX ;NOT IN MULTI-PARTER -> OK
|
||
CkMPARTE:
|
||
move A7,A8
|
||
CkMPLp
|
||
move *A8(OPART1),A6,L
|
||
cmp A6,A7
|
||
LOCKON NE
|
||
move *A8(OPARTS),A8,L
|
||
jrnz CkMPLp
|
||
CkMPARTX
|
||
mmfm SP,A6,A7,A8
|
||
rets
|
||
|
||
**************************************************************************
|
||
* PULL_PART
|
||
* REMOVE OBJ FROM A MULTI PARTER
|
||
* A8 = piece of a multi-part obj
|
||
* PULLPART
|
||
* A0 = piece of a multi-part obj
|
||
PULL_PART:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr PULLPART
|
||
PULLQ A0
|
||
rets
|
||
PULLPART:
|
||
;A0 ptr to a piece of a multi-part obj
|
||
PUSH A2
|
||
move *A0(OPART1),A14,L
|
||
LOCKON Z
|
||
cmp A14,A0 ;CAN'T USE TO PULL HEAD
|
||
LOCKON EQ
|
||
callr CkMPART
|
||
|
||
FindPrev
|
||
move A14,A2
|
||
move *A2(OPARTS),A14,L
|
||
LOCKON Z
|
||
jrz PullPrtX
|
||
cmp A14,A0
|
||
jrne FindPrev
|
||
|
||
;*** GOT THE PTR TO THE PREVIOUS OBJ IN A2
|
||
move *A0(OPARTS),*A2(OPARTS),L ;link around A0
|
||
|
||
move *A0(OPART1),A14,L
|
||
move *A14(OXVEL),*A0(OXVEL),L
|
||
move *A14(OYVEL),*A0(OYVEL),L
|
||
move *A14(OZVEL),*A0(OZVEL),L
|
||
clr A14
|
||
move A14,*A0(OPART1),L
|
||
move A14,*A0(OPARTS),L
|
||
|
||
PullPrtX
|
||
PULLQ A2
|
||
rets
|
||
|
||
**************************************************************************
|
||
* PULL_PART1
|
||
* PULLS HEAD OBJ FROM MULTI-PARTER, MAKES NEXT OBJ NEW HEAD
|
||
* A8 = Head obj of a multi-part obj
|
||
* RETS A0 new Head Obj
|
||
PULL_PART1:
|
||
PUSH A2
|
||
.IF DEBUG
|
||
callr CkMPART1
|
||
.ENDIF
|
||
move A8,A0
|
||
|
||
move *A0(OPARTS),A14,L
|
||
jrz NoPull1
|
||
move A14,A2
|
||
HdLnks
|
||
move A14,*A2(OPART1),L
|
||
move *A2(OPARTS),A2,L
|
||
jrnz HdLnks
|
||
|
||
NoPull1
|
||
clr A2
|
||
move A2,*A0(OPART1),L
|
||
move A2,*A0(OPARTS),L
|
||
|
||
move A14,A0
|
||
PULL A2
|
||
rets
|
||
|
||
****************************************************************************
|
||
* FINDPART
|
||
* A1 # of part to be found
|
||
* A8 ptr to obj in multiparter
|
||
* RETS A0 if part found, Z set if not
|
||
FINDPART:
|
||
andi 0FFh,A1
|
||
move *A8(OPART1),A0,L
|
||
FindMPLp
|
||
movb *A0(OPARTID),A14
|
||
andi 0FFh,A14
|
||
cmp A14,A1
|
||
jreq FoundMP
|
||
move *A0(OPARTS),A0,L
|
||
jrnz FindMPLp
|
||
FoundMP
|
||
move A0,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* EXIST_PART *
|
||
* *
|
||
* Search for an object of certain OID contained in a *
|
||
* multi-parter. *
|
||
* *
|
||
* A1 = OID *
|
||
* A8 = Ptr to any part of multi-parter *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Z = No object found, A0 = 0 *
|
||
* NZ = Matching object found, A0 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
EXIST_PART
|
||
MOVE *A8(OPART1),A0,L
|
||
SEXT A1
|
||
EP_LP
|
||
MOVE *A0(OID),A14,W
|
||
CMP A1,A14
|
||
JREQ EP_X ;BR = Found one
|
||
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ EP_LP ;BR = Got another part to check
|
||
EP_X
|
||
MOVE A0,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_HEAD_PART - ROUTINE TO GET THE PTR TO THE HEAD OBJECT OF A *
|
||
* MULTI-PARTER, IF THE OBJECT IS SOLO THEN NOTHING *
|
||
* CHANGES. *
|
||
* A8 = PTR TO PART *
|
||
* RETURNS *
|
||
* Z = NOT A MULTI-PARTER *
|
||
* A8 = SAME *
|
||
* NZ = MULTI-PARTER *
|
||
* A8 = PTR TO HEAD OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
GET_HEAD_PART
|
||
MOVE *A8(OPART1),A14,L ;GET HEAD PART
|
||
JRZ GHP_X ;BR = SOLO OBJECT
|
||
MOVE A14,A8 ;RETURN PART
|
||
GHP_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETHEADPART - A0 Version of GET_HEAD_PART *
|
||
* A0 = Ptr to part *
|
||
* Returns: *
|
||
* Z = Not a Multi-Parter *
|
||
* A0 = Same *
|
||
* NZ = Object is part of a Multi-Parter *
|
||
* A0 = Ptr to HEAD object *
|
||
* *
|
||
**************************************************************************
|
||
GETHEADPART
|
||
MOVE *A0(OPART1),A14,L ;GET HEAD PART
|
||
JRZ GHPA0_X ;BR = SOLO OBJECT
|
||
MOVE A14,A0 ;RETURN PART
|
||
GHPA0_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_HEAD_PART_A0 - ROUTINE TO GET THE PTR TO THE HEAD OBJECT OF A *
|
||
* MULTI-PARTER, IF THE OBJECT IS SOLO THEN NOTHING *
|
||
* CHANGES. *
|
||
* A8 = PTR TO PART *
|
||
* RETURNS *
|
||
* A0 = PTR TO HEAD OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
GET_HEAD_PART_A0
|
||
MOVE *A8(OPART1),A14,L ;GET HEAD PART
|
||
JRZ GHPA_NOMULTI ;BR = SOLO OBJECT
|
||
MOVE A14,A0 ;RETURN PART
|
||
RETS
|
||
GHPA_NOMULTI
|
||
MOVE A8,A0 ;RETURN "HEAD" PART REGARDLESS
|
||
SETZ ;FLAG IT.
|
||
RETS
|
||
|
||
|
||
|
||
.align ;This replaces the old CACHE4 section
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GANIOF - RETURN ANIMATION PNT. OF GIVEN IMAGE *
|
||
* A2 = [HEIGHT,WIDTH] *
|
||
* A5 = OFLAGS *
|
||
* GARBOF - SAME AS GANIOF EXCEPT YOU PROVIDE *
|
||
* A6 = OFFSET *
|
||
* RETURNS *
|
||
* A6 = X ANIMATION OFFSET (32 BIT) *
|
||
* A7 = Y ANIMATION OFFSET (32 BIT) *
|
||
* *
|
||
**************************************************************************
|
||
GANIOF:
|
||
MMTM SP,A2,A3
|
||
MOVE *A1(IANIOFF),A6,L
|
||
jruc GotOf
|
||
GARBOF:
|
||
;A6 has offset from TL
|
||
MMTM SP,A2,A3
|
||
GotOf CLR A7 ;MAKE SURE A7 IS 0
|
||
MOVY A6,A7
|
||
SLL 16,A6 ;MOVE TO UPPER WORD
|
||
SUBI 00010001h,A2 ;ADJUST FOR -1
|
||
CLR A3
|
||
MOVY A2,A3
|
||
SLL 16,A2 ;MOVE TO UPPER WORD
|
||
BTST B_FLIPH,A5
|
||
JRZ GANI1
|
||
NEG A6
|
||
ADD A2,A6 ;SUB THS-1 FOR H-FLIP
|
||
GANI1:
|
||
BTST B_FLIPV,A5
|
||
JRZ GANI2
|
||
NEG A7
|
||
ADD A3,A7 ;SUB TVS-1 FOR V-FLIP
|
||
GANI2:
|
||
MMFM SP,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* SetArbP
|
||
* A8 ptr to BASE OBJ
|
||
* A7 BASE OBJ TL offset
|
||
* A0 ptr to obj which is to have its position set so that its offset pt
|
||
* is at the same coors as the BASE OBJ offset pt
|
||
* A1 SUBORDINATE OBJ TL offset
|
||
SetArbP:
|
||
mmtm SP,A2,A3,A4,A5,A6,A7
|
||
;* get POSITION from first obj..
|
||
move *A8(OSIZE),A2,L
|
||
move *A8(OCTRL),A4,W
|
||
*GARBOF: A6=ANIOFF, A2=H:W, A4=OCTRL -> A6=X ANIOFF<<16, A7=Y ANIOFF<<16
|
||
move A7,A6
|
||
callr GARBOF
|
||
move A6,A3
|
||
move A7,A5
|
||
|
||
move *A0(OSIZE),A2,L
|
||
move *A8(OCTRL),A4,W
|
||
*GARBOF: A6=ANIOFF, A2=H:W, A4=OCTRL -> A6=X ANIOFF<<16, A7=Y ANIOFF<<16
|
||
move A1,A6
|
||
callr GARBOF
|
||
sub A7,A5
|
||
sub A6,A3
|
||
|
||
move *A8(OYVAL),A7,L
|
||
add A7,A5
|
||
move A5,*A0(OYVAL),L
|
||
move *A8(OXVAL),A6,L
|
||
add A6,A3
|
||
move A3,*A0(OXVAL),L
|
||
mmfm SP,A2,A3,A4,A5,A6,A7
|
||
rets
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* STRT_ANIM
|
||
* A1 SCRIPT PTR
|
||
* A8 OBJ TO BE STARTED ON ANIM
|
||
STRT_ANIM:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr STRTANIM
|
||
PULLQ A0
|
||
rets
|
||
* STRTANIM
|
||
* A1 SCRIPT PTR
|
||
* A0 OBJ TO BE STARTED ON ANIM
|
||
|
||
|
||
|
||
STRTANIM:
|
||
; PUSH A1
|
||
move A1,*A0(AnimFrm),L
|
||
move A1,*A0(AnimScr),L
|
||
clr A14
|
||
movb A14,*A0(AnimSlp)
|
||
callr CKINSANI
|
||
; PULLQ A1
|
||
rets
|
||
|
||
*
|
||
* Same as STRTANIM, but starts in middle of sequence
|
||
* A1 START FRAME
|
||
* A14 SCRIPT PTR
|
||
* A0 OBJ TO BE STARTED ON ANIM
|
||
*
|
||
STRTANIM_OFF:
|
||
PUSH A1
|
||
move A14,*A0(AnimScr),L
|
||
move A1,*A0(AnimFrm),L
|
||
clr A1
|
||
movb A1,*A0(AnimSlp)
|
||
callr CKINSANI
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* STFANIM
|
||
* A1 = Ptr to ANIM Structure (see below)
|
||
* A0 = Ptr to Object to be inserted
|
||
* STRUCT .long FRAME (ptr), SCRIPT (reset)
|
||
* .byte AnimSLP (reset), AnimSlp (ctr)
|
||
* .word RESERVED (set to 0)
|
||
*
|
||
STFANIM:
|
||
mmtm SP,A1,A2
|
||
move A0,A2
|
||
addi AnimFrm,A2
|
||
move *A1+,*A2+,L
|
||
move *A1+,*A2+,L
|
||
move *A1+,*A2+,L
|
||
callr CKINSANI
|
||
mmfm SP,A1,A2
|
||
rets
|
||
|
||
****************************************************************************
|
||
* INSANIM - errors if already on
|
||
* CKINSANI - only inserts if not already on
|
||
* A0 = OBJ to be Animated/Flown by ANIMP
|
||
* ***NOTE***
|
||
* the following obj fields must be appropriately initialized before insertion.
|
||
* AnimScr -ptr to longnull terminated animation script w/ format of
|
||
* .long frame ;if Bit 0 of frame ptr = '1' don't animate..
|
||
* .word (FlipFlag.1:unusedFlag.1:FuncFlag.1:MultiFlag.1:0.4 : SleepTime.8)
|
||
* [.word FlipBits] if FlipFlag set
|
||
* [.long Function|# of ARG words (0-15)] if FuncFlag set
|
||
* !!!!! WARNING WARNING WARNING WARNING WARNING WARNING !!!!!
|
||
* !!!!! !!!!!
|
||
* !!!!! The low four bits of the animation function !!!!!
|
||
* !!!!! Address are used to indicate the number of !!!!!
|
||
* !!!!! WORD arguments used by this function. !!!!!
|
||
* !!!!! ALWAYS use GETAFARG_xxxx to grab arguments. !!!!!
|
||
* !!!!! !!!!!
|
||
* !!!!! WARNING WARNING WARNING WARNING WARNING WARNING !!!!!
|
||
* if MultiFlag Set, loop on OPARTS & process another script entry
|
||
* this causes stuffing of sleep time to be skipped, thus sleep value of
|
||
* last entry of multiscript will be used.
|
||
* If the NOPARTANI Bit of OFLAGS is set for a subpart, that
|
||
* part will not be processed during the Multi-Script.
|
||
* Function can clobber all but A12,A13
|
||
* !!!!! WARNING WARNING WARNING WARNING WARNING WARNING !!!!!
|
||
* A12 must stay untouched throughout anim func because a call
|
||
* to DELOBJ or PULLANIM will scan to pull QUEUED(A12) Anim func.
|
||
* !!!!! WARNING WARNING WARNING WARNING WARNING WARNING !!!!!
|
||
* AnimFrm -ptr to current entry in animation script
|
||
* AnimSlp -byte, # tiks before next ani
|
||
* AnimSLP -byte, overlayed on AnimScr, resets AnimSlp when SleepTime=0
|
||
* AnimGrv -word, amount to add to Yvel each tik
|
||
*
|
||
* AnimArg -set by AnimP, used by GETAFARG_xxxx
|
||
|
||
CKINSANI:
|
||
;*** ONLY INSERT OBJ IF IT ISN'T ALREADY ON ***
|
||
movb *A0(OFLAGS+B_ANIM-7),A14
|
||
jrn SkInsAni
|
||
INSANIM:
|
||
.IF DEBUG
|
||
callr IsAnObj
|
||
callr CkAnim
|
||
callr OnAnim
|
||
.ENDIF
|
||
|
||
; PUSH A1
|
||
|
||
;**** MARK OBJ AS BEING ON ANIM LIST ****
|
||
PUSHST
|
||
DINT
|
||
|
||
move *A0(OFLAGS),A14,W
|
||
btst B_ANIM,A14
|
||
LOCKON NZ
|
||
ori M_ANIM,A14
|
||
move A14,*A0(OFLAGS),W
|
||
|
||
;LINK OBJ INTO HEAD OF ANIOBJS LIST
|
||
move @ANIOBJS,A14,L
|
||
move A14,*A0(AnimNxt),L
|
||
move A0,@ANIOBJS,L
|
||
POPST
|
||
**** EINT
|
||
|
||
; PULLQ A1
|
||
.IF DEBUG
|
||
; callr CkAnim
|
||
.ENDIF
|
||
SkInsAni
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLEAR_ANIMS *
|
||
* *
|
||
* Clear ANIM list of all animating objects. *
|
||
* *
|
||
**************************************************************************
|
||
CLEAR_ANIMS
|
||
MMTM SP,A0,A8
|
||
MOVE @ANIOBJS,A8,L
|
||
JRZ CA_X ;BR = Nothing animating
|
||
|
||
CA_LOOP
|
||
MOVE A8,A0
|
||
MOVE *A8(AnimNxt),A8,L ;Grab next right now
|
||
CALLR PULLANIM ;Pull this one off of the list
|
||
MOVE A8,A8
|
||
JRNZ CA_LOOP ;BR = There's more to do
|
||
CA_X
|
||
MMFM SP,A0,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* PULL_ANIM
|
||
* A8 = OBJ to be pulled from ANIOBJS
|
||
* NOTE, CURRENTLY DOESN'T PULL ALL OF MULTI-PARTER IF HEAD
|
||
PULL_ANIM:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr PULLANIM
|
||
PULLQ A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PULL_ANIM_ALL - PULL OBJECT FROM ANIOBJS ALONG WITH ALL OF ITS *
|
||
* PARTS. *
|
||
* A8 = PTR TO HEAD OBJECT OF MULTI-PARTER *
|
||
* *
|
||
**************************************************************************
|
||
PULL_ANIM_ALL
|
||
PUSH A1
|
||
CLR A1
|
||
CALLR PULL_ANIM_MULTI
|
||
PULLQ A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PULL_ANIM_MULTI - PULL GIVEN NUMBER OF OBJECTS OF A MULTI-PARTER *
|
||
* STARTING WITH THE GIVEN OBJECT. *
|
||
* THE NOPARTANI FLAG OF EACH OBJECT WILL *
|
||
* BE CLEARED AT THIS POINT. *
|
||
* A1 = # OF OBJECTS TO PULL (IF A1 IS 0 PULL ALL FROM THIS POINT) *
|
||
* A8 = PTR TO PART OF MULTI-PARTER *
|
||
* RETURNS *
|
||
* A1 = DECREMENTED TO REFLECT NUMBER OF PARTS PULLED *
|
||
* *
|
||
**************************************************************************
|
||
PULL_ANIM_MULTI
|
||
PUSH A0
|
||
MOVE A8,A0 ;PULL THE FIRST OBJECT
|
||
PAM_LP
|
||
MOVB *A0(OFLAGS+B_DEAD-7),A14 ;IS THIS OBJECT DEAD?
|
||
JRN PAM_SKIP_NOPART ;BR = YES, DO NOT FOOL AROUND
|
||
MOVB *A0(OFLAGS+B_ANIM-7),A14 ;IS HE ON ANIOBJS?
|
||
JRNN PAM_SKIP ;BR = NO
|
||
CALLR PULLANIM
|
||
PAM_SKIP
|
||
**** MOVB *A0(OFLAGS2+B_DEAD-7),A14 ;IS THIS OBJECT DEAD?
|
||
**** JRN PAM_SKIP_NOPART ;BR = YES, DO NOT FOOL AROUND
|
||
ANDNIM M_NOPARTANI,*A0(OFLAGS),W ;REVOKE HIS INDEPENDENCE
|
||
PAM_SKIP_NOPART
|
||
DEC A1 ;ARE WE FINISHED?
|
||
JRZ PAM_X ;BR = YES
|
||
MOVE *A0(OPARTS),A0,L ;GET THE NEXT OBJECT TO PULL
|
||
JRNZ PAM_LP ;IF THERE ARE NO MORE, EXIT
|
||
PAM_X
|
||
PULLQ A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* PULLANIM
|
||
* A0 = OBJ to be pulled from ANIOBJS
|
||
;A12 if IN_ANIM, A12 must be pointing to ANIM FUNC QUEUE
|
||
CKPULLANIM ;PULL FROM ANIM IF NECESSARY
|
||
movb *A0(OFLAGS+B_ANIM-7),A14
|
||
jrnn SkPullAnim
|
||
PULLANIM:
|
||
PUSH A2
|
||
.IF DEBUG
|
||
; callr CkAnim
|
||
.ENDIF
|
||
|
||
;**** MARK OBJ AS BEING OFF ANIM LIST ****
|
||
move *A0(OFLAGS),A2,W
|
||
btst B_ANIM,A2
|
||
LOCKON Z
|
||
andni M_ANIM,A2
|
||
move A2,*A0(OFLAGS),W
|
||
|
||
calla PULLANIMFUNC ;stop any queued anim func
|
||
|
||
MOVE @ANIOBJS,A14,L
|
||
cmp A0,A14
|
||
jrne PullLp
|
||
;*** PULLING FIRST OBJ ***
|
||
move *A0(AnimNxt),A14,L
|
||
MOVE A14,@ANIOBJS,L
|
||
jruc NoPull
|
||
|
||
PullLp:
|
||
MOVE A14,A2 ;PTR TO PREVIOUS IN A2
|
||
MOVE *A2(AnimNxt),A14,L ;PTR TO NEXT IN A14
|
||
LOCKON Z
|
||
CMP A14,A0 ;IS THIS THE GUY?
|
||
JRNE PullLp
|
||
MOVE *A0(AnimNxt),*A2(AnimNxt),L ;LINK AROUND THIS OBJECT
|
||
|
||
NoPull:
|
||
|
||
.IF DEBUG
|
||
callr CkAnim
|
||
.ENDIF
|
||
PULLQ A2
|
||
SkPullAnim
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* CkAnim
|
||
* Walk ANIOBJS list, hang if anything is wrong
|
||
.IF DEBUG
|
||
CkAnim:
|
||
mmtm SP,A0,A2
|
||
move @ANIOBJS,A0,L
|
||
jrz AniCkLpX
|
||
AniCkLp:
|
||
move *A0(OFLAGS),A2,W
|
||
btst B_ANIM,A2
|
||
LOCKON Z
|
||
move *A0(OCTRL),A2,W
|
||
btst B_INUSE,A2
|
||
LOCKON Z
|
||
|
||
; callr IsAnObj
|
||
|
||
move *A0(AnimNxt),A0,L
|
||
jrnz AniCkLp
|
||
AniCkLpX:
|
||
mmfm SP,A0,A2
|
||
rets
|
||
.ENDIF
|
||
|
||
**************************************************************************
|
||
* OnAnim
|
||
* hang if A0 is on ANIOBJS LIST
|
||
.IF DEBUG
|
||
OnAnim:
|
||
move @ANIOBJS,A14,L
|
||
jrz AniOnLpX
|
||
AniOnLp:
|
||
cmp A0,A14
|
||
LOCKON Z
|
||
move *A14(AnimNxt),A14,L
|
||
jrnz AniOnLp
|
||
AniOnLpX:
|
||
rets
|
||
.ENDIF
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETAFARG_WORD - GET A WORD ARGUMENT FOR AFunc, IT IS PULLED FROM THE *
|
||
* ANIM SCRIPT. *
|
||
* A8 = PTR TO OBJECT ANIMATING *
|
||
* *A8(AnimArg),L = PTR TO ARGUMENT TO BE PULLED *
|
||
* RETURNS *
|
||
* A0 = ARGUMENT *
|
||
* N & Z = SET TO REFLECT ARGUMENT *
|
||
* *A8(AnimArg),L = POINTING TO NEXT *
|
||
* *
|
||
**************************************************************************
|
||
GETAFARG_WORD
|
||
MOVE *A8(AnimArg),A14,L
|
||
MOVE *A14+,A0,W
|
||
MOVE A14,*A8(AnimArg),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETAFARG_LONG - GET A LONG ARGUMENT FOR AFunc, IT IS PULLED FROM THE *
|
||
* ANIM SCRIPT. *
|
||
* A8 = PTR TO OBJECT ANIMATING *
|
||
* *A8(AnimArg),L = PTR TO ARGUMENT TO BE PULLED *
|
||
* RETURNS *
|
||
* A0 = ARGUMENT *
|
||
* N & Z = SET TO REFLECT ARGUMENT *
|
||
* *A8(AnimArg),L = POINTING TO NEXT *
|
||
* *
|
||
**************************************************************************
|
||
GETAFARG_LONG
|
||
MOVE *A8(AnimArg),A14,L
|
||
MOVE *A14+,A0,L
|
||
MOVE A14,*A8(AnimArg),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* A_GOTO - Anim Func
|
||
* takes two args from anim script
|
||
* .long label to branch to.
|
||
* .word %chance (RANDPER) to take branch
|
||
A_GOTO
|
||
callr GETAFARG_LONG ;Arg in A0
|
||
move A0,A1
|
||
callr GETAFARG_WORD ;Arg in A0
|
||
calla RANDPER
|
||
jrnc A_GOTOX
|
||
move A1,*A8(AnimFrm),L
|
||
A_GOTOX
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* A_AnimGo - ANIM FUNC TO GO TO NEW ANIM SCRIPT/FRAME *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
A_AnimGo
|
||
CALLR GETAFARG_LONG ;GET NEW PTR OFF OF SCRIPT
|
||
MOVE A0,*A8(AnimFrm),L
|
||
MOVE A0,*A8(AnimScr),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_AnimFrm - ANIM FUNC TO GO TO NEW ANIM FRAME *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
A_AnimFrm
|
||
CALLR GETAFARG_LONG ;GET NEW PTR OFF OF SCRIPT
|
||
MOVE A0,*A8(AnimFrm),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_AnimScr - ANIM FUNC TO SET A NEW LOOP BACK PTR FOR AN ANIMATION *
|
||
* SCRIPT. *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
A_AnimScr
|
||
CALLR GETAFARG_LONG ;GET NEW PTR OFF OF SCRIPT
|
||
MOVE A0,*A8(AnimScr),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHANGE_OID - ANIM FUNC TO STUFF A NEW OID INTO AN OBJECT *
|
||
* A8 = PTR TO OBJECT *
|
||
* AARG+,W = NEW OID TO STUFF *
|
||
* *
|
||
**************************************************************************
|
||
A_CHANGE_OID
|
||
CALLA GETAFARG_WORD
|
||
MOVE A0,A1
|
||
JRUC CHANGE_OID
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CLR_GUNVECT - ANIM FUNC TO CLEAR AN OBJECTS GUN VECTOR. *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
A_CLR_GUNVECT
|
||
CLRM *A8(OGUNVECT),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* KILOBJ_XA8 - KILL A CLASS OF OBJECTS FROM THE OBJECT LIST EXCEPT *
|
||
* FOR THE ONE POINTED TO BY A8. *
|
||
* A0 = OID (16 BITS) *
|
||
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
|
||
* A8 = PTR TO OBJECT NOT TO KILL (0 = NO OBJECT TO WORRY ABOUT) *
|
||
* *
|
||
* NEEDS TO BE REDONE
|
||
**************************************************************************
|
||
;KILOBJ_XA8:
|
||
; MMTM SP,A0,A2,A3,A4,A5,A8
|
||
; MOVI OBJLST,A2,L
|
||
; JRUC KILGEN
|
||
|
||
**************************************************************************
|
||
* *
|
||
* KILBOBJ - KILL A CLASS OF OBJECTS FROM THE PRIMARY BACKGROUND LIST. *
|
||
* A0 = OID (16 BITS) *
|
||
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
|
||
* *
|
||
* NEEDS TO BE REDONE
|
||
**************************************************************************
|
||
;KILBOBJ:
|
||
; MMTM SP,A0,A2,A3,A4,A5,A8
|
||
; CLR A8
|
||
; MOVI BAKLST,A2,L
|
||
; JRUC KILGEN
|
||
nop
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CREATE_OBJ - CREATE AN OBJECT AND STUFF IT, LEAVE IT UNINSERTED. *
|
||
* USES THE "NEW" (11/15/90) INITIALIZATION TABLE. *
|
||
* A5 = PTR TO INIT TABLE *
|
||
* RETURNS *
|
||
* Z = FAILURE TO CREATE EITHER OBJECT OR PALETTE. *
|
||
* A0 = 0 *
|
||
* NZ = O.K. *
|
||
* A0 = POINTER TO OBJECT *
|
||
* A5 = NEXT WORD AFTER INITIALIZATION *
|
||
* *
|
||
**************************************************************************
|
||
CREATE_OBJ
|
||
CALLR GETOBJ
|
||
JRZ CO_X ;OBJECT BLOCK FAILURE
|
||
CALLR INIT_OBJ
|
||
JRNZ CO_X
|
||
CALLR FREEOBJ ;DO THIS ON MASTER PALETTE FAILURE
|
||
CLR A0 ;SET THE Z FLAG
|
||
CO_X:
|
||
RETS
|
||
**************************************************************************
|
||
* *
|
||
* INIT_OBJ - INITIALIZE AN OBJECT BLOCK USING AN INITIALIZATION TABLE. *
|
||
* A0 = OBJECT BLOCK TO INITIALIZE *
|
||
* A5 = PTR TO "NEW" INITIALIZATION TABLE *
|
||
* A8 - A11 = MUST BE PASSED TO CREATE FUNC IF CALLED. *
|
||
* RETURNS: *
|
||
* Z = PALETTE ALLOCATE FAILURE, OBJECT NOT STUFFED *
|
||
* NZ = ALL IS WELL *
|
||
* A5 = POINTING TO NEXT WORD AFTER INITIALIZATION TABLE *
|
||
* *
|
||
* INITIALIZATION TABLE *
|
||
* -------------------- *
|
||
* .LONG OIMG,OCVECT *
|
||
* .WORD OID,OCTRL,OFLAGS,OZOFF *
|
||
* .LONG CFUNC *
|
||
* *
|
||
**************************************************************************
|
||
INIT_OBJ
|
||
PUSH A1
|
||
MMTM SP,B0,B1,B2,B3
|
||
|
||
MOVE *A5+,A1,L
|
||
CALLR FPSTFOBJ0
|
||
JRZ IO_X
|
||
|
||
MOVE A5,B0
|
||
move A0,B1
|
||
move *B0+,B2,L ;Load OCVECT
|
||
move B2,*B1(OCVECT),L
|
||
move *B0+,B2,W ;Load OID
|
||
move B2,*B1(OID),W
|
||
|
||
move *B0+,B2,W ;Load OCTRL
|
||
MOVE *B0+,B3,W ;Load OFLAGS
|
||
MOVE B3,*B1(OFLAGS),W
|
||
btst B_FLIPH,B2
|
||
jrnz IO_FLIP
|
||
btst B_FLIPV,B2
|
||
jrz IO_SKIPFLIP
|
||
IO_FLIP
|
||
MMTM SP,A4,A8
|
||
move B2,A4
|
||
move A0,A8
|
||
;A1 still set from above
|
||
calla ANI
|
||
MMFM SP,A4,A8
|
||
jruc IO_FLAGSOK
|
||
IO_SKIPFLIP
|
||
MOVE *B1(OCTRL),B3,W
|
||
OR B2,B3
|
||
move B3,*B1(OCTRL),W
|
||
IO_FLAGSOK
|
||
MOVE *B0+,B2,W ;Load OZOFF
|
||
|
||
MOVB B2,*B1(OZOFF)
|
||
|
||
MOVE *B0+,B2,L ;GET THE CFUNC
|
||
JRZ IO_NOCFUNC
|
||
CALL B2 ;CALL IT
|
||
IO_NOCFUNC
|
||
MOVE B0,A5
|
||
IO_X
|
||
MMFM SP,B0,B1,B2,B3
|
||
PULL A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* GET_SUPP
|
||
* Returns ptr to supplemental list header
|
||
*
|
||
* A8 = obj
|
||
* RETURNS A0 = supp list header - OSLINK (Z set if not on any list)
|
||
GET_SUPP:
|
||
move A8,A0
|
||
callr GETSUPP
|
||
move A14,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* GETSUPP
|
||
* GETSUPP_FROM_OID
|
||
* Returns ptr to supplemental list header
|
||
*
|
||
* A0 = obj
|
||
* A14 = OID FOR GETSUPP_FROM_OID
|
||
* RETURNS A14 = supp list header - OSLINK (Z set if not on any list)
|
||
GETSUPP
|
||
move *A0(OID),A14,W
|
||
GETSUPP_FROM_OID
|
||
srl SR_SUPP,A14
|
||
jrz NoSupp
|
||
sll 5,A14 ;convert to offset, multiple of 020H
|
||
addi SUPPLSTS-OSLINK,A14
|
||
NoSupp
|
||
rets
|
||
|
||
**************************************************************************
|
||
* INSSUPP
|
||
* Inserts object onto a supplemental list
|
||
* List is selected by the SUPP field of the OID
|
||
*
|
||
* A0 = OBJ to insert
|
||
* RETURNS nothing
|
||
INSSUPP:
|
||
callr GETSUPP
|
||
jrz SkInsSupp
|
||
|
||
.IF DEBUG
|
||
;***** CHECK IF OBJECT IS ALREADY ON SUPPLEMENTAL LIST ******
|
||
PUSH A14
|
||
CkSupp:
|
||
cmp A14,A0
|
||
jreq $
|
||
move *A14(OSLINK),A14,L
|
||
jrnz CkSupp
|
||
PULLQ A14
|
||
.ENDIF
|
||
|
||
MOVE *A0(OID),A4,W
|
||
ANDI MASK_TYPE,A4
|
||
CMPI TYPE_UNIV & MASK_TYPE,A4
|
||
JREQ inssupp_sort
|
||
|
||
move *A14(OSLINK),*A0(OSLINK),L
|
||
move A0,*A14(OSLINK),L
|
||
rets
|
||
|
||
inssupp_sort
|
||
move *A0(OZVAL),A1,L ; GET Z POSITION
|
||
inssupp_zloop:
|
||
MOVE A14,A4
|
||
move *A14(OSLINK),A14,L ;what 'supp?
|
||
JRZ do_inssupp ; BR = END OF SUPP LIST
|
||
move *A14(OZVAL),A2,L
|
||
cmp A2,A1
|
||
jrgt inssupp_zloop
|
||
jrlt do_inssupp
|
||
|
||
move *A0(OYVAL),A5,L ; GET Y POSITION
|
||
jruc inssupp_ytest
|
||
inssupp_yloop
|
||
MOVE A14,A4
|
||
move *A14(OSLINK),A14,L
|
||
JRZ do_inssupp
|
||
move *A14(OZVAL),A2,L
|
||
cmp A2,A1
|
||
jrlt do_inssupp
|
||
inssupp_ytest
|
||
move *A14(OYVAL),A2,L ;TEST Y POSITION
|
||
cmp A2,A5
|
||
JRLT inssupp_yloop
|
||
do_inssupp
|
||
move *A4(OSLINK),*A0(OSLINK),L
|
||
move A0,*A4(OSLINK),L
|
||
|
||
SkInsSupp
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* INSERT_SUPP
|
||
* Inserts object onto a supplemental list
|
||
* List is selected by the SUPP field of the OID
|
||
*
|
||
* A8 = OBJ to insert
|
||
INSERT_SUPP:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr INSSUPP
|
||
PULLQ A0
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* PULLSUPP
|
||
* pulls object from a supplemental list
|
||
* List is selected by the SUPP field of the OID
|
||
*
|
||
* A0 = OBJ to pull
|
||
* RETURNS nothing
|
||
PULLSUPP:
|
||
PUSH A1
|
||
callr GETSUPP
|
||
jrz SkPullSupp
|
||
|
||
PulSupLp
|
||
move A14,A1
|
||
move *A14(OSLINK),A14,L
|
||
LOCKON Z
|
||
cmp A14,A0
|
||
jrne PulSupLp
|
||
|
||
move *A0(OSLINK),*A1(OSLINK),L ;link around A0
|
||
clr A1
|
||
move A1,*A0(OSLINK),L
|
||
SkPullSupp
|
||
PULLQ A1
|
||
rets
|
||
|
||
**************************************************************************
|
||
* PULL_SUPP
|
||
* pulls object from a supplemental list
|
||
* List is selected by the SUPP field of the OID
|
||
*
|
||
* A8 = OBJ to insert
|
||
PULL_SUPP:
|
||
PUSH A0
|
||
move A8,A0
|
||
callr PULLSUPP
|
||
PULLQ A0
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* CNTSUPP
|
||
* COUNT THE NUMBER OF OBJECTS ON GIVEN SUPPLEMENTAL LIST.
|
||
*
|
||
* A14 = SUPPLEMENTAL LIST HEADER - OSLINK
|
||
* RETURNS A0 = OBJECT CNT (SETS THE Z BIT)
|
||
* A14 = TRASHED
|
||
CNTSUPP:
|
||
clr A0
|
||
CntSupLp
|
||
move *A14(OSLINK),A14,L
|
||
jrz CNTSUPPX
|
||
inc A0
|
||
cmpi NOBJ,A0
|
||
LOCKON GE ;WE'VE MAXED, SOMETHING IS WRONG
|
||
jruc CntSupLp
|
||
CNTSUPPX
|
||
move A0,A0
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGEZPOS *
|
||
* *
|
||
* CHANGE THE Z POSITION OF A WHOLE TYPE OF OBJECTS *
|
||
* *
|
||
* ENTRY *
|
||
* A0 OID TO CHANGE *
|
||
* A1 NEW ZPOS ( 32 BITS WORTH ) *
|
||
* *
|
||
* EXIT *
|
||
* NOTHING *
|
||
* *
|
||
* NEEDS TO BE REDONE
|
||
**************************************************************************
|
||
|
||
;CHANGEZPOS:
|
||
; MMTM SP,A2,A3
|
||
; SEXT A0
|
||
; MOVI OBJLST,A2
|
||
;CHNGZLP
|
||
; MOVE *A2,A2,L
|
||
; JRZ CHNGZPOSX ;BR = DONE WITH THE LIST
|
||
; MOVE *A2(OID),A3,W
|
||
; CMP A0,A3
|
||
; JRNE CHNGZLP ;THIS IS NOT ONE OF THEM
|
||
; MOVE A1,*A2(OZVAL),L ; STUFF THE NEW ZPOS
|
||
; JRUC CHNGZLP
|
||
;CHNGZPOSX
|
||
; MMFM SP,A2,A3
|
||
; RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DECZPOS *
|
||
* *
|
||
* DECREMENT THE Z POSITION OF A WHOLE TYPE OF OBJECTS *
|
||
* *
|
||
* ENTRY *
|
||
* A0 OID TO CHANGE *
|
||
* A1 Z POSITION DECREMENT VALUE *
|
||
* *
|
||
* EXIT *
|
||
* NOTHING *
|
||
* *
|
||
* CALL *
|
||
* CALL *
|
||
* *
|
||
* NEEDS TO BE REDONE
|
||
**************************************************************************
|
||
|
||
;DECZPOS:
|
||
; MMTM SP,A2,A3
|
||
; SEXT A0
|
||
; MOVI OBJLST,A2
|
||
;DECZLP
|
||
; MOVE *A2,A2,L
|
||
; JRZ DECZPOSX ;BR = DONE WITH THE LIST
|
||
; MOVE *A2(OID),A3,W
|
||
; CMP A0,A3
|
||
; JRNE DECZLP ;THIS IS NOT ONE OF THEM
|
||
; MOVE *A2(OZVAL),A14,L
|
||
; SUB A1,A14
|
||
; MOVE A14,*A2(OZVAL),L ; STUFF THE NEW ZPOS
|
||
; JRUC DECZLP
|
||
;DECZPOSX
|
||
; MMFM SP,A2,A3
|
||
; RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_OFF - TURN AN OBJECT "OFF" I.E. SET DMA OUTPUT = 0 *
|
||
* A8 = PTR TO OBJECT BLOCK *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_OFF:
|
||
.if OLD_WAY
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
MOVE *A8(OSHAD),A14,L ;Does this object have a shadow?
|
||
JRZ OBJ_OFF_X ;BR = No, then don't worry
|
||
PUSH A8
|
||
MOVE A14,A8
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14 ;Shut the shadow down
|
||
SLL 4,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
PULLQ A8
|
||
|
||
.else
|
||
|
||
move *a8(OFLAGS),a14
|
||
ori M_NODISP,a14
|
||
move a14,*a8(OFLAGS)
|
||
|
||
MOVE *A8(OSHAD),A14,L ;Does this object have a shadow?
|
||
JRZ OBJ_OFF_X ;BR = No, then don't worry
|
||
PUSH A8
|
||
MOVE A14,A8
|
||
move *a8(OFLAGS),a14
|
||
ori M_NODISP,a14
|
||
move a14,*a8(OFLAGS)
|
||
PULLQ A8
|
||
|
||
.endif
|
||
OBJ_OFF_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJOFF - TURN AN OBJECT "OFF" I.E. SET DMA OUTPUT = 0 *
|
||
* A0 VERSION *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
OBJOFF
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR OBJ_OFF
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_ON - TURN AN OBJECT "ON" I.E. SET DMA OUTPUT TO WRITE <> 0 *
|
||
* A8 = PTR TO OBJECT BLOCK *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_ON:
|
||
.if OLD_WAY
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
ADDK DMAWNZ&0FH,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
|
||
MOVE *A8(OSHAD),A14,L ;Does this object have a shadow?
|
||
JRZ OON_X ;BR = No, then don't worry
|
||
PUSH A8
|
||
MOVE A14,A8
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
ADDK DMACNZ&0FH,A14 ;Turn the shadow on
|
||
MOVE A14,*A8(OCTRL),W
|
||
PULLQ A8
|
||
|
||
.else
|
||
|
||
move *a8(OFLAGS),a14
|
||
andni M_NODISP,a14
|
||
move a14,*a8(OFLAGS)
|
||
|
||
MOVE *A8(OSHAD),A14,L ;Does this object have a shadow?
|
||
JRZ OON_X ;BR = No, then don't worry
|
||
PUSH A8
|
||
MOVE A14,A8
|
||
move *a8(OFLAGS),a14
|
||
andni M_NODISP,a14
|
||
move a14,*a8(OFLAGS)
|
||
PULLQ A8
|
||
|
||
.endif
|
||
OON_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJON - TURN AN OBJECT "ON" I.E. SET DMA OUTPUT TO WRITE <> 0 *
|
||
* A0 VERSION *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
OBJON
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR OBJ_ON
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_WNZ *
|
||
* *
|
||
* Turn an object to Constant on non-zero pixels. *
|
||
* *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_WNZ
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
addk DMAWNZ&0Fh,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJWNZ *
|
||
* *
|
||
* Turn an object to Constant on non-zero pixels. *
|
||
* A0 Version. *
|
||
* *
|
||
* A0 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
OBJWNZ
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR OBJ_WNZ
|
||
PULLQ A8
|
||
RETS
|
||
**************************************************************************
|
||
* *
|
||
* *
|
||
* OBJ_WNZ_ON *
|
||
* *
|
||
* Not only does this set the DMA flags to Write Non-Zero, but *
|
||
* it also ensures that the object is on. *
|
||
* *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_ON_WNZ
|
||
CALLR OBJ_WNZ
|
||
JRUC OBJ_ON
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_CONST - Turn an object to Constant on non-zero pixels. *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_CONST
|
||
MOVE *A8(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
addk DMACNZ&0Fh,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJCONST *
|
||
* *
|
||
* Turn an object to Constant on non-zero pixels. *
|
||
* A0 Version. *
|
||
* *
|
||
* A0 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
OBJCONST
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR OBJ_CONST
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_OFF_MULTI - TURN ALL OF THE PARTS OF A MULTI-PARTER "OFF" FROM *
|
||
* THIS OBJECT ON DOWN. *
|
||
* A8 = PTR TO FIRST PART TO TURN "OFF" *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_OFF_MULTI
|
||
PUSH A8
|
||
OOFFM_LP
|
||
CALLR OBJ_OFF
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ OOFFM_LP
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_ON_MULTI - TURN ALL OF THE PARTS OF A MULTI-PARTER "ON" FROM *
|
||
* THIS OBJECT ON DOWN. *
|
||
* A8 = PTR TO FIRST PART TO TURN "ON" *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_ON_MULTI
|
||
PUSH A8
|
||
OONM_LP
|
||
CALLR OBJ_ON
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ OONM_LP
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_ON_WNZ_MULTI - TURN ALL OF THE PARTS OF A MULTI-PARTER "ON" FROM *
|
||
* THIS OBJECT ON DOWN. *
|
||
* A8 = PTR TO FIRST PART TO TURN "ON" *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_ON_WNZ_MULTI
|
||
PUSH A8
|
||
OOWM_LP
|
||
CALLR OBJ_ON_WNZ
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ OOWM_LP
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_CONST_MULTI - TURN ALL OF THE PARTS OF A MULTI-PARTER "CONSTANT" FROM*
|
||
* THIS OBJECT ON DOWN. *
|
||
* A8 = PTR TO FIRST PART TO TURN "CONSTANT" *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_CONST_MULTI
|
||
PUSH A8
|
||
OCONSTM_LP
|
||
CALLR OBJ_CONST
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ OCONSTM_LP
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* IS_OBJ_OFF - DETERMINE IF GIVEN OBJECT IS "TURNED OFF" *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS *
|
||
* Z = OBJECT IS OFF *
|
||
* NZ = OBJECT IS ON *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
IS_OBJ_OFF
|
||
.if OLD_WAY
|
||
MOVE *A8(OCTRL),A14,W
|
||
SLL 28,A14
|
||
|
||
.else
|
||
|
||
move *a8(OFLAGS),a14
|
||
btst B_NODISP,a14
|
||
|
||
.endif
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJECTS_ON - TURN A CLASS OF OBJECTS "ON" *
|
||
* A0 = OID OF OBJECTS TO TURN ON *
|
||
* A1 = MASK (0 BITS = DON'T CARE) *
|
||
* A4 = DMA WRITE FLAGS (LOW FOUR BITS) TO USE. *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
OBJECTS_ON:
|
||
MMTM SP,A2,A3,A4
|
||
MOVI FGLIST,A3
|
||
MOVE *A3(P_LSTHD),A2,L ;GET THE OBJECT LIST
|
||
CMP A2,A3
|
||
JREQ OBJSON_X
|
||
SEXT A0
|
||
AND A1,A0 ;FORM MATCH
|
||
SLL 28,A4
|
||
SRL 28,A4 ;ONLY CONCERNED WITH WRITES
|
||
OBJSON_LP:
|
||
MOVE *A2(OID),A14,W
|
||
AND A1,A14 ;MASK OFF THE DON'T CARES
|
||
CMP A0,A14
|
||
JRNE OBJSON_NXT ;BR = THIS IS NOT ONE OF THEM
|
||
ORM A4,*A2(OCTRL),W ;ON WITH YOU
|
||
OBJSON_NXT:
|
||
MOVE *A2,A2,L
|
||
CMP A2,A3
|
||
JRNE OBJSON_LP ;BR = NOT FINISHED YET
|
||
OBJSON_X:
|
||
MMFM SP,A2,A3,A4
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJECTS_OFF - TURN A CLASS OF OBJECTS "OFF" *
|
||
* A0 = OID OF OBJECTS TO TURN OFF *
|
||
* A1 = MASK (0 BITS = DON'T CARE) *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
OBJECTS_OFF:
|
||
MMTM SP,A2,A3
|
||
|
||
MOVI FGLIST,A3
|
||
MOVE *A3(P_LSTHD),A2,L ;GET THE OBJECT LIST
|
||
CMP A2,A3
|
||
JREQ OOFF_X
|
||
SEXT A0
|
||
AND A1,A0 ;FORM MATCH
|
||
OOFF_LP:
|
||
MOVE *A2(OID),A14,W
|
||
AND A1,A14 ;MASK OFF THE DON'T CARES
|
||
CMP A0,A14
|
||
JRNE OOFF_NXT ;BR = THIS IS NOT ONE OF THEM
|
||
|
||
.if OLD_WAY
|
||
MOVE *A2(OCTRL),A14,W
|
||
SRL 4,A14
|
||
SLL 4,A14 ;OFLAGS SAY OFF!
|
||
MOVE A14,*A2(OCTRL),W
|
||
.else
|
||
move *a2(OFLAGS),a14
|
||
ori M_NODISP,a14
|
||
move a14,*a2(OFLAGS)
|
||
.endif
|
||
|
||
OOFF_NXT:
|
||
MOVE *A2,A2,L
|
||
CMP A2,A3
|
||
JRNE OOFF_LP ;BR = NOT FINISHED YET
|
||
OOFF_X:
|
||
MMFM SP,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GANISAG - ADJUST CURRENT OBJECT IMAGE WITH RESPECT TO IT'S *
|
||
* ANIMATION PNT. AND FLIP FLAGS *
|
||
* NOTE: CALL ONLY AFTER INITIALIZING WITH STFOBJ, OR SOMETHING. *
|
||
* A0 = PTR TO OBJECT BLOCK *
|
||
* A2 = NEW OYVAL *
|
||
* A3 = NEW OXVAL *
|
||
* A4 = NEW FLAGS *
|
||
* RETURNS *
|
||
* A2 = ADJUSTED OYVAL *
|
||
* A3 = ADJUSTED OXVAL *
|
||
* *
|
||
**************************************************************************
|
||
;GANISAG
|
||
; MMTM SP,A1,A4,A6,A7
|
||
; MMTM SP,A2,A3
|
||
; MOVE *A0(OIMG),A1,L
|
||
; CALLR GSAGOF
|
||
; MOVE A3,*A0(OSAG),L
|
||
; MOVE A2,*A0(OSIZE),L
|
||
; MOVE A4,*A0(OFLAGS),L
|
||
; CALLR GANIOF
|
||
; MMFM SP,A2,A3
|
||
; SUB A6,A3
|
||
; SUB A7,A2 ;ADJUST UPPER LEFT CORNER
|
||
; MOVE A3,*A0(OXVAL),L
|
||
; MOVE A2,*A0(OYVAL),L
|
||
; MMFM SP,A1,A4,A6,A7
|
||
; RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCREXP32 - SHRINK OR EXPAND THE SCREEN WINDOW FROM THE CURRENT SIZE *
|
||
* TO THE GIVEN IN A GIVEN AMOUNT OF TICKS *
|
||
* A0 = # OF TICKS *
|
||
* A10 = NEW SCRNTL *
|
||
* A11 = NEW SCRNBR *
|
||
* NOTE: CALL WITH JSRP *
|
||
* TRASHES A8 & A9 *
|
||
* *
|
||
**************************************************************************
|
||
SCREXP32
|
||
MOVE @SCRNTL,A14,L
|
||
MOVX A14,A1
|
||
SLL 16,A1
|
||
CLR A2
|
||
MOVY A14,A2
|
||
SUBXY A10,A14
|
||
MOVX A14,A5
|
||
SLL 16,A5
|
||
DIVS A0,A5
|
||
NEG A5
|
||
MOVE A5,A6
|
||
CLR A5
|
||
MOVY A14,A5
|
||
DIVS A0,A5
|
||
NEG A5
|
||
MOVE A5,A7
|
||
|
||
MOVE @SCRNBR,A14,L
|
||
MOVX A14,A3
|
||
SLL 16,A3
|
||
CLR A4
|
||
MOVY A14,A4
|
||
SUBXY A11,A14
|
||
MOVX A14,A5
|
||
SLL 16,A5
|
||
DIVS A0,A5
|
||
NEG A5
|
||
MOVE A5,A8
|
||
CLR A5
|
||
MOVY A14,A5
|
||
DIVS A0,A5
|
||
NEG A5
|
||
MOVE A5,A9
|
||
MOVE A0,A5
|
||
SHTIMLP
|
||
ADD A6,A1 ;ADD THE TLX INCREMENT
|
||
ADD A7,A2 ;ADD THE TLY INCREMENT
|
||
ADD A8,A3 ;ADD THE LRX INCREMENT
|
||
ADD A9,A4 ;ADD THE LRY INCREMENT
|
||
MMTM A12,A1,A2,A3,A4,A5,A6,A7
|
||
SRL 16,A1
|
||
MOVY A2,A1
|
||
MOVE A1,@SCRNTL,L
|
||
SRL 16,A3
|
||
MOVY A4,A3
|
||
MOVE A3,@SCRNBR,L
|
||
SLEEP 1
|
||
MMFM A12,A1,A2,A3,A4,A5,A6,A7
|
||
DSJS A5,SHTIMLP
|
||
SHTIMR
|
||
MOVE A10,@SCRNTL,L ;MATCH WHAT THE CALLER WANTED
|
||
MOVE A11,@SCRNBR,L
|
||
RETP
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELETE_SUPP_ID - DELETE ALL OF THE OBJECTS ON A GIVEN SUPPLEMENTAL *
|
||
* LIST FROM THE OBJECT AND SUPP LIST AND KILL *
|
||
* THEIR CONTROLLING PROCESS. *
|
||
* A0 = I.D. TO DELETE *
|
||
* A1 = MASK *
|
||
* A8 = SUPPLEMENTAL LIST TO TRAVERSE *
|
||
* *
|
||
* NEEDS TO BE REDONE
|
||
**************************************************************************
|
||
;DELETE_SUPP_ID:
|
||
; MMTM SP,A0,A1,A2,A3,A4,A8
|
||
; MOVE A1,A2 ;STORE MASK HERE
|
||
; AND A2,A0 ;MATCH THIS
|
||
; MOVE A8,A1 ;KEEP SUPP LIST
|
||
; MOVE *A8,A8,L ;GET FIRST ELEMENT
|
||
; JRZ DSUPPID_X ;BR = LIST IS EMPTY
|
||
;DSUPPID_LP:
|
||
; MOVE *A8(OSLINK),A4,L ;GET NEXT IN CASE OF DELETE
|
||
; MOVE *A8(OID),A3,W
|
||
; AND A2,A3
|
||
; CMP A3,A0 ;MATCHING I.D.s
|
||
; JRNE DSUPPID_NXT ;BR = NO
|
||
; CALLA OBJPROC_KILL ;KILL DUDES PROCESS
|
||
; CALLA DELETE_OBJ_SUPP ;AND WASTE HIM FROM THE LIST
|
||
;DSUPPID_NXT:
|
||
; MOVE A4,A8 ;CHECK NEXT
|
||
; JRNZ DSUPPID_LP
|
||
;DSUPPID_X:
|
||
; MMFM SP,A0,A1,A2,A3,A4,A8
|
||
; RETS
|
||
|
||
|
||
|
||
*REMOVED GET_PT_SCRNREL
|
||
|
||
*REMOVED GET_Y_SCRNREL
|
||
|
||
*REMOVED GET_PT_PLANEREL
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_SCRNREL - GET THE SCREEN RELATIVE X,Y COORDINATES OF AN OBJECT *
|
||
* IT IS ASSUMED THATE THE CURRENT X,Y COORDINATES ARE *
|
||
* WORLD ABSOLUTE. *
|
||
* A8 = PTR TO THE OBJECT BLOCK *
|
||
* RETURNS *
|
||
* A1 = X SCREEN RELATIVE, 32 BITS *
|
||
* A2 = Y SCREEN RELATIVE, 32 BITS *
|
||
* *
|
||
**************************************************************************
|
||
GET_SCRNREL
|
||
MOVE *A8(ODAG),A1,L
|
||
CLR A2
|
||
MOVY A1,A2
|
||
SLL 16,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MAKE_SCRNREL - MAKE A GIVEN OBJECT HAVE SCREEN RELATIVE COORDINATES. *
|
||
* THEY ARE PASSED BACK FOR YOUR USE. *
|
||
* A8 = PTR TO THE OBJECT BLOCK *
|
||
* RETURNS *
|
||
* A1 = X SCREEN RELATIVE, 32 BITS *
|
||
* A2 = Y SCREEN RELATIVE, 32 BITS *
|
||
* *
|
||
**************************************************************************
|
||
MAKE_SCRNREL
|
||
*REWRITE NEEDED HERE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MAKE_WORLDREL - MAKE A GIVEN OBJECT HAVE WORLD RELATIVE COORDINATES. *
|
||
* THEY ARE PASSED BACK FOR YOUR USE. *
|
||
* A8 = PTR TO THE OBJECT BLOCK *
|
||
* RETURNS *
|
||
* A1 = X SCREEN RELATIVE, 32 BITS *
|
||
* A2 = Y SCREEN RELATIVE, 32 BITS *
|
||
* *
|
||
**************************************************************************
|
||
MAKE_WORLDREL
|
||
*REWRITE NEEDED HERE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MAKEWORLDREL - MAKE A GIVEN OBJECT HAVE WORLD RELATIVE COORDINATES. *
|
||
* THEY ARE PASSED BACK FOR YOUR USE. (A0 VERSION) *
|
||
* A0 = PTR TO THE OBJECT BLOCK *
|
||
* RETURNS *
|
||
* A1 = X SCREEN RELATIVE, 32 BITS *
|
||
* A2 = Y SCREEN RELATIVE, 32 BITS *
|
||
* *
|
||
**************************************************************************
|
||
MAKEWORLDREL
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR MAKE_WORLDREL
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PNT_WORLDREL - MAKE A GIVEN POINT WORLD RELATIVE IN A GIVEN PLANE. *
|
||
* POINT IS ASSUMED TO BE SCREEN RELATIVE. *
|
||
* A1 = ZVAL AT WHICH TO PLACE POINT *
|
||
* A3 = [Y,X] SCREEN RELATIVE POINT *
|
||
* RETURNS *
|
||
* A3 = [Y,X] WORLD RELATIVE *
|
||
* *
|
||
**************************************************************************
|
||
PNT_WORLDREL
|
||
PUSH A5
|
||
|
||
SEXT A5 ;ISOLATE X COORDINATE
|
||
TOWORLDX A1,A5 ;CONVERT IT TO THE WORLD VIA Z
|
||
|
||
SRA 16,A3 ;ISOLATE Y COORDINATE
|
||
TOWORLDY A1,A3 ;CONVERT IT TO THE WORLD VIA Z
|
||
SLL 16,A3
|
||
MOVX A5,A3 ;COMBINE FOR RETURN
|
||
|
||
PULLQ A5
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPY_OBJ - COPIES THE CONTENTS OF ONE OBJECT BLOCK TO THE OTHER. *
|
||
* A0 = PTR TO DESTINATION BLOCK *
|
||
* A8 = PTR TO SOURCE BLOCK *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
COPY_OBJ:
|
||
MMTM SP,B0,B2,B7
|
||
|
||
MOVE A0,B2
|
||
MOVE A8,B0
|
||
ADDI OZVEL,B2
|
||
ADDI OZVEL,B0
|
||
MOVI OBSIZ-OZVEL,B7
|
||
|
||
BLMOVE 1,1
|
||
|
||
MOVE *A0(OFLAGS),A14,W
|
||
ANDNI M_ANIM,A14 ;CLEAR ANY IRRELEVANT FLAGS HERE
|
||
MOVE A14,*A0(OFLAGS),W
|
||
|
||
MMFM SP,B0,B2,B7
|
||
RETS
|
||
|
||
**** MMTM SP,A0,A8
|
||
|
||
**** MOVI OBSIZ-OZVEL,A14,W ;GET THE SIZE OF THE BLOCK IN WORDS
|
||
**** ADDI OZVEL,A0
|
||
**** ADDI OZVEL,A8 ;DON'T COPY THE LINKS
|
||
|
||
**** SRL 5,A14 ;DIVIDE BY 32
|
||
**** JRNC SKIP_COPYOBJ_WRD ;BR = NO ODD WORDS
|
||
**** MOVE *A8+,*A0+,W ;TAKE CARE OF ODD MAN
|
||
****SKIP_COPYOBJ_WRD:
|
||
**** SRL 1,A14
|
||
**** JRNC COPYOBJ_LP
|
||
**** MOVE *A8+,*A0+,L ;MOVE A LONG
|
||
****COPYOBJ_LP
|
||
**** move *A8+,*A0+,L
|
||
**** move *A8+,*A0+,L
|
||
**** DSJS A14,COPYOBJ_LP
|
||
|
||
**** MMFM SP,A0,A8
|
||
**** MOVE *A0(OFLAGS),A14,W
|
||
**** ANDNI M_ANIM,A14 ;CLEAR ANY IRRELEVANT FLAGS HERE
|
||
**** MOVE A14,*A0(OFLAGS),W
|
||
**** RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CREATE_COPY *
|
||
* *
|
||
* Create an exact copy of the given object. *
|
||
* *
|
||
* A8 = Ptr to object to copy *
|
||
* *
|
||
* Returns: *
|
||
* Z = Failure allocating copy, A0 = 0 *
|
||
* NZ = Copy created successfully, A0 = Ptr to copy *
|
||
* *
|
||
**************************************************************************
|
||
CREATE_COPY
|
||
CALLR GETOBJ
|
||
JRZ CC_X
|
||
CALLR COPY_OBJ
|
||
PUSH A5
|
||
MOVE *A0(OPAL),A5,W
|
||
CALLA INC_PALCNT
|
||
PULLQ A5
|
||
MOVE A0,A0
|
||
CC_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CREATE_MULTI_COPY *
|
||
* *
|
||
* Same as CREATE_COPY, except for a multi-parter *
|
||
* *
|
||
* A8 = Ptr to Multi-parter to copy *
|
||
* *
|
||
**************************************************************************
|
||
CREATE_MULTI_COPY
|
||
MMTM SP,A8,A9,A10
|
||
MOVE A8,A9
|
||
|
||
CALLR CREATE_COPY
|
||
MOVE A0,*A0(OPART1),L
|
||
MOVE A0,A9
|
||
MOVE A0,A10
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRZ CMC_X
|
||
PUSH A0
|
||
|
||
CREATE_MULTI_COPY_LOOP
|
||
CALLR CREATE_COPY
|
||
MOVE A10,*A0(OPART1),L
|
||
MOVE A0,*A9(OPARTS),L
|
||
MOVE A0,A9
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ CREATE_MULTI_COPY_LOOP
|
||
PULLQ A0
|
||
CMC_X
|
||
MMFM SP,A8,A9,A10
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_TO_PNT - PUT AN OBJECT DIRECTLY ON A POINT. *
|
||
* WILL ALSO ADJUST THE SLAVE OBJECTS HANGING *
|
||
* OFF OF THIS OBJECT. *
|
||
* A3 = [Y,X] POINT *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_TO_PNT:
|
||
PUSH A1
|
||
MOVE A3,A1
|
||
CALLR SET_ANIP
|
||
PULLQ A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJTOPNT - PUT AN OBJECT DIRECTLY ON A POINT (A0 VERSION) *
|
||
* A0 = PTR TO OBJECT *
|
||
* A3 = [Y,X] POINT *
|
||
* *
|
||
**************************************************************************
|
||
OBJTOPNT:
|
||
PUSH A1
|
||
MOVE A3,A1
|
||
CALLR SETANIP
|
||
PULLQ A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLEAR_OPLINKS - ROUTINE TO CLEAR THE OPLINKS FOR ALL ACTIVE OBJECTS *
|
||
* ON ALL PLANES. *
|
||
* *
|
||
**************************************************************************
|
||
CLEAR_OPLINKS
|
||
PUSH A7
|
||
MOVI CLEAR_OPLINK,A7
|
||
CALLR FGPLANE_LP
|
||
PULLQ A7
|
||
RETS
|
||
|
||
CLEAR_OPLINK
|
||
CLR A14
|
||
MOVE A14,*A8(OPLINK),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STOPOBJS - ROUTINE TO CLEAR VELOCITIES OF ALL OBJECTS ON ALL PLANES. *
|
||
* *
|
||
**************************************************************************
|
||
STOPOBJS
|
||
PUSH A7
|
||
MOVI STOPOBJ,A7
|
||
CALLR FGPLANE_LP
|
||
PULLQ A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLR_VEL - CLEAR ALL VELOCITIES OF OBJECT *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
CLR_VEL
|
||
STOPOBJ
|
||
CLR A14
|
||
MOVE A14,*A8(OYACCEL),W
|
||
MOVE A14,*A8(OXVEL),L
|
||
MOVE A14,*A8(OYVEL),L
|
||
MOVE A14,*A8(OZVEL),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLRVEL - CLEAR VELOCITIES OF OBJECT IN A0 *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
CLRVEL
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR CLR_VEL
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGE_OID - ROUTINE TO CHANGE THE OID OF AN ACTIVE OBJECT. THIS *
|
||
* MUST BE USED TO HANDLE CORRECT SUPP LIST *
|
||
* SWITCHING. *
|
||
* A1 = NEW OID *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
CHANGE_OID
|
||
CALLR PULL_SUPP ;GET IT OFF ITS CURRENT LIST
|
||
MOVE A1,*A8(OID),W ;SHOW US THE WAY
|
||
JRUC INSERT_SUPP ;AND PUT IT ON THE NEW LIST
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGE_OID_MULTI - Change the OID of every object in a Multiparter *
|
||
* including and after the given object. *
|
||
* A1 = New OID *
|
||
* A8 = Ptr to first part to change *
|
||
* *
|
||
**************************************************************************
|
||
CHANGE_OID_MULTI
|
||
PUSH A8
|
||
COM_LP
|
||
CALLR CHANGE_OID
|
||
MOVE *A8(OPARTS),A8,L
|
||
JRNZ COM_LP
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGEOID - ROUTINE TO CHANGE THE OID OF AN ACTIVE OBJECT. THIS *
|
||
* MUST BE USED TO HANDLE CORRECT SUPP LIST *
|
||
* SWITCHING. *
|
||
* A0 VERSION. *
|
||
* A0 = PTR TO OBJECT *
|
||
* A1 = NEW OID *
|
||
* *
|
||
**************************************************************************
|
||
CHANGEOID
|
||
CALLR PULLSUPP ;GET IT OFF ITS CURRENT LIST
|
||
MOVE A1,*A0(OID),W ;SHOW US THE WAY
|
||
JRUC INSSUPP ;AND PUT IT ON THE NEW LIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGE_OIDS - CHANGE ALL MATCHING OID'S ON EVERY PLANE TO A NEW ONE. *
|
||
* A0 = OID TO CHANGE *
|
||
* A1 = NEW OID *
|
||
* *
|
||
**************************************************************************
|
||
CHANGE_OIDS
|
||
PUSH A7
|
||
MOVI CHANGE1OID,A7
|
||
CALLR FGPLANE_LP
|
||
PULLQ A7
|
||
RETS
|
||
|
||
CHANGE1OID
|
||
MOVE *A8(OID),A14,W
|
||
CMP A0,A14
|
||
JRNE CHNG1X ;THIS IS NOT ONE OF THEM
|
||
CALLR PULL_SUPP
|
||
MOVE A1,*A8(OID),W ;STUFF THE NEW ONE
|
||
CALLR INSERT_SUPP
|
||
CHNG1X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FGPLANE_LP - VERY GENERIC ROUTINE TO APPLY A FUNCTION TO EVERY *
|
||
* OBJECT ON THE FOREGROUND PLANE. *
|
||
* A7 = PTR TO FUNCTION *
|
||
* *
|
||
**************************************************************************
|
||
FGPLANE_LP
|
||
MMTM SP,A8,A9
|
||
MOVI FGLIST,A8
|
||
MOVE A8,A9
|
||
JRUC FGP_TST
|
||
FGP_LP
|
||
CALL A7
|
||
FGP_TST
|
||
MOVE *A8,A8,L
|
||
CMP A8,A9
|
||
JRNZ FGP_LP
|
||
|
||
MMFM SP,A8,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STORE_ZVAL - STORE THE GIVEN 32 BIT Z VALUE IN THE OBJECT AND ALL *
|
||
* OF ITS PARTS. PARTS WILL HAVE ZVAL CHANGED BY OZOFF. *
|
||
* A1 = ZVAL *
|
||
* A8 = OBJECT (HEAD IF MULTI-PARTER) *
|
||
* *
|
||
**************************************************************************
|
||
STORE_ZVALH
|
||
;alternate entry point to use OZOFF for head obj
|
||
PUSH A8
|
||
jruc SZ_LP
|
||
STORE_ZVAL
|
||
PUSH A8
|
||
MOVE A1,*A8(OZVAL),L ;SET HEAD OBJECT, NO OZOFF USED
|
||
MOVE *A8(OPARTS),A8,L ;MORE PARTS?
|
||
JRZ SZ_X ;BR = NO
|
||
SZ_LP
|
||
MOVB *A8(OZOFF),A14
|
||
ADD A1,A14
|
||
MOVE A14,*A8(OZVAL),L
|
||
MOVE *A8(OPARTS),A8,L ;IS THERE ANOTHER PART?
|
||
JRNZ SZ_LP ;BR = YES
|
||
SZ_X
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STOREZVAL - STORE THE GIVEN 32 BIT Z VALUE IN THE OBJECT AND ALL *
|
||
* OF ITS PARTS. ALL WILL HAVE ZVAL CHANGED BY OZOFF. *
|
||
* A0 VERSION *
|
||
* A0 = OBJECT (HEAD IF MULTI-PARTER) *
|
||
* A1 = ZVAL *
|
||
* *
|
||
**************************************************************************
|
||
STOREZVAL
|
||
PUSH A8
|
||
MOVE A0,A8
|
||
CALLR STORE_ZVALH
|
||
PULLQ A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* KILOBJ_ALL - KILL ALL OBJECTS OF THE GIVEN I.D. *
|
||
* A0 = OID (16 BITS) *
|
||
* *
|
||
**************************************************************************
|
||
KILOBJ_ALL:
|
||
PUSH A1
|
||
CLR A1
|
||
NOT A1
|
||
CALLR KILOBJ
|
||
PULLQ A1
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* KILOBJ - KILL A CLASS OF OBJECTS ON ALL FOREGROUND PLANES *
|
||
* A0 = OID (16 BITS) *
|
||
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
|
||
* *
|
||
**************************************************************************
|
||
KILOBJ
|
||
MMTM SP,A0,A2,A3,A8
|
||
MOVI FGLIST,A8
|
||
|
||
MOVE A0,A2
|
||
SEXT A2
|
||
AND A1,A2 ;FORM MATCH
|
||
|
||
MOVE A8,A0
|
||
JRUC KO_TST
|
||
KO_LP
|
||
MOVE *A0(OID),A14,W
|
||
AND A1,A14 ;CAN DONT CARE BITS
|
||
CMP A2,A14 ;MATCH?
|
||
JRNE KO_TST ;NO
|
||
|
||
MOVE *A0,A3,L
|
||
CALLR DELOBJ
|
||
MOVE A3,A0
|
||
JRUC KO_TST2
|
||
KO_TST
|
||
MOVE *A0,A0,L
|
||
KO_TST2
|
||
CMP A0,A8
|
||
JRNE KO_LP
|
||
|
||
MMFM SP,A0,A2,A3,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* EXISTOBJ_ALL - FIND ANY OCCURANCE OF AN OBJECT OF GIVEN I.D. *
|
||
* A0 = OID *
|
||
* RETURNS: *
|
||
* Z BIT SET = NO OBJECT, A0 = 0 *
|
||
* Z BIT CLR = OBJECT, A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
EXISTOBJ_ALL
|
||
PUSH A1
|
||
CLR A1
|
||
NOT A1
|
||
CALLR EXISTOBJ
|
||
PULL A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* EXIST_OBJ_ALL *
|
||
* *
|
||
* Find any occurance of an object of Given I.D. *
|
||
* *
|
||
* A0 = OID *
|
||
* *
|
||
* Returns: *
|
||
* Z = No object found, A8 = 0 *
|
||
* NZ = Found match, A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
EXIST_OBJ_ALL
|
||
PUSH A0
|
||
CALLA EXISTOBJ_ALL
|
||
MOVE A0,A8
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* RESUME_EXIST_OBJ_ALL *
|
||
* *
|
||
* Resume search for objects of given I.D. *
|
||
* *
|
||
* A0 = OID *
|
||
* A8 = Last object found *
|
||
* *
|
||
* Returns: *
|
||
* Z = No more objects found, A8 = 0 *
|
||
* NZ = Found another one, A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
RESUME_EXIST_OBJ_ALL
|
||
MMTM SP,A0,A1
|
||
CLR A1
|
||
NOT A1
|
||
CALLR RESUME_EXIST_OBJ
|
||
MOVE A0,A8
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* RESUME_EXISTOBJ *
|
||
* *
|
||
* Entrypoint to EXISTOBJ, where you give the starting *
|
||
* point of the search. *
|
||
* *
|
||
* A0 = OID to search for *
|
||
* A1 = OID mask (0 bits mean "don't care") *
|
||
* A8 = Search entrypoint, non-inclusive *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Z = No object found, A0 = 0 *
|
||
* NZ = Matching object found, A0 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
RESUME_EXIST_OBJ
|
||
MMTM SP,A2,A8
|
||
MOVE A0,A2
|
||
SEXT A2
|
||
AND A1,A2 ;FORM MATCH
|
||
MOVE A8,A0
|
||
MOVI FGLIST,A8
|
||
JRUC EO_TST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* EXIST_OBJ *
|
||
* *
|
||
* Find any occurance of an object of Given I.D. *
|
||
* *
|
||
* A0 = OID *
|
||
* A1 = OID mask (0 bits mean "don't care") *
|
||
* *
|
||
* Returns: *
|
||
* Z = No object found, A8 = 0 *
|
||
* NZ = Found match, A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
EXIST_OBJ
|
||
PUSH A0
|
||
CALLA EXISTOBJ
|
||
MOVE A0,A8
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* EXISTOBJ *
|
||
* *
|
||
* Search for an object of certain class on the foreground *
|
||
* list. *
|
||
* *
|
||
* A0 = OID *
|
||
* A1 = OID Mask (0 bits mean "don't care") *
|
||
* *
|
||
* Returns: *
|
||
* *
|
||
* Z = No object found, A0 = 0 *
|
||
* NZ = Matching object found, A0 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
EXISTOBJ
|
||
MMTM SP,A2,A8
|
||
MOVI FGLIST,A8
|
||
|
||
MOVE A0,A2
|
||
SEXT A2
|
||
AND A1,A2 ;FORM MATCH
|
||
|
||
MOVE A8,A0
|
||
JRUC EO_TST
|
||
|
||
EO_LP
|
||
MOVE *A0(OID),A14,W
|
||
AND A1,A14 ;CAN DONT CARE BITS
|
||
CMP A2,A14 ;MATCH?
|
||
JREQ EO_X ;YES!
|
||
|
||
EO_TST
|
||
MOVE *A0,A0,L ;GET NEXT OBJECT
|
||
CMP A0,A8 ;IS THAT ALL?
|
||
JRNE EO_LP ;BR = NO, TRY MORE
|
||
CLR A0 ;FAILED
|
||
EO_X
|
||
MOVE A0,A0
|
||
|
||
MMFM SP,A2,A8
|
||
RETS
|
||
|
||
*REMOVED EXISTOBJ_PLANE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COUNT_HEADS - COUNT ONLY THE HEAD PARTS OF MULTI-PART OBJECTS. *
|
||
* A0 = OID (16 BITS) TO COUNT *
|
||
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
|
||
* RETURNS *
|
||
* A6 = COUNT *
|
||
* *
|
||
**************************************************************************
|
||
COUNT_HEADS
|
||
MMTM SP,A0,A2,A3
|
||
|
||
MOVE A0,A3
|
||
SEXT A3
|
||
AND A1,A3 ;FORM MATCH
|
||
|
||
CLR A6
|
||
|
||
MOVI FGLIST,A2
|
||
|
||
MOVE A2,A0
|
||
JRUC CHP_TST
|
||
|
||
CHP_LP
|
||
MOVE *A0(OID),A14
|
||
AND A1,A14 ;CAN DONT CARE BITS
|
||
CMP A3,A14 ;MATCH?
|
||
JRNE CHP_TST ;NO
|
||
|
||
MOVE *A0(OPART1),A14,L
|
||
JRNZ CHP_HEAD_TST ;BR = A MULTI-PARTER
|
||
INC A6 ;COUNT THE SOLO OBJECT
|
||
JRUC CHP_TST
|
||
CHP_HEAD_TST
|
||
CMP A0,A14 ;IS THIS THE HEAD?
|
||
JRNE CHP_TST ;BR = NO
|
||
INC A6
|
||
CHP_TST
|
||
MOVE *A0,A0,L
|
||
CMP A0,A2
|
||
JRNE CHP_LP
|
||
|
||
MMFM SP,A0,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FIND_HEAD - FIND A HEAD PART ON A PLANE THAT MATCHES THE *
|
||
* GIVEN I.D. *
|
||
* A0 = OID (16 BITS) TO COUNT *
|
||
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
|
||
* RETURNS *
|
||
* Z = NONE FOUND *
|
||
* A0 = 0 *
|
||
* NZ = FOUND ONE *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
FIND_HEAD
|
||
MMTM SP,A2,A3
|
||
|
||
MOVE A0,A3
|
||
SEXT A3
|
||
AND A1,A3 ;FORM MATCH
|
||
MOVI FGLIST,A2
|
||
MOVE A2,A0
|
||
JRUC FHP_TST
|
||
|
||
FHP_LP
|
||
MOVE *A0(OID),A14
|
||
AND A1,A14 ;CAN DONT CARE BITS
|
||
CMP A3,A14 ;MATCH?
|
||
JRNE FHP_TST ;NO
|
||
|
||
MOVE *A0(OPART1),A14,L
|
||
JRZ FHP_TST ;BR = NOT A MULTI-PARTER
|
||
CMP A0,A14 ;IS THIS THE HEAD?
|
||
JRNE FHP_TST ;BR = NO
|
||
MOVE A0,A0
|
||
JRUC FHP_X
|
||
FHP_TST
|
||
MOVE *A0,A0,L
|
||
CMP A0,A2
|
||
JRNE FHP_LP
|
||
CLR A0
|
||
FHP_X
|
||
MMFM SP,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OBJ_UNIV_TO_SCREEN *
|
||
* *
|
||
* Turn a universe object into a screen object right where *
|
||
* it is. This assumes that the object is currently onscreen. *
|
||
* *
|
||
* A8 = Ptr to universe object *
|
||
* *
|
||
* Returns: *
|
||
* Nothing *
|
||
* *
|
||
**************************************************************************
|
||
OBJ_UNIV_TO_SCRN
|
||
MMTM SP,A2,A3,A5
|
||
MOVE A8,A14
|
||
ADDI OXVAL,A14
|
||
MMFM A14,A2,A3,A5 ;A2 = OZVAL; A3 = OYVAL; A5 = OXVAL
|
||
|
||
UTOSXY A2,A5,A3
|
||
|
||
SLL 16,A3
|
||
MOVX A5,A3
|
||
|
||
ORIM M_SCRNOBJ,*A8(OFLAGS),W
|
||
|
||
CALLR OBJ_TO_PNT
|
||
|
||
MMFM SP,A2,A3,A5
|
||
RETS
|
||
|
||
************************************************************************
|
||
*
|
||
* CONVERSION ROUTINES
|
||
*
|
||
* Also available in MACRO form (TOWORLDX,TOWORLDY,TOSCRNX,TOSCRNY)
|
||
*
|
||
* Remember, SCRN = WORLD/Z + HALF
|
||
*
|
||
************************************************************************
|
||
*
|
||
* ENTRY:
|
||
* a0 = Z
|
||
* a1 = world Y or univ Y
|
||
*
|
||
* EXIT:
|
||
* a0,a14 = trashed
|
||
* a1 = screen Y
|
||
*
|
||
UNIV_TO_SCRN_Y:
|
||
move @YBASE,a14,L
|
||
add a14,a1 ; convert from univ to world
|
||
WRLD_TO_SCRN_Y:
|
||
DIVS a0,a1 ;TRANSLATE 3-D WORLD IN SCRN COORDINATES
|
||
move @YHALF,a0
|
||
ADD a0,a1 ; add HALFY
|
||
rets
|
||
|
||
*
|
||
* ENTRY:
|
||
* a0 = Z
|
||
* a1 = world X or univ X
|
||
*
|
||
* EXIT:
|
||
* a0,a14 = trashed
|
||
* a1 = screen X
|
||
*
|
||
UNIV_TO_SCRN_X:
|
||
move @XBASE,a14,L
|
||
sub a14,a1 ; convert from univ to world
|
||
WRLD_TO_SCRN_X:
|
||
DIVS a0,a1 ;TRANSLATE 3-D WORLD IN SCRN COORDINATES
|
||
ADDI HALFX,a1 ; add HALFX
|
||
rets
|
||
|
||
*
|
||
* ENTRY:
|
||
* a0 = desired screen Y
|
||
* a1 = Z pos
|
||
*
|
||
* EXIT:
|
||
* a0,a14 = trashed
|
||
* a1 = world Y
|
||
*
|
||
SCRN_TO_WRLD_Y:
|
||
move @YHALF,a14
|
||
sub a14,a0
|
||
setf 10,1,1
|
||
mpys a0,a1 ; result in a1
|
||
setf 32,0,1
|
||
rets
|
||
|
||
|
||
*
|
||
* ENTRY:
|
||
* a0 = desired screen X
|
||
* a1 = Z pos
|
||
*
|
||
* EXIT:
|
||
* a0,a14 = trashed
|
||
* a1 = world X
|
||
*
|
||
SCRN_TO_WRLD_X:
|
||
subi HALFX,a0
|
||
setf 10,1,1
|
||
mpys a0,a1 ; result in a1
|
||
setf 32,0,1
|
||
rets
|
||
|
||
|
||
;
|
||
;* a0 = screen y
|
||
;* a1 = universe Y
|
||
;GET_Z_FRM_UY:
|
||
; move @YHALF,a14
|
||
; sub a14,a0 ; screen Y - half Y
|
||
; move @YBASE,a14,L
|
||
; add a14,a1 ; world Y
|
||
; divs a0,a1
|
||
; rets
|
||
|
||
|
||
|
||
|
||
|
||
.if OLD_WAY==1
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCRTST - TEST IF OBJECT IS ON SCREEN. IF THIS IS THE HEAD OF A MULTI- *
|
||
* PART OBJECT, THEN THE WHOLE THING IS TESTED. *
|
||
* *** NOTE **** ALL PARTS OF A MULTI-PARTER ARE ASSUMED TO EXIST *
|
||
* ON THE SAME PLANE. *
|
||
* A8 = OBJECT *
|
||
* RETURNS *
|
||
* EQ IF ON SCREEN *
|
||
* *
|
||
**************************************************************************
|
||
*
|
||
*SCRTSTG - PARMS A2=TL, A3=LR
|
||
*
|
||
SCRTSTG
|
||
MMTM SP,A0,A2,A3,A7,A8
|
||
JRUC SCRTST_CKM
|
||
*NORMAL SCREEN BOUNDRIES
|
||
SCRTST:
|
||
MMTM SP,A0,A2,A3,A7,A8
|
||
|
||
MOVE @SCRNTL,A2,L ;GET SCREEN TOP LEFT
|
||
MOVE @SCRNBR,A3,L ;GET SCREEN LOWER RT.
|
||
SCRTST_CKM
|
||
MOVE *A8(OPART1),A7,L ;ARE WE A MULTI-PARTER
|
||
JRZ SCRTST1 ;BR = NO
|
||
CMP A7,A8 ;IS THIS THE HEAD PART?
|
||
JREQ SCRTST1 ;BR = YES
|
||
CLR A7 ;DO NOT DO A MULTI-PART CHECK
|
||
SCRTST1
|
||
SCRTST_MULTI_LP
|
||
MOVE *A8(ODAG),A0,L
|
||
|
||
CMPXY A3,A0 ;IS IT LOWER THAN LOWER RT?
|
||
JRYGE SCRTF ;LOWER
|
||
JRXGE SCRTF ;TO THE RIGHT
|
||
|
||
MOVE *A8(OSIZE),A14,L
|
||
ADDXY A0,A14 ;GET LOWER RT OF OBJECT
|
||
|
||
CMPXY A2,A14
|
||
JRYLE SCRTF ;ABOVE...
|
||
JRXLE SCRTF ;TO THE LEFT..
|
||
|
||
CLR A0
|
||
JRUC SCRTX ;RETURN EQ (ON SCREEN)
|
||
SCRTF:
|
||
MOVE A7,A7 ;MULTI-PART CHECK?
|
||
JRZ SCRT_DONE ;BR = NO
|
||
*GET THE NEXT PART OF A MULTI-PART OBJECT.
|
||
* IF IT IS TURNED "OFF" OR NOT ACTIVE, THEN NO CHECK IS PERFORMED.
|
||
SCRTST_PART_LP
|
||
MOVE *A8(OPARTS),A8,L ;NEXT?
|
||
JRZ SCRT_DONE ;BR = NO MORE PATIENTS
|
||
|
||
; MOVE *A8(OCTRL),A14,W ; OLD WAY
|
||
; SLL 28,A14 ;IS THIS OBJECT ON?
|
||
; JRZ SCRTST_PART_LP ;BR = NO
|
||
|
||
move *a8(OFLAGS),a14
|
||
btst B_NODISP,a14
|
||
JRNZ SCRTST_PART_LP ;BR = NO
|
||
|
||
MOVE *A8(OLINK),A14,L ;IS OBJECT INSERTED?
|
||
JRZ SCRTST_PART_LP ;BR = NO
|
||
JRUC SCRTST_MULTI_LP
|
||
SCRT_DONE
|
||
MOVK 1,A0
|
||
MOVE A0,A0 ;RETURN NE (NOT ON SCREEN)
|
||
SCRTX:
|
||
MMFM SP,A0,A2,A3,A7,A8
|
||
RETS
|
||
|
||
****************************************************************************
|
||
* MULTIMAKE
|
||
* Use a Create Script to allocate and initialize obj(s)
|
||
* B0 ptr to Create Script w/ following format
|
||
* .byte OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
* PRCCNT must be >= # of procs that will be allocated in CFUNCS
|
||
* FOR IMGPALCNT
|
||
* .long IMG->PAL ;PAL TO BE FOUND OR HAVE AVAILABLE SLOT FOR
|
||
* FOR PALCNT
|
||
* .long PAL ;PAL TO BE FOUND OR HAVE AVAILABLE SLOT FOR
|
||
* FOR OBJCNT, FOLLOWING ENTRIES NEEDED
|
||
* use MACRO LLWWWL to place following items on single line
|
||
* .long IMG, OCVECT
|
||
* .word OID, OCTRL, OFLAGS, OZOFF
|
||
* .long CFUNC
|
||
* [.word/.long parms to CFUNC]
|
||
*
|
||
* MULTIMAKE automatically links all objs together as multi-parter w/
|
||
* 1st obj as head obj
|
||
*
|
||
* PARMS B0 script ptr, A10-A11 passed to each PROC created unless
|
||
* they are modified by CFUNCS
|
||
*
|
||
* RETURNS
|
||
* A8 ptr to head obj of uninserted multi-parter.
|
||
* Immediately follow with INSERT_OBJ to insert.
|
||
* Zflag set if not enough OBJS, PROCS or PALS
|
||
* !!!!!!!! assume ALL REGS (A&B) TRASHED but A9,A10,A11,A12,A13 !!!!!!!!!
|
||
*
|
||
*
|
||
* CFUNC - Create Functions
|
||
* gets new obj in A0, initialized and linked into MULTI-PARTER
|
||
* A8 ptr to first obj of script (head of MULTI-PARTER)
|
||
* ptr to Create Script in B0, must inc B0 as CFUNC parms read.
|
||
* Is free to trash all A regs but A8,A9,A10,A11,A12,A13
|
||
* Must preserve all BREGS except B14 and
|
||
* B0 which must point after CFUNC parms
|
||
*
|
||
*
|
||
MULTIMAKE
|
||
PUSH A9 ;THIS WILL BE THE PREVIOUS OBJ PTR
|
||
clr A8 ;First Obj
|
||
|
||
;*** CHECK OBJCNT
|
||
movb *B0,B7 ;B7 # objs to allocate
|
||
move @OFREECNT,B2,W
|
||
cmp B2,B7
|
||
jrgt MAKEX
|
||
addk 8,B0
|
||
|
||
;*** CHECK PRCCNT
|
||
movb *B0,B1 ;B1 >= # of procs to allocate
|
||
move @PFREECNT,B2,W
|
||
cmp B2,B1
|
||
jrgt MAKEX
|
||
addk 8,B0
|
||
|
||
move @FREEPALCNT,B3,W
|
||
;FOR EACH PAL NOT FOUND, DEC FREEPALCNT - JRN MAKEX
|
||
movb *B0,B1 ;IMGPALCNT
|
||
addk 8,B0
|
||
movb *B0,B2 ;PALCNT
|
||
addk 8,B0
|
||
|
||
inc B1
|
||
ImgPalLp
|
||
dec B1
|
||
jrle SkImgPalCk
|
||
move *B0+,B4,L
|
||
move B4,A0
|
||
move *A0(ICMAP),A0,L
|
||
calla FINDPAL
|
||
jrnz ImgPalLp
|
||
;*** PAL NOT FOUND ***
|
||
dec B3
|
||
jrn MAKEX
|
||
jruc ImgPalLp
|
||
SkImgPalCk
|
||
|
||
inc B2
|
||
PalLp
|
||
dec B2
|
||
jrle SkPalCk
|
||
move *B0+,B4,L
|
||
move B4,A0
|
||
calla FINDPAL
|
||
jrnz PalLp
|
||
;*** PAL NOT FOUND ***
|
||
dec B3
|
||
jrn MAKEX
|
||
jruc PalLp
|
||
SkPalCk
|
||
|
||
|
||
;THERE IS ENOUGH OBJS, PROCS AND PALS SO GO AHEAD AND ALLOCATE
|
||
clr B3 ;OBJECT #
|
||
MkObjLp
|
||
inc B3
|
||
move *B0+,B1,L
|
||
move B1,A1
|
||
callr GETOBJ
|
||
callr FPSTFOBJ0
|
||
move A0,B1
|
||
movb B3,*B1(OPARTID) ;store # of PART
|
||
move *B0+,B2,L ;Load OCVECT
|
||
move B2,*B1(OCVECT),L
|
||
move *B0+,B2,W ;Load OID
|
||
move B2,*B1(OID),W
|
||
|
||
move *B0+,B2,W ;Load OCTRL
|
||
MOVE *B0+,B4,W ;Load OFLAGS
|
||
MOVE B4,*B1(OFLAGS),W
|
||
btst B_FLIPH,B2
|
||
jrnz MkFlp
|
||
btst B_FLIPV,B2
|
||
jrz SkMkFlp
|
||
MkFlp
|
||
move B2,A4
|
||
PUSH A8
|
||
move A0,A8
|
||
;A1 still set from above
|
||
calla ANI
|
||
PULLQ A8
|
||
jruc MkFlagsOk
|
||
SkMkFlp
|
||
move *B1(OCTRL),B4,W
|
||
OR B2,B4
|
||
move B4,*B1(OCTRL),W
|
||
MkFlagsOk
|
||
MOVE *B0+,B2,W ;Load OZOFF
|
||
|
||
MOVE B2,A2 ;A2 WILL BE TEMP OZOFF STORAGE
|
||
MOVB B2,*B1(OZOFF)
|
||
move A8,A8
|
||
jrnz SkMkFirst
|
||
move A0,A8
|
||
jruc SkINSPART
|
||
SkMkFirst
|
||
**** callr INSPART
|
||
MOVE A0,*A9(OPARTS),L ;LINK NEW OBJECT AT END
|
||
; movb *A8(OPLANE),*A0(OPLANE)
|
||
move *A8(OZVAL),A14,L
|
||
move *A8(OZOFF),A9,W
|
||
sub A9,A14
|
||
ADD A2,A14
|
||
MOVE A14,*A0(OZVAL),L
|
||
SkINSPART
|
||
MOVE A8,*A0(OPART1),L ;VALIDATE HEAD PTR
|
||
MOVE A0,A9 ;KEEP PREVIOUS PART FOR PART LINKUP
|
||
move *B0+,B2,L ;Load CFUNC
|
||
jrz MkNxtObj
|
||
PUSH A8
|
||
call B2 ;DO CFUNC
|
||
PULLQ A8
|
||
MkNxtObj
|
||
cmp B7,B3
|
||
jrlt MkObjLp
|
||
CMPK 1,B3 ;MORE THAN ONE OBJECT CREATED?
|
||
JRNE MAKEX ;BR = YES, IT IS MULTI
|
||
CLR A14
|
||
MOVE A14,*A8(OPART1),L ;MAKE IT LOOK SINGLE
|
||
MAKEX
|
||
PULLQ A9
|
||
move A8,A8 ;Set Z Flag
|
||
rets
|
||
|
||
|
||
.endif
|
||
|
||
|
||
.END
|
||
|
||
|
||
|