trog/TROGBGND.ASM

1163 lines
29 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.MLIB "TROGMACS.LIB"
.FILE 'TROGBGND.ASM'
.TITLE " <<< T R O G -- BACKGROUND HANDLERS >>>"
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.OPTION B,D,L
.MNOLIST
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "BGNDTBL.GLO" ;BACKGROUND EQUATES
.INCLUDE "IMGTBL.GLO" ;IMAGE EQUATES
.DEF BGND_UD1, BGND_UD2, CLRBGND
.DEF FGND_OUT, BTYPE_CK
.DEF BAKMODS, BAK2MODS
.DEF BACKGROUND1, LAVABGND1, LAVABGND2
.DEF BACKGROUNDE, BACKGROUNDC, BACKGROUNDW, BACKGROUNDS
.DEF BACKGROUNDCRAY, BACKGROUNDDSRT
.DEF BACKGROUNDX6, BACKGROUND2
.DEF BACKGROUNDX2, BACKGROUNDX3, BACKGROUNDX5
.DEF FOREGROUNDV2
.DEF CREDITBGND
.IF 0
.DEF TROGBLACKBOARD
.DEF BACKGROUNDX1,BACKGROUNDX7
.ENDIF
.REF FOREGROUND, BGND_TYPE
.DEF TROGCAVE1
.DEF TROGCAVE2
.BSS BGNDRAM_START,0
.BSS bgndpaltbl,32,1
.BSS mod_pos,32,1
.BSS BAKBITS,32*128
.BSS BAK2BITS,32*16
.BSS BAKMODS,32
.BSS BAK2MODS,32
.BSS PREVWTL,32 ;PREVIOUS WORLDTL FOR BBOFSCRN
.BSS PREVSTL,32 ;PREVIOUS SCRNTL FOR BBOFSCRN
.BSS BGNDRAM_END,0
.TEXT
**************************************************************************
* *
* CLRBGND - CLEAR THE BACKGROUND UPDATE RAM AND MAKE THE MODULE LISTS *
* NULL. *
* *
**************************************************************************
CLRBGND
MMTM SP,A0,A1
*INITIALIZE ALL RAM TO 0
MOVI BGNDRAM_START,A1 ;GET THE RAM AREA
CLR A0
CLRBRAMLP:
MOVE A0,*A1+,W
CMPI BGNDRAM_END,A1
JRNE CLRBRAMLP
MOVI DUMBGND,A1
MOVE A1,@BAKMODS,L
MOVE A1,@BAK2MODS,L
MMFM SP,A0,A1
RETS
*
*DUMMY (NULL) BACKGROUND DEFINITION. THIS IS GLOBAL
DUMBGND
.LONG 0FFFFFFFFH
*BACKGROUND UPDATER EQUATES
BLSTSTRT .EQU >8000
BLSTEND .EQU >8001
************* Local Constants for UPD **************
DISP_PAD .set >00300030 ; Y:X
WIDEST_BLOCK .set 250
;* Must keep the size of these structures a multiple of 16
map_zflagspal .set 0
map_pal .set 0 ;size 4 - palette select
map_flags .set 4 ;size 4 - bit 0 hflip, bit 1 yflip
map_z .set 8 ;size 8
map_x .set 16 ;size 16
map_y .set 32 ;size 16
map_hdr .set 48 ;size 16 - offset in long words from block_hdr_tbl
; bits 12-15 are bits 4-7 of pal
; map_hdr set to >FFFF if block is not allocated
block_size .set 64 ;* if changed must get rid of shifts by 6
;* Offsets for a BLOCK HDR structure
map_size .set 0
map_w .set 0 ;size 16 ; These fields can't be changed
map_h .set 16 ;size 16 ; because they are used as the
map_dataptr .set 32 ;size 32 ;
block_hdr_size .set 64
;;* Offsets for a BLOCK HDR structure
;map_size .set 0
;map_w .set 0 ;size 16 ; These fields can't be changed
;map_h .set 16 ;size 16 ; because they are used as the
;map_animoff .set 32 ;size 32 ; OIMG block header
;map_dataptr .set 64 ;size 32 ;
;block_hdr_size .set 96
************************************************************************
**************************** BSrch1stXB ********************************
BSrch1stXB:
;*** PARMS
; A0 - x coordinate of a block
; A1 - Start of background block table
; A2 - end of block table
;*** Returns
; A0 - address of first block with x coordinate >= parm
; if new x is highest returns next empty block
; if no blocks with >= X, return 0
;* A0 = X val being searched for
;* A1 = Block Table Base + offset to X val
;* A14 - Threshhold for switching from binary to linear search
;* A9 = Low # -- # greatest background block
;* A10 = Mid # -- (High + Low) >> 1
;* A2 = High # -- # of lowest background block
mmtm SP,A1,A2,A8,A9,A10
clr A9 ;* set low = 0
sub A1,A2
srl 6,A2 ;* div by size of block (64)
addi map_x,A1 ;* block tbl base + X offset
movk 5,A14 ;* threshhold for switching from binary to linear search
BSRCH:
move A2,A10
sub A9,A10 ;* if (high - low) <= 5 finish with linear search
cmp A14,A10
jrle LSRCH
srl 1,A10
add A9,A10
;* get mid->x
move A10,A8
sll 6,A8 ;* multiply by block size (64)
add A1,A8
move *A8,A8,W ;* get x coor of the block
cmp A0,A8
jrlt Blow
move A10,A2 ;* high = mid
jruc BSRCH
Blow:
move A10,A9 ;* low = mid
jruc BSRCH
LSRCH:
;* finish with a linear search of block table from low to high
;* ending with first block x coor that is >= A0
;* A0 = X val being searched for
;* A9 = Low Address -- pts to X offset of block
;* A2 = High Address -- pts to X offset of block
sll 6,A9 ;* low block # to low block offset
sll 6,A2 ;* high block # to high block offset
add A1,A9
add A1,A2
movi block_size,A8
LSRCHLP:
move *A9,A10,W ;* X coor
cmp A0,A10
jrge GotB ;* if low->x >= A0 goto found
add A8,A9
cmp A2,A9
jrle LSRCHLP
;* block not found, return 0
clr A0
jruc BSrchDone
GotB:
;* return a ptr to the block
move A9,A0
subi map_x,A0
BSrchDone:
mmfm SP,A1,A2,A8,A9,A10
rets
**************************** BSrch1stXB ********************************
**************** U P D A T E D I S P L I S T **********************
;* deletes all display objects which are not on the screen
;* insures all background blocks on screen are on the disp list
BGND_UD1: ;* call to update main background
;* input, WORLDTL, SCRNTL, SCRNLR, BAKLST, BAKBITS, BAKMODS
;* this protects DISP_MOD and DISP_DEL TOO!
mmtm SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
mmtm SP,B0
;* Get coors of area to be put on display list.
move @WORLDTL,A3,1
move A3,A4
move @SCRNTL,A0,1
addxy A0,A3
move @SCRNLR,A0,1
addxy A0,A4
movi DISP_PAD,A0
subxy A0,A3 ;A3 - disp_tl
addxy A0,A4 ;A4 - disp_lr
movi BAKLST,A8 ;A8 - bakground list
callr DISP_DEL
;* determine which module
move @BAKMODS,A0,L ;A0- ptr to the module list
movi INSBOBJ,B0 ;B0 - which insert routine
movi BAKBITS,A7 ;A7 - bit table for block being on disp list
callr DISP_MOD
mmfm SP,B0
mmfm SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
rets
BGND_UD2: ;* call to update secondary background
;* input, BAK2TLX, BAK2TLY, SCRNTL, SCRNLR, BAK2LST, BAK2BITS, BAK2MODS
mmtm SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
mmtm SP,B0
;* Get coors of area to be put on display list.
move @BAK2TLX+16,A3,W
move @BAK2TLY+16,A0,W
sll 16,A0
movy A0,A3
move A3,A4
move @SCRNTL,A0,L
addxy A0,A3
move @SCRNLR,A0,L
addxy A0,A4
movi DISP_PAD,A0
subxy A0,A3 ;A3 = disp_tl
addxy A0,A4 ;A4 = disp_lr
movi BAK2LST,A8 ;A8 - bakground list
callr DISP_DEL
movi INSB2OBJ,B0 ;B0 - which insert routine
move @BAK2MODS,A0,L ;* A0- ptr to the module list
movi BAK2BITS,A7
callr DISP_MOD
mmfm SP,B0
mmfm SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
rets
***********************************************************************
*********************** D I S P M O D *******************************
;* Scan a Module list to find out which modules contain blocks
;* which need to be checked for addition to the display list.
; B0 - which insert routine
; A0 - Module list
; A3 - disp_tl
; A4 - disp_lr
; A7 - BAKBITS ;A7 - bit table for block being on disp list
;PARMS For DISP_ADD
; A1 - Background Block table
; A2 - End of Background Block table
; A5 - Background hdr table
; A9 - Module Start Position Y:X
; A10 - ptr to palette table for new block
; ;passed from above
; A3 - disp_tl
; A4 - disp_lr
; A6 - which bakground insert routine primary|secondary
; A7 - bit table for block being on disp list
;* caller is responsible for pushing and popping all A-registers
DISP_MOD:
clr A9 ;init y:x starting position
clr A11 ;ending y:x pos
move A7,A6 ;A6 will point to BakBits after Mod
ModLp:
SkDAdd:
move A6,A7
move *A0+,A8,L ;load module ptr
cmpi >FFFFFFFF,A8
jrz ModX ;end of the module tbl
move *A8+,A10,L ;load y:x size
move *A0+,A14,W ;X start position
zext A14,W
cmpi BLSTSTRT,A14
jrnz NotLastStartX
move A11,A14
subxy A10,A14
jruc GotNewX
NotLastStartX:
cmpi BLSTEND,A14
jrnz GotNewX
move A11,A14
GotNewX:
move *A0+,A5,W ;Y start position
zext A5,W
cmpi BLSTSTRT,A5
jrnz NotLastStartY
move A11,A5
subxy A10,A5
jruc GotNewY
NotLastStartY:
cmpi BLSTEND,A5
jrnz NotLastEndY
move A11,A5
jruc GotNewY
NotLastEndY:
sll 16,A5
GotNewY:
movy A5,A14
move A14,A9
move A9,A11
addxy A10,A11 ;A11 is module y:x end
move *A8+,A10,W ;load # of blocks
add A10,A6 ;A6 is new BAKBITS ptr
; cmpxy A9,A4
; jrxle ModX ;jump to exit loop if Mod start X > Screen End X
cmpxy A3,A11
jrxlt SkDAdd ;skip if Mod X End < TL X
jrylt SkDAdd ;skip if Mod Y End < TL Y
cmpxy A9,A4
jrxlt SkDAdd ;use this if modules aren't sorted left to right
;jump to if Mod start X > Screen End X
jrylt SkDAdd ;skip if Mod Y Start > BR Y
move *A8+,A1,L ;A1-block table
move A10,A2
sll 6,A2 ;each block is 4 words long
add A1,A2 ;A2-block table end
move *A8+,A5,L ;A5-Hdrs
move *A8+,A10,L ;A10-Pal tbl
subxy A9,A3
subxy A9,A4
callr DISP_ADD
addxy A9,A3
addxy A9,A4
jruc ModLp
ModX:
rets
***********************************************************************
*********************** D I S P A D D *******************************
;* This function adds all module blocks in the given range of Module
;* relative coors to the display list.
;* The boundries are included in the group to add.
DISP_ADD:
;*** PARMS:
; B0 - which bakground insert routine primary|secondary
; A5 - Background hdr table
; A7 - bit table for block being on disp list
; A9 - Module Start Position Y:X
; A10 - ptr to palette table for new block
; A1 - Background Block table
; A2 - End of Background Block table
; A3 - disp_tl - relative to the Module start POS
; A4 - disp_lr - "
;*** RETURNS nothing
;thrashes A1,A8,A14
mmtm SP,A0,A6,A7,A11
;* Find first universe block with an X coor >= A9
movx A3,A0
sext A0,W
subi WIDEST_BLOCK,A0
;A0 - x coordinate of a block
;A1 - Start of background block table
;A2 - end of block table
callr BSrch1stXB
;A0 is now the address of a block
jrz DADONE ;* no blocks with gtr Xcoor
movi block_size,A6
move A0,A8
sub A1,A8 ;* subtract off start of table
srl 6,A8 ;* divide by block size (64)
add A7,A8 ;* A8 - ptr to bit which indicates block on list
subk 8,A8 ;* after inc A8, use movb *A8 to load sign bit
sub A6,A0 ;subtract block size
BScanLP0:
inc A8
add A6,A0 ;* get next block
;* check if there are no more bgnd blocks
cmp A2,A0
jrge DADONE
;* if block already on display list try again
movb *A8,A11
jrn BScanLP0
;* check if x to big
move *A0(map_x),A11,W
cmpxy A3,A11
jrxge BScan1 ;* Jump if BlockX >= TL X
;* load map header
move *A0(map_hdr),A14,W
sll 20,A14 ;* only want bottom 12 bits, top 4 are pal bits
srl 15,A14 ;* leaves B9 << 5 == long word offset
add A5,A14 ;* A14 now pts to block hdr
;* check if right end of block hangs onto screen
move *A14,A1,W ;A1 is now the width of the block
add A11,A1
cmpxy A3,A1 ;* right end of block doesn't hang on to screen
jrxlt BScanLP0 ;* jump if Block X+W < TL X
;* if ycoor to big try again
move *A0(map_y),A1,0
sll 16,A1
cmpxy A1,A4
jrylt BScanLP0 ;* Jump if Block Y > BR Y
;* if ycoor+height to small try again
move *A14(map_h),A11,0
sll 16,A11
add A11,A1
cmpxy A3,A1
jrylt BScanLP0 ;* Jump if Block Y+H < TL Y
move A0,A7
callr ADDBLOCK ;Thrashes A1,A14
jrnc BScanLP0
jruc DADONE ;* was unable to add block - no blocks left
BScan1:
dec A8 ;* bit ptr for block on disp list
sub A6,A0 ;subtract off block size
BScanLP1:
inc A8
add A6,A0 ;Get next block
;* check if there are no more bgnd blocks
cmp A2,A0
jrge DADONE
;* if block already on display list try again
movb *A8,A11
jrn BScanLP1
;* if ycoor to big try again
move *A0(map_y),A1,W
sll 16,A1
cmpxy A1,A4
jrylt BScanLP1 ;* Jump if Block Y > BR Y
;* if ycoor+height to small try again
move *A0(map_hdr),A14,W
sll 20,A14 ;* only want bottom 12 bits, top 4 are pal bits
srl 15,A14 ;* leaves B9 << 5 == long word offset
add A5,A14 ;* B9 now pts to block hdr
move *A14(map_h),A11,W
sll 16,A11
add A11,A1
cmpxy A3,A1
jrylt BScanLP1 ;* Jump if Block Y+H < TL Y
;* if xcoor to big quit
move *A0(map_x),A1,W
cmpxy A1,A4
jrxlt DADONE ;* Jump if Block X > BR X
move A0,A7
callr ADDBLOCK
jrnc BScanLP1
DADONE:
mmfm SP,A0,A6,A7,A11
rets
***********************************************************************
***********************************************************************
ADDBLOCK:
;* PARMS
; B0 - which INS routine
; A5 - base of background block hdr
; A7 - ptr to background block
; A8 - ptr to bit map for block on disp list
; A9 - Module Start Position Y:X
; A10 - ptr to palette table for new block
;* Returns carry set if GETOBJ fails...
;* Also Destroys A1,A14 but they are used as temps in DISP_ADD
mmtm SP,A0,A2,A3,A4
calla GETOBJ
jrz ADDX
;* set bit in bitmap for block on list
movb *A8,A14
ori >80,A14
movb A14,*A8
move A8,*A0(OPLINK),L ;set OPLINK to be a ptr to the disp list bit
move *A7(map_x),A1,L ;A1 ypos:xpos of block from Mod Base
addxy A9,A1 ;Add in Module Base Position
move A1,*A0(OXPOS),W
srl 16,A1
move A1,*A0(OYPOS),W
move *A7,A4,W ;A4 - map_z,8:map_flags,4:map_pal,4
move A4,A3
srl 8,A3
sll 24,A3
srl 8,A3
move A3,*A0(OZVAL),L
move *A7(map_hdr),A1,W
movx A1,A14
sll 16,A14
srl 28,A14
sll 4,A14 ;* bits 12-15 are bits 4-7 of pal index
sll 20,A1 ;* bits 0-11 are hdr ptr;
srl 15,A1 ;* A1-long word offset into block hdr tbl
add A5,A1 ;* A1 - Ptr to oimg hdr - input to GSAGOF
;A4 - map_z,8:map_flags,4:map_pal,4
move A4,A3
sll 28,A4 ;* last four bits for pal
srl 28,A4
add A14,A4
sll 5,A4 ;* A4 is lword ptr from pal tbl
add A10,A4 ;* add in pal tbl
move A0,A2 ;save A0
move *A4,A0,L ;* get palette
calla GETBPAL
jrnz BSetPal
clr A0
BSetPal:
move A0,*A2(OPAL),W
move A2,A0 ;restore A0
movi >8002,A4 ;>8000 DMA GO, 2
srl 4,A3 ;* remove palette bits
sll 30,A3
jrc SKIP0 ;* carry bit is the transparency bit
addk 1,A4
SKIP0:
srl 26,A3 ;* line up flip h,v bits
add A3,A4 ;A4 - Flags for GSAGOF
move A1,*A0(OIMG),L
*A1=DATA BLOCK POINTER
*A4=OBJECT FLAGS
calla BKGSAGOF ;USES ISAG->20 FOR ISAG
*A2=RETURNED WITH NEW OSIZE
*A3=RETURNED WITH NEW SAG
*A4=RETURNED WITH NEW OFFSET:OFLAGS
move A0,A1
addi OSIZE+>20,A1
mmtm A1,A2,A3,A4 ;Stuff OSIZE,OSAG,OFFSET,OFLAGS
call B0
clrc
mmfm SP,A0,A2,A3,A4
rets
ADDX: ;failure to get object
setc
mmfm SP,A0,A2,A3,A4
rets
**********************************************************************
************************ D I S P D E L *****************************
;* This function deletes all objs outside the given range
;* of coors from the display list.
;* The boundries are not included in the group to delete.
DISP_DEL:
;*** PARMS:
; A8 - bak list
; A3 - disp_tl
; A4 - disp_lr
;*** RETURNS nothing
;Thrashes A0,A6,A7,A8,A9 ;all of which are pushed by caller
del_loop:
move A8,A9 ; ptr to PREV in A9
move *A9,A8,L ; ptr to NEXT in A8
jrz del_done ; QUIT if at end of list
;if X > Xmax continue
move *A8(OXPOS),A7,W
cmpxy A7,A4
jrxlt DEL_IT ;* jump if BR X < Block X
;if Y > Ymax continue
move *A8(OYPOS),A0,W
sll 16,A0
cmpxy A0,A4
jrylt DEL_IT ;* jump if BR Y < Block y
move *A8(OIMG),A1,L
;if X+width < Xmin continue
move *A1,A6,W ;A6 block width
add A6,A7
cmpxy A3,A7
jrxlt DEL_IT ;* jump if TL X > Block X+W
;if Y+height < Ymin continue
move *A1(map_h),A7,0 ;A7 block height
sll 16,A7
add A7,A0
cmpxy A3,A0
jrylt DEL_IT ;* jump if TL Y > Block Y+H
jruc del_loop
DEL_IT: ;* DELETE the OBJ
;* free the palette
move *A8(OPAL),A0,W
jrz NoFreeP
calla FREEPAL
NoFreeP:
;* unset the on display list bit
move *A8(OPLINK),A0,L
movb *A0,A7
andi >7F,A7
movb A7,*A0
move *A8,*A9,L ; put NEXT link in PREV obj
move @OFREE,A0,L
move A0,*A8,L
move A8,@OFREE,L ; Return deleted block to free stack
move A9,A8 ;A1- points to last obj
jruc del_loop
del_done:
rets
**************************************************************************
* *
* FGND_OUT - OUTPUT THE FOREGROUND OBJECTS DEFINED BY THE LIST IN *
* GLOBAL RAM LOCATION FOREGROUND. *
* GLOBALS: *
* FOREGROUND,W *
* RETURNS: *
* NOTHING *
* *
**************************************************************************
FGND_OUT
PUSH A0
MOVE @FOREGROUND,A14,L
MOVE *A14,A0,L
JRZ OUT_FGND_X
OUT_FGND_LP:
CALLA MAKE_FGND_OBJ ;MAKE IT SPECIAL
JRZ OUT_FGND_X ;BR = SORRY, OUT OF OBJECTS
MOVE *A14,A0,L
JRNZ OUT_FGND_LP
OUT_FGND_X:
PULL A0
RETS
**************************************************************************
* *
* MAKE_FGND_OBJ - GET AN OBJECT, A PALETTE, STUFF, AND INSERT *
* A FOREGROUND PIECE. STUFFING IS DONE WITH A *
* REDUCED INITIALIZATION TABLE. *
* A14 = PTR TO FGND INIT ENTRY. *
* RETURNS: *
* A0 = PTR TO OBJECT *
* Z BIT SET = FAILURE,A0 = 0 *
* *
**************************************************************************
MAKE_FGND_OBJ:
CALLA GETOBJ
JRZ MFOX ;OBJECT BLOCK FAILURE
CALLR FGND_PAL ;GET THE PALETTE, AS A BACKGROUND
JRZ MFOXFAIL ;BR = FAILED TO DO SO
CALLR STUFF_FGND ;STUFF IT
CALLA INSOBJ ;INSERT IT
MOVE A0,A0 ;CLEAR Z
JRUC MFOX ;AND EXIT
MFOXFAIL:
CALLA FREEOBJ
CLR A0
MFOX:
RETS
**************************************************************************
* *
* FGND_PAL - GET A FOREGROUND PALETTE FOR USE, IN THE BGND PALETTE TAB *
* A14 = POINTER TO FGND OBJECT INITIALIZATION TABLE. *
* RETURNS: *
* ZBIT SET = FAILURE *
* ZBIT CLR = SUCCESS --> VAR. CURPAL = PALETTE # JUST CREATED *
* *
**************************************************************************
FGND_PAL:
PUSH A0
MOVE *A14(20H),A0,L
MOVE *A0(ICMAP),A0,L ;GET THE PALETTE NAME
CALLA GETBPAL ;GET A PALETTE
JRZ FGND_PALX ;SUCCESSFUL PALETTE CREATION
MOVE A0,@CURPAL,W ;STUFF THIS IN CURRENT PAL
FGND_PALX:
MMFM SP,A0
RETS
**************************************************************************
* *
* STUFF_FGND - STUFF A FOREGROUND OBJECT USING JUST THE FOREGROUND *
* INIT TABLE. EVERYTHING ELSE IS ZERO'D EXCEPT DMA INFO. *
* A0 = PTR TO THE OBJECT *
* A14 = PTR TO THE BORDER HEADER *
* RETURNS *
* A14 = POINTING TO WORD AFTER THE BORDER HEADER *
* *
**************************************************************************
STUFF_FGND
MMTM SP,A1,A2,A3,A4,A6,A7,A9,A10
MOVI DUMCOLL,A1
MOVE A1,*A0(OCVECT),L ;AHH SAFETY!
CLR A1
MOVE A1,*A0(OXVEL),L
MOVE A1,*A0(OYVEL),L
MOVE A1,*A0(OZVEL),L
MOVE A1,*A0(OZSIZ),L
MOVE *A14+,A9,W ;XVAL
SLL 16,A9
MOVE *A14+,A10,W ;YVAL
SLL 16,A10
MOVE *A14+,A1,L
MOVE A1,*A0(OIMG),L
MOVE *A14+,A4,W ;FLAGS
MOVE *A14+,A2,W ;SHOW ME SOME I.D.
MOVE A2,*A0(OID),W
MOVE @CURPAL,A2,W ;OCONST:OPAL
MOVE A2,*A0(OPAL),W
CALLA GSAGOF
CALLA GANIOF ;ADJUST ANIMATION OFFSET
SUB A6,A9 ;SUBTRACT X ANIOFF
SUB A7,A10 ;SUBTRACT Y ANIOFF
MOVE A9,*A0(OXVAL),L
MOVE A10,*A0(OYVAL),L
MOVE A1,*A0(OIMG),L
MOVE A3,*A0(OSAG),L
MOVE A2,*A0(OSIZE),L
MOVE A4,*A0(OFLAGS),L
MOVE *A14+,A2,W ;GRAB THE Z FLAG
JRZ STUFF_ZPOS
CMPI 1,A2
JREQ STUFF_MZPOS
CALLA SET_TZPOS ;FLATTEN THE OBJECT
JRUC STUFF_X
STUFF_MZPOS:
CALLA SET_MZPOS ;MIDDLE Z POSITION SET
JRUC STUFF_X
STUFF_ZPOS:
CALLA SET_ZPOS ;BOTTOM Z POSITION SET
JRUC STUFF_X
STUFF_X:
MMFM SP,A1,A2,A3,A4,A6,A7,A9,A10
RETS
**************************************************************************
* *
* BTYPE_CK - CHECK THE TYPE OF BACKGROUND WE ARE DEALING WITH. *
* *
* RETURNS: *
* A0 = 0 IF THIS IS A WATER DEATH *
* A0 = 1 IF THIS IS A LAVA DEATH *
* Z = A0 = 0 *
* NZ = A0 <> 0 *
* *
**************************************************************************
BTYPE_CK:
MOVE @BGND_TYPE,A0,W
CMPI BTYPE_LAVA,A0
JREQ BTC_LAVA
CMPI BTYPE_CRAY,A0
JREQ BTC_LAVA
CLR A0
JRUC BTC_X
BTC_LAVA:
MOVK 1,A0
BTC_X:
MOVE A0,A0
RETS
*UNUSED BACKGROUND CODE COMMENTED OUT 4/2/90 GNP
.if 0
**************************************************************************
* *
* BBOFSCRN - EACH OBJECT IN THE BACKGROUND BLOCK LIST IS CHECKED TO *
* SEE IF IT SHOULD GO ON OR OFF THE SCREEN, A 1 IN THE *
* DATA AREA OF THE BLOCK MEANS IT IS ON SCREEN. *
* *
**************************************************************************
BBOFSCRN
calla BGND_UD1 ;UPDATE PRIMARY BACKGROUND
calla BGND_UD2 ;UPDATE SECONDARY BACKGROUND
MOVE @WORLDTL,@PREVWTL,L ;SAVE THESE
MOVE @SCRNTL,@PREVSTL,L
BBOFSL
SLEEP 1
*DETERMINE IF ENOUGH CHANGE HAS OCCURED TO MERIT UPDATE
MOVK 10,A2 ;YES, IT'S BUFFER MAN
MOVE @WORLDTL,A0,L ;CHECK WORLDTL DELTA Y,X
MOVE @PREVWTL,A1,L
SUBXY A0,A1
MOVY A1,A0
ZEXT A1
SRA 16,A0
ABS A0
ABS A1
CMP A2,A0
JRHI BBOFSCRN ;ENOUGH DELTA Y
CMP A2,A1
JRHI BBOFSCRN ;ENOUGH DELTA X
MOVE @SCRNTL,A0,L ;CHECK SCRNTL DELTA Y,X
MOVE @PREVSTL,A1,L
SUBXY A0,A1
MOVY A1,A0
ZEXT A1
SRA 16,A0
ABS A0
ABS A1
CMP A2,A0
JRHI BBOFSCRN ;ENOUGH DELTA Y
CMP A2,A1
JRHI BBOFSCRN ;ENOUGH DELTA X
JRUC BBOFSL
**************************************************************************
* *
* BGNDHGHT - ROUTINE TO DETERMINE THE HEIGHT OF THE CURRENT BACKGROUND *
* AT A GIVEN X COORDINATE. *
* A0 = XPOS TO CHECK HEIGHT *
* RETURNS: *
* *
* A0 = Y HEIGHT OF PRIMARY BACKGROUND AT THAT XPOS *
* A0 = 0 IF XPOS IS INVALID *
* *
**************************************************************************
BGNDHGHT:
mmtm SP,A1,A2,A3,A4,A7,A8,A9,A10,A11
move A0,A1
clr A10 ;init packed y:x starting position
clr A11
move @BAKMODS,A0,L ;* A0- ptr to the module list
ModLp0:
move *A0+,A8,L ;load module ptr
cmpi >FFFFFFFF,A8
jrz ModX0 ;end of the module tbl
move *A8+,A9,L ;load packed y:x size
move *A0+,A3,W ;X start position
zext A3,W
cmpi BLSTSTRT,A3
jrnz NotLstStrtX
move A11,A3
subxy A9,A3
jruc GotNewX0
NotLstStrtX:
cmpi BLSTEND,A3
jrnz GotNewX0
move A11,A3
GotNewX0:
move *A0+,A4,W ;Y start position
zext A4,W
cmpi BLSTSTRT,A4
jrnz NotLstStrtY
move A11,A4
subxy A9,A4
jruc GotNewY0
NotLstStrtY:
cmpi BLSTEND,A4
jrnz NotLstEndY
move A11,A4
jruc GotNewY0
NotLstEndY:
sll 16,A4
GotNewY0:
movy A4,A3
move A3,A10
; cmpxy A10,A1
; jrv ModX0 ;jump to exit loop if Mod start X > X sought
;if Mod end X < X sought keep searching mod list
move A10,A11
addxy A9,A11 ;A11 is module y:x end
move *A8+,A9,W ;load # of blocks
add A9,A7 ;A7 is new BAKBITS ptr
cmpxy A11,A1
jrnv ModLp0 ;skip if Ax < Bx
move A10,A0
srl 16,A0
jruc GotHGHT
ModX0:
clr A0
GotHGHT:
mmfm SP,A1,A2,A3,A4,A7,A8,A9,A10,A11
rets
**************************************************************************
* *
* BAK_END - ROUTINE TO SCAN A MODULE LIST AND RETURN ITS [Y,X] ENDING *
* WORLD COORDINATE. *
* A0 = MODULE LIST TO SCAN *
* RETURNS: *
* A0 = [Y,X] WORLD ENDPOINT OF MODULE *
* *
**************************************************************************
BAK_END:
mmtm SP,A3,A4,A8,A9,A10,A11
clr A10 ;clr packed y:x starting position
clr A11
WEModLp:
move *A0+,A8,L ;load module ptr
cmpi >FFFFFFFF,A8
jrz WEModX ;end of the module tbl
move *A8+,A9,L ;load packed y:x size
move *A0+,A3,W ;X start position
zext A3,W
cmpi BLSTSTRT,A3
jrnz WENotLastStartX
move A11,A3
subxy A9,A3
jruc WEGotNewX
WENotLastStartX:
cmpi BLSTEND,A3
jrnz WEGotNewX
move A11,A3
WEGotNewX:
move *A0+,A4,W ;Y start position
zext A4,W
cmpi BLSTSTRT,A4
jrnz WENotLastStartY
move A11,A4
subxy A9,A4
jruc WEGotNewY
WENotLastStartY:
cmpi BLSTEND,A4
jrnz WENotLastEndY
move A11,A4
jruc WEGotNewY
WENotLastEndY:
sll 16,A4
WEGotNewY:
movy A4,A3
move A3,A10
move A10,A11
addxy A9,A11 ;A11 is module y:x end
jruc WEModLp
WEModX:
move A11,A0
mmfm SP,A3,A4,A8,A9,A10,A11
rets
**************************************************************************
* *
* BAK_START - ROUTINE TO FIND THE [Y,X] WORLD STARTING COORDINATE OF *
* A GIVEN MODULE LIST. *
* A0 = MODULE LIST *
* RETURNS: *
* A0 = [Y,X] STARTING POINT *
* *
**************************************************************************
BAK_STRT:
mmtm SP,A3,A4,A8,A9,A11
clr A11
move *A0+,A8,L ;load module ptr
cmpi >FFFFFFFF,A8
jrz WSModX ;end of the module tbl
move *A8+,A9,L ;load packed y:x size
move *A0+,A3,W ;X start position
zext A3,W
cmpi BLSTSTRT,A3
jrnz WSNotLastStartX
move A11,A3
subxy A9,A3
jruc WSGotNewX
WSNotLastStartX:
cmpi BLSTEND,A3
jrnz WSGotNewX
move A11,A3
WSGotNewX:
move *A0+,A4,W ;Y start position
zext A4,W
cmpi BLSTSTRT,A4
jrnz WSNotLastStartY
move A11,A4
subxy A9,A4
jruc WSGotNewY
WSNotLastStartY:
cmpi BLSTEND,A4
jrnz WSNotLastEndY
move A11,A4
jruc WSGotNewY
WSNotLastEndY:
sll 16,A4
WSGotNewY:
movy A4,A3
move A3,A0
WSModX:
mmfm SP,A3,A4,A8,A9,A11
rets
.endif
.DATA
**************************************************************************
* *
* FOREGROUND TABLES *
* *
**************************************************************************
FOREGROUNDV2:
.LONG [SKYTOPOF+61,165],VOLCTIP
.WORD DMAWNZ,JUNKOID,0
DUMFGND:
.LONG 0
**************************************************************************
* *
* BACKGROUND TABLES FOR EACH WAVE *
* *
**************************************************************************
BACKGROUND1:
.LONG WAVE1BMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUND2:
.LONG WAVE2BMOD
.WORD 5,5+SKYTOPOF
.LONG 0FFFFFFFFH
LAVABGND1:
.LONG WAVEV2BMOD
.WORD 6,6+SKYTOPOF
.LONG 0FFFFFFFFH
LAVABGND2:
.LONG WAVEV1BMOD
.WORD 6,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDE:
.LONG TROGENTBMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDC:
.LONG CLUBLANDBMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDW:
.LONG WEELANDBMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDS:
.LONG SPRING2BMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDCRAY:
.LONG CRAYOLABMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDDSRT:
.LONG DESERT1BMOD
.WORD 5,6+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDX2:
.LONG WAVEX2BMOD
.WORD 5,5+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDX3:
.LONG WAVEX3BMOD
.WORD 5,5+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDX5:
.LONG WAVEX5BMOD
.WORD 6,10+SKYTOPOF
.LONG 0FFFFFFFFH
BACKGROUNDX6:
.LONG WAVEX6BMOD
.WORD 5,5+SKYTOPOF
.LONG 0FFFFFFFFH
**************************************************************************
* *
* MISCELLANEOUS BACKGROUND DEFINITIONS *
* *
**************************************************************************
TROGCAVE1:
.LONG CAVE1BMOD
.WORD -3,-6+SKYTOPOF
.LONG 0FFFFFFFFH
TROGCAVE2:
.LONG CAVE1BMOD
.WORD -3,0
.LONG 0FFFFFFFFH
****TROGBLACKBOARD:
**** .LONG BLACKBO1BMOD
**** .WORD 48,89
**** .LONG 0FFFFFFFFH
CREDITBGND:
.LONG CREDITS1BMOD
.WORD 0,5
.LONG 0FFFFFFFFH