mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-02 11:41:30 +00:00
Speed up 640-mode text drawing using exploded font table
This commit is contained in:
parent
32b129c859
commit
4f686de090
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
|
@ -218,6 +218,6 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error
|
||||||
RTS ; %000x1xxx host type, 'A'pple
|
RTS ; %000x1xxx host type, 'A'pple
|
||||||
BYTE00A BRK
|
BYTE00A BRK
|
||||||
DB $F7
|
DB $F7
|
||||||
HELLO ASC 'Applecorn MOS 2022-12-25-HOHOHO'
|
HELLO ASC 'Applecorn MOS 2022-12-26-HOHOHO'
|
||||||
DB $00 ; Unify MOS messages
|
DB $00 ; Unify MOS messages
|
||||||
|
|
||||||
|
|
100
auxmem.shr.s
100
auxmem.shr.s
|
@ -82,8 +82,7 @@ SHRTAB DB $20 ; Text row 0
|
||||||
|
|
||||||
|
|
||||||
* Enable SHR mode
|
* Enable SHR mode
|
||||||
SHRVDU22
|
SHRVDU22 LDA #$18 ; Inhibit SHR & aux HGR shadowing
|
||||||
LDA #$18 ; Inhibit SHR & aux HGR shadowing
|
|
||||||
TSB SHADOW
|
TSB SHADOW
|
||||||
LDA #$80 ; Most significant bit
|
LDA #$80 ; Most significant bit
|
||||||
TSB NEWVIDEO ; Enable SHR mode
|
TSB NEWVIDEO ; Enable SHR mode
|
||||||
|
@ -109,14 +108,35 @@ SHRVDU22
|
||||||
INY
|
INY
|
||||||
CPX #32 ; 32 bytes in palette
|
CPX #32 ; 32 bytes in palette
|
||||||
BNE :L2
|
BNE :L2
|
||||||
|
JSR SHRXPLDFONT ; Explode font -> SHRFONTXPLD table
|
||||||
JSR VDU12 ; Clear text and SHR screen
|
JSR VDU12 ; Clear text and SHR screen
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
* Write character to SHR screen
|
SHRFONTXPLD EQU $A000 ; Explode SHR font to $E1:A000
|
||||||
* On entry: A - character to write
|
|
||||||
* TODO: Make this faster!! It is horrible ATM
|
|
||||||
SHRPRCHAR SEC
|
* Explode font to generate SHRFONTXPLD table
|
||||||
|
* This is 2 bytes x 8 rows for each character in 640 mode
|
||||||
|
* or 4 bytes x 8 rows for each character in 320 mode
|
||||||
|
SHRXPLDFONT LDA #<SHRFONTXPLD ; Use VDUADDR to point to ..
|
||||||
|
STA VDUADDR+0 ; .. start of table to write
|
||||||
|
LDA #>SHRFONTXPLD
|
||||||
|
STA VDUADDR+1
|
||||||
|
LDA #$E1
|
||||||
|
STA VDUBANK
|
||||||
|
LDA #32 ; First char number
|
||||||
|
:L1 JSR SHRXPLDCHAR ; Explode char A
|
||||||
|
INC A
|
||||||
|
CMP #128 ; 96 chars in FONT8
|
||||||
|
BNE :L1
|
||||||
|
RTS
|
||||||
|
|
||||||
|
|
||||||
|
* Explode one character to location pointed to by VDUADDR
|
||||||
|
* On entry: A - character to explode
|
||||||
|
SHRXPLDCHAR PHA
|
||||||
|
SEC
|
||||||
SBC #32
|
SBC #32
|
||||||
STA ZP1+0 ; A*8 -> ZP1
|
STA ZP1+0 ; A*8 -> ZP1
|
||||||
STZ ZP1+1
|
STZ ZP1+1
|
||||||
|
@ -133,7 +153,6 @@ SHRPRCHAR SEC
|
||||||
LDA ZP1+1
|
LDA ZP1+1
|
||||||
ADC #>FONT8
|
ADC #>FONT8
|
||||||
STA ZP1+1
|
STA ZP1+1
|
||||||
JSR SHRCHARADDR ; Addr in VDUADDR
|
|
||||||
LDY #$00 ; First row of char
|
LDY #$00 ; First row of char
|
||||||
:L1 >>> RDMAIN
|
:L1 >>> RDMAIN
|
||||||
LDA (ZP1),Y ; Load row of font
|
LDA (ZP1),Y ; Load row of font
|
||||||
|
@ -144,10 +163,28 @@ SHRPRCHAR SEC
|
||||||
JSR SHRCHAR320
|
JSR SHRCHAR320
|
||||||
BRA :S2
|
BRA :S2
|
||||||
:S1 JSR SHRCHAR640
|
:S1 JSR SHRCHAR640
|
||||||
:S2 JSR SHRNEXTROW ; Add 160 to VDUADDR
|
:S2 LDX VDUPIXELS ; Pixels per byte
|
||||||
INY ; Next row of font
|
CPX #$02 ; 2 is 320-mode (MODE 1)
|
||||||
|
BNE :S3
|
||||||
|
CLC ; 320 mode: add 4 to VDUADDR
|
||||||
|
LDA VDUADDR+0
|
||||||
|
ADC #$04
|
||||||
|
STA VDUADDR+0
|
||||||
|
LDA VDUADDR+1
|
||||||
|
ADC #$00
|
||||||
|
STA VDUADDR+1
|
||||||
|
BRA :S4
|
||||||
|
:S3 CLC ; 640 mode: add 2 to VDUADDR
|
||||||
|
LDA VDUADDR+0
|
||||||
|
ADC #$02
|
||||||
|
STA VDUADDR+0
|
||||||
|
LDA VDUADDR+1
|
||||||
|
ADC #$00
|
||||||
|
STA VDUADDR+1
|
||||||
|
:S4 INY ; Next row of font
|
||||||
CPY #$08 ; Last row?
|
CPY #$08 ; Last row?
|
||||||
BNE :L1
|
BNE :L1
|
||||||
|
PLA
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,6 +241,51 @@ SHRCHAR640 PHY
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
|
* Write character to SHR screen
|
||||||
|
* On entry: A - character to write
|
||||||
|
* TODO: This is for 640 mode only at the moment
|
||||||
|
SHRPRCHAR SEC
|
||||||
|
SBC #32
|
||||||
|
STA VDUADDR2+0 ; A*16 -> VDUADDR2
|
||||||
|
STZ VDUADDR2+1
|
||||||
|
ASL VDUADDR2+0
|
||||||
|
ROL VDUADDR2+1
|
||||||
|
ASL VDUADDR2+0
|
||||||
|
ROL VDUADDR2+1
|
||||||
|
ASL VDUADDR2+0
|
||||||
|
ROL VDUADDR2+1
|
||||||
|
ASL VDUADDR2+0
|
||||||
|
ROL VDUADDR2+1
|
||||||
|
CLC ; SHRFONTXPLD+A*16 -> VDUADDR2
|
||||||
|
LDA VDUADDR2+0
|
||||||
|
ADC #<SHRFONTXPLD
|
||||||
|
STA VDUADDR2+0
|
||||||
|
LDA VDUADDR2+1
|
||||||
|
ADC #>SHRFONTXPLD
|
||||||
|
STA VDUADDR2+1
|
||||||
|
LDA #$E1
|
||||||
|
STA VDUBANK2
|
||||||
|
JSR SHRCHARADDR ; Screen addr in VDUADDR
|
||||||
|
LDX #$00 ; First row of char
|
||||||
|
:L1 LDY #$00
|
||||||
|
LDA [VDUADDR2] ; Load exploded font data 1st byte
|
||||||
|
STA [VDUADDR] ; Store on screen
|
||||||
|
INY
|
||||||
|
INC VDUADDR2+0 ; Increment exploded font ptr
|
||||||
|
BNE :S1
|
||||||
|
INC VDUADDR2+1
|
||||||
|
:S1 LDA [VDUADDR2] ; Load exploded font data 2nd byte
|
||||||
|
STA [VDUADDR],Y ; Store on screen
|
||||||
|
INC VDUADDR2+0 ; Increment exploded font ptr
|
||||||
|
BNE :S2
|
||||||
|
INC VDUADDR2+1
|
||||||
|
:S2 JSR SHRNEXTROW ; Add 160 to VDUADDR
|
||||||
|
INX ; Next row of font
|
||||||
|
CPX #$08 ; Last row?
|
||||||
|
BNE :L1
|
||||||
|
RTS
|
||||||
|
|
||||||
|
|
||||||
* Calculate character address in SHR screen memory
|
* Calculate character address in SHR screen memory
|
||||||
* This is the address of the first pixel row of the char
|
* This is the address of the first pixel row of the char
|
||||||
* Add $00A0 for each subsequent row
|
* Add $00A0 for each subsequent row
|
||||||
|
|
Loading…
Reference in New Issue
Block a user