diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/Releases/applecorn-0.52-beta.po b/Releases/applecorn-0.52-beta.po new file mode 100644 index 0000000..3b07329 Binary files /dev/null and b/Releases/applecorn-0.52-beta.po differ diff --git a/Releases/applecorn-0.53-beta.po b/Releases/applecorn-0.53-beta.po new file mode 100644 index 0000000..9580259 Binary files /dev/null and b/Releases/applecorn-0.53-beta.po differ diff --git a/Releases/applecorn-0.54-beta.po b/Releases/applecorn-0.54-beta.po new file mode 100644 index 0000000..00d4c31 Binary files /dev/null and b/Releases/applecorn-0.54-beta.po differ diff --git a/applecorn.po b/applecorn.po index 8e03c40..00d4c31 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/applecorn.s b/applecorn.s index 39fb96d..8dab865 100644 --- a/applecorn.s +++ b/applecorn.s @@ -273,6 +273,7 @@ MAINZP MAC PUT MAINMEM.LDR PUT AUXMEM.MOSEQU PUT AUXMEM.INIT + PUT AUXMEM.VERS PUT AUXMEM.VDU PUT AUXMEM.HGR PUT AUXMEM.SHR diff --git a/auxmem.init.s b/auxmem.init.s index fe39cea..f1d882a 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -224,5 +224,4 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error RTS ; %000x1xxx host type, 'A'pple BYTE00A BRK DB $F7 -HELLO ASC 'Applecorn MOS 2022-01-13' - DB $00 ; Unify MOS messages + diff --git a/auxmem.shr.s b/auxmem.shr.s index e52bda5..198232d 100644 --- a/auxmem.shr.s +++ b/auxmem.shr.s @@ -119,70 +119,25 @@ SHRPRCHAR LDX VDUPIXELS ; Pixels per byte * VS read cursor / VC write cursor * The read and write cursors have separate save-unders in :SAVEBYTES SHRCURSOR PHP ; Preserve flags - PHA ; Preserve character + PHA ; Preserve A LDA VDUSTATUS ; If VDU5 mode, bail AND #$20 - BNE :BAIL - LDA VDUPIXELS ; Pixels per byte - CMP #$02 ; 2 is 320-mode (MODE 1) - BNE :MODE0 - LDA #$04 ; 4 bytes in 320 mode - LDX #$71 ; White/red - BRA :S1 -:MODE0 LDA #$02 ; 2 bytes in 640 mode - LDX #%11011101 ; White/red/white/red -:S1 STA :BYTES ; Bytes per char - STX :CURSBYTE - LDA #$E1 - STA VDUBANK2 + BNE SHRCURSBAIL JSR SHRCHARADDR ; Screen addr in VDUADDR - LDA VDUADDR+0 ; LSB - CLC - ADC #<$460 ; $460 is seven rows - STA VDUADDR+0 - LDA VDUADDR+1 ; MSB - ADC #>$460 ; $460 is seven rows - STA VDUADDR+1 - LDY #$00 - LDX #$00 - PLA ; Recover character - PLP ; Recover flags - BVC :S2 ; VC: Write cursor - INX ; Advance to 2nd half of :SAVEBYTES - INX - INX - INX -:S2 BCC :CURSOROFF ; CC: Remove cursor -:CURSORON - LDA [VDUADDR],Y ; See if cursor shown - CMP :CURSBYTE - BEQ :DONE ; Cursor shown already, skip -:L1 LDAL [VDUADDR],Y - STA :SAVEBYTES,X ; Preserve bytes under cursor - LDA :CURSBYTE ; Byte of cursor data - STAL [VDUADDR],Y - INX - INY - CPY :BYTES - BNE :L1 + >>> WRTMAIN + LDA VDUADDR+0 ; Copy addr to SHRVDUQ + STA SHRVDUQ+0 + LDA VDUADDR+1 + STA SHRVDUQ+1 + >>> WRTAUX + PLA ; Recover A + PLY ; Flags -> Y + >>> XF2MAIN,SHRCURSM +SHRCURSRET >>> ENTAUX RTS -:CURSOROFF - LDA [VDUADDR],Y ; See if cursor shown - CMP :CURSBYTE - BNE :DONE ; Cursor not shown, skip -:L2 LDA :SAVEBYTES,X ; Restore bytes under cursor - STAL [VDUADDR],Y - INX - INY - CPY :BYTES - BNE :L2 -:DONE RTS -:BAIL PLA ; Fix stack - PLA +SHRCURSBAIL PLA + PLP RTS -:BYTES DB $00 ; 2 for 640-mode, 4 for 320-mode -:CURSBYTE DB $00 ; Cursor byte for mode -:SAVEBYTES DS 8 ; Bytes under cursors * Write character to SHR screen in 320 pixel mode @@ -199,8 +154,6 @@ SHRPRCH320RET >>> ENTAUX RTS SHRPRCH320V4 TXA -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -284,7 +237,6 @@ SHRPRCH320V4 TXA SEC ; Back to emulation mode XCE MX %11 ; Tell Merlin -* PLP ; Normal service resumed RTS @@ -301,8 +253,6 @@ SHRPRCH640 SEC * (Returns via SHRPRCH320RET) SHRPRCH640V4 TXA -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -361,7 +311,6 @@ SHRPRCH640V4 TXA SEC ; Back to emulation mode XCE MX %11 ; Tell Merlin -* PLP ; Normal service resumed RTS @@ -416,8 +365,6 @@ SHRSCR1LINE PHY PHX STA VDUADDR+1 ; Screen line -> MSB STZ VDUADDR+0 ; Zero LSB -* PHP ; Disable interrupts -* SEI CLC ; Enter native mode XCE PHB ; Preserve data bank @@ -479,7 +426,6 @@ SHRSCR1LINE PHY :DONE PLB ; Recover data bank SEC ; Back to emulation mode XCE -* PLP ; Recover flags + regs PLX PLY RTS @@ -491,8 +437,6 @@ SHRRSCR1LINE PHY PHX STA VDUADDR+1 ; Screen line -> MSB STZ VDUADDR+0 ; Zero LSB -* PHP ; Disable interrupts -* SEI CLC ; Enter native mode XCE PHB ; Preserve data bank @@ -554,7 +498,6 @@ SHRRSCR1LINE PHY :DONE PLB ; Recover data bank SEC ; Back to emulation mode XCE -* PLP ; Recover flags + regs PLX PLY RTS @@ -701,6 +644,7 @@ SHRSETGCOL PHA >>> WRTAUX RTS + * Wrapper to call SHRDEFPALM (which sets up default palette) SHRDEFPAL >>> XF2MAIN,SHRDEFPALM SHRDEFPALRET >>> ENTAUX diff --git a/auxmem.vdu.s b/auxmem.vdu.s index fdd4c63..89ac8bb 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -311,12 +311,23 @@ COPYSWAP4 RTS *************************** * Perform backspace & delete operation VDU127 JSR VDU08 ; Move cursor back - LDA #' ' ; Overwrite with a space - BNE PUTCHRC + LDA VDUSTATUS + AND #$20 ; Bit 5 VDU5 mode + BEQ :NOTVDU5 + >>> XF2MAIN,SHRVDU127 + RTS +:NOTVDU5 LDA #' ' ; Overwrite with a space + BRA PUTCHRC * Display character at current (TEXTX,TEXTY) PRCHRC PHA ; Save character - BIT ESCFLAG + + LDA VDUSTATUS + AND #$20 ; Bit 5 VDU5 mode + BEQ :S1 + JMP PRCHR7 ; Jump over text mode stuff + +:S1 BIT ESCFLAG BMI :RESUME JSR ESCPOLL BCS :RESUME @@ -529,54 +540,80 @@ CHARADDROK STA VDUBANK * CC=auxmem, CS=mainmem, X=preserved +* Handle paged mode when moving up the screen +VDUUP DEC FXLINES + BPL :DONE + STZ FXLINES +:DONE RTS + +* Handle paged mode when moving down the screen +VDUDOWN LDA VDUSTATUS + AND #$04 ; Bit 2 -> paged mode + BEQ :DONE + LDA TXTWINBOT + SEC + SBC TXTWINTOP + STA :HEIGHT + INC FXLINES + LDA FXLINES + CMP :HEIGHT + BCC :DONE ; FXLINES <= limit +:L1 JSR BYTE76 ; Check keyboard + LDA FXKBDSTATE + AND #$01 ; See if Open Apple depressed + BEQ :L1 ; If not, spin + STZ FXLINES +:DONE RTS +:HEIGHT DB $00 + +* Generic return for all SHRVDUxx returns to aux mem +VDUXXRET >>> ENTAUX ; SHRVDU08 returns here + RTS + * Move text cursor position *************************** * Move cursor left -VDU08 LDA VDUTEXTX ; COL +VDU08 LDA VDUSTATUS + AND #$20 ; Bit 5 -> VDU5 mode + BEQ VDU08VDU4 ; VDU5 not in effect + BIT VDUSCREEN + BVC VDU08DONE ; VDU5 but not SHR + >>> XF2MAIN,SHRVDU08 +VDU08VDU4 LDA VDUTEXTX ; COL CMP TXTWINLFT BEQ :S1 DEC VDUTEXTX ; COL - BRA :S3 + BRA VDU08DONE :S1 LDA VDUTEXTY ; ROW CMP TXTWINTOP - BEQ :S3 + BEQ VDU08DONE DEC VDUTEXTY ; ROW LDA TXTWINRGT STA VDUTEXTX ; COL -:S3 LDA VDUSTATUS - AND #$20 ; Bit 5 -> VDU5 mode - BEQ VDU08DONE - BIT VDUSCREEN - BVC VDU08DONE ; Not SHR, skip - >>> XF2MAIN,SHRVDU08 -VDU08RET >>> ENTAUX + JSR VDUUP ; Handle paged mode VDU08DONE RTS * Move cursor right VDU09 LDA VDUSTATUS AND #$20 ; Bit 5 VDU 5 mode - BEQ VDU09SKIP + BEQ VDU09VDU4 ; VDU5 not in effect BIT VDUSCREEN - BVC VDU09SKIP ; Not SHR, skip + BVC VDU09DONE ; VDU5 but not SHR >>> XF2MAIN,SHRVDU09 -VDU09RET >>> ENTAUX -VDU09SKIP LDA VDUTEXTX ; COL +VDU09VDU4 LDA VDUTEXTX ; COL CMP TXTWINRGT - BCC :S2 + BCC VDU09RGHT LDA TXTWINLFT STA VDUTEXTX ; COL + JSR VDUDOWN ; Handle paged mode LDA VDUTEXTY ; ROW CMP TXTWINBOT BEQ SCROLL INC VDUTEXTY ; ROW -:DONE RTS -:S2 INC VDUTEXTX ; COL - BRA :DONE -SCROLL LDA VDUSTATUS - AND #$20 ; Bit 5 VDU5 mode - BEQ :S3 - RTS ; No scroll in VDU5 -:S3 JSR SCROLLER +VDU09DONE RTS +VDU09RGHT INC VDUTEXTX ; COL + BRA VDU09DONE +SCROLL JSR SCROLLER LDA TXTWINLFT STA VDUTEXTX JSR CLREOL @@ -585,12 +622,12 @@ SCROLL LDA VDUSTATUS * Move cursor down VDU10 LDA VDUSTATUS AND #$20 ; Bit 5 -> VDU5 mode - BEQ VDU10SKIP + BEQ VDU10VDU4 ; VDU5 not in effect BIT VDUSCREEN - BVC VDU10SKIP ; Not SHR, skip + BVC VDU10DONE ; VDU5 but not SHR >>> XF2MAIN,SHRVDU10 -VDU10RET >>> ENTAUX -VDU10SKIP LDA VDUTEXTY ; ROW +VDU10VDU4 JSR VDUDOWN ; Handle paged mode + LDA VDUTEXTY ; ROW CMP TXTWINBOT BEQ VDU10SCRL INC VDUTEXTY ; ROW @@ -600,37 +637,36 @@ VDU10SCRL JMP SCROLL * Move cursor up VDU11 LDA VDUSTATUS AND #$20 ; Bit 5 -> VDU5 mode - BEQ VDU11SKIP + BEQ VDU11VDU4 ; VDU5 not in effect BIT VDUSCREEN - BVC VDU11SKIP ; Not SHR, skip + BVC VDU11DONE ; VDU5 but not SHR >>> XF2MAIN,SHRVDU11 -VDU11RET >>> ENTAUX -VDU11SKIP LDA VDUTEXTY ; ROW +VDU11VDU4 LDA VDUTEXTY ; ROW CMP TXTWINTOP - BNE :S1 + BNE VDU11UP LDA VDUTEXTX ; COL CMP TXTWINLFT - BNE :DONE + BNE VDU11DONE JSR RSCROLLER LDA TXTWINLFT STA VDUTEXTX JSR CLREOL RTS -:S1 DEC VDUTEXTY ; ROW -:DONE RTS +VDU11UP DEC VDUTEXTY ; ROW + JSR VDUUP ; Handle paged mode +VDU11DONE RTS * Move to start of line -VDU13 LDA #$BF +VDU13 LDA VDUSTATUS + AND #$20 ; Bit 5 -> VDU5 mode + BEQ VDU13VDU4 ; VDU5 not in effect + BIT VDUSCREEN + BVC VDU13DONE ; VDU5 but not SHR + >>> XF2MAIN,SHRVDU13 +VDU13VDU4 LDA #$BF JSR CLRSTATUS ; Turn copy cursor off LDA TXTWINLFT STA VDUTEXTX ; COL - LDA VDUSTATUS - AND #$20 ; Bit 5 -> VDU5 mode - BEQ VDU13DONE - BIT VDUSCREEN - BVC VDU13DONE ; Not SHR, skip - >>> XF2MAIN,SHRVDU13 -VDU13RET >>> ENTAUX VDU13DONE RTS * Move to (0,0) @@ -1134,8 +1170,6 @@ VDU19 LDA VDUQ+5 ; Second parm STX SHRVDUQ ; Stash X for call to main >>> WRTAUX >>> XF2MAIN,SHRPALCUSTOM -VDU19RET >>> ENTAUX - RTS :TMP DB $00 @@ -1221,8 +1255,6 @@ VDU24 BIT VDUBANK ; Check if this is a GS BNE :L1 >>> WRTAUX >>> XF2MAIN,SHRVDU24 -VDU24RETBAD >>> ENTAUX - RTS ; Validation failure VDU24RET >>> ENTAUX LDY #GFXWINLFT+7-VDUVARS ; Copy to gfx window params LDA #$08 @@ -1373,8 +1405,6 @@ VDU23 BIT VDUSCREEN ; Check we are in SHR mode RTS :SHR JSR VDUCOPYMAIN ; Copy VDUQ to main mem >>> XF2MAIN,SHRUSERCHAR -VDU23RET >>> ENTAUX - RTS * Copy VDUQ to SHRVDUQ in main memory VDUCOPYMAIN LDY #$00 diff --git a/auxmem.vers.s b/auxmem.vers.s new file mode 100644 index 0000000..1605d8c --- /dev/null +++ b/auxmem.vers.s @@ -0,0 +1,3 @@ +* Auto-generated by .git/hooks/pre-commit +HELLO ASC 'Applecorn v0.54-beta-0-g3325769' + DB $00 diff --git a/hooks_pre-commit b/hooks_pre-commit new file mode 100755 index 0000000..b41d25a --- /dev/null +++ b/hooks_pre-commit @@ -0,0 +1,15 @@ +#!/bin/bash + +# Pre-commit hook for Applecorn + +f="auxmem.vers.s" +V=`git describe` +echo '* Auto-generated by .git/hooks/pre-commit' > $f +echo "HELLO ASC 'Applecorn $V'" >> $f +echo " DB \$00" >> $f + +if ! ./m32build; then + exit 1 +fi + + diff --git a/m32build b/m32build index c0c57b2..1a06daf 100755 --- a/m32build +++ b/m32build @@ -3,7 +3,13 @@ # Uses cadius for manipulating ProDOS disk images # -merlin32 -v applecorn.s +if ! merlin32 -v applecorn.s; then + echo +++++++++++++++++++++++ + echo +++++ BUILD ERROR +++++ + echo +++++++++++++++++++++++ + exit 1 +fi + cp APLCORN.SYSTEM APLCORN.SYSTEM#FF2000 cadius deletefile applecorn.po /APPLECORN/APLCORN.SYSTEM cadius addfile applecorn.po /APPLECORN APLCORN.SYSTEM#FF2000 diff --git a/mainmem.shr.s b/mainmem.shr.s index 3046b54..3d0060c 100644 --- a/mainmem.shr.s +++ b/mainmem.shr.s @@ -90,8 +90,8 @@ SHRXPLDFONT >>> ENTMAIN INC A CMP #128 ; 96 chars in FONT8 BNE :L1 + JSR SHRCLR24 ; Clear row 24 >>> XF2AUX,SHRV22RET - RTS * Explode one character to location pointed to by A3L @@ -165,7 +165,7 @@ SHRUSERCHAR >>> ENTMAIN INY CPY #$08 ; Last row? BNE :L1 -:DONE >>> XF2AUX,VDU23RET +:DONE >>> XF2AUX,VDUXXRET :INCREMENT DB $00 @@ -198,6 +198,24 @@ SHRXPLDROW LDX SHRPIXELS ; Pixels per byte :S4 RTS +* Clear text row 24 (0-based index) +SHRCLR24 CLC ; 65816 native mode + XCE + REP #$30 ; 16 bit M & X + MX %00 ; Tell Merlin + LDX #$00 + LDA #$00 +:L1 STAL $E19800,X + INX + INX + CPX #$0500 + BNE :L1 + SEC ; 65816 emulation mode + XCE + MX %11 ; Tell Merlin + 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 @@ -256,10 +274,76 @@ SHRCHAR640 PHY ; Preserve Y RTS +* Handle plotting & unplotting cursors +* On entry: character in A, flags in Y +* pointer to screen address in SHRVDUQ+0..1 +SHRCURSM >>> ENTMAIN + PHY ; Preserve flags + PHA ; Preserve character + LDA SHRVDUQ+0 ; Copy pointer to A3L/H + STA A3L + LDA SHRVDUQ+1 + STA A3H + LDA #$E1 ; Bank $E1 + STA A4L + LDA SHRPIXELS ; Pixels per byte + CMP #$02 ; 2 is 320-mode (MODE 1) + BNE :MODE0 + LDA #$04 ; 4 bytes in 320 mode + LDX #$71 ; White/red + BRA :S1 +:MODE0 LDA #$02 ; 2 bytes in 640 mode + LDX #%11011101 ; White/red/white/red +:S1 STA :BYTES ; Bytes per char + STX :CURSBYTE + LDA A3L ; LSB + CLC + ADC #<$460 ; $460 is seven rows + STA A3L + LDA A3H ; MSB + ADC #>$460 ; $460 is seven rows + STA A3H + LDY #$00 + LDX #$00 + PLA ; Recover character + PLP ; Recover flags + BVC :S2 ; VC: Write cursor + INX ; Advance to 2nd half of :SAVEBYTES + INX + INX + INX +:S2 BCC :CURSOROFF ; CC: Remove cursor +:CURSORON + LDAL [A3L],Y ; See if cursor shown + CMP :CURSBYTE + BEQ :DONE ; Cursor shown already, skip +:L1 LDAL [A3L],Y + STA :SAVEBYTES,X ; Preserve bytes under cursor + LDA :CURSBYTE ; Byte of cursor data + STAL [A3L],Y + INX + INY + CPY :BYTES + BNE :L1 + >>> XF2AUX,SHRCURSRET +:CURSOROFF + LDAL [A3L],Y ; See if cursor shown + CMP :CURSBYTE + BNE :DONE ; Cursor not shown, skip +:L2 LDA :SAVEBYTES,X ; Restore bytes under cursor + STAL [A3L],Y + INX + INY + CPY :BYTES + BNE :L2 +:DONE >>> XF2AUX,SHRCURSRET +:BYTES DB $00 ; 2 for 640-mode, 4 for 320-mode +:CURSBYTE DB $00 ; Cursor byte for mode +:SAVEBYTES DS 8 ; Bytes under cursors + + * VDU5 plot char at graphics cursor position SHRVDU5CH >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -385,7 +469,6 @@ SHRVDU5CH >>> ENTMAIN :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP >>> XF2AUX,SHRPRCH320RET * Zero page :COLCTR EQU TMPZP+0 @@ -445,10 +528,9 @@ SHRSHIFT MX %00 ; Tell merlin we are 16 bit M&X RTS MX %11 + * Handle cursor left in VDU5 mode SHRVDU08 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -457,35 +539,32 @@ SHRVDU08 >>> ENTMAIN SEC SBC #$08 ; Move to previous column CMP SHRWINLFT - BMI :PREVLINE + BMI :PREVLINE ; x-pos < SHRWINLFT STA SHRXPIXEL BRA :DONE -:PREVLINE LDA SHRWINRGT - SEC - SBC #$08 - STA SHRXPIXEL - LDA SHRYPIXEL +:PREVLINE LDA SHRYPIXEL CLC ; Add 8 rows (go up) ADC #$08 CMP SHRWINTOP - BMI :BOTTOMROW + BCS :HOME ; y-pos >= SHRWINTOP STA SHRYPIXEL + LDA SHRWINRGT + SEC + SBC #$07 + STA SHRXPIXEL BRA :DONE -:BOTTOMROW LDA SHRWINBTM - CLC - ADC #$08 ; Go up one row from bottom +:HOME LDA SHRWINTOP STA SHRYPIXEL + LDA SHRWINLFT + STA SHRXPIXEL :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP - >>> XF2AUX,VDU08RET + >>> XF2AUX,VDUXXRET * Handle cursor right in VDU5 mode SHRVDU09 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -494,7 +573,7 @@ SHRVDU09 >>> ENTMAIN CLC ADC #$08 ; Advance to next column CMP SHRWINRGT - BCS :NEWLINE ; X-pos >= limit + BCS :NEWLINE ; x-pos >= SHRWINRGT STA SHRXPIXEL BRA :DONE :NEWLINE LDA SHRWINLFT @@ -503,14 +582,11 @@ SHRVDU09 >>> ENTMAIN :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP - >>> XF2AUX,VDU09RET + >>> XF2AUX,VDUXXRET * Handle cursor down / linefeed in VDU5 mode SHRVDU10 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -519,8 +595,7 @@ SHRVDU10 >>> ENTMAIN :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP - >>> XF2AUX,VDU10RET + >>> XF2AUX,VDUXXRET * Handle cursor up in VDU5 mode @@ -533,15 +608,15 @@ SHRVDU11 >>> ENTMAIN CLC ADC #$08 ; Height of row of text CMP SHRWINTOP - BPL :TOPPAGE + BCS :TOP ; y-pos >= SHRWINTOP STA SHRYPIXEL BRA :DONE -:TOPPAGE LDA SHRWINTOP +:TOP LDA SHRWINTOP STA SHRYPIXEL :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin - >>> XF2AUX,VDU11RET + >>> XF2AUX,VDUXXRET * Handle linefeed in VDU5 mode - does the actual work @@ -551,7 +626,7 @@ SHRVDU5LF MX %00 ; Tell Merlin SEC SBC #16 ; Height of this+next row CMP SHRWINBTM - BMI :NEWPAGE ; Less than 16 rows left + BCC :NEWPAGE ; Less than 16 rows left LDA SHRYPIXEL SEC SBC #$08 @@ -565,8 +640,6 @@ SHRVDU5LF MX %00 ; Tell Merlin * Handle carriage return in VDU5 mode SHRVDU13 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -576,8 +649,83 @@ SHRVDU13 >>> ENTMAIN :DONE SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP - >>> XF2AUX,VDU13RET + >>> XF2AUX,VDUXXRET + + +* Handle erasing char for VDU127 in VDU5 mode +* Called after SHRVDU08 has already backspaced cursor +SHRVDU127 >>> ENTMAIN + LDX SHRYPIXEL ; Screen row (Y-coord) + LDA SHRROWSL,X ; Look up addr (LS byte) + STA A3L ; Stash in A3L + LDA SHRROWSH,X ; Look up addr (MS byte) + STA A3H ; Stash in A3H + LDA #$E1 ; Bank $E1 + STA A4L + LDX SHRPIXELS + CPX #$02 + BNE :MODE0 + CLC ; 65816 native mode + XCE + REP #$30 ; 16 bit M & X + MX %00 ; Tell Merlin + LDA SHRXPIXEL ; Screen col (X-coord) + LSR A ; Divide by 2 + BRA :MODE1 +:MODE0 CLC ; 65816 native mode + XCE + REP #$30 ; 16 bit M & X + MX %00 ; Tell Merlin + LDA SHRXPIXEL ; Screen col (X-coord) + LSR A ; Divide by 2 + LSR A ; Divide by 4 + TAY + LDX #$00 + SEP #$30 ; 8 bit M & X + MX %11 ; Tell Merlin +:L1 LDA SHRGFXBGMASK + STAL [A3L],Y + INY + STAL [A3L],Y + DEY + JSR SHRNXTROWM ; Advance A3L/H to next pixel row + INX + CPX #$08 ; Erased all 8 rows? + BNE :L1 + BRA :DONE +:MODE1 MX %00 ; Tell Merlin it's 16 bit M&X + TAY + LDX #$00 + SEP #$30 ; 8 bit M & X + MX %11 ; Tell Merlin +:L2 LDA SHRGFXBGMASK + STAL [A3L],Y + INY + STAL [A3L],Y + INY + STAL [A3L],Y + INY + STAL [A3L],Y + DEY + DEY + DEY + JSR SHRNXTROWM ; Advance A3L/H to next pixel row + INX + CPX #$08 ; Erased all 8 rows? + BNE :L2 +:DONE SEC ; 65816 emulation mode + XCE + >>> XF2AUX,VDUXXRET + +* Advance A3L/H to next pixel row on screen +SHRNXTROWM LDA A3L ; Advance A3L/H to next row + CLC + ADC #160 + STA A3L + LDA A3H + ADC #$00 + STA A3H + RTS * Plot actions: PLOT k,x,y @@ -620,8 +768,6 @@ SHRPLOT >>> ENTMAIN :S1 CMP #$40 ; Plot point BNE :BAIL ; Other? Bail out -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE SEP #$30 ; 8 bit M & X @@ -630,7 +776,6 @@ SHRPLOT >>> ENTMAIN SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP ; Resume normal service BRA :S2 :S2 PLA ; Store prev pt in screen coords @@ -672,6 +817,7 @@ SHRPLOTCOL LDA SHRGFXFGMASK ; Preserve FG colour * Plot a point * Called in 65816 native mode, 8 bit M & X +* On entry: A1L/H x-coordinate, A2L/H y-coordinate SHRPOINT REP #$30 ; 16 bit M & X MX %00 ; Tell Merlin LDA A2L ; y coordinate @@ -840,8 +986,6 @@ SHRLINE LDA A2L ; y1 INC A :S1 STA TMPZP+0 ; abs(y1 - y0) STZ TMPZP+1 ; Pad to 16 bit -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -948,12 +1092,11 @@ SHRLINELO MX %00 ; Tell merlin 16 bit M & X STA :D ; D = D + 2 * dy :S3 INX CPX :LIM ; Compare with x1 - BNE :L1 + BCC :L1 SEC ; 65816 emulation mode XCE MX %11 ; Tell Merlin -* PLP ; Resume normal service RTS * Zero page :DX EQU TMPZP+0 ; dx initially, then (2 * (dy - dx)) @@ -1025,7 +1168,7 @@ SHRLINEHI MX %00 ; Tell Merlin 16 bit M & X STA :D ; D = D + 2 * dx :S3 INX CPX :LIM ; Compare with y1 - BNE :L1 + BCC :L1 SEC ; 65816 emulation mode XCE @@ -1045,8 +1188,6 @@ SHRLINEHI MX %00 ; Tell Merlin 16 bit M & X * from 1280x1024 to 640x200 or 320x200 * On return: X-coordinate in A1L/H, Y-coordinate in A2L (A2H=0) SHRCOORD MAC -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -1094,7 +1235,6 @@ SHRCOORDM0 LDA SHRVDUQ+5 SEC ; Back to emulation mode XCE MX %11 ; Tell Merlin -* PLP ; Normal service resumed BRA SHRCOORDEND SHRCOORDNEG MX %00 ; Tell Merlin we are 16 bit @@ -1169,8 +1309,6 @@ SHRCOORD2M0 LDA SHRVDUQ,X * Clear the graphics window SHRVDU16 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 816 native mode XCE REP #$30 ; 16 bit M & X @@ -1267,7 +1405,6 @@ SHRVDU16 >>> ENTMAIN SEC ; Back to 6502 emu mode XCE MX %11 ; Tell Merlin -* PLP ; Normal service resumed >>> XF2AUX,SHRCLRRET :LEFT320 DB %11111111 DB %00001111 @@ -1320,8 +1457,6 @@ SHRVDU16V PHA * Validate graphics window parms & store if okay * First 8 bytes of SHRVDUQ: left, bottom, right, top SHRVDU24 >>> ENTMAIN -* PHP ; Disable interrupts -* SEI CLC ; 65816 native mode XCE REP #$30 ; 16 bit M & X @@ -1352,12 +1487,10 @@ SHRVDU24 >>> ENTMAIN SEC ; 65816 emulation mode XCE -* PLP >>> XF2AUX,VDU24RET :BAD SEC ; 65816 emulation mode XCE -* PLP - >>> XF2AUX,VDU24RETBAD + >>> XF2AUX,VDUXXRET * Reset graphics window @@ -1434,7 +1567,7 @@ SHRPALCHANGE >>> ENTMAIN STAL $E19E00+9,X STAL $E19E00+17,X STAL $E19E00+25,X - RTS + BRA :DONE :MODE320 TXA AND #%00011110 ; Has already been shifted TAX @@ -1442,7 +1575,7 @@ SHRPALCHANGE >>> ENTMAIN STAL $E19E00,X ; Store in logical slot LDA PALETTE320+1,Y ; Byte 2 of physical colour STAL $E19E00+1,X ; Store in logical slot - >>> XF2AUX,VDU19RET +:DONE >>> XF2AUX,VDUXXRET * Assign a custom RGB colour to a 'logical' colour @@ -1466,7 +1599,7 @@ SHRPALCUSTOM >>> ENTMAIN STAL $E19E00+9,X STAL $E19E00+17,X STAL $E19E00+25,X - RTS + BRA :DONE :MODE320 TXA AND #%00011110 ; Has already been shifted TAX @@ -1474,7 +1607,7 @@ SHRPALCUSTOM >>> ENTMAIN STAL $E19E00,X ; Store in logical slot TYA ; R component STAL $E19E00+1,X ; Store in logical slot - >>> XF2AUX,VDU19RET +:DONE >>> XF2AUX,VDUXXRET * Table of addresses of SHR rows (in reverse order) diff --git a/mame_applecorn b/mame_applecorn index a21de9b..d24a026 100755 --- a/mame_applecorn +++ b/mame_applecorn @@ -1,2 +1,2 @@ #mame -w apple2ee -debug -sl5 mouse -sl7 cffa2 -harddisk1 ~/Personal/Development/Applecorn/applecorn.po -mame -w apple2gs -debug -sl7 cffa2 -harddisk1 ~/Personal/Development/Applecorn/applecorn.po -harddisk2 tests/JGHMusic2.po +mame -w apple2gs -debug -sl7 cffa2 -harddisk1 ~/Personal/Development/Applecorn/applecorn.po -harddisk2 tests/acrn*po # tests/Creat*po diff --git a/tests/Creative_Graphics.po b/tests/Creative_Graphics.po new file mode 100644 index 0000000..149f126 Binary files /dev/null and b/tests/Creative_Graphics.po differ