trog/TROGPALL.ASM

483 lines
12 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 '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