|
|
|
@ -324,28 +324,27 @@ KLOP1: |
|
|
|
JP Z,SERIALCMDLOOP ; IF SO, ALL DONE |
|
|
|
CALL COUT ; OUTPUT KEY TO SCREEN |
|
|
|
JR KLOP1 ; LOOP |
|
|
|
; |
|
|
|
#IF (ENA_XM) |
|
|
|
; |
|
|
|
;__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 |
|
|
|
; |
|
|
|
PKTNU .DB 0 ; CALCULATED PACKET NUMBER |
|
|
|
PKTNU1C .DB 0 ; CALCULATED PACKET NUMBER COMPLEMENT |
|
|
|
CPKTN .DB 0 ; CALCULATED PACKET NUMBER |
|
|
|
CPKTN1C .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 |
|
|
|
RPKTN: .DB 0 ; RECEIVED PACKET NUMBER |
|
|
|
RPKTN1C:.DB 0 ; RECEIVED PACKET NUMBER COMPLEMENT |
|
|
|
PKTCS .DB 0 ; CHECKSUM |
|
|
|
; |
|
|
|
PSADDR: .DW 0 ; START OF PACKET ADDR |
|
|
|
; |
|
|
|
XMLOAD: CALL WORDPARM ; GET STARTING LOCATION |
|
|
|
JP C,ERR ; HANDLE SYNTAX ERRORS |
|
|
|
@ -366,13 +365,12 @@ XMLOAD: CALL WORDPARM ; GET STARTING LOCATION |
|
|
|
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 |
|
|
|
; |
|
|
|
POP DE ; POINT TO WHERE TO SAVE FILE |
|
|
|
LD BC,$FE01 ; SET FIRST NUMBER TO 1 |
|
|
|
LD (CPKTN),BC ; ALSO STORE THE 1-COMPLEMENT |
|
|
|
; |
|
|
|
POP DE ; POINT TO WHERE TO SAVE THE PACKET |
|
|
|
LD (PSADDR),DE ; SAVE IF FOR THE CHECKSUM CALCULATION |
|
|
|
; |
|
|
|
GETNP: LD HL,RETRYC ; WE RETRY 20 TIMES BEFORE GIVING UP |
|
|
|
LD (HL),20 |
|
|
|
@ -386,7 +384,7 @@ NPLOOP: LD B,6 ; 6 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK |
|
|
|
; |
|
|
|
LD A,NAK ; SEND A NAK TO THE UPLOADER |
|
|
|
CALL COUT |
|
|
|
JR NPLOOP ; GET NEXT PACKET |
|
|
|
JR NPLOOP ; LOOP UNTIL WE GET A GET A CHARACTOR OR TIMEOUT |
|
|
|
; |
|
|
|
NOTOUT: CP EOT ; DID UPLOADER SAY WE'RE FINISHED? |
|
|
|
JP Z,XMDONE ; YES, THEN WE'RE DONE |
|
|
|
@ -395,7 +393,7 @@ NOTOUT: CP EOT ; DID UPLOADER SAY WE'RE FINISHED? |
|
|
|
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 SOH |
|
|
|
LD HL,RPKTN ; WE SAVE PACKET NUMBER HERE |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER |
|
|
|
@ -403,42 +401,41 @@ NOTOUT: CP EOT ; DID UPLOADER SAY WE'RE FINISHED? |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER |
|
|
|
INC HL ; COMPLEMENT |
|
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER 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 |
|
|
|
|
|
|
|
LD C,128 ; GET 128 MORE CHARACTERS FOR A FULL PACKET |
|
|
|
PCKRCV: 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. |
|
|
|
LD (DE),A ; SAVE THE RECEIVED CHAR |
|
|
|
INC DE |
|
|
|
DEC C |
|
|
|
JP NZ,PCKRCV |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
LD (HL),A ; SHOULD BE CHECKSUM |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
LD (PKTCS),A ; SHOULD BE CHECKSUM |
|
|
|
; |
|
|
|
LD HL,PACKET+3 ; CALCULATE CHECKSUM FROM 128 BYTES OF DATA |
|
|
|
LD HL,(PSADDR) ; 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 |
|
|
|
; |
|
|
|
LD (PSADDR),DE ; SAVE THE NEW PACKET START ADDRESS |
|
|
|
; |
|
|
|
LD HL,PKTCS |
|
|
|
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 |
|
|
|
LD HL,(CPKTN) ; CHECK |
|
|
|
LD BC,(RPKTN) ; AGREEMENT |
|
|
|
; XOR A ; PACKET |
|
|
|
SBC HL,BC ; NUMBERS |
|
|
|
JR NZ,FAILPN |
|
|
|
; |
|
|
|
LD HL,PKTNU ; UPDATE THE PACKET COUNTERS |
|
|
|
LD HL,CPKTN ; UPDATE THE PACKET COUNTERS |
|
|
|
INC (HL) |
|
|
|
INC HL |
|
|
|
DEC (HL) |
|
|
|
|