1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-11-24 15:31:17 +00:00
C02/x16/include/veralyr.a02
2019-11-14 23:56:33 -05:00

385 lines
12 KiB
Plaintext

; Vera Layer Control Assembly Language Routines for C02
; Requires External Routines GETVRG, GETVRI, RESRXY, SAVREG, SAVRXY
; and External Variables TEMP0, TEMP1, TEMP2, TEMP3
;Layer 0/1 Registers
;$F2000/$F3000 Layer Control (Mode and Enabled)
;$F2001/$F3001 Tile and Map Height and Width
;$F2002/$F3002 Map Base Bits 9-2
;$F2003/$F3003 Map Base Bits 17-10
;$F2004/$F3004 Tile Base Bits 9-2
;$F2005/$F3005 Tile Base Bits 17-10
;$F2006/$F3006 Horizontal Scroll LSB
;$F2007/$F3007 Horizontal Scroll MSB or Bitmap Palette Offset
;$F2008/$F3008 Vertical Scroll LSB
;$F2009/$F3009 Vertical Scroll MSB
;getbpo(lyr) - Get Bitmap Palette Offset
;Args: A = Layer (0/1)
;Affects: Y
;Sets: TEMP3 = Register Offset
;Returns: A = Control Register Contents
; X = Current Data Port
GETBPO: LDX #7 ;Set Offset to Bitmap Palette Offset
JSR GETLRR ;Read Register
ASL ;and Multiply by 16
ASL
ASL
ASL
RTS
;getlrs(lyr) - Get Layer 0/1 Size Register
;Args: A = Layer (0/1)
;Affects: Y
;Sets: TEMP3 = Register Offset
;Returns: A = Size Register Contents
; X = Current Data Port
GETLRS: LDX #1 ;Set Offset to Size Register
.DC $2C ;Skip to GETLRR (BIT Absolute)
;getlrc(lyr) - Get Layer 0/1 Control Register
;Args: A = Layer (0/1)
;Affects: Y
;Sets: TEMP3 = Register Offset
;Returns: A = Control Register Contents
; X = Current Data Port
GETLRC: LDX #0 ;Set Offset to Control Register
;getlrr() - Get Layer 0/1 Register
;Args: A = Layer (0/1)
; X = Register Offset
;Sets: TEMP3 = Register Offset
;Affects: Y
;Returns: A = Contents of Register
; X = Current Data Port
GETLRR: STX TEMP3 ;Save Register Offset - Obselete?
JSR GETLRP ;Get Layer Page in Y
JMP GETVRG ;and Read Vera Register
;getlrp(lyr) - Get Layer 0/1 Register Page
;Args: A = Layer (0/1)
;Returns: A,Y = Layer Register Page
GETLRP: AND #$01 ;Isolate Bit 1
ASL ;Move to Left Nybble
ASL
ASL
ASL
ORA #$20 ;And Add to 2
TAY ;Return Page in Y
RTS
;getenb(lyr) - Get Layer 0/1 Enabled
;Args: A = Layer (0/1)
;Affects: Y
;Returns: A = $FF - Layer Enabled
; $00 - Layer Disabled
; X = Current Data Port
GETENB: JSR GETLRC ;Read Register
AND #$01 ;Isolate Bit 1
BEQ GETENX ;If Set
LDA #$FF ; Return TRUE
GETENX: RTS ;Else Return FALSE
;getmod(lyr) - Get Layer 0/1 Mode
;Args: A = Layer (0/1)
;Affects: Y
;Returns: A = Layer Mode
; X = Current Data Port
GETMOD: JSR GETLRC ;Read Register
LSR ;Shift Left Five Bits
LSR
LSR
LSR
LSR
RTS
;getmsz(lyr) - Get Layer 0/1 Map Size
;Args: A = Layer (0/1)
;Affects: X
;Returns: A = Width Specifier
; Y = Height Specifier
GETMSZ: JSR GETLRS ;Read Size Register
TAX ;Save Contents
LSR ;Shift Right 2 Bits
LSR
AND #$03 ;Isolate Bits 0 and 1
TAY ;and Return in Y
TXA ;Restore Register Contents
AND #$03 ;Return Bits 0 and 1 in A
RTS
;gettsz(lyr) - Get Layer 0/1 Map Size
;Args: A = Layer (0/1)
;Affects: X
;Returns: A = Width Specifier
; Y = Height Specifier
GETTSZ: JSR GETLRS ;Read Size Register
LSR ;Shift Right 4 Bits
LSR
LSR
LSR
TAX ;Save Intermediate Value
LSR ;Shift Right 1 More Bit
AND #$01 ;Isolate Bit 0
TAY ;and Return in Y
TXA ;Restore Intermediate Value
AND #$01 ;and Return Bit 0 in A
RTS
;getvsc() - Get Layer 0/1 Vertical Scroll
;Args: A = Layer (0/1)
;Returns: A,X = Vertical Scroll LSB
; Y = Vertical Scroll MSB
GETVSC: LDX #8 ;Set Register Offset
.DC $2C ;Skip to GETLRI (BIT Absolute)
;gethsc() - Get Layer 0/1 Horizontal Scroll
;Args: A = Layer (0/1)
;Returns: A,X = Horizontal Scroll LSB
; Y = Horizontal Scroll MSB
GETHSC: LDX #6 ;Set Register Offset
.DC $2C ;Skip to GETLRI (BIT Absolute)
;gettbs() - Get Layer 0/1 Tile Base
;Args: A = Layer (0/1)
;Returns: A,X = Tile Base LSB
; Y = Tile Base MSB
GETTBS: LDX #4 ;Set Register Offset
.DC $2C ;Skip to GETLRI (BIT Absolute)
;getmbs() - Get Layer 0/1 Map Base
;Args: A = Layer (0/1)
;Returns: A,X = Map Base LSB
; Y = Map Base MSB
GETMBS: LDX #2 ;Set Register Offset
;getlri() - Get Layer 0/1 Register Pair as Integer
;Args: A = Layer (0/1)
; X = Register Offset
;Returns: A,X = Integer LSB
; Y = Integer LSB
GETLRI: JSR GETLRP ;Get Layer Page in Y
JMP GETVRI ;and Read Register Contents
;gettba() - Get Layer 0/1 Tile Base Address
;Args: A = Layer (0/1)
;Destroys: TEMP1,TEMP2
;Returns: A = Tile Base Bank
; Y,X = Tile Base Address
GETTBA: LDX #4 ;Set Register Offset
.DC $2C ;Read Register Pair and Rotate
;getmba() - Get Layer 0/1 Map Base Address
;Args: A = Layer (0/1)
;Sets: TEMP0 = Bank
; TEMP1 = Address LSB
; TEMP2 = Address MSB
;Returns: A = Map Base Bank
; Y,X = Map Base Address
GETMBA: LDX #2 ;Set Register Offset
JSR GETLRI ;Read Register Pair as Integer
LDA #0 ;Initialize Page to 0
JSR SAVREG ;Save Integer in TEMP1,TEMP2
LDX #2 ;Set Count to 2
JMP ASLADR ;and Shift Address Left
;mapsiz() - Convert Map Size Specifier to Pixels
;Args: A = Map Size Specifier
;Affects: A
;Returns: A = Shift Count
; Y,X Map Size in Pixels
MAPSIZ: TAX ;Copy Size Specifier to X
LDA MAPSIC,X ;Load Shift Count from Table
PHA ;and Save it
LDA MAPSIH,X ;Load Pixels MSB from Table
TAY ;and Return in Y
LDA MAPSIL,X ;Load Pixels LSB from Table
TAX ;and Return in X
PLA ;Return Shift Count in A
RTS
MAPSIC: .DC $05,$06,$07,$08
MAPSIL: .DC $20,$40,$80,$00
MAPSIH: .DC $00,$00,$00,$01
;tilsiz() - Convert Tile Size Specifier to Pixels
;Args: A = Tile Size Specifier
;Returns: A = Tile Size in Pixels
; Y = Shift Count
TILSIZ: TAX ;Copy Map Size Specifier to X
LDA TILSIT,X ;Return Pixels in A
LDY TILSIC,X ;and Shift Count in Y
RTS
TILSIC: .DC $03,$04
TILSIT: .DC $08,$10
;setbpo(lyr) - Set Bitmap Palette Offset
;Args: A = Layer (0/1)
; Y = Bitmap Palette Offset
;Affects: Y
;Sets: TEMP3 = Register Offset
;Returns: A = Control Register Contents
; X = Current Data Port
SETBPO: PHA ;Save Layer Number
TYA ;Copy Offset to Accumulator
LSR ;Divide by 16
LSR
LSR
LSR
TAY ;Copy Back to Y
PLA ;Restore Layer Number
LDX #7 ;Set Register Offset
BNE SETLRR ;and Write to Register
;setenb(lyr,flg) - Get Layer 0/1 Enabled
;Args: A = Layer (0/1)
; Y = Layer Enabled Flags
;Destroys: TEMP0
;Affects: A,X,Y
SETENB: CPY #0 ;Test Enabled Argument`
BEQ SETENZ ;If Not Zero
LDY #$01 ; Set to 1
SETENZ: LDX #$FE ;Set Control Register Mask
;setlrc(lyr,val,msk) - Set Layer 0/1 Control Register
;Args: A = Layer (0/1)
; Y = Value to Write
; X = Register Mask
;Affects: Y
;Returns: A = Value Written
; X = Current Data Port
SETLRC: JSR SAVREG ;Save Layer, Value, and Mask
JSR GETLRC ;Get Layer Control Register
SETLRM: AND TEMP1 ;Apply Mask
ORA TEMP2 ;OR in Value
TAY ;and Move to Y Register
LDA TEMP0 ;Restore Layer Number
LDX TEMP3 ;Get Register Offset
;setlrr() - Set Layer 0/1 Register
;Args: A = Layer (0/1)
; Y = Value to Write
; X = Register Offset
;Affects: Y
;Returns: A = Contents of Register
; X = Current Data Port
SETLRR: ;.dc $ff
PHY ;Save Value to Write
JSR GETLRP ;Get Layer Page in Y
PLA ;Restore Value to Write
JMP SETREG ;and Write to Register
;setlrs(lyr,val,msk) - Set Layer 0/1 Size Register
;Args: A = Layer (0/1)
/; Y = Value to Write
; X = Register Mask
;Affects: Y
;Returns: A = Value Written
; X = Current Data Port
SETLRS: ;.dc $ff
JSR SAVREG ;Save Layer, Value, and Mask
JSR GETLRS ;Get Layer Size Register
BRA SETLRM ;Mask in Value and Write Back
;setmod() - Set Layer 0/1 Mode
;Args: A = Layer (0/1)
; Y = Layer Mode
;Destroys: TEMP0
;Affects: A,X,Y
SETMOD: TAX ;Save Layer Number
TYA ;Copy Mode to Accumulator
ASL ;Shift to Bits 5-7
ASL
ASL
ASL
ASL
TAY ;Copy Write Value to Y
TXA ;Restore Layer Number
LDX #$1F ;Set Control Register Mask
BNE SETLRC ;and Update Control Register
;setmsz(lyr) - Set Layer 0/1 Map Size
;Args: A = Layer (0/1)
; Y = Width Specifier
; X = Height Specifier
;Destroys: TEMP0
;Affects: A,X,Y
SETMSZ: PHA ;Save Layer Number
TXA ;Get Height Specifier
AND #$03 ;Strip High Bits
ASL ;Rotate Left 2 Bits
ASL
STA TEMP0 ;and Save It
TYA ;Get Width Specifier
AND #$03 ;Strip High Bits
ORA TEMP0 ;OR in Height Specifier
TAY ;Copy Write Value to Y
PLA ;Restore Layer Number
LDX #$F0 ;Set Size Register Mask
BNE SETLRS ;and Update Size Register
;settsz(lyr) - Set Layer 0/1 Tile Size
;Args: A = Layer (0/1)
; Y = Width Specifier
; X = Height Specifier
;Destroys: TEMP0
;Affects: A,X,Y
SETTSZ: PHA ;Save Layer Number
TXA ;Get Height Specifier
AND #$01 ;Strip High Bits
ASL ;Rotate Left 1 Bits
STA TEMP0 ;and Save It
TYA ;Get Width Specifier
AND #$01 ;Strip High Bits
ORA TEMP0 ;OR in Height Specifier
ASL ;Shift Left 4 More Bits
ASL
ASL
ASL
TAY ;Copy Write Value to Y
PLA ;Restore Layer Number
LDX #$CF ;Set Size Register Mask
BNE SETLRS ;and Update Size Register
;sethsc() - Set Layer 0/1 Horizontal Scroll
;Args: A = Layer (0/1)
; Y,X = Map Base
;Sets: TEMP1,TEMP2 = Horizontal Scroll
;Affects: A,Y,X
SETHSC: JSR SAVRXY ;Store Horizontal Scroll in TEMP1,TEMP2
LDX #6 ;Set Register Offset
;setlri() - Write Integer to Get Layer 0/1 Register
;Args: A = Layer (0/1)
; X = Register Offset
;Uses: TEMP1,TEMP2 = Integer Value
;Affects: A,Y,X
SETLRI: JSR GETLRP ;Get Layer Page in Y
JMP SETREI ;and Write Integer to Register
;setmbs() - Set Layer 0/1 Map Base
;Args: A = Layer (0/1)
; Y,X = Map Base
;Sets: TEMP1,TEMP2 = Map Base
;Affects: A,Y,X
SETMBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2
LDX #2 ;Set Register Offset
BNE SETLRI ;Write to Layer Register
;settbs() - Set Layer 0/1 Map Base
;Args: A = Layer (0/1)
; Y,X = Map Base
;Sets: TEMP1,TEMP2 = Map Base
;Affects: A,Y,X
SETTBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2
LDX #4 ;Set Register Offset
BNE SETLRI ;Write to Layer Register
;setvsc() - Set Layer 0/1 Vertical Scroll
;Args: A = Layer (0/1)
; Y,X = Map Base
;Sets: TEMP1,TEMP2 = Vertical Scroll
;Affects: A,Y,X
SETVSC: JSR SAVRXY ;Store Vertical Scroll in TEMP1,TEMP2
LDX #8 ;Set Register Offset
BNE SETLRI ;Write to Layer Register