[A86] Hex input routine
[Prev][Next][Index][Thread]
[A86] Hex input routine
Can someone tell me what's wrong with this routine?
<tt>
;input_hex_word
; input: user enters two hex bytes using 0-9 and A-F
; output: carry flag set => user aborted
; no carry => result in hl
; destroyed: a
input_hex_word:
push bc
push de
ld b,4 ;4 characters to be entered
inhex_key:
call _getcsc
push hl ;because it contains the input
ld hl,keytable
ld d,b ;save char #
ld bc,$1000 ;b=counter=16, c=value=0
inhex_key_loop:
cp (hl) ;was this the key pressed?
jr z,inhex_gotdigit ;if so, we have the value
inc c ;otherwise, next value
inc hl ; and next key
djnz inhex_key_loop ;do this for all 16 value keys
ld b,d ;get back char #
pop hl ;get the input back into hl
cp K_EXIT ;no DEL handling yet
jr nz,inhex_key
pop de
pop bc
scf ;user aborted
ret ;exit
keytable:
.db K_0,K_1,K_2,K_3,K_4,K_5,K_6,K_7
.db K_8,K_9,K_LOG,K_SIN,K_COS,K_TAN,K_RAISE,K_LN
inhex_gotdigit:
push bc ;save char # and value
push hl ;save input
ld l,c ;
ld h,0 ;hl = value
ld a,b ;a = char #
dec a ;0-3, not 1-4
jr z,after_loop ;if last char, no shift necessary
add a,a
add a,a
ld b,a ;b = # of bit positions to shift
gotdigit_loop:
add hl,hl ;shift hl one bit left
djnz gotdigit_loop ;the goal here is to move the 4-bit value
after_loop: ; into one of the 4 nibbles in hl
ex de,hl ;save new value
pop hl
add hl,de ;add to value from previously entered chars
pop bc ;get back char # and value
ld a,'0'
add a,c
cp '9'+1
jr nc,got_char
add a,'A'-'9'
got_char:
call _putc
dec b ;next char
jp nz,inhex_key ;too far away for djnz
pop de
pop bc
rcf ;successful (user entered all 4 chars w/o aborting)
ret
</tt>