diff --git a/applecorn.po b/applecorn.po index 0b953ac..0be3bd7 100644 Binary files a/applecorn.po and b/applecorn.po differ 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 + +