Re: A83: Char Table
[Prev][Next][Index][Thread]
Re: A83: Char Table
this comes from the online usgard school by jimmy mardel (of sqrxz
fame). this is for the ti-85, but can be ported (the most important
thing would be to change the key codes).
; Input routine - made by Jimmy Mårdell 97-03-05
;
; Reads a sentence entered from the keyboard. Only uppercase
; letters and space are allowed. Left arrowkey = backspace.
;
; When calling, HL should point to where the string should
; be stored and A should hold the maximum length of the
; string. Be sure there are enough space (A+1) to store the
; nullterminated string at HL! ($800C) should hold the screen
; position where the string starts.
;
; This input routine will also have a flashing cursor. If you
; don't like it, remove all rows where the explanation starts
; with a *.
;
; IMPORTANT: The input must NOT wrap to a new row! Then it
; will not work properly. The last char on a row should not
; be used either (if cursorcol=0 when calling, the maximum char
; length is 20). If you have a cursor, the two last chars should
; not be used (max length 19 if the screen location starts to
; the far left).
;
; The routine requires one temporary variable, noLet.
Input:
push bc
push de
push hl
set 2,(iy+12) ; * Turn cursor blinking on
ld (noLet),a ; Store the maximum lenght of the string
ld e,0 ; E = numbers of letters written so far
WaK:
ld a,32
ld ($800E),a ; * Set "character under cursor" to space
push hl ; * Save HL since GET_KEY destroys HL
call GET_KEY
cp $02 ; $02 = left key
jr z,BackSpace
cp $09 ; $09 = enter
jr z,NameDone
cp $11 ; $11 = space
jr nz,CheckLetter
ld a,32 ; Space is ascii char 32
pop hl
jr PutLetter ; Put the letter on screen and in memory
CheckLetter:
ld hl,&Letters ; HL -> letter table
ld bc,26 ; 26 letters to check
cpir ; Compare A with each letter until match
ld d,c ; Then C = the letter. Store in D
pop hl ; HL -> current position in string
jr nz,WaK ; Wait until valid keystroke
ld a,65 ; 65 = ascii char for A
add a,d ; Now A=ASCII char for the letter pressed
PutLetter:
ld c,a
ld a,(noLet) ; A = max letters
cp e ; Check if max size is reached
jr z,WaK ; If so, wait for a new key
ld (hl),c ; If not, store the key entered
inc hl ; Point to the next byte in the string
inc e ; And increase the letter counter
ld a,c
call TX_CHARPUT ; Show the chars pressed on the screen
jr WaK ; And jump back and wait for a new key
BackSpace:
pop hl ; HL -> current position in string
ld a,e
or a ; Check if string size = 0
jr z,WaK ; If so, backspace not allowed - repeat
res 2,(iy+12) ; * Stopp cursor blinking
dec e ; Decrease string size
dec hl ; And string pointer
push hl
ld hl,$800D ; HL -> x cursor position
dec (hl) ; Decrease it
ld a,32 ; Overwrite the last letter with a space
call TX_CHARPUT ; Put the space over the chars
call TX_CHARPUT ; * And over the blinking cursor
dec (hl) ; * Decrease the x coordinate twice
dec (hl)
pop hl
set 2,(iy+12) ; * Stopp cursor blinking
jr WaK ; Wait for a key
NameDone:
pop hl ; HL -> current position in string
ld (hl),0 ; Put a terminating zero at end of string
res 2,(iy+12) ; * Stopp cursor blinking
pop hl
pop de
pop bc
ret
; The keycodes of the letters A-Z stored backways
Letters:
.db $19,$21,$0A,$12,$1A,$22,$0B,$13,$1B,$23,$2B
.db $0C,$14,$1C,$24,$2C,$0D,$15,$1D,$25,$2D,$0E
.db $16,$1E,$26,$2E
Follow-Ups:
References: