A82: Input Routine


[Prev][Next][Index][Thread]

A82: Input Routine



This is geared mostly for Dines...
I have probably waited too long to ask this, but the reason the input routine
wasnt working was because of the blinking cursor.  Are the addresses correct?
Look for the stars
TIA, 

~Adamman


; 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
 ei
; set 2,(iy+12)         ; * Turn cursor blinking on (interrupts must be
enabled)
 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 it's content
	ld a, 217
	ROM_CALL(TX_CHARPUT)
	ld hl, $800D
	dec (hl)
 call GET_KEY
 cp $02                ; $02 = left key
 jr z,BackSpace
 cp $09                ; $09 = enter
 jr z,NameDone
 or a
 jr nz,CheckLetter
 pop hl
 jr WaK
CheckLetter:
 ld hl,Letters
 ld bc,26              ; 26 letters to check
 cpir                  ; Compare A with each letter until a match is found
 ld d,c                ; Then C = the letter. Store in D
 pop hl                ; HL -> current position in string
 jr nz,WaK             ; If not valid keystroke, wait for new key
 ld a,65               ; 65 = ascii char for A
 add a,d               ; A now holds the 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
 ROM_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 is impossible. Check for new key.
; 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
 ROM_CALL(TX_CHARPUT)  ; Put the space over the chars
 ROM_CALL(TX_CHARPUT)  ; * And over the (non) 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 the end of the 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 $1A,$22,$2A         ;ZYX
 .db $0B,$13,$1B,$23,$2B ;WVUTS
 .db $0C,$14,$1C,$24,$2C ;RQPON
 .db $0D,$15,$1D,$25,$2D ;MLKJI
 .db $0E,$16,$1E,$26,$2E ;HGFED
 .db $1F,$27,$2F         ;CBA


Follow-Ups: