Browse Source

Update dbgmon.asm

Preliminary xmodem
pull/243/head
b1ackmai1er 4 years ago
parent
commit
ceeb213756
  1. 171
      Source/HBIOS/dbgmon.asm

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

Loading…
Cancel
Save