Browse Source

ti/kbd: widen char detection

no alpha yet.

ref #41
pull/75/head
Virgil Dupras 4 years ago
parent
commit
ca8b315e9d
1 changed files with 48 additions and 65 deletions
  1. +48
    -65
      kernel/ti/kbd.asm

+ 48
- 65
kernel/ti/kbd.asm View File

@@ -7,8 +7,8 @@

; *** Code ***

; Wait for a digit to be pressed and sets the A register to the value (0-9) of
; that digit.
; Wait for a digit to be pressed and sets the A register ASCII value
; corresponding to that key press.
;
; This routine waits for a key to be pressed, but before that, it waits for
; all keys to be de-pressed. It does that to ensure that two calls to
@@ -22,78 +22,50 @@
; if the result isn't 0xff, at least one key is pressed.
kbdGetC:
push bc
push hl

; loop until a digit is pressed
.loop:
; When we check for digits, we go through all 3 groups containing them.
; for each group, we load the digit we check for in B and then test the
; bit for that key. If the bit is reset, our key is pressed. we can
; jump to the end, copy B into A and return.

; check group 2
ld a, 0xfb
call .get

ld b, '3'
bit 1, a
jr z, .end

ld b, '6'
bit 2, a
jr z, .end

ld b, '9'
bit 3, a
jr z, .end

ld a, 0xf7
call .get

ld b, '2'
bit 1, a
jr z, .end

ld b, '5'
bit 2, a
jr z, .end

ld b, '8'
bit 3, a
jr z, .end

; check group 4
ld a, 0xef
ld hl, .dtbl
; we go through the 7 rows of the table
ld b, 7
.inner:
ld a, (hl) ; group mask
call .get

ld b, '0'
bit 0, a
jr z, .end

ld b, '1'
bit 1, a
jr z, .end

ld b, '4'
bit 2, a
jr z, .end

ld b, '7'
bit 3, a
jr z, .end

jr .loop ; nothing happened? loop

.end:
; loop until all keys are de-pressed
.loop2:
cp 0xff
jr nz, .something
; nothing for that group, let's scan the next group
ld a, 9
call addHL ; go to next row
djnz .inner
; found nothing, loop
jr .loop
.something:
; We have something on that row! Let's find out which char. Register A
; currently contains a mask with the pressed char bit unset.
ld b, 8
inc hl
.findchar:
rrca ; is next bit unset?
jr nc, .gotit ; yes? we have our char!
inc hl
djnz .findchar
.gotit:
ld a, (hl)
or a ; is char 0?
jr z, .loop ; yes? unsupported. loop.
; wait until all keys are de-pressed
push af ; --> lvl 1
.wait:
xor a
call .get
inc a ; if a was 0xff, will become 0 (nz test)
jr nz, .loop2 ; non-zero? something is pressed
jr nz, .wait ; non-zero? something is pressed

; copy result into A
ld a, b
pop af ; <-- lvl 1

pop hl
pop bc
ret
.get:
@@ -106,3 +78,14 @@ kbdGetC:
in a, (KBD_PORT)
ei
ret

; digits table. each row represents a group. first item is group mask.
; 0 means unsupported. no group 7 because it has no keys.
.dtbl:
.db 0xfe, 0, 0, 0, 0, 0, 0, 0, 0
.db 0xfd, 0x0d, '+' ,'-' ,'*', '/', '^', 0, 0
.db 0xfb, 0, '3', '6', '9', ')', 0, 0, 0
.db 0xf7, '.', '2', '5', '8', '(', 0, 0, 0
.db 0xef, '0', '1', '4', '7', ',', 0, 0, 0
.db 0xdf, 0, 0, 0, 0, 0, 0, 0, 0
.db 0xbf, 0, 0, 0, 0, 0, 0, 0, 0x7f

Loading…
Cancel
Save