v0.9 - Interrupt driven UART RX for status updates, using raw unilink packets for...
[wj-unilink.git] / wj-uni.asm
index 69624e6..c1623e0 100644 (file)
 ;----------------------------------------------------------------\r
 ;  TODO\r
 ;----------------------------------------------------------------\r
+;  Check how the slave should sense "power off" de-selection. Now it continues to play, as the slave doesn't stop requesting updates!\r
 ;  Investigate whether I actually have to save PCLATH in ISH, maybe save FSR? - Not saving any of them for now\r
 ;  Check Overrun errors from the UART\r
-;  Implement lots of other Unilink commands (Text display, time display etc.)\r
 ;  Implement the Watchdog Timer (might be useful even though I haven't seen it hang yet..)\r
 ;  Make the bit shift routine at the beginning of the ISR timeout if the clock suddenly stops (in the middle of a byte)\r
 ;   (will keep it from hanging until the next bit gets clocked out, just ignore the faulty bits and carry on)\r
-;  Implement command b0 0x (change CD to x (1-a))\r
+;  Implement command b0 0x (change CD to x (1-a))?\r
 ;  Implement command 08 10 (Tel Mute on) and 08 18 (Tel Mute off)?\r
 \r
 ;----------------------------------------------------------------\r
@@ -47,6 +47,8 @@
 ;----------------------------------------------------------------\r
 ;  Version\r
 ;\r
+;  0.9  Interrupt driven UART RX for status updates, using raw unilink packets for everything else, dynamic text\r
+;  0.8  Some text commands implemented, only static text for now though\r
 ;  0.7  Debug Serial TX in ISR now, checksum check for incoming packets in place, A/D works, solved the master reset prob\r
 ;        (by calling the INT handler from TMR2 ISR code (too much interrupt latency when transmitting)\r
 ;  0.6  Some more LCD info and clean-up of the Unilink recovery code, some problems with master resetting :(\r
 ;----------------------------------------------------------------\r
 ;  FILE REGISTER USAGE\r
 ;----------------------------------------------------------------\r
-TrackName00    equ     20h             ; Buffer for TrackName\r
-TrackName01    equ     21h\r
-TrackName02    equ     22h\r
-TrackName03    equ     23h\r
-TrackName04    equ     24h\r
-TrackName05    equ     25h\r
-TrackName06    equ     26h\r
-TrackName07    equ     27h\r
-TrackName08    equ     28h\r
-TrackName09    equ     29h\r
-TrackName0a    equ     2ah\r
-TrackName0b    equ     2bh\r
-TrackName0c    equ     2ch\r
-TrackName0d    equ     2dh\r
-TrackName0e    equ     2eh\r
-TrackName0f    equ     2fh\r
-TrackName10    equ     30h\r
-TrackName11    equ     31h\r
-TrackName12    equ     32h\r
-TrackName13    equ     33h\r
-TrackName14    equ     34h\r
-TrackName15    equ     35h\r
-TrackName16    equ     36h\r
-TrackName17    equ     37h\r
-TrackName18    equ     38h\r
-TrackName19    equ     39h\r
-TrackName1a    equ     3ah\r
-TrackName1b    equ     3bh\r
-TrackName1c    equ     3ch\r
-TrackName1d    equ     3dh\r
-TrackName1e    equ     3eh\r
-TrackName1f    equ     3fh\r
-TrackName20    equ     40h\r
-TrackName21    equ     41h\r
-TrackName22    equ     42h\r
-TrackName23    equ     43h\r
-TrackName24    equ     44h\r
-TrackName25    equ     45h\r
-TrackName26    equ     46h\r
-TrackName27    equ     47h\r
-TrackName28    equ     48h\r
-TrackName29    equ     49h\r
-TrackName2a    equ     4ah\r
-TrackName2b    equ     4bh\r
-TrackName2c    equ     4ch\r
-TrackName2d    equ     4dh\r
-TrackName2e    equ     4eh\r
-TrackName2f    equ     4fh\r
+\r
+; Free from 20h-48h\r
+\r
+TrackName      equ     20h\r
+TracknameEnd   equ     3eh\r
+\r
+DiscName       equ     3fh\r
+DiscNameEnd    equ     48h\r
+\r
+CurDisc                equ     49h\r
+CurTrack       equ     4ah\r
+CurMins                equ     4bh\r
+CurSecs                equ     4ch\r
+\r
+RecvType       equ     4dh\r
+TargetPos      equ     4eh\r
+CurRecvPos     equ     4fh\r
 \r
 UnilinkRAD     equ     50h             ; Beginning of Unilink packet - the Receiving Address\r
 UnilinkTAD     equ     51h             ; Transmitter address\r
@@ -196,38 +167,8 @@ IRQPCLATH  equ     7dh             ; ISH storage
 IRQSTATUS      equ     7eh             ; Needs to be located in a shared area accessible from all register banks\r
 IRQW           equ     7fh             ; \r
 \r
-DiscName00     equ     0a0h            ; Buffer for DiscName\r
-DiscName01     equ     0a1h\r
-DiscName02     equ     0a2h\r
-DiscName03     equ     0a3h\r
-DiscName04     equ     0a4h\r
-DiscName05     equ     0a5h\r
-DiscName06     equ     0a6h\r
-DiscName07     equ     0a7h\r
-DiscName08     equ     0a8h\r
-DiscName09     equ     0a9h\r
-DiscName0a     equ     0aah\r
-DiscName0b     equ     0abh\r
-DiscName0c     equ     0ach\r
-DiscName0d     equ     0adh\r
-DiscName0e     equ     0aeh\r
-DiscName0f     equ     0afh\r
-DiscName10     equ     0b0h\r
-DiscName11     equ     0b1h\r
-DiscName12     equ     0b2h\r
-DiscName13     equ     0b3h\r
-DiscName14     equ     0b4h\r
-DiscName15     equ     0b5h\r
-DiscName16     equ     0b6h\r
-DiscName17     equ     0b7h\r
-DiscName18     equ     0b8h\r
-DiscName19     equ     0b9h\r
-DiscName1a     equ     0bah\r
-DiscName1b     equ     0bbh\r
-DiscName1c     equ     0bch\r
-DiscName1d     equ     0bdh\r
-DiscName1e     equ     0beh\r
-DiscName1f     equ     0bfh\r
+RecvBuf                equ     0a0h            ; Buffer for received data from PC (32 bytes)\r
+RecvBufEnd     equ     0bfh            ;\r
 \r
        subtitl "Startup"\r
        page\r
@@ -319,7 +260,7 @@ IRQTMR2LowDataOK
 \r
        clrf    SlaveBreakState\r
 \r
-;      incf    Counter,f\r
+;      incf    Counter,f               : Debug!\r
 \r
        btfss   DisplayStatus,7         ; Only do this if high bit is set\r
        goto    IRQAfterTMR2\r
@@ -363,6 +304,119 @@ IRQAfterTMR2
 \r
 IRQNotTMR2\r
 \r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       btfss   PIR1,RCIF               ; Check if it's the UART RX interrupt\r
+       goto    IRQNotRCIF              ; No it's not, check the other sources\r
+;----------------------------------------------------------------\r
+; This is the UART RX routine, this should be control info from the connected PC we're receiving\r
+\r
+       movf    CurRecvPos,w            ; Load fsr\r
+       movwf   FSR\r
+       movf    RCREG,w                 ; Get the byte\r
+       bcf     PIR1,RCIF               ; Clear current interrupt condition\r
+       movwf   INDF                    ; Store the recv byte at the position waiting\r
+       movlw   RecvType\r
+       xorwf   FSR,w                   ; Check if it's the recvtype coming in\r
+       bnz     NotRecvType\r
+\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       movf    RecvType,w              ; Load type\r
+       bz      RecvTimeUpdate          ; Position update\r
+       xorlw   1                       ; Track Name perhaps?\r
+       bz      RecvTrackName\r
+       xorlw   3                       ; this is xor 1 and then xor 2, disc name?\r
+       bz      RecvDiscName\r
+\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       btfss   RecvType,7              ; Check Hi byte\r
+       goto    IRQNotRCIF\r
+\r
+       movf    RecvType,w\r
+       xorlw   81h\r
+       bnz     NotText\r
+\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       movf    RecvType,w\r
+       goto    TextUpdate\r
+NotText\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       movf    RecvType,w\r
+       btfss   DisplayStatus,7         ; Only if not updating already!\r
+TextUpdate\r
+       movwf   DisplayStatus           ; Force it into DisplayStatus\r
+       goto    Finished\r
+       \r
+RecvTimeUpdate\r
+       movlw   CurDisc                 ; Load DL start here\r
+       movwf   CurRecvPos\r
+       movlw   CurSecs+1               ; And stop here\r
+       movwf   TargetPos\r
+       goto    IRQNotRCIF\r
+\r
+RecvTrackName\r
+       movlw   TrackName               ; Load DL start here\r
+       movwf   CurRecvPos\r
+       movlw   TracknameEnd+1          ; And stop here\r
+       movwf   TargetPos\r
+       goto    IRQNotRCIF\r
+\r
+RecvDiscName\r
+       movlw   DiscName                ; Load DL start here\r
+       movwf   CurRecvPos\r
+       movlw   DiscNameEnd+1           ; And stop here\r
+       movwf   TargetPos\r
+       goto    IRQNotRCIF\r
+\r
+NotRecvType\r
+       incf    CurRecvPos,f\r
+       \r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       movf    CurRecvPos,w            ; Check if we're done\r
+       xorwf   TargetPos,w\r
+       bnz     NotFinished\r
+Finished\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+;      movlw   81h                     ; Assume we do it from the beginning (text and pos)\r
+;      movf    RecvType,f              ; Just check for time-update cmd\r
+;      skpnz                           ; No adjustment if another cmd\r
+;      movlw   85h                     ; Skip the first 4 display cmds\r
+;      movwf   DisplayStatus\r
+       \r
+;      call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       movlw   RecvType                ; restore for another go\r
+       movwf   CurRecvPos\r
+\r
+NotFinished\r
+\r
+IRQNotRCIF\r
+\r
+       call    IRQCheckINT             ; Check the Unilink INT as well\r
+\r
+       btfss   PIR1,TXIF               ; Check if it's the UART TX interrupt\r
+       goto    IRQNotTXIF              ; No it's not, check the other sources\r
+       bsf     STATUS,RP0              ; Reg bank 1\r
+       btfss   PIE1,TXIE               ; As TXIF is set as long as nothing gets sent, is the interrupt actually enabled?\r
+       goto    IRQTXIFDisabled\r
+;----------------------------------------------------------------\r
+; This is the UART TX routine, gets called when TXIE has been set and the TX load register is empty\r
+\r
+\r
+\r
+\r
+\r
+IRQTXIFDisabled\r
+       bcf     STATUS,RP0              ; Make sure we're going back to reg bank 0\r
+\r
+IRQNotTXIF\r
+\r
 ; Finally restore CPU state and return from the ISR\r
 \r
 ; If I have to save the FSR in the beginning I also need to restore it here...\r
@@ -625,12 +679,18 @@ IRQINTParseNot0112
        goto    IRQINTParseComplete\r
 \r
        call    ClearUnilinkBuffer\r
+\r
        movlw   70h                     ; Sending to Display Group\r
        addwf   UnilinkParity1,f\r
        movwf   UnilinkRAD\r
        movf    UnilinkID,w             ; This is my ID\r
        addwf   UnilinkParity1,f\r
        movwf   UnilinkTAD\r
+\r
+       movf    DisplayStatus,w\r
+       xorlw   80h                     ; First slave break?\r
+       bnz     IRQINTParse0113Not80\r
+\r
        movlw   90h\r
        addwf   UnilinkParity1,f\r
        movwf   UnilinkCMD1\r
@@ -641,25 +701,256 @@ IRQINTParseNot0112
        movf    UnilinkParity1,w        ; Carry the parity forward\r
        movwf   UnilinkParity2M\r
 \r
-       movf    DisplayStatus,w\r
+       movf    CurTrack,w\r
        addwf   UnilinkParity2M,f\r
        movwf   UnilinkData1\r
-       movlw   00h\r
+       movf    CurMins,w\r
        addwf   UnilinkParity2M,f\r
        movwf   UnilinkData2\r
-       movlw   01h\r
+       movf    CurSecs,w\r
        addwf   UnilinkParity2M,f\r
        movwf   UnilinkData3\r
 \r
 ;      movlw   0c0h\r
+       movf    CurDisc,w\r
+;      andlw   0f0h\r
+;      iorlw   0eh\r
+\r
+       addwf   UnilinkParity2M,f\r
+       movwf   UnilinkData4\r
+\r
+;      clrf    DisplayStatus\r
+;      goto    IRQINTParseBypassClear  ; Don't clear the data, the buffer will be sent as the next packet\r
+\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not80\r
+\r
+       movf    DisplayStatus,w\r
+       xorlw   81h                     ; Second slave break?\r
+       bnz     IRQINTParse0113Not81\r
+\r
+       movlw   0cdh                    ; Disc name\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD1\r
+       movf    DiscName,w\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD2\r
+\r
+       movf    UnilinkParity1,w        ; Carry the parity forward\r
+       movwf   UnilinkParity2\r
+\r
+       movf    DiscName+1,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData1\r
+       movf    DiscName+2,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData2\r
+       movf    DiscName+3,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData3\r
+       movf    DiscName+4,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData4\r
+       movf    DiscName+5,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData5\r
+       movf    DiscName+6,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData6\r
+       movf    DiscName+7,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData7\r
+       movlw   00h\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData8\r
+       movlw   0eh\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData9\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not81\r
+\r
+       movf    DisplayStatus,w\r
+       xorlw   82h                     ; Third slave break?\r
+       bnz     IRQINTParse0113Not82\r
+\r
+       movlw   0cdh                    ; Disc name\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD1\r
+       movf    DiscName+8,w\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD2\r
+\r
+       movf    UnilinkParity1,w        ; Carry the parity forward\r
+       movwf   UnilinkParity2\r
+\r
+       movf    DiscName+9,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData1\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData2\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData3\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData4\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData5\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData6\r
+       movlw   0\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData7\r
+       movlw   00h\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData8\r
+       movlw   1eh\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData9\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not82\r
+\r
+       movf    DisplayStatus,w\r
+       xorlw   83h                     ; Fourth slave break?\r
+       bnz     IRQINTParse0113Not83\r
+\r
+       movlw   0c9h                    ; Track name 1\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD1\r
+       movf    TrackName,w\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD2\r
+\r
+       movf    UnilinkParity1,w        ; Carry the parity forward\r
+       movwf   UnilinkParity2\r
+\r
+       movf    TrackName+1,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData1\r
+       movf    TrackName+2,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData2\r
+       movf    TrackName+3,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData3\r
+       movf    TrackName+4,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData4\r
+       movf    TrackName+5,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData5\r
+       movf    TrackName+6,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData6\r
+       movf    TrackName+7,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData7\r
+       movlw   00h\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData8\r
+       movlw   0eh\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData9\r
+\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not83\r
+\r
        movf    DisplayStatus,w\r
-       andlw   0f0h\r
+       xorlw   84h                     ; Fifth slave break?\r
+       bnz     IRQINTParse0113Not84\r
+\r
+       movlw   0c9h                    ; Track name (2)\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD1\r
+       movf    TrackName+8,w\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD2\r
+\r
+       movf    UnilinkParity1,w        ; Carry the parity forward\r
+       movwf   UnilinkParity2\r
+\r
+       movf    TrackName+9,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData1\r
+       movf    TrackName+10,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData2\r
+       movf    TrackName+11,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData3\r
+       movf    TrackName+12,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData4\r
+       movf    TrackName+13,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData5\r
+       movf    TrackName+14,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData6\r
+       movf    TrackName+15,w\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData7\r
+       movlw   00h\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData8\r
+       movlw   1eh\r
+       addwf   UnilinkParity2,f\r
+       movwf   UnilinkData9\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not84\r
+\r
+       movf    DisplayStatus,w\r
+       xorlw   85h                     ; Sixth slave break?\r
+       bnz     IRQINTParse0113Not85\r
+\r
+       movlw   90h\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD1\r
+       movlw   50h\r
+       addwf   UnilinkParity1,f\r
+       movwf   UnilinkCMD2\r
+\r
+       movf    UnilinkParity1,w        ; Carry the parity forward\r
+       movwf   UnilinkParity2M\r
+\r
+       movf    CurTrack,w\r
+       addwf   UnilinkParity2M,f\r
+       movwf   UnilinkData1\r
+       movf    CurMins,w\r
+       addwf   UnilinkParity2M,f\r
+       movwf   UnilinkData2\r
+       movf    CurSecs,w\r
+       addwf   UnilinkParity2M,f\r
+       movwf   UnilinkData3\r
+\r
+;      movlw   0c0h\r
+       movf    CurDisc,w\r
+;      andlw   0f0h\r
+;      iorlw   0eh\r
 \r
        addwf   UnilinkParity2M,f\r
        movwf   UnilinkData4\r
-       \r
-       incf    DisplayStatus,f         ; Temporary debug info\r
-       bsf     DisplayStatus,7\r
+\r
+       clrf    DisplayStatus           ; for now!\r
+       goto    IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not85\r
+       clrf    DisplayStatus\r
+       incf    DisplayStatus,f         ; Skip step one for now\r
+       goto    IRQINTParseComplete\r
+\r
+IRQINTParse0113Complete        \r
+\r
+       incf    DisplayStatus,f         ; Increment display state counter\r
+;      bsf     DisplayStatus,7\r
 \r
        goto    IRQINTParseBypassClear  ; Don't clear the data, the buffer will be sent as the next packet\r
 \r
@@ -799,6 +1090,21 @@ IRQINTParseNot01
 \r
 IRQINTParseNot02\r
 \r
+; Check for CMD1 = 80h (Display button)\r
+       movf    UnilinkCMD1,w\r
+       xorlw   080h\r
+       bnz     IRQINTParseNot80\r
+\r
+       movf    UnilinkID,w             ; Check if I'm currently selected\r
+       xorwf   UnilinkCurID,w\r
+       skpnz                           ; No, skip this command\r
+;      bsf     DisplayStatus,7         ; Make sure we update the display again\r
+       movlw   81h\r
+       movwf   DisplayStatus\r
+       goto    IRQINTParseComplete\r
+\r
+IRQINTParseNot80\r
+\r
 ; Check for CMD1 = 87h (Power control)\r
        movf    UnilinkCMD1,w\r
        xorlw   087h\r
@@ -826,7 +1132,7 @@ IRQINTParseNot02
 ;\r
 ; Also bit field of CMD2 for now:\r
 ; 7 6 5 4 3 2 1 0\r
-; X X              - These two bits are set when changing color, beep etc, but now when actually powering on/off the system???\r
+; X X              - These two bits are set when changing color, beep etc, but not when actually powering the system on or off???\r
 ;     X            - Always set to 1 on my headunit\r
 ;       X          - Always set to 0 on my headunit\r
 ;         X        - Set to 1 when power is on, 0 when powering off (last command sent before bus dies is 87 22 on my unit)\r
@@ -886,7 +1192,9 @@ IRQINTParseNot90
        bnz     IRQINTParseF0Deselect\r
 \r
        bsf     UnilinkSelected,7       ; Now we're selected\r
-       bsf     DisplayStatus,7\r
+;      bsf     DisplayStatus,7\r
+       movlw   81h\r
+       movwf   DisplayStatus\r
        goto    IRQINTParseComplete\r
 \r
 IRQINTParseF0Deselect\r
@@ -988,6 +1296,10 @@ Main
        movlw   0ffh                    ; Set infinite attenuation to begin with\r
        movwf   UnilinkAttenuation\r
 \r
+       clrf    RecvType\r
+       movlw   RecvType\r
+       movwf   CurRecvPos\r
+\r
        clrf    UnilinkReInits          ; Clear the bus re-initialization counter\r
 \r
        bsf     STATUS,RP0              ; Reg bank 1\r
@@ -1209,14 +1521,6 @@ MainSkipScroll
 \r
 ; Display scroll part ends here...\r
 \r
-;      movf    DataCount,w             ; Load bit counter (if 0 then byte is available)\r
-;      skpz\r
-;      goto    MainLoop\r
-\r
-;      decf    DataCount,f             ; Set it non-zero\r
-\r
-;      movf    DataStore,w\r
-;      call    BootTXB                 ; Send to terminal\r
        goto    MainLoop\r
 \r
 \r
@@ -1252,6 +1556,7 @@ IRQInit
        bsf     INTCON,INTE             ; Enable the RB0/INT\r
        bsf     INTCON,PEIE             ; Enable the peripheral interrupts\r
        bsf     PIE1,TMR2IE             ; Enable the Timer2 peripheral interrupt\r
+       bsf     PIE1,RCIE               ; Enable the UART receive interrupt\r
        bsf     INTCON,GIE              ; Enable global interrupts\r
 \r
        bsf     TXSTA,TXEN              ; Enable UART TX\r
@@ -1277,12 +1582,12 @@ LCDInit
 \r
 ; This is a standard reset sequence for the LCD controller\r
 \r
-       movlw   160                     ; Need to delay for at least 15ms, let's go for 16ms delay\r
+       movlw   170                     ; Need to delay for at least 15ms, let's go for 17ms delay\r
        call    DelayW\r
 \r
        movlw   3                       ; Write 3 to the LCD\r
        call    TxLCD                   ; Send to LCD\r
-       movlw   50                      ; Need to delay for at least 4.1ms, let's go for 5ms delay\r
+       movlw   60                      ; Need to delay for at least 4.1ms, let's go for 6ms delay\r
        call    DelayW\r
 \r
        movlw   3                       ; Write 3 to the LCD\r
@@ -1616,7 +1921,15 @@ DefaultText1
        DT      "----- WJ", "MyID:xx ", "xx dB at", "Sel:xx B", "Inits:xx"\r
        DT      " Unilink", "CurID:xx", "t Dsp:xx", "atxx.xxV", "    <WJ>"\r
 \r
-               \r
+PCWaitText0\r
+;      DT      ">Waiting"\r
+;      DT      "Wait->PC"               \r
+       DT      "Booting."\r
+PCWaitText1\r
+;      DT      " for PC<"\r
+;      DT      " Booting"               \r
+       DT      "..",0,0,0,0,0,0\r
+\r
 LookUp movwf   PCL                     ; Go to it (this assumes PCLATH == 06h)\r
 \r
 \r
@@ -1917,15 +2230,13 @@ BootEEX
 \r
 ; To produce compact code the end zero byte has to be in the LSB (that means an even number of chars in every string)\r
 BootStartText\r
-;              "WJBoot - press ESC to flash\x00"\r
-       DW      0x2bca,0x216f,0x37f4,0x102d,0x1070,0x3965,0x39f3,0x1045,0x29c3,0x1074,0x37a0,0x336c,0x30f3,0x3400\r
+       DA      "WJBoot - press ESC to flash\x00"\r
+\r
 BootFlashText\r
-;              "\r\nSend INHX8 file now...\r\x00"\r
-       DW      0x068a,0x29e5,0x3764,0x1049,0x2748,0x2c38,0x1066,0x34ec,0x32a0,0x376f,0x3bae,0x172e,0x0680\r
-BootRunText\r
-;              "\r\nExiting loader\r\x00"\r
-       DW      0x068a,0x22f8,0x34f4,0x34ee,0x33a0,0x366f,0x30e4,0x32f2,0x0680\r
+       DA      "\r\nSend INHX8 file now...\r\x00"\r
 \r
+BootRunText\r
+       DA      "\r\nExiting loader\r\x00"\r
 \r
 ;----------------------------------------------------------------------\r
 ; EE Data (64 bytes), located at 2100h\r