home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / documents / projects / interfaces / mouse / Filez / 1351.asm < prev    next >
Encoding:
Assembly Source File  |  2000-10-08  |  35.3 KB  |  1,042 lines

  1.         LIST P=16C84
  2.  
  3.  
  4.  
  5. ;  tHIS SHOULD BE THE CODE OF THE pic16C84 mcu IN THE ULTIMATE SERIAL TO
  6.  
  7. ;  cOMMODORE MOUSE INTERFACE.
  8.  
  9.  
  10.  
  11. ;  tHIS PROGRAM IS COPYRIGHTED BY THE aUTHOR. hOWEVER, i CONSIDER IT BEING
  12.  
  13. ;  UNDER gpl. bE IT WHATEVER WAY, THIS CODE WAS DONE BY ME AS
  14.  
  15. ;  lEVENTE h{$e1}RSFALVI, (c) 1998,1999,2000
  16.  
  17.  
  18.  
  19. ;  cOMPILE THE SOURCE WITH mpasm, THE FREELY AVAILABLE pic ASSEMBLER FROM
  20.  
  21. ;  mICROCHIP.
  22.  
  23.  
  24.  
  25. ;  v1.0  1998.06.08
  26.  
  27. ;  iNITIAL RELEASE. aLSO PART OF MY MASTER'S THESIS.
  28.  
  29. ;  aLL FEATURES WORK. mICROSOFT BARE MOUSE, mOUSE sYSTEMS MOUSE.
  30.  
  31. ;  aUTO DETECTION OF THE CONNECTED SERIAL MOUSE.
  32.  
  33. ;  jOYSTICK MODE ONLY.
  34.  
  35. ;  rIGHT AND MIDDLE BUTTONS MAPPED TO potx, poty.
  36.  
  37. ;  'pROPORTIONAL' MOVEMENT; MOVEMENT --> TIME DELAY
  38.  
  39.  
  40.  
  41. ;  v1.1  1999.07.14
  42.  
  43. ;  aDDED SUPPORT FOR lOGITECH mOUSEMAN (mICROSOFT MODE, WEIRD 3/4 BYTES
  44.  
  45. ;  PACKET FOR MIDDLE BUTTON). gENIUS MICE SEEM ALSO SUPPORT THIS MODE...
  46.  
  47. ;  rEMOVED CODE FOR SWITCHING OFF AND ON THE tl497 POWER SUPPLY CHIP
  48.  
  49. ;  (WAS USED FOR SWITCHING OFF THE MOUSE BEFORE STARTING DETECT PROCEDURE).
  50.  
  51. ;  rIGHT BUTTON TO poty, MID TO potx BUG FIXED.
  52.  
  53.  
  54.  
  55. ;  v1.2  2000.09.23
  56.  
  57. ;  fINALLY, ADDED SUPPORT FOR PROPORTIONAL 1351 MOUSE EMULATION!!!
  58.  
  59. ;  mODIFIED sERIN IN ORDER TO COPE WITH LESS ACCURATE TIMING AND DISABLED
  60.  
  61. ;  tmr0 INTERRUPT SERVICE (ALSO IMPLEMENTED A SEMAPHORE, AVOIDING pot IRQ
  62.  
  63. ;  HANDLER AND sERIN TO CONFUSE EACH OTHER).
  64.  
  65.  
  66.  
  67. ;    tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  68.  
  69. ;    IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  70.  
  71. ;    THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
  72.  
  73. ;    (AT YOUR OPTION) ANY LATER VERSION.
  74.  
  75.  
  76.  
  77. ;    tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  78.  
  79. ;    BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  80.  
  81. ;    merchantability OR fitness for a particular purpose.  sEE THE
  82.  
  83. ;    gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  84.  
  85.  
  86.  
  87. ;    yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  88.  
  89. ;    ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
  90.  
  91. ;    fOUNDATION, iNC., 59 tEMPLE pLACE, sUITE 330, bOSTON, ma  02111-1307  usa
  92.  
  93.  
  94.  
  95.  
  96.  
  97. ; --------------------------------------------------------------------------
  98.  
  99.  
  100.  
  101. #INCLUDE <p16c84.inc>
  102.  
  103.  
  104.  
  105.         rADIX    dec
  106.  
  107.  
  108.  
  109.         __CONFIG _xt_osc
  110.  
  111.  
  112.  
  113. ;uNCOMMENT FOR INVERTED POLARITY rs-232
  114.  
  115. ;#DEFINE invert
  116.  
  117.  
  118.  
  119. IRQL            EQU     20H     ;IRQ SERVICE ROUTINE POINTER (low)
  120.  
  121. PREV            EQU     21H     ;pREVIOUS tmr0 VALUE (SERIAL TIME CALCULATION)
  122.  
  123. LINE            EQU     23H     ;dELAY LINE PROGRAM - 'BANK' NUMBER
  124.  
  125.  
  126.  
  127. LINE1           EQU     24H
  128.  
  129. LINE2           EQU     2AH
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. TEMP            EQU     1DH
  138.  
  139. TEMP2           EQU     1EH
  140.  
  141. WSTACK          EQU     0CH
  142.  
  143. SSTACK          EQU     0DH
  144.  
  145. OUTBUF          EQU     19H     ;OUTPUT PIN BUFFER REGISTER.
  146.  
  147.                                 ;SEE 'OUTPUT PINS' DEFINITIONS.
  148.  
  149.  
  150.  
  151. serpin          EQU     0       ;SERIAL INPUT PIN IS ra0
  152.  
  153. cfgpin          EQU     2       ;OUTPUT MODE SELECTOR INPUT (JOY VS. 1351)
  154.  
  155.  
  156.  
  157. SCL             EQU     16H     ;sERIAL COUNTER LOW
  158.  
  159. SCH             EQU     17H     ;hIGH
  160.  
  161.  
  162.  
  163. ;                EQU     1FH    fREE!
  164.  
  165. ;                EQU     22H    fREE!
  166.  
  167.  
  168.  
  169. BITCNT          EQU     10H     ;uSED BY sERIN
  170.  
  171.  
  172.  
  173. STICKCNT        EQU     1CH     ;jOYSTICK MODE COUNTER
  174.  
  175. PTEMP           EQU     18H     ;tEMPORARY FOR THE potx/y IRQ HANDLER
  176.  
  177. PTEMP2          EQU     1CH     ;(tHE VARIABLES RESERVE THE SAME CELLS, SINCE
  178.  
  179.                                 ;THEY'RE NEVER USED IN BOTH ROLES AT THE
  180.  
  181.                                 ;SAME TIME)
  182.  
  183.  
  184.  
  185. BY0             EQU     11H     ;RESERVED AREA FOR THE BYTES RECEIVED FROM
  186.  
  187. BY1             EQU     12H     ;THE MOUSE. (iT TURNS OUT TO BE RESTRICTED
  188.  
  189. BY2             EQU     13H     ;IN THIS ROLE - ONLY THE FIRST BYTES ARE
  190.  
  191. BY3             EQU     14H     ;USED FOR THAT TASK, THE OTHERS ARE USED BY
  192.  
  193. BY4             EQU     15H     ;cLCLINE)
  194.  
  195. MSKT            EQU     0EH     ;tEMPORARY FOR potx/y MASK IN cLCLINE
  196.  
  197.  
  198.  
  199. X               EQU     1AH     ;X POSITION OF THE POINTER. 2'S COMPLEMENT
  200.  
  201. Y               EQU     1BH     ;GUESS WHAT...
  202.  
  203.  
  204.  
  205.  
  206.  
  207. sync            EQU     0       ;potx GOING DIRECTLY TO THE INPUT (int)
  208.  
  209. potx            EQU     1       ;OUTPUT PINS (potx ... up)
  210.  
  211. poty            EQU     2
  212.  
  213. right           EQU     3
  214.  
  215. left            EQU     4
  216.  
  217. down            EQU     5
  218.  
  219. fire            EQU     6
  220.  
  221. up              EQU     7
  222.  
  223.  
  224.  
  225. WFLAGS          EQU     0FH     ;BIT0   : 0=mICROSOFT MOUSE
  226.  
  227.                                 ;         1=mOUSE sYSTEMS MOUSE
  228.  
  229.                                 ;BIT1   : 0=jOYSTICK EMULATION MODE
  230.  
  231.                                 ;         1=1351 MODE
  232.  
  233.                                 ;BIT2,3 : trace BITS (KIND OF SEMAPHORE)
  234.  
  235. mouse_t         EQU     0       ;RESPECTIVE BITS OF THE ABOVE
  236.  
  237. emul_t          EQU     1
  238.  
  239. trace1          EQU     2
  240.  
  241. trace2          EQU     3
  242.  
  243.  
  244.  
  245.  
  246.  
  247. ; --- rESET HANDLER ---
  248.  
  249.  
  250.  
  251.         ORG     00H             ; RESET VECTOR.
  252.  
  253.         CLRF    pclath
  254.  
  255.         CLRWDT
  256.  
  257.         GOTO    sTART
  258.  
  259.  
  260.  
  261.         ORG     04H
  262.  
  263.  
  264.  
  265. ; --- MAIN irq HANDLER AND REDIRECTOR ---
  266.  
  267.  
  268.  
  269. iRQ     MOVWF   WSTACK          ;pUSH w
  270.  
  271.         SWAPF   status,w        ;pUSH status
  272.  
  273.         MOVWF   SSTACK
  274.  
  275.         MOVF    IRQL,w          ;lOAD irq VECTOR AND JUMP...
  276.  
  277.         MOVWF   pcl
  278.  
  279.  
  280.  
  281. ; --- DEFAULT IRQ HANDLER; UPDATES SERIAL TIMER ONLY. ---
  282.  
  283.  
  284.  
  285. dEFIRQ  MOVLW   256-(64-13)     ;sET TIMER
  286.  
  287.                                 ;64
  288.  
  289.                                 ;-3 (IRQ ACCEPT + JUMP)
  290.  
  291.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  292.  
  293.                                 ;-2 (SET_TIM)
  294.  
  295.                                 ;-2 (tmr0 STOPS AT WRITING)
  296.  
  297.         MOVWF   tmr0            ;rELOAD...
  298.  
  299.         BCF     intcon,t0if     ;cLEAR TIMER IRQ FLAG
  300.  
  301.         CLRWDT                  ;cLEAR WATCHDOG TIMER
  302.  
  303.         INCF    SCH,f           ;iNCREASE RS232 TIMER
  304.  
  305.         GOTO    IRQE            ;aLL DONE, GET OUT OF HERE.
  306.  
  307.  
  308.  
  309. ; --- iRQ HANDLER FOR 1351 MODE - FIRST PART... ---
  310.  
  311.  
  312.  
  313. pIRQ1   MOVLW   11              ;
  314.  
  315.                                 ;-3 (IRQ ACCEPT + JUMP)
  316.  
  317.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  318.  
  319.                                 ;-2 (MOVLW+SUBWF)
  320.  
  321.         SUBWF   tmr0,w          ;gET TIMER VALUE AT THE irq REQUEST MOMENT
  322.  
  323.         MOVWF   PTEMP           ;KEEP IT BY HAND...
  324.  
  325.         MOVLW   256-(128-16)    ;
  326.  
  327.                                 ;128
  328.  
  329.                                 ;-3 (IRQ ACCEPT + JUMP)
  330.  
  331.                                 ;-2 (TMR0 STOPS AFTER WRITE)
  332.  
  333.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  334.  
  335.                                 ;-3 (CALCULATE TIMER, STORE)
  336.  
  337.                                 ;-2 (SET_TIM)
  338.  
  339.         MOVWF   tmr0            ;lOAD...
  340.  
  341.  
  342.  
  343.         BSF     intcon,t0ie     ;eNABLE TIMER INTERRUPTS
  344.  
  345.         BCF     intcon,t0if     ;cLEAR IRQ FLAG
  346.  
  347.         BCF     intcon,inte     ;dISABLE EXTERNAL INTERRUPTS
  348.  
  349.         CLRWDT
  350.  
  351.  
  352.  
  353.         BSF     WFLAGS,trace2   ;iNHIBIT POLLED rs232 CNT UPDATE
  354.  
  355.         BTFSS   WFLAGS,trace1   ;sKIP IF UPDATING IS CURRENTLY SERVED
  356.  
  357.         CALL    uI_SERCNT       ;ELSE UPDATE SERIAL COUNTER
  358.  
  359.  
  360.  
  361.         MOVLW   low pIRQ2
  362.  
  363.         MOVWF   IRQL
  364.  
  365.         GOTO    IRQE
  366.  
  367.  
  368.  
  369. pIRQ2   MOVLW   256-(128-13)    ;sET TIMER
  370.  
  371.                                 ;128
  372.  
  373.                                 ;-3 (IRQ ACCEPT + JUMP)
  374.  
  375.                                 ;-2 (TMR0 STOPS AFTER WRITE)
  376.  
  377.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  378.  
  379.                                 ;-2 (SET_TIM)
  380.  
  381.         MOVWF   tmr0            ;rELOAD...
  382.  
  383.         BCF     intcon,t0if     ;cLEAR TIMER IRQ FLAG
  384.  
  385.         MOVLW   2
  386.  
  387.         ADDWF   SCH,f           ;iNCREASE RS232 TIMER
  388.  
  389.  
  390.  
  391.         MOVLW   low pIRQ3       ;SET NEXT PHASE, SINCE IT'S TIME...
  392.  
  393.         MOVWF   IRQL
  394.  
  395.         GOTO    IRQE            ;FINISHED...
  396.  
  397.  
  398.  
  399. pIRQ3   MOVLW   256-(64-13-22)  ;
  400.  
  401.                                 ;64
  402.  
  403.                                 ;-3 (IRQ ACCEPT + JUMP)
  404.  
  405.                                 ;-2 (TMR0 STOPS AFTER WRITE)
  406.  
  407.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  408.  
  409.                                 ;-2 (SET_TIM)
  410.  
  411.                                 ;-22 (22 CYCLES ADVANCE, TO START pIRQ4 SOONER)
  412.  
  413.         MOVWF   tmr0            ;lOAD...
  414.  
  415.  
  416.  
  417.         BCF     intcon,t0if     ;cLEAR TIMER IRQ FLAG
  418.  
  419.         MOVLW   3
  420.  
  421.         ADDWF   SCH,f           ;iNCREASE RS232 TIMER
  422.  
  423.         MOVLW   low pIRQ4
  424.  
  425.         MOVWF   IRQL
  426.  
  427.         GOTO    IRQE            ;FINISH
  428.  
  429.  
  430.  
  431. pIRQ4   MOVLW   256-128-14      ;sET TIMER
  432.  
  433.                                 ;128 CYCLES LONG PROCESS
  434.  
  435.                                 ;+12 (CYCLES UNTIL THE DUTY CYCLE BASE)
  436.  
  437.                                 ;+2 (TMR0 STOPS AFTER WRITE)
  438.  
  439.                                 ;(OTHERS WERE CALCULATED INTO pIRQ3)
  440.  
  441.         MOVWF   tmr0            ;rELOAD...
  442.  
  443.         BCF     intcon,t0if     ;cLEAR TIMER IRQ FLAG
  444.  
  445.  
  446.  
  447.         MOVF    fsr,w
  448.  
  449.         MOVWF   PTEMP           ;PRESERVE fsr REGISTER
  450.  
  451.         MOVF    LINE,w          ;lOAD DELAY LINE PROGRAM ADDRESS
  452.  
  453.         MOVWF   fsr
  454.  
  455.         BSF     status,rp0      ;wE'LL WRITE TO trisb, OR WHATEVER...
  456.  
  457.         MOVF    indf,w          ;fIRST JUMP
  458.  
  459.         INCF    fsr,f
  460.  
  461.         MOVWF   pcl             ;jUMP INTO THE DELAY LINE PRG
  462.  
  463.  
  464.  
  465.         GOTO    $+1             ;sIMPLE DELAY LINE
  466.  
  467.         GOTO    $+1             ;2 CYCLE nopS, WITH JUMP AT THE END.
  468.  
  469.         GOTO    $+1             ;2+ DELAY VALUE, BECAUSE OF THE JUMP (4 CLK
  470.  
  471.         GOTO    $+1             ;CYCLES)
  472.  
  473.         GOTO    $+1
  474.  
  475.         GOTO    $+1
  476.  
  477.         GOTO    $+1
  478.  
  479.         GOTO    $+1
  480.  
  481.         GOTO    $+1
  482.  
  483.         GOTO    $+1
  484.  
  485.         GOTO    $+1
  486.  
  487.         GOTO    $+1
  488.  
  489.         GOTO    $+1
  490.  
  491.         GOTO    $+1
  492.  
  493.         GOTO    $+1
  494.  
  495.         GOTO    $+1
  496.  
  497.         GOTO    $+1
  498.  
  499.         GOTO    $+1
  500.  
  501.         GOTO    $+1
  502.  
  503.         GOTO    $+1
  504.  
  505.         GOTO    $+1
  506.  
  507.         GOTO    $+1
  508.  
  509.         GOTO    $+1
  510.  
  511.         GOTO    $+1
  512.  
  513.         GOTO    $+1
  514.  
  515.         GOTO    $+1
  516.  
  517.         GOTO    $+1
  518.  
  519.         GOTO    $+1
  520.  
  521.         GOTO    $+1
  522.  
  523.         GOTO    $+1
  524.  
  525.         GOTO    $+1
  526.  
  527.         GOTO    $+1
  528.  
  529.         GOTO    $+1
  530.  
  531.         GOTO    $+1
  532.  
  533.         GOTO    $+1
  534.  
  535.         GOTO    $+1
  536.  
  537.         GOTO    $+1
  538.  
  539.         GOTO    $+1
  540.  
  541.         GOTO    $+1
  542.  
  543.         GOTO    $+1
  544.  
  545.         GOTO    $+1
  546.  
  547.         GOTO    $+1
  548.  
  549.         GOTO    $+1
  550.  
  551.         GOTO    $+1
  552.  
  553.         GOTO    $+1
  554.  
  555.         GOTO    $+1
  556.  
  557.         GOTO    $+1
  558.  
  559.         GOTO    $+1
  560.  
  561.         GOTO    $+1
  562.  
  563.         GOTO    $+1
  564.  
  565.         GOTO    $+1
  566.  
  567.         GOTO    $+1
  568.  
  569.         GOTO    $+1
  570.  
  571.         GOTO    $+1
  572.  
  573.         GOTO    $+1
  574.  
  575.         GOTO    $+1
  576.  
  577.         GOTO    $+1
  578.  
  579.         GOTO    $+1
  580.  
  581.         GOTO    $+1
  582.  
  583.         GOTO    $+1
  584.  
  585.         GOTO    $+1
  586.  
  587.         GOTO    $+1
  588.  
  589.         GOTO    $+1
  590.  
  591.         GOTO    $+1
  592.  
  593. v0      MOVF    indf,w          ;'0-POINT'
  594.  
  595.         INCF    fsr,f
  596.  
  597.         MOVWF   pcl
  598.  
  599.  
  600.  
  601. ;'0' TIME IS FIT TO THE MINUTE trisb IS WRITTEN
  602.  
  603.  
  604.  
  605.         GOTO    $+1             ;'X=1' IS HANDLED BY A -1 OFFSET
  606.  
  607. bEIR1   MOVF    indf,w          ;bEIR = 'wRITE INTO'
  608.  
  609.         MOVWF   trisb           ;lOAD BYTE, WRITE INTO trisb
  610.  
  611.         INCF    fsr,f           ;AND INCREASE POINTER
  612.  
  613.         MOVF    indf,w          ;nEXT BYTE IS A JUMP
  614.  
  615.         INCF    fsr,f           ;INC PTR
  616.  
  617.         NOP                     ;+1 CYCLE
  618.  
  619.         MOVWF   pcl             ;JUMP
  620.  
  621.                                 ;--> X-Y MUST BE 4+ (DELAY BETWEEN 2
  622.  
  623.                                 ;SUBSEQUENT WRITES TO trisb)
  624.  
  625.         GOTO    $+1
  626.  
  627. bEIR11  MOVF    indf,w          ;sPECIAL CASE: X-Y=3
  628.  
  629.         MOVWF   trisb
  630.  
  631.         GOTO    $+1
  632.  
  633.         GOTO    bEIR132         ;HARDWIRED JUMP
  634.  
  635.  
  636.  
  637.         GOTO    $+1
  638.  
  639. bEIR12  MOVF    indf,w          ;sPECIAL CASE: X-Y=2
  640.  
  641.         MOVWF   trisb
  642.  
  643.         GOTO    bEIR132
  644.  
  645.  
  646.  
  647.         GOTO    $+1
  648.  
  649. bEIR13  MOVF    indf,w          ;X-Y=1
  650.  
  651.         MOVWF   trisb
  652.  
  653. bEIR132 ANDLW   0FFH - ((1<<potx) {$7c} (1<<poty))
  654.  
  655.         MOVWF   trisb
  656.  
  657.         GOTO    P4E
  658.  
  659.  
  660.  
  661.         GOTO    $+1
  662.  
  663. bEIR2   MOVF    indf,w          ;X-Y=0, OR THE SECOND trisb WRITE
  664.  
  665.         MOVWF   trisb
  666.  
  667.  
  668.  
  669. P4E
  670.  
  671. P41     BTFSS   intcon,t0if     ;pOLL TIMER (FINISHES AT THE END OF
  672.  
  673.         GOTO    P41             ;THE 128 CYCLES LONG PERIOD)
  674.  
  675.  
  676.  
  677.         BCF     status,rp0
  678.  
  679.                                 ;sOME ADDITIONAL ADMINISTRATION - AND DELAY
  680.  
  681.         BCF     intcon,t0ie     ;dISABLE TIMER INTERRUPT
  682.  
  683.         BCF     intcon,t0if     ;cLEAR tmr INTERRUPT FLAG
  684.  
  685.         BSF     intcon,inte     ;...AND ENABLE THE EXTERNAL ONE
  686.  
  687.         BCF     intcon,intf
  688.  
  689.         MOVLW   low pIRQ1       ;SET NEXT irq
  690.  
  691.         MOVWF   IRQL
  692.  
  693.         BCF     WFLAGS,trace2   ;ENABLE POLLED RS232 CNT UPDATE
  694.  
  695.         MOVLW   2
  696.  
  697.         ADDWF   SCH,f           ;aDD TIME
  698.  
  699.         CLRF    PREV            ;...AND ANY ADDITIONAL DELAY WILL BE TAKEN
  700.  
  701.                                 ;INTO ACCOUNT CORRECTLY, TOO (SINCE tmr0
  702.  
  703.                                 ;WAS SET PROPERLY AND STILL COUNTS THE CYCLES)
  704.  
  705.         MOVF    PTEMP,w
  706.  
  707.         MOVWF   fsr             ;RESTORE fsr
  708.  
  709.  
  710.  
  711.         MOVF    OUTBUF,w
  712.  
  713.         BSF     status,rp0      ;rELEASE potx/y OUTPUTS
  714.  
  715.         MOVWF   trisb
  716.  
  717.         BCF     status,rp0
  718.  
  719.         GOTO    IRQE            ;FINISH
  720.  
  721.  
  722.  
  723.  
  724.  
  725. ;--- IRQ HANDLER WHEN JOYSTICK MODE IS SELECTED ---
  726.  
  727.  
  728.  
  729. jOYIRQ  MOVLW   256-(64-13)     ;sET TIMER
  730.  
  731.                                 ;64
  732.  
  733.                                 ;-3 (IRQ ACCEPT + JUMP)
  734.  
  735.                                 ;-2 (TMR0 STOPS AFTER WRITE)
  736.  
  737.                                 ;-6 (PHA, PHP, SETIRQADD, JUMP)
  738.  
  739.                                 ;-2 (SET_TIM)
  740.  
  741.         MOVWF   tmr0            ;RELOAD TIMER
  742.  
  743.         BCF     intcon,t0if     ;cLEAR TIMER IRQ FLAG
  744.  
  745.         CLRWDT                  ;cLEAR WATCHDOG TIMER
  746.  
  747.         INCF    SCH,f           ;iNCREASE RS232 TIMER
  748.  
  749.  
  750.  
  751.                                 ;JOYSTICK POSITION HANDLE PART.
  752.  
  753.         DECFSZ  STICKCNT,w      ;dECREASE JOYSTICK PRESCALER COUNTER
  754.  
  755.         GOTO    _I2             ;X PART IS ONLY CHECKED IF STICKCNT=0
  756.  
  757.  
  758.  
  759.         BSF     OUTBUF,right
  760.  
  761.         BSF     OUTBUF,left     ;INITIALIZE JOYSTICK DIRECTION BITS TO OFF
  762.  
  763.  
  764.  
  765.         MOVF    X,w             ;LOAD CURRENT X POSITION
  766.  
  767.         BTFSC   status,z        ;IF 0, SEE YA
  768.  
  769.         GOTO    _NOXMOV
  770.  
  771.         BTFSC   X,7             ;NEGATIVE?
  772.  
  773.         GOTO    _LEFT           ;NOT, JUMP TO THE _LEFT
  774.  
  775.         BCF     OUTBUF,right    ;SET right LINE BIT
  776.  
  777.         DECF    X,f             ;DECREASE X POSITION VALUE
  778.  
  779.         GOTO    _NOXMOV         ;SEE YA
  780.  
  781.  
  782.  
  783. _LEFT   BCF     OUTBUF,left     ;SET left LINE BIT,
  784.  
  785.         INCF    X,f             ;INCREASE X VALUE
  786.  
  787.  
  788.  
  789. _NOXMOV MOVLW   60              ;Y POSITION IS CHECKED ONLY IF STICKCNT=30
  790.  
  791. _I2     MOVWF   STICKCNT
  792.  
  793.         SUBLW   30
  794.  
  795.         BTFSS   status,z
  796.  
  797.         GOTO    _NOYMOV
  798.  
  799.  
  800.  
  801.         BSF     OUTBUF,up
  802.  
  803.         BSF     OUTBUF,down     ;INITIALIZE JOYSTICK DIRECTION BITS TO OFF
  804.  
  805.  
  806.  
  807.         MOVF    Y,w             ;SAME AS ABOVE, WITH Y POSITION.
  808.  
  809.         BTFSC   status,z
  810.  
  811.         GOTO    _NOYMOV
  812.  
  813.         BTFSC   Y,7
  814.  
  815.         GOTO    _UP
  816.  
  817.         BCF     OUTBUF,down
  818.  
  819.         DECF    Y,f
  820.  
  821.         GOTO    _NOYMOV
  822.  
  823.  
  824.  
  825. _UP     BCF     OUTBUF,up
  826.  
  827.         INCF    Y,f
  828.  
  829.  
  830.  
  831. _NOYMOV
  832.  
  833.  
  834.  
  835.         MOVF    OUTBUF,w
  836.  
  837.         BSF     status,rp0
  838.  
  839.         MOVWF   trisb           ;SET THE RESULTING DIRECTION BITS TO trisb
  840.  
  841.         BCF     status,rp0
  842.  
  843.  
  844.  
  845. IRQE    SWAPF   SSTACK,w
  846.  
  847.         MOVWF   status          ;pULL status
  848.  
  849.         SWAPF   WSTACK,f
  850.  
  851.         SWAPF   WSTACK,w        ;pULL w
  852.  
  853.         RETFIE
  854.  
  855.  
  856.  
  857.  
  858.  
  859. ;sIMPLE SERIAL RECEIVER ROUTINE. tHE TIMING IS BASED ON THE SCH VARIABLE
  860.  
  861. ;THAT IS INCREMENTED IN THE iRQ SERVICE ROUTINE. mOST MICE NEED
  862.  
  863. ;1200 BAUD. sCH IS INCREASED 13 TIMES DURING ONE BIT TIME.
  864.  
  865. ;aS DIFFERENT MICE SEND DATA WITH DIFFERENT PROTOCOLS, THIS ROUTINE
  866.  
  867. ;SUPPORTS EITHER 7 OR 8 BITS DATA (WITH ONE STOP BIT). nO PARITY CHECK IS
  868.  
  869. ;DONE. sERIN ASSUMES 8 DATA BITS IF WFLAGS.mouse_t IS SET.
  870.  
  871. ;tHE SERIAL DATA IS RETURNED IN THE REG ADDRESSED BY fsr.
  872.  
  873.  
  874.  
  875. sERIN
  876.  
  877.         CLRWDT                  ;cLEAR THAT *** WATCHDOG (THE PRG LOOPS HERE)
  878.  
  879.         CLRF    SCL             ;cLEAR SERIAL COUNTER AS LONG
  880.  
  881.         CLRF    SCH             ;AS NO STARTBIT IS SENSED ON serpin
  882.  
  883.         MOVF    tmr0,w
  884.  
  885.         MOVWF   PREV
  886.  
  887. #IFDEF invert
  888.  
  889. S1      BTFSS   porta,serpin
  890.  
  891. #ELSE
  892.  
  893. S1      BTFSC   porta,serpin
  894.  
  895. #ENDIF
  896.  
  897.         GOTO    sERIN
  898.  
  899.         BTFSS   intcon,t0ie     ;sKIP CALLING SERIAL COUNTER UPDATE IF
  900.  
  901.         CALL    u_SERCNT        ;IT IS TAKEN CARE BY THE irq SERVICE
  902.  
  903.  
  904.  
  905.         MOVLW   4               ;lda STARTCNT
  906.  
  907.         SUBWF   SCH,w           ;cmp #$04
  908.  
  909.         BTFSS   status,c        ;bcs S1  :-)
  910.  
  911.         GOTO    S1              ; = WAIT WHILE >=4 CYCLES
  912.  
  913.                                 ;STARTBIT (HIGH). tHUS WE'RE SURE THAT
  914.  
  915.                                 ;WE'RE SOMEWHERE IN THE FIRST THIRD OF THE
  916.  
  917.                                 ;START PULSE (ONE THIRD BIT TIME)
  918.  
  919.         MOVLW   4
  920.  
  921.         SUBWF   SCH,f           ;SUB THE ABOVE FROM SERIAL COUNTER
  922.  
  923.  
  924.  
  925.         CLRF    indf            ;CLEAR DATA
  926.  
  927.         MOVLW   8               ;SET NUMBER OF DATABITS
  928.  
  929.         BTFSS   WFLAGS,mouse_t  ;7 IF mICRO$OFT, ELSE 8
  930.  
  931.         MOVLW   7
  932.  
  933.         MOVWF   BITCNT
  934.  
  935.  
  936.  
  937. _NO2    BTFSS   intcon,t0ie     ;aS ABOVE, SKIP SERIAL COUNTER UPDATE IF
  938.  
  939.         CALL    u_SERCNT        ;tmr0 IRQ IS ON
  940.  
  941.  
  942.  
  943.         MOVLW   13
  944.  
  945.         SUBWF   SCH,w           ;WAIT UNTIL SCH EXCEEDS 13
  946.  
  947.         BTFSS   status,c        ;THUS WE WAITED ONE BIT-TIME
  948.  
  949.         GOTO    _NO2
  950.  
  951.         MOVLW   13
  952.  
  953.         SUBWF   SCH,f           ;sUBTRACT ONE BIT TIME
  954.  
  955.         RRF     porta,w         ;sERIAL INPUT PIN IS ra0 ;-)
  956.  
  957.         RRF     indf,f          ;ROTATE TO THE RIGHT.
  958.  
  959.  
  960.  
  961.         DECFSZ  BITCNT,f        ;ONCE MORE, UNTIL COLLECTED ALL BITS.
  962.  
  963.         GOTO    _NO2
  964.  
  965.  
  966.  
  967. #IFDEF invert
  968.  
  969.         BSF     status,c        ;PRE-SET cARRY, ACCORDING TO POLARITY
  970.  
  971. #ELSE
  972.  
  973.         BCF     status,c
  974.  
  975. #ENDIF
  976.  
  977.         BTFSS   WFLAGS,mouse_t  ;SKIP IF 8 DATABITS.
  978.  
  979.         RRF     indf,f          ;ELSE, SHIFT THE THING ONCE
  980.  
  981.                                 ;MORE.
  982.  
  983.  
  984.  
  985. #IFDEF invert
  986.  
  987.         COMF    indf,f          ;nEGATE LIKE HELL
  988.  
  989. _NO3    BTFSC   porta,serpin    ;WAIT FOR STOP BIT,
  990.  
  991. #ELSE
  992.  
  993. _NO3    BTFSS   porta,serpin    ;WAIT FOR STOP BIT,
  994.  
  995. #ENDIF
  996.  
  997.         GOTO    _NO3
  998.  
  999.         RETURN                  ;THEN GET OUTTA HERE.
  1000.  
  1001.  
  1002.  
  1003. ;uPDATE SERIAL COUNTER. iT IS CALLED WHENEVER THE tmr0 irq IS DISABLED
  1004.  
  1005. ;(IN OTHER WORDS, 1351 MODE IS SELECTED AND CURRENTLY NO potx/y PULSE IS
  1006.  
  1007. ;SERVED). cONTAINS SEMAPHORE CODE, TO AVOID CONFUSION IF THE irq ROUTINE
  1008.  
  1009. ;IS ACTIVATED DURING THE RUN.
  1010.  
  1011.  
  1012.  
  1013. u_SERCNT
  1014.  
  1015.         CLRWDT
  1016.  
  1017.         MOVF    PREV,w          ;STANDING AT PREVIOUS RUN
  1018.  
  1019.         SUBWF   tmr0,w          ;SPENT CYCLES CALCULATED
  1020.  
  1021.         BSF     WFLAGS,trace1   ;INHIBIT UPDATING sCH IN THE irq SERVICE
  1022.  
  1023.         BTFSC   WFLAGS,trace2   ;DID AN irq OCCUR MEANWHILE?
  1024.  
  1025.         GOTO    US_END          ;yES, THROW THE RESULT AWAY AND QUIT
  1026.  
  1027.         ADDWF   PREV,f          ;uPDATE PREVIOUS STANDING WITH THE DIFF
  1028.  
  1029.         MOVWF   TEMP
  1030.  
  1031.         CLRF    TEMP2
  1032.  
  1033.         RLF     TEMP,f
  1034.  
  1035.         RLF     TEMP2,f
  1036.  
  1037.         RLF     TEMP,w          ;mULTIPLY DIFF BY 4. lOW BYTE IN w
  1038.  
  1039.         RLF     TEMP2,f
  1040.  
  1041.         ADDWF   SCL,f           ;aDD TO sCL + WRITE IT BACK
  1042.  
  1043.         MOVF    TEMP2,w
  1044.  
  1045.         BTFSC   status,c        ;iNC sCH IF THERE WAS A CARRY
  1046.  
  1047.         ADDLW   1
  1048.  
  1049.         ADDWF   SCH,f           ;aDD HIGH BITS
  1050.  
  1051. US_END  BCF     WFLAGS,trace1   ;eNABLE irq sCL/sCH UPDATES
  1052.  
  1053.         RETURN
  1054.  
  1055.  
  1056.  
  1057. ;tHE SAME AS THE ABOVE, BUT TO BE CALLED FROM THE INTERRUPT ROUTINE
  1058.  
  1059. ;(DIFFERENT VARIABLES IN ORDER TO AVOID PROBLEMS)
  1060.  
  1061. uI_SERCNT
  1062.  
  1063.         MOVF    PREV,w
  1064.  
  1065.         SUBWF   PTEMP,w
  1066.  
  1067.         ADDWF   PREV,f
  1068.  
  1069.         MOVWF   PTEMP
  1070.  
  1071.         CLRF    PTEMP2
  1072.  
  1073.         RLF     PTEMP,f
  1074.  
  1075.         RLF     PTEMP2,f
  1076.  
  1077.         RLF     PTEMP,w
  1078.  
  1079.         RLF     PTEMP2,f
  1080.  
  1081.         ADDWF   SCL,f
  1082.  
  1083.         MOVF    PTEMP2,w
  1084.  
  1085.         BTFSC   status,c
  1086.  
  1087.         ADDLW   1
  1088.  
  1089.         ADDWF   SCH,f
  1090.  
  1091.         RETURN
  1092.  
  1093.  
  1094.  
  1095. ;cALCULATE LIMITATION. tHE RESULTING DELTA WILL BE LIMITED TO +-64.
  1096.  
  1097. ;pOSITION VALUE IN w, DELTA IN indf, RETURNS WITH LIMITED DELTA.
  1098.  
  1099. ;(cALLED IN JOYSTICK MODE ONLY).
  1100.  
  1101.  
  1102.  
  1103. cLCLIMIT
  1104.  
  1105.         MOVWF   TEMP
  1106.  
  1107.         ADDWF   indf,w
  1108.  
  1109.         MOVWF   TEMP2
  1110.  
  1111.         BTFSS   TEMP,7          ;iF OLD<0 & D<0 & NEW>=0 THEN NEW:=-128
  1112.  
  1113.         GOTO    _NNEG           ;'COS WE SEEM TO MADE IT UNDERFLOW
  1114.  
  1115.         BTFSS   indf,7
  1116.  
  1117.         GOTO    _NPOS           ;THIS IS NECCESSARY, ELSE OUR LIMITER
  1118.  
  1119.         BTFSC   TEMP2,7         ;WOULD FAIL.
  1120.  
  1121.         GOTO    _NPOS
  1122.  
  1123.         MOVLW   080H            ;-128
  1124.  
  1125.         GOTO    _NPOS
  1126.  
  1127.  
  1128.  
  1129. _NNEG   BTFSC   TEMP,7          ;THE SAME, IF IT SEEMS TO OVERFLOW
  1130.  
  1131.         GOTO    _NPOS           ;THUS LOAD 127 INSTEAD.
  1132.  
  1133.         BTFSC   indf,7          ;(CASE OLD>0, D>0, NEW<0)
  1134.  
  1135.         GOTO    _NPOS
  1136.  
  1137.         BTFSS   TEMP2,7
  1138.  
  1139.         GOTO    _NPOS
  1140.  
  1141.         MOVLW   07FH
  1142.  
  1143.  
  1144.  
  1145. _NPOS   MOVWF   TEMP2           ;EVERYTHING IS o.k., NOW LIMITING TO
  1146.  
  1147.         BTFSC   TEMP2,7         ;+-64 IF ABOVE
  1148.  
  1149.         GOTO    _CHKNEG
  1150.  
  1151.         MOVLW   64
  1152.  
  1153.         SUBWF   TEMP2,w
  1154.  
  1155.         MOVF    TEMP2,w
  1156.  
  1157.         BTFSC   status,c
  1158.  
  1159.         MOVLW   64
  1160.  
  1161.         GOTO    _CLE
  1162.  
  1163. _CHKNEG MOVLW   64
  1164.  
  1165.         ADDWF   TEMP2,w
  1166.  
  1167.         MOVF    TEMP2,w
  1168.  
  1169.         BTFSS   status,c
  1170.  
  1171.         MOVLW   -64
  1172.  
  1173. _CLE    MOVWF   TEMP2
  1174.  
  1175.  
  1176.  
  1177.         MOVF    TEMP,w
  1178.  
  1179.         SUBWF   TEMP2,w
  1180.  
  1181.         RETURN
  1182.  
  1183.  
  1184.  
  1185. cLCLINE                         ;cALCULATE DELAY LINE PROGRAM
  1186.  
  1187.         MOVLW   LINE1
  1188.  
  1189.         MOVWF   BY4             ;BY4 IS USED AS TEMPORARY
  1190.  
  1191.         MOVWF   fsr
  1192.  
  1193.         MOVF    LINE,w
  1194.  
  1195.         SUBLW   LINE1
  1196.  
  1197.         BTFSS   status,z        ;iF IT WAS LINE1, SET LINE2 (AND VICE VERSA)
  1198.  
  1199.         GOTO    _CL2            ;(dOUBLE BUFFERING)
  1200.  
  1201.         MOVLW   LINE2
  1202.  
  1203.         MOVWF   BY4
  1204.  
  1205.         MOVWF   fsr
  1206.  
  1207.  
  1208.  
  1209. _CL2    MOVLW   0FFH-(1<<potx)
  1210.  
  1211.         MOVWF   MSKT            ;potx OUTPUT MASK
  1212.  
  1213.         MOVF    X,w
  1214.  
  1215.         ANDLW   03FH            ;sTRIP BIT6 AND BIT7 FROM x, AND STORE IT
  1216.  
  1217.         MOVWF   BY2             ;TEMPORARILY (--> 6 BIT VALUES)
  1218.  
  1219.         MOVF    Y,w             ;tHE SAME WITH y
  1220.  
  1221.         ANDLW   03FH
  1222.  
  1223.         MOVWF   BY3
  1224.  
  1225.         SUBWF   BY2,w           ;cOMPARE...
  1226.  
  1227.         BTFSC   status,z
  1228.  
  1229.         GOTO    _CLEQ           ;eQUAL...
  1230.  
  1231.         BTFSS   status,c
  1232.  
  1233.         GOTO    _CL3
  1234.  
  1235.  
  1236.  
  1237.         MOVLW   0FFH-(1<<poty)  ;sEEMS LIKE y WAS LESS THAN x...
  1238.  
  1239.         MOVWF   MSKT            ;SO SWAP THEM. aS THE FIRST pot MASK, SET
  1240.  
  1241.         MOVF    BY2,w           ;poty.
  1242.  
  1243.         MOVWF   TEMP
  1244.  
  1245.         MOVF    BY3,w
  1246.  
  1247.         MOVWF   BY2
  1248.  
  1249.         MOVF    TEMP,W
  1250.  
  1251.         MOVWF   BY3
  1252.  
  1253.         GOTO    _CL3
  1254.  
  1255.  
  1256.  
  1257. _CLEQ   MOVLW   0FFH-((1<<potx) {$7c} (1<<poty))
  1258.  
  1259.         MOVWF   MSKT            ;eQUAL, SO SET BOTH MASKS.
  1260.  
  1261.  
  1262.  
  1263. _CL3    CLRF    TEMP            ;uSE TEMP LATER AS OFFSET (0 OR -1)
  1264.  
  1265.         MOVF    BY2,w
  1266.  
  1267.         SUBWF   BY3,f           ;qUICKLY GENERATE THE DIFFERENCE, AND STORE
  1268.  
  1269.                                 ;(WITH THE PREPARATION BELOW, ALWAYS POSITIVE)
  1270.  
  1271.         MOVF    BY2,w           ;tAKE THE 'SMALLER' VALUE
  1272.  
  1273.         BTFSC   status,z
  1274.  
  1275.         GOTO    _CLv0           ;IT IS ZERO, SKIP DELAY LINE 1 COMPLETELY
  1276.  
  1277.         ADDLW   0FFH            ;dec w
  1278.  
  1279.         BTFSC   status,z
  1280.  
  1281.         GOTO    _CLNOv0         ;X IS ONE, DO AS ABOVE BUT SET OFFSET -1
  1282.  
  1283.         ADDLW   0FFH
  1284.  
  1285.         SUBLW   low v0          ;2 OR ABOVE - SUBTRACT IT FROM THE ADDRESS
  1286.  
  1287.                                 ;OF 'v0', A LABEL AT THE END OF THE DELAY
  1288.  
  1289.                                 ;LINE. sET FIRST JUMP'S ADDRESS TO THE
  1290.  
  1291.         MOVWF   indf            ;CALCULATED POSITION THEN STORE...
  1292.  
  1293.         INCF    fsr,f           ;inc DELAY LINE PROGRAM POINTER...
  1294.  
  1295.         GOTO    _CLv0
  1296.  
  1297.  
  1298.  
  1299. _CLNOv0 DECF    TEMP,f          ;sET -1 OFFSET IF X=1
  1300.  
  1301. _CLv0   MOVF    BY3,w           ;nOW TAKE THE DIFF VALUE...
  1302.  
  1303.         BTFSC   status,z
  1304.  
  1305.         GOTO    _SB21           ;Y-X = 0
  1306.  
  1307.         ADDLW   0FFH
  1308.  
  1309.         BTFSC   status,z
  1310.  
  1311.         GOTO    _SB13           ;Y-X = 1
  1312.  
  1313.         ADDLW   0FFH
  1314.  
  1315.         BTFSC   status,z
  1316.  
  1317.         GOTO    _SB12           ;Y-X = 2
  1318.  
  1319.         ADDLW   0FFH
  1320.  
  1321.         BTFSC   status,z
  1322.  
  1323.         GOTO    _SB11           ;Y-X = 3
  1324.  
  1325.         GOTO    _SB1            ;Y-X = 4 OR ABOVE
  1326.  
  1327.  
  1328.  
  1329. _SB21   MOVLW   low bEIR2       ;sET THE APPROPRIATE PIECE AND STORE ITS
  1330.  
  1331.         GOTO    _SBX            ;ADDRESS
  1332.  
  1333. _SB13   MOVLW   low bEIR13
  1334.  
  1335.         GOTO    _SBX
  1336.  
  1337. _SB12   MOVLW   low bEIR12
  1338.  
  1339.         GOTO    _SBX
  1340.  
  1341. _SB11   MOVLW   low bEIR11
  1342.  
  1343. _SBX    ADDWF   TEMP,w          ;aDD OFFSET
  1344.  
  1345.         MOVWF   indf            ;sET NEXT JUMP ADDRESS
  1346.  
  1347.         INCF    fsr,f
  1348.  
  1349.         MOVF    OUTBUF,w        ;oUTPUT PINS BUFFER
  1350.  
  1351.         ANDWF   MSKT,w          ;mASK APPROPRIATE pot LINES
  1352.  
  1353.         MOVWF   indf            ;THEN SET TO THE PROGRAM
  1354.  
  1355.         INCF    fsr,f
  1356.  
  1357.         GOTO    _CLPEND
  1358.  
  1359.  
  1360.  
  1361. _SB1    MOVLW   low bEIR1
  1362.  
  1363.         ADDWF   TEMP,w          ;aDD OFFSET
  1364.  
  1365.         MOVWF   indf            ;sET NEXT JUMP ADDRESS
  1366.  
  1367.         INCF    fsr,f
  1368.  
  1369.         MOVF    OUTBUF,w        ;oUTPUT PINS BUFFER
  1370.  
  1371.         ANDWF   MSKT,w          ;mASK APPROPRIATE pot LINES
  1372.  
  1373.         MOVWF   indf            ;THEN SET TO THE PROGRAM
  1374.  
  1375.         INCF    fsr,f
  1376.  
  1377.  
  1378.  
  1379.         MOVLW   4
  1380.  
  1381.         SUBWF   BY3,w           ;Y-X-4
  1382.  
  1383.         BTFSC   status,z
  1384.  
  1385.         GOTO    _SB2            ;Y-X=4
  1386.  
  1387.         ADDLW   0FFH
  1388.  
  1389.         BTFSC   status,z
  1390.  
  1391.         GOTO    _SB22           ;Y-X=5
  1392.  
  1393.  
  1394.  
  1395.         MOVLW   6               ;Y-X=6 OR ABOVE
  1396.  
  1397.         SUBWF   BY3,w
  1398.  
  1399.         SUBLW   low v0          ;SO SET DELAY LINE AGAIN
  1400.  
  1401.         MOVWF   indf
  1402.  
  1403.         INCF    fsr,f
  1404.  
  1405.         GOTO    _SB2
  1406.  
  1407.  
  1408.  
  1409. _SB22   MOVLW   0FFH
  1410.  
  1411.         BTFSC   status,z
  1412.  
  1413. _SB2    MOVLW   0
  1414.  
  1415.         ADDLW   low bEIR2
  1416.  
  1417.         MOVWF   indf
  1418.  
  1419.         INCF    fsr,f
  1420.  
  1421.         MOVF    OUTBUF,w
  1422.  
  1423.         ANDLW   0FFH-((1<<potx) {$7c} (1<<poty)) ;mASK BOTH pot BITS
  1424.  
  1425.         MOVWF   indf
  1426.  
  1427.  
  1428.  
  1429. _CLPEND MOVF    BY4,w           ;fINISHED, NOW WE CAN TURN ON THE
  1430.  
  1431.         MOVWF   LINE            ;GENERATED PROGRAM
  1432.  
  1433.         RETURN
  1434.  
  1435.  
  1436.  
  1437. dETECTmOUSE                     ;CHECK IF WE HAVE pc OR m$ MOUSE INSTALLED
  1438.  
  1439.  
  1440.  
  1441.         MOVLW   0               ;wAIT A LOT BEFORE TRYING
  1442.  
  1443.         MOVWF   BY1             ;BY1 USED AS TEMPORARY (COUNTER)
  1444.  
  1445. _D1     MOVF    SCH,w
  1446.  
  1447.         BTFSS   status,z
  1448.  
  1449.         GOTO    _D1
  1450.  
  1451.         INCFSZ  BY1,f
  1452.  
  1453.         GOTO    _D1
  1454.  
  1455.  
  1456.  
  1457.         MOVLW   BY0
  1458.  
  1459.         MOVWF   fsr
  1460.  
  1461. _D2     CALL    sERIN           ;lOAD A 7 BIT DATA FROM THE SERIAL LINE
  1462.  
  1463.         MOVLW   07FH
  1464.  
  1465.         ANDWF   indf,w
  1466.  
  1467.         SUBLW   07FH
  1468.  
  1469.         BTFSC   status,z
  1470.  
  1471.         GOTO    _D2             ;gOT 07FH, TRY AGAIN
  1472.  
  1473.  
  1474.  
  1475.         MOVLW   0F8H            ;MASK MOST SIGNIFICANT 5 BITS
  1476.  
  1477.         ANDWF   indf,w
  1478.  
  1479.         BTFSC   status,z        ;IF IT'S 1, SUPPOSE WE HAVE A mICR0$0FT MOUSE
  1480.  
  1481.         GOTO    _DMSS           ;ELSE JUMP TO mOUSEsYS INIT
  1482.  
  1483.         RETURN
  1484.  
  1485. _DMSS   BSF     WFLAGS,mouse_t  ;SET mOUSE sYSTEMS SIGN
  1486.  
  1487.         RETURN
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493. sTART
  1494.  
  1495.         CLRF    WFLAGS          ;cLEAR EVERYTHING
  1496.  
  1497.         CLRF    X
  1498.  
  1499.         CLRF    Y
  1500.  
  1501.         MOVLW   0FFH            ;aLL PINS INACTIVE
  1502.  
  1503.         MOVWF   OUTBUF
  1504.  
  1505.         MOVWF   LINE1+1
  1506.  
  1507.  
  1508.  
  1509.         BSF     status,rp0
  1510.  
  1511.         MOVLW   (1<<not_rbpu) {$7c} (1<<psa) {$7c} (1<<ps2)
  1512.  
  1513.         MOVWF   option_reg      ;SET PRESCALER + TIMER STUFF
  1514.  
  1515.         BCF     status,rp0
  1516.  
  1517.  
  1518.  
  1519.         BTFSC   porta,cfgpin    ;tHE JUMPER STATE IS READ HERE
  1520.  
  1521.         BSF     WFLAGS,emul_t
  1522.  
  1523.         BTFSS   porta,cfgpin
  1524.  
  1525.         BCF     WFLAGS,emul_t
  1526.  
  1527.  
  1528.  
  1529.         MOVLW   (1<<potx) {$7c} (1<<poty)
  1530.  
  1531.         MOVWF   portb           ;aLL OUTPUTS ARE l ACTIVE, EXCEPT potx/y
  1532.  
  1533.         MOVLW   LINE1           ;bETTER INIT DELAY LINES - THEY CONTAIN
  1534.  
  1535.         MOVWF   LINE            ;COMPUTED GOTOS
  1536.  
  1537.         MOVLW   low bEIR2
  1538.  
  1539.         MOVWF   LINE1
  1540.  
  1541.  
  1542.  
  1543.         MOVLW   low dEFIRQ      ;sET SMALL irq HANDLER
  1544.  
  1545.         MOVWF   IRQL
  1546.  
  1547.         CLRF    tmr0            ;SET TIMER
  1548.  
  1549.         BSF     intcon,t0ie
  1550.  
  1551.         BSF     intcon,gie      ;ENABLE DEFAULT (MINIMAL) IRQ HANDLER
  1552.  
  1553.  
  1554.  
  1555.         CALL    dETECTmOUSE
  1556.  
  1557.  
  1558.  
  1559.         BCF     intcon,gie      ;dISABLE irqS
  1560.  
  1561.         BTFSC   WFLAGS,emul_t   ;NOW SET THE APP. irq HANDLER
  1562.  
  1563.         GOTO    _SET1351
  1564.  
  1565.  
  1566.  
  1567.         MOVLW   60              ;jOYSTICK MODE FOLLOWS...
  1568.  
  1569.         MOVWF   STICKCNT
  1570.  
  1571.         BCF     intcon,t0if
  1572.  
  1573.         MOVLW   low jOYIRQ
  1574.  
  1575.         GOTO    _J1
  1576.  
  1577.  
  1578.  
  1579. _SET1351
  1580.  
  1581.         BSF     status,rp0
  1582.  
  1583.         MOVLW   0FFH - ((1<<potx) {$7c} (1<<poty))
  1584.  
  1585.         MOVWF   trisb           ;dRIVE potx AND poty, TO DETECT THE COMPUTER
  1586.  
  1587.         BCF     status,rp0      ;PULLING potx LOW
  1588.  
  1589.         BCF     intcon,t0ie
  1590.  
  1591.         BCF     intcon,t0if
  1592.  
  1593.         BSF     intcon,inte     ;eNABLE EXTERNAL INTERRUPTS
  1594.  
  1595.         BCF     intcon,intf
  1596.  
  1597.         MOVLW   low pIRQ1       ;sET pot IRQ
  1598.  
  1599.  
  1600.  
  1601. _J1     MOVWF   IRQL
  1602.  
  1603.         BSF     intcon,gie
  1604.  
  1605.  
  1606.  
  1607.         BTFSC   WFLAGS,mouse_t  ;DETECTED, NOW JUMP.
  1608.  
  1609.         GOTO    _MOUSESYS1
  1610.  
  1611.         BTFSC   WFLAGS,emul_t
  1612.  
  1613.         GOTO    _MICROSPiN
  1614.  
  1615.         GOTO    _MICROSJiN
  1616.  
  1617.  
  1618.  
  1619. _MOUSESYS1
  1620.  
  1621.         BTFSC   WFLAGS,emul_t
  1622.  
  1623.         GOTO    _MOUSESYSPiN
  1624.  
  1625.         GOTO    _MOUSESYSJiN
  1626.  
  1627.  
  1628.  
  1629. ;MAIN LOOPS IN JOYSTICK MODE
  1630.  
  1631.  
  1632.  
  1633. _MICROSJ                        ;mAIN LOOP IN mICRO$OFT/JOYSTICK MODE
  1634.  
  1635.         MOVLW   BY0
  1636.  
  1637.         MOVWF   fsr
  1638.  
  1639.  
  1640.  
  1641. _CJ1    CALL    sERIN           ;sYNCHRONIZE TO THE FIRST BYTE OF THE PACKET.
  1642.  
  1643.         BTFSS   indf,6          ;mICROSOFT MICE START WITH A SET 6TH BIT OF
  1644.  
  1645.         GOTO    _CJ1            ;THE FIRST BYTE OF THE DATA PACK.
  1646.  
  1647.  
  1648.  
  1649. _MICROSJiN                      ;sTART HERE IF 4TH BYTE FAILED
  1650.  
  1651.         BTFSS   indf,5          ;lEFT BUTTON --> fIRE BUTTON
  1652.  
  1653.         BSF     OUTBUF,fire     ;cLEAR FLAG IN OUTBUF IF BUTTON PRESSED
  1654.  
  1655.         BTFSC   indf,5          ;--> THUS ACTIVATE THAT BIT IN trisb
  1656.  
  1657.         BCF     OUTBUF,fire     ;(DONE IN THE irq SERVICE)
  1658.  
  1659.  
  1660.  
  1661.         BTFSS   indf,4          ;rIGHT BUTTON --> potx
  1662.  
  1663.         BSF     OUTBUF,potx
  1664.  
  1665.         BTFSC   indf,4
  1666.  
  1667.         BCF     OUTBUF,potx
  1668.  
  1669.  
  1670.  
  1671.         INCF    fsr,f
  1672.  
  1673.         CALL    sERIN           ;nEXT BYTE
  1674.  
  1675.         BTFSC   indf,6
  1676.  
  1677.         GOTO    _MICROSP        ;nEVER LOSE SYNC!!!
  1678.  
  1679.         RRF     BY0,f
  1680.  
  1681.         RRF     BY0,f
  1682.  
  1683.         RRF     BY0,w
  1684.  
  1685.         ANDLW   0C0H
  1686.  
  1687.         IORWF   indf,f          ;aND NOW WE GOT THE WHOLE 8-BIT Dx MOVEMENT
  1688.  
  1689.  
  1690.  
  1691.         MOVF    X,w
  1692.  
  1693.         CALL    cLCLIMIT
  1694.  
  1695.         ADDWF   X,f
  1696.  
  1697.  
  1698.  
  1699.         CALL    sERIN           ;nEXT BYTE
  1700.  
  1701.         BTFSC   indf,6
  1702.  
  1703.         GOTO    _MICROSP
  1704.  
  1705.         RRF     BY0,f
  1706.  
  1707.         RRF     BY0,f
  1708.  
  1709.         RRF     BY0,w
  1710.  
  1711.         ANDLW   0C0H
  1712.  
  1713.         IORWF   indf,f          ;8-BIT y MOVEMENT
  1714.  
  1715.  
  1716.  
  1717.         MOVF    Y,w
  1718.  
  1719.         CALL    cLCLIMIT
  1720.  
  1721.         ADDWF   Y,f
  1722.  
  1723.  
  1724.  
  1725.         MOVLW   BY0             ;dO WE HAVE A 4TH BYTE?
  1726.  
  1727.         MOVWF   fsr             ;iF NEXT BYTE'S BIT6 IS 0, THEN WE DO.
  1728.  
  1729.                                 ;lOGITECH mOUSEMAN EXTENSION --> MIDDLE
  1730.  
  1731.                                 ;BUTTON WAS PRESSED/DEPRESSED.
  1732.  
  1733.         CALL    sERIN
  1734.  
  1735.         BTFSC   indf,6
  1736.  
  1737.         GOTO    _MICROSJiN      ;NOPE, IT'S A FIRST BYTE --> TREAT AS IT IS
  1738.  
  1739.  
  1740.  
  1741.         BTFSS   indf,5          ;mIDDLE BUTTON --> poty
  1742.  
  1743.         BSF     OUTBUF,poty
  1744.  
  1745.         BTFSC   indf,5
  1746.  
  1747.         BCF     OUTBUF,poty
  1748.  
  1749.  
  1750.  
  1751.         GOTO    _MICROSJ
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757. _MOUSESYSJ                      ;tHIS IS THE MAIN LOOP IN mOUSE SYSTEMS MODE
  1758.  
  1759.         MOVLW   BY0             ;(JOYSTICK MODE)
  1760.  
  1761.         MOVWF   fsr
  1762.  
  1763.  
  1764.  
  1765. _CJ2    CALL    sERIN           ;sOME SYNC. mOUSEsYS PACKETS START WITH A
  1766.  
  1767.         MOVLW   078H            ;0B10000xxx BYTE (xxx ARE THE BUTTONS)
  1768.  
  1769.         ANDWF   indf,w
  1770.  
  1771.         BTFSS   status,z
  1772.  
  1773.         GOTO    _CJ2
  1774.  
  1775.         BTFSS   indf,7
  1776.  
  1777.         GOTO    _CJ2
  1778.  
  1779.  
  1780.  
  1781. _MOUSESYSJiN
  1782.  
  1783.         BTFSC   indf,2          ;lEFT BUTTON --> fIRE BUTTON
  1784.  
  1785.         BSF     OUTBUF,fire     ;0 --> MOUSE BUTTON WAS DEPRESSED
  1786.  
  1787.         BTFSS   indf,2          ;(OPPOSITE TO m$ MICE)
  1788.  
  1789.         BCF     OUTBUF,fire
  1790.  
  1791.  
  1792.  
  1793.         BTFSC   indf,0
  1794.  
  1795.         BSF     OUTBUF,potx     ;rIGHT BUTTON --> potx
  1796.  
  1797.         BTFSS   indf,0
  1798.  
  1799.         BCF     OUTBUF,potx
  1800.  
  1801.  
  1802.  
  1803.         BTFSC   indf,1          ;mIDDLE BUTTON --> poty
  1804.  
  1805.         BSF     OUTBUF,poty
  1806.  
  1807.         BTFSS   indf,1
  1808.  
  1809.         BCF     OUTBUF,poty
  1810.  
  1811.  
  1812.  
  1813.         CALL    sERIN           ;nEXT BYTE (Dx)
  1814.  
  1815.         MOVF    X,w
  1816.  
  1817.         CALL    cLCLIMIT
  1818.  
  1819.         ADDWF   X,f
  1820.  
  1821.  
  1822.  
  1823.         CALL    sERIN           ;nEXT BYTE (Dy)
  1824.  
  1825.         COMF    indf,f          ;nEGATE(DY). DY IS THE OPPOSITE TO THE
  1826.  
  1827.         INCF    indf,f          ;m$ MOUSE.
  1828.  
  1829.         MOVF    Y,w
  1830.  
  1831.         CALL    cLCLIMIT
  1832.  
  1833.         ADDWF   Y,f
  1834.  
  1835.  
  1836.  
  1837.         CALL    sERIN           ;nEXT BYTE (Dx2, THE MOVEMENT WHILE
  1838.  
  1839.         MOVF    X,w             ;TRANSMITTING)
  1840.  
  1841.         CALL    cLCLIMIT
  1842.  
  1843.         ADDWF   X,f
  1844.  
  1845.  
  1846.  
  1847.         CALL    sERIN           ;nEXT BYTE (Dy2)
  1848.  
  1849.         COMF    indf,f
  1850.  
  1851.         INCF    indf,f
  1852.  
  1853.         MOVF    Y,w
  1854.  
  1855.         CALL    cLCLIMIT
  1856.  
  1857.         ADDWF   Y,f
  1858.  
  1859.  
  1860.  
  1861.         GOTO    _MOUSESYSJ      ;lOOP...
  1862.  
  1863.  
  1864.  
  1865. _MICROSP                        ;mAIN LOOP IN mICRO$OFT/PROPORTIONAL MODE
  1866.  
  1867.         MOVLW   BY0
  1868.  
  1869.         MOVWF   fsr
  1870.  
  1871.  
  1872.  
  1873. _CP1    CALL    sERIN           ;sYNCHRONIZE TO THE FIRST BYTE OF THE PACKET.
  1874.  
  1875.         BTFSS   indf,6          ;mICROSOFT MICE START WITH A SET 6TH BIT OF
  1876.  
  1877.         GOTO    _CP1            ;THE FIRST BYTE OF THE DATA PACK.
  1878.  
  1879.  
  1880.  
  1881. _MICROSPiN                      ;sTART HERE IF 4TH BYTE FAILED
  1882.  
  1883.         BTFSS   indf,5          ;lEFT BUTTON --> fIRE BUTTON
  1884.  
  1885.         BSF     OUTBUF,fire     ;cLEAR FLAG IN OUTBUF IF BUTTON PRESSED
  1886.  
  1887.         BTFSC   indf,5          ;--> THUS ACTIVATE THAT BIT IN trisb
  1888.  
  1889.         BCF     OUTBUF,fire     ;(DONE IN THE irq SERVICE)
  1890.  
  1891.  
  1892.  
  1893.         BTFSS   indf,4          ;rIGHT BUTTON --> up
  1894.  
  1895.         BSF     OUTBUF,up
  1896.  
  1897.         BTFSC   indf,4
  1898.  
  1899.         BCF     OUTBUF,up
  1900.  
  1901.  
  1902.  
  1903.         INCF    fsr,f
  1904.  
  1905.         CALL    sERIN           ;nEXT BYTE
  1906.  
  1907.         BTFSC   indf,6
  1908.  
  1909.         GOTO    _MICROSP        ;nEVER LOSE SYNC!!!
  1910.  
  1911.         RRF     BY0,f
  1912.  
  1913.         RRF     BY0,f
  1914.  
  1915.         RRF     BY0,w
  1916.  
  1917.         ANDLW   0C0H
  1918.  
  1919.         IORWF   indf,w          ;aND NOW WE GOT THE WHOLE 8-BIT Dx MOVEMENT
  1920.  
  1921.         ADDWF   X,f
  1922.  
  1923.  
  1924.  
  1925.         CALL    sERIN           ;nEXT BYTE
  1926.  
  1927.         BTFSC   indf,6
  1928.  
  1929.         GOTO    _MICROSP
  1930.  
  1931.         RRF     BY0,f
  1932.  
  1933.         RRF     BY0,f
  1934.  
  1935.         RRF     BY0,w
  1936.  
  1937.         ANDLW   0C0H
  1938.  
  1939.         IORWF   indf,w          ;8-BIT y MOVEMENT
  1940.  
  1941.         XORLW   0FFH            ;NEGATE! (OPPOSITE DIRECTION)
  1942.  
  1943.         ADDLW   1
  1944.  
  1945.         ADDWF   Y,f
  1946.  
  1947.  
  1948.  
  1949.         CALL    cLCLINE
  1950.  
  1951.         MOVLW   BY0             ;dO WE HAVE A 4TH BYTE?
  1952.  
  1953.         MOVWF   fsr             ;(lOGITECH mOUSEMAN MIDDLE BUTTON)
  1954.  
  1955.         CALL    sERIN
  1956.  
  1957.         BTFSC   indf,6
  1958.  
  1959.         GOTO    _MICROSPiN      ;NOPE, IT'S A FIRST BYTE --> TREAT AS IT IS
  1960.  
  1961.  
  1962.  
  1963.         BTFSS   indf,5          ;mIDDLE BUTTON --> down
  1964.  
  1965.         BSF     OUTBUF,down
  1966.  
  1967.         BTFSC   indf,5
  1968.  
  1969.         BCF     OUTBUF,down
  1970.  
  1971.  
  1972.  
  1973.         CALL    cLCLINE
  1974.  
  1975.         GOTO    _MICROSP
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981. _MOUSESYSP                      ;tHIS IS THE MAIN LOOP IN mOUSE SYSTEMS MODE
  1982.  
  1983.         MOVLW   BY0             ;(PROPORTIONAL)
  1984.  
  1985.         MOVWF   fsr
  1986.  
  1987.  
  1988.  
  1989. _CP2    CALL    sERIN           ;sOME SYNC. mOUSEsYS PACKETS START WITH A
  1990.  
  1991.         MOVLW   078H            ;0B10000xxx BYTE (xxx ARE THE BUTTONS)
  1992.  
  1993.         ANDWF   indf,w
  1994.  
  1995.         BTFSS   status,z
  1996.  
  1997.         GOTO    _CP2
  1998.  
  1999.         BTFSS   indf,7
  2000.  
  2001.         GOTO    _CP2
  2002.  
  2003.  
  2004.  
  2005. _MOUSESYSPiN
  2006.  
  2007.         BTFSC   indf,2          ;lEFT BUTTON --> fIRE BUTTON
  2008.  
  2009.         BSF     OUTBUF,fire     ;0 --> MOUSE BUTTON WAS DEPRESSED
  2010.  
  2011.         BTFSS   indf,2          ;(OPPOSITE TO m$ MICE)
  2012.  
  2013.         BCF     OUTBUF,fire
  2014.  
  2015.  
  2016.  
  2017.         BTFSC   indf,0
  2018.  
  2019.         BSF     OUTBUF,up       ;rIGHT BUTTON --> up
  2020.  
  2021.         BTFSS   indf,0
  2022.  
  2023.         BCF     OUTBUF,up
  2024.  
  2025.  
  2026.  
  2027.         BTFSC   indf,1          ;mIDDLE BUTTON --> down
  2028.  
  2029.         BSF     OUTBUF,down
  2030.  
  2031.         BTFSS   indf,1
  2032.  
  2033.         BCF     OUTBUF,down
  2034.  
  2035.  
  2036.  
  2037.         CALL    sERIN           ;nEXT BYTE (Dx)
  2038.  
  2039.         MOVF    indf,w
  2040.  
  2041.         ADDWF   X,f
  2042.  
  2043.  
  2044.  
  2045.         CALL    sERIN           ;nEXT BYTE (Dy)
  2046.  
  2047.         MOVF    indf,w
  2048.  
  2049.         ADDWF   Y,f
  2050.  
  2051.         CALL    cLCLINE         ;uPDATE DELAY LINE
  2052.  
  2053.         MOVLW   BY0
  2054.  
  2055.         MOVWF   fsr
  2056.  
  2057.  
  2058.  
  2059.         CALL    sERIN           ;nEXT BYTE (Dx2, THE MOVEMENT WHILE
  2060.  
  2061.         MOVF    indf,w          ;TRANSMITTING)
  2062.  
  2063.         ADDWF   X,f
  2064.  
  2065.  
  2066.  
  2067.         CALL    sERIN           ;nEXT BYTE (Dy2)
  2068.  
  2069.         MOVF    indf,w
  2070.  
  2071.         ADDWF   Y,f
  2072.  
  2073.  
  2074.  
  2075.         CALL    cLCLINE         ;uPDATE DELAY LINE
  2076.  
  2077.         GOTO    _MOUSESYSP      ;lOOP...
  2078.  
  2079.  
  2080.  
  2081.         END
  2082.  
  2083.