diff --git a/applecorn.po b/applecorn.po index e3ec231..9f6b1b9 100644 Binary files a/applecorn.po and b/applecorn.po differ 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