789 lines
19 KiB
NASM
789 lines
19 KiB
NASM
.FILE 'BAKGND.ASM'
|
||
; SHELL PROGRAM - DO NOT MODIFY!
|
||
; MARK TURMELL - MAY 24, 1989
|
||
;
|
||
.TITLE "BACKGROUND HANDLERS"
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1988 WILLIAMS ELECTRONICS GAMES, INC. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
.OPTION B,D,L
|
||
.MNOLIST
|
||
|
||
* GET THE SYSTEM STUFF
|
||
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
|
||
.INCLUDE "DISP.EQU" ;DISPLAY PROCESSOR EQUATES
|
||
.INCLUDE "\VIDEO\SYS\GSP.INC" ;GSP ASSEMBLER EQUATES
|
||
.INCLUDE "\VIDEO\SYS\SYS.INC" ;ZUNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS, YEAH!
|
||
.INCLUDE "BGNDTBL.GLO" ;BACKGROUND EQUATES
|
||
|
||
;*BACKGROUND SYSTEM STUFF
|
||
.GLOBAL BAKBITS,BAKMODS,BAKLST,BGND_UD1
|
||
*GLOBALS IN THIS FILE
|
||
*RAM EQUATES
|
||
|
||
.GLOBL FREEPAL,GETBPAL
|
||
|
||
.BSS BGNDPALTBL,32,1
|
||
.BSS MOD_POS,32,1
|
||
.BSS BAKBITS,10000
|
||
; .BSS BAK2BITS,1000
|
||
.BSS BAKMODS,32
|
||
; .BSS BAK2MODS,32
|
||
.TEXT
|
||
|
||
*BACKGROUND UPDATER EQUATES
|
||
BLSTSTRT .EQU >8000
|
||
BLSTEND .EQU >8001
|
||
|
||
************* LOCAL CONSTANTS FOR UPD **************
|
||
;DISP_PAD .SET >00300030 ; Y:X
|
||
DISP_PAD .SET >00000000 ; 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
|
||
|
||
|
||
************************************************************************
|
||
BGNDHGHT:
|
||
;PARMS A0 - XPOS FOR WHICH HEIGHT OF BACKGROUND NEEDS TO BE DETERMINED
|
||
;RETURNS A0 -
|
||
; MINIMUM YPOS (MAX HEIGHT) OF PRIMARY BACKGROUND WHICH OVERLAPS
|
||
; SPECIFIED XPOS
|
||
; A0 = 0 IF XPOS IS INVALID
|
||
|
||
;* SCAN A MODULE LIST TO FIND OUT WHICH MODULE CONTAINS BLOCKS
|
||
;* WHICH NEED TO BE CHECKED
|
||
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
|
||
************************************************************************
|
||
|
||
**************************** 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 ********************************
|
||
|
||
|
||
*********************** BAK END *******************************
|
||
;* SCAN A MODULE LIST AND RETURN THE PACKED Y:X END POINT
|
||
;PARMS
|
||
;A0 - MODULE LIST
|
||
;RETURNS
|
||
;A0 - PACKED Y:X END OF WAVE
|
||
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 *******************************
|
||
;* SCAN A MODULE LIST AND RETURN THE PACKED Y:X STARTING POINT
|
||
;PARMS
|
||
;A0 - MODULE LIST
|
||
;RETURNS
|
||
;A0 - PACKED Y:X START OF WAVE
|
||
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
|
||
***********************************************************************
|
||
|
||
**************** 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
|
||
ZEXT A3
|
||
SRL 8,A3
|
||
** SLL 24,A3
|
||
** SRL 8,A3
|
||
MOVE A3,*A0(OZPOS),W
|
||
|
||
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
|
||
; CALLA GSAGOF
|
||
*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
|
||
|
||
.END
|
||
|