Code: Select all
I have not unit tested the ACCEPT_CODE routine, so could you please rewrite it using the following best coding practices:
Use PHD/TCD to point the direct page register at the stack frame so locals can use direct page addressing modes including INC, DEC, and indirect (loc).
Do not use SCRATCH0, SCRATCH1, TMPA, TMPB, or W — all temporaries must live in the stack frame.
Since DP is relocated, all parameter stack accesses via X must use absolute forced addressing, e.g. LDA a:0,X.
Reserve stack space with TSC / SEC / SBC #SIZE / TCS before TCD, and save/restore PHD/PLD around the frame.
Use a single @return label with BRA from success and fall-through from failure, with stack teardown, PLY, and PLD done once.
Code: Select all
;------------------------------------------------------------------------------
; ACCEPT ( addr len -- actual ) read a line from UART into buffer
;------------------------------------------------------------------------------
HEADER "ACCEPT", ACCEPT_CFA, 0, TIB_CFA
CODEPTR ACCEPT_CODE
PUBLIC ACCEPT_CODE
.a16
.i16
LDA 0,X ; max len
STA TMPA
INX
INX
LDA 0,X ; addr
INX
INX
STA SCRATCH0 ; Buffer pointer
STZ SCRATCH1 ; Char count = 0
@getchar:
JSR hal_getch ; Blocking receive, char in A
STA TMPB ; Save char for later use
; Handle CR → end of line
CMP #$0D
BEQ @done
; Handle backspace (BS or DEL)
CMP #$08
BEQ @backspace
CMP #$7F
BEQ @backspace
; Check buffer full - ignore char if so
LDA SCRATCH1
CMP TMPA
BCS @getchar
; Store char in buffer
PHY ; Save IP
LDY SCRATCH1 ; Index = current count
SEP #MEM16
.A8
LDA TMPB ; Restore char
STA (SCRATCH0),Y ; Store in buffer
REP #MEM16
.A16
PLY ; Restore IP
; Echo char back
LDA TMPB
JSR hal_putch
; Increment count
INC SCRATCH1
BRA @getchar
@backspace:
LDA SCRATCH1
BEQ @getchar ; Nothing to delete
DEC SCRATCH1
; Echo backspace-space-backspace to erase character on terminal
LDA #$08
JSR hal_putch
LDA #$20
JSR hal_putch
LDA #$08
JSR hal_putch
BRA @getchar
@done:
; Echo CR+LF
LDA #$0D
JSR hal_putch
LDA #$0A
JSR hal_putch
; Push actual char count
LDA SCRATCH1
DEX
DEX
STA 0,X
NEXT
ENDPUBLIC