;
; GETS - Inputs a string into the
; buffer pointed to by HL. String is
; NULL-terminated.
;
; No registers are modified.
;
GETS
PUSH AF
PUSH HL
PUSH BC
PUSH DE
PUSH IX
PUSH IY
PUSH HL
POP IX ; IX = end of buffer
LD (IX), 0
GETS_LOOP ; wait for key
LD A, (NUMKEY)
CP 0
JP NZ, GOT_KEY
LD A, (SHOULD_RUN)
CP 0
JP Z, GETS_LOOP
; comment this in for the next burn-in
; LD A, 0
; LD (SHOULD_RUN), A
LD HL, (CURRENT_ADDR)
JP (HL)
GOT_KEY
DI
LD A, (NUMKEY) ; in case it changed before DI
LD IY, KEYBUF
LD B, A
GETS_COPY
LD A, (IY)
CP 8 ; backspace
JP Z, BACKSPACE
CP 127 ; delete
JP NZ, NOT_BACKSPACE
BACKSPACE
; do not backspace past beginning of buffer
PUSH IX ; move IX into DE
POP DE
SCF ; carry = 1
CCF ; carry = 0
PUSH HL ; save HL
SBC HL, DE ; HL -= DE
POP HL ; restore HL
JP Z, NEXT_KEY ; do not backspace if IX == HL
DEC IX
JP NEXT_KEY
NOT_BACKSPACE
LD (IX), A
INC IX
NEXT_KEY
CP 10 ; return (keyboard)
JP Z, GETS_DONE
CP 13 ; return (maybe serial)
JP Z, GETS_DONE
INC IY
DJNZ GETS_COPY
LD A, 0
LD (NUMKEY), A
EI
LD (IX), 0
CALL LCDPRINT
JP GETS_LOOP
GETS_DONE
LD A, 0
LD (NUMKEY), A
EI
LD (IX), 0
POP IY
POP IX
POP DE
POP BC
POP HL
POP AF
RET
;----------------------------------------