From 74b856e8f5010e14cfc29c36675012dfd2c1feba Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Thu, 29 Dec 2022 19:17:05 -0500 Subject: [PATCH] Migrated some SHR code to main memory. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 1 + auxmem.shr.s | 241 +--------------------------------------------- auxmem.vdu.s | 27 ++++-- mainmem.shr.s | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 280 insertions(+), 246 deletions(-) create mode 100644 mainmem.shr.s diff --git a/applecorn.po b/applecorn.po index 0b953acb7fbceb0162f40ac5912bb967a7fca54e..0be3bd7d97fcfed30de73f73a089c7ade09202aa 100644 GIT binary patch delta 12306 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 delta 12169 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 diff --git a/applecorn.s b/applecorn.s index 41e24e9..52594ba 100644 --- a/applecorn.s +++ b/applecorn.s @@ -281,6 +281,7 @@ MAINZP MAC PUT MAINMEM.INIT PUT MAINMEM.SVC PUT MAINMEM.HGR + PUT MAINMEM.SHR PUT MAINMEM.PATH PUT MAINMEM.WILD PUT MAINMEM.LISTS diff --git a/auxmem.shr.s b/auxmem.shr.s index 40ab58c..ecce73b 100644 --- a/auxmem.shr.s +++ b/auxmem.shr.s @@ -99,7 +99,8 @@ SHRVDU22 LDA #$18 ; Inhibit SHR & aux HGR shadowing CPX #200 ; 200 lines so 200 SCBs BNE :L1 JSR SHRDEFPAL ; Default palette - JSR SHRXPLDFONT ; Explode font -> SHRFONTXPLD table + >>> XF2MAIN,SHRXPLDFONT ; Explode font -> SHRFONTXPLD table +SHRV22RET >>> ENTAUX JSR VDU12 ; Clear text and SHR screen RTS @@ -107,8 +108,6 @@ SHRVDU22 LDA #$18 ; Inhibit SHR & aux HGR shadowing * Data in bank $E1 ****************************************************************************** -SHRFONTXPLD EQU $A000 ; Explode SHR font to $E1:A000 - * Used for long writes SHRCOLMASKL EQU $E1B000 ; Colour mask foreground (word) SHRBGMASKL EQU $E1B002 ; Colour mask background (word) @@ -122,188 +121,6 @@ SHRBGMASK EQU $B002 ; Colour mask background (word) SHRBGMASKA DW $0000 ; Keep a copy in aux mem too -* 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 - ASL ZP1+0 - ROL ZP1+1 - ASL ZP1+0 - ROL ZP1+1 - ASL ZP1+0 - ROL ZP1+1 - CLC ; FONT8+A*8 -> ZP1 - LDA ZP1+0 - ADC #FONT8 - STA ZP1+1 - LDY #$00 ; First row of char -:L1 >>> RDMAIN - LDA (ZP1),Y ; Load row of font - >>> RDAUX - JSR SHRXPLDROW - INY ; Next row of font - CPY #$08 ; Last row? - BNE :L1 - PLA - RTS - - -* Explode one pixel row of user defined graphics char -* On entry: A contains row of font data -SHRUSERCHAR LDA #SHRFONTXPLD - STA VDUADDR+1 - LDA #$E1 - STA VDUBANK - - LDA VDUQ+0 ; Character number - CMP #32 ; < 32? Then bail out - BCC :DONE - SEC ; Otherwise, subtract 32 - SBC #32 - TAY - - LDA #16 ; Bytes/char in 640 mode - LDX VDUPIXELS ; Pixels per byte - CPX #$02 ; 2 is 320-mode (MODE 1) - BNE :S0 - LDA #32 ; Bytes/char in 320 mode -:S0 STA :INCREMENT - -:L0 CPY #$00 - BEQ :S1 - CLC - LDA VDUADDR+0 - ADC :INCREMENT - STA VDUADDR+0 - LDA VDUADDR+1 - ADC #$00 - STA VDUADDR+1 - DEY - BRA :L0 - - -:S1 LDY #$00 -:L1 LDA VDUQ+1,Y ; Row of pixels - JSR SHRXPLDROW - INY - CPY #$08 ; Last row? - BNE :L1 -:DONE RTS -:INCREMENT DB $00 - - -* Explode one row of pixels. Used by SHRXPLDCHAR & SHRUSERCHAR -* On entry: A contains row of font data -SHRXPLDROW LDX VDUPIXELS ; Pixels per byte - CPX #$02 ; 2 is 320-mode (MODE 1) - BNE :S1 - JSR SHRCHAR320 - BRA :S2 -:S1 JSR SHRCHAR640 -: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 RTS - - -* Explode one pixel row of font in 320 mode -* 4 bytes per char, 4 bits per pixel -* On entry: A contains row of font data -SHRCHAR320 PHY ; Preserve Y - LDY #$00 ; Dest byte index -:L0 STZ ZP2 - LDX #$00 ; Source bit index -:L1 ASL ; MS bit -> C - PHP ; Preserve C - ROL ZP2 ; C -> LS bit - PLP ; Recover C - PHP - ROL ZP2 ; C -> LS bit - PLP ; Recover C - PHP - ROL ZP2 ; C -> LS bit - PLP ; Recover C - ROL ZP2 ; C -> LS bit - INX - CPX #$02 ; Processed two bits of font? - BNE :L1 - PHA ; Preserve partially shifted font - LDA ZP2 - STA [VDUADDR],Y - PLA ; Recover partially shifted font - INY - CPY #$04 ; Done 4 bytes? - BNE :L0 - PLY ; Recover Y - RTS - - -* Explode one pixel row of font in 640 mode -* 2 bytes per char, 2 bits per pixel -* On entry: A contains row of font data -SHRCHAR640 PHY ; Preserve Y - LDY #$00 ; Dest byte index -:L0 STZ ZP2 - LDX #$00 ; Source bit index -:L1 ASL ; MS bit -> C - PHP ; Preserve C - ROL ZP2 ; C -> LS bit - PLP ; Recover C - ROL ZP2 ; C -> LS bit - INX - CPX #$04 - BNE :L1 - PHA ; Preserve partially shifted font - LDA ZP2 - STA [VDUADDR],Y - PLA ; Recover partially shifted font - INY - CPY #$02 ; Done 2 bytes? - BNE :L0 - PLY ; Recover Y - RTS - - * Write character to SHR screen * On entry: A - character to write SHRPRCHAR CMP CURSORED ; Edit cursor? @@ -881,57 +698,3 @@ SHRPALCUSTOM PHA ; Preserve GB components STAL $E19E00+1,X ; Store in logical slot RTS - -* Convert high-resolution screen coordinates -* from 1280x1024 to 620x200 or 320x200 -* TODO: Move to mainmem -SHRCOORD PHP ; Disable interrupts - SEI - CLC ; 65816 native mode - XCE - REP #$30 ; 16 bit M & X - MX %00 ; Tell Merlin - -* X-coordinate in VDUQ+5,+6 MODE0:1280/2=640 or MODE1:1280/4=320 - LDA VDUPIXELS ; Pixels per byte - AND #$00FF - CMP #$02 ; 2 is 320-mode (MODE 1) - BNE :MODE0 - LDA VDUQ+5 - LSR ; /2 - LSR ; /4 - STA ZP1 ; TODO: Store somewhere sensible - BRA :Y -:MODE0 LDA VDUQ+5 - LSR ; /2 - STA ZP1 ; TODO: Store somewhere sensible - -* Y-coordinate in VDUQ+7,+8 1024*3/16=192, 1024/128=8, 192+8=200 -:Y LDA VDUQ+7 - ASL ; *2 - CLC - ADC VDUQ+7 ; *3 - LSR ; *3/2 - LSR ; *3/4 - LSR ; *3/8 - LSR ; *3/16 - STA ZP1 ; (ZP1 and ZP2) - LDA VDUQ+7 - LSR ; /2 - LSR ; /4 - LSR ; /8 - LSR ; /16 - LSR ; /32 - LSR ; /64 - LSR ; /128 - CLC - ADC ZP1 ; Result - STA ZP1 ; TODO: Store somewhere sensible - - SEC ; Back to emulation mode - XCE - MX %11 ; Tell Merlin - PLP ; Normal service resumed - RTS - - diff --git a/auxmem.vdu.s b/auxmem.vdu.s index fb604c7..5bfe345 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -600,6 +600,9 @@ VDU22 JSR NEGCALL ; Find machine type STA VDUBYTES ; Bytes per char LDA SCNPIXELS,X STA VDUPIXELS ; Pixels per byte + >>> WRTMAIN + STA SHRPIXELS + >>> WRTAUX LDA SCNTYPE,X STA VDUSCREEN ; Screen type LDA #$01 @@ -1127,9 +1130,7 @@ VDUCOPYEXIT RTS * x is in VDUQ+5,VDUQ+6 * y is in VDUQ+7,VDUQ+8 * - -* TO DO: -* clip to viewport +* TO DO: Clip to viewport VDU25 LDA VDUQ+4 AND #$04 ; Bit 2 set -> absolute @@ -1166,7 +1167,7 @@ ADJORIG CLC LDA GFXORIGX+1 ADC VDUQ+6 STA VDUQ+6 - CLC + CLC LDA GFXORIGY+0 ADC VDUQ+7 STA VDUQ+7 @@ -1195,10 +1196,22 @@ RELCOORD CLC * Program video system and define characters * VDU 23,charnum,row1,row2,row3,row4,row5,row6,row7,row8 VDU23 BIT VDUSCREEN ; Check we are in SHR mode - BVC :NOTSHR - JSR SHRUSERCHAR -:NOTSHR RTS + BVS :SHR + RTS +:SHR JSR VDUCOPYMAIN ; Copy VDUQ to main mem + >>> XF2MAIN,SHRUSERCHAR +VDU23RET >>> ENTAUX + RTS +* Copy VDUQ to SHRVDUQ in main memory +VDUCOPYMAIN LDY #$00 +:L1 LDA VDUQ,Y ; Copy VDUQ to SHRVDUQ + >>> WRTMAIN + STA SHRVDUQ,Y + >>> WRTAUX + INY + CPY #16 + BNE :L1 * Read from VDU system ********************** diff --git a/mainmem.shr.s b/mainmem.shr.s new file mode 100644 index 0000000..c710fc0 --- /dev/null +++ b/mainmem.shr.s @@ -0,0 +1,257 @@ +* MAINMEM.SHR.S +* (c) Bobbi 2022 GPLv3 +* +* Routines for drawing bitmapped text and graphics in SHR mode +* on Apple IIGS (640x200 4 colour, or 320x200 16 colour.) +* +* This code is in main memory only to save space in aux LC. +* + +****************************************************************************** +* Data in bank $E1 +****************************************************************************** + +SHRFONTXPLD EQU $A000 ; Explode SHR font to $E1:A000 + +****************************************************************************** + +SHRPIXELS DB $00 ; Main memory copy of VDUPIXELS +SHRVDUQ DS 16 ; Main memory copy of VDUQ + + +* 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 >>> ENTMAIN + LDA #SHRFONTXPLD + STA A3H + LDA #$E1 ; Memory bank $E1 + STA A4L + LDA #32 ; First char number +:L1 JSR SHRXPLDCHAR ; Explode char A + INC A + CMP #128 ; 96 chars in FONT8 + BNE :L1 + >>> XF2AUX,SHRV22RET + RTS + + +* Explode one character to location pointed to by A3L +* On entry: A - character to explode +SHRXPLDCHAR PHA + SEC + SBC #32 + STA A1L ; A*8 -> A1L/H + STZ A1H + ASL A1L + ROL A1H + ASL A1L + ROL A1H + ASL A1L + ROL A1H + CLC ; FONT8+A*8 -> A1L/H + LDA A1L + ADC #FONT8 + STA A1H + LDY #$00 ; First row of char +:L1 LDA (A1L),Y ; Load row of font + JSR SHRXPLDROW + INY ; Next row of font + CPY #$08 ; Last row? + BNE :L1 + PLA + RTS + + +* Explode one pixel row of user defined graphics char +SHRUSERCHAR >>> ENTMAIN + LDA #SHRFONTXPLD + STA A3H + LDA #$E1 + STA A4L + + LDA SHRVDUQ+0 ; Character number + CMP #32 ; < 32? Then bail out + BCC :DONE + SEC ; Otherwise, subtract 32 + SBC #32 + TAY + + LDA #16 ; Bytes/char in 640 mode + LDX SHRPIXELS ; Pixels per byte + CPX #$02 ; 2 is 320-mode (MODE 1) + BNE :S0 + LDA #32 ; Bytes/char in 320 mode +:S0 STA :INCREMENT + +:L0 CPY #$00 + BEQ :S1 + CLC + LDA A3L + ADC :INCREMENT + STA A3L + LDA A3H + ADC #$00 + STA A3H + DEY + BRA :L0 + + +:S1 LDY #$00 +:L1 LDA SHRVDUQ+1,Y ; Row of pixels + JSR SHRXPLDROW + INY + CPY #$08 ; Last row? + BNE :L1 +:DONE RTS + >>> XF2AUX,VDU23RET +:INCREMENT DB $00 + + +* Explode one row of pixels. Used by SHRXPLDCHAR & SHRUSERCHAR +* On entry: A contains row of font data +SHRXPLDROW LDX SHRPIXELS ; Pixels per byte + CPX #$02 ; 2 is 320-mode (MODE 1) + BNE :S1 + JSR SHRCHAR320 + BRA :S2 +:S1 JSR SHRCHAR640 +:S2 LDX SHRPIXELS ; Pixels per byte + CPX #$02 ; 2 is 320-mode (MODE 1) + BNE :S3 + CLC ; 320 mode: add 4 to A3L + LDA A3L + ADC #$04 + STA A3L + LDA A3H + ADC #$00 + STA A3H + BRA :S4 +:S3 CLC ; 640 mode: add 2 to A3L + LDA A3L + ADC #$02 + STA A3L + LDA A3H + ADC #$00 + STA A3H +:S4 RTS + + +* Explode one pixel row of font in 320 mode +* 4 bytes per char, 4 bits per pixel +* On entry: A contains row of font data +SHRCHAR320 PHY ; Preserve Y + LDY #$00 ; Dest byte index +:L0 STZ A2L + LDX #$00 ; Source bit index +:L1 ASL ; MS bit -> C + PHP ; Preserve C + ROL A2L ; C -> LS bit + PLP ; Recover C + PHP + ROL A2L ; C -> LS bit + PLP ; Recover C + PHP + ROL A2L ; C -> LS bit + PLP ; Recover C + ROL A2L ; C -> LS bit + INX + CPX #$02 ; Processed two bits of font? + BNE :L1 + PHA ; Preserve partially shifted font + LDA A2L + STA [A3L],Y + PLA ; Recover partially shifted font + INY + CPY #$04 ; Done 4 bytes? + BNE :L0 + PLY ; Recover Y + RTS + + +* Explode one pixel row of font in 640 mode +* 2 bytes per char, 2 bits per pixel +* On entry: A contains row of font data +SHRCHAR640 PHY ; Preserve Y + LDY #$00 ; Dest byte index +:L0 STZ A2L + LDX #$00 ; Source bit index +:L1 ASL ; MS bit -> C + PHP ; Preserve C + ROL A2L ; C -> LS bit + PLP ; Recover C + ROL A2L ; C -> LS bit + INX + CPX #$04 + BNE :L1 + PHA ; Preserve partially shifted font + LDA A2L + STA [A3L],Y + PLA ; Recover partially shifted font + INY + CPY #$02 ; Done 2 bytes? + BNE :L0 + PLY ; Recover Y + RTS + + +* Convert high-resolution screen coordinates +* from 1280x1024 to 620x200 or 320x200 +* TODO: Totally untested ... +SHRCOORD PHP ; Disable interrupts + SEI + CLC ; 65816 native mode + XCE + REP #$30 ; 16 bit M & X + MX %00 ; Tell Merlin + +* X-coordinate in SHRVDUQ+5,+6 MODE0:1280/2=640 or MODE1:1280/4=320 + LDA SHRPIXELS ; Pixels per byte + AND #$00FF + CMP #$02 ; 2 is 320-mode (MODE 1) + BNE :MODE0 + LDA SHRVDUQ+5 + LSR ; /2 + LSR ; /4 + STA A1L ; TODO: Store somewhere sensible + BRA :Y +:MODE0 LDA SHRVDUQ+5 + LSR ; /2 + STA A1L ; TODO: Store somewhere sensible + +* Y-coordinate in SHRVDUQ+7,+8 1024*3/16=192, 1024/128=8, 192+8=200 +:Y LDA SHRVDUQ+7 + ASL ; *2 + CLC + ADC SHRVDUQ+7 ; *3 + LSR ; *3/2 + LSR ; *3/4 + LSR ; *3/8 + LSR ; *3/16 + STA A1L ; (A1L and A1H) + LDA SHRVDUQ+7 + LSR ; /2 + LSR ; /4 + LSR ; /8 + LSR ; /16 + LSR ; /32 + LSR ; /64 + LSR ; /128 + CLC + ADC A1L ; Result + STA A1L ; TODO: Store somewhere sensible + + SEC ; Back to emulation mode + XCE + MX %11 ; Tell Merlin + PLP ; Normal service resumed + RTS + +