483 lines
12 KiB
NASM
483 lines
12 KiB
NASM
.MLIB "TROGMACS.LIB"
|
||
.FILE 'TROGPALL.ASM'
|
||
.TITLE " <<< T R O G -- PALETTE ALLOCATOR V1.0 >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
|
||
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
|
||
.INCLUDE "SYSINC.ASM" ;Zunit system equates
|
||
.INCLUDE "MPROCEQU.ASM"
|
||
.INCLUDE "DISPEQU.ASM"
|
||
.INCLUDE "TROGEQU.ASM"
|
||
|
||
.DEF PALSET, INIT_PAL
|
||
|
||
.TEXT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_PALID - ROUTINE TO RETURN THE I.D. OF AN ALLOCATED PALETTE. *
|
||
* A0 = CURRENT PALETTE NUMBER *
|
||
* RETURNS: *
|
||
* A0 = PALETTE I.D. *
|
||
* *
|
||
**************************************************************************
|
||
GET_PALID
|
||
PUSH A1
|
||
SLL 24,A0
|
||
.IF YUNIT
|
||
SRL 28,A0
|
||
.ELSE
|
||
SRL 24,A0
|
||
.ENDIF
|
||
MOVI PALRSIZ,A1
|
||
MPYU A0,A1
|
||
ADDI PALRAM,A1
|
||
MOVE *A1,A0,L
|
||
PULL A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CHANGE_PAL - CHANGE AN OBJECTS CURRENT PALETTE TO A NEW ONE. *
|
||
* DELETES THE OBJECTS OLD PALETTE. *
|
||
* IF NO NEW PALETTES ARE AVAILABLE, THEN PALETTE *
|
||
* 0 IS STUFFED. *
|
||
* A0 = I.D. OF NEW PALETTE *
|
||
* A8 = OBJECT *
|
||
* RETURNS: *
|
||
* Z = FAILURE ALLOCATING NEW PALETTE *
|
||
* A0 = 0 *
|
||
* NZ = PALETTE CHANGE SUCCESSFUL. *
|
||
* A0 = NEW PALETTE NUMBER *
|
||
* *
|
||
**************************************************************************
|
||
CHANGE_PAL
|
||
CALLR DELETE_PAL ;DELETE OLD
|
||
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
JRNZ CP_SUCCESS ;BR = USE IT
|
||
MOVE *A8(OPAL),A0,W ;GET THE OLD PALETTE
|
||
CALLA GET_PALID
|
||
CALLA GETFPAL ;RESTORE OLD ASSIGNMENT
|
||
CP_SUCCESS
|
||
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELETE_PAL - DELETE AN OBJECTS PALETTE *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
DELETE_PAL:
|
||
PUSH A0
|
||
MOVE A8,A0
|
||
CALLR DELPAL
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELPAL - DELETE AN OBJECTS PALETTE *
|
||
* A0 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
DELPAL
|
||
PUSH A0
|
||
MOVE *A0(OPAL),A0,W
|
||
CALLR FREEPAL
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FINDPAL - FIND THE COLOR MAP # TO WHICH THE GIVEN PALETTE IS ASSIGNED. *
|
||
* A0 = 32 BIT PALETTE ADDRESS *
|
||
* RETURNS: *
|
||
* Z BIT SET = PALETTE NOT FOUND ---> A0 = 0 *
|
||
* Z BIT CLR = PALETTE FOUND ---> A0 = PALETTE #(CORRECT FORMAT FOR DMA) *
|
||
* *
|
||
**************************************************************************
|
||
FINDPAL
|
||
MMTM SP,A1,A2,A3
|
||
MOVK NUMPAL,A3
|
||
MOVI PALRAM,A1
|
||
FINDPAL0
|
||
MOVE *A1,A2,L ;GET PALETTE ID
|
||
CMP A0,A2
|
||
JREQ FINDPAL1 ;FOUND
|
||
ADDI PALRSIZ,A1
|
||
DSJS A3,FINDPAL0
|
||
CLR A0 ;SET Z BIT ---> FAILURE
|
||
JRUC FINDPALX
|
||
FINDPAL1
|
||
SUBK NUMPAL,A3 ;COMPUTE PALETTE #
|
||
NEG A3
|
||
MOVE A3,A0 ;RETURN PALETTE #
|
||
SLL 8,A3
|
||
ADD A3,A0 ;DOUBLE IT UP FOR LOFFREDO BRAIN DAMAGE
|
||
.IF YUNIT
|
||
SLL 4,A0
|
||
.ENDIF
|
||
INC A3 ;CLR Z BIT ---> SUCCESS
|
||
FINDPALX
|
||
MMFM SP,A1,A2,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INITPAL - GET A PALETTE FOR USE *
|
||
* A14 = POINTER TO OBJECT INITIALIZATION TABLE *
|
||
* RETURNS: *
|
||
* ZBIT SET = FAILURE *
|
||
* ZBIT CLR = SUCCESS --> VAR. CURPAL = PALETTE # JUST CREATED *
|
||
* *
|
||
**************************************************************************
|
||
INITPAL
|
||
MMTM SP,A0
|
||
MOVE *A14(INITIMG),A0,L
|
||
MOVE *A0(ICMAP),A0,L ;GET THE PALETTE NAME
|
||
CALLR GETFPAL ;GET A PALETTE
|
||
JRZ INITPALX ;SUCCESSFUL PALETTE CREATION
|
||
MOVE A0,@CURPAL,W ;STUFF THIS IN CURRENT PAL
|
||
INITPALX
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INIT_PAL - GET A PALETTE FOR USE. THIS IS THE NEW VERSION. *
|
||
* A1 = POINTER TO IMAGE HEADER *
|
||
* RETURNS: *
|
||
* Z = FAILURE *
|
||
* A0 = 0 *
|
||
* NZ = SUCCESS *
|
||
* A0 = PALETTE NUMBER *
|
||
* *
|
||
**************************************************************************
|
||
INIT_PAL
|
||
MOVE *A1(ICMAP),A0,L ;GET THE PALETTE NAME
|
||
JRUC GETFPAL ;GET A PALETTE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* INITBPAL - GET A BACKGROUND PALETTE FOR USE *
|
||
* A14 = POINTER TO OBJECT INITIALIZATION TABLE *
|
||
* RETURNS: *
|
||
* ZBIT SET = FAILURE *
|
||
* ZBIT CLR = SUCCESS --> VAR. CURPAL = PALETTE # JUST CREATED *
|
||
* *
|
||
**************************************************************************
|
||
INITBPAL
|
||
MMTM SP,A0
|
||
MOVE *A14(INITIMG),A0,L
|
||
MOVE *A0(ICMAP),A0,L ;GET THE PALETTE NAME
|
||
CALLR GETBPAL ;GET A BACKGROUND PALETTE
|
||
JRZ INITBPLX ;SUCCESSFUL PALETTE CREATION
|
||
MOVE A0,@CURPAL,W ;STUFF THIS IN CURRENT PAL
|
||
INITBPLX
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
*
|
||
*CLEAR OUT PALETTE ALLOCATION RAM
|
||
*
|
||
CLRPAL:
|
||
MMTM SP,A0,A1,A2
|
||
MOVI FPALRAM,A0,L ;GET ADDRESS OF RAM
|
||
MOVI PALRSIZ*NUMPAL/16,A2 ;GET # OF WORDS
|
||
CLR A1
|
||
CLRPALP:
|
||
MOVE A1,*A0+,W
|
||
DSJS A2,CLRPALP
|
||
CLRPTR:
|
||
MOVI PTRRAM,A0,L ;GET ADDRESS OF RAM
|
||
MOVI PTRSIZ*NUMPTR/16,A2 ;GET # OF WORDS
|
||
CLRPLP1:
|
||
MOVE A1,*A0+,W
|
||
DSJS A2,CLRPLP1
|
||
MMFM SP,A0,A1,A2
|
||
RETS
|
||
*
|
||
*CLEAR ONLY FOREGROUND PALETTES
|
||
CLRFPAL:
|
||
MMTM SP,A0,A1,A2
|
||
MOVI FPALRAM,A0,L ;GET ADDRESS OF RAM
|
||
MOVI PALRSIZ*NMFPAL/16,A2 ;GET # OF WORDS
|
||
CLR A1
|
||
JRUC CLRPALP
|
||
*
|
||
*CLEAR ONLY BACKGROUND PALETTES
|
||
CLRBPAL:
|
||
MMTM SP,A0,A1,A2
|
||
MOVI BPALRAM,A0,L ;GET ADDRESS OF RAM
|
||
MOVI PALRSIZ*NMBPAL/16,A2 ;GET # OF WORDS
|
||
CLR A1
|
||
JRUC CLRPALP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETFPAL - ALLOCATE A FOREGROUND PALETTE, IF THERE ARE NO FOREGROUND *
|
||
* PALETTES LEFT, THEN IT WILL ATTEMPT TO ALLOCATE A *
|
||
* BACKGROUND PALETTE. *
|
||
* A0 = PALETTE ID (ADDRESS OF COLOR DATA) *
|
||
* RETURNS: *
|
||
* Z = FAILURE, NO PALETTES FREE *
|
||
* A0 = 0 *
|
||
* NZ = PALETTE ALLOCATED *
|
||
* A0 = COLOR MAP (0000 - 0F0F) *
|
||
* *
|
||
**************************************************************************
|
||
GETFPAL:
|
||
MMTM SP,A1,A2,A3
|
||
CMPI ROM,A0
|
||
JRHS GETFPAL_OK
|
||
LOCKUP
|
||
CLR A0
|
||
JRUC GETPLX
|
||
GETFPAL_OK:
|
||
*CHECK IF PALETTE ALREADY EXISTS
|
||
MOVK NUMPAL,A3
|
||
MOVI PALRAM,A1
|
||
GETPL0:
|
||
MOVE *A1,A2,L ;GET PALETTE ID
|
||
CMP A0,A2
|
||
JREQ GETPL3 ;ALREADY IN COLOR RAM
|
||
ADDI PALRSIZ,A1
|
||
DSJS A3,GETPL0
|
||
|
||
*CHECK FOR A SPARE PALETTE
|
||
MOVI FPALRAM,A1
|
||
MOVK NMFPAL,A3 ;CHECK ALL PALETTES
|
||
GETPL1:
|
||
MOVE *A1(PALCNT),A2,W
|
||
JREQ GTFPL2 ;PALETTE EMPTY, GRAB IT
|
||
ADDI PALRSIZ,A1
|
||
DSJS A3,GETPL1
|
||
|
||
JRUC GETFPAL_2ND ;NO FOREGROUND PALETTES, STEAL A BACKGROUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETBPAL - ALLOCATE A BACKGROUND PALETTE *
|
||
* A0 = PALETTE ID (ADDRESS OF COLOR DATA) *
|
||
* RETURNS: *
|
||
* Z = FAILURE, NO PALETTES FREE *
|
||
* NZ = PALETTE ALLOCATED (A0 = COLOR MAP (0000 - 0F0F)) *
|
||
* *
|
||
**************************************************************************
|
||
GETBPAL:
|
||
MMTM SP,A1,A2,A3
|
||
CMPI ROM,A0
|
||
JRHS GETBPAL_OK
|
||
LOCKUP
|
||
CLR A0
|
||
JRUC GETPLX
|
||
GETBPAL_OK:
|
||
*CHECK IF PALETTE ALREADY EXISTS
|
||
MOVK NUMPAL,A3
|
||
MOVI PALRAM,A1
|
||
GTBPL0:
|
||
MOVE *A1,A2,L ;GET PALETTE ID
|
||
CMP A0,A2
|
||
JREQ GETPL3 ;ALREADY IN COLOR RAM
|
||
ADDI PALRSIZ,A1
|
||
DSJS A3,GTBPL0
|
||
|
||
*CHECK FOR A SPARE BACKGROUND PALETTE
|
||
*ALSO A SECOND CHANCE FOR FOREGROUND ALLOCATION
|
||
GETFPAL_2ND:
|
||
MOVI BPALRAM,A1
|
||
MOVK NMBPAL,A3 ;CHECK ALL PALETTES
|
||
GTBPL1:
|
||
MOVE *A1(PALCNT),A2,W
|
||
JREQ GETPL2 ;PALETTE EMPTY, GRAB IT
|
||
ADDI PALRSIZ,A1
|
||
DSJS A3,GTBPL1
|
||
*** MOVE A3,A3 ;NO PALETTES LEFT SET ZERO BIT
|
||
CLR A0 ;NO PALETTES DEFAULT 0 AND
|
||
JRUC GETPLX ;SPLIT
|
||
*SETUP YOUR NEW PALETTE
|
||
GTFPL2:
|
||
ADDK NMBPAL,A3
|
||
GETPL2:
|
||
MMTM SP,A0,A1,A2
|
||
MOVE A3,A1 ;PALETTE #
|
||
SUBK NUMPAL,A1 ;COMPUTE PALETTE #
|
||
NEG A1
|
||
SLL 8,A1 ;X 256
|
||
MOVE *A0+,A2,W ;GET # COLORS IN PALETTE
|
||
CALLR PALSET ;SETUP PALETTE TRANSFER
|
||
MMFM SP,A0,A1,A2
|
||
JREQ GETPLX ;FAILED TO GET TRANSFER
|
||
MOVE A0,*A1,L ;STUFF PALETTE I.D.
|
||
GETPL3:
|
||
SUBK NUMPAL,A3 ;COMPUTE PALETTE #
|
||
NEG A3
|
||
MOVE A3,A0 ;RETURN PALETTE #
|
||
SLL 8,A3
|
||
ADD A3,A0 ;DOUBLE IT UP FOR LOFREDO BRAIN DAMAGE
|
||
.IF YUNIT
|
||
SLL 4,A0
|
||
.ENDIF
|
||
MOVE *A1(PALCNT),A2,W ;INCREMENT COUNT
|
||
ADDK 1,A2 ;SET NE FOR SUCCESS
|
||
MOVE A2,*A1(PALCNT),W
|
||
GETPLX:
|
||
MMFM SP,A1,A2,A3
|
||
RETS
|
||
*
|
||
*FREE A PALETTE
|
||
*A0=PALETTE # (0-NUMPAL) TO FREE
|
||
*
|
||
FREEPAL:
|
||
MMTM SP,A0,A1
|
||
SLL 24,A0 ;MASK OFF GARBAGE
|
||
.IF YUNIT
|
||
SRL 28,A0
|
||
.ELSE
|
||
SRL 24,A0
|
||
.ENDIF
|
||
CMPI NUMPAL,A0 ;ERROR...PALETTE NUMBER ERRONEOUS
|
||
JRLO FREEPAL1
|
||
LOCKUP
|
||
JRUC FREPLX
|
||
FREEPAL1
|
||
MOVI PALRSIZ,A1
|
||
MPYU A0,A1
|
||
ADDI PALRAM,A1
|
||
MOVE *A1(PALCNT),A0,W
|
||
DEC A0 ;DECREMENT ITS COUNT
|
||
JRNN FREEPAL2
|
||
LOCKUP
|
||
CLR A0
|
||
FREEPAL2
|
||
MOVE A0,*A1(PALCNT),W
|
||
FREPLX:
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
*
|
||
*UNGETPAL - Clears out a palettes allocation count
|
||
*A0=PALETTE # (0-NUMPAL) TO UNALLOCATE
|
||
*
|
||
UNGETPAL:
|
||
MMTM SP,A0,A1
|
||
SLL 24,A0 ;MASK OFF GARBAGE
|
||
.IF YUNIT
|
||
SRL 28,A0
|
||
.ELSE
|
||
SRL 24,A0
|
||
.ENDIF
|
||
CMPI NUMPAL,A0 ;ERROR...PALETTE NUMBER ERRONEOUS
|
||
JRLO UNGPAL1
|
||
|
||
LOCKUP
|
||
|
||
UNGPAL1
|
||
MOVI PALRSIZ,A1
|
||
MPYU A0,A1
|
||
ADDI PALRAM,A1
|
||
clr A0
|
||
MOVE A0,*A1(PALCNT),W
|
||
UNGPALX
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PALTRANS - ROUTINE TO ANY PALETTES TO COLOR RAM. *
|
||
* CALLED DURING VBLANK. *
|
||
* PTRRAM = PALETTE TRANSFER AREA *
|
||
* NOTE: TRASHES A0 - A13 *
|
||
* *
|
||
**************************************************************************
|
||
PALTRANS:
|
||
MOVI PTRRAM,A0
|
||
MOVK NUMPTR,A3 ;# OF PALETTES
|
||
PLTLP:
|
||
MOVE *A0,A4,W ;XFER TO DO
|
||
JREQ PLTX ;NO, QUIT
|
||
PLTGO:
|
||
CLR A1
|
||
MOVE A1,*A0+,W ;CLEAR OUT TRANFER COUNT
|
||
MOVE *A0+,A1,L ;SOURCE ADDRESS
|
||
MOVE *A0+,A2,W ;DESTINATION PALETTE
|
||
|
||
.IF YUNIT
|
||
*THIS IS FOR A FOUR BIT PER PIXEL SYSTEM WITH EACH PALETTE 100H APART.
|
||
MOVE A2,A5
|
||
SRL 8,A2
|
||
SLL 8,A2
|
||
SLL 24,A5
|
||
SRL 20,A5
|
||
OR A5,A2
|
||
.ELSE
|
||
*THIS IS FOR LARGER THAN FOUR BITS PER PIXEL EACH PALETTE 1000H APART.
|
||
SLL 4,A2 ;ADJUST FOR BIT ADDR
|
||
.ENDIF
|
||
|
||
ADDI COLRAM,A2 ;ADD IN COLOR RAM BASE ADDRESS
|
||
|
||
SRL 1,A4 ;ODD DATA COUNT
|
||
JRNC PLTGO1 ;NOPE
|
||
MOVE *A1+,*A2+,W
|
||
PLTGO1:
|
||
SRL 1,A4 ;/2 DATA COUNT
|
||
JRNC PLTGO2 ;NOPE
|
||
MOVE *A1+,*A2+,L
|
||
PLTGO2:
|
||
SRL 1,A4 ;/2 DATA COUNT
|
||
JRNC PLTGO3 ;NOPE
|
||
MOVE *A1+,*A2+,L
|
||
MOVE *A1+,*A2+,L
|
||
PLTGO3:
|
||
JREQ PLTGO4 ;DONE
|
||
MOVE *A1+,*A2+,L
|
||
MOVE *A1+,*A2+,L
|
||
MOVE *A1+,*A2+,L
|
||
MOVE *A1+,*A2+,L
|
||
DSJS A4,PLTGO3
|
||
PLTGO4:
|
||
DSJ A3,PLTLP ;DONE
|
||
PLTX:
|
||
RETS
|
||
|
||
*
|
||
*SETUP PALETTE TRANSFER
|
||
*CALLING PARAMETERS:
|
||
*A0= PALSRC = 32 BIT SOURCE ADDRESS OF PALETTE COLOR DATA
|
||
*A1= PALDEST = BIT 8-15 DESTINATION PALETTE | BIT 0-7 START COLOR
|
||
*A2= PLDCNT = 16 BIT COLOR COUNT
|
||
*RETURNS: EQ IF UNABLE TO SETUP TRANSFER, NE IF TRANSFER O.K.
|
||
*
|
||
PALSET:
|
||
MMTM SP,A3,A4,A5
|
||
MOVI PTRRAM,A4
|
||
MOVK NUMPTR,A3 ;# OF PALETTE TRANSFERS ALLOWED
|
||
PALSTL:
|
||
MOVE *A4,A5,W ;CELL TAKEN ?
|
||
JRNE PALST1 ;YES, KEEP LOOKING
|
||
MOVE A0,*A4(PALSRC),L ;NO, LOAD IT UP
|
||
MOVE A1,*A4(PALDEST),W
|
||
MOVE A2,*A4(PLDCNT),W
|
||
JRUC PALSTX
|
||
PALST1:
|
||
ADDI PTRSIZ,A4
|
||
DSJS A3,PALSTL
|
||
PALSTX:
|
||
MOVE A3,A3 ;RETURN EQ(NOT ABLE TO LOAD) OR NE (OK)
|
||
MMFM SP,A3,A4,A5
|
||
RETS
|
||
|
||
.END
|
||
|