Reduce code and organize into subroutines

This commit is contained in:
Bill Chatfield 2021-12-04 05:57:00 -05:00
parent 793b02cf94
commit 297fab0ef2
4 changed files with 184 additions and 163 deletions

15
TODO
View File

@ -1,9 +1,6 @@
1. Change to delkey.erase.bk 1. Split into 40-col and 80-col programs
2. Add delkey.reset 2. Have a loader that figures out if it's in 40 or 80 col mode and then
3. If not delete key then forward to previous keyboard routine load the right code.
4. Don't change cursor. Keep whatever cursor exists at load time. 3. Make a release.
5. Create program to detect if the handler is loaded: delkey.detect?. 4. Go back to $300 load address once split into 2 programs. Each need to be
6. Add program to print explanation and instructions. < 200 bytes to fit at that location.
7. Change subroutines to macros
8. Implement a better test for 80-column mode, possibly check cursor; if is delete char then 40-column mode
9. Add build and run instructions, explanation

266
del2bs.s
View File

@ -1,27 +1,28 @@
******************************** ********************************
* * * *
* DELETE KEY HANDLER * * DELETE KEY TO BACKSPACE *
* CONVERTER *
* * * *
* AUTHOR: BILL CHATFIELD * * AUTHOR: BILL CHATFIELD *
* LICENSE: GPL * * LICENSE: GPL *
* * * *
******************************** ********************************
********************************************************* ***********************************************************
* INPUT SUBROUTINE CALL SEQUENCE: * INPUT SUBROUTINE CALL SEQUENCE: *
* GETLN ($FD6A) - READS A LINE INTO IN ($200) LENGTH IN X * GETLN ($FD6A) - READS A LINE INTO IN ($200) LENGTH IN X *
* '->RDCHAR ($FD35) - HANDLES ESC SEQUENCES FOR 40 COLUMN * '->RDCHAR ($FD35) - HANDLES ESC SEQUENCES FOR 40 COLUMN *
* '->RDKEY ($FD0C) - READS CHAR INTO ACCUMULATOR * '->RDKEY ($FD0C) - READS CHAR INTO ACCUMULATOR *
* '->KSW ($38) - POINTS TO KEYIN ($FD1B) FOR 40-COL * '->KSW ($38) - POINTS TO KEYIN ($FD1B) FOR 40-COL *
* OR BASICIN ($C305) FOR 80-COL, * OR BASICIN ($C305) FOR 80-COL, *
* DELHNDLR IN THIS FILE, OTHER OTHER * DELHNDLR IN THIS FILE, OTHER OTHER *
* CUSTOM SUBROUTINE. BASICIN HANDLES * CUSTOM SUBROUTINE. BASICIN HANDLES *
* ESC SEQUENCES FOR 80-COLUMN. * ESC SEQUENCES FOR 80-COLUMN. *
********************************************************* ***********************************************************
ORG $803 ORG $803
TYP $06 ;BINARY TYPE TYP $06 ;BINARY TYPE
DSK del2bs ;OUTPUT FILE NAME DSK del2bs ;OUTPUT FILE NAME
WINWIDTH EQU $21 WINWIDTH EQU $21
CH EQU $24 ;HORIZ CHAR POS (40-COL) CH EQU $24 ;HORIZ CHAR POS (40-COL)
@ -143,7 +144,6 @@ POPYX mac
* ]1 - ADDRESS OF STRING * * ]1 - ADDRESS OF STRING *
* * * *
******************************** ********************************
PUTS MAC PUTS MAC
PUSHY PUSHY
LDA #<]1 ;PUT LOW BYTE INTO A LDA #<]1 ;PUT LOW BYTE INTO A
@ -152,90 +152,91 @@ PUTS MAC
POPY POPY
<<< <<<
PRINTHEX MAC
PHA
PUSHXY
lda ]1
JSR PRBYTE
POPYX
PLA
<<<
******************************** ********************************
* * * *
* INSTALL VECTOR TO HANDLER * * INSTALL VECTOR TO DEL2BS *
* * * *
******************************** ********************************
MAIN LDA #<DEL2BS
MAIN LDA #<DEL2BS STA KSWL
STA KSWL LDA #>DEL2BS
LDA #>DEL2BS STA KSWH
STA KSWH PUTS LOADMSG
PUTS LOADMSG RTS
RTS
******************************** ********************************
* * * *
* KEYBOARD INPUT SUBROUTINE * * KEYBOARD INPUT SUBROUTINE *
* * * *
* PRECONDITIONS: * * PRECONDITIONS: *
* 1. CURSOR AT CH & BASL - only works with 40-col * 1. CURSOR AT CH & BASL *
* 2. ACCUM = ORIG SCREEN BYTE - only works with 40-col * - only works with 40-col *
* 3. Y = VALUE IN CH - only works with 40-col * 2. ACCUM = ORIG SCREEN BYTE *
* - only works with 40-col *
* 3. Y = VALUE IN CH *
* - only works with 40-col *
* * * *
* POSTCONDITIONS: * * POSTCONDITIONS: *
* 1. MUST RETURN CHAR IN ACCUM * * 1. MUST RETURN CHAR IN ACCUM *
* 2. X & Y MUST NOT BE CHANGED * * 2. X & Y MUST NOT BE CHANGED *
* * * *
******************************** ********************************
DEL2BS STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR
STY CURSPOS
BIT RDALTCHAR ;TEST FOR 80-COL ON
BMI COL80
JSR DEL2BS40
JMP DONE
COL80 JSR DEL2BS80
DONE RTS
DEL2BS STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR ********************************
STY CURSPOS * *
PUSHY * 40-COL DEL2BS SUBROUTINE *
* *
********************************
DEL2BS40
PUSHY
JSR GETKEY ;LOAD "KEY" VARIABLE
JSR CONV_DEL2BS
STA KEY ;STORE IT BECAUSE A WILL GET WIPED
LDA ORIGCURS
LDY CURSPOS
STA (BASL),Y ;REPLACE CURSOR
POPY
LDA KEY ;SETUP RETURN VALUE
RTS
LDA ORIGCURS ;FOLLOWING CODE NEEDS THIS ********************************
BIT RDALTCHAR ;TEST FOR 80-COL ON * *
BMI COL80 * 80-COL DEL2BS SUBROUTINE *
* *
*********************************************************************** ********************************
COL40 JSR GETKEY ;LOAD "KEY" VARIABLE DEL2BS80
JSR CONV_DEL2BS PUSHY
STA KEY ;STORE IT BECAUSE A WILL GET WIPED LDY OURCH ;GET CURSOR POSITION
LDA ORIGCURS JSR PICK ;GET CURSOR CHARACTER
LDY CURSPOS STA CURSOR80 ;REMEMBER CURSOR CHARACTER
STA (BASL),Y ;REPLACE CURSOR JSR INVERT ;INVERT CHAR AT CURSOR POSITION
JMP FINISH NEXTKEY JSR GETKEY ;GET KEYBOARD KEY IN ACCUMULATOR
*********************************************************************** JSR CONV_DEL2BS
STA KEY ;REMEMBER WHAT KEY WAS TYPED
*********************************************************************** CMP #ESC ;IS IT ESC?
COL80 BNE NOT_ESC ;KEY IS NOT ESC
LDY OURCH ;GET CURSOR POSITION JSR INVERT ;PREP FOR ESCAPING CURSOR
JSR PICK ;GET CURSOR CHARACTER JSR HANDLE_ESC
STA CURSOR80 ;REMEMBER CURSOR CHARACTER JMP DEL2BS80
JSR INVERT ;INVERT CHAR AT CURSOR POSITION NOT_ESC CMP #RTARROW ;IS IT A RIGHT ARROW
BNE NOT_RT ;NOT RIGHT ARROW THEN DONE
NEXTKEY JSR GETKEY ;GET KEYBOARD KEY IN ACCUMULATOR LDY OURCH ;GET HORIZONTAL CURSOR POSITION
JSR CONV_DEL2BS JSR PICK ;GRAB CHAR FROM SCREEN
STA KEY ;REMEMBER WHAT KEY WAS TYPED ORA #$80 ;SET HIGH BIT
CMP #ESC ;IS IT ESC? STA KEY ;REMEMBER ARROW OVERED CHAR AS TYPED KEY
BNE NOT_ESC ;KEY IS NOT ESC NOT_RT LDY OURCH ;SET CURSOR POSITION
JSR INVERT ;PREP FOR ESCAPING CURSOR JSR INVERT ;CURSOR CHAR MUST BE IN A
JSR HANDLE_ESC POPY ;RESTORE X AND Y
JMP COL80 LDA KEY ;LOAD RETURN VALUE
NOT_ESC CMP #RTARROW ;IS IT A RIGHT ARROW RTS
BNE NOTRTARROW ;NOT RIGHT ARROW THEN DONE
RTARROWHIT LDY OURCH ;GET HORIZONTAL CURSOR POSITION
JSR PICK ;GRAB CHAR FROM SCREEN
ORA #$80 ;SET HIGH BIT
STA KEY ;REMEMBER ARROW OVERED CHAR AS TYPED KEY
NOTRTARROW
LDY OURCH ;SET CURSOR POSITION
JSR INVERT ;CURSOR CHAR MUST BE IN A
***********************************************************************
FINISH POPY ;RESTORE X AND Y
LDA KEY ;LOAD RETURN VALUE
RTS
******************************** ********************************
* * * *
@ -248,88 +249,45 @@ FINISH POPY ;RESTORE X AND Y
* 1. KEY IS IN ACCUMULATOR * * 1. KEY IS IN ACCUMULATOR *
* * * *
******************************** ********************************
CONV_DEL2BS
CONV_DEL2BS CMP #DELETE ;IS THE KEY IN A THE DELETE KEY CMP #DELETE ;IS THE KEY IN A THE DELETE KEY
BNE D2BDONE BNE D2BDONE
LDA #BKSPACE LDA #BKSPACE
D2BDONE RTS D2BDONE RTS
******************************** ********************************
* * * *
* PUTCHAR80 SUBROUTINE * * HANDLE_ESC SUBROUTINE *
* *
* IN 80-COL MODE EVEN COLUMNS *
* ARE IN AUXILIARY MEMORY *
* WHILE ODD COLUMNS ARE IN *
* MAIN MEMORY. *
* *
* A - CHARACTER TO DISPLAY *
* Y - DESIRED COLUMN *
* * * *
******************************** ********************************
*PUTCHAR80
* PHA
* SEI ;DISABLE INTERRUPTS
* STA SET80COL ;ENABLE MAIN/AUX MEM SWITCHING
* TYA ;LOAD 80-COL HORIZ CURSOR POSITN
* LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN
* BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM
*MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON
* JMP CONTINUE ;AVOID AUX MEM ENABLE
*AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF
*CONTINUE TAY ;MOVE CURSOR POSITION TO Y
* PLA ;LOAD THE CHARACTER TO DISPLAY
* STA (BASL),Y ;DISPLAY THE CHARACTER
* STA PAGE2OFF ;TURN MAIN MEM BACK ON
* CLI ;ENABLE INTERRUPTS
* RTS
HANDLE_ESC HANDLE_ESC
JSR ESC_ON PUSHY
JSR GETKEY JSR ESC_ON
JSR ESC_OFF JSR GETKEY
JSR UPSHFT JSR ESC_OFF
AND #$7F JSR UPSHFT
LDY #$10 AND #$7F
ESC2 CMP ESCTAB,Y LDY #$10
BEQ ESC3 ESC2 CMP ESCTAB,Y
DEY BEQ ESC3
BPL ESC2 DEY
BMI ESCSPEC BPL ESC2
ESC3 LDA ESCCHAR,Y JMP ESCDONE
AND #$7F ESC3 LDA ESCCHAR,Y
JSR CTLCHAR AND #$7F
LDA ESCCHAR,Y JSR CTLCHAR
BMI HANDLE_ESC LDA ESCCHAR,Y
RTS ;WAS JMP B.INPUT BMI HANDLE_ESC
ESCSPEC TAY ESCDONE POPY
LDA DOS33_MODE RTS
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
******************************** ********************************
* * * *
* DATA * * DATA *
* * * *
******************************** ********************************
LOADMSG ASC "LOADED DELETE TO BACKSPACE CONVERTER",0D,"AT ADDRESS $803",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

36
handle_esc.s Normal file
View File

@ -0,0 +1,36 @@
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

30
putchar80.s Normal file
View File

@ -0,0 +1,30 @@
********************************
* *
* PUTCHAR80 SUBROUTINE *
* *
* IN 80-COL MODE EVEN COLUMNS *
* ARE IN AUXILIARY MEMORY *
* WHILE ODD COLUMNS ARE IN *
* MAIN MEMORY. *
* *
* A - CHARACTER TO DISPLAY *
* Y - DESIRED COLUMN *
* *
********************************
PUTCHAR80
PHA
SEI ;DISABLE INTERRUPTS
STA SET80COL ;ENABLE MAIN/AUX MEM SWITCHING
TYA ;LOAD 80-COL HORIZ CURSOR POSITN
LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN
BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM
MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON
JMP CONTINUE ;AVOID AUX MEM ENABLE
AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF
CONTINUE TAY ;MOVE CURSOR POSITION TO Y
PLA ;LOAD THE CHARACTER TO DISPLAY
STA (BASL),Y ;DISPLAY THE CHARACTER
STA PAGE2OFF ;TURN MAIN MEM BACK ON
CLI ;ENABLE INTERRUPTS
RTS