I've seen keyboard emulators in different gaming forums (mostly mame related), where it IS put in parallel with the keyboard.

anyways, I came across this function/macro/whatever for reading a ps/2 keyboard in great cow basic. says it's free and ok to copy sooo...


Code:
'    PS/2 keyboard/mouse routines for Great Cow BASIC
'    Copyright (C) 2006 Hugh Considine

'    This library is free software; you can redistribute it and/or
'    modify it under the terms of the GNU Lesser General Public
'    License as published by the Free Software Foundation; either
'    version 2.1 of the License, or (at your option) any later version.

'    This library is distributed in the hope that it will be useful,
'    but WITHOUT ANY WARRANTY; without even the implied warranty of
'    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
'    Lesser General Public License for more details.

'    You should have received a copy of the GNU Lesser General Public
'    License along with this library; if not, write to the Free Software
'    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

'********************************************************************************
'IMPORTANT:
'THIS FILE IS ESSENTIAL FOR SOME OF THE COMMANDS IN GCBASIC. DO NOT ALTER THIS FILE
'UNLESS YOU KNOW WHAT YOU ARE DOING. CHANGING THIS FILE COULD RENDER SOME GCBASIC
'COMMANDS UNUSABLE!
'********************************************************************************

#define PS2Data SysTemp.0 'Set to data pin
#define PS2Clock SysTemp.0 'Set to clock pin

#startup InitPS2

'Initialise
sub InitPS2
 DIR PS2Clock IN
 DIR PS2Data IN
 KeyShift = 0
 MouseX = 0
 MouseY = 0
end sub

'Return ASCII value of input key
function INKEY
 'Initialise, and get key scan code
 INKEY = 0
 ScanCode = PS2ReadByte
 if ScanCode = 0 then exit function

 '2-byte key?
 if ScanCode = 0xE0 then
  do while INKEY = 0
   INKEY = PS2ReadByte
  loop
  INKEY = INKEY OR 128
 end if

 'Shift/Capslock
 if ScanCode = 0x12 or ScanCode = 0x59 then KeyShift = 1: exit function
 if ScanCode = 0x58 then 
  if KeyShift = 2 then KeyShift = 0: exit function
  KeyShift = 2
  exit function
 end if

 'Translate scan code to ASCII
 
 'Control Chars
 if ScanCode = 0x5A then INKEY = 13	'Enter
 if ScanCode = 0x66 then INKEY = 8	'Backspace
 if ScanCode = 0x76 then INKEY = 27	'Esc
 if ScanCode = 0x29 then INKEY = 32	'Space

 'Arrows
 

 'Numbers
 if ScanCode = 0x45 then INKEY = 48
 if ScanCode = 0x16 then INKEY = 49
 if ScanCode = 0x1E then INKEY = 50
 if ScanCode = 0x26 then INKEY = 51
 if ScanCode = 0x25 then INKEY = 52
 if ScanCode = 0x2E then INKEY = 53
 if ScanCode = 0x36 then INKEY = 54
 if ScanCode = 0x3D then INKEY = 55
 if ScanCode = 0x3E then INKEY = 56
 if ScanCode = 0x46 then INKEY = 57

 'Letters
 if ScanCode = 0x1C then INKEY = 65 'A
 if ScanCode = 0x32 then INKEY = 66
 if ScanCode = 0x21 then INKEY = 67 'C
 if ScanCode = 0x23 then INKEY = 68
 if ScanCode = 0x24 then INKEY = 69 'E
 if ScanCode = 0x2B then INKEY = 70
 if ScanCode = 0x34 then INKEY = 71 'G
 if ScanCode = 0x33 then INKEY = 72
 if ScanCode = 0x43 then INKEY = 73 'I
 if ScanCode = 0x3B then INKEY = 74
 if ScanCode = 0x42 then INKEY = 75 'K
 if ScanCode = 0x4B then INKEY = 76
 if ScanCode = 0x3A then INKEY = 77 'M
 if ScanCode = 0x31 then INKEY = 78
 if ScanCode = 0x44 then INKEY = 79 'O
 if ScanCode = 0x4D then INKEY = 80
 if ScanCode = 0x15 then INKEY = 81 'Q
 if ScanCode = 0x2D then INKEY = 82
 if ScanCode = 0x1B then INKEY = 83 'S
 if ScanCode = 0x2C then INKEY = 84
 if ScanCode = 0x3C then INKEY = 85 'U
 if ScanCode = 0x2A then INKEY = 86
 if ScanCode = 0x1D then INKEY = 87 'W
 if ScanCode = 0x22 then INKEY = 88
 if ScanCode = 0x35 then INKEY = 89 'Y
 if ScanCode = 0x1A then INKEY = 90 'Z

 if INKEY >= 65 and INKEY <= 90 and KeyShift = 0 then INKEY += 32

 'Symbols
 if ScanCode = 0x0E then INKEY = 96 '`
 if ScanCode = 0x4E then INKEY = 45 '-
 if ScanCode = 0x55 then INKEY = 61 '=
 if ScanCode = 0x5D then INKEY = 92 '\
 if ScanCode = 0x4c then INKEY = 59 ';
 if ScanCode = 0x52 then INKEY = 39 ''
 if ScanCode = 0x41 then INKEY = 44 ',
 if ScanCode = 0x49 then INKEY = 46 '.
 if ScanCode = 0x4A then INKEY = 47 '/

 if KeyShift = 1 then KeyShift = 0

end function

function PS2ReadByte
 PS2ReadByte = 0
 if PS2Clock ON THEN exit function

 'Start Bit
 wait until PS2Clock OFF
 if PS2Data ON then exit function
 wait until PS2Clock ON
 
 '8 data bits
 For PS2Bit = 1 to 8
  wait until PS2Clock OFF 
  set STATUS.C OFF
  if PS2Data ON then set STATUS.C ON
  ROTATE PS2ReadByte RIGHT
  wait until PS2Clock ON
 next

 'Parity
  wait until PS2Clock OFF
  wait until PS2Clock ON

 'End
  wait until PS2Clock OFF
  wait until PS2Clock ON
end function

sub PS2WriteByte (PS2Byte) #NR

 'Take control
 dir PS2Clock Out
 set PS2Clock Off
 wait 12 10us
 dir PS2Data Out
 set PS2Data Off
 dir PS2Clock In

 'Start Bit
 wait until PS2Clock on
 wait until PS2Clock off

 PS2Parity = 0
 
 '8 data bits
 For PS2Bit = 1 to 8
  if PS2Byte.0 Off then Set PS2Data off
  if PS2Byte.0 On then Set PS2Data on: PS2Parity += 1
  ROTATE PS2ReadByte RIGHT
  wait until PS2Clock ON
  wait until PS2Clock OFF
 next

 'Parity
 if PS2Parity.0 off then Set PS2Data on  
 if PS2Parity.0 on then Set PS2Data off
 wait until PS2Clock ON
 wait until PS2Clock OFF

 'Stop
 set PS2Data On
 wait until PS2Clock ON
 wait until PS2Clock OFF

 'Ack
  Set PS2Data Off
  wait until PS2Clock ON
  dir PS2Data in
 
 wait 100 10us

end sub
don't know if it'll do anyone any good, but....