From 4f686de09061f51121ac857fcc0dc45cee597711 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Mon, 26 Dec 2022 01:54:45 -0500 Subject: [PATCH] Speed up 640-mode text drawing using exploded font table --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.init.s | 2 +- auxmem.shr.s | 100 +++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/applecorn.po b/applecorn.po index e3ec231bbd2b29899cd2d424854548858d910f12..9f6b1b9cfca4d903da730af0c3fed3ea4b319cb4 100644 GIT binary patch delta 10662 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 delta 10416 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 diff --git a/auxmem.init.s b/auxmem.init.s index 46aa5e0..33fdf75 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -218,6 +218,6 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error RTS ; %000x1xxx host type, 'A'pple BYTE00A BRK DB $F7 -HELLO ASC 'Applecorn MOS 2022-12-25-HOHOHO' +HELLO ASC 'Applecorn MOS 2022-12-26-HOHOHO' DB $00 ; Unify MOS messages diff --git a/auxmem.shr.s b/auxmem.shr.s index 52f5a4b..8307651 100644 --- a/auxmem.shr.s +++ b/auxmem.shr.s @@ -82,8 +82,7 @@ SHRTAB DB $20 ; Text row 0 * Enable SHR mode -SHRVDU22 - LDA #$18 ; Inhibit SHR & aux HGR shadowing +SHRVDU22 LDA #$18 ; Inhibit SHR & aux HGR shadowing TSB SHADOW LDA #$80 ; Most significant bit TSB NEWVIDEO ; Enable SHR mode @@ -109,14 +108,35 @@ SHRVDU22 INY CPX #32 ; 32 bytes in palette BNE :L2 + JSR SHRXPLDFONT ; Explode font -> SHRFONTXPLD table JSR VDU12 ; Clear text and SHR screen RTS -* Write character to SHR screen -* On entry: A - character to write -* TODO: Make this faster!! It is horrible ATM -SHRPRCHAR SEC +SHRFONTXPLD EQU $A000 ; Explode SHR font to $E1:A000 + + +* 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 + 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 STA ZP1+0 ; A*8 -> ZP1 STZ ZP1+1 @@ -133,7 +153,6 @@ SHRPRCHAR SEC LDA ZP1+1 ADC #>FONT8 STA ZP1+1 - JSR SHRCHARADDR ; Addr in VDUADDR LDY #$00 ; First row of char :L1 >>> RDMAIN LDA (ZP1),Y ; Load row of font @@ -144,10 +163,28 @@ SHRPRCHAR SEC JSR SHRCHAR320 BRA :S2 :S1 JSR SHRCHAR640 -:S2 JSR SHRNEXTROW ; Add 160 to VDUADDR - INY ; Next row of font +:S2 LDX VDUPIXELS ; Pixels per byte + 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? BNE :L1 + PLA RTS @@ -204,6 +241,51 @@ SHRCHAR640 PHY 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+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 * This is the address of the first pixel row of the char * Add $00A0 for each subsequent row