|
|
|
@ -99,6 +99,8 @@ SERIALCMDLOOP: |
|
|
|
JP Z,PROGRM ; IF YES GO PROGRAM ROUTINE |
|
|
|
CP 'O' ; IS IT AN "O" (Y/N) |
|
|
|
JP Z,POUT ; PORT OUTPUT |
|
|
|
CP 'T' ; IS IT A "T" (Y/N) |
|
|
|
JP Z,XMLOAD ; XMODEM TRANSFER |
|
|
|
CP 'L' ; IS IT A "L" (Y/N) |
|
|
|
JP Z,HXLOAD ; INTEL HEX FORMAT LOAD DATA |
|
|
|
CP 'I' ; IS IT AN "I" (Y/N) |
|
|
|
@ -316,6 +318,174 @@ KLOP1: |
|
|
|
JP Z,SERIALCMDLOOP ; IF SO, ALL DONE |
|
|
|
CALL COUT ; OUTPUT KEY TO SCREEN |
|
|
|
JR KLOP1 ; LOOP |
|
|
|
|
|
|
|
; |
|
|
|
;__XMLOAD_____________________________________________________________________ |
|
|
|
; |
|
|
|
; LOAD A FILE INTO MEMORY FROM THE SERIAL PORT USING X-MODEM PROTOCOL |
|
|
|
; |
|
|
|
; |
|
|
|
SOH: .EQU 'A'-40h ; ^A CTRL-A |
|
|
|
EOT: .EQU 'D'-40h ; ^D = End of Transmission |
|
|
|
ACK: .EQU 'F'-40h ; ^F = Positive Acknowledgement |
|
|
|
NAK: .EQU 'U'-40h ; ^U = Negative Acknowledgement |
|
|
|
CAN: .EQU 'X'-40h ; ^X = Cancel |
|
|
|
XMSAVE: .EQU 0200H |
|
|
|
; |
|
|
|
PKTNU .DB 0 ; CALCULATED PACKET NUMBER |
|
|
|
PKTNU1C .DB 0 ; CALCULATED PACKET NUMBER COMPLEMENT |
|
|
|
; |
|
|
|
RETRYC .DB 0 ; RETRY COUNT |
|
|
|
|
|
|
|
PACKET: .DB 0 ; START OF HEADER (SOH) |
|
|
|
.DB 0 ; RECEIVED PACKET NUMBER |
|
|
|
.DB 0 ; RECEIVED PACKET NUMBER COMPLEMENT |
|
|
|
.FILL 128,0 ; 128 BYTES OF DATA |
|
|
|
.DB 0 ; CHECKSUM |
|
|
|
; |
|
|
|
XMLOAD: LD BC,$F8F0 ; GET CPU SPEED |
|
|
|
RST 08 ; AND MULTIPLY |
|
|
|
LD A,L ; BY 4 |
|
|
|
PUSH AF |
|
|
|
ADD A,A ; TO CREATE |
|
|
|
ADD A,A ; TIMEOUT DELAY |
|
|
|
LD (TMOFCT),A ; FACTOR |
|
|
|
POP AF |
|
|
|
|
|
|
|
LD A,1 ; THE FIRST PACKET IS NUMBER 1 |
|
|
|
LD (PKTNU),A |
|
|
|
LD A,255-1 ; ALSO STORE THE 1-COMPLEMENT OF IT |
|
|
|
LD (PKTNU1C),A |
|
|
|
; |
|
|
|
LD DE,XMSAVE ; POINT TO WHERE TO SAVE FILE |
|
|
|
; |
|
|
|
GETNP: LD HL,RETRYC ; WE RETRY 20 TIMES BEFORE GIVING UP |
|
|
|
LD (HL),20 |
|
|
|
; |
|
|
|
NPLOOP: LD B,6 ; 6 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK |
|
|
|
CALL GCT0 |
|
|
|
JP NC,NOTOUT ; NO TIMEOUT ? |
|
|
|
; |
|
|
|
DEC (HL) ; REACHED MAX NUMBER OF RETRIES? |
|
|
|
JP Z,FAILRT ; YES, PRINT MESSAGE AND EXIT |
|
|
|
; |
|
|
|
LD C,NAK ; SEND A NAK TO THE UPLOADER |
|
|
|
CALL SEROUT |
|
|
|
JR NPLOOP |
|
|
|
; |
|
|
|
NOTOUT: CP EOT ; DID UPLOADER SAY WE'RE FINISHED? |
|
|
|
JP Z,XMDONE ; YES, THEN WE'RE DONE |
|
|
|
CP CAN ; UPLOADER WANTS TO FAIL TRANSFER? |
|
|
|
JP Z,FAILCN ; YES, THEN WE'RE ALSO DONE |
|
|
|
CP SOH ; DID WE GET A START-OF-NEW-PACKET? |
|
|
|
JR NZ,NPLOOP ; NO, GO BACK AND TRY AGAIN |
|
|
|
; |
|
|
|
LD HL,PACKET+1 ; SKIP SAVING |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER |
|
|
|
INC HL |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER |
|
|
|
INC HL ; COMPLEMENT |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
; |
|
|
|
LD C,0 ; GET 128 MORE CHARACTERS FOR A FULL PACKET |
|
|
|
PCKRCV: ; C=0=256 TO ALLOW FOR DOUBLE DECREMENT |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
; |
|
|
|
LD (HL),A ; SAVE THE RECEIVED CHAR INTO THE |
|
|
|
LDI ; PACKET BUFFER AND DESTINATION (DE) |
|
|
|
; |
|
|
|
DEC C ; C GETS DECREMENTED TWICE EACH LOOP. |
|
|
|
JP NZ,PCKRCV |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE CHECKSUM |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
; |
|
|
|
LD HL,PACKET+3 ; CALCULATE CHECKSUM FROM 128 BYTES OF DATA |
|
|
|
LD B,128 |
|
|
|
XOR A |
|
|
|
CSLOOP: ADD A,(HL) ; JUST ADD UP THE BYTES |
|
|
|
INC HL |
|
|
|
DJNZ CSLOOP |
|
|
|
; |
|
|
|
XOR (HL) ; HL POINTS TO THE RECEIVED CHECKSUM SO |
|
|
|
JR NZ,FAILCS ; BY XORING IT TO OUR SUM WE CHECK FOR EQUALITY |
|
|
|
; |
|
|
|
LD HL,(PKTNU) ; CHECK |
|
|
|
LD BC,(PACKET+1) ; AGREEMENT |
|
|
|
; XOR A ; PACKET |
|
|
|
SBC HL,BC ; NUMBERS |
|
|
|
JR NZ,FAILPN |
|
|
|
; |
|
|
|
LD HL,PKTNU ; UPDATE THE PACKET COUNTERS |
|
|
|
INC (HL) |
|
|
|
INC HL |
|
|
|
DEC (HL) |
|
|
|
; |
|
|
|
LD C,ACK ; TELL UPLOADER THAT WE'RE HAPPY WITH WITH |
|
|
|
CALL SEROUT ; PACKET AND GO BACK AND FETCH SOME MORE |
|
|
|
JP GETNP |
|
|
|
; |
|
|
|
FAILCN: LD HL,TXT_CANCLERR ; TRANSFER CANCELLED |
|
|
|
JR XMERR |
|
|
|
FAILCS: LD HL,TXT_CKSUMERR ; CHECKSUM ERROR |
|
|
|
JR XMERR |
|
|
|
FAILPN: LD HL,TXT_PKNUMERR ; PACKET NUMBER ERROR |
|
|
|
JR XMERR |
|
|
|
FAILTO: LD HL,TXT_TMOUTERR ; TIMEOUT ERROR |
|
|
|
JR XMERR |
|
|
|
; |
|
|
|
XMDONE: LD C,ACK ; TELL REMOTE |
|
|
|
CALL SEROUT ; WE'RE DONE |
|
|
|
LD HL,TXT_LOADED ; TELL USER |
|
|
|
XMERR: CALL PRTSTR ; WE'RE DONE |
|
|
|
JP SERIALCMDLOOP ; BACK TO MENU |
|
|
|
; |
|
|
|
; WAITS FOR UP TO B SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND |
|
|
|
; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY |
|
|
|
; IT SET. |
|
|
|
; |
|
|
|
; 4MHZ 20 SECONDS TMOFCT = 16 |
|
|
|
; 10MHZ 20 SECONDS TMOFCT = 39 |
|
|
|
; |
|
|
|
GCTO1: LD B,1 ; WAIT 1 SECOND FOR SERIAL INPUT |
|
|
|
GCTO: CALL SERST ; IF THERE IS A |
|
|
|
OR A ; CHARACTER AVAILABLE |
|
|
|
JR NZ,GETCHRX ; EXIT NOW OTHERWISE POLL |
|
|
|
GCTOA: PUSH BC |
|
|
|
LD BC,255 ; C=CONSTANT (255) FOR INNER TIMING LOOP |
|
|
|
TMOFCT: .EQU $-1 ; B=SPEED FACTOR WHICH GETS UPDATED AT START |
|
|
|
GCTOB: PUSH BC |
|
|
|
LD B,C |
|
|
|
GCTOC: PUSH BC |
|
|
|
CALL SERST |
|
|
|
OR A ; A CHAR AVAILABLE? |
|
|
|
JR NZ,GETCHR ; YES, GET OUT OF LOOP |
|
|
|
POP BC |
|
|
|
DJNZ GCTOC |
|
|
|
POP BC |
|
|
|
DJNZ GCTOB |
|
|
|
POP BC |
|
|
|
DJNZ GCTO |
|
|
|
SCF ; SET CARRY SIGNALS |
|
|
|
RET ; TIMEOUT OCCURRED |
|
|
|
GETCHR: POP BC |
|
|
|
POP BC |
|
|
|
POP BC |
|
|
|
GETCHRX:CALL SERIN ; GET THE CHARACTER |
|
|
|
OR A ; CLEAR CARRY |
|
|
|
RET ; SIGNALS SUCCESS |
|
|
|
|
|
|
|
TXT_PKNUMERR .TEXT "\r\nPacket Number Error$" |
|
|
|
TXT_TMOUTERR .TEXT "\r\nTimeout Error$" |
|
|
|
TXT_RETRYERR .TEXT "\r\nRetry Error$" |
|
|
|
TXT_CANCLERR .TEXT "\r\nTransfer Cancelled$" |
|
|
|
; |
|
|
|
;__HXLOAD_____________________________________________________________________ |
|
|
|
; |
|
|
|
@ -1592,6 +1762,7 @@ DSKY_ENTRY: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; |
|
|
|
.FILL 16,0 ; SET MINIMUM STACK DEPTH |
|
|
|
SLACK .EQU (MON_END - $) |
|
|
|
.FILL SLACK,00H |
|
|
|
; |
|
|
|
|