|
|
|
@ -33,6 +33,9 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH |
|
|
|
; |
|
|
|
#IF DSKYENABLE |
|
|
|
#DEFINE USEDELAY |
|
|
|
ENA_XM .SET FALSE ; NO ROOM FOR BOTH DSKY+XMODEM |
|
|
|
#ELSE |
|
|
|
ENA_XM .EQU TRUE ; INCLUDE XMODEM IF SPACE AVAILABLE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#INCLUDE "util.asm" |
|
|
|
@ -65,6 +68,7 @@ UART_ENTRY: |
|
|
|
; P XXXX - PROGRAM RAM STARTING AT XXXX, PROMPT FOR VALUES |
|
|
|
; R XXXX - RUN A PROGRAM AT ADDRESS XXXX |
|
|
|
; S XX - SET ACTIVE BANK TO XX |
|
|
|
; T xxxx - X-MODEM TRANSFER TO MEMORY LOCATION XXXX |
|
|
|
; X - EXIT MONITOR |
|
|
|
; |
|
|
|
;__COMMAND_PARSE______________________________________________________________ |
|
|
|
@ -99,6 +103,10 @@ SERIALCMDLOOP: |
|
|
|
JP Z,PROGRM ; IF YES GO PROGRAM ROUTINE |
|
|
|
CP 'O' ; IS IT AN "O" (Y/N) |
|
|
|
JP Z,POUT ; PORT OUTPUT |
|
|
|
#IF (ENA_XM) |
|
|
|
CP 'T' ; IS IT A "T" (Y/N) |
|
|
|
JP Z,XMLOAD ; XMODEM TRANSFER |
|
|
|
#ENDIF |
|
|
|
CP 'L' ; IS IT A "L" (Y/N) |
|
|
|
JP Z,HXLOAD ; INTEL HEX FORMAT LOAD DATA |
|
|
|
CP 'I' ; IS IT AN "I" (Y/N) |
|
|
|
@ -317,6 +325,183 @@ KLOP1: |
|
|
|
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 |
|
|
|
; |
|
|
|
CPKTN .DB 0 ; CALCULATED PACKET NUMBER |
|
|
|
CPKTN1C .DB 0 ; CALCULATED PACKET NUMBER COMPLEMENT |
|
|
|
RETRYC .DB 0 ; RETRY COUNT |
|
|
|
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 |
|
|
|
PUSH DE ; SAVE VALUE |
|
|
|
CALL NONBLANK ; LOOK FOR EXTRANEOUS PARAMETERS |
|
|
|
CP 0 ; TEST FOR TERMINATING NULL |
|
|
|
JP NZ,ERR ; ERROR IF NOT TERMINATING NULL |
|
|
|
; |
|
|
|
LD HL,TXT_READY ; READY FOR |
|
|
|
CALL PRTSTR ; TRANSFER |
|
|
|
CALL NEWLINE |
|
|
|
; |
|
|
|
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 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 |
|
|
|
; |
|
|
|
NPLOOP: LD B,6 ; 6 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK |
|
|
|
CALL GCTO |
|
|
|
JP NC,NOTOUT ; NO TIMEOUT ? |
|
|
|
; |
|
|
|
DEC (HL) ; REACHED MAX NUMBER OF RETRIES? |
|
|
|
JP Z,FAILRT ; YES, PRINT MESSAGE AND EXIT |
|
|
|
; |
|
|
|
LD A,NAK ; SEND A NAK TO THE UPLOADER |
|
|
|
CALL COUT |
|
|
|
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 |
|
|
|
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,RPKTN ; WE SAVE PACKET NUMBER HERE |
|
|
|
; |
|
|
|
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 COMPLEMENT |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
|
|
|
|
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 (DE),A ; SAVE THE RECEIVED CHAR |
|
|
|
INC DE |
|
|
|
DEC C |
|
|
|
JP NZ,PCKRCV |
|
|
|
; |
|
|
|
CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER |
|
|
|
JR C,FAILTO ; TIMOUT ERROR? |
|
|
|
LD (PKTCS),A ; SHOULD BE CHECKSUM |
|
|
|
; |
|
|
|
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,(CPKTN) ; CHECK |
|
|
|
LD BC,(RPKTN) ; AGREEMENT |
|
|
|
; XOR A ; PACKET |
|
|
|
SBC HL,BC ; NUMBERS |
|
|
|
JR NZ,FAILPN |
|
|
|
; |
|
|
|
LD HL,CPKTN ; UPDATE THE PACKET COUNTERS |
|
|
|
INC (HL) |
|
|
|
INC HL |
|
|
|
DEC (HL) |
|
|
|
; |
|
|
|
LD A,ACK ; TELL UPLOADER THAT WE'RE HAPPY WITH WITH |
|
|
|
CALL COUT ; PACKET AND GO BACK AND FETCH SOME MORE |
|
|
|
JP GETNP |
|
|
|
; |
|
|
|
FAILRT: LD HL,TXT_RETRYERR ; FAILED ON RETRY |
|
|
|
JR XMERR |
|
|
|
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 A,ACK ; TELL REMOTE |
|
|
|
CALL COUT ; 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 CST ; 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 CST |
|
|
|
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 CIN ; 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$" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;__HXLOAD_____________________________________________________________________ |
|
|
|
; |
|
|
|
; LOAD INTEL HEX FORMAT FILE FROM THE SERIAL PORT, USER OPTION "H" |
|
|
|
@ -426,7 +611,8 @@ PIN: |
|
|
|
;__DUMPMEM____________________________________________________________________ |
|
|
|
; |
|
|
|
; PRINT A MEMORY DUMP, USER OPTION "D" |
|
|
|
; SYNTAX: D <START ADR> <END ADR> |
|
|
|
; SYNTAX: D <START ADR> [END ADR] |
|
|
|
; IF NO END ADDRESS, DUMP 100H BYTES |
|
|
|
;_____________________________________________________________________________ |
|
|
|
; |
|
|
|
DUMPMEM: |
|
|
|
@ -434,12 +620,14 @@ DUMPMEM: |
|
|
|
JP C,ERR ; HANDLE ERRORS |
|
|
|
PUSH DE ; SAVE IT |
|
|
|
CALL WORDPARM ; GET END ADDRESS |
|
|
|
JP C,ERR ; HANDLE ERRORS |
|
|
|
PUSH DE ; SAVE IT |
|
|
|
|
|
|
|
POP DE ; DE := END ADDRESS |
|
|
|
POP HL ; HL := START ADDRESS |
|
|
|
|
|
|
|
POP HL ; RECOVER START |
|
|
|
JR NC,GDATA ; |
|
|
|
; |
|
|
|
LD D,H ; DEFAULT TO 100H |
|
|
|
LD E,L ; BYTES IF NO |
|
|
|
INC D ; END ADDRESS |
|
|
|
DEC DE ; IS GIVEN |
|
|
|
; |
|
|
|
GDATA: |
|
|
|
INC DE ; BUMP DE FOR LATER COMPARE |
|
|
|
CALL NEWLINE ; |
|
|
|
@ -1006,7 +1194,7 @@ TXT_BADNUM .TEXT " *Invalid Hex Byte Value*$" |
|
|
|
TXT_MINIHELP .TEXT " (? for Help)$" |
|
|
|
TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" |
|
|
|
.TEXT "\r\nB - Boot system" |
|
|
|
.TEXT "\r\nD xxxx yyyy - Dump memory from xxxx to yyyy" |
|
|
|
.TEXT "\r\nD xxxx [yyyy] - Dump memory from xxxx to yyyy" |
|
|
|
.TEXT "\r\nF xxxx yyyy zz - Fill memory from xxxx to yyyy with zz" |
|
|
|
.TEXT "\r\nH - Halt system" |
|
|
|
.TEXT "\r\nI xxxx - Input from port xxxx" |
|
|
|
@ -1018,6 +1206,9 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" |
|
|
|
.TEXT "\r\nR xxxx [[yy] [zzzz]] - Run code at address xxxx" |
|
|
|
.TEXT "\r\n Pass yy and zzzz to register A and BC" |
|
|
|
.TEXT "\r\nS xx - Set bank to xx" |
|
|
|
#IF (ENA_XM) |
|
|
|
.TEXT "\r\nT xxxx - X-modem transfer to memory location xxxx" |
|
|
|
#ENDIF |
|
|
|
.TEXT "\r\nX - Exit monitor" |
|
|
|
.TEXT "$" |
|
|
|
; |
|
|
|
@ -1592,6 +1783,7 @@ DSKY_ENTRY: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; |
|
|
|
.FILL 16,0 ; SET MINIMUM STACK DEPTH |
|
|
|
SLACK .EQU (MON_END - $) |
|
|
|
.FILL SLACK,00H |
|
|
|
; |
|
|
|
|