;----------------------------------------------------------------\r
; Version\r
;\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
+; Free from 20h-4fh\r
\r
UnilinkRAD equ 50h ; Beginning of Unilink packet - the Receiving Address\r
UnilinkTAD equ 51h ; Transmitter address\r
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 (31 bytes)\r
+RecvBufLen equ 0bfh ; How many bytes have been received?\r
\r
subtitl "Startup"\r
page\r
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
; movlw 0c0h\r
movf DisplayStatus,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
+ 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
+ movlw 'N'\r
+ addwf UnilinkParity1,f\r
+ movwf UnilinkCMD2\r
+\r
+ movf UnilinkParity1,w ; Carry the parity forward\r
+ movwf UnilinkParity2\r
+\r
+ movlw 'o'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData1\r
+ movlw ' '\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData2\r
+ movlw 'M'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData3\r
+ movlw 'P'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData4\r
+ movlw '3'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData5\r
+ movlw ' '\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData6\r
+ movlw 'P'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData7\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
+ movlw 'l'\r
+ addwf UnilinkParity1,f\r
+ movwf UnilinkCMD2\r
+\r
+ movf UnilinkParity1,w ; Carry the parity forward\r
+ movwf UnilinkParity2\r
+\r
+ movlw 'a'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData1\r
+ movlw 'y'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData2\r
+ movlw 'l'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData3\r
+ movlw 'i'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData4\r
+ movlw 's'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData5\r
+ movlw 't'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData6\r
+ movlw '!'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData7\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
+ movlw 'N'\r
+ addwf UnilinkParity1,f\r
+ movwf UnilinkCMD2\r
+\r
+ movf UnilinkParity1,w ; Carry the parity forward\r
+ movwf UnilinkParity2\r
+\r
+ movlw 'o'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData1\r
+ movlw ' '\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData2\r
+ movlw 'M'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData3\r
+ movlw 'P'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData4\r
+ movlw '3'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData5\r
+ movlw ' '\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData6\r
+ movlw 'T'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData7\r
+ movlw 0eh\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData9\r
+\r
+ goto IRQINTParse0113Complete\r
+\r
+IRQINTParse0113Not83\r
+\r
+ movf DisplayStatus,w\r
+ xorlw 84h ; Fifth slave break?\r
+ bnz IRQINTParse0113Not84\r
+\r
+ movlw 0c9h ; Track name (2)\r
+ addwf UnilinkParity1,f\r
+ movwf UnilinkCMD1\r
+ movlw 'r'\r
+ addwf UnilinkParity1,f\r
+ movwf UnilinkCMD2\r
+\r
+ movf UnilinkParity1,w ; Carry the parity forward\r
+ movwf UnilinkParity2\r
+\r
+ movlw 'a'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData1\r
+ movlw 'c'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData2\r
+ movlw 'k'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData3\r
+ movlw 'n'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData4\r
+ movlw 'a'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData5\r
+ movlw 'm'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData6\r
+ movlw 'e'\r
+ addwf UnilinkParity2,f\r
+ movwf UnilinkData7\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 DisplayStatus,w\r
+ addwf UnilinkParity2M,f\r
+ movwf UnilinkData1\r
+ movlw 00h\r
+ addwf UnilinkParity2M,f\r
+ movwf UnilinkData2\r
+ movlw 01h\r
+ addwf UnilinkParity2M,f\r
+ movwf UnilinkData3\r
+\r
+; movlw 0c0h\r
+ movf DisplayStatus,w\r
+ andlw 0f0h\r
+ iorlw 0eh\r
+\r
+ addwf UnilinkParity2M,f\r
+ movwf UnilinkData4\r
+\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
\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
+ goto IRQINTParseComplete\r
+\r
+IRQINTParseNot80\r
+\r
; Check for CMD1 = 87h (Power control)\r
movf UnilinkCMD1,w\r
xorlw 087h\r
\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
\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
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
\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