home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.7z / ftp.whtech.com / emulators / v9t9 / linux / sources / V9t9 / tools / Forth / kbd.inc < prev    next >
Encoding:
Text File  |  2006-10-19  |  5.3 KB  |  302 lines

  1. ;    V9t9: the TI Emulator! v6.0 Source 
  2. ;    Copyright (c) 1996 by Edward Swartz
  3.  
  4.  
  5. ;--------------------------------------------------------------------------
  6.  
  7. kbd_scan equ    >80
  8. kbd_poll equ    >40
  9.  
  10. kinit    si    10,6
  11.     mov    0,@4(10)
  12.     mov    1,@2(10)
  13.     mov    2,*10
  14.  
  15.     li    1,@kbdlength        ; init everything
  16.     li    2,@kbdstart
  17. kinit0    clr    +*2
  18.     dect    1
  19.     jgt    kinit0
  20.  
  21.     li    0,>1e00            ; 1/2 s before repeat
  22.     movb    0,@kbdlimit        
  23.     li    0,>0300            ; 1/20 s delay between repeat
  24.     movb    0,@kbddelay
  25.  
  26.     mov    +*10,2
  27.     mov    +*10,1
  28.     mov    +*10,0
  29.     rt
  30.  
  31.  
  32. ;    This is called during an interrupt!
  33. ;
  34. ;    (I.E., don't use the stack!)
  35. ;
  36. ;    WP = INTWS
  37.  
  38. scankbd    mov    11,10
  39.  
  40.     clr        12
  41.     sbo        21             ; clear alpha lock line
  42.  
  43.     clr        1             ; read char
  44. ;;    sb        @kbdscan,@kbdscan    ; clear scancode
  45.  
  46.     li        12,>24         ; kbd select
  47.     clr        3            ; row * >100
  48.     ldcr    3,3             ; set
  49.  
  50.     li        12,>6         ; kbd matrix
  51.     stcr    4,8             ; get row 0
  52.     inv        4            ; 0=off 1=on
  53.     mov        4,2            ; copy to R2=shifts
  54.     andi    2,>7000        ; save 0=off 1=on (shifts)
  55.     movb    2,@kbdshft    ; save shift
  56.     andi    4,>0700        ; mask =, space, enter
  57.     jmp        skloop0
  58.  
  59. skloop:
  60.     seto    4             ; set low bits too    
  61.     stcr    4,8             ; read 8 bits
  62.       inv        4             ; 0=off 1=on
  63. skloop0:
  64.     jne        skgotsome    ; any bits set?
  65.     ai        3,>100
  66.     ci        3,>600        ; stop at joystick
  67.     jeq        skblank
  68.  
  69.     li        12,>24        ; point to kbd select
  70.     ldcr    3,3             ; set new row #
  71.     li        12,>6         ; point to matrix
  72.     jmp        skloop
  73.  
  74. skgotsome:
  75.     srl        3,5             ; entry into table
  76.     swpb    4             ; move to low byte so we can
  77. skwhich:
  78.     srl        4,1            ; roll down
  79.     joc        skdone         ; this bit?
  80.     inc        3            ; next
  81.     jmp        skwhich
  82.  
  83. skblank:
  84.     movb    1,@kbdscan    ; no key whatsoever
  85.  
  86.     movb    @kbdshft,3    ; shifts?
  87.     jeq        sknone
  88.  
  89.     blwp    @vscreenon    ; turn on screen for shifts
  90.     clr        @timeout
  91.     jmp        sknone
  92.  
  93. skdone:    
  94.     blwp    @vscreenon
  95.     clr        @timeout
  96.  
  97.     bl        @kbdhandle
  98. sknone0:
  99.  
  100. sknone:
  101.     movb    1,@kbdlast           ; update last char
  102.  
  103.     b        *10
  104.  
  105. ;-------------------------------------------------------------------------
  106.  
  107. kbdhandle
  108.     movb    @kbdmode,4
  109.     sla        4,1                 ; kbd_scan set?
  110.     jnc        khgetascii
  111.  
  112.     swpb    3
  113.     ai        3,>100
  114.     movb    3,@kbdscan         ; save scancode
  115.     movb    3,1                 ; R3=R1=scancode
  116.     jmp        khtestbuffer
  117.     
  118. khgetascii:
  119.     srl        2,11             ; get shift state
  120.     ai        2,grom_kbdlist    
  121.  
  122.     movb    @>9802,@kbdgradr    ; save GROM addr
  123.     movb    @>9802,@kbdgradr 1+
  124.     dec        @kbdgradr
  125.  
  126.     li        12,>9c02
  127.  
  128.     movb    2,*12            ; point to grom kbd list
  129.     swpb    2
  130.     movb    2,*12
  131.  
  132.     movb    @>9800,2        ; get table entry
  133.     swpb    2
  134.     movb    @>9800,2        ; it's flipped in GROM
  135.     swpb    2                ; EJS 990330: no longer
  136.                             ; now using tiasm for grom
  137.  
  138.     a        3,2                 ; get offset
  139.  
  140.     movb    2,*12            ; point to char
  141.     swpb    2
  142.     movb    2,*12
  143.     
  144.     movb    @>9800,1          ; R1=ASCII code, 0-255
  145.  
  146.     movb    @kbdgradr,*12           ; restore addr
  147.     movb    @kbdgradr 1+,*12
  148.  
  149. ;    check shift+ctrl+fctn+space break
  150.  
  151.     clr        2                ; break flag
  152.     ci        1,>ff00
  153.     jne        kbnobreak        ; R1 , >FF, will be char
  154.  
  155.     dec        2
  156.  
  157. kbnobreak:
  158.     clr        12
  159.     sbz        21             ; turn on alpha lock line
  160.     tb        7
  161.     jeq        khnoalpha
  162.         
  163.     ci        1,>6100        ; alpha lock on; 
  164.     jl        khnoalpha    ; test 'a'-'z'
  165.     ci        1,>7b00
  166.     jhe        khnoalpha
  167.     ai        1,0 >2000 -    ; uppercase
  168.  
  169. khnoalpha:
  170.     sbo        21
  171. ;;;    movb    1,@kbdscan    ; save scancode
  172.     swpb    3            ; put scancode in hi byte
  173.     ai        3,>100
  174.  
  175. khtestbuffer:
  176.     sla        4,1             ; kbd_poll set?
  177.     joc        khnone
  178.  
  179.     socb    1,1
  180.     jne        khbuffer       ; got something
  181.  
  182.     jmp        khnone
  183.  
  184. ;-------------------------------------------
  185.  
  186. khbuffer:    
  187.     
  188.     sla        4,1             ; kbd_poll set?
  189.     joc        khnone         ; don't buffer
  190.  
  191.     cb        3,@kbdscan     ; scancode the same?
  192.     jne        khnew
  193.  
  194.     movb    @kbdflag,@kbdflag      ; repeating yet?
  195.     jeq        khb4repeat
  196.  
  197.     cb        @kbdtimer,@kbddelay ; time for new repeat?
  198.     jl        khnone
  199.     jmp        khstuff
  200.  
  201. khb4repeat:
  202.     cb        @kbdtimer,@kbdlimit ; repeated long enough yet?
  203.     jl        khnone                 ; no
  204.     movb    @hff,@kbdflag        ; set flag
  205.     jmp        khstuff
  206.  
  207. khnew:
  208.     movb    @h00,@kbdflag        ; clear repeat flag
  209.     movb    3,@kbdscan            ; save new scancode
  210.  
  211. khstuff:
  212.     sb        @kbdtimer,@kbdtimer ; restart timer
  213.  
  214.     mov        2,2                    ; breaking?
  215.     jeq        khstuffit
  216.  
  217.     movb    @kbdhead, @kbdtail    ; kill buffer
  218.  
  219.     lwpi     mainws
  220.     mov     @>4A , 1            ; end of our ROM
  221.     mov     @>2(1) , 1            ; forth vector for break
  222.     limi     1
  223.     b        *1                    ; ctrl+fctn+shift+space breaks
  224.  
  225. khstuffit:
  226.     clr        2
  227.     movb    @kbdtail,2               ; get current pos in ring
  228.     swpb    2
  229.     movb    1,@kbdbuf(2)        ; buffer it
  230.     inc        2                     ; inc...
  231.     andi    2,kbdbufsize 1-        ; roll over if necc
  232.     swpb    2
  233.     cb        2,@kbdhead             ; overflow if equal!
  234.     jeq        khnone                 ; eeeer... don't update ptrs
  235.  
  236.     movb    2,@kbdtail             ; update
  237.  
  238. khnone:
  239.  
  240. khout:
  241.     rt
  242.  
  243.  
  244.  
  245.  
  246. ;--------------------------------------------------
  247.  
  248. ;    CALLED FROM FORTH.
  249. ;
  250. ;    If key available, return EQ=0.
  251. ;
  252. ;    Should be called with INTERRUPTS DISABLED.
  253. ;
  254.  
  255. kbdavail 
  256.     movb    @kbdmode,0
  257.     sla        0,2                      ; kbd_poll set?
  258.     jnc        katestbuff              ; yup
  259.     
  260.     movb    @kbdscan,@kbdscan     ; kbdscan=0 means none
  261.     rt
  262.  
  263. katestbuff:
  264.     cb        @kbdhead,@kbdtail    ; EQ=1 means none
  265.     rt
  266.  
  267.  
  268. ;    CALLED FROM FORTH!
  269. ;
  270. ;    Read the last char from the keyboard.
  271. ;    Assumes that "kbdavail" returned positively.
  272. ;
  273. ;    Returns all r0=value (either scancode or ASCII code,
  274. ;    depending on kbdmode).
  275. ;
  276. ;    If R0=0, then no char is available.
  277. ;
  278. ;    This should be called WITH INTERRUPTS DISABLED, as the interrupt
  279. ;    routine WILL modify all these variables.
  280.  
  281. kbdread       
  282.     movb    @kbdmode,1
  283.     sla        1,2                    ; kbd_poll set?
  284.     jnc        krbuff
  285.  
  286.     movb    @kbdscan,0            ; read last polled char
  287.     srl        0,8
  288.     rt
  289.  
  290. krbuff:                            ; read from keyboard buffer
  291.     clr        1
  292.     cb        @kbdhead,@kbdtail
  293.     jeq        krbempty
  294.     movb    @kbdhead,1            ; get head ptr
  295.     ab        @h01,@kbdhead        ; and inc...
  296.     szcb    @kbdbufmask,@kbdhead    ; mask...
  297.     swpb    1                    ; and make offset
  298.     movb    @kbdbuf(1),0        ; and retrieve!
  299.     srl        0,8
  300. krbempty:
  301.     rt
  302.