2019-09-23 23:57:03 +00:00
|
|
|
; C02 module vera.h02 assembly language subroutines
|
2019-09-25 19:56:26 +00:00
|
|
|
|
|
|
|
;getmod() - 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
|
|
|
|
RTS
|
|
|
|
|
|
|
|
;getenb() - 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
|
|
|
|
|
|
|
|
;getlrc() - Get Layer 0/1 Control Register
|
|
|
|
;Args: A = Layer (0/1)
|
|
|
|
;Affects: Y
|
|
|
|
;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
|
|
|
|
;Affects: Y
|
|
|
|
;Returns: A = Contents of Register
|
|
|
|
; X = Current Data Port
|
|
|
|
GETLRR: JSR GETLRP ;Get Layer Page in Y
|
2019-09-26 03:16:28 +00:00
|
|
|
JMP GETREG ;and Read Register Contents
|
2019-09-25 19:56:26 +00:00
|
|
|
|
|
|
|
;getlrp() - 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
|
|
|
|
|
|
|
|
;getchd(index, &array) - Read Character Data into Array
|
|
|
|
;Args: A = Character Index
|
|
|
|
; Y,X = Address of Array to Read into
|
|
|
|
;Destroys: TEMP0,TEMP1,TEMP2
|
|
|
|
;Returns: A = Number of Bytes Read
|
|
|
|
GETCHD: JSR SETDST ;Store Address in Destination Pointer
|
|
|
|
STA TEMP1 ;Set Offset LSB to Index
|
|
|
|
LDA #0 ;Set Offset MSB to Zero
|
|
|
|
ASL TEMP1 ;Multiple Offset by 2
|
|
|
|
ROL
|
|
|
|
STA TEMP2 ;and Store MSB
|
|
|
|
JSR GETLRI ;Get Tile Base
|
|
|
|
TXA ;Add Offset To Tile Base
|
|
|
|
CLC
|
|
|
|
ADC TEMP0
|
|
|
|
STA TEMP0
|
|
|
|
TYA
|
|
|
|
ADC TEMP1
|
|
|
|
STA TEMP1
|
|
|
|
LDA #0
|
|
|
|
ADC #0
|
|
|
|
JSR GETMBX ;Multiply by 4
|
|
|
|
ORA #$10 ;Set Auto-Increment to 1
|
|
|
|
JSR SETADR ;and Set Vera Address
|
|
|
|
LDA #8 ;Set Byte Count to 8
|
2019-09-26 03:16:28 +00:00
|
|
|
JMP GETMEA ;and Read Bytes into Array
|
2019-09-25 19:56:26 +00:00
|
|
|
|
|
|
|
;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)
|
|
|
|
;Destroys: TEMP1,TEMP2
|
|
|
|
;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 SAVRXY ;Save Integer in TEMP1,TEMP2
|
|
|
|
GETMBX: LDX #2 ;Do Twice
|
|
|
|
GETMBL: ASL TEMP1 ; Rotate LSB
|
|
|
|
ROL TEMP2 ; MSB and
|
|
|
|
ROL ; Bank Left
|
|
|
|
DEX
|
|
|
|
BNE GETMBL
|
|
|
|
JMP RESRXY ;Load LSB, MSB and Return
|
|
|
|
|
|
|
|
;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
|
2019-09-26 03:16:28 +00:00
|
|
|
JMP GETREI ;and Read Register Contents
|
2019-09-25 19:56:26 +00:00
|
|
|
|
|
|
|
;mapsiz() - Convert Map Size Specifier to Pixels
|
|
|
|
;Args: A = Map Size Specifier
|
|
|
|
;Affects: A
|
|
|
|
;Returns: Y,X Map Size in Pixels
|
|
|
|
MAPSIZ: TAX ;Copy Map Size Specifier to X
|
|
|
|
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
|
|
|
|
MAPSIL: .DC $20,$40,$80,$00
|
|
|
|
MAPSIH: .DC $00,$00,$00,$01
|
|
|
|
|
|
|
|
;tilsiz() - Convert Tile Size Specifier to Pixels
|
|
|
|
;Args: A = Tile Size Specifier
|
|
|
|
;Affects: A
|
|
|
|
;Returns: A Tile Size in Pixels
|
|
|
|
TILSIZ: TAX ;Copy Map Size Specifier to X
|
|
|
|
LDA TILSIT,X ;Load Pixels MSB from Table
|
|
|
|
RTS
|
|
|
|
TILSIT: .DC $08,$10
|
|
|
|
|
|
|
|
;gettsz() - Get Layer 0/1 Tile Size
|
|
|
|
|
|
|
|
;getmsz() - Get Layer 0/1 Map Size
|
|
|
|
;Args: A = Layer (0/1)
|
|
|
|
;Affects: X
|
|
|
|
;Returns: A = Map Width Specifier
|
|
|
|
; Y = Map Height Specifier
|
|
|
|
|
|
|
|
;settbs() - Set Layer 0/1 Map Base
|
|
|
|
;Args: A = Layer (0/1)
|
|
|
|
; Y,X = Map Base
|
|
|
|
;Sets: TEMP1,TEMP2 = Map Base
|
|
|
|
;Affecta: A,Y,X
|
|
|
|
SETTBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2
|
|
|
|
LDX #4 ;Set Register Offset
|
|
|
|
BNE SETLRI ;Write to Layer Register
|
|
|
|
|
|
|
|
;setmbs() - Set Layer 0/1 Map Base
|
|
|
|
;Args: A = Layer (0/1)
|
|
|
|
; Y,X = Map Base
|
|
|
|
;Sets: TEMP1,TEMP2 = Map Base
|
|
|
|
;Affecta: A,Y,X
|
|
|
|
SETMBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2
|
|
|
|
LDX #2 ;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
|
|
|
|
;Affecta: A,Y,X
|
|
|
|
SETVSC: JSR SAVRXY ;Store Vertical Scroll in TEMP1,TEMP2
|
|
|
|
LDX #8 ;Set Register Offset
|
|
|
|
BNE SETLRI ;Write to Layer Register
|
|
|
|
|
|
|
|
;sethsc() - Set Layer 0/1 Horizontal Scroll
|
|
|
|
;Args: A = Layer (0/1)
|
|
|
|
; Y,X = Map Base
|
|
|
|
;Sets: TEMP1,TEMP2 = Horizontal Scroll
|
|
|
|
;Affecta: 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
|
|
|
|
;Affecta: A,Y,X
|
|
|
|
SETLRI: JSR GETLRP ;Get Layer Page in Y
|
2019-09-26 03:16:28 +00:00
|
|
|
JMP SETREI ;and Write Integer to Register
|
2019-09-23 23:57:03 +00:00
|
|
|
|
|
|
|
|