Browse Source

ti84: kbd driver wip

pull/102/head
Virgil Dupras 4 years ago
parent
commit
4ce0727c72
12 changed files with 89 additions and 5 deletions
  1. +1
    -0
      blk/263
  2. +7
    -0
      blk/312
  3. +0
    -1
      blk/433
  4. +1
    -1
      blk/550
  5. +16
    -0
      blk/564
  6. +6
    -0
      blk/565
  7. +14
    -0
      blk/566
  8. +16
    -0
      blk/567
  9. +9
    -0
      blk/568
  10. +13
    -0
      blk/569
  11. BIN
      emul/forth.bin
  12. +6
    -3
      recipes/ti84/xcomp.fs

+ 1
- 0
blk/263 View File

@@ -4,6 +4,7 @@ VARIABLE XCURRENT
: XCOFF 0x02 RAM+ CURRENT* ! ;

: (xentry) XCON (entry) XCOFF ;
: XCREATE (xentry) 11 C, ;

: XCODE XCON CODE XCOFF ;



+ 7
- 0
blk/312 View File

@@ -5,4 +5,11 @@ CODE 2DROP
chkPS,
;CODE

( a b -- a b a b )
CODE 2DUP
HL POPqq, ( b ) DE POPqq, ( a )
chkPS,
DE PUSHqq, HL PUSHqq,
DE PUSHqq, HL PUSHqq,
;CODE


+ 0
- 1
blk/433 View File

@@ -7,7 +7,6 @@
SWAP DROP
;

: 2DUP OVER OVER ;
: 2OVER 3 PICK 3 PICK ;
: 2SWAP 3 ROLL 3 ROLL ;



+ 1
- 1
blk/550 View File

@@ -3,4 +3,4 @@ TI-84+ Recipe
Support code for the TI-84+ recipe. Contains drivers for the
keyboard and LCD.

551 LCD
551 LCD 564 Keyboard

+ 16
- 0
blk/564 View File

@@ -0,0 +1,16 @@
Keyboard driver

Low layer range: 566-568

Implement a (key) word that interpret keystrokes from the
builtin keyboard. The word waits for a digit to be pressed and
returns the corresponding ASCII value.

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 _wait only go through after two actual key
presses (otherwise, the user doesn't have enough time to
de-press the button before the next _wait routine registers the
same key press as a second one).

(cont.)

+ 6
- 0
blk/565 View File

@@ -0,0 +1,6 @@
Sending 0xff to the port resets the keyboard, and then we have
to send groups we want to "listen" to, with a 0 in the group
bit. Thus, to know if *any* key is pressed, we send 0xff to
reset the keypad, then 0x00 to select all groups, if the result
isn't 0xff, at least one key is pressed.


+ 14
- 0
blk/566 View File

@@ -0,0 +1,14 @@
( Requires KBD_MEM, KBD_PORT )
( gm -- pm, get pressed keys mask for group mask gm )
CODE _get
HL POPqq,
chkPS,
DI,
A 0xff LDrn,
KBD_PORT OUTnA,
A L LDrr,
KBD_PORT OUTnA,
KBD_PORT INAn,
EI,
L A LDrr, HL PUSHqq,
;CODE

+ 16
- 0
blk/567 View File

@@ -0,0 +1,16 @@
( wait until all keys are de-pressed. To avoid repeat keys, we
require 64 subsequent polls to indicate all depressed keys.
all keys are considered depressed when the 0 group returns
0xff. )
: _wait 64 0 DO 0 _get 0xff = UNTIL ;

( digits table. seach row represents a group. 0 means
unsupported. no group 7 because it has no key. )
CREATE _dtbl
0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0 C,
0xd C, '+' C, '-' C, '*' C, '/' C, '^' C, 0 C, 0 C,
0 C, '3' C, '6' C, '9' C, ')' C, 0 C, 0 C, 0 C,
'.' C, '2' C, '5' C, '8' C, '(' C, 0 C, 0 C, 0 C,
'0' C, '1' C, '4' C, '7' C, ',' C, 0 C, 0 C, 0 C,
0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0x80 ( alpha ) C,
0 C, 0 C, 0 C, 0 C, 0 C, 0x81 ( 2nd ) C, 0 C, 0x7f C,

+ 9
- 0
blk/568 View File

@@ -0,0 +1,9 @@
( alpha table. same as _dtbl, for when we're in alpha mode. )
CREATE _atbl
0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0 C, 0 C,
0xd C, '"' C, 'w' C, 'r' C, 'm' C, 'h' C, 0 C, 0 C,
'?' C, 0 C, 'v' C, 'q' C, 'l' C, 'g' C, 0 C, 0 C,
':' C, 'z' C, 'u' C, 'p' C, 'k' C, 'f' C, 'c' C, 0 C,
0x20 C, 'y' C, 't' C, 'o' C, 'j' C, 'e' C, 'b' C, 0 C,
0 C, 'x' C, 's' C, 'n' C, 'i' C, 'd' C, 'a' C, 0x80 C,
0 C, 0 C, 0 C, 0 C, 0 C, 0x81 ( 2nd ) C, 0 C, 0x7f C,

+ 13
- 0
blk/569 View File

@@ -0,0 +1,13 @@
: (key)
0 ( gid ) 0 ( dummy )
BEGIN ( loop until a digit is pressed )
DROP
1+ DUP 7 = IF DROP 0 THEN ( inc gid )
1 OVER LSHIFT 0xff -^ ( group dmask ) _get
DUP 0xff = NOT UNTIL
( gid dmask )
0xff XOR ( dpos ) 0 ( dindex )
BEGIN 2DUP RSHIFT IF 1+ 1 ELSE 0 THEN UNTIL
( gid dpos dindex ) SWAP DROP
( gid dindex ) SWAP 8 * + _dtbl + C@
;

BIN
emul/forth.bin View File


+ 6
- 3
recipes/ti84/xcomp.fs View File

@@ -1,27 +1,30 @@
0x8000 CONSTANT RAMSTART
0xb000 CONSTANT RS_ADDR
RAMSTART 0x70 + CONSTANT LCD_MEM
0x01 CONSTANT KBD_PORT
212 LOAD ( z80 assembler )
262 LOAD ( xcomp )
522 LOAD ( font compiler )
: CODE XCODE ;
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: CREATE XCREATE ; ( for KBD tbls )
: : [ ' X: , ] ;

CURRENT @ XCURRENT !

282 LOAD ( boot.z80 )
393 LOAD ( icore low )
555 557 LOADR ( ti low )
555 557 LOADR ( LCD low )
566 569 LOADR ( KBD low )
415 LOAD ( icore high )
(entry) ~FNT CPFNT3x5
(entry) _
( Update LATEST )
PC ORG @ 8 + !
422 437 XPACKR ( core )
558 560 XPACKR ( ti high )
558 560 XPACKR ( LCD high )
438 446 XPACKR ( print fmt )
," : _ LCD$ LIT< Hello (print) LIT< World! (print) BYE ; _ "
," : _ LCD$ LIT< Hello (print) (key) (emit) BYE ; _ "
ORG @ 256 /MOD 2 PC! 2 PC!
H@ 256 /MOD 2 PC! 2 PC!

Loading…
Cancel
Save