mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			736 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			736 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ''***************************************
 | |
| ''*  PS/2 Keyboard Driver v1.0.1        *
 | |
| ''*  Author: Chip Gracey                *
 | |
| ''*  Copyright (c) 2004 Parallax, Inc.  *
 | |
| ''*  See end of file for terms of use.  *
 | |
| ''***************************************
 | |
| 
 | |
| {-----------------REVISION HISTORY-----------------
 | |
|  v1.0.1 - Updated 6/15/2006 to work with Propeller Tool 0.96}
 | |
|  
 | |
| VAR
 | |
| 
 | |
|   long  cog
 | |
| 
 | |
|   long  par_tail        'key buffer tail        read/write      (19 contiguous longs)
 | |
|   long  par_head        'key buffer head        read-only
 | |
|   long  par_present     'keyboard present       read-only
 | |
|   long  par_states[8]   'key states (256 bits)  read-only
 | |
|   long  par_keys[8]     'key buffer (16 words)  read-only       (also used to pass initial parameters)
 | |
| 
 | |
| 
 | |
| PUB start(dpin, cpin) : okay
 | |
| 
 | |
| '' Start keyboard driver - starts a cog
 | |
| '' returns false if no cog available
 | |
| ''
 | |
| ''   dpin  = data signal on PS/2 jack
 | |
| ''   cpin  = clock signal on PS/2 jack
 | |
| ''
 | |
| ''     use 100-ohm resistors between pins and jack
 | |
| ''     use 10K-ohm resistors to pull jack-side signals to VDD
 | |
| ''     connect jack-power to 5V, jack-gnd to VSS
 | |
| ''
 | |
| '' all lock-keys will be enabled, NumLock will be initially 'on',
 | |
| '' and auto-repeat will be set to 15cps with a delay of .5s
 | |
| 
 | |
|   okay := startx(dpin, cpin, %0_000_100, %01_01000)
 | |
| 
 | |
| 
 | |
| PUB startx(dpin, cpin, locks, auto) : okay
 | |
| 
 | |
| '' Like start, but allows you to specify lock settings and auto-repeat
 | |
| ''
 | |
| ''   locks = lock setup
 | |
| ''           bit 6 disallows shift-alphas (case set soley by CapsLock)
 | |
| ''           bits 5..3 disallow toggle of NumLock/CapsLock/ScrollLock state
 | |
| ''           bits 2..0 specify initial state of NumLock/CapsLock/ScrollLock
 | |
| ''           (eg. %0_001_100 = disallow ScrollLock, NumLock initially 'on')
 | |
| ''
 | |
| ''   auto  = auto-repeat setup
 | |
| ''           bits 6..5 specify delay (0=.25s, 1=.5s, 2=.75s, 3=1s)
 | |
| ''           bits 4..0 specify repeat rate (0=30cps..31=2cps)
 | |
| ''           (eg %01_00000 = .5s delay, 30cps repeat)
 | |
| 
 | |
|   stop
 | |
|   longmove(@par_keys, @dpin, 4)
 | |
|   okay := cog := cognew(@entry, @par_tail) + 1
 | |
| 
 | |
| 
 | |
| PUB stop
 | |
| 
 | |
| '' Stop keyboard driver - frees a cog
 | |
| 
 | |
|   if cog
 | |
|     cogstop(cog~ -  1)
 | |
|   longfill(@par_tail, 0, 19)
 | |
| 
 | |
| 
 | |
| PUB present : truefalse
 | |
| 
 | |
| '' Check if keyboard present - valid ~2s after start
 | |
| '' returns t|f
 | |
| 
 | |
|   truefalse := -par_present
 | |
| 
 | |
| 
 | |
| PUB key : keycode
 | |
| 
 | |
| '' Get key (never waits)
 | |
| '' returns key (0 if buffer empty)
 | |
| 
 | |
|   if par_tail <> par_head
 | |
|     keycode := par_keys.word[par_tail]
 | |
|     par_tail := ++par_tail & $F
 | |
| 
 | |
| 
 | |
| PUB getkey : keycode
 | |
| 
 | |
| '' Get next key (may wait for keypress)
 | |
| '' returns key
 | |
| 
 | |
|   repeat until (keycode := key)
 | |
| 
 | |
| 
 | |
| PUB newkey : keycode
 | |
| 
 | |
| '' Clear buffer and get new key (always waits for keypress)
 | |
| '' returns key
 | |
| 
 | |
|   par_tail := par_head
 | |
|   keycode := getkey
 | |
| 
 | |
| 
 | |
| PUB gotkey : truefalse
 | |
| 
 | |
| '' Check if any key in buffer
 | |
| '' returns t|f
 | |
| 
 | |
|   truefalse := par_tail <> par_head
 | |
| 
 | |
| 
 | |
| PUB clearkeys
 | |
| 
 | |
| '' Clear key buffer
 | |
| 
 | |
|   par_tail := par_head
 | |
| 
 | |
| 
 | |
| PUB keystate(k) : state
 | |
| 
 | |
| '' Get the state of a particular key
 | |
| '' returns t|f
 | |
| 
 | |
|   state := -(par_states[k >> 5] >> k & 1)
 | |
| 
 | |
| 
 | |
| DAT
 | |
| 
 | |
| '******************************************
 | |
| '* Assembly language PS/2 keyboard driver *
 | |
| '******************************************
 | |
| 
 | |
|                         org
 | |
| '
 | |
| '
 | |
| ' Entry
 | |
| '
 | |
| entry                   movd    :par,#_dpin             'load input parameters _dpin/_cpin/_locks/_auto
 | |
|                         mov     x,par
 | |
|                         add     x,#11*4
 | |
|                         mov     y,#4
 | |
| :par                    rdlong  0,x
 | |
|                         add     :par,dlsb
 | |
|                         add     x,#4
 | |
|                         djnz    y,#:par
 | |
| 
 | |
|                         mov     dmask,#1                'set pin masks
 | |
|                         shl     dmask,_dpin
 | |
|                         mov     cmask,#1
 | |
|                         shl     cmask,_cpin
 | |
| 
 | |
|                         test    _dpin,#$20      wc      'modify port registers within code
 | |
|                         muxc    _d1,dlsb
 | |
|                         muxc    _d2,dlsb
 | |
|                         muxc    _d3,#1
 | |
|                         muxc    _d4,#1
 | |
|                         test    _cpin,#$20      wc
 | |
|                         muxc    _c1,dlsb
 | |
|                         muxc    _c2,dlsb
 | |
|                         muxc    _c3,#1
 | |
| 
 | |
|                         mov     _head,#0                'reset output parameter _head
 | |
| '
 | |
| '
 | |
| ' Reset keyboard
 | |
| '
 | |
| reset                   mov     dira,#0                 'reset directions
 | |
|                         mov     dirb,#0
 | |
| 
 | |
|                         movd    :par,#_present          'reset output parameters _present/_states[8]
 | |
|                         mov     x,#1+8
 | |
| :par                    mov     0,#0
 | |
|                         add     :par,dlsb
 | |
|                         djnz    x,#:par
 | |
| 
 | |
|                         mov     stat,#8                 'set reset flag
 | |
| '
 | |
| '
 | |
| ' Update parameters
 | |
| '
 | |
| update                  movd    :par,#_head             'update output parameters _head/_present/_states[8]
 | |
|                         mov     x,par
 | |
|                         add     x,#1*4
 | |
|                         mov     y,#1+1+8
 | |
| :par                    wrlong  0,x
 | |
|                         add     :par,dlsb
 | |
|                         add     x,#4
 | |
|                         djnz    y,#:par
 | |
| 
 | |
|                         test    stat,#8         wc      'if reset flag, transmit reset command
 | |
|         if_c            mov     data,#$FF
 | |
|         if_c            call    #transmit
 | |
| '
 | |
| '
 | |
| ' Get scancode
 | |
| '
 | |
| newcode                 mov     stat,#0                 'reset state
 | |
| 
 | |
| :same                   call    #receive                'receive byte from keyboard
 | |
| 
 | |
|                         cmp     data,#$83+1     wc      'scancode?
 | |
| 
 | |
|         if_nc           cmp     data,#$AA       wz      'powerup/reset?
 | |
|         if_nc_and_z     jmp     #configure
 | |
| 
 | |
|         if_nc           cmp     data,#$E0       wz      'extended?
 | |
|         if_nc_and_z     or      stat,#1
 | |
|         if_nc_and_z     jmp     #:same
 | |
| 
 | |
|         if_nc           cmp     data,#$F0       wz      'released?
 | |
|         if_nc_and_z     or      stat,#2
 | |
|         if_nc_and_z     jmp     #:same
 | |
| 
 | |
|         if_nc           jmp     #newcode                'unknown, ignore
 | |
| '
 | |
| '
 | |
| ' Translate scancode and enter into buffer
 | |
| '
 | |
|                         test    stat,#1         wc      'lookup code with extended flag
 | |
|                         rcl     data,#1
 | |
|                         call    #look
 | |
| 
 | |
|                         cmp     data,#0         wz      'if unknown, ignore
 | |
|         if_z            jmp     #newcode
 | |
| 
 | |
|                         mov     t,_states+6             'remember lock keys in _states
 | |
| 
 | |
|                         mov     x,data                  'set/clear key bit in _states
 | |
|                         shr     x,#5
 | |
|                         add     x,#_states
 | |
|                         movd    :reg,x
 | |
|                         mov     y,#1
 | |
|                         shl     y,data
 | |
|                         test    stat,#2         wc
 | |
| :reg                    muxnc   0,y
 | |
| 
 | |
|         if_nc           cmpsub  data,#$F0       wc      'if released or shift/ctrl/alt/win, done
 | |
|         if_c            jmp     #update
 | |
| 
 | |
|                         mov     y,_states+7             'get shift/ctrl/alt/win bit pairs
 | |
|                         shr     y,#16
 | |
| 
 | |
|                         cmpsub  data,#$E0       wc      'translate keypad, considering numlock
 | |
|         if_c            test    _locks,#%100    wz
 | |
|         if_c_and_z      add     data,#@keypad1-@table
 | |
|         if_c_and_nz     add     data,#@keypad2-@table
 | |
|         if_c            call    #look
 | |
|         if_c            jmp     #:flags
 | |
| 
 | |
|                         cmpsub  data,#$DD       wc      'handle scrlock/capslock/numlock
 | |
|         if_c            mov     x,#%001_000
 | |
|         if_c            shl     x,data
 | |
|         if_c            andn    x,_locks
 | |
|         if_c            shr     x,#3
 | |
|         if_c            shr     t,#29                   'ignore auto-repeat
 | |
|         if_c            andn    x,t             wz
 | |
|         if_c            xor     _locks,x
 | |
|         if_c            add     data,#$DD
 | |
|         if_c_and_nz     or      stat,#4                 'if change, set configure flag to update leds
 | |
| 
 | |
|                         test    y,#%11          wz      'get shift into nz
 | |
| 
 | |
|         if_nz           cmp     data,#$60+1     wc      'check shift1
 | |
|         if_nz_and_c     cmpsub  data,#$5B       wc
 | |
|         if_nz_and_c     add     data,#@shift1-@table
 | |
|         if_nz_and_c     call    #look
 | |
|         if_nz_and_c     andn    y,#%11
 | |
| 
 | |
|         if_nz           cmp     data,#$3D+1     wc      'check shift2
 | |
|         if_nz_and_c     cmpsub  data,#$27       wc
 | |
|         if_nz_and_c     add     data,#@shift2-@table
 | |
|         if_nz_and_c     call    #look
 | |
|         if_nz_and_c     andn    y,#%11
 | |
| 
 | |
|                         test    _locks,#%010    wc      'check shift-alpha, considering capslock
 | |
|                         muxnc   :shift,#$20
 | |
|                         test    _locks,#$40     wc
 | |
|         if_nz_and_nc    xor     :shift,#$20
 | |
|                         cmp     data,#"z"+1     wc
 | |
|         if_c            cmpsub  data,#"a"       wc
 | |
| :shift  if_c            add     data,#"A"
 | |
|         if_c            andn    y,#%11
 | |
| 
 | |
| :flags                  ror     data,#8                 'add shift/ctrl/alt/win flags
 | |
|                         mov     x,#4                    '+$100 if shift
 | |
| :loop                   test    y,#%11          wz      '+$200 if ctrl
 | |
|                         shr     y,#2                    '+$400 if alt
 | |
|         if_nz           or      data,#1                 '+$800 if win
 | |
|                         ror     data,#1
 | |
|                         djnz    x,#:loop
 | |
|                         rol     data,#12
 | |
| 
 | |
|                         rdlong  x,par                   'if room in buffer and key valid, enter
 | |
|                         sub     x,#1
 | |
|                         and     x,#$F
 | |
|                         cmp     x,_head         wz
 | |
|         if_nz           test    data,#$FF       wz
 | |
|         if_nz           mov     x,par
 | |
|         if_nz           add     x,#11*4
 | |
|         if_nz           add     x,_head
 | |
|         if_nz           add     x,_head
 | |
|         if_nz           wrword  data,x
 | |
|         if_nz           add     _head,#1
 | |
|         if_nz           and     _head,#$F
 | |
| 
 | |
|                         test    stat,#4         wc      'if not configure flag, done
 | |
|         if_nc           jmp     #update                 'else configure to update leds
 | |
| '
 | |
| '
 | |
| ' Configure keyboard
 | |
| '
 | |
| configure               mov     data,#$F3               'set keyboard auto-repeat
 | |
|                         call    #transmit
 | |
|                         mov     data,_auto
 | |
|                         and     data,#%11_11111
 | |
|                         call    #transmit
 | |
| 
 | |
|                         mov     data,#$ED               'set keyboard lock-leds
 | |
|                         call    #transmit
 | |
|                         mov     data,_locks
 | |
|                         rev     data,#-3 & $1F
 | |
|                         test    data,#%100      wc
 | |
|                         rcl     data,#1
 | |
|                         and     data,#%111
 | |
|                         call    #transmit
 | |
| 
 | |
|                         mov     x,_locks                'insert locks into _states
 | |
|                         and     x,#%111
 | |
|                         shl     _states+7,#3
 | |
|                         or      _states+7,x
 | |
|                         ror     _states+7,#3
 | |
| 
 | |
|                         mov     _present,#1             'set _present
 | |
| 
 | |
|                         jmp     #update                 'done
 | |
| '
 | |
| '
 | |
| ' Lookup byte in table
 | |
| '
 | |
| look                    ror     data,#2                 'perform lookup
 | |
|                         movs    :reg,data
 | |
|                         add     :reg,#table
 | |
|                         shr     data,#27
 | |
|                         mov     x,data
 | |
| :reg                    mov     data,0
 | |
|                         shr     data,x
 | |
| 
 | |
|                         jmp     #rand                   'isolate byte
 | |
| '
 | |
| '
 | |
| ' Transmit byte to keyboard
 | |
| '
 | |
| transmit
 | |
| _c1                     or      dira,cmask              'pull clock low
 | |
|                         movs    napshr,#13              'hold clock for ~128us (must be >100us)
 | |
|                         call    #nap
 | |
| _d1                     or      dira,dmask              'pull data low
 | |
|                         movs    napshr,#18              'hold data for ~4us
 | |
|                         call    #nap
 | |
| _c2                     xor     dira,cmask              'release clock
 | |
| 
 | |
|                         test    data,#$0FF      wc      'append parity and stop bits to byte
 | |
|                         muxnc   data,#$100
 | |
|                         or      data,dlsb
 | |
| 
 | |
|                         mov     x,#10                   'ready 10 bits
 | |
| transmit_bit            call    #wait_c0                'wait until clock low
 | |
|                         shr     data,#1         wc      'output data bit
 | |
| _d2                     muxnc   dira,dmask
 | |
|                         mov     wcond,c1                'wait until clock high
 | |
|                         call    #wait
 | |
|                         djnz    x,#transmit_bit         'another bit?
 | |
| 
 | |
|                         mov     wcond,c0d0              'wait until clock and data low
 | |
|                         call    #wait
 | |
|                         mov     wcond,c1d1              'wait until clock and data high
 | |
|                         call    #wait
 | |
| 
 | |
|                         call    #receive_ack            'receive ack byte with timed wait
 | |
|                         cmp     data,#$FA       wz      'if ack error, reset keyboard
 | |
|         if_nz           jmp     #reset
 | |
| 
 | |
| transmit_ret            ret
 | |
| '
 | |
| '
 | |
| ' Receive byte from keyboard
 | |
| '
 | |
| receive                 test    _cpin,#$20      wc      'wait indefinitely for initial clock low
 | |
|                         waitpne cmask,cmask
 | |
| receive_ack
 | |
|                         mov     x,#11                   'ready 11 bits
 | |
| receive_bit             call    #wait_c0                'wait until clock low
 | |
|                         movs    napshr,#16              'pause ~16us
 | |
|                         call    #nap
 | |
| _d3                     test    dmask,ina       wc      'input data bit
 | |
|                         rcr     data,#1
 | |
|                         mov     wcond,c1                'wait until clock high
 | |
|                         call    #wait
 | |
|                         djnz    x,#receive_bit          'another bit?
 | |
| 
 | |
|                         shr     data,#22                'align byte
 | |
|                         test    data,#$1FF      wc      'if parity error, reset keyboard
 | |
|         if_nc           jmp     #reset
 | |
| rand                    and     data,#$FF               'isolate byte
 | |
| 
 | |
| look_ret
 | |
| receive_ack_ret
 | |
| receive_ret             ret
 | |
| '
 | |
| '
 | |
| ' Wait for clock/data to be in required state(s)
 | |
| '
 | |
| wait_c0                 mov     wcond,c0                '(wait until clock low)
 | |
| 
 | |
| wait                    mov     y,tenms                 'set timeout to 10ms
 | |
| 
 | |
| wloop                   movs    napshr,#18              'nap ~4us
 | |
|                         call    #nap
 | |
| _c3                     test    cmask,ina       wc      'check required state(s)
 | |
| _d4                     test    dmask,ina       wz      'loop until got state(s) or timeout
 | |
| wcond   if_never        djnz    y,#wloop                '(replaced with c0/c1/c0d0/c1d1)
 | |
| 
 | |
|                         tjz     y,#reset                'if timeout, reset keyboard
 | |
| wait_ret
 | |
| wait_c0_ret             ret
 | |
| 
 | |
| 
 | |
| c0      if_c            djnz    y,#wloop                '(if_never replacements)
 | |
| c1      if_nc           djnz    y,#wloop
 | |
| c0d0    if_c_or_nz      djnz    y,#wloop
 | |
| c1d1    if_nc_or_z      djnz    y,#wloop
 | |
| '
 | |
| '
 | |
| ' Nap
 | |
| '
 | |
| nap                     rdlong  t,#0                    'get clkfreq
 | |
| napshr                  shr     t,#18/16/13             'shr scales time
 | |
|                         min     t,#3                    'ensure waitcnt won't snag
 | |
|                         add     t,cnt                   'add cnt to time
 | |
|                         waitcnt t,#0                    'wait until time elapses (nap)
 | |
| 
 | |
| nap_ret                 ret
 | |
| '
 | |
| '
 | |
| ' Initialized data
 | |
| '
 | |
| '
 | |
| dlsb                    long    1 << 9
 | |
| tenms                   long    10_000 / 4
 | |
| '
 | |
| '
 | |
| ' Lookup table
 | |
| '                               ascii   scan    extkey  regkey  ()=keypad
 | |
| '
 | |
| table                   word    $0000   '00
 | |
|                         word    $00D8   '01             F9
 | |
|                         word    $0000   '02
 | |
|                         word    $00D4   '03             F5
 | |
|                         word    $00D2   '04             F3
 | |
|                         word    $00D0   '05             F1
 | |
|                         word    $00D1   '06             F2
 | |
|                         word    $00DB   '07             F12
 | |
|                         word    $0000   '08
 | |
|                         word    $00D9   '09             F10
 | |
|                         word    $00D7   '0A             F8
 | |
|                         word    $00D5   '0B             F6
 | |
|                         word    $00D3   '0C             F4
 | |
|                         word    $0009   '0D             Tab
 | |
|                         word    $0060   '0E             `
 | |
|                         word    $0000   '0F
 | |
|                         word    $0000   '10
 | |
|                         word    $F5F4   '11     Alt-R   Alt-L
 | |
|                         word    $00F0   '12             Shift-L
 | |
|                         word    $0000   '13
 | |
|                         word    $F3F2   '14     Ctrl-R  Ctrl-L
 | |
|                         word    $0071   '15             q
 | |
|                         word    $0031   '16             1
 | |
|                         word    $0000   '17
 | |
|                         word    $0000   '18
 | |
|                         word    $0000   '19
 | |
|                         word    $007A   '1A             z
 | |
|                         word    $0073   '1B             s
 | |
|                         word    $0061   '1C             a
 | |
|                         word    $0077   '1D             w
 | |
|                         word    $0032   '1E             2
 | |
|                         word    $F600   '1F     Win-L
 | |
|                         word    $0000   '20
 | |
|                         word    $0063   '21             c
 | |
|                         word    $0078   '22             x
 | |
|                         word    $0064   '23             d
 | |
|                         word    $0065   '24             e
 | |
|                         word    $0034   '25             4
 | |
|                         word    $0033   '26             3
 | |
|                         word    $F700   '27     Win-R
 | |
|                         word    $0000   '28
 | |
|                         word    $0020   '29             Space
 | |
|                         word    $0076   '2A             v
 | |
|                         word    $0066   '2B             f
 | |
|                         word    $0074   '2C             t
 | |
|                         word    $0072   '2D             r
 | |
|                         word    $0035   '2E             5
 | |
|                         word    $CC00   '2F     Apps
 | |
|                         word    $0000   '30
 | |
|                         word    $006E   '31             n
 | |
|                         word    $0062   '32             b
 | |
|                         word    $0068   '33             h
 | |
|                         word    $0067   '34             g
 | |
|                         word    $0079   '35             y
 | |
|                         word    $0036   '36             6
 | |
|                         word    $CD00   '37     Power
 | |
|                         word    $0000   '38
 | |
|                         word    $0000   '39
 | |
|                         word    $006D   '3A             m
 | |
|                         word    $006A   '3B             j
 | |
|                         word    $0075   '3C             u
 | |
|                         word    $0037   '3D             7
 | |
|                         word    $0038   '3E             8
 | |
|                         word    $CE00   '3F     Sleep
 | |
|                         word    $0000   '40
 | |
|                         word    $002C   '41             ,
 | |
|                         word    $006B   '42             k
 | |
|                         word    $0069   '43             i
 | |
|                         word    $006F   '44             o
 | |
|                         word    $0030   '45             0
 | |
|                         word    $0039   '46             9
 | |
|                         word    $0000   '47
 | |
|                         word    $0000   '48
 | |
|                         word    $002E   '49             .
 | |
|                         word    $EF2F   '4A     (/)     /
 | |
|                         word    $006C   '4B             l
 | |
|                         word    $003B   '4C             ;
 | |
|                         word    $0070   '4D             p
 | |
|                         word    $002D   '4E             -
 | |
|                         word    $0000   '4F
 | |
|                         word    $0000   '50
 | |
|                         word    $0000   '51
 | |
|                         word    $0027   '52             '
 | |
|                         word    $0000   '53
 | |
|                         word    $005B   '54             [
 | |
|                         word    $003D   '55             =
 | |
|                         word    $0000   '56
 | |
|                         word    $0000   '57
 | |
|                         word    $00DE   '58             CapsLock
 | |
|                         word    $00F1   '59             Shift-R
 | |
|                         word    $EB0D   '5A     (Enter) Enter
 | |
|                         word    $005D   '5B             ]
 | |
|                         word    $0000   '5C
 | |
|                         word    $005C   '5D             \
 | |
|                         word    $CF00   '5E     WakeUp
 | |
|                         word    $0000   '5F
 | |
|                         word    $0000   '60
 | |
|                         word    $0000   '61
 | |
|                         word    $0000   '62
 | |
|                         word    $0000   '63
 | |
|                         word    $0000   '64
 | |
|                         word    $0000   '65
 | |
|                         word    $00C8   '66             BackSpace
 | |
|                         word    $0000   '67
 | |
|                         word    $0000   '68
 | |
|                         word    $C5E1   '69     End     (1)
 | |
|                         word    $0000   '6A
 | |
|                         word    $C0E4   '6B     Left    (4)
 | |
|                         word    $C4E7   '6C     Home    (7)
 | |
|                         word    $0000   '6D
 | |
|                         word    $0000   '6E
 | |
|                         word    $0000   '6F
 | |
|                         word    $CAE0   '70     Insert  (0)
 | |
|                         word    $C9EA   '71     Delete  (.)
 | |
|                         word    $C3E2   '72     Down    (2)
 | |
|                         word    $00E5   '73             (5)
 | |
|                         word    $C1E6   '74     Right   (6)
 | |
|                         word    $C2E8   '75     Up      (8)
 | |
|                         word    $00CB   '76             Esc
 | |
|                         word    $00DF   '77             NumLock
 | |
|                         word    $00DA   '78             F11
 | |
|                         word    $00EC   '79             (+)
 | |
|                         word    $C7E3   '7A     PageDn  (3)
 | |
|                         word    $00ED   '7B             (-)
 | |
|                         word    $DCEE   '7C     PrScr   (*)
 | |
|                         word    $C6E9   '7D     PageUp  (9)
 | |
|                         word    $00DD   '7E             ScrLock
 | |
|                         word    $0000   '7F
 | |
|                         word    $0000   '80
 | |
|                         word    $0000   '81
 | |
|                         word    $0000   '82
 | |
|                         word    $00D6   '83             F7
 | |
| 
 | |
| keypad1                 byte    $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, "+-*/"
 | |
| 
 | |
| keypad2                 byte    "0123456789.", $0D, "+-*/"
 | |
| 
 | |
| shift1                  byte    "{|}", 0, 0, "~"
 | |
| 
 | |
| shift2                  byte    $22, 0, 0, 0, 0, "<_>?)!@#$%^&*(", 0, ":", 0, "+"
 | |
| '
 | |
| '
 | |
| ' Uninitialized data
 | |
| '
 | |
| dmask                   res     1
 | |
| cmask                   res     1
 | |
| stat                    res     1
 | |
| data                    res     1
 | |
| x                       res     1
 | |
| y                       res     1
 | |
| t                       res     1
 | |
| 
 | |
| _head                   res     1       'write-only
 | |
| _present                res     1       'write-only
 | |
| _states                 res     8       'write-only
 | |
| _dpin                   res     1       'read-only at start
 | |
| _cpin                   res     1       'read-only at start
 | |
| _locks                  res     1       'read-only at start
 | |
| _auto                   res     1       'read-only at start
 | |
| 
 | |
| ''
 | |
| ''
 | |
| ''      _________
 | |
| ''      Key Codes
 | |
| ''
 | |
| ''      00..DF  = keypress and keystate
 | |
| ''      E0..FF  = keystate only
 | |
| ''
 | |
| ''
 | |
| ''      09      Tab
 | |
| ''      0D      Enter
 | |
| ''      20      Space
 | |
| ''      21      !
 | |
| ''      22      "
 | |
| ''      23      #
 | |
| ''      24      $
 | |
| ''      25      %
 | |
| ''      26      &
 | |
| ''      27      '
 | |
| ''      28      (
 | |
| ''      29      )
 | |
| ''      2A      *
 | |
| ''      2B      +
 | |
| ''      2C      ,
 | |
| ''      2D      -
 | |
| ''      2E      .
 | |
| ''      2F      /
 | |
| ''      30      0..9
 | |
| ''      3A      :
 | |
| ''      3B      ;
 | |
| ''      3C      <
 | |
| ''      3D      =
 | |
| ''      3E      >
 | |
| ''      3F      ?
 | |
| ''      40      @       
 | |
| ''      41..5A  A..Z
 | |
| ''      5B      [
 | |
| ''      5C      \
 | |
| ''      5D      ]
 | |
| ''      5E      ^
 | |
| ''      5F      _
 | |
| ''      60      `
 | |
| ''      61..7A  a..z
 | |
| ''      7B      {
 | |
| ''      7C      |
 | |
| ''      7D      }
 | |
| ''      7E      ~
 | |
| ''
 | |
| ''      80-BF   (future international character support)
 | |
| ''
 | |
| ''      C0      Left Arrow
 | |
| ''      C1      Right Arrow
 | |
| ''      C2      Up Arrow
 | |
| ''      C3      Down Arrow
 | |
| ''      C4      Home
 | |
| ''      C5      End
 | |
| ''      C6      Page Up
 | |
| ''      C7      Page Down
 | |
| ''      C8      Backspace
 | |
| ''      C9      Delete
 | |
| ''      CA      Insert
 | |
| ''      CB      Esc
 | |
| ''      CC      Apps
 | |
| ''      CD      Power
 | |
| ''      CE      Sleep
 | |
| ''      CF      Wakeup
 | |
| ''
 | |
| ''      D0..DB  F1..F12
 | |
| ''      DC      Print Screen
 | |
| ''      DD      Scroll Lock
 | |
| ''      DE      Caps Lock
 | |
| ''      DF      Num Lock
 | |
| ''
 | |
| ''      E0..E9  Keypad 0..9
 | |
| ''      EA      Keypad .
 | |
| ''      EB      Keypad Enter
 | |
| ''      EC      Keypad +
 | |
| ''      ED      Keypad -
 | |
| ''      EE      Keypad *
 | |
| ''      EF      Keypad /
 | |
| ''
 | |
| ''      F0      Left Shift
 | |
| ''      F1      Right Shift
 | |
| ''      F2      Left Ctrl
 | |
| ''      F3      Right Ctrl
 | |
| ''      F4      Left Alt
 | |
| ''      F5      Right Alt
 | |
| ''      F6      Left Win
 | |
| ''      F7      Right Win
 | |
| ''
 | |
| ''      FD      Scroll Lock State
 | |
| ''      FE      Caps Lock State
 | |
| ''      FF      Num Lock State
 | |
| ''
 | |
| ''      +100    if Shift
 | |
| ''      +200    if Ctrl
 | |
| ''      +400    if Alt
 | |
| ''      +800    if Win
 | |
| ''
 | |
| ''      eg. Ctrl-Alt-Delete = $6C9
 | |
| ''
 | |
| ''
 | |
| '' Note: Driver will buffer up to 15 keystrokes, then ignore overflow.
 | |
| 
 | |
| {{
 | |
| 
 | |
| ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 | |
| │                                                   TERMS OF USE: MIT License                                                  │                                                            
 | |
| ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
 | |
| │Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ 
 | |
| │files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │
 | |
| │modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
 | |
| │is furnished to do so, subject to the following conditions:                                                                   │
 | |
| │                                                                                                                              │
 | |
| │The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
 | |
| │                                                                                                                              │
 | |
| │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │
 | |
| │WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │
 | |
| │COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │
 | |
| │ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │
 | |
| └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 | |
| }} |