From 8a39a760fdb42e2977527356fb6e528af44dc0df Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Thu, 9 Sep 2021 16:01:32 -0400 Subject: [PATCH] Merged in JGH's Sept 9 VDU driver update. --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.bytwrd.s | 59 ++- auxmem.chario.s | 64 ++-- auxmem.vdu.s | 954 +++++++++++++++++++++++++++--------------------- 4 files changed, 593 insertions(+), 484 deletions(-) diff --git a/applecorn.po b/applecorn.po index 7e460973b3f5c9bdbaf928656ccfc103070c514c..df0134f1633a6263decef66ae66ff10b2b97dfba 100644 GIT binary patch delta 16847 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 MuqCB*%Vl@`Hz8qmA^-pY delta 5524 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 &00 - *OPT +BYTE8B CPX #$FF ; *DEBUG* + BNE BYTE8BA ; *DEBUG* + STY $E0 ; *DEBUG* + RTS ; *DEBUG* +BYTE8BA LDA #$00 ; &00 -> &00 - *OPT BYTE7F AND #$01 ; &7F -> &01 - EOF CALLFSCV JMP (FSCV) ; Hand over to filing system @@ -533,13 +530,3 @@ OSWORDM ASC 'OSWORD($' OSBM2 ASC ').' DB $00 - - - - - - - - - - diff --git a/auxmem.chario.s b/auxmem.chario.s index adc4fa7..8cf76da 100644 --- a/auxmem.chario.s +++ b/auxmem.chario.s @@ -22,15 +22,16 @@ * The three separate cursors can be set seperately. * 02-Sep-2021 INKEY-256 tests Apple IIe vs IIc. * 05-Sep-2021 KBDINIT returns startup value to pass to VDUINT. +* 09-Sep-2021 Moved keyboard OSBYTEs to here. -* TEMP, move to VDU.S -FLASHER EQU $290 -CURSOR EQU $291 -CURSORED EQU $292 -CURSORCP EQU $293 -OLDCHAR EQU $294 -COPYCHAR EQU $295 +** Moved to VDU.S +*FLASHER EQU $290 +*CURSOR EQU $291 +*CURSORED EQU $292 +*CURSORCP EQU $293 +*OLDCHAR EQU $294 +*COPYCHAR EQU $295 FXEXEC EQU BYTEVARBASE+198 FXSPOOL EQU BYTEVARBASE+199 @@ -64,6 +65,11 @@ WRCHHND PHA * JSR OUTCHAR * TO DO Check any printer output +* BCC WRCHHND2 +* TSX +* LDA $103,X +* JSR PRNCHAR +* WRCHHND2 PLY PLX PLA @@ -226,7 +232,7 @@ NEGINKEY CPX #$01 LDX #$00 ; Unimplemented BCS NEGINKEY0 - JSR NEGCALL + JSR NEGCALL ; Read machine ID from aux LDX #$2C TAY BEQ NEGINKEY0 ; $00 = Apple IIc -> INKEY-256 = $2C @@ -234,23 +240,6 @@ NEGINKEY CPX #$01 AND #$0F BEQ NEGINKEY0 ; $x0 = Apple IIe -> INKEY-256 = $2E LDX #$2A ; else = Apple IIgs INKEY-256 = $2A - -* LDX #$2A -* ; 6502 A 65C02 A 65816 B A -* LDA #$00 ; 00 00 zz 00 -* DB #$EB ; SBC NOP 00 XBA 00 zz -* DB #$3A ; #$3A C5 DEC A FF DEC A 00 yy -* DB #$EB ; SBC NOP FF XBA yy 00 -* DB #$EA ; #$EA DA NOP FF NOP yy 00 -* BEQ NEGINKEY0 ; INKEY-256 = $2A - AppleIIgs -* LDA #$C0 -* LDY #$FB -* JSR WORD05IO1 ; Read from $FBC0 in main ROM -* LDX #$2C -* TAY -* BEQ NEGINKEY0 ; INKEY-256 = $2C = Apple IIc -* LDX #$2E ; INKEY-256 = $2E = Apple IIe - NEGINKEY0 LDY #$00 CLC RTS @@ -437,13 +426,22 @@ KBDNOESC TXA ; A=keycode CLC ; CLC=Ok KBDDONE RTS - - - - - - - - +* Process pending Escape state +BYTE7E LDX #$00 ; $7E = ack detection of ESC + BIT ESCFLAG + BPL BYTE7DOK ; No Escape pending + LDA FXESCEFFECT ; Process Escape effects + BEQ BYTE7E2 + CLI ; Allow IRQs while flushing + STA FXLINES ; Clear scroll counter +* JSR STAREXEC0 ; Close any EXEC file +* JSR FLUSHALL ; Flush all buffers +BYTE7E2 LDX #$FF ; X=$FF, Escape was pending +BYTE7C CLC ; &7C = clear escape condition +BYTE7D ROR ESCFLAG ; $7D = set escape condition +BYTE7DOK RTS + +BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT + RTS ; Not possible with Apple diff --git a/auxmem.vdu.s b/auxmem.vdu.s index 8e2e4b2..b4768a1 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -10,88 +10,215 @@ * 21-Aug-2021 CHR$(&80+n) is inverse of CHR$(&00+n) * 21-Aug-2021 If screen scrolls, copy cursor adjusted. * 05-Sep-2021 Starting to prepare VDU workspace. +* 09-Sep-2021 New dispatch routine. ********************************** * VDU DRIVER WORKSPACE LOCATIONS * ********************************** -* $00D0-$00DF VDU driver zero page workspace -* $03ED-$03EE XFER transfer address - - -VDUSTATUS EQU $D0 ; $D0 VDU status -VDUZP1 EQU VDUSTATUS+1 ; $D1 -* VDUTEXTX EQU VDUSTATUS+2 ; $D2 text column -* VDUTEXTY EQU VDUSTATUS+3 ; $D3 text row -VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell - -FXVDUQLEN EQU $D1 ; TEMP HACK -VDUCHAR EQU $D6 ; TEMP HACK -VDUQ EQU $D7 ; TEMP HACK - -* VDUVARS -* VDUTEXTX EQU $2A0+0 ; text X coord -* VDUTEXTY EQU $2A0+1 ; text Y coord -VDUTEXTX EQU $96 ;COL TEMP -VDUTEXTY EQU $97 ;ROW TEMP -VDUCOPYX EQU $2A0+2 ; copy cursor X coord -VDUCOPYY EQU $2A0+3 ; copy cursor Y coord -* VDUCOPYCHR EQU $2A0+0 ; char underneath cursor when copying - -* VDUCURSOR EQU $2A0+4 ; cursor character -VDUMODE EQU $2A0+5 ; current MODE -* VDUCHAR EQU $2A0+6 ; VDU command, 1 byte -* VDUQ EQU $2A0+7 ; VDU sequence, 9 bytes - -* TEMP, move to VDU.S -* FLASHER EQU $290 ; flash counter for cursor -* CURSOR EQU $291 ; character under cursor -* CURSORED EQU $292 ; character used for cursor -* CURSORCP EQU $293 ; character used for edit cursor -* OLDCHAR EQU $294 ; character used for copy cursor -* COPYCHAR EQU $295 ; - - - - -* Start restructuring VDU variables -*********************************** -VDUVARS EQU $290 -* VDUTWINL VDUVARS+$08 ; text window left -* VDUTWINB VDUVARS+$09 ; text window bottom \ window -* VDUTWINR VDUVARS+$0A ; text window right / size -* VDUTWINT VDUVARS+$0B ; text window top +* # marks variables that can't be moved * -* VDUTEXTX EQU VDUVARS+$18 ; absolute POS -* VDUTEXTY EQU VDUVARS+$19 ; absolute VPOS -* VDUCOPYX EQU VDUVARS+$1A ; -* VDUCOPYY EQU VDUVARS+$1B ; -* VDUMODE +* VDU DRIVER ZERO PAGE +********************** +* $00D0-$00DF VDU driver zero page workspace +VDUSTATUS EQU $D0 ; $D0 # VDU status +* bit 7 = VDU 21 VDU disabled +* bit 6 = COPY cursor active +* bit 5 = VDU 5 Text at graphics cursor +* bit 4 = (Master shadow display) +* bit 3 = VDU 28 Text window defined +* bit 2 = VDU 14 Paged scrolling active +* bit 1 = Don't scroll (COPY cursor or VDU 5 mode) +* bit 0 = VDU 2 printer echo active +* +VDUCHAR EQU VDUSTATUS+1 ; $D1 +VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell + +BYTEVARBASE EQU $190 ; For Merlin-8/Merlin-16 + +* VDU DRIVER MAIN WORKSPACE +*************************** +FXLINES EQU BYTEVARBASE+217 ; Pages scrolling line counter +FXVDUQLEN EQU BYTEVARBASE+218 ; Length of pending VDU queue +VDUVARS EQU $290 + +* *TEMP* +FLASHER EQU $290 ; flash counter for cursor -> BYTEVARBASE+193 -> KBD +CURSOR EQU $291 ; character used for cursor -> VDUVAR+?? +CURSORED EQU $292 ; character used for edit cursor -> VDUVAR+?? +CURSORCP EQU $293 ; character used for copy cursor -> VDUVAR+?? +OLDCHAR EQU $294 ; character under cursor -> KBD? +COPYCHAR EQU $295 ; character under copy cursor -> KBD? + +VDUTWINL EQU VDUVARS+$08 ; # text window left +VDUTWINB EQU VDUVARS+$09 ; # text window bottom \ window +VDUTWINR EQU VDUVARS+$0A ; # text window right / size +VDUTWINT EQU VDUVARS+$0B ; # text window top +* +VDUPIXELS EQU VDUVARS+$13 ; *TEMP* +VDUBYTES EQU VDUVARS+$14 ; *TEMP* ; bytes per char +VDUMODE EQU VDUVARS+$15 ; *TEMP* ; current MODE +VDUSCREEN EQU VDUVARS+$16 ; *TEMP* ; Screen type, MODE 7? +* +VDUTEXTX EQU VDUVARS+$18 ; absolute POS +VDUTEXTY EQU VDUVARS+$19 ; absolute VPOS +VDUCOPYX EQU VDUVARS+$1A ; absolute COPY cursor X posn +VDUCOPYY EQU VDUVARS+$1B ; absolute COPY cursor Y posn * CURSOR * CURSORED * CURSORCP +VDUQ EQU VDUVARS+$27 ; *TEMP* $27..$2F + + +* Output character to VDU driver +******************************** +* On entry: A=character +* On exit: All registers trashable +* CS if printer echo enabled for this character +* +OUTCHAR LDX FXVDUQLEN + BNE ADDTOQ ; Waiting for chars + CMP #$7F + BEQ CTRLDEL ; =$7F - control char + CMP #$20 + BCC CTRLCHAR ; <$20 - control char + BIT VDUSTATUS + BMI OUTCHEXIT ; VDU disabled + JSR PRCHRC ; Store char, checking keypress + JSR VDU09 ; Move cursor right +OUTCHEXIT LDA VDUSTATUS + LSR A ; Return Cy=Printer Echo Enabled + RTS + +CTRLDEL LDA #$20 ; $7F becomes $20 +CTRLCHAR CMP #$01 + BEQ ADDQ ; One param + CMP #$11 + BCC CTRLCHARGO ; Zero params +ADDQ STA VDUCHAR ; Save initial character + AND #$0F + TAX + LDA QLEN,X + STA FXVDUQLEN ; Number of params to queue + BEQ CTRLCHARGO1 ; Zero, do it now +QDONE CLC ; CLC=Don't echo VDU queue to printer + RTS +ADDTOQ STA VDUQ-256+9,X + INC FXVDUQLEN + BNE QDONE +CTRLCHARGO1 LDA VDUCHAR +CTRLCHARGO ASL A + TAY + CMP #$10 ; 8*2 + BCC CTRLCHARGO2 ; ctrl<$08, don't echo to printer + EOR #$FF ; ctrl>$0D, don't echo to printer + CMP #$E5 ; (13*2) EOR 255 +CTRLCHARGO2 PHP + JSR CTRLCHARJMP ; Call routine + PLP + BCS OUTCHEXIT ; If echoable, test if printer enabled + RTS ; Return, CC=Don't echo to printer + +OUTCHARGO ASL A ; Entry point to move COPY cursor + TAY ; (TEMP and scroll screen) +CTRLCHARJMP CPY #6*2 + BEQ CTRLCHAR6 ; Always allow VDU 6 through + BIT VDUSTATUS + BMI VDU00 ; VDU disabled +CTRLCHAR6 LDA CTRLADDRS+1,Y + PHA + LDA CTRLADDRS+0,Y + PHA +VDU27 +VDU00 RTS ; Enters code with CS=(ctrl>=8 && ctrl<=13) + +QLEN DB -0,-1,-2,-5,-0,-0,-1,-9 ; 32,1 or 17,18,19,20,21,22,23 + DB -8,-5,-0,-0,-4,-4,-0,-2 ; 24,25,26,27,28,29,30,31 +CTRLADDRS DW VDU00-1,VDU01-1,VDU02-1,VDU03-1 + DW VDU04-1,VDU05-1,VDU06-1,BEEP-1 + DW VDU08-1,VDU09-1,VDU10-1,VDU11-1 + DW VDU12-1,VDU13-1,VDU14-1,VDU15-1 + DW VDU16-1,VDU17-1,VDU18-1,VDU19-1 + DW VDU20-1,VDU21-1,VDU22-1,VDU23-1 + DW VDU24-1,VDU25-1,VDU26-1,VDU27-1 + DW VDU28-1,VDU29-1,VDU30-1,VDU31-1 + DW VDU127-1 + + +* Turn things on and off +************************ + +* VDU 2 - Start print job +VDU02 +* JSR select printer + LDA #$01 ; Set Printer Echo On + BNE SETSTATUS + +* VDU 5 - Text at graphics cursor +VDU05 LDX VDUBYTES + DEX + BEQ SETEXIT ; 1 byte per char, text only +* Turn cursor off and other stuff + LDA #$20 ; Set VDU 5 mode + BNE SETSTATUS + +* VDU 14 - Select paged scrolling +VDU14 STZ FXLINES ; Reset line counter + LDA #$04 ; Set Paged Mode + BNE SETSTATUS + +* VDU 21 - Disable VDU +VDU21 LDA #$80 ; Set VDU disabled + +SETSTATUS ORA VDUSTATUS ; Set bits in VDU STATUS + STA VDUSTATUS +SETEXIT RTS + +* VDU 3 - End print job +VDU03 +* JSR flush printer + LDA #$FE ; Clear Printer Echo + BNE CLRSTATUS + +* VDU 4 - Text at text cursor +VDU04 +* Turn cursor on and other stuff + LDA #$DF ; Clear VDU 5 mode + BNE CLRSTATUS + +* VDU 15 - Disable paged scrolling +VDU15 LDA #$FB ; Clear paged scrolling + BRA CLRSTATUS + +* VDU 6 - Enable VDU +VDU06 LDA #$7F ; Clear VDU disabled + +CLRSTATUS AND VDUSTATUS + STA VDUSTATUS + RTS + * Move editing cursor * A=cursor key, CS from caller -COPYMOVE PHA - BIT VDUSTATUS - BVS COPYMOVE2 ; Edit cursor already on - JSR GETCHRC - STA COPYCHAR - LDA CURSORED - JSR PUTCHRC ; Edit cursor - SEC - JSR COPYSWAP2 ; Initialise copy cursor - ROR FLASHER - ASL FLASHER ; Ensure b0=0 - LDA #$42 - ORA VDUSTATUS - STA VDUSTATUS ; Turn cursor editing on -COPYMOVE2 PLA - AND #3 ; Convert to 8/9/10/11 - ORA #8 -COPYMOVE3 JMP OUTCHARGO ; Move edit cursor +COPYMOVE PHA + BIT VDUSTATUS + BVS COPYMOVE2 ; Edit cursor already on + JSR GETCHRC + STA COPYCHAR + LDA CURSORED + JSR PUTCHRC ; Edit cursor + SEC + JSR COPYSWAP2 ; Initialise copy cursor + ROR FLASHER + ASL FLASHER ; Ensure b0=0 + LDA #$42 + ORA VDUSTATUS + STA VDUSTATUS ; Turn cursor editing on +COPYMOVE2 PLA + AND #3 ; Convert to 8/9/10/11 + ORA #8 +COPYMOVE3 JMP OUTCHARGO ; Move edit cursor ** Turn editing cursor on/off *COPYCURSOR BIT VDUSTATUS @@ -110,398 +237,395 @@ COPYMOVE3 JMP OUTCHARGO ; Move edit cursor * Swap between edit and copy cursors *COPYSWAP BIT VDUSTATUS * BVC COPYSWAP4 ; Edit cursor off -COPYSWAP1 CLC ; CC=Swap TEXT and COPY -COPYSWAP2 LDX #1 -COPYSWAPLP LDY VDUCOPYX,X - LDA VDUTEXTX,X - STA VDUCOPYX,X - BCS COPYSWAP3 ; CS=Copy TEXT to COPY - TYA - STA VDUTEXTX,X -COPYSWAP3 DEX - BPL COPYSWAPLP -COPYSWAP4 RTS +COPYSWAP1 CLC ; CC=Swap TEXT and COPY +COPYSWAP2 LDX #1 +COPYSWAPLP LDY VDUCOPYX,X + LDA VDUTEXTX,X + STA VDUCOPYX,X + BCS COPYSWAP3 ; CS=Copy TEXT to COPY + TYA + STA VDUTEXTX,X +COPYSWAP3 DEX + BPL COPYSWAPLP +COPYSWAP4 RTS * Clear to EOL -CLREOL LDA VDUTEXTY ; ROW - ASL - TAX - LDA SCNTAB,X ; LSB of row - STA ZP1 - LDA SCNTAB+1,X ; MSB of row - STA ZP1+1 - LDA VDUTEXTX ; COL - PHA - STZ VDUTEXTX ; COL +CLREOL LDA VDUTEXTY ; ROW + ASL + TAX + LDA SCNTAB,X ; LSB of row + STA ZP1 + LDA SCNTAB+1,X ; MSB of row + STA ZP1+1 + LDA VDUTEXTX ; COL + PHA + STZ VDUTEXTX ; COL :L1 - LDA VDUTEXTX ; COL - LSR - TAY - BCC :S1 - >>> WRTMAIN -:S1 LDA #" " - STA (ZP1),Y - >>> WRTAUX - LDA VDUTEXTX ; COL - CMP #79 - BEQ :S2 - INC VDUTEXTX ; COL - BRA :L1 -:S2 PLA - STA VDUTEXTX ; COL - RTS + LDA VDUTEXTX ; COL + LSR + TAY + BCC :S1 + >>> WRTMAIN +:S1 LDA #" " + STA (ZP1),Y + >>> WRTAUX + LDA VDUTEXTX ; COL + CMP #79 + BEQ :S2 + INC VDUTEXTX ; COL + BRA :L1 +:S2 PLA + STA VDUTEXTX ; COL + RTS * Clear the screen -VDUINIT STA $C00F - LDA #'_' - STA CURSOR ; Normal cursor - STA CURSORCP ; Copy cursor when editing - LDA #$A0 - STA CURSORED ; Edit cursor when editing -CLEAR STZ VDUTEXTY ; ROW - STZ VDUTEXTX ; COL -:L1 JSR CLREOL -:S2 LDA VDUTEXTY ; ROW - CMP #23 - BEQ :S3 - INC VDUTEXTY ; ROW - BRA :L1 -:S3 STZ VDUTEXTY ; ROW - STZ VDUTEXTX ; COL - RTS +*VDUINIT STA $C00F +* LDA #'_' +* STA CURSOR ; Normal cursor +* STA CURSORCP ; Copy cursor when editing +* LDA #$A0 +* STA CURSORED ; Edit cursor when editing +CLEAR STZ VDUTEXTY ; ROW + STZ VDUTEXTX ; COL +:L1 JSR CLREOL +:S2 LDA VDUTEXTY ; ROW + CMP #23 + BEQ :S3 + INC VDUTEXTY ; ROW + BRA :L1 +:S3 STZ VDUTEXTY ; ROW + STZ VDUTEXTX ; COL + RTS * Calculate character address -CHARADDR LDA VDUTEXTY - ASL - TAX - LDA SCNTAB+0,X ; LSB of row address - STA VDUADDR+0 - LDA SCNTAB+1,X ; MSB of row address - STA VDUADDR+1 - LDA VDUTEXTX - BIT $C01F - SEC - BPL CHARADDR40 ; 40-col - LSR A -CHARADDR40 TAY ; Y=offset into this row - RTS +CHARADDR LDA VDUTEXTY + ASL + TAX + LDA SCNTAB+0,X ; LSB of row address + STA VDUADDR+0 + LDA SCNTAB+1,X ; MSB of row address + STA VDUADDR+1 + LDA VDUTEXTX + BIT $C01F + SEC + BPL CHARADDR40 ; 40-col + LSR A +CHARADDR40 TAY ; Y=offset into this row + RTS * (VDUADDR),Y=>character address * CC=auxmem * CS=mainmem * Print char in A at ROW,COL -PRCHRC PHA ; Save character - LDA $C000 - BPL :RESUME ; No key pressed - EOR #$80 -:PAUSE1 JSR KBDCHKESC ; Ask KBD to test if Escape - BIT ESCFLAG - BMI :RESUMEACK ; Escape, skip pausing - CMP #$13 - BNE :RESUME ; Not Ctrl-S - STA $C010 ; Ack. keypress -:PAUSE2 LDA $C000 - BPL :PAUSE2 ; Loop until keypress - EOR #$80 - CMP #$11 ; Ctrl-Q - BEQ :RESUMEACK ; Stop pausing - JSR KBDCHKESC ; Ask KBD to test if Escape - BIT ESCFLAG - BPL :PAUSE2 ; No Escape, keep pausing -:RESUMEACK STA $C010 ; Ack. keypress -:RESUME PLA +PRCHRC PHA ; Save character + LDA $C000 + BPL :RESUME ; No key pressed + EOR #$80 +:PAUSE1 JSR KBDCHKESC ; Ask KBD to test if Escape + BIT ESCFLAG + BMI :RESUMEACK ; Escape, skip pausing + CMP #$13 + BNE :RESUME ; Not Ctrl-S + STA $C010 ; Ack. keypress +:PAUSE2 LDA $C000 + BPL :PAUSE2 ; Loop until keypress + EOR #$80 + CMP #$11 ; Ctrl-Q + BEQ :RESUMEACK ; Stop pausing + JSR KBDCHKESC ; Ask KBD to test if Escape + BIT ESCFLAG + BPL :PAUSE2 ; No Escape, keep pausing +:RESUMEACK STA $C010 ; Ack. keypress +:RESUME PLA * Put character to screen -PUTCHRC EOR #$80 ; Convert character - TAY - AND #$A0 - BNE PRCHR4 - TYA - EOR #$40 - TAY -PRCHR4 PHY - JSR CHARADDR ; Find character address - PLA ; Get character back - PHP ; Disable IRQs while - SEI ; toggling memory - BCC PRCHR6 ; Aux memory - STA $C004 ; Switch to main memory -PRCHR6 STA (VDUADDR),Y ; Store it - STA $C005 ; Back to aux memory - PLP ; Restore IRQs - RTS +PUTCHRC EOR #$80 ; Convert character + TAY + AND #$A0 + BNE PRCHR4 + TYA + EOR #$40 + TAY +PRCHR4 PHY + JSR CHARADDR ; Find character address + PLA ; Get character back + PHP ; Disable IRQs while + SEI ; toggling memory + BCC PRCHR6 ; Aux memory + STA $C004 ; Switch to main memory +PRCHR6 STA (VDUADDR),Y ; Store it + STA $C005 ; Back to aux memory + PLP ; Restore IRQs + RTS * Return char at ROW,COL in A and X, MODE in Y BYTE87 -GETCHRC JSR CHARADDR ; Find character address - PHP ; Disable IRQs while - SEI ; toggling memory - BCC GETCHR6 ; Aux memory - STA $C002 ; Switch to main memory -GETCHR6 LDA (VDUADDR),Y ; Get character - STA $C003 ; Back to aux memory - PLP ; Restore IRQs - TAY ; Convert character - AND #$A0 - BNE GETCHR7 - TYA - EOR #$40 - TAY -GETCHR7 TYA - EOR #$80 - TAX ; X=char for OSBYTE - LDY #$00 - BIT $C01F - BMI GETCHROK - INY ; Y=MODE -GETCHROK RTS +GETCHRC JSR CHARADDR ; Find character address + PHP ; Disable IRQs while + SEI ; toggling memory + BCC GETCHR6 ; Aux memory + STA $C002 ; Switch to main memory +GETCHR6 LDA (VDUADDR),Y ; Get character + STA $C003 ; Back to aux memory + PLP ; Restore IRQs + TAY ; Convert character + AND #$A0 + BNE GETCHR7 + TYA + EOR #$40 + TAY +GETCHR7 TYA + EOR #$80 + TAX ; X=char for OSBYTE + LDY #$00 + BIT $C01F + BMI GETCHROK + INY ; Y=MODE +GETCHROK RTS -BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos - LDX VDUTEXTX ; COL - RTS +BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos + LDX VDUTEXTX ; COL + RTS * Perform backspace & delete operation -DELETE JSR BACKSPC -:S2 LDA #' ' - JMP PUTCHRC +VDU127 +DELETE JSR BACKSPC +:S2 LDA #' ' + JMP PUTCHRC *:S3 RTS * Perform backspace/cursor left operation +VDU08 BACKSPC - LDA VDUTEXTX ; COL - BEQ :S1 - DEC VDUTEXTX ; COL - BRA :S3 -:S1 LDA VDUTEXTY ; ROW - BEQ :S3 - DEC VDUTEXTY ; ROW - LDA #39 - BIT $C01F - BPL :S2 - LDA #79 + LDA VDUTEXTX ; COL + BEQ :S1 + DEC VDUTEXTX ; COL + BRA :S3 +:S1 LDA VDUTEXTY ; ROW + BEQ :S3 + DEC VDUTEXTY ; ROW + LDA #39 + BIT $C01F + BPL :S2 + LDA #79 :S2 - STA VDUTEXTX ; COL -:S3 RTS + STA VDUTEXTX ; COL +:S3 RTS -* Output character to VDU driver -* All registers trashable -OUTCHAR +VDU10 + LDA VDUTEXTY ; ROW + CMP #23 + BEQ :TOSCRL ; JGH + INC VDUTEXTY ; ROW + RTS +:TOSCRL JMP SCROLL ; JGH + +VDU11 + LDA VDUTEXTY ; ROW + BEQ :DONE + DEC VDUTEXTY ; ROW +:DONE RTS + +VDU13 + LDA #$BF + JSR CLRSTATUS ; Turn copy cursor off + STZ VDUTEXTX ; COL + RTS + +* Initialise VDU driver +*********************** +* On entry, A=MODE to start in +* Assumes workspace has been zero'd by kernel startup * -* Quick'n'nasty VDU queue - LDX FXVDUQLEN - BNE ADDTOQ - CMP #$01 - BEQ ADDQ ; One param - CMP #$11 - BCC OUTCHARGO ; Zero param - CMP #$20 - BCS OUTCHARGO ; Print chars -ADDQ STA VDUCHAR ; Save initial character - AND #$0F - TAX - LDA QLEN,X - STA FXVDUQLEN - BEQ OUTCHARGO1 -QDONE RTS -QLEN DB -0,-1,-2,-5,-0,-0,-1,-9 - DB -8,-5,-0,-0,-4,-4,-0,-2 -ADDTOQ STA VDUQ-256+9,X - INC FXVDUQLEN - BNE QDONE -OUTCHARGO1 LDA VDUCHAR -* end nasty hack +VDUINIT STA VDUQ+8 + +* VDU 22 - MODE n +***************** +* At the moment only MODEs available: +* MODE 3 - 80x24 text +* MODE 6 - 40x24 text +* MODE 7 - 40x24 with $80-$9F converted to spaces +* MODE 0 defaults to MODE 3 +* All others default to MODE 6 * -OUTCHARGO CMP #$00 ; NULL - BNE :T1 - BRA :IDONE -:T1 CMP #$07 ; BELL - BNE :T2 - JSR BEEP - BRA :IDONE -:T2 CMP #$08 ; Backspace - BNE :T3 - JSR BACKSPC - BRA :IDONE -:T3 CMP #$09 ; Cursor right - BNE :T4 -* JSR CURSRT - JSR VDU09 - BRA :IDONE -:T4 CMP #$0A ; Linefeed - BNE :T5 - LDA VDUTEXTY ; ROW - CMP #23 - BEQ :TOSCROLL ; JGH - INC VDUTEXTY ; ROW -:IDONE RTS -* BRA :DONE -:TOSCROLL JMP SCROLL ; JGH -:T5 CMP #$0B ; Cursor up - BNE :T6 - LDA VDUTEXTY ; ROW - BEQ :IDONE - DEC VDUTEXTY ; ROW -* BRA :IDONE - RTS -:T6 CMP #$0D ; Carriage return - BNE :T7 - LDA #$BF - AND VDUSTATUS - STA VDUSTATUS ; Turn copy cursor off - STZ VDUTEXTX ; COL -* BRA :IDONE - RTS -:T7 CMP #$0C ; Ctrl-L - BEQ :T7A - CMP #$16 ; MODE - BNE :T8 - LDA VDUQ+8 - STA VDUMODE - EOR #$07 - AND #$01 - TAX - STA $C00C,X -:T7A JSR CLEAR -* BRA :IDONE - RTS -:T8 CMP #$1E ; Home - BNE :T9 - STZ VDUTEXTY ; ROW - STZ VDUTEXTX ; COL -* BRA :IDONE - RTS -:T9 - CMP #$1F ; TAB - BNE :T9B - LDY VDUQ+8 - CPY #24 - BCS :IDONE - LDX VDUQ+7 - CPX #80 - BCS :IDONE - BIT $C01F - BMI :T9A - CPX #80 - BCS :IDONE +VDU22 LDA VDUQ+8 + AND #$07 + STA VDUMODE + LDX #$01 ; 80-col + CMP #$00 + BEQ VDU22A ; MODE 0 -> MODE 3, 80x24, text + CMP #$03 + BEQ VDU22A ; MODE 3 -> MODE 3, 80x24 text + DEX ; All other MODEs default to 40-col +VDU22A STA $C00C,X ; Select 40col/80col + STA $C003 ; Alt charset off + STA $C055 ; PAGE2 + STA $C00F +* +* Set up default cursors + LDA #'_' + STA CURSOR ; Normal cursor + STA CURSORCP ; Copy cursor when editing + LDA #$A0 + STA CURSORED ; Edit cursor when editing +* JSR VDU15 ; Turn off paged scrolling +* JSR VDU20 ; Reset colours +* JSR VDU26 ; Reset windows +* ; Drop through into VDU12, clear screen + + +VDU12 + JMP CLEAR + +VDU30 + STZ VDUTEXTY ; ROW + STZ VDUTEXTX ; COL + RTS + +VDU31 + LDY VDUQ+8 + CPY #24 + BCS :DONE + LDX VDUQ+7 + CPX #80 + BCS :DONE + BIT $C01F + BMI :T9A + CPX #40 + BCS :DONE :T9A - STX VDUTEXTX ; COL - STY VDUTEXTY ; ROW - RTS -:T9B CMP #$7F ; Delete - BNE :T10 - JSR DELETE -* BRA :IDONE - RTS -:T10 CMP #$20 - BCC :IDONE - CMP #$80 - BCC :T10A - CMP #$A0 - BCS :T10A - LDX VDUMODE - CPX #$07 - BNE :T10A - LDA #$20 -:T10A JSR PRCHRC ; Store char, checking keypress + STX VDUTEXTX ; COL + STY VDUTEXTY ; ROW +:DONE RTS * Perform cursor right operation VDU09 - LDA VDUTEXTX ; COL - CMP #39 - BCC :S2 - BIT $C01F - BPL :T11 - CMP #79 - BCC :S2 + LDA VDUTEXTX ; COL + CMP #39 + BCC :S2 + BIT $C01F + BPL :T11 + CMP #79 + BCC :S2 :T11 - STZ VDUTEXTX ; COL - LDA VDUTEXTY ; ROW - CMP #23 - BEQ SCROLL - INC VDUTEXTY ; ROW -:DONE RTS -* BRA :DONE -:S2 - INC VDUTEXTX ; COL - BRA :DONE -SCROLL JSR SCROLLER -* STZ VDUTEXTX ; COL - JSR CLREOL -*:DONE - RTS + STZ VDUTEXTX ; COL + LDA VDUTEXTY ; ROW + CMP #23 + BEQ SCROLL + INC VDUTEXTY ; ROW +:DONE RTS +:S2 INC VDUTEXTX ; COL + BRA :DONE +SCROLL JSR SCROLLER + JSR CLREOL + RTS * Scroll whole screen one line -SCROLLER LDA #$00 -:L1 PHA - JSR SCR1LINE - PLA - INC - CMP #23 - BNE :L1 - BIT VDUSTATUS - BVC :L2 ; Copy cursor not active - JSR COPYSWAP1 - LDA #11 - JSR OUTCHARGO - JSR COPYSWAP1 -:L2 RTS +SCROLLER LDA #$00 +:L1 PHA + JSR SCR1LINE + PLA + INC + CMP #23 + BNE :L1 + BIT VDUSTATUS + BVC :L2 ; Copy cursor not active + JSR COPYSWAP1 + LDA #11 + JSR OUTCHARGO + JSR COPYSWAP1 +:L2 RTS * Copy line A+1 to line A -SCR1LINE ASL ; Dest addr->ZP1 - TAX - LDA SCNTAB,X - STA ZP1 - LDA SCNTAB+1,X - STA ZP1+1 - INX ; Source addr->ZP2 - INX - LDA SCNTAB,X - STA ZP2 - LDA SCNTAB+1,X - STA ZP2+1 - LDY #$00 -:L1 LDA (ZP2),Y - STA (ZP1),Y - STA $C002 ; Read main mem - >>> WRTMAIN - LDA (ZP2),Y - STA (ZP1),Y - STA $C003 ; Read aux mem - >>> WRTAUX - INY - CPY #40 - BNE :L1 - RTS +SCR1LINE ASL ; Dest addr->ZP1 + TAX + LDA SCNTAB,X + STA ZP1 + LDA SCNTAB+1,X + STA ZP1+1 + INX ; Source addr->ZP2 + INX + LDA SCNTAB,X + STA ZP2 + LDA SCNTAB+1,X + STA ZP2+1 + LDY #$00 +:L1 LDA (ZP2),Y + STA (ZP1),Y + STA $C002 ; Read main mem + >>> WRTMAIN + LDA (ZP2),Y + STA (ZP1),Y + STA $C003 ; Read aux mem + >>> WRTAUX + INY + CPY #40 + BNE :L1 + RTS * Addresses of screen rows in PAGE2 -SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80 - DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8 - DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0 +SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80 + DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8 + DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0 +* Unimplemented +* May end up moving graphics bits to seperate source + +* VDU 1 - Send one character to printer +VDU01 RTS + +* VDU 16 - CLG, clear graphics window +VDU16 RTS + +* VDU 17 - COLOUR n - select text or border colour +VDU17 RTS + +* VDU 18 - GCOL k,a - select graphics colour and plot action +VDU18 RTS + +* VDU 19 - Select palette colours +VDU19 RTS + +* VDU 20 - Reset to default colours +VDU20 RTS + +* VDU 23 - Program video system and define characters +VDU23 RTS + +* VDU 24,left;bottom;right;top; - define graphics window +VDU24 RTS + +* VDU 25,k,x;y; - PLOT k,x;y; - PLOT point, line, etc. +VDU25 RTS + +* VDU 26 - Reset to default windows +VDU26 RTS + +* VDU 28,left,bottom,right,top - define text window +VDU28 RTS + +* VDU 29,x;y; - define graphics origin +VDU29 RTS + + + + +* OSBYTE &75 - Read VDUSTATUS +***************************** +BYTE75 LDX VDUSTATUS + RTS + * TEST code for VIEW -BYTE75 LDX VDUSTATUS - RTS -BYTE76 LDX #$00 - RTS -BYTEA0 LDY #79 ; Read VDU variable $09,$0A - LDX #23 - RTS +* OSBYTE &A0 - Read VDU variable +******************************** +BYTEA0 LDY #79 ; Read VDU variable $09,$0A + LDX #23 + RTS * TEST - - - - - - - - - - -