home *** CD-ROM | disk | FTP | other *** search
- LIST P=16C84
-
-
-
- ; tHIS SHOULD BE THE CODE OF THE pic16C84 mcu IN THE ULTIMATE SERIAL TO
-
- ; cOMMODORE MOUSE INTERFACE.
-
-
-
- ; tHIS PROGRAM IS COPYRIGHTED BY THE aUTHOR. hOWEVER, i CONSIDER IT BEING
-
- ; UNDER gpl. bE IT WHATEVER WAY, THIS CODE WAS DONE BY ME AS
-
- ; lEVENTE h{$e1}RSFALVI, (c) 1998,1999,2000
-
-
-
- ; cOMPILE THE SOURCE WITH mpasm, THE FREELY AVAILABLE pic ASSEMBLER FROM
-
- ; mICROCHIP.
-
-
-
- ; v1.0 1998.06.08
-
- ; iNITIAL RELEASE. aLSO PART OF MY MASTER'S THESIS.
-
- ; aLL FEATURES WORK. mICROSOFT BARE MOUSE, mOUSE sYSTEMS MOUSE.
-
- ; aUTO DETECTION OF THE CONNECTED SERIAL MOUSE.
-
- ; jOYSTICK MODE ONLY.
-
- ; rIGHT AND MIDDLE BUTTONS MAPPED TO potx, poty.
-
- ; 'pROPORTIONAL' MOVEMENT; MOVEMENT --> TIME DELAY
-
-
-
- ; v1.1 1999.07.14
-
- ; aDDED SUPPORT FOR lOGITECH mOUSEMAN (mICROSOFT MODE, WEIRD 3/4 BYTES
-
- ; PACKET FOR MIDDLE BUTTON). gENIUS MICE SEEM ALSO SUPPORT THIS MODE...
-
- ; rEMOVED CODE FOR SWITCHING OFF AND ON THE tl497 POWER SUPPLY CHIP
-
- ; (WAS USED FOR SWITCHING OFF THE MOUSE BEFORE STARTING DETECT PROCEDURE).
-
- ; rIGHT BUTTON TO poty, MID TO potx BUG FIXED.
-
-
-
- ; v1.2 2000.09.23
-
- ; fINALLY, ADDED SUPPORT FOR PROPORTIONAL 1351 MOUSE EMULATION!!!
-
- ; mODIFIED sERIN IN ORDER TO COPE WITH LESS ACCURATE TIMING AND DISABLED
-
- ; tmr0 INTERRUPT SERVICE (ALSO IMPLEMENTED A SEMAPHORE, AVOIDING pot IRQ
-
- ; HANDLER AND sERIN TO CONFUSE EACH OTHER).
-
-
-
- ; tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
-
- ; IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
-
- ; THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
-
- ; (AT YOUR OPTION) ANY LATER VERSION.
-
-
-
- ; tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
-
- ; BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
-
- ; merchantability OR fitness for a particular purpose. sEE THE
-
- ; gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
-
-
-
- ; yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
-
- ; ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
-
- ; fOUNDATION, iNC., 59 tEMPLE pLACE, sUITE 330, bOSTON, ma 02111-1307 usa
-
-
-
-
-
- ; --------------------------------------------------------------------------
-
-
-
- #INCLUDE <p16c84.inc>
-
-
-
- rADIX dec
-
-
-
- __CONFIG _xt_osc
-
-
-
- ;uNCOMMENT FOR INVERTED POLARITY rs-232
-
- ;#DEFINE invert
-
-
-
- IRQL EQU 20H ;IRQ SERVICE ROUTINE POINTER (low)
-
- PREV EQU 21H ;pREVIOUS tmr0 VALUE (SERIAL TIME CALCULATION)
-
- LINE EQU 23H ;dELAY LINE PROGRAM - 'BANK' NUMBER
-
-
-
- LINE1 EQU 24H
-
- LINE2 EQU 2AH
-
-
-
-
-
-
-
- TEMP EQU 1DH
-
- TEMP2 EQU 1EH
-
- WSTACK EQU 0CH
-
- SSTACK EQU 0DH
-
- OUTBUF EQU 19H ;OUTPUT PIN BUFFER REGISTER.
-
- ;SEE 'OUTPUT PINS' DEFINITIONS.
-
-
-
- serpin EQU 0 ;SERIAL INPUT PIN IS ra0
-
- cfgpin EQU 2 ;OUTPUT MODE SELECTOR INPUT (JOY VS. 1351)
-
-
-
- SCL EQU 16H ;sERIAL COUNTER LOW
-
- SCH EQU 17H ;hIGH
-
-
-
- ; EQU 1FH fREE!
-
- ; EQU 22H fREE!
-
-
-
- BITCNT EQU 10H ;uSED BY sERIN
-
-
-
- STICKCNT EQU 1CH ;jOYSTICK MODE COUNTER
-
- PTEMP EQU 18H ;tEMPORARY FOR THE potx/y IRQ HANDLER
-
- PTEMP2 EQU 1CH ;(tHE VARIABLES RESERVE THE SAME CELLS, SINCE
-
- ;THEY'RE NEVER USED IN BOTH ROLES AT THE
-
- ;SAME TIME)
-
-
-
- BY0 EQU 11H ;RESERVED AREA FOR THE BYTES RECEIVED FROM
-
- BY1 EQU 12H ;THE MOUSE. (iT TURNS OUT TO BE RESTRICTED
-
- BY2 EQU 13H ;IN THIS ROLE - ONLY THE FIRST BYTES ARE
-
- BY3 EQU 14H ;USED FOR THAT TASK, THE OTHERS ARE USED BY
-
- BY4 EQU 15H ;cLCLINE)
-
- MSKT EQU 0EH ;tEMPORARY FOR potx/y MASK IN cLCLINE
-
-
-
- X EQU 1AH ;X POSITION OF THE POINTER. 2'S COMPLEMENT
-
- Y EQU 1BH ;GUESS WHAT...
-
-
-
-
-
- sync EQU 0 ;potx GOING DIRECTLY TO THE INPUT (int)
-
- potx EQU 1 ;OUTPUT PINS (potx ... up)
-
- poty EQU 2
-
- right EQU 3
-
- left EQU 4
-
- down EQU 5
-
- fire EQU 6
-
- up EQU 7
-
-
-
- WFLAGS EQU 0FH ;BIT0 : 0=mICROSOFT MOUSE
-
- ; 1=mOUSE sYSTEMS MOUSE
-
- ;BIT1 : 0=jOYSTICK EMULATION MODE
-
- ; 1=1351 MODE
-
- ;BIT2,3 : trace BITS (KIND OF SEMAPHORE)
-
- mouse_t EQU 0 ;RESPECTIVE BITS OF THE ABOVE
-
- emul_t EQU 1
-
- trace1 EQU 2
-
- trace2 EQU 3
-
-
-
-
-
- ; --- rESET HANDLER ---
-
-
-
- ORG 00H ; RESET VECTOR.
-
- CLRF pclath
-
- CLRWDT
-
- GOTO sTART
-
-
-
- ORG 04H
-
-
-
- ; --- MAIN irq HANDLER AND REDIRECTOR ---
-
-
-
- iRQ MOVWF WSTACK ;pUSH w
-
- SWAPF status,w ;pUSH status
-
- MOVWF SSTACK
-
- MOVF IRQL,w ;lOAD irq VECTOR AND JUMP...
-
- MOVWF pcl
-
-
-
- ; --- DEFAULT IRQ HANDLER; UPDATES SERIAL TIMER ONLY. ---
-
-
-
- dEFIRQ MOVLW 256-(64-13) ;sET TIMER
-
- ;64
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-2 (SET_TIM)
-
- ;-2 (tmr0 STOPS AT WRITING)
-
- MOVWF tmr0 ;rELOAD...
-
- BCF intcon,t0if ;cLEAR TIMER IRQ FLAG
-
- CLRWDT ;cLEAR WATCHDOG TIMER
-
- INCF SCH,f ;iNCREASE RS232 TIMER
-
- GOTO IRQE ;aLL DONE, GET OUT OF HERE.
-
-
-
- ; --- iRQ HANDLER FOR 1351 MODE - FIRST PART... ---
-
-
-
- pIRQ1 MOVLW 11 ;
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-2 (MOVLW+SUBWF)
-
- SUBWF tmr0,w ;gET TIMER VALUE AT THE irq REQUEST MOMENT
-
- MOVWF PTEMP ;KEEP IT BY HAND...
-
- MOVLW 256-(128-16) ;
-
- ;128
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-2 (TMR0 STOPS AFTER WRITE)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-3 (CALCULATE TIMER, STORE)
-
- ;-2 (SET_TIM)
-
- MOVWF tmr0 ;lOAD...
-
-
-
- BSF intcon,t0ie ;eNABLE TIMER INTERRUPTS
-
- BCF intcon,t0if ;cLEAR IRQ FLAG
-
- BCF intcon,inte ;dISABLE EXTERNAL INTERRUPTS
-
- CLRWDT
-
-
-
- BSF WFLAGS,trace2 ;iNHIBIT POLLED rs232 CNT UPDATE
-
- BTFSS WFLAGS,trace1 ;sKIP IF UPDATING IS CURRENTLY SERVED
-
- CALL uI_SERCNT ;ELSE UPDATE SERIAL COUNTER
-
-
-
- MOVLW low pIRQ2
-
- MOVWF IRQL
-
- GOTO IRQE
-
-
-
- pIRQ2 MOVLW 256-(128-13) ;sET TIMER
-
- ;128
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-2 (TMR0 STOPS AFTER WRITE)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-2 (SET_TIM)
-
- MOVWF tmr0 ;rELOAD...
-
- BCF intcon,t0if ;cLEAR TIMER IRQ FLAG
-
- MOVLW 2
-
- ADDWF SCH,f ;iNCREASE RS232 TIMER
-
-
-
- MOVLW low pIRQ3 ;SET NEXT PHASE, SINCE IT'S TIME...
-
- MOVWF IRQL
-
- GOTO IRQE ;FINISHED...
-
-
-
- pIRQ3 MOVLW 256-(64-13-22) ;
-
- ;64
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-2 (TMR0 STOPS AFTER WRITE)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-2 (SET_TIM)
-
- ;-22 (22 CYCLES ADVANCE, TO START pIRQ4 SOONER)
-
- MOVWF tmr0 ;lOAD...
-
-
-
- BCF intcon,t0if ;cLEAR TIMER IRQ FLAG
-
- MOVLW 3
-
- ADDWF SCH,f ;iNCREASE RS232 TIMER
-
- MOVLW low pIRQ4
-
- MOVWF IRQL
-
- GOTO IRQE ;FINISH
-
-
-
- pIRQ4 MOVLW 256-128-14 ;sET TIMER
-
- ;128 CYCLES LONG PROCESS
-
- ;+12 (CYCLES UNTIL THE DUTY CYCLE BASE)
-
- ;+2 (TMR0 STOPS AFTER WRITE)
-
- ;(OTHERS WERE CALCULATED INTO pIRQ3)
-
- MOVWF tmr0 ;rELOAD...
-
- BCF intcon,t0if ;cLEAR TIMER IRQ FLAG
-
-
-
- MOVF fsr,w
-
- MOVWF PTEMP ;PRESERVE fsr REGISTER
-
- MOVF LINE,w ;lOAD DELAY LINE PROGRAM ADDRESS
-
- MOVWF fsr
-
- BSF status,rp0 ;wE'LL WRITE TO trisb, OR WHATEVER...
-
- MOVF indf,w ;fIRST JUMP
-
- INCF fsr,f
-
- MOVWF pcl ;jUMP INTO THE DELAY LINE PRG
-
-
-
- GOTO $+1 ;sIMPLE DELAY LINE
-
- GOTO $+1 ;2 CYCLE nopS, WITH JUMP AT THE END.
-
- GOTO $+1 ;2+ DELAY VALUE, BECAUSE OF THE JUMP (4 CLK
-
- GOTO $+1 ;CYCLES)
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- GOTO $+1
-
- v0 MOVF indf,w ;'0-POINT'
-
- INCF fsr,f
-
- MOVWF pcl
-
-
-
- ;'0' TIME IS FIT TO THE MINUTE trisb IS WRITTEN
-
-
-
- GOTO $+1 ;'X=1' IS HANDLED BY A -1 OFFSET
-
- bEIR1 MOVF indf,w ;bEIR = 'wRITE INTO'
-
- MOVWF trisb ;lOAD BYTE, WRITE INTO trisb
-
- INCF fsr,f ;AND INCREASE POINTER
-
- MOVF indf,w ;nEXT BYTE IS A JUMP
-
- INCF fsr,f ;INC PTR
-
- NOP ;+1 CYCLE
-
- MOVWF pcl ;JUMP
-
- ;--> X-Y MUST BE 4+ (DELAY BETWEEN 2
-
- ;SUBSEQUENT WRITES TO trisb)
-
- GOTO $+1
-
- bEIR11 MOVF indf,w ;sPECIAL CASE: X-Y=3
-
- MOVWF trisb
-
- GOTO $+1
-
- GOTO bEIR132 ;HARDWIRED JUMP
-
-
-
- GOTO $+1
-
- bEIR12 MOVF indf,w ;sPECIAL CASE: X-Y=2
-
- MOVWF trisb
-
- GOTO bEIR132
-
-
-
- GOTO $+1
-
- bEIR13 MOVF indf,w ;X-Y=1
-
- MOVWF trisb
-
- bEIR132 ANDLW 0FFH - ((1<<potx) {$7c} (1<<poty))
-
- MOVWF trisb
-
- GOTO P4E
-
-
-
- GOTO $+1
-
- bEIR2 MOVF indf,w ;X-Y=0, OR THE SECOND trisb WRITE
-
- MOVWF trisb
-
-
-
- P4E
-
- P41 BTFSS intcon,t0if ;pOLL TIMER (FINISHES AT THE END OF
-
- GOTO P41 ;THE 128 CYCLES LONG PERIOD)
-
-
-
- BCF status,rp0
-
- ;sOME ADDITIONAL ADMINISTRATION - AND DELAY
-
- BCF intcon,t0ie ;dISABLE TIMER INTERRUPT
-
- BCF intcon,t0if ;cLEAR tmr INTERRUPT FLAG
-
- BSF intcon,inte ;...AND ENABLE THE EXTERNAL ONE
-
- BCF intcon,intf
-
- MOVLW low pIRQ1 ;SET NEXT irq
-
- MOVWF IRQL
-
- BCF WFLAGS,trace2 ;ENABLE POLLED RS232 CNT UPDATE
-
- MOVLW 2
-
- ADDWF SCH,f ;aDD TIME
-
- CLRF PREV ;...AND ANY ADDITIONAL DELAY WILL BE TAKEN
-
- ;INTO ACCOUNT CORRECTLY, TOO (SINCE tmr0
-
- ;WAS SET PROPERLY AND STILL COUNTS THE CYCLES)
-
- MOVF PTEMP,w
-
- MOVWF fsr ;RESTORE fsr
-
-
-
- MOVF OUTBUF,w
-
- BSF status,rp0 ;rELEASE potx/y OUTPUTS
-
- MOVWF trisb
-
- BCF status,rp0
-
- GOTO IRQE ;FINISH
-
-
-
-
-
- ;--- IRQ HANDLER WHEN JOYSTICK MODE IS SELECTED ---
-
-
-
- jOYIRQ MOVLW 256-(64-13) ;sET TIMER
-
- ;64
-
- ;-3 (IRQ ACCEPT + JUMP)
-
- ;-2 (TMR0 STOPS AFTER WRITE)
-
- ;-6 (PHA, PHP, SETIRQADD, JUMP)
-
- ;-2 (SET_TIM)
-
- MOVWF tmr0 ;RELOAD TIMER
-
- BCF intcon,t0if ;cLEAR TIMER IRQ FLAG
-
- CLRWDT ;cLEAR WATCHDOG TIMER
-
- INCF SCH,f ;iNCREASE RS232 TIMER
-
-
-
- ;JOYSTICK POSITION HANDLE PART.
-
- DECFSZ STICKCNT,w ;dECREASE JOYSTICK PRESCALER COUNTER
-
- GOTO _I2 ;X PART IS ONLY CHECKED IF STICKCNT=0
-
-
-
- BSF OUTBUF,right
-
- BSF OUTBUF,left ;INITIALIZE JOYSTICK DIRECTION BITS TO OFF
-
-
-
- MOVF X,w ;LOAD CURRENT X POSITION
-
- BTFSC status,z ;IF 0, SEE YA
-
- GOTO _NOXMOV
-
- BTFSC X,7 ;NEGATIVE?
-
- GOTO _LEFT ;NOT, JUMP TO THE _LEFT
-
- BCF OUTBUF,right ;SET right LINE BIT
-
- DECF X,f ;DECREASE X POSITION VALUE
-
- GOTO _NOXMOV ;SEE YA
-
-
-
- _LEFT BCF OUTBUF,left ;SET left LINE BIT,
-
- INCF X,f ;INCREASE X VALUE
-
-
-
- _NOXMOV MOVLW 60 ;Y POSITION IS CHECKED ONLY IF STICKCNT=30
-
- _I2 MOVWF STICKCNT
-
- SUBLW 30
-
- BTFSS status,z
-
- GOTO _NOYMOV
-
-
-
- BSF OUTBUF,up
-
- BSF OUTBUF,down ;INITIALIZE JOYSTICK DIRECTION BITS TO OFF
-
-
-
- MOVF Y,w ;SAME AS ABOVE, WITH Y POSITION.
-
- BTFSC status,z
-
- GOTO _NOYMOV
-
- BTFSC Y,7
-
- GOTO _UP
-
- BCF OUTBUF,down
-
- DECF Y,f
-
- GOTO _NOYMOV
-
-
-
- _UP BCF OUTBUF,up
-
- INCF Y,f
-
-
-
- _NOYMOV
-
-
-
- MOVF OUTBUF,w
-
- BSF status,rp0
-
- MOVWF trisb ;SET THE RESULTING DIRECTION BITS TO trisb
-
- BCF status,rp0
-
-
-
- IRQE SWAPF SSTACK,w
-
- MOVWF status ;pULL status
-
- SWAPF WSTACK,f
-
- SWAPF WSTACK,w ;pULL w
-
- RETFIE
-
-
-
-
-
- ;sIMPLE SERIAL RECEIVER ROUTINE. tHE TIMING IS BASED ON THE SCH VARIABLE
-
- ;THAT IS INCREMENTED IN THE iRQ SERVICE ROUTINE. mOST MICE NEED
-
- ;1200 BAUD. sCH IS INCREASED 13 TIMES DURING ONE BIT TIME.
-
- ;aS DIFFERENT MICE SEND DATA WITH DIFFERENT PROTOCOLS, THIS ROUTINE
-
- ;SUPPORTS EITHER 7 OR 8 BITS DATA (WITH ONE STOP BIT). nO PARITY CHECK IS
-
- ;DONE. sERIN ASSUMES 8 DATA BITS IF WFLAGS.mouse_t IS SET.
-
- ;tHE SERIAL DATA IS RETURNED IN THE REG ADDRESSED BY fsr.
-
-
-
- sERIN
-
- CLRWDT ;cLEAR THAT *** WATCHDOG (THE PRG LOOPS HERE)
-
- CLRF SCL ;cLEAR SERIAL COUNTER AS LONG
-
- CLRF SCH ;AS NO STARTBIT IS SENSED ON serpin
-
- MOVF tmr0,w
-
- MOVWF PREV
-
- #IFDEF invert
-
- S1 BTFSS porta,serpin
-
- #ELSE
-
- S1 BTFSC porta,serpin
-
- #ENDIF
-
- GOTO sERIN
-
- BTFSS intcon,t0ie ;sKIP CALLING SERIAL COUNTER UPDATE IF
-
- CALL u_SERCNT ;IT IS TAKEN CARE BY THE irq SERVICE
-
-
-
- MOVLW 4 ;lda STARTCNT
-
- SUBWF SCH,w ;cmp #$04
-
- BTFSS status,c ;bcs S1 :-)
-
- GOTO S1 ; = WAIT WHILE >=4 CYCLES
-
- ;STARTBIT (HIGH). tHUS WE'RE SURE THAT
-
- ;WE'RE SOMEWHERE IN THE FIRST THIRD OF THE
-
- ;START PULSE (ONE THIRD BIT TIME)
-
- MOVLW 4
-
- SUBWF SCH,f ;SUB THE ABOVE FROM SERIAL COUNTER
-
-
-
- CLRF indf ;CLEAR DATA
-
- MOVLW 8 ;SET NUMBER OF DATABITS
-
- BTFSS WFLAGS,mouse_t ;7 IF mICRO$OFT, ELSE 8
-
- MOVLW 7
-
- MOVWF BITCNT
-
-
-
- _NO2 BTFSS intcon,t0ie ;aS ABOVE, SKIP SERIAL COUNTER UPDATE IF
-
- CALL u_SERCNT ;tmr0 IRQ IS ON
-
-
-
- MOVLW 13
-
- SUBWF SCH,w ;WAIT UNTIL SCH EXCEEDS 13
-
- BTFSS status,c ;THUS WE WAITED ONE BIT-TIME
-
- GOTO _NO2
-
- MOVLW 13
-
- SUBWF SCH,f ;sUBTRACT ONE BIT TIME
-
- RRF porta,w ;sERIAL INPUT PIN IS ra0 ;-)
-
- RRF indf,f ;ROTATE TO THE RIGHT.
-
-
-
- DECFSZ BITCNT,f ;ONCE MORE, UNTIL COLLECTED ALL BITS.
-
- GOTO _NO2
-
-
-
- #IFDEF invert
-
- BSF status,c ;PRE-SET cARRY, ACCORDING TO POLARITY
-
- #ELSE
-
- BCF status,c
-
- #ENDIF
-
- BTFSS WFLAGS,mouse_t ;SKIP IF 8 DATABITS.
-
- RRF indf,f ;ELSE, SHIFT THE THING ONCE
-
- ;MORE.
-
-
-
- #IFDEF invert
-
- COMF indf,f ;nEGATE LIKE HELL
-
- _NO3 BTFSC porta,serpin ;WAIT FOR STOP BIT,
-
- #ELSE
-
- _NO3 BTFSS porta,serpin ;WAIT FOR STOP BIT,
-
- #ENDIF
-
- GOTO _NO3
-
- RETURN ;THEN GET OUTTA HERE.
-
-
-
- ;uPDATE SERIAL COUNTER. iT IS CALLED WHENEVER THE tmr0 irq IS DISABLED
-
- ;(IN OTHER WORDS, 1351 MODE IS SELECTED AND CURRENTLY NO potx/y PULSE IS
-
- ;SERVED). cONTAINS SEMAPHORE CODE, TO AVOID CONFUSION IF THE irq ROUTINE
-
- ;IS ACTIVATED DURING THE RUN.
-
-
-
- u_SERCNT
-
- CLRWDT
-
- MOVF PREV,w ;STANDING AT PREVIOUS RUN
-
- SUBWF tmr0,w ;SPENT CYCLES CALCULATED
-
- BSF WFLAGS,trace1 ;INHIBIT UPDATING sCH IN THE irq SERVICE
-
- BTFSC WFLAGS,trace2 ;DID AN irq OCCUR MEANWHILE?
-
- GOTO US_END ;yES, THROW THE RESULT AWAY AND QUIT
-
- ADDWF PREV,f ;uPDATE PREVIOUS STANDING WITH THE DIFF
-
- MOVWF TEMP
-
- CLRF TEMP2
-
- RLF TEMP,f
-
- RLF TEMP2,f
-
- RLF TEMP,w ;mULTIPLY DIFF BY 4. lOW BYTE IN w
-
- RLF TEMP2,f
-
- ADDWF SCL,f ;aDD TO sCL + WRITE IT BACK
-
- MOVF TEMP2,w
-
- BTFSC status,c ;iNC sCH IF THERE WAS A CARRY
-
- ADDLW 1
-
- ADDWF SCH,f ;aDD HIGH BITS
-
- US_END BCF WFLAGS,trace1 ;eNABLE irq sCL/sCH UPDATES
-
- RETURN
-
-
-
- ;tHE SAME AS THE ABOVE, BUT TO BE CALLED FROM THE INTERRUPT ROUTINE
-
- ;(DIFFERENT VARIABLES IN ORDER TO AVOID PROBLEMS)
-
- uI_SERCNT
-
- MOVF PREV,w
-
- SUBWF PTEMP,w
-
- ADDWF PREV,f
-
- MOVWF PTEMP
-
- CLRF PTEMP2
-
- RLF PTEMP,f
-
- RLF PTEMP2,f
-
- RLF PTEMP,w
-
- RLF PTEMP2,f
-
- ADDWF SCL,f
-
- MOVF PTEMP2,w
-
- BTFSC status,c
-
- ADDLW 1
-
- ADDWF SCH,f
-
- RETURN
-
-
-
- ;cALCULATE LIMITATION. tHE RESULTING DELTA WILL BE LIMITED TO +-64.
-
- ;pOSITION VALUE IN w, DELTA IN indf, RETURNS WITH LIMITED DELTA.
-
- ;(cALLED IN JOYSTICK MODE ONLY).
-
-
-
- cLCLIMIT
-
- MOVWF TEMP
-
- ADDWF indf,w
-
- MOVWF TEMP2
-
- BTFSS TEMP,7 ;iF OLD<0 & D<0 & NEW>=0 THEN NEW:=-128
-
- GOTO _NNEG ;'COS WE SEEM TO MADE IT UNDERFLOW
-
- BTFSS indf,7
-
- GOTO _NPOS ;THIS IS NECCESSARY, ELSE OUR LIMITER
-
- BTFSC TEMP2,7 ;WOULD FAIL.
-
- GOTO _NPOS
-
- MOVLW 080H ;-128
-
- GOTO _NPOS
-
-
-
- _NNEG BTFSC TEMP,7 ;THE SAME, IF IT SEEMS TO OVERFLOW
-
- GOTO _NPOS ;THUS LOAD 127 INSTEAD.
-
- BTFSC indf,7 ;(CASE OLD>0, D>0, NEW<0)
-
- GOTO _NPOS
-
- BTFSS TEMP2,7
-
- GOTO _NPOS
-
- MOVLW 07FH
-
-
-
- _NPOS MOVWF TEMP2 ;EVERYTHING IS o.k., NOW LIMITING TO
-
- BTFSC TEMP2,7 ;+-64 IF ABOVE
-
- GOTO _CHKNEG
-
- MOVLW 64
-
- SUBWF TEMP2,w
-
- MOVF TEMP2,w
-
- BTFSC status,c
-
- MOVLW 64
-
- GOTO _CLE
-
- _CHKNEG MOVLW 64
-
- ADDWF TEMP2,w
-
- MOVF TEMP2,w
-
- BTFSS status,c
-
- MOVLW -64
-
- _CLE MOVWF TEMP2
-
-
-
- MOVF TEMP,w
-
- SUBWF TEMP2,w
-
- RETURN
-
-
-
- cLCLINE ;cALCULATE DELAY LINE PROGRAM
-
- MOVLW LINE1
-
- MOVWF BY4 ;BY4 IS USED AS TEMPORARY
-
- MOVWF fsr
-
- MOVF LINE,w
-
- SUBLW LINE1
-
- BTFSS status,z ;iF IT WAS LINE1, SET LINE2 (AND VICE VERSA)
-
- GOTO _CL2 ;(dOUBLE BUFFERING)
-
- MOVLW LINE2
-
- MOVWF BY4
-
- MOVWF fsr
-
-
-
- _CL2 MOVLW 0FFH-(1<<potx)
-
- MOVWF MSKT ;potx OUTPUT MASK
-
- MOVF X,w
-
- ANDLW 03FH ;sTRIP BIT6 AND BIT7 FROM x, AND STORE IT
-
- MOVWF BY2 ;TEMPORARILY (--> 6 BIT VALUES)
-
- MOVF Y,w ;tHE SAME WITH y
-
- ANDLW 03FH
-
- MOVWF BY3
-
- SUBWF BY2,w ;cOMPARE...
-
- BTFSC status,z
-
- GOTO _CLEQ ;eQUAL...
-
- BTFSS status,c
-
- GOTO _CL3
-
-
-
- MOVLW 0FFH-(1<<poty) ;sEEMS LIKE y WAS LESS THAN x...
-
- MOVWF MSKT ;SO SWAP THEM. aS THE FIRST pot MASK, SET
-
- MOVF BY2,w ;poty.
-
- MOVWF TEMP
-
- MOVF BY3,w
-
- MOVWF BY2
-
- MOVF TEMP,W
-
- MOVWF BY3
-
- GOTO _CL3
-
-
-
- _CLEQ MOVLW 0FFH-((1<<potx) {$7c} (1<<poty))
-
- MOVWF MSKT ;eQUAL, SO SET BOTH MASKS.
-
-
-
- _CL3 CLRF TEMP ;uSE TEMP LATER AS OFFSET (0 OR -1)
-
- MOVF BY2,w
-
- SUBWF BY3,f ;qUICKLY GENERATE THE DIFFERENCE, AND STORE
-
- ;(WITH THE PREPARATION BELOW, ALWAYS POSITIVE)
-
- MOVF BY2,w ;tAKE THE 'SMALLER' VALUE
-
- BTFSC status,z
-
- GOTO _CLv0 ;IT IS ZERO, SKIP DELAY LINE 1 COMPLETELY
-
- ADDLW 0FFH ;dec w
-
- BTFSC status,z
-
- GOTO _CLNOv0 ;X IS ONE, DO AS ABOVE BUT SET OFFSET -1
-
- ADDLW 0FFH
-
- SUBLW low v0 ;2 OR ABOVE - SUBTRACT IT FROM THE ADDRESS
-
- ;OF 'v0', A LABEL AT THE END OF THE DELAY
-
- ;LINE. sET FIRST JUMP'S ADDRESS TO THE
-
- MOVWF indf ;CALCULATED POSITION THEN STORE...
-
- INCF fsr,f ;inc DELAY LINE PROGRAM POINTER...
-
- GOTO _CLv0
-
-
-
- _CLNOv0 DECF TEMP,f ;sET -1 OFFSET IF X=1
-
- _CLv0 MOVF BY3,w ;nOW TAKE THE DIFF VALUE...
-
- BTFSC status,z
-
- GOTO _SB21 ;Y-X = 0
-
- ADDLW 0FFH
-
- BTFSC status,z
-
- GOTO _SB13 ;Y-X = 1
-
- ADDLW 0FFH
-
- BTFSC status,z
-
- GOTO _SB12 ;Y-X = 2
-
- ADDLW 0FFH
-
- BTFSC status,z
-
- GOTO _SB11 ;Y-X = 3
-
- GOTO _SB1 ;Y-X = 4 OR ABOVE
-
-
-
- _SB21 MOVLW low bEIR2 ;sET THE APPROPRIATE PIECE AND STORE ITS
-
- GOTO _SBX ;ADDRESS
-
- _SB13 MOVLW low bEIR13
-
- GOTO _SBX
-
- _SB12 MOVLW low bEIR12
-
- GOTO _SBX
-
- _SB11 MOVLW low bEIR11
-
- _SBX ADDWF TEMP,w ;aDD OFFSET
-
- MOVWF indf ;sET NEXT JUMP ADDRESS
-
- INCF fsr,f
-
- MOVF OUTBUF,w ;oUTPUT PINS BUFFER
-
- ANDWF MSKT,w ;mASK APPROPRIATE pot LINES
-
- MOVWF indf ;THEN SET TO THE PROGRAM
-
- INCF fsr,f
-
- GOTO _CLPEND
-
-
-
- _SB1 MOVLW low bEIR1
-
- ADDWF TEMP,w ;aDD OFFSET
-
- MOVWF indf ;sET NEXT JUMP ADDRESS
-
- INCF fsr,f
-
- MOVF OUTBUF,w ;oUTPUT PINS BUFFER
-
- ANDWF MSKT,w ;mASK APPROPRIATE pot LINES
-
- MOVWF indf ;THEN SET TO THE PROGRAM
-
- INCF fsr,f
-
-
-
- MOVLW 4
-
- SUBWF BY3,w ;Y-X-4
-
- BTFSC status,z
-
- GOTO _SB2 ;Y-X=4
-
- ADDLW 0FFH
-
- BTFSC status,z
-
- GOTO _SB22 ;Y-X=5
-
-
-
- MOVLW 6 ;Y-X=6 OR ABOVE
-
- SUBWF BY3,w
-
- SUBLW low v0 ;SO SET DELAY LINE AGAIN
-
- MOVWF indf
-
- INCF fsr,f
-
- GOTO _SB2
-
-
-
- _SB22 MOVLW 0FFH
-
- BTFSC status,z
-
- _SB2 MOVLW 0
-
- ADDLW low bEIR2
-
- MOVWF indf
-
- INCF fsr,f
-
- MOVF OUTBUF,w
-
- ANDLW 0FFH-((1<<potx) {$7c} (1<<poty)) ;mASK BOTH pot BITS
-
- MOVWF indf
-
-
-
- _CLPEND MOVF BY4,w ;fINISHED, NOW WE CAN TURN ON THE
-
- MOVWF LINE ;GENERATED PROGRAM
-
- RETURN
-
-
-
- dETECTmOUSE ;CHECK IF WE HAVE pc OR m$ MOUSE INSTALLED
-
-
-
- MOVLW 0 ;wAIT A LOT BEFORE TRYING
-
- MOVWF BY1 ;BY1 USED AS TEMPORARY (COUNTER)
-
- _D1 MOVF SCH,w
-
- BTFSS status,z
-
- GOTO _D1
-
- INCFSZ BY1,f
-
- GOTO _D1
-
-
-
- MOVLW BY0
-
- MOVWF fsr
-
- _D2 CALL sERIN ;lOAD A 7 BIT DATA FROM THE SERIAL LINE
-
- MOVLW 07FH
-
- ANDWF indf,w
-
- SUBLW 07FH
-
- BTFSC status,z
-
- GOTO _D2 ;gOT 07FH, TRY AGAIN
-
-
-
- MOVLW 0F8H ;MASK MOST SIGNIFICANT 5 BITS
-
- ANDWF indf,w
-
- BTFSC status,z ;IF IT'S 1, SUPPOSE WE HAVE A mICR0$0FT MOUSE
-
- GOTO _DMSS ;ELSE JUMP TO mOUSEsYS INIT
-
- RETURN
-
- _DMSS BSF WFLAGS,mouse_t ;SET mOUSE sYSTEMS SIGN
-
- RETURN
-
-
-
-
-
- sTART
-
- CLRF WFLAGS ;cLEAR EVERYTHING
-
- CLRF X
-
- CLRF Y
-
- MOVLW 0FFH ;aLL PINS INACTIVE
-
- MOVWF OUTBUF
-
- MOVWF LINE1+1
-
-
-
- BSF status,rp0
-
- MOVLW (1<<not_rbpu) {$7c} (1<<psa) {$7c} (1<<ps2)
-
- MOVWF option_reg ;SET PRESCALER + TIMER STUFF
-
- BCF status,rp0
-
-
-
- BTFSC porta,cfgpin ;tHE JUMPER STATE IS READ HERE
-
- BSF WFLAGS,emul_t
-
- BTFSS porta,cfgpin
-
- BCF WFLAGS,emul_t
-
-
-
- MOVLW (1<<potx) {$7c} (1<<poty)
-
- MOVWF portb ;aLL OUTPUTS ARE l ACTIVE, EXCEPT potx/y
-
- MOVLW LINE1 ;bETTER INIT DELAY LINES - THEY CONTAIN
-
- MOVWF LINE ;COMPUTED GOTOS
-
- MOVLW low bEIR2
-
- MOVWF LINE1
-
-
-
- MOVLW low dEFIRQ ;sET SMALL irq HANDLER
-
- MOVWF IRQL
-
- CLRF tmr0 ;SET TIMER
-
- BSF intcon,t0ie
-
- BSF intcon,gie ;ENABLE DEFAULT (MINIMAL) IRQ HANDLER
-
-
-
- CALL dETECTmOUSE
-
-
-
- BCF intcon,gie ;dISABLE irqS
-
- BTFSC WFLAGS,emul_t ;NOW SET THE APP. irq HANDLER
-
- GOTO _SET1351
-
-
-
- MOVLW 60 ;jOYSTICK MODE FOLLOWS...
-
- MOVWF STICKCNT
-
- BCF intcon,t0if
-
- MOVLW low jOYIRQ
-
- GOTO _J1
-
-
-
- _SET1351
-
- BSF status,rp0
-
- MOVLW 0FFH - ((1<<potx) {$7c} (1<<poty))
-
- MOVWF trisb ;dRIVE potx AND poty, TO DETECT THE COMPUTER
-
- BCF status,rp0 ;PULLING potx LOW
-
- BCF intcon,t0ie
-
- BCF intcon,t0if
-
- BSF intcon,inte ;eNABLE EXTERNAL INTERRUPTS
-
- BCF intcon,intf
-
- MOVLW low pIRQ1 ;sET pot IRQ
-
-
-
- _J1 MOVWF IRQL
-
- BSF intcon,gie
-
-
-
- BTFSC WFLAGS,mouse_t ;DETECTED, NOW JUMP.
-
- GOTO _MOUSESYS1
-
- BTFSC WFLAGS,emul_t
-
- GOTO _MICROSPiN
-
- GOTO _MICROSJiN
-
-
-
- _MOUSESYS1
-
- BTFSC WFLAGS,emul_t
-
- GOTO _MOUSESYSPiN
-
- GOTO _MOUSESYSJiN
-
-
-
- ;MAIN LOOPS IN JOYSTICK MODE
-
-
-
- _MICROSJ ;mAIN LOOP IN mICRO$OFT/JOYSTICK MODE
-
- MOVLW BY0
-
- MOVWF fsr
-
-
-
- _CJ1 CALL sERIN ;sYNCHRONIZE TO THE FIRST BYTE OF THE PACKET.
-
- BTFSS indf,6 ;mICROSOFT MICE START WITH A SET 6TH BIT OF
-
- GOTO _CJ1 ;THE FIRST BYTE OF THE DATA PACK.
-
-
-
- _MICROSJiN ;sTART HERE IF 4TH BYTE FAILED
-
- BTFSS indf,5 ;lEFT BUTTON --> fIRE BUTTON
-
- BSF OUTBUF,fire ;cLEAR FLAG IN OUTBUF IF BUTTON PRESSED
-
- BTFSC indf,5 ;--> THUS ACTIVATE THAT BIT IN trisb
-
- BCF OUTBUF,fire ;(DONE IN THE irq SERVICE)
-
-
-
- BTFSS indf,4 ;rIGHT BUTTON --> potx
-
- BSF OUTBUF,potx
-
- BTFSC indf,4
-
- BCF OUTBUF,potx
-
-
-
- INCF fsr,f
-
- CALL sERIN ;nEXT BYTE
-
- BTFSC indf,6
-
- GOTO _MICROSP ;nEVER LOSE SYNC!!!
-
- RRF BY0,f
-
- RRF BY0,f
-
- RRF BY0,w
-
- ANDLW 0C0H
-
- IORWF indf,f ;aND NOW WE GOT THE WHOLE 8-BIT Dx MOVEMENT
-
-
-
- MOVF X,w
-
- CALL cLCLIMIT
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE
-
- BTFSC indf,6
-
- GOTO _MICROSP
-
- RRF BY0,f
-
- RRF BY0,f
-
- RRF BY0,w
-
- ANDLW 0C0H
-
- IORWF indf,f ;8-BIT y MOVEMENT
-
-
-
- MOVF Y,w
-
- CALL cLCLIMIT
-
- ADDWF Y,f
-
-
-
- MOVLW BY0 ;dO WE HAVE A 4TH BYTE?
-
- MOVWF fsr ;iF NEXT BYTE'S BIT6 IS 0, THEN WE DO.
-
- ;lOGITECH mOUSEMAN EXTENSION --> MIDDLE
-
- ;BUTTON WAS PRESSED/DEPRESSED.
-
- CALL sERIN
-
- BTFSC indf,6
-
- GOTO _MICROSJiN ;NOPE, IT'S A FIRST BYTE --> TREAT AS IT IS
-
-
-
- BTFSS indf,5 ;mIDDLE BUTTON --> poty
-
- BSF OUTBUF,poty
-
- BTFSC indf,5
-
- BCF OUTBUF,poty
-
-
-
- GOTO _MICROSJ
-
-
-
-
-
- _MOUSESYSJ ;tHIS IS THE MAIN LOOP IN mOUSE SYSTEMS MODE
-
- MOVLW BY0 ;(JOYSTICK MODE)
-
- MOVWF fsr
-
-
-
- _CJ2 CALL sERIN ;sOME SYNC. mOUSEsYS PACKETS START WITH A
-
- MOVLW 078H ;0B10000xxx BYTE (xxx ARE THE BUTTONS)
-
- ANDWF indf,w
-
- BTFSS status,z
-
- GOTO _CJ2
-
- BTFSS indf,7
-
- GOTO _CJ2
-
-
-
- _MOUSESYSJiN
-
- BTFSC indf,2 ;lEFT BUTTON --> fIRE BUTTON
-
- BSF OUTBUF,fire ;0 --> MOUSE BUTTON WAS DEPRESSED
-
- BTFSS indf,2 ;(OPPOSITE TO m$ MICE)
-
- BCF OUTBUF,fire
-
-
-
- BTFSC indf,0
-
- BSF OUTBUF,potx ;rIGHT BUTTON --> potx
-
- BTFSS indf,0
-
- BCF OUTBUF,potx
-
-
-
- BTFSC indf,1 ;mIDDLE BUTTON --> poty
-
- BSF OUTBUF,poty
-
- BTFSS indf,1
-
- BCF OUTBUF,poty
-
-
-
- CALL sERIN ;nEXT BYTE (Dx)
-
- MOVF X,w
-
- CALL cLCLIMIT
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE (Dy)
-
- COMF indf,f ;nEGATE(DY). DY IS THE OPPOSITE TO THE
-
- INCF indf,f ;m$ MOUSE.
-
- MOVF Y,w
-
- CALL cLCLIMIT
-
- ADDWF Y,f
-
-
-
- CALL sERIN ;nEXT BYTE (Dx2, THE MOVEMENT WHILE
-
- MOVF X,w ;TRANSMITTING)
-
- CALL cLCLIMIT
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE (Dy2)
-
- COMF indf,f
-
- INCF indf,f
-
- MOVF Y,w
-
- CALL cLCLIMIT
-
- ADDWF Y,f
-
-
-
- GOTO _MOUSESYSJ ;lOOP...
-
-
-
- _MICROSP ;mAIN LOOP IN mICRO$OFT/PROPORTIONAL MODE
-
- MOVLW BY0
-
- MOVWF fsr
-
-
-
- _CP1 CALL sERIN ;sYNCHRONIZE TO THE FIRST BYTE OF THE PACKET.
-
- BTFSS indf,6 ;mICROSOFT MICE START WITH A SET 6TH BIT OF
-
- GOTO _CP1 ;THE FIRST BYTE OF THE DATA PACK.
-
-
-
- _MICROSPiN ;sTART HERE IF 4TH BYTE FAILED
-
- BTFSS indf,5 ;lEFT BUTTON --> fIRE BUTTON
-
- BSF OUTBUF,fire ;cLEAR FLAG IN OUTBUF IF BUTTON PRESSED
-
- BTFSC indf,5 ;--> THUS ACTIVATE THAT BIT IN trisb
-
- BCF OUTBUF,fire ;(DONE IN THE irq SERVICE)
-
-
-
- BTFSS indf,4 ;rIGHT BUTTON --> up
-
- BSF OUTBUF,up
-
- BTFSC indf,4
-
- BCF OUTBUF,up
-
-
-
- INCF fsr,f
-
- CALL sERIN ;nEXT BYTE
-
- BTFSC indf,6
-
- GOTO _MICROSP ;nEVER LOSE SYNC!!!
-
- RRF BY0,f
-
- RRF BY0,f
-
- RRF BY0,w
-
- ANDLW 0C0H
-
- IORWF indf,w ;aND NOW WE GOT THE WHOLE 8-BIT Dx MOVEMENT
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE
-
- BTFSC indf,6
-
- GOTO _MICROSP
-
- RRF BY0,f
-
- RRF BY0,f
-
- RRF BY0,w
-
- ANDLW 0C0H
-
- IORWF indf,w ;8-BIT y MOVEMENT
-
- XORLW 0FFH ;NEGATE! (OPPOSITE DIRECTION)
-
- ADDLW 1
-
- ADDWF Y,f
-
-
-
- CALL cLCLINE
-
- MOVLW BY0 ;dO WE HAVE A 4TH BYTE?
-
- MOVWF fsr ;(lOGITECH mOUSEMAN MIDDLE BUTTON)
-
- CALL sERIN
-
- BTFSC indf,6
-
- GOTO _MICROSPiN ;NOPE, IT'S A FIRST BYTE --> TREAT AS IT IS
-
-
-
- BTFSS indf,5 ;mIDDLE BUTTON --> down
-
- BSF OUTBUF,down
-
- BTFSC indf,5
-
- BCF OUTBUF,down
-
-
-
- CALL cLCLINE
-
- GOTO _MICROSP
-
-
-
-
-
- _MOUSESYSP ;tHIS IS THE MAIN LOOP IN mOUSE SYSTEMS MODE
-
- MOVLW BY0 ;(PROPORTIONAL)
-
- MOVWF fsr
-
-
-
- _CP2 CALL sERIN ;sOME SYNC. mOUSEsYS PACKETS START WITH A
-
- MOVLW 078H ;0B10000xxx BYTE (xxx ARE THE BUTTONS)
-
- ANDWF indf,w
-
- BTFSS status,z
-
- GOTO _CP2
-
- BTFSS indf,7
-
- GOTO _CP2
-
-
-
- _MOUSESYSPiN
-
- BTFSC indf,2 ;lEFT BUTTON --> fIRE BUTTON
-
- BSF OUTBUF,fire ;0 --> MOUSE BUTTON WAS DEPRESSED
-
- BTFSS indf,2 ;(OPPOSITE TO m$ MICE)
-
- BCF OUTBUF,fire
-
-
-
- BTFSC indf,0
-
- BSF OUTBUF,up ;rIGHT BUTTON --> up
-
- BTFSS indf,0
-
- BCF OUTBUF,up
-
-
-
- BTFSC indf,1 ;mIDDLE BUTTON --> down
-
- BSF OUTBUF,down
-
- BTFSS indf,1
-
- BCF OUTBUF,down
-
-
-
- CALL sERIN ;nEXT BYTE (Dx)
-
- MOVF indf,w
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE (Dy)
-
- MOVF indf,w
-
- ADDWF Y,f
-
- CALL cLCLINE ;uPDATE DELAY LINE
-
- MOVLW BY0
-
- MOVWF fsr
-
-
-
- CALL sERIN ;nEXT BYTE (Dx2, THE MOVEMENT WHILE
-
- MOVF indf,w ;TRANSMITTING)
-
- ADDWF X,f
-
-
-
- CALL sERIN ;nEXT BYTE (Dy2)
-
- MOVF indf,w
-
- ADDWF Y,f
-
-
-
- CALL cLCLINE ;uPDATE DELAY LINE
-
- GOTO _MOUSESYSP ;lOOP...
-
-
-
- END
-
-