home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / MISC / BM192A.ZIP / KEYBOARD.S < prev    next >
Encoding:
Text File  |  1996-02-23  |  6.9 KB  |  312 lines

  1. *=======================================================*
  2. *    IKBD routines: latest update 23/02/96        *
  3. *=======================================================*
  4. *    Handle keyboard & mouse                *
  5. *=======================================================*
  6.  
  7. ikbd        =    $118        ; keyboard vector
  8. key_ctl        =    $fffffc00    ; keyboard control register
  9. key_dat        =    $fffffc02    ; keyboard data register
  10.  
  11.     ifnd    debuggable
  12.  
  13. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  14. * Initialise custom keyboard packet handler        *
  15. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16. initialise_ikbd:
  17. *-------------------------------------------------------*
  18.     lea    key_buffer,a0
  19.     moveq    #128/4-1,d7
  20. .clear_keybd:
  21.     clr.l    (a0)+
  22.     dbf    d7,.clear_keybd
  23.     bsr    flush_ikbd
  24.     move.l    ikbd.w,old_ikbd
  25.     move.l    #ikbd_handler,ikbd.w
  26.     rts
  27.  
  28. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  29. * Remove custom keyboard packet handler            *
  30. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  31. remove_ikbd:
  32. *-------------------------------------------------------*
  33.     bsr    flush_ikbd
  34.     move.l    old_ikbd,ikbd.w
  35.     rts
  36.  
  37. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  38. * Remove unread data from ikbd chip            *
  39. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  40. flush_ikbd:
  41. *-------------------------------------------------------*
  42. .wl:    tst.b    key_dat.w
  43.     bpl.s    .wl
  44.     move.b    key_ctl.w,d0
  45.     btst    #0,d0
  46.     bne.s    .read
  47.     rts
  48. .read    move.b    key_dat.w,d0
  49.     bra.s    flush_ikbd
  50.  
  51. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  52. * Keyboard Packet handler                *
  53. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  54.     txtlong
  55. *-------------------------------------------------------*
  56. ikbd_handler:
  57. *-------------------------------------------------------*
  58.     movem.l    a0/d0-d1,-(sp)
  59.     move.b    key_ctl.w,d0
  60.     btst    #7,d0
  61.     beq.s    ikbd_aq
  62.     btst    #4,d0
  63.     bne.s    ik_err
  64.     btst    #5,d0
  65.     bne.s    ik_err
  66.     btst    #6,d0
  67.     bne.s    ik_err
  68.     btst    #0,d0
  69.     beq.s    ik_err
  70.     move.b    key_dat.w,d0
  71.  
  72.     cmp.b    #$ff,d0            ; joystick 1 packet
  73.     beq.s    do_joy1
  74.     cmp.b    #$fe,d0            ; joystick 0 packet
  75.     beq.s    do_joy0
  76.  
  77. mouse_event:
  78.     move.b    d0,d1
  79.     and.b    #$fc,d1            ; %111110xx = mouse packet 
  80.     cmp.b    #$f8,d1
  81.     bne.s    key_press
  82.     and.b    #3,d0
  83.     move.b    d0,buttons
  84.     move.l    #get_dx,ikbd.w
  85.     bra.s    ikbd_aq
  86.  
  87. do_joy0:
  88.     move.l    #get_joy0,ikbd.w
  89.     bra.s    ikbd_aq
  90.  
  91. do_joy1:
  92.     move.l    #get_joy1,ikbd.w
  93.     bra.s    ikbd_aq
  94.  
  95.  
  96. key_press:
  97.     btst    #7,d0            ; test release bit
  98.     seq    d1            ; d1.b cleared if release bit set
  99.     and.w    #$7f,d0            ; mask off release bit
  100.     lea    key_buffer,a0
  101.     move.b    d1,(a0,d0.w)
  102. ikbd_aq:
  103.     bclr    #6,$fffffa11.w
  104.     movem.l    (sp)+,a0/d0-d1
  105.     rte
  106.  
  107.  
  108. ik_err:    move.b    key_dat.w,d0
  109.     bra.s    ikbd_aq
  110.  
  111. get_dx:    move.l    d0,-(sp)
  112.     move.b    key_dat.w,d0
  113.     ext.w    d0
  114.     add    d0,mouse_dx
  115.     move.l    #get_dy,ikbd.w
  116.     move.l    (sp)+,d0
  117.     bclr    #6,$fffffa11.w
  118.     rte
  119.  
  120. get_dy:    move.l    d0,-(sp)
  121.     move.b    key_dat.w,d0
  122.     ext.w    d0
  123.     add    d0,mouse_dy
  124.     move.l    #ikbd_handler,ikbd.w
  125.     move.l    (sp)+,d0
  126.     bclr    #6,$fffffa11.w
  127.     rte
  128.  
  129. get_joy1:
  130.     move.b    key_dat.w,joy0
  131.     move.l    #ikbd_handler,ikbd.w
  132.     bclr    #6,$fffffa11.w
  133.     rte
  134.  
  135. get_joy0:
  136.     move.b    key_dat.w,joy1
  137.     move.l    #ikbd_handler,ikbd.w
  138.     bclr    #6,$fffffa11.w
  139.     rte
  140.  
  141.     elseif
  142.  
  143. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  144. * Initialise custom keyboard packet handler        *
  145. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  146. Initialise_ikbd:
  147. *-------------------------------------------------------*
  148.     lea        key_buffer,a0
  149.     moveq        #128/4-1,d7
  150. .clear_keybd:
  151.     clr.l        (a0)+
  152.     dbf        d7,.clear_keybd
  153.     bsr        Flush_ikbd
  154.  
  155.     move.w        #34,-(sp)
  156.     trap        #14
  157.     addq.l        #2,sp
  158.     move.l        d0,a0
  159.     move.l        16(a0),old_mousevec
  160.     move.l        #Handle_Mouse,16(a0)
  161.  
  162.     move.w        #1,-(sp)
  163.     move.w        #14,-(sp)
  164.     trap        #14
  165.     addq.w        #4,sp
  166.     move.l        d0,key_recptr
  167.  
  168.     rts
  169.  
  170. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  171. * Remove custom keyboard packet handler            *
  172. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  173. remove_ikbd:
  174. *-------------------------------------------------------*
  175.     bsr        flush_ikbd
  176.     move.w        #34,-(sp)
  177.     trap        #14
  178.     addq.l        #2,sp
  179.     move.l        d0,a0
  180.     move.l        old_mousevec,16(a0)
  181.     rts
  182.  
  183. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  184. * Handle mouse packet                    *
  185. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  186.     txtlong
  187. *-------------------------------------------------------*
  188. Handle_Mouse:
  189. *-------------------------------------------------------*
  190.     movem.l        d0/a0,-(sp)
  191.     move.b        (a0)+,d0
  192.     and.b        #3,d0
  193.     move.b        d0,buttons
  194.  
  195.     move.b        (a0)+,d0
  196.     ext.w        d0
  197.     add.w        d0,mouse_dx
  198.  
  199.     move.b        (a0)+,d0
  200.     ext.w        d0
  201.     add.w        d0,mouse_dy
  202.  
  203.     movem.l        (sp)+,d0/a0
  204.     rts
  205.  
  206.         
  207. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  208. * Flush gem keyboard routine.                *
  209. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  210. flush_ikbd:
  211. *-------------------------------------------------------*
  212.     bra        empty_buffer
  213.  
  214. *-------------------------------------------------------*
  215.     txtlong
  216. *-------------------------------------------------------*
  217. read_key:
  218. *-------------------------------------------------------*
  219.     move.w        last_key,d0
  220.     lea        key_buffer,a0
  221.     sf        (a0,d0.w)
  222.     bsr        read_keybuf
  223.     and.w        #$7f,d0
  224.     move.w        d0,last_key
  225.     st        (a0,d0.w)
  226.     rts
  227.  
  228. *-------------------------------------------------------*
  229. * Init the GEMDOS key buffer reader
  230. *-------------------------------------------------------*
  231. * IOrec structure
  232.  
  233.         rsreset
  234. ibuf        rs.l    1
  235. ibufsize    rs.w    1    
  236. ibufhd        rs.w    1
  237. ibuftl        rs.w    1
  238.  
  239. *-------------------------------------------------------*
  240. * Read the GEMDOS key buffer
  241. * returns scancode/ascii value in d0,d1
  242. * or -1 if no key
  243. *-------------------------------------------------------*
  244.     txtlong
  245. *-------------------------------------------------------*
  246. read_keybuf:
  247. *-------------------------------------------------------*
  248.     movem.l    d2-d7/a0-a6,-(sp)
  249.  
  250.     move.l    key_recptr,a0
  251.     move.w    ibufhd(a0),d1
  252.     move.l    ibuf(a0),a1
  253.  
  254.     cmp.w    ibuftl(a0),d1
  255.     beq.s    .nokey
  256.     addq.w    #4,d1
  257.     cmp.w    ibufsize(a0),d1
  258.     blt.s    .nomod
  259.     moveq    #0,d1
  260. .nomod
  261.     move.w    d1,ibufhd(a0)
  262.     move.w    d1,ibuftl(a0)
  263. .noinc
  264.     movem.w    (a1,d1.w),d0-d1
  265.     bra.s    .gotkey
  266. .nokey
  267.     moveq    #-1,d0
  268.     moveq    #-1,d1
  269. .gotkey
  270.     movem.l    (sp)+,d2-d7/a0-a6
  271.     rts
  272.     
  273.  
  274.         endc
  275.  
  276. *-------------------------------------------------------*
  277. *    Flush keyboard buffer                *
  278. *-------------------------------------------------------*
  279. empty_buffer:
  280. *-------------------------------------------------------*
  281. .bk    push.w        #11
  282.     trap        #1
  283.     addq        #2,sp
  284.     tst.w        d0
  285.     beq.s        .ot
  286.     move.w        #7,-(sp)
  287.     trap        #1
  288.     addq        #2,sp
  289.     bra.s        .bk
  290. .ot    rts
  291.  
  292. *-------------------------------------------------------*
  293.             bsslong
  294. *-------------------------------------------------------*
  295.  
  296. old_ikbd:        ds.l    1
  297. old_mousevec:        ds.l    1
  298. key_recptr:        ds.l    1
  299. key_buffer:        ds.b    128
  300.  
  301. last_key:        ds.w    1
  302. mouse_dx:        ds.w    1
  303. mouse_dy:        ds.w    1
  304.  
  305. joy0:            ds.b    1
  306. joy1:            ds.b    1
  307. buttons:        ds.b    1
  308.  
  309. *-------------------------------------------------------*
  310.             txtlong
  311. *-------------------------------------------------------*
  312.