From ceeb2137565b9c36b97065ae12ba47fd38c95901 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 10 Sep 2021 23:23:44 +0800 Subject: [PATCH] Update dbgmon.asm Preliminary xmodem --- Source/HBIOS/dbgmon.asm | 171 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index be3d5ca6..4f6e5b9c 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -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 ;