home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 5 / CD_Magazyn_EXEC_nr_5.iso / Recent / hard / hack / ps2m.lha / PIC_source / ps2m.asm < prev   
Assembly Source File  |  2001-06-03  |  9KB  |  626 lines

  1. ; $VER: 1.4 (03.06.01)
  2. ; COPYRIGHT (C) 2001 RDC SOFTWARE
  3. ; Distributed under GPL license - see gpl.txt
  4.  
  5. ; This is a part of ps2m package,
  6. ; you can obtain latest version at Aminet:
  7.  
  8. ; ftp://ftp.wustl.edu/pub/aminet/hard/hack/ps2m.lha
  9. ; ftp://ftp.wustl.edu/pub/aminet/hard/hack/ps2m.readme
  10.  
  11. ; Use picasm by Timo Rossi to compile.
  12. ; Amiga version of picasm is included in devpic package:
  13.  
  14. ; ftp://ftp.wustl.edu/pub/aminet/dev/cross/devpic.lha
  15. ; ftp://ftp.wustl.edu/pub/aminet/dev/cross/devpic.readme
  16.  
  17. ; For any questions: rdc@cyberlan.mtu-net.ru
  18.  
  19.     device    pic16f876
  20.     include "16f876.i"
  21.     include    "macros.i"
  22.  
  23. POWER    equ    0
  24. SPEED    equ    42        ;42 for 4MHz, 52 for 5MHz
  25.  
  26. ; ---------
  27. ; variables
  28. ; ---------
  29.  
  30.     org    0x20
  31.  
  32. memstart
  33. count        ds    1
  34. recvb        ds    1
  35. recvc        ds    1
  36. recvd        ds    2
  37. recvdt        ds    1
  38. sendata        ds    1
  39. sendetc        ds    1
  40. intw        ds    1
  41. ints        ds    1
  42. wdtp        ds    1
  43. wdtm        ds    2
  44. temp1        ds    1
  45. currbyte    ds    1
  46. xdif        ds    1
  47. ydif        ds    1
  48. xdir        ds    1
  49. ydir        ds    1
  50. xspeed        ds    2
  51. yspeed        ds    2
  52. xcount        ds    1
  53. ycount        ds    1
  54. xtemp        ds    1
  55. ytemp        ds    1
  56. flags        ds    1
  57. extflags    ds    1
  58.  
  59. byte1        ds    1
  60. byte2        ds    1
  61. byte3        ds    1
  62. byte4        ds    1
  63. zdif        ds    1
  64. zcount        ds    1
  65.  
  66. mem_end        org    0x000
  67.  
  68. ; ---------------
  69. ; bit definitions
  70. ; ---------------
  71.  
  72. fpkt1    equ    0
  73. fpkt2    equ    1
  74. fpkt3    equ    2
  75. fbyte    equ    3
  76. fnores    equ    4
  77. fnofps    equ    5
  78. fon    equ    6
  79. fwheel    equ    7
  80.  
  81. ext200    equ    0
  82. extime    equ    1
  83.     if    POWER-1
  84. extbut    equ    2
  85.     endif
  86.  
  87. ; ----------------
  88. ; init PIC & mouse
  89. ; ----------------
  90.  
  91. start    clrf    INTCON
  92.     if    POWER
  93.     movlw    b'10000001'
  94.     else
  95.     movlw    b'00000001'
  96.     endif
  97.     option
  98.     goto    start_a
  99.  
  100. ; -----------------
  101. ; interrupt handler
  102. ; -----------------
  103.  
  104. int    local
  105.     bcf    INTCON,1
  106.     movwf    intw
  107.     swapfw    STATUS
  108.     movwf    ints
  109.     bcf    recvd+1,2
  110.     btfsc    PORTB,1
  111.     bsf    recvd+1,2
  112.     rrf    recvd+1
  113.     rrf    recvd
  114.     bsf    wdtp,5        ;clear packet bit shift watchdog
  115.     loop    =a,recvc
  116.     movlf    11,recvc
  117.     bsf    flags,fbyte
  118.     movff    recvd,recvdt
  119. =a    swapfw    ints
  120.     movwf    STATUS
  121.     swapf    intw
  122.     swapfw    intw
  123.     retfie
  124.     endlocal
  125.  
  126. ; ----------------------------
  127. ; init PIC & mouse - continued
  128. ; ----------------------------
  129.  
  130. start_a    local
  131.     movlf    0xff,0x1f
  132.     clrf    PORTA
  133.     clrf    PORTB
  134.     movlw    b'11111111'
  135.     tris    PORTA
  136.     tris    PORTB
  137.     endlocal
  138.  
  139. ; clear RAM
  140.  
  141.     movlf    memstart,FSR
  142.     sublw    mem_end
  143. clearam    clrf    INDF
  144.     incf    FSR
  145.     addlw    0xff
  146.     bnz    clearam
  147.     movlf    TRISB+0x80,FSR
  148.  
  149. ; init variables
  150.  
  151.     movlf    24,wdtm
  152.     movlf    11,recvc
  153.  
  154. ; delay before turn mouse on
  155.  
  156.     local
  157.     callw    delayms,0
  158.     if    POWER
  159.     movlw    b'00001111'    ;turn on mouse
  160.     tris    PORTA
  161.     callw    delayms,100
  162.     movlw    b'00000001'    ;enable pull-up
  163.     option
  164.     movlf    8,temp1
  165. =a    callw    delayms,0
  166.     loop    =a,temp1
  167.     endif
  168.  
  169. ; wait for mouse
  170.  
  171.     bcf    INDF,0        ;inhibit I/O
  172.     bsf    INDF,1
  173.     callw    delayms,50
  174.     call    testms        ;i.m.explorer compatible?
  175.     bz    =h        ;yes
  176.     sublw    1        ;intellimouse compatible?
  177.     bnz    =i        ;no
  178.     bsf    extflags,ext200
  179.     call    testms        ;i.m.explorer compatible?
  180.     skipnz
  181. =h    bsf    extflags,extime    ;i.m.explorer compatible
  182.     bsf    flags,fwheel    ;intellimouse compatible
  183. =i    callw    send,0xe8    ;set resolution
  184.     callw    send,3        ;8/mm
  185.     callw    send,0xe6    ;scaling 1:1
  186.     callw    send,0xf3    ;set 200fps
  187.     callw    send,200
  188.     callw    send,0xf4    ;enable mouse in streaming mode
  189.     call    cpoff
  190.     endlocal
  191.  
  192. ; -----------
  193. ; check mouse
  194. ; -----------
  195.  
  196. m_check    callw    send,0xE9
  197.     bc    start        ;no response? init mouse again
  198.     sublw    0xFA        ;ACK?
  199.     bnz    start        ;no ACK - init mouse again...
  200.     call    bwait        ;receive status byte
  201.     bc    start
  202.     andlw    b'01100000'    ;leave only stream & enable flags
  203.     sublw    b'00100000'    ;must be stream and enabled
  204.     bnz    start
  205.     btfsc    flags,fnores
  206.     goto    p_init
  207.     call    bwait        ;receive resolution (value ignored)
  208.     bc    nores        ;no resolution...
  209.     btfsc    flags,fnofps
  210.     goto    p_init
  211.     call    bwait        ;receive reports per second
  212.     bc    nofps        ;no fps
  213.     goto    p_init
  214.  
  215. ; no resolution & fps report
  216.  
  217. nores    bsf    flags,fnores
  218. nofps    bsf    flags,fnofps
  219.  
  220. ; ---------------------
  221. ; sync serial port init
  222. ; ---------------------
  223.  
  224. p_init    local
  225.     movlf    3,recvb
  226.     btfsc    flags,fwheel
  227.     incf    recvb
  228.     clrf    currbyte
  229.     movfw    INDF
  230.     xorfw    PORTB
  231.     andlw    b'00000100'
  232.     bz    =a
  233.     bcf    flags,fon    ;mouse off
  234.     if    POWER
  235.     movlw    b'11101111'    ;XxYy off, power on
  236.     tris    PORTA
  237.     movlw    b'11111111'    ;buttons and wheels off
  238.     else
  239.     movlw    b'11111111'    ;buttons, wheels, XxYy off
  240.     tris    PORTA
  241.     endif
  242.     tris     PORTB
  243. =a    bsf    INTCON,7    ;global interrupt enable
  244.     bsf    INTCON,4    ;enable RB0 interrupt
  245.     endlocal
  246.  
  247. ; check shift flag - byte received
  248.  
  249. schk    btfss    flags,fbyte
  250.     goto    pchk1
  251.     bcf    flags,fbyte
  252.     movfw    currbyte
  253.     addlw    byte1
  254.     movwf    FSR
  255.     movff    recvdt,INDF
  256.     movlf    PORTB+0x80,FSR
  257.     incf    currbyte
  258.     loop    tchk,recvb
  259.     movlf    3,recvb
  260.     btfsc    flags,fwheel
  261.     incf    recvb
  262.     clrf    currbyte
  263.     bsf    flags,fpkt1
  264.     movlf    24,wdtm
  265.     goto    tchk
  266.  
  267. ; check packet flag - packet received
  268.  
  269. pchk1    btfss    flags,fpkt1
  270.     goto    pchk2
  271.     bcf    flags,fpkt1
  272.     bsf    flags,fpkt2
  273.     clrf    xdir
  274.     movlw    1
  275.     btfsc    byte1,4
  276.     movlw    255
  277.     movf    byte2
  278.     btfss    STATUS,Z
  279.     movwf    xdir
  280.     movfw    byte2
  281.     btfsc    byte1,4
  282.     sublw    0
  283.     addfw    xdif
  284.     btfsc    STATUS,C
  285.     movlw    255
  286.     movwf    xdif
  287.     movwf    xspeed
  288.     addwf    xspeed
  289.     skipc
  290.     addwf    xspeed
  291.     skipc
  292.     goto    tchk
  293.     movlf    255,xspeed
  294.     goto    tchk
  295.  
  296. pchk2    btfss    flags,fpkt2
  297.     goto    pchk3
  298.     bcf    flags,fpkt2
  299.     bsf    flags,fpkt3
  300.     clrf    ydir
  301.     movlw    1
  302.     btfsc    byte1,5
  303.     movlw    255
  304.     movf    byte3
  305.     btfss    STATUS,Z
  306.     movwf    ydir
  307.     movfw    byte3
  308.     btfsc    byte1,5
  309.     sublw    0
  310.     addfw    ydif
  311.     btfsc    STATUS,C
  312.     movlw    255
  313.     movwf    ydif
  314.     movwf    yspeed
  315.     addwf    yspeed
  316.     skipc
  317.     addwf    yspeed
  318.     skipc
  319.     goto    tchk
  320.     movlf    255,yspeed
  321.     goto    tchk
  322.  
  323. pchk3    btfss    flags,fpkt3
  324.     goto    tchk
  325.     bcf    flags,fpkt3
  326.     rlfw    byte1
  327.     movwf    temp1
  328.     rlf    temp1
  329.     comfw    temp1
  330.     andlw    b'00011100'
  331.     local
  332.     movwf    temp1
  333.     sublw    b'00011100'
  334.     skipz
  335.     call    cpoff
  336.     btfss    flags,fon
  337.     goto    =c
  338.     movfw    INDF
  339.     andlw    b'11100011'
  340.     iorfw    temp1
  341.     movwf    INDF
  342.     btfss    flags,fwheel
  343.     goto    =c
  344.     movfw    byte4
  345.     btfss    extflags,extime
  346.     goto    =b
  347.     if    POWER
  348.     andlw    b'00110000'
  349.     skipz
  350.     bcf    INDF,5
  351.     skipnz
  352.     bsf    INDF,5
  353.     movfw    byte4
  354.     else
  355.     btfsc    byte4,5
  356.     bcf    INDF,5
  357.     btfss    byte4,5
  358.     bsf    INDF,5
  359.     bcf    extflags,extbut
  360.     btfsc    byte4,4
  361.     bsf    extflags,extbut
  362.     endif
  363.     andlw    b'00001111'
  364.     btfsc    byte4,3
  365.     iorlw    b'11110000'
  366. =b    addwf    zdif
  367. =c    ;....
  368.     endlocal
  369.  
  370. ; check time to move
  371.  
  372. tchk    btfss    RTCC,7
  373.     goto    schk
  374.     sublf    SPEED,RTCC
  375.  
  376. ; CPU watchdog
  377.  
  378.     clrwdt
  379.  
  380. ; check mouse
  381.  
  382. mchk    loop    xchk,wdtm+1
  383.     loop    xchk,wdtm
  384.     movlf    24,wdtm
  385.     bcf    INTCON,4    ;disable RB0 interrupt
  386.     movfw    recvb
  387.     btfsc    flags,fwheel
  388.     addlw    255
  389.     sublw    3        ;packet receive started?
  390.     btfss    STATUS,Z
  391.     goto    mchk_e        ;yes
  392.     movfw    recvc
  393.     sublw    11        ;byte receive started?
  394.     btfss    STATUS,Z
  395.     goto    mchk_e        ;yes
  396.     btfsc    PORTB,0        ;bit receive started?
  397.     goto    m_check        ;no
  398. mchk_e    bsf    INTCON,4    ;enable RB0 interrupt
  399.  
  400. ; check X movement
  401.  
  402. xchk    movfw    xspeed
  403.     addwf    xspeed+1
  404.     btfss    STATUS,C
  405.     goto    ychk
  406.     movf    xdif
  407.     btfsc    STATUS,Z
  408.     goto    ychk
  409.     decf    xdif
  410.     movfw    xdir
  411.     subwf    xcount
  412.     rrfw    xcount
  413.     andlw    1
  414.     xorfw    xcount
  415.     andlw    3
  416.     movwf    xtemp
  417.  
  418. ; check Y movement
  419.  
  420. ychk    movfw    yspeed
  421.     addwf    yspeed+1
  422.     btfss    STATUS,C
  423.     goto    zchk
  424.     movf    ydif
  425.     btfsc    STATUS,Z
  426.     goto    zchk
  427.     decf    ydif
  428.     movfw    ydir
  429.     addwf    ycount
  430.     rrfw    ycount
  431.     andlw    1
  432.     xorfw    ycount
  433.     andlw    3
  434.     movwf    ytemp
  435.  
  436. ; check wheel movement
  437.  
  438. zchk    local
  439.     if    POWER
  440.     btfsc    PORTB,5
  441.     goto    =a
  442.     btfss    INDF,5
  443.     goto    =a
  444.     else
  445.     btfsc    PORTA,4
  446.     goto    =a
  447.     decf    FSR
  448.     movfw    INDF
  449.     incf    FSR
  450.     andlw    b'00010000'
  451.     btfsc    STATUS,Z
  452.     goto    =a
  453.     endif
  454.     movlf    2,zcount
  455.     bsf    INDF,6
  456.     bsf    INDF,7
  457.     clrf    zdif
  458. =a    movf    zdif
  459.     bz    xyout
  460.     movlw    1
  461.     btfss    zdif,7
  462.     sublw    0
  463.     addwf    zdif
  464.     addwf    zcount
  465.     rrfw    zcount
  466.     andlw    1
  467.     xorfw    zcount
  468.     movwf    temp1
  469.     movfw    INDF
  470.     andlw    b'00111111'
  471.     btfsc    temp1,0
  472.     iorlw    b'01000000'
  473.     btfsc    temp1,1
  474.     iorlw    b'10000000'
  475.     btfsc    flags,fon
  476.     movwf    INDF
  477.     endlocal
  478.  
  479. ; XY movement out
  480.  
  481. xyout    bcf    STATUS,C
  482.     rlfw    xtemp
  483.     addfw    xtemp
  484.     addfw    xtemp
  485.     iorfw    ytemp
  486.     if    POWER-1
  487.     btfsc    extflags,extime
  488.     btfss    extflags,extbut
  489.     iorlw    b'00010000'
  490.     endif
  491.     btfsc    flags,fon
  492.     tris    PORTA
  493.  
  494. ; packet bit shift watchdog
  495.  
  496. wchk    local
  497.     loop    schk,wdtp
  498.     bcf    INTCON,4    ;disable RB0 interrupt
  499.     movf    wdtp
  500.     btfss    STATUS,Z
  501.     goto    =a
  502.     movlf    11,recvc
  503.     bsf    wdtp,5
  504.     goto    p_init
  505. =a    bsf    INTCON,4    ;enable RB0 interrupt
  506.     goto    schk
  507.     endlocal
  508.  
  509. ; check power off
  510.  
  511. cpoff    btfsc    flags,fon
  512.     return
  513.     comfw    PORTA
  514.     andlw    b'00001111'
  515.     btfsc    STATUS,Z
  516.     btfss    PORTB,2
  517.     return
  518.     bsf    flags,fon
  519.     movlf    3,xtemp
  520.     movwf    ytemp
  521.     movlf    2,xcount
  522.     movwf    ycount
  523.     movwf    zcount
  524.     return
  525.  
  526. ; try to switch to MS-like wheel mode
  527.  
  528. testms    callw    send,0xf3
  529.     callw    send,200
  530.     callw    send,0xf3
  531.     movlw    100
  532.     btfsc    extflags,ext200
  533.     movlw    200
  534.     call    send
  535.     callw    send,0xf3
  536.     callw    send,80
  537.     callw    send,0xF2    ;read mouse ID
  538.     call    bwait
  539.     sublw    4
  540.     return
  541.  
  542. ; ------------------
  543. ; send byte to mouse
  544. ; ------------------
  545.  
  546. send    local
  547.     clrf    INTCON
  548.     movwf    temp1
  549.     movwf    sendata
  550.     clrf    sendetc
  551.     comf    sendetc
  552.     bcf    INDF,0        ;inhibit I/O
  553.     callw    delayus,100
  554.     movlf    8,count
  555.     movlw    1
  556. =a    rrf    temp1        ;calculate parity
  557.     skipnc
  558.     xorwf    sendetc
  559.     loop    =a,count
  560.     movlf    11,count
  561.     bsf    INDF,0
  562.     bcf    INDF,1        ;initiate send
  563. =b    clrwdt
  564.     clrw
  565. =c    addlw    1
  566.     bz    start        ;timeout? reset mouse
  567.     btfsc    PORTB,0        ;wait for 0
  568.     goto    =c
  569.     rrf    sendetc
  570.     rrf    sendata
  571.     btfss    STATUS,C
  572.     bcf    INDF,1
  573.     btfsc    STATUS,C
  574.     bsf    INDF,1
  575.     clrw
  576. =d    addlw    1
  577.     btfsc    STATUS,Z    ;timeout?
  578.     goto    start        ;reset mouse
  579.     btfss    PORTB,0        ;wait for 1
  580.     goto    =d
  581.     loop    =b,count
  582.     clrf    INTCON
  583.     endlocal
  584.     ; to be continued
  585.  
  586. ; -----------------------
  587. ; receive byte from mouse
  588. ; -----------------------
  589.  
  590. bwait    local
  591.     bsf    INTCON,7    ;global interrupt enable
  592.     bsf    INTCON,4    ;enable RB0 interrupt
  593.     movlf    40,count
  594. =a    clrwdt
  595.     callw    delayus,100
  596.     btfss    flags,fbyte
  597.     goto    =b
  598.     bcf    flags,fbyte
  599.     movfw    recvdt
  600.     bcf    STATUS,C
  601.     return
  602. =b    loop    =a,count
  603.     setc
  604.     return
  605.     endlocal
  606.  
  607. ; ------
  608. ; delays
  609. ; ------
  610.  
  611. delayms    local
  612.     movwf    count
  613. =a    clrwdt
  614.     movlw    249
  615. =b    addlw    0xff
  616.     bnz    =b
  617.     loop    =a,count
  618.     return
  619.     endlocal
  620.  
  621. delayus    addlw    0xff
  622.     bnz    delayus
  623.     return
  624.  
  625.     end
  626.