Moved SHR cursor code to mainmem

This commit is contained in:
Bobbi Webber-Manners 2023-01-16 22:47:04 -05:00
parent 93588a6a8d
commit 24669a7ce0
3 changed files with 83 additions and 59 deletions

Binary file not shown.

View File

@ -119,70 +119,25 @@ SHRPRCHAR LDX VDUPIXELS ; Pixels per byte
* VS read cursor / VC write cursor
* The read and write cursors have separate save-unders in :SAVEBYTES
SHRCURSOR PHP ; Preserve flags
PHA ; Preserve character
PHA ; Preserve A
LDA VDUSTATUS ; If VDU5 mode, bail
AND #$20
BNE :BAIL
LDA VDUPIXELS ; Pixels per byte
CMP #$02 ; 2 is 320-mode (MODE 1)
BNE :MODE0
LDA #$04 ; 4 bytes in 320 mode
LDX #$71 ; White/red
BRA :S1
:MODE0 LDA #$02 ; 2 bytes in 640 mode
LDX #%11011101 ; White/red/white/red
:S1 STA :BYTES ; Bytes per char
STX :CURSBYTE
LDA #$E1
STA VDUBANK2
BNE SHRCURSBAIL
JSR SHRCHARADDR ; Screen addr in VDUADDR
LDA VDUADDR+0 ; LSB
CLC
ADC #<$460 ; $460 is seven rows
STA VDUADDR+0
LDA VDUADDR+1 ; MSB
ADC #>$460 ; $460 is seven rows
STA VDUADDR+1
LDY #$00
LDX #$00
PLA ; Recover character
PLP ; Recover flags
BVC :S2 ; VC: Write cursor
INX ; Advance to 2nd half of :SAVEBYTES
INX
INX
INX
:S2 BCC :CURSOROFF ; CC: Remove cursor
:CURSORON
LDA [VDUADDR],Y ; See if cursor shown
CMP :CURSBYTE
BEQ :DONE ; Cursor shown already, skip
:L1 LDAL [VDUADDR],Y
STA :SAVEBYTES,X ; Preserve bytes under cursor
LDA :CURSBYTE ; Byte of cursor data
STAL [VDUADDR],Y
INX
INY
CPY :BYTES
BNE :L1
>>> WRTMAIN
LDA VDUADDR+0 ; Copy addr to SHRVDUQ
STA SHRVDUQ+0
LDA VDUADDR+1
STA SHRVDUQ+1
>>> WRTAUX
PLA ; Recover A
PLY ; Flags -> Y
>>> XF2MAIN,SHRCURSM
SHRCURSRET >>> ENTAUX
RTS
:CURSOROFF
LDA [VDUADDR],Y ; See if cursor shown
CMP :CURSBYTE
BNE :DONE ; Cursor not shown, skip
:L2 LDA :SAVEBYTES,X ; Restore bytes under cursor
STAL [VDUADDR],Y
INX
INY
CPY :BYTES
BNE :L2
:DONE RTS
:BAIL PLA ; Fix stack
PLA
SHRCURSBAIL PLA
PLP
RTS
:BYTES DB $00 ; 2 for 640-mode, 4 for 320-mode
:CURSBYTE DB $00 ; Cursor byte for mode
:SAVEBYTES DS 8 ; Bytes under cursors
* Write character to SHR screen in 320 pixel mode
@ -689,6 +644,7 @@ SHRSETGCOL PHA
>>> WRTAUX
RTS
* Wrapper to call SHRDEFPALM (which sets up default palette)
SHRDEFPAL >>> XF2MAIN,SHRDEFPALM
SHRDEFPALRET >>> ENTAUX

View File

@ -275,6 +275,74 @@ SHRCHAR640 PHY ; Preserve Y
RTS
* Handle plotting & unplotting cursors
* On entry: character in A, flags in Y
* pointer to screen address in SHRVDUQ+0..1
SHRCURSM >>> ENTMAIN
PHY ; Preserve flags
PHA ; Preserve character
LDA SHRVDUQ+0 ; Copy pointer to A3L/H
STA A3L
LDA SHRVDUQ+1
STA A3H
LDA #$E1 ; Bank $E1
STA A4L
LDA SHRPIXELS ; Pixels per byte
CMP #$02 ; 2 is 320-mode (MODE 1)
BNE :MODE0
LDA #$04 ; 4 bytes in 320 mode
LDX #$71 ; White/red
BRA :S1
:MODE0 LDA #$02 ; 2 bytes in 640 mode
LDX #%11011101 ; White/red/white/red
:S1 STA :BYTES ; Bytes per char
STX :CURSBYTE
LDA A3L ; LSB
CLC
ADC #<$460 ; $460 is seven rows
STA A3L
LDA A3H ; MSB
ADC #>$460 ; $460 is seven rows
STA A3H
LDY #$00
LDX #$00
PLA ; Recover character
PLP ; Recover flags
BVC :S2 ; VC: Write cursor
INX ; Advance to 2nd half of :SAVEBYTES
INX
INX
INX
:S2 BCC :CURSOROFF ; CC: Remove cursor
:CURSORON
LDAL [A3L],Y ; See if cursor shown
CMP :CURSBYTE
BEQ :DONE ; Cursor shown already, skip
:L1 LDAL [A3L],Y
STA :SAVEBYTES,X ; Preserve bytes under cursor
LDA :CURSBYTE ; Byte of cursor data
STAL [A3L],Y
INX
INY
CPY :BYTES
BNE :L1
>>> XF2AUX,SHRCURSRET
:CURSOROFF
LDAL [A3L],Y ; See if cursor shown
CMP :CURSBYTE
BNE :DONE ; Cursor not shown, skip
:L2 LDA :SAVEBYTES,X ; Restore bytes under cursor
STAL [A3L],Y
INX
INY
CPY :BYTES
BNE :L2
:DONE >>> XF2AUX,SHRCURSRET
:BYTES DB $00 ; 2 for 640-mode, 4 for 320-mode
:CURSBYTE DB $00 ; Cursor byte for mode
:SAVEBYTES DS 8 ; Bytes under cursors
* VDU5 plot char at graphics cursor position
SHRVDU5CH >>> ENTMAIN
CLC ; 65816 native mode