;BACKUP\MINT.014
;
; NEED TO MAKE ONE SECOND TIMER BE INSIDE THE TENTH SECOND TIMER
; AND NEED TO MAKE THE TENTH SECOND TIMER TO HAVE 0xF0 INSTEAD OF 0x18,
; BECAUSE F0 (240) IS 10 TIMES A SECOND, AND I BET 24 WOULD BE 100 TIMES
; A SECOND. yeah! WE WANT THAT TOO i THINK. SO WE SHOULD MAKE A 100HERTZ
; SUB, THEN IN THAT, EVERY TEN TIMES DO THE 1/10, AND INSIDE OF *THAT*
; DO EVERT TENTH TIME AGAIN FOR THE ONE SECOND INT.
; NOTES:
; 'M' LETS YOU SET A VALUE FOR MOTORSEEK
; 'S' DISPLAYS MOTORPOS
; 'C' CENTERS THE SERVO
; 'E' AND 'e' SHOULD ADD/SUBTRACT 15 FROM MOTORSEEK
; 'P' AND 'p' SHOULD ENABLE/DISABLE SEEK ACTIVE
; 'R' forces WDT reset
; 'D' AND 'd' turns on and off DRIVE MOTOR
;
;------------------------------------------------------------------
;                               4/20/2001 JESSE GORDON
;



 



        LIST P=16C84
INCLUDE "P16C84.INC"
COMST           EQU     3       ;bits to be used on COMSTAT.  "All bits sent"
COMSS           EQU     4       ;"Has started start bit"
COMRP           EQU     5       ;receive in proggress.
;COMR            EQU     6       ;receive done <-- outdated: USE GENSTAT,GENR instead
COMB            EQU     7       ;set this to tell it to send the byte that is in BYTEOUT. Also, this stays set till the byte is all sent. so check to make sure this is low before writing to BYTEOUT.
GENSD           EQU     7       ;send was dropped to take an incoming byte
GENR            EQU     6       ;Receive done, byte ready..
DETECTRP        EQU     7       ;DETECT IF DEVICE WAS RESET OR POWERED UP..
MOTCENT         EQU     6       ;'MOTOR CENTER REQUEST' FLAG
PRESCALERVALUE  EQU     0x08    ;MOTOR POSITION PRESCALER
ONESECONDTIMERPRELOAD EQU .10 ;COUNTER VALUE FOR THE ONE SECOND TIMER
TENTHSECONDTIMERPRELOAD EQU 0x78 ;COUNTER VAL FOR THE TENTH SECOND TIMER
SEEKACTIVE      EQU     5       ;GENSTAT BIT. 1= DO SEEK MOTOR TO FOLLOW MOTORSEEK. 0 IS NOT TO FOLLOW.
BELLON          EQU     4       ;TOO BEEP OR NOT TO BEEP. (IF SET, BUZZER RUNS)
GENWFR          EQU     3       ;TOO WAIT OR NOT TO WAIT: CAUSES BLOCKINGPRINT TO NOT PRINT UNTIL A BYTE HAS BEEN RECEIVED.
RCVACTIVE       EQU     2       ;TO RECEIVE OR NOT TO RECEIVE..

PBSCRATCH       EQU     0x0C    ;PORTB scratch pad, for using as a temp when working with port B
SCRATCH         EQU     0x0D    ;scratchpad
W_TEMP          EQU     0x0E    ;where ISR (int sub rut) saves W register
STATUS_TEMP     EQU     0x0F    ;where ISR saves STATUS register
SCRATCH2        EQU     0x10    ;another gen purp reg
TIMELEFT        EQU     0x11    ;holds the value that is loaded into TMR0 every time the int on TMR0 overlow happens, this is where we adjust the frequency.
INTTEMP         EQU     0x12    ;temp var for usein the ISR
COMSTAT         EQU     0x13    ;Communication Status register. bits 0-3 count
; how many bits have been sent. 3 (COMST) also is the "all bits sent" flag.
; if both 3 and 0 are set, then stopbit has been sent and the whole byte
; send process is over.  bit 4 (COMSS) means start bit set(started).
; bit 7 (COMB) set when send is in progress, and also, after loading
; byte to be sent into BYTEOUT, then you set COMSTAT,COMB and it then
; starts sending, and when its done with that byte it clears COMB.
; NOTE: the above was a long line that caused mpalc to not work
BYTEIN          EQU     0x14    ;var to hold received byte
BYTEOUT         EQU     0x15    ;var to hold byte to be sent. note that the data in BYTEOUT is right shifted 8 times durring transmit, so should be write only, because data will be currupted after a send.
BYTEOUTTEMP     EQU     0x16    ;var to hold byte while sending.. this one gets corrupted instead of BYTEOUT.
GENSTAT         EQU     0x17    ;GENERAL STATUS: HOLDS DIFFERENT BITS..
BYTEINTEMP      EQU     0x18    ;TEMP FOR INBYTE, SO WE CAN READ THE LAST BYTE UP TILL THE VERY MOMENT THE NEW ONE IS READY
DETECTRPREG     EQU     0x19    ;TO SEE IF DEVICE WAS RESET OR POWERED UP.
MOTORPOS        EQU     0x1A    ;CURRENT POSITION OF MOTOR
MOTORSEEK       EQU     0x1B    ;DESIRED MOTOR POSITION
MOTORSTAT       EQU     0x1C    ;MOTOR STATUS BITS
PORTBCOMP       EQU     0x1D    ;SNAPSHOT RAM FOR PORTB4:7 PIN CHANGE COMPARISION (FIND OUT WHICH PIN WAS CHANGED)
MOTORTIMEOUTLOW EQU     0x1E    ;COUNTER FOR FIRST 8 BITS OF MOTOR MAX TIME COUNTER
MOTORTIMEOUTHIGH EQU    0x1F    ;COUNTER FOR LAST 8 BITS
MOTORPRESCALER  EQU     0x20
MOTORSEEK2      EQU     0x21    ;
DRIVETIME       EQU     0x22    ;HOW MANY TENTHS OF A SECOND LEFT TO RUN THE DRIVE
TENTHSECONDTIMER EQU     0x23    ;COUNTER TO COUNT DOWN TILL THE NEXT TENTH OF A SECOND
ONESECONDTIMER  EQU     0x24    ;COUNTER TO COUNT DOWN TILL NEXT SECOND
ODLOW           EQU     0x25    ; ODOMOTER (EACH COUNT IS TWO INCHES)
ODHIGH          EQU     0x26    ; ODOMOTER
ERRORREG        EQU     0x27    ;REG TO HOLD ERROR CODE ON A FORCED RESET
PAHSCRATCH      EQU     0x28    ;Print As Hex SCRATCH
PABSCRATCH      EQU     0x29    ;Print As Binary SCRATCH
HONKTIME        EQU     0x2A    ;TIME LEFT TO HONK
BYTEIN2         EQU     0x2B    ;THE SECOND BYTEIN, TO COMPARE WITH BYTEIN..
REDLEDTTL       EQU     0x2C    ;TIME TO LIVE FOR RED LED
BLUELEDTTL      EQU     0x2D    ;TTL FOR BLUE
        ORG     0       ;the beginging..
        GOTO    INIT    ;go right to where out main init code is..

        ORG     4       ;START OF ISR (int sub rutine) THAT IS CALLED 2400 TIMES A SEC,
                        ;WHEN TMR0 OVERFLOWS AND ALSO WHEN RB0 IS TRIPPED,
                        ;IF AND WHEN ITS A SERIAL INPUT LINE.
                                ;NEED TO SAVE W AND STATUS FIRST.. SWAPF DOES NOT AFFECT ANY FLAGS
        MOVWF   W_TEMP          ; Copy W to TEMP register,      ;MOVWF doesnt change any flags either,..
        SWAPF   STATUS,W        ; Swap status to be saved into W
        MOVWF   STATUS_TEMP     ; Save status to STATUS_TEMP register
        MOVFW   TIMELEFT
        BTFSS   INTCON,RBIF     ;IF PB47 IS NOT ACTIVE THEN:
        GOTO    COMCODE         ;GO TO THE SEND/RECEIVE STUFF..
                                ;ELSE DO THE PB47 STUFF, THEN EXIT  ISR


;----------------------- START OF PORT B PINS 4:7 CHANGE INT CODE -----------
        NOP                     ;THE PB47 STUFF..
        MOVFW   PORTB           ;LOAD PORTB
        ANDLW   B'11110000'     ;MASK OUT THE 4 LOWER BITS
        XORWF   PORTBCOMP,F ;XOR WITH UPPER FOUR BITS FROM LAST TIME, SAVE IN PORTBCOMP
                            ;PORTCOMP SHOULD NOW HAVE ONLY BITS 4:7 SET, DEPENDING ON WHICH PIN CHANGED STATES.



        BTFSS   PORTBCOMP,5     ;IF SERVO FEEDBACK CHANGED THEN
        GOTO    PB5END          ;(IF NOT, SKIP) BUT OTHERWISE:
        BTFSS   MOTORSTAT,MOTCENT ;IF CENTER REQUEST IS SET THEN:
        GOTO    PB5A1           ;(IF NOT, SKIP) OTHERWISE:
        BCF     PORTA,2         ;TURN OFF
        BCF     PORTA,3         ;SERVO
        BTFSC   PORTB,5         ;IF SERVO IS RIGHT OF CENTER THEN:
        GOTO    PB5A1           ;SET MOTORPOS TO 128, CLR CNTR RQST ELSE:
        BSF     PORTA,3         ;SET MOTOR TO RUN TORWARDS RIGHT OF CENTER.
        GOTO    PB5A2           ;AND SET MOTORPOS TO 128 BUT DONT CLR CNTR RQST
PB5A1   BCF     MOTORSTAT,MOTCENT ;SIGNAL THAT CENTER IS DONE
        BSF     GENSTAT,SEEKACTIVE      ;ENABLE SEEK ACTIVE
PB5A2   CLRF    MOTORPOS        ;NOW THAT THE MOTOR HAS PASSED CENTER,
        BSF     MOTORPOS,7      ;SET MOTOR POS TO 128 (RIGHT OF CENTER)
        CLRF    MOTORPRESCALER  ;AND CLEAR PRESCALER...
        INCF    MOTORPRESCALER  ;(WE GOTTA LEAVE PRESCALER READY TO TAKE A DECF AND STILL NOT BE LESS THEN 0)
PB5END  NOP     ;




        BTFSS   PORTBCOMP,4     ;IF OD HAS CHANGED
        GOTO    PB6END          ;(IF NOT, SKIP.) OTHERWISE:
        INCF    ODLOW           ;BUMP THE ODOMOTER
        BTFSC   STATUS,Z        ;IF FIRST 8 BITS ROLL OVER THEN
        INCF    ODHIGH          ;INC LAST 8 BITS


;        MOVLW   0x44            ;'D'
;        MOVWF   BYTEOUT
;        BSF     COMSTAT,COMB
        ;
        BCF     PORTB,3
        BTFSC   PORTB,4
        BSF     PORTB,3
PB6END  NOP



PB47A1END       NOP







        MOVFW   PORTB           ;READ PORTB SO WE CAN
        BCF     INTCON,RBIF     ;CLEAR THE RBIF FLAG
        MOVFW   PORTB           ;LOAD THE PORTB 4:7 VALUES FOR NEXT COMPARE
        ANDLW   B'11110000'     ;AND THEM SO WE ONLY GET THE UPPER FOUR
        MOVWF   PORTBCOMP       ;SAVE TO THE COMPARE REGISTER..
ENDOFPB47 GOTO    INTENDPB47
;-------------------- END OF PB47 CODE --------------------


;-------------------- START OF COM/TIMER CODE ----------------
COMCODE NOP
        MOVWF   TMR0            ;LOAD TIMER WITH NEW DELEY

;-------------------- START OF MOTOR POS CALCULATING CODE ------
; Some notes about why we have to DECF on MOTORPRESCALER when we load it with
; full value or why we have to INCF it when we clear it.:
; We need to always leave it ready to INCF or DECF, without it ever going over
; the prescaler value or less then 0 (would roll over to 0xFF).
; So by never leaving it more then one less the preload value,
; it can always be INCF'd and not be higher then preload value,
; and it can always be DECF'd and not be lower then 0.

        BTFSS   PORTA,3         ;IF MOTOR IS TURNING RIGHT THEN
        GOTO    MPC1A           ;(IF NOT SKIP, OTHERWISE)
        MOVFW   MOTORPOS        ;SEE IF MOTORPOS IS ALREADY 0xFF
        XORLW   0xFF
        BTFSC   STATUS,Z        ;IF MATCHES 0xFF THEN
        GOTO    MPC1A           ;SKIP THIS PART..
        MOVLW   B'01111111'     ;If servo is moving from left to right, torwards
        XORWF   MOTORPOS,W      ;right of center, but is still left of center, but MOTORPOS is about to roll over to right of center while servo has not yet reached right of center, we dont want to INCF motorpos.
        BTFSC   STATUS,Z        ;IF MOTORPOS IS NOT 127 THEN CONTINUE..
        BTFSC   PORTB,5         ;IF SERVO IS RIGHT OF CENTER, THEN CONTINUE..
        GOTO    MPC1B           ;CONTINUE..
        GOTO    MPC1A           ;MOTORPOS IS 127 AND SERVO IS STILL TO THE LEFT OF CENTER, SO WE DONT INCF ON MOTORPOS..
MPC1B   INCF    MOTORPRESCALER  ;INC THE LOW FEW BITS OF THE MOTOR POSITION COUNTER SYSTEM (MOTORPRESCALER)
        MOVFW   MOTORPRESCALER  ;LOAD CURRENT PRESCALER COUNT INTO W
        XORLW   PRESCALERVALUE  ;SEE IF PRESCALER HAS REACHED THE RIGHT NUMBER
        BTFSS   STATUS,Z        ;IF PRESCALER HAS REACHED SET VALUE, THEN:
        GOTO    MPC1A           ;(IF NOT THEN SKIP, ELSE:)
        CLRF    MOTORPRESCALER  ;CLEAR THE PRESCALER
        INCF    MOTORPRESCALER
        INCF    MOTORPOS        ;INC MOTORPOS... AND
        MOVFW   MOTORPOS        ;CHECK IF MOTORPOS HAS REACHED 0xFF
        XORLW   0xFF            ;
        BTFSS   STATUS,Z        ;IF MOTORPOS IS 0xFF, THEN:
        GOTO    MPC1A           ;(IF NOT, THEN SKIP, ELSE:)
        BCF     PORTA,3         ;TURN OFF SERVO
        BCF     PORTA,2         ;
MPC1A   NOP

        BTFSS   PORTA,2         ;IF MOTOR IS TURNING LEFT
        GOTO    MPC2A           ;(IF NOT SKIP, OTHERWISE)
        MOVFW   MOTORPOS        ;MAKE SURE MOTORPOS ISN'T ALREADY TO 0
        XORLW   0               ;IF IT IS, JUST SKIP THIS PART.
        BTFSC   STATUS,Z        ;SEE IF IT MATCHED 0...
        GOTO    MPC2A           ;SO LETS SKIP..
        MOVLW   B'10000001'     ;IF MOTORPOS IS ABOUT TO SAY LEFT OF CENTER, BUT
        XORWF   MOTORPOS,W      ;SERVO IS STIL RIGHT OF CENTER, THEN
        BTFSC   STATUS,Z        ;(IS ABOUT TO READ LEFT OF CENT)
        BTFSS   PORTB,5         ;(IS RIGHT OF CENTER)
        GOTO    MPC2B           ;THEN SKIP....
        GOTO    MPC2A           ;ELSE CONTINUE...
MPC2B   DECF    MOTORPRESCALER  ;DEC THE LOW FEW BITS OF THE MOTOR POSITION COUNTER SYSTEM (MOTORPRESCALER)
        BTFSS   STATUS,Z        ;IF PRESCALER HAS GONE DOWN TO 0 THEN:
        GOTO    MPC2A           ;(IF NOT THEN SKIP, ELSE:)
        MOVLW   PRESCALERVALUE  ;GET PRESCALER VALUE AND
        MOVWF   MOTORPRESCALER  ;SAVE IT TO THE PRESCALER
        DECF    MOTORPRESCALER  ;(PRESCALER -1, THAT IS......)
        DECF    MOTORPOS        ;DEC MOTORPOS... AND
        BTFSS   STATUS,Z        ;IF MOTORPOS HAS GONE DOWN TO 0 THEN:
        GOTO    MPC2A           ;(IF NOT, THEN SKIP, ELSE:)
        BCF     PORTA,3         ;TURN OFF SERVO
        BCF     PORTA,2         ;
MPC2A   NOP



MPCEND  NOP
;------------------ END OF MOTOR POS CALC CODE -----------



;----------------- START OF MOTORPOS FOLLOWING MOTORSEEK CODE (FMx[xxxxxx]) ---------
        BTFSS   GENSTAT,SEEKACTIVE
        GOTO    FMEND
        MOVFW   MOTORPOS
        SUBWF   MOTORSEEK,W     ;IF MOTORSEEK MINUS MOTORPOS IS:
        BTFSC   STATUS,Z        ;IS ZERO THEN
        GOTO    FMSTOP        ;GOTO FMISZERO WHERE WE STOP THE SERVO, ELSE:
        BTFSC   STATUS,C        ;IS CARRY/BARROW THEN
        GOTO    FMTR        ;TURN RIGHT, ELSE
FMTL    BSF     PORTA,2         ;TURN LEFT
        BCF     PORTA,3         ;
        GOTO    FMEND           ;
FMSTOP  BCF     PORTA,2         ;TURN OFF MOTOR
        BCF     PORTA,3
        GOTO    FMEND
FMTR    BSF     PORTA,3         ;START TURNNING RIGHT...
        BCF     PORTA,2
FMEND   NOP

;------------------ END OF MOTORPOS FOLLOWING MOTORSEEK CODE -------




;------------------- SERVO TIMEOUT CODE -------------------
        BTFSC   PORTA,2         ;IF SERVO IS GOING ONE DIRECTION THEN
        GOTO    MTOA            ;GOTO TIMEOUT SUB
        BTFSC   PORTA,3         ;IF SERVO IS GOIN OTHER DIRECTION THEN
        GOTO    MTOA            ;GOTO TIMEOUT SUB ELSE
        CLRF    MOTORTIMEOUTLOW ;CLEAR OUT THE COUNTERS
        CLRF    MOTORTIMEOUTHIGH ;
        GOTO    MTOEND          ;MOTOR IS NOT ACTIVE... SKIP TIMEOUT SUB
MTOA    NOP
        INCF    MOTORTIMEOUTLOW ;INC THE LOW COUNTER..
        BTFSC   STATUS,Z        ;IF LOW COUNTER ROLLS OVER, THEN
        INCF    MOTORTIMEOUTHIGH ;INC THE HIGH BYTE
        BTFSS   MOTORTIMEOUTHIGH,4 ;CHECK IF MAX COUNT HAS BEEN REACHED
        GOTO    MTOEND          ;NO TIMEOUT YET.. SKIP
        BCF     PORTA,2         ;TURN OFF
        BCF     PORTA,3         ;THE SURVO
        MOVFW   MOTORPOS        ;GET THE MOTORPOS AND
        MOVWF   MOTORSEEK       ;SAVE IT TO MOTORSEEK SO IT STOPS TRYING TO MOVE..
        CLRF    MOTORTIMEOUTLOW ;CLEAR THE TIMEOUT REG
        CLRF    MOTORTIMEOUTHIGH ;CLEAR THE TIMEOUT REG

        CLRF    COMSTAT         ;TEMP CODE TO
        MOVLW   0x54            ;PRINT 'T' IF
        MOVWF   BYTEOUT         ;MOTOR TIMEOUT
        BSF     COMSTAT,COMB    ;HAPPENS.

MTOEND NOP
;------------------ END OF SERVO TIMEOUT CODE ---------------


;---------------- TOGGLE PORTA,4 TO BEEP SPEAKER ------------------------
        BTFSS   INTCON,T0IF     ;CHECK IF THIS WAS TIMER TRIPPED
        GOTO    PA4TIC          ;NOPE.. SKIP..
        BTFSC   PORTA,4         ;TOGGLE PORTA,4 ON AND OFF
        GOTO    PA4TIS          ;SO WE KNOW HOW FAST THE INT IS HAPPENING.
        BSF     PORTA,4         ;NO POWER TO SPEAKER  (TOGGLE SPEAKER)
        GOTO    PA4TIC          ;
PA4TIS  BTFSC   GENSTAT,BELLON  ;IF BELLON IS SET THEN
        BCF     PORTA,4         ;GIVE POWER TO SPEAKER
PA4TIC  NOP                     ;END OF TOGGLE CODE
;-----------------END OF TOGGLE PORTA,0 CODE------------------




;---------------- RECEIVING THE BITS.. -------------------
        BTFSC   INTCON,T0IF     ;SKIP THIS IF TIMER DIDNT RUN OUT
        BTFSS   COMSTAT,COMRP   ;SEE IF RECEIVE IS IN PROGRESS..
        GOTO    ENDOFRECEIVE    ;NOPE.. SO SKIP.. ELSE:
        BTFSS   COMSTAT,COMSS   ;CHECK IF STARTBIT HAS BEEN RECEIVED..
        GOTO    ENDOFRECEIVE    ;NOT SET, SKIP... (ACTUALLY, THIS IS REDUNDANT)
;-----CHECK FOR LAST BIT SENT----
        BTFSS   COMSTAT,COMST   ;Check to see if last bit was sent last time..
        GOTO    SENDNEXTBIT     ;More to send.. Do that..
        NOP   ;Okay.. time to clean up after send is done.. stop bit should be happening now
        BCF     PORTB,3         ;jesseg temp
        BCF     INTCON,INTF     ;CLEAR THE 'HAPPENED' BIT
        BTFSC   GENSTAT,RCVACTIVE ;IF RECEIVE ACTIVE IS SET THEN
        BSF     INTCON,INTE     ;ENABLE INT ON RISING EDGEOF RB0
        MOVFW   BYTEINTEMP      ;LOAD THE NEW BYTE
        MOVWF   BYTEIN          ;SAVE IT TO BYTEIN...
        BSF     GENSTAT,GENR    ;SET "byte received -- done"
        CLRF    COMSTAT         ;CLEAR COMSTAT...

        BTFSS   PORTB,0         ;SEE IF STOPBIT IS LOW LIKE IT SHOULD BE..
        GOTO    RCV801          ;YES, IS LOW.. CONTINUE
        MOVLW   0x5A            ;'Z'
        MOVLW   BYTEOUT         ;SAVE Z TO SHOW STOP BIT WAS BAD
        BSF     COMSTAT,COMB    ;START SEND
        GOTO    ENDOFRECEIVE
RCV801  NOP


        BTFSS   GENSTAT,GENSD   ;CHECK TO SEE IF A SEND WAS CANCLED..
        GOTO    ENDOFRECEIVE    ;NOPE.,.. SO NOW SHOULD BE ALL DONE WITH XCV
        MOVLW   0x58            ;'X' TO INDICATE A BYTE WAS LOST...
        MOVWF   BYTEOUT         ;SEE LINE ABOVE. BOTH ARE TEMP
        BSF     COMSTAT,COMB    ;GIVE THE SIGNAL TO START SENDING THE POSTPONED BYTE..
        BCF     GENSTAT,GENSD   ;SET FALSE TO "CANCLED BYTE WAITING TO BE SENT"

        GOTO    ENDOFRECEIVE    ;ALL DONE RECEIVING..
SENDNEXTBIT NOP
        RRF     BYTEINTEMP      ;PREPARE VAR FOR NEXT BIT TO BE SAVED

        BTFSS   PORTB,0         ;SEE IF INPUT IS HI OR LOW
        GOTO    RCV001          ; COPY THE INVERSED BIT
        BCF     BYTEINTEMP,7    ; FROM PORTB,0 TO BYTEINTEMP,0
        GOTO    RCV002          ;
RCV001  BSF     BYTEINTEMP,7    ;
RCV002  NOP                     ; DONE WITH BIT COPY

        INCF    COMSTAT,F       ;RECORD THAT WE'VE SAVED ANOTHER BIT

        BTFSS   PORTB,3         ;TEMP CODE TO TOGLE SPEAKER OUT
        GOTO    RCV901          ; WHEN A BIT IS RECEIVED.
        BCF     PORTB,3
        GOTO    RCV902
RCV901  BSF     PORTB,3
RCV902  NOP



ENDOFRECEIVE    NOP


;---------------- CHECK FOR RISING EDGE ON PB0 -----------------------
;  Disabling PB0/INT interrupt only causes int to not happen on PB0
; rising edge.. the FLAG still gets set,when pb0 goes high!
; thats why we need to check here if receive is already started
PB0INTCHECK NOP
        BTFSS   GENSTAT,RCVACTIVE ;ONLY DO THIS PART IF RECEIVE ACTIVE BIT IS SET
        GOTO    ENDOFINTB
        BTFSS   INTCON,INTF     ;CHECK TO SEE IF INTB WAS TRIPPED..
        GOTO    ENDOFINTB       ;NO, SO SKIP
        BTFSC   COMSTAT,COMRP   ; NO NEED TO BE HERE DURRING RECEIVE
        GOTO    ENDOFINTB
        BTFSC   COMSTAT,COMB    ;SEE IF SEND WAS HAPPENING
        BSF     GENSTAT,GENSD   ;RECORD THAT A SEND WAS DROPPED FOR RCV
        CLRF    COMSTAT         ;ERASE ANY INFO LEFT FROM SEND
        BSF     COMSTAT,COMRP   ;SET RECEIVE IN PROGRESS
        BSF     COMSTAT,COMB    ;SET COM TO BUISY, SO PROGRAMS KNOW NOT TO SEND.
        BCF     INTCON,INTE     ;DISABLE INT PB0 TILL RECEIVE IS DONE
        BSF     COMSTAT,COMSS   ;SET "HAS RECEIVED START BIT"
        BCF     PORTA,1         ;TURN OFF THE SERIAL OUTPUT
        CLRF    TMR0            ;CAUSE TIMER TO TRIP IN 1.25 TIMES THE NORMAL TIME, ONCE..(SO WE'RE FOR SURE INTHE BIT, WHERE WE CAN READ IT)
        BSF     PORTB,3         ;temp jesseg
ENDOFINTB       NOP             ;NOW WE SHOULD BE READY TO READ FIRST BIT, NEXTTIME
;-------------------------- END OF RECEIVE CODE -------------------



;-------------------------- SEND BYTE CODE STARTS HERE ----------------------------------------------------
        BTFSS   INTCON,T0IF     ;IF NOT TIMER THEN
        GOTO    ENDBYTESEND     ;DONT SEND A BIT
        BTFSS   COMSTAT,COMRP   ;DONT SEND A BYTE IF REVEICE IS IN PROGRESS.. JUST WAIT..
        BTFSS   COMSTAT,COMB    ;SEE IF SEND/RCV (COMB) IS ACTIVE(SET)
        GOTO    ENDBYTESEND     ;NO, SO SKIP SENDING..
        BTFSC   COMSTAT,COMST   ;CHECK IF Last data bit has been sent..
        GOTO    SENDBYTEALLDONE ;YES; So go check to see if start bit has been started and or stopped.
BYTESENDBEGING NOP
        BTFSC   COMSTAT,COMSS   ;ACTIVE. CHECK IF THE START BIT HAS BEEN SENT.
        GOTO    DONTSETSB       ;START BIT IS ALREADY SET.
        BSF     COMSTAT,COMSS   ;RECORD THAT WE'VE SENT THE STARTBIT
        BSF     PORTA,1         ;START THE START BIT...
        BCF     COMSTAT,0       ; CLEAR THE BITS SENT COUNTER..
        BCF     COMSTAT,1
        BCF     COMSTAT,2
        MOVFW   BYTEOUT         ;
        MOVWF   BYTEOUTTEMP     ;
        GOTO    ENDBYTESEND      ;NOTHING ELSE TO DO TILL THE STARTBIT IS DONE
DONTSETSB NOP                   ;Lets send the next bit..
        BTFSS   BYTEOUTTEMP,0   ;SINCE RS232 IS IVERTED, LOW=1 AND HIGH=0
        GOTO    INTTEMP1IS0     ;WE LOAD THE BIT FROM THE BYTEOUTTEMP THEN
        BCF     PORTA,1         ;INVERT ITS VALUE AND PUT IT ON THE RS232
        GOTO    INTTEMP1IS1     ;OUTPUT PIN.
INTTEMP1IS0  BSF PORTA,1
INTTEMP1IS1 NOP
        INCF    COMSTAT         ;RECORD WHAT BIT WE JUST SENT..When last byte
                                ; is sent, it INCs COMSTAT from xxxx0111 to xxxx1000,
                                ; and since bit 3 is the ALL BITS SENT flag, it
                                ; automatically gets set. When  ALL BITS SENT
                                ; and COMSTAT,0 are both set, then every thing
                                ; is done.
        RRF     BYTEOUTTEMP,F       ;GET NEXT BIT READY TO SEND..
        GOTO    ENDBYTESEND
SENDBYTEALLDONE NOP
        BTFSS   COMSTAT,0       ;Check if start bit has been started...
        GOTO    STARTSTOPBIT    ;No, so go start it..
        CLRF    COMSTAT         ;Yes, so clear the comstat reg, which sets it all ready to send another byte
        GOTO    ENDBYTESEND     ;Byte all sent.. ready for next..
STARTSTOPBIT NOP
        BCF     PORTA,1 ;START STOP BIT..
        INCF    COMSTAT ;TO SHOW THAT THE STOP BIT HAS BEEN STARTED.
ENDBYTESEND NOP
;------------ END OF SEND BYTE CODE -------------------



;------------ START OF TENTH SECOND CODE -----------
        DECFSZ  TENTHSECONDTIMER        ;DEC F, SKIP IF ZERO
        GOTO    TENTHSECONDTIMEREND     ;HASNT RUN OUT, SKIP..
        MOVLW   TENTHSECONDTIMERPRELOAD ;
        MOVWF   TENTHSECONDTIMER        ; GET READY FOR NEXT TENTH SECOND


        MOVFW   DRIVETIME       ;LOAD DRIVETIME (TENTHS OF A SECOND LEFT TO RUN)
        BTFSC   STATUS,Z        ;IF IS ZERO, STOP MOTOR
        BSF     PORTB,1         ;TURN OFF DRIVE MOTOR
        BTFSC   STATUS,Z        ;IF IS ZERO THEN
        GOTO    DRIVETIMEEND    ;END THIS.. ELSE:
        BCF     PORTB,1         ;TURN ON MOTOR
        DECF    DRIVETIME
        BTFSC   STATUS,Z        ; IF WE JUST REACHED 0, THEN
        BSF     PORTB,1         ;TURN OFF MOTOR
DRIVETIMEEND NOP



        MOVFW   REDLEDTTL       ;LOAD VALUE
        BTFSC   STATUS,Z        ;IF ZERO
        GOTO    REDLEDTTLEND    ;SKIP. ELSE
        DECF    REDLEDTTL       ;DEC IT,
        BTFSC   STATUS,Z        ;IF NOW ZERO THEN
        BCF     PORTB,2         ;TURN OFF RED LED
REDLEDTTLEND

        MOVFW   BLUELEDTTL       ;LOAD VALUE
        BTFSS   STATUS,Z        ;IF ZERO
        GOTO    BLUELEDTTLEND    ;SKIP. ELSE
        DECF    BLUELEDTTL       ;DEC IT,
        BTFSC   STATUS,Z        ;IF NOW ZERO THEN
        BCF     PORTB,3         ;TURN OFF BLUE LED
BLUELEDTTLEND


        MOVFW   HONKTIME
        BTFSC   STATUS,Z        ;IF ZERO THEN
        BCF     GENSTAT,BELLON  ;TURN OFF BELL
        BTFSC   STATUS,Z        ;IF NOT ZERO THEN
        GOTO    HONKTIMEEND     ;SKIP ELSE
        BSF     GENSTAT,BELLON  ;TURN ON BELL
        DECF    HONKTIME
        BTFSC   STATUS,Z        ;IF JUST REACHED 0 THEN
        BCF     GENSTAT,BELLON  ;TURN BELL OFF
HONKTIMEEND NOP


;------------- START OF ONE SECOND CODE -----------
        DECFSZ    ONESECONDTIMER        ;DEC F, SKIP IF ZERO..
        GOTO    ONESECONDTIMEREND       ;HASN'T RUN OUT..
        MOVLW   ONESECONDTIMERPRELOAD
        MOVWF   ONESECONDTIMER  ;GET READY FOR NEXT SECOND..


        BCF     PORTB,3         ;TURN OFF BLUE led IF STILL ON..
;        BTFSS   PORTA,1         ;TOGGLE PORTA,1 ON AND OFF
;        GOTO    OSTTEMP0IS0     ;SO WE KNOW HOW FAST THE ONE SECOND TIMER IS HAPPENING..
;        BCF     PORTA,1         ;part of toggle code..,
;        GOTO    OSTTEMP0IS1     ;part of toggle code..
;OSTTEMP0IS0  BSF PORTA,1        ;part of toggle code..
;OSTTEMP0IS1 NOP                 ;END OF TOGGLE CODE




ONESECONDTIMEREND NOP
;-------------- END OF ONE SECOND CODE ------------
TENTHSECONDTIMEREND NOP
;------------- END OF TENTH SECOND CODE -----------

   ; START RESTORE
INTEND  BCF     INTCON,T0IF     ;CLEAR THE OVERFLOW INT FLAG FOR TIMER0
INTENDPB47 NOP  ;ENTRY POINT FOR PORT B 4:7 PIN CHANGE RETURN
        SWAPF   STATUS_TEMP,W   ; Swap nibbles in STATUS_TEMP register
        MOVWF   STATUS          ; Move W into STATUS register
        SWAPF   W_TEMP,F        ; Swap nibbles in W_TEMP and place result in W_TEMP
        SWAPF   W_TEMP,W        ; Swap nibbles in W_TEMP and place result into W
        RETFIE  ;SHOULD AUTOMATCIALLY RE ENABLE GIE BIT..







INIT    CLRWDT
        CLRF    HONKTIME
        MOVLW   TENTHSECONDTIMERPRELOAD
        MOVWF   TENTHSECONDTIMER
        MOVLW   ONESECONDTIMERPRELOAD
        MOVWF   ONESECONDTIMER
        CLRF    DRIVETIME
        CLRF    MOTORTIMEOUTLOW
        CLRF    MOTORTIMEOUTHIGH
        CLRF    MOTORPRESCALER
        CLRF    MOTORPOS
        BSF     MOTORPOS,7
        CLRF    MOTORSEEK
        BSF     MOTORSEEK,7
        CLRF    MOTORSEEK2
        BSF     MOTORSEEK2,7
        CLRF    GENSTAT
        BCF     GENSTAT,GENWFR
        CLRF    PORTA
        BSF     PORTA,4 ;TURN OFF SPEAKER..
        CLRF    PORTB
        BSF     PORTB,1 ;TURN OF MOTOR...
        CLRF    COMSTAT
        CLRF    BYTEIN
        CLRF    BYTEOUT
        CLRF    BYTEOUTTEMP
        CLRF    BYTEINTEMP
        CLRF    INTTEMP
;       MOVLW   OX4A    ;  This is for 2400baud with a 3.579545 xtal
;       MOVLW   0X34    ;  This is for 2400baud with a 4.000 Mhz xtal
;       MOVLW   0x1A    ;  This is for 2400baud with a 4.5 Mhz xtal
;        MOVLW   0x36   ; LAST VALUE FOR 2400 @ 4.000MHZ. NOW WE GOTTA SWITCH TO 1200..
        MOVLW   0x33
        MOVWF   TIMELEFT
        MOVWF   TMR0
        BSF     STATUS,RP0      ;SELECT BANK 1
        BCF     OPTION_REG,PSA  ;SET PRESCALER FOR TIMER0
        BCF     OPTION_REG,T0CS ;SET TIMER0 TO RUN ON OSC/4. SEEMS TO RUN AT OSC.. DO THE MATH..
        BCF     OPTION_REG,PS2  ;SET PRESCALER TO 010 FOR 1:8
        BCF     OPTION_REG,PS1  ; ^^^^^^^^
        BSF     OPTION_REG,PS0  ; ^^^^^^^^
        CLRF    INTCON          ;DISABLE ALL INTERRUPS
        BSF     INTCON,T0IE     ;ENABLE INT ON TIMER0 OVERFLOW
        BSF     OPTION_REG,INTEDG       ;SET INT/PB0 INT TO RISING EDGE
        BCF     INTCON,INTE     ;DISABLE INT ON PB0 RISING EDGE
        BSF     INTCON,RBIE     ;ENABLE PB4:7 PIN CHANGE INT
        BSF     INTCON,GIE      ;ENABLE GLOBAL INTS
        MOVLW   B'11110001'
        MOVWF   TRISB   ;SET PORTB I/O
        MOVLW   B'11100000'
        MOVWF   TRISA   ;SET PORTA I/O


        BCF     STATUS,RP0      ;SELECT BANK0
        CLRF    PBSCRATCH
        CLRF    SCRATCH
        CLRF    SCRATCH2
        BSF     GENSTAT,SEEKACTIVE      ;ENABLE SERVO TO SEEK AFTER MOTORSEEK
        BSF     GENSTAT,BELLON          ;START TO BEEP WHILE PRINTING RESET OR POWER

STARTUPSTRING           ;PRINT A FEW EXTRA CHARS TO GET THE RECEIVER ADJUSTED..
        MOVLW   .10
        MOVWF   SCRATCH
STRTPST MOVLW   '@'
        CALL    BLOCKINGPRINT
        MOVLW   '@'
        CALL    BLOCKINGPRINT
        MOVLW   '@'
        CALL    BLOCKINGPRINT
        MOVLW   '@'
        CALL    BLOCKINGPRINT
        CALL    NEWLINE
        MOVWF   SCRATCH2
        DECF    SCRATCH
        BTFSS   STATUS,Z
        GOTO    STRTPST
        CALL    NEWLINE
        CALL    NEWLINE



        BTFSC  DETECTRPREG,DETECTRP
        GOTO    DETECTRESETPOWER
        CALL    NEWLINE
        MOVLW   0x52            ;R
        CALL    BLOCKINGPRINT
        MOVLW   0x45            ;E
        CALL    BLOCKINGPRINT
        MOVLW   0x53            ;S
        CALL    BLOCKINGPRINT
        MOVLW   0x45            ;E
        CALL    BLOCKINGPRINT
        MOVLW   0x54            ;T
        CALL    BLOCKINGPRINT
        MOVLW   0x20
        CALL    BLOCKINGPRINT   ;' '
        MOVFW   ERRORREG
        CALL    PRINTASHEX
        CALL    NEWLINE
        CLRF    ERRORREG
        GOTO    ENDDETECTRESET

DETECTRESETPOWER        NOP
        CALL    NEWLINE
        MOVLW   0x50            ;P
        CALL    BLOCKINGPRINT
        MOVLW   0x4F            ;O
        CALL    BLOCKINGPRINT
        MOVLW   0x57            ;W
        CALL    BLOCKINGPRINT
        MOVLW   0x45            ;E
        CALL    BLOCKINGPRINT
        MOVLW   0x52            ;R
        CALL    BLOCKINGPRINT
        CALL    NEWLINE
        CLRF    ERRORREG
        CLRF    ODLOW
        CLRF    ODHIGH
ENDDETECTRESET  NOP
        BCF     DETECTRPREG,DETECTRP    ;RECORD THAT WE HAVE BEEN TURNED ON..
        BCF     GENSTAT,BELLON  ;TURN OFF BUZZER
        BSF     PORTA,4 ;TURN OFF POWER TO SPEAKER


        GOTO    STARTBINARYMODE

LOOP    CLRWDT
        BTFSS   GENSTAT,GENR    ;SEE IF NEW BYTE IS READY
        GOTO    LOOP            ;NOPE.. KEEP CHECKING..
        BCF     GENSTAT,GENR    ;**TEMP** SO IT ONLY SENDS NEW BYTES..

        MOVLW   "O"             ;THE NOP PART.. YOU CAN SEND LOTS OF O'S AND NOTHING HAPPENS, BUT IT KEEPS THE RECEIVER ADJUSTED.. I HOPE ANYWAY,....
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
        GOTO    LOOP



        MOVFW   BYTEIN  ;LOAD THE NEW INPUT BYTE
        XORLW   0x43    ;SEE IF IT'S 'C'
        BTFSS   STATUS,Z;SEE IF THE RESULT WAS 0
        GOTO    LOOPC
        BCF     GENSTAT,SEEKACTIVE      ;TURN OFF AUTO SEEK...
        BSF     MOTORSTAT,MOTCENT       ;REQUEST THE MOTOR TO BE CENTERED.
        BCF     PORTA,2         ;TURN OFF
        BCF     PORTA,3         ;SERVO
        BTFSS   PORTB,5         ;SEE IF SERVO IS RIGHT OR LEFT
        GOTO    LOOPC1
        BSF     PORTA,2         ;TURN ONE WAY
        GOTO    LOOPC
LOOPC1  BSF     PORTA,3         ;TURN OTHER
LOOPC   NOP

        MOVLW   B'11111100'
        ANDWF   BYTEIN,W
        XORLW   B'00110000'
        BTFSS   STATUS,Z
        GOTO    LOOPB


        BCF     PORTA,2
        BCF     PORTA,3
        BTFSC   BYTEIN,0
        BSF     PORTA,3
        BTFSC   BYTEIN,1
        BSF     PORTA,2




LOOPB   NOP

        MOVFW   BYTEIN
        XORLW   0x53    ;'S'
        BTFSS   STATUS,Z
        GOTO    LOOPB2B
        CALL    NEWLINE
        MOVFW   MOTORPOS
        CALL    PRINTASHEX
        MOVFW   MOTORPOS
        CALL    PRINTASBINARY
        CALL    NEWLINE
        GOTO    LOOP


LOOPB2B NOP
        MOVFW   BYTEIN
        XORLW   0x4F    ;'O' TO SHOW ODOMETER READING
        BTFSS   STATUS,Z
        GOTO    ODSHOWEND
        CALL    NEWLINE
        MOVLW   0x4F
        CALL    BLOCKINGPRINT
        MOVLW   0x44
        CALL    BLOCKINGPRINT
        MOVLW   0x20
        CALL    BLOCKINGPRINT
        MOVFW   ODHIGH
        CALL    PRINTASHEX
        MOVFW   ODLOW
        CALL    PRINTASHEX
        CALL    NEWLINE
        GOTO    LOOP
ODSHOWEND NOP
        MOVFW   BYTEIN
        XORLW   0x4D    ;'M'
        BTFSS   STATUS,Z
        GOTO    LOOPB2C
        CALL    NEWLINE
        MOVLW   0x3E    ;'>'
        CALL    BLOCKINGPRINT
LOOPB2BA CLRWDT
        BTFSS   GENSTAT,GENR
        GOTO    LOOPB2BA
        BCF     GENSTAT,GENR
        MOVFW   BYTEIN
        MOVWF   MOTORSEEK
        CALL    PRINTASHEX
        MOVFW   MOTORSEEK
        CALL    PRINTASBINARY
        CALL    NEWLINE
        GOTO    LOOP

LOOPB2C NOP

        MOVLW   0x45    ;'E'    TURN ON AND OFF SEEK ACTIVE
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
        BSF     GENSTAT,SEEKACTIVE
        MOVLW   0x65    ;'e'
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
        BCF     GENSTAT,SEEKACTIVE

        MOVLW   0x50            ;'P' TEMP CODE:
        XORWF   BYTEIN,W        ;ADD OR SUBTRACT 15 (0xF) FROM MOTORSEEK.
        BTFSS   STATUS,Z        ;THIS COULD CAUSE ALL SORTS OF TROUBLE
        GOTO    LOOPB2DD        ;BUT SHOULD BE ACTIVATED BY P AND p
        MOVLW   0XF
        ADDWF   MOTORSEEK2,F
        MOVFW   MOTORSEEK2
        MOVWF   MOTORSEEK
        GOTO    LOOPB2D
LOOPB2DD NOP
        MOVLW   0x70            ;'p' MORE TEMP CODE LIKE ABOVE..
        XORWF   BYTEIN,W
        BTFSS   STATUS,Z
        GOTO    LOOPB2D
        MOVLW   0xF
        SUBWF   MOTORSEEK2,F
        MOVFW   MOTORSEEK2
        MOVWF   MOTORSEEK



LOOPB2D NOP

        MOVLW   "B"
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
        GOTO    STARTBINARYMODE




        MOVLW   0x5B            ;'['
        CALL    BLOCKINGPRINT
        MOVFW   BYTEIN
        CALL    BLOCKINGPRINT   ;
        MOVLW   0x5D
        CALL    BLOCKINGPRINT   ;']'
        MOVFW   BYTEIN
        CALL    PRINTASHEX
;        MOVFW   BYTEIN
;        CALL    PRINTASBINARY



        MOVLW   0x44            ;'D' DRIVE ON AND OFF
        XORWF   BYTEIN,W
        BTFSS   STATUS,Z
        GOTO    DRVOFFCHK
        MOVLW   .20
        MOVWF   DRIVETIME
DRVOFFCHK MOVLW   0x64            ;'d'
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
        CLRF    DRIVETIME


        MOVLW   0x48            ;'H' HONK OR HORN
        XORWF   BYTEIN,W
        BTFSS   STATUS,Z
        GOTO    HONKOFFCHECK
        MOVLW   B'00000011'
        MOVWF   HONKTIME
HONKOFFCHECK MOVLW       0x68    ;'h' TURN OF HORN...
        XORWF BYTEIN,W
        BTFSC   STATUS,Z
        CLRF    HONKTIME
 

        MOVLW   0xFF    ;FORCE WDT RESET, WITH ERROR CODE 0xFF
        MOVWF   ERRORREG
        MOVLW   0x52    ;'R' FORCE WDT RESET
        XORWF   BYTEIN,W
        BTFSC   STATUS,Z
LOOPRST GOTO    LOOPRST


       GOTO    LOOP


;----------- START OF BINARY MODE HANDLING CODE ----------
STARTBINARYMODE NOP
        CALL    NEWLINE
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        MOVLW   "N"
        CALL    BLOCKINGPRINT
        MOVLW   "T"
        CALL    BLOCKINGPRINT
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        MOVLW   "R"
        CALL    BLOCKINGPRINT
        MOVLW   "I"
        CALL    BLOCKINGPRINT
        MOVLW   "N"
        CALL    BLOCKINGPRINT
        MOVLW   "G"
        CALL    BLOCKINGPRINT
        MOVLW   " "
        CALL    BLOCKINGPRINT
        MOVLW   "B"
        CALL    BLOCKINGPRINT
        MOVLW   "I"
        CALL    BLOCKINGPRINT
        MOVLW   "N"
        CALL    BLOCKINGPRINT
        MOVLW   "A"
        CALL    BLOCKINGPRINT
        MOVLW   "R"
        CALL    BLOCKINGPRINT
        MOVLW   "Y"
        CALL    BLOCKINGPRINT
        MOVLW   " "
        CALL    BLOCKINGPRINT
        MOVLW   "M"
        CALL    BLOCKINGPRINT
        MOVLW   "O"
        CALL    BLOCKINGPRINT
        MOVLW   "D"
        CALL    BLOCKINGPRINT
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        CALL    NEWLINE
        CALL    NEWLINE
        BSF     GENSTAT,RCVACTIVE ;ENABLE RECEIVING
        BSF     INTCON,INTE     ;ENABLE PB0 RISING EDGE

;        BSF     STATUS,RP0      ;SELECT BANK0
;        BCF     INTCON,GIE      ;DISABLE GLOBAL INTS
;        BCF     STATUS,RP0      ;SELECT BANK0
;        BCF     GENSTAT,GENR

BINLOOPBLANKREDLED BCF  PORTB,2
BINLOOP CALL    BLOCKINGREAD
        MOVFW   BYTEIN
        XORLW   '_'     ;THE 'COMMAND FOLLOWS' CODE
        BTFSS   STATUS,Z
        GOTO    BINLOOP
        CALL    BLOCKINGREAD
        CALL    BLOCKINGREAD
        COMF    BYTEIN2,W       ;COMPLIMENT BYTEIN2, SAVE RESULTES IN W
        XORWF   BYTEIN,W        ;XOR THE COMP'D OLD BYTE WITH THE NEW BYTE. SHOULD MATCH.
        BTFSS   STATUS,Z
        GOTO    BINLOOPBLANKREDLED
        MOVLW   0x1     ;.5 SECONDS
        MOVWF   REDLEDTTL
        BSF     PORTB,2


;-------------------------------
;        MOVLW   0x7             ;^G, RETURN FROM BINARY MODE
;        XORWF   BYTEIN,W        ;
;        BTFSS   STATUS,Z        ;
;        GOTO    BINEND          ; GO BACK TO ASCII MODE..
;-------------------------------
        MOVFW   BYTEIN          ;GET READY IN CASE IT'S FOR MOTORSEEK..
        BTFSS   BYTEIN,0        ;IF BIT0 IS 0, THEN IT'S FOR MOTORSEEK..
        MOVWF   MOTORSEEK       ;LOAD MOTORSEEK WITH NEW VALUE
;-------------------------------
        MOVLW   B'00000011'     ;SEE IF IT'S DRIVETIME UPDATE
        ANDWF   BYTEIN,W        ;
        XORLW   B'00000001'     ;
        BTFSS   STATUS,Z        ;
        GOTO    BLNOTDRIVE      ;
        MOVFW   BYTEIN          ;
        MOVWF   DRIVETIME       ;LOAD IN NEW DRIVE TIME
BLNOTDRIVE NOP                  ;
;-------------------------------
        MOVLW   B'00000111'     ;CHECK FOR HONK UPDATE
        ANDWF   BYTEIN,W        ;
        XORLW   B'00000011'     ;
        BTFSS   STATUS,Z        ;
        GOTO    LBNOTHONK       ;
        MOVFW   BYTEIN          ;
        MOVWF   HONKTIME        ;
LBNOTHONK       NOP             ;
;-------------------------------
        MOVFW   BYTEIN          ;CHECK IF CENTER IS REQUESTED
        XORLW   B'00001111'     ;
        BTFSS   STATUS,Z         ;
        GOTO    BLNOTCENTER       ;
        BCF     GENSTAT,SEEKACTIVE ;TURN OFF AUTO SEEK...
        BSF     MOTORSTAT,MOTCENT ;REQUEST THE MOTOR TO BE STOPPED AT CENTER..
        BCF     PORTA,2          ;TURN OFF
        BCF     PORTA,3         ;SERVO
        BTFSS   PORTB,5         ;SEE IF SERVO IS RIGHT OR LEFT
        GOTO    BLCNTRA         ;
        BSF     PORTA,2         ;TURN ONE WAY
        GOTO    BLNOTCENTER     ;
BLCNTRA BSF     PORTA,3         ;TURN OTHER
BLNOTCENTER NOP                 ;
;-------------------------------
BLPRINTONLY                     ;
                                ;
        MOVFW   BYTEIN      ;   ;
        CALL    BLOCKINGPRINT   ;
;        MOVFW   BYTEIN2         ;
;        CALL    BLOCKINGPRINT   ;
;-------------------------------

        GOTO    BINLOOP



BINEND  CALL    NEWLINE
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        MOVLW   "N"
        CALL    BLOCKINGPRINT
        MOVLW   "T"
        CALL    BLOCKINGPRINT
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        MOVLW   "R"
        CALL    BLOCKINGPRINT
        MOVLW   "I"
        CALL    BLOCKINGPRINT
        MOVLW   "N"
        CALL    BLOCKINGPRINT
        MOVLW   "G"
        CALL    BLOCKINGPRINT
        MOVLW   " "
        CALL    BLOCKINGPRINT
        MOVLW   "A"
        CALL    BLOCKINGPRINT
        MOVLW   "S"
        CALL    BLOCKINGPRINT
        MOVLW   "C"
        CALL    BLOCKINGPRINT
        MOVLW   "I"
        CALL    BLOCKINGPRINT
        MOVLW   "I"
        CALL    BLOCKINGPRINT
        MOVLW   " "
        CALL    BLOCKINGPRINT
        MOVLW   "M"
        CALL    BLOCKINGPRINT
        MOVLW   "O"
        CALL    BLOCKINGPRINT
        MOVLW   "D"
        CALL    BLOCKINGPRINT
        MOVLW   "E"
        CALL    BLOCKINGPRINT
        CALL    NEWLINE
        GOTO    LOOP


        MOVLW   0x1
        MOVWF   ERRORREG        ;RECORD THAT WE WERE HERE
ERRORTRAP01 GOTO ERRORTRAP01  ;WE SHOULD NEVER GET HERE.. SO FORCE RESET

BLOCKINGPRINT
;        BSF     STATUS,RP0      ;SELECT BANK0
;        BCF     INTCON,GIE      ;DISABLE GLOBAL INTS
;        BCF     STATUS,RP0      ;SELECT BANK0
;        BCF     COMSTAT,COMB
;        BCF     GENSTAT,GENR
BPRINT2 CLRWDT
        NOP             ;THIS IS ADJUSTED FOR EXACTALLY 40,000 HERTZ
        NOP             ;ON THE PORTA,0 PIN, WITH ALL INTS DISABLED.
        NOP             ;THE HERTZ WITH INTS ENABLED WILL BE SOMEWHAT
BPRINT3 BTFSS   PORTA,0 ;LOWER, BUT THE ACTUAL HERTZ DURRING EACH BITLENGTH
        GOTO    BPTAIC  ;WILL STILL BE 40Khz, EXCEPT WHEN ONE OF THE NON TIMER
        BCF     PORTA,0 ;INTS HAPPENS...
        GOTO    BPTAIS
BPTAIC  BSF     PORTA,0
BPTAIS  CLRWDT
        BTFSC   COMSTAT,COMB
        GOTO    BPRINT2
        BTFSS   GENSTAT,GENWFR
        GOTO    BPLETSGO
        BTFSS   GENSTAT,GENR
        GOTO    BPRINT3
BPLETSGO MOVWF   BYTEOUT
        BSF     COMSTAT,COMB
        RETURN


BLOCKINGREAD MOVFW      BYTEIN
        MOVWF   BYTEIN2 ;SAVE OLD BYTEIN TO BYTEIN2
BLOCKINGREAD2 CLRWDT    ;WAIT TILL A BYTE COMES IN, THEN RETURN..
        NOP             ;THIS IS ADJUSTED FOR EXACTALLY 40,000 HERTZ
        NOP             ;ON THE PORTA,0 PIN, WITH ALL INTS DISABLED.
        NOP             ;THE HERTZ WITH INTS ENABLED WILL BE SOMEWHAT
        BTFSS   PORTA,0 ;LOWER, BUT THE ACTUAL HERTZ DURRING EACH BITLENGTH
        GOTO    BRTAIC  ;WILL STILL BE 40Khz, EXCEPT WHEN ONE OF THE NON TIMER
        BCF     PORTA,0 ;INTS HAPPENS...
        GOTO    BRTAIS  ;Blocking Read Toggle A Is Clear...
BRTAIC  BSF     PORTA,0
BRTAIS  NOP
        BTFSS   GENSTAT,GENR    ;IF NO NEW INPUT BYTE THEN
        GOTO    BLOCKINGREAD2   ;GOTO THE LOOP.. ELSE
        BCF     GENSTAT,GENR    ;CLR THE BIT, SO WE STOP HERE NEXT TIME...
        RETURN




PRINTASHEX      CLRWDT
        MOVWF   PAHSCRATCH
        SWAPF   PAHSCRATCH,F
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x78    ;'x'
        CALL BLOCKINGPRINT
        MOVFW   PAHSCRATCH
        ANDLW   0x0F    ;DROP THE FIRST 4 BITS FOR NOW..
        BTFSC   PAHSCRATCH,1
        GOTO    PAS1C
        BTFSC   PAHSCRATCH,2
        GOTO    PAS1C
        GOTO    PAS1A
PAS1C   BTFSS   PAHSCRATCH,3
        GOTO    PAS1A
        ADDLW   0x37      ;A-F (REMEMBER THAT 'W' IS ALREADY HIGH AS 10..)
        GOTO    PAS1B
PAS1A   ADDLW   0x30      ;0-9
PAS1B   CALL    BLOCKINGPRINT
        SWAPF   PAHSCRATCH,F
        MOVFW   PAHSCRATCH         ;NOW TO DO THE LEAST SIG NIBBLE
        ANDLW   0x0F    ;DROP THE FIRST 4 BITS FOR NOW..
        BTFSC   PAHSCRATCH,1
        GOTO    PAS2C
        BTFSC   PAHSCRATCH,2
        GOTO    PAS2C
        GOTO    PAS2A
PAS2C   BTFSS   PAHSCRATCH,3
        GOTO    PAS2A
        ADDLW   0x37      ;A-F (REMEMBER THAT 'W' IS ALREADY HIGH AS 10..)
        GOTO    PAS2B
PAS2A   ADDLW   0x30      ;0-9
PAS2B   CALL    BLOCKINGPRINT
        MOVLW   0x20
        CALL    BLOCKINGPRINT
        RETURN

NEWLINE MOVLW   0x0D            ;\r
        CALL    BLOCKINGPRINT
        MOVLW   0x0A            ;\n
        CALL    BLOCKINGPRINT
        RETURN

PRINTASBINARY MOVWF     PABSCRATCH
        MOVLW   0x42    ;'B'
        CALL    BLOCKINGPRINT
        MOVLW   0x27    ;"'"
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,7
        MOVLW   0x30   ; '0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,6
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,5
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,4
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,3
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,2
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31    ;'1'
        BTFSS   PABSCRATCH,1
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x31   ; '1'
        BTFSS   PABSCRATCH,0
        MOVLW   0x30    ;'0'
        CALL    BLOCKINGPRINT
        MOVLW   0x27
        CALL    BLOCKINGPRINT
        MOVLW   0x20
        CALL    BLOCKINGPRINT
        RETURN

        END







