;----------------------------------------------------------------\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
;----------------------------------------------------------------\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
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
\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
\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
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
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
\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
;\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
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
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
\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
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
\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