Fixed ESC handling

This commit is contained in:
Bill Chatfield 2021-12-03 00:37:50 -05:00
parent 3a69bebb12
commit f121b6dcb5
3 changed files with 87 additions and 53 deletions

View File

@ -11,7 +11,7 @@ DSK=$(PGM).dsk
$(DSK): $(PGM) $(PGM2) $(DSK): $(PGM) $(PGM2)
#$(AC) -pro140 $(DSK) $(VOL) ---- Broken in 1.3.5 and others #$(AC) -pro140 $(DSK) $(VOL) ---- Broken in 1.3.5 and others
cp prodos.dsk $(DSK) cp prodos.dsk $(DSK)
$(AC) -p $(DSK) $(PGM) BIN 0x0300 < $(PGM) $(AC) -p $(DSK) $(PGM) BIN 0x0803 < $(PGM)
$(PGM): $(SRC) $(PGM): $(SRC)
merlin32 $(SRC) merlin32 $(SRC)

138
del2bs.s
View File

@ -19,7 +19,7 @@
* ESC SEQUENCES FOR 80-COLUMN. * ESC SEQUENCES FOR 80-COLUMN.
********************************************************* *********************************************************
ORG $300 ORG $803
TYP $06 ;BINARY TYPE TYP $06 ;BINARY TYPE
DSK del2bs ;OUTPUT FILE NAME DSK del2bs ;OUTPUT FILE NAME
@ -57,10 +57,23 @@ GETLN EQU $FD6A
GETLN1 EQU $FD6F ;GETLN WITH NO PROMPT GETLN1 EQU $FD6F ;GETLN WITH NO PROMPT
NOESC EQU $C9B7 ;HANDLES KEY OTHER THAN ESC NOESC EQU $C9B7 ;HANDLES KEY OTHER THAN ESC
BINPUT EQU $C8F6 BINPUT EQU $C8F6
ESCAPING EQU $C918 ESCAPING EQU $C91B
IN EQU $200 ;256-CHAR INPUT BUFFER IN EQU $200 ;256-CHAR INPUT BUFFER
RD80VID EQU $C01F RD80VID EQU $C01F
* USED IN HANDLE_ESC
ESC_ON EQU $CEB1
ESC_OFF EQU $CEC4
UPSHFT EQU $CE14
CTLCHAR EQU $CAD6
X_NAK EQU $CD4D
A2C_CHAR EQU $067B
* DATA USED IN HANDLE_ESC
ESCTAB EQU $C97C
ESCCHAR EQU $C96B
DOS33_MODE EQU $04FB
ESC EQU $9B ;ESC WITH HIGH BIT SET ESC EQU $9B ;ESC WITH HIGH BIT SET
RTARROW EQU $95 ;RIGHT ARROW WITH HIGH BIT SET RTARROW EQU $95 ;RIGHT ARROW WITH HIGH BIT SET
DELETE EQU $FF ;DELETE WITH HIGH BIT SET DELETE EQU $FF ;DELETE WITH HIGH BIT SET
@ -154,16 +167,16 @@ PRINTHEX MAC
* * * *
******************************** ********************************
MAIN LDA #<DELHNDLR MAIN LDA #<DEL2BS
STA KSWL STA KSWL
LDA #>DELHNDLR LDA #>DEL2BS
STA KSWH STA KSWH
PUTS LOADMSG PUTS LOADMSG
RTS RTS
******************************** ********************************
* * * *
* KEYBOARD INPUT ROUTINE * * KEYBOARD INPUT SUBROUTINE *
* * * *
* PRECONDITIONS: * * PRECONDITIONS: *
* 1. CURSOR AT CH & BASL - only works with 40-col * 1. CURSOR AT CH & BASL - only works with 40-col
@ -176,18 +189,21 @@ MAIN LDA #<DELHNDLR
* * * *
******************************** ********************************
DELHNDLR STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR DEL2BS STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR
STY CURSPOS STY CURSPOS
PUSHXY PUSHY
LDA ORIGCURS ;FOLLOWING CODE NEEDS THIS LDA ORIGCURS ;FOLLOWING CODE NEEDS THIS
BIT RDALTCHAR ;TEST FOR 80-COL ON BIT RDALTCHAR ;TEST FOR 80-COL ON
BMI COL80 BMI COL80
*********************************************************************** ***********************************************************************
COL40 JSR GETKEY40 ;LOAD "KEY" VARIABLE COL40 JSR GETKEY ;LOAD "KEY" VARIABLE
JSR DEL2BS ;CONVERT DELETE TO BACKSPACE JSR CONV_DEL2BS
STA KEY ;STORE IT BECAUSE A WILL GET WIPED STA KEY ;STORE IT BECAUSE A WILL GET WIPED
LDA ORIGCURS
LDY CURSPOS
STA (BASL),Y ;REPLACE CURSOR
JMP FINISH JMP FINISH
*********************************************************************** ***********************************************************************
@ -199,15 +215,13 @@ COL80
JSR INVERT ;INVERT CHAR AT CURSOR POSITION JSR INVERT ;INVERT CHAR AT CURSOR POSITION
NEXTKEY JSR GETKEY ;GET KEYBOARD KEY IN ACCUMULATOR NEXTKEY JSR GETKEY ;GET KEYBOARD KEY IN ACCUMULATOR
JSR DEL2BS JSR CONV_DEL2BS
STA KEY ;REMEMBER WHAT KEY WAS TYPED STA KEY ;REMEMBER WHAT KEY WAS TYPED
CMP #ESC ;IS IT ESC? CMP #ESC ;IS IT ESC?
BNE NOT_ESC ;IGNORE ESC BNE NOT_ESC ;KEY IS NOT ESC
LDA #" " ;PREP FOR PUTCHAR80 JSR INVERT ;PREP FOR ESCAPING CURSOR
LDY OURCH ;PREP FOR PUTCHAR80 JSR HANDLE_ESC
JSR PUTCHAR80 ;ERASE CURSOR SO ESCAPEING WORKS PROPERLY JMP COL80
JSR ESCAPING ;not a subroutine!!!!!!!!!
JMP FINISH
NOT_ESC CMP #RTARROW ;IS IT A RIGHT ARROW NOT_ESC CMP #RTARROW ;IS IT A RIGHT ARROW
BNE NOTRTARROW ;NOT RIGHT ARROW THEN DONE BNE NOTRTARROW ;NOT RIGHT ARROW THEN DONE
RTARROWHIT LDY OURCH ;GET HORIZONTAL CURSOR POSITION RTARROWHIT LDY OURCH ;GET HORIZONTAL CURSOR POSITION
@ -219,25 +233,10 @@ NOTRTARROW
JSR INVERT ;CURSOR CHAR MUST BE IN A JSR INVERT ;CURSOR CHAR MUST BE IN A
*********************************************************************** ***********************************************************************
FINISH POPYX ;RESTORE X AND Y FINISH POPY ;RESTORE X AND Y
LDA KEY ;LOAD RETURN VALUE LDA KEY ;LOAD RETURN VALUE
RTS RTS
********************************
* *
* GETKEY40 SUBROUTINE *
* ORIGINAL CURSOR MUST BE IN A *
* KEY TYPED IS PUT INTO A *
* *
********************************
GETKEY40 BIT KBD ;TEST FOR KEY PRESSED
BPL GETKEY40 ;WAIT FOR KEY PRESSED
STA (BASL),Y ;CLEAR CURSOR
LDA KBD ;GET THE KEY THAT WAS PRESSED
BIT KBDSTRB ;CLEAR KEYBOARD STROBE
RTS
******************************** ********************************
* * * *
* DEL2BS SUBROUTINE * * DEL2BS SUBROUTINE *
@ -250,7 +249,7 @@ GETKEY40 BIT KBD ;TEST FOR KEY PRESSED
* * * *
******************************** ********************************
DEL2BS CMP #DELETE ;IS THE KEY IN A THE DELETE KEY CONV_DEL2BS CMP #DELETE ;IS THE KEY IN A THE DELETE KEY
BNE D2BDONE BNE D2BDONE
LDA #BKSPACE LDA #BKSPACE
D2BDONE RTS D2BDONE RTS
@ -269,22 +268,59 @@ D2BDONE RTS
* * * *
******************************** ********************************
PUTCHAR80 *PUTCHAR80
PHA * PHA
SEI ;DISABLE INTERRUPTS * SEI ;DISABLE INTERRUPTS
STA SET80COL ;ENABLE MAIN/AUX MEM SWITCHING * STA SET80COL ;ENABLE MAIN/AUX MEM SWITCHING
TYA ;LOAD 80-COL HORIZ CURSOR POSITN * TYA ;LOAD 80-COL HORIZ CURSOR POSITN
LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN * LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN
BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM * BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM
MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON *MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON
JMP CONTINUE ;AVOID AUX MEM ENABLE * JMP CONTINUE ;AVOID AUX MEM ENABLE
AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF *AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF
CONTINUE TAY ;MOVE CURSOR POSITION TO Y *CONTINUE TAY ;MOVE CURSOR POSITION TO Y
PLA ;LOAD THE CHARACTER TO DISPLAY * PLA ;LOAD THE CHARACTER TO DISPLAY
STA (BASL),Y ;DISPLAY THE CHARACTER * STA (BASL),Y ;DISPLAY THE CHARACTER
STA PAGE2OFF ;TURN MAIN MEM BACK ON * STA PAGE2OFF ;TURN MAIN MEM BACK ON
CLI ;ENABLE INTERRUPTS * CLI ;ENABLE INTERRUPTS
RTS * RTS
HANDLE_ESC
JSR ESC_ON
JSR GETKEY
JSR ESC_OFF
JSR UPSHFT
AND #$7F
LDY #$10
ESC2 CMP ESCTAB,Y
BEQ ESC3
DEY
BPL ESC2
BMI ESCSPEC
ESC3 LDA ESCCHAR,Y
AND #$7F
JSR CTLCHAR
LDA ESCCHAR,Y
BMI HANDLE_ESC
RTS ;WAS JMP B.INPUT
ESCSPEC TAY
LDA DOS33_MODE
CPY #$11
BNE ESCSP1
JSR X_NAK
LDA #$98
STA A2C_CHAR
RTS ;WAS JMP BIORET
ESCSP1 CPY #$05
BNE ESCSP4
AND #$DF
ESCSP2 STA DOS33_MODE
ESCSP3 RTS ;WAS JMP B.INPUT
ESCSP4 CPY #$04
BNE ESCSP3
ORA #$20
BNE ESCSP2
RTS ;DID NOT EXIST IN ORIGINAL
******************************** ********************************
* * * *
@ -292,10 +328,8 @@ CONTINUE TAY ;MOVE CURSOR POSITION TO Y
* * * *
******************************** ********************************
LOADMSG ASC "LOADED DELETE KEY TO BACKSPACE CONVERTER",0D,00 LOADMSG ASC "LOADED DELETE TO BACKSPACE CONVERTER",0D,"AT ADDRESS $803",0D,00
KEY DB 0 KEY DB 0
ORIGCURS DB 0 ORIGCURS DB 0
CURSPOS DB 0 CURSPOS DB 0
CURSOR80 DB 0 CURSOR80 DB 0

Binary file not shown.