RS2376 keyboard ROM matrix mapping ================================== Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &00 | &01 | &02 | &03 | &04 | &05 | &06 | &07 | &11 | &10 | &0F | X0 S | &00 | &01 | &02 | &03 | &04 | &05 | &06 | &07 | &11 | @ | _ | - | &00 | &01 | &02 | &03 | &04 | &05 | &06 | &07 | &11 | P | O | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &10 | &0B | &0C | &0E | &0D | &15 | &16 | &17 | &18 | &19 | &1A | X1 S | &10 | [ | \ | ^ | ] | &15 | &16 | &17 | &18 | &19 | &1A | - | &10 | K | L | N | M | &15 | &16 | &17 | &18 | &19 | &1A | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &00 | &1C | &1D | &1E | &1F | &00 | &00 | &00 | &20 | &00 | &1F | X2 S | = | &1C | &1D | &1E | &1F | < | > | . | &20 | , | _ | - | - | &1C | &1D | &1E | &1F | < | > | . | &20 | , | _ | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &00 | &00 | &10 | &1F | &00 | &08 | &1B | &1D | &0D | &0A | &7F | X3 S | 0 | * | P | &7F | &60 | &08 | { | } | &0D | &0A | &7F | - | 0 | : | p | _ | @ | &08 | [ | ] | &0D | &0A | &7F | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &00 | &00 | &00 | &00 | &0D | &0E | &02 | &16 | &03 | &18 | &1A | X4 S | + | ? | > | < | M | N | B | V | C | X | Z | - | ; | / | . | , | m | n | b | v | c | x | z | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &0C | &0B | &0A | &08 | &07 | &06 | &04 | &13 | &01 | &0C | &1B | X5 S | L | K | J | H | G | F | D | S | A | &0C | &1B | - | l | k | j | h | g | f | d | s | a | &0C | &1B | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &0F | &09 | &15 | &19 | &14 | &12 | &05 | &17 | &11 | &09 | &0B | X6 S | O | I | U | Y | T | R | E | W | Q | &09 | &0B | - | o | i | u | y | t | r | e | w | q | &09 | &0B | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ C | &00 | &00 | &00 | &00 | &00 | &00 | &00 | &00 | &00 | &1E | &1C | X7 S | ) | ( | ' | & | % | $ | # | " | ! | ~ | | | - | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ^ | \ | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ D0-D6 (labelled B1-B7): returns ASCII code D7 (labelled B8): clear for letters and control codes, set for non-letters, to allow external CAPSLOCK encoding. D7 set for: SPC 0 1! 2" 3# 4$ 5% 6& 7' 8( 9) :* ;+ <, -= .> /? << >> ,, .. &60 { | } ~ DEL The encoder ROM includes Teletype key combinations: +-----+-----+ | _ | @ | | O | P | +--+--+--+--+--+ +-----+-----+-----+ | [ | \ | | , | . | DEL | | K | L | | , | . | _ | +--+--+--+--+--+--+--+ +-----+-----+-----+ | ^ | ] | | < | > | _ | | N | M | | > | > | _ | +-----+-----+ +-----+-----+-----+ Function Keys ------------- The keys in row X0, X1 and X2 can generate a top-bit signal to implement function keys generating codes &80 to &8F with the following circuitry: ____ X0 ----\ \ ____ >OR >----\ \ X1 ----/___/ >OR >----+---\ X2 --------------/___/ |AND >--+------------------------ D7 +--+---/ | +--\ | | +--\ +---+NOT>---+ +---+NOT>---+---+---\ | +--/ +--/ | |AND >--- D6 D6 ---------|----------------------------------|---+---/ D5 ---------+----------------------------------|------------ D5 | +---+---\ |AND >--- D4 D4 ------------------------------------------------+---/ D3 --------------------------------------------------------- D3 D2 --------------------------------------------------------- D2 D1 --------------------------------------------------------- D1 D0 --------------------------------------------------------- D0 This results in the keys in row X1,X1,X2 that generate codes &00-&1F (and the K/[/&0B key) to generate codes &80-&8F to represent functions keys 0 to 15. Simpler circuitry can be used for just keys 0-10: ____ X0 ----\ \ >OR >----------------------+------------------------ D7 X1 ----/___/ | | D6 --------------------------------|------------------------ D6 D5 --------------------------------|------------------------ D5 | +--\ +---+NOT>---+---\ +--/ |AND >------- D4 D4 --------------------------------------------+---/ D3 --------------------------------------------------------- D3 D2 --------------------------------------------------------- D2 D1 --------------------------------------------------------- D1 D0 --------------------------------------------------------- D0 This results in the keys in row X0,X1 that generate codes &00-&1A to generate codes &80-&8A to represent functions keys 0 to 10. If the code reading the keyboard port masks out extraneous bits D4-D6 if D7 is set, only the following circuitry is needed for &80-&8F from rows X0/X1/X2: ____ X0 ----\ \ ____ >OR >----\ \ X1 ----/___/ >OR >----+---\ X2 --------------/___/ |AND >--+------------------------ D7 +--+---/ +--\ | +---+NOT>---+ | +--/ D6 ---------|----------------------------------------------- D6 D5 ---------+----------------------------------------------- D5 D4 --------------------------------------------------------- D4 D3 --------------------------------------------------------- D3 D2 --------------------------------------------------------- D2 D1 --------------------------------------------------------- D1 D0 --------------------------------------------------------- D0 And the following for &80-&8A from rows X0/X1: ____ X0 ----\ \ >OR >----------------------------------------------- D7 X1 ----/___/ You would use code of the following sort: IN A,(KBD_DATA) ; Read keyboard port AND A ; Test received byte JP P,F1 ; D7 is clear, skip AND &8F ; Mask out D4-D6, giving &80-&8F F1: