diff options
| author | Jeff Armstrong <jeff@approximatrix.com> | 2026-10-25 17:42:06 -0400 |
|---|---|---|
| committer | Jeff Armstrong <jeff@approximatrix.com> | 2026-10-25 17:42:06 -0400 |
| commit | ebb2ff2af569d5822b70ee555a32d27cf7494816 (patch) | |
| tree | 7ac5e7b3fa73f7a8d996129086932ecce66374ad /tools/cpkhex.bas | |
| download | kermit-80-main.tar.gz kermit-80-main.zip | |
Diffstat (limited to 'tools/cpkhex.bas')
| -rw-r--r-- | tools/cpkhex.bas | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/cpkhex.bas b/tools/cpkhex.bas new file mode 100644 index 0000000..9bad29b --- /dev/null +++ b/tools/cpkhex.bas @@ -0,0 +1,88 @@ +1 REM -- CP4HEX.BAS -- +2 REM This program reads an Intel-format hex file and checks it for validity. +3 REM It discards blank lines, and if it finds any other lines that are bad, +4 REM either bacause the format is wrong or the checksum doesn't agree, it +5 REM prompts you to type in a replacement line. Use this program to fix +6 REM hex files you have downloaded using a non-error-correcting method. +7 REM Written by F. da Cruz & C. Gianone, Columbia University, April 1986. +8 REM Used with success on Vector Graphic Model 3 CP/M-80 system. +9 REM +100 ON ERROR GOTO 9000 +200 INPUT;"Input hex file "; F$ +300 PRINT +400 OPEN "I",#1,F$ +500 INPUT;"Output hex file"; O$ +600 PRINT +700 OPEN "O",#2,O$ +800 B = 0 +900 REM Loop at 1000 for each line, B, of the input hex file, then... +901 REM Discard blank lines. +902 REM Look for colon that begins hex record +903 REM Decode rest of record... +904 REM L = length of rest, in bytes (not hex characters!), 1 byte +905 REM N = address, 2 bytes +906 REM T = record type, 0 = data, 1 = EOF +907 REM C% = 1-byte checksum +908 REM Record has negative of actual checksum, adding to C% should give 0. +909 REM Subroutine at 8000 converts pair of hex nibbles to 8-bit byte. +910 REM +1000 LINE INPUT #1, A$ +1010 B = B + 1 +1015 IF A$ = "" THEN GOTO 1000 +1020 IF LEFT$(A$,1) = ":" THEN GOTO 2000 +1030 X = INSTR(2,A$,":") +1033 IF X < 1 THEN GOTO 1040 +1035 A$ = MID$(A$,X,LEN(A$)-X+1) +1037 GOTO 2000 +1040 PRINT "Line";B;"has no colon" +1060 GOTO 3070 +2000 C% = 0 +2005 PRINT "."; +2010 X$ = MID$(A$,2,2) +2020 GOSUB 8000 +2030 L = K +2040 X$ = MID$(A$,4,2) +2050 GOSUB 8000 +2060 N = K +2070 X$ = MID$(A$,6,2) +2080 GOSUB 8000 +2090 N = 256 * N + K +2100 X$ = MID$(A$,8,2) +2110 GOSUB 8000 +2120 T = K +2125 IF T = 1 THEN PRINT "End of";F$;"at line";B : GOTO 9000 +2130 IF T <> 0 THEN PRINT "Invalid record type"; T : GOTO 3070 +2140 M = 10 +3000 X$ = MID$(A$,M,2) +3002 GOSUB 8000 +3005 M = M + 2 +3010 L = L - 1 +3020 IF L > 0 THEN GOTO 3000 +3030 X$ = MID$(A$,M,2) +3050 GOSUB 8000 +3060 IF (C% AND 255) = 0 THEN GOTO 3100 +3065 PRINT "Bad Checksum" +3070 PRINT "Line";B +3075 PRINT "Bad: "; A$ +3080 INPUT "New "; A$ +3090 PRINT +3100 PRINT #2,A$ +4000 GOTO 1000 +7999 REM Subroutine to convert pair of hex nibbles to one 8-bit byte. +8000 I = ASC(LEFT$(X$,1)) +8005 K = 0 +8010 IF I > 64 AND I < 71 THEN I = I - 7 +8020 IF I < 48 OR I > 63 THEN K = -1 +8030 J = ASC(MID$(X$,2,1)) +8040 IF J > 64 AND J < 71 THEN J = J - 7 +8050 IF J < 48 OR J > 63 THEN K = -1 +8060 IF K < 0 THEN RETURN +8070 K = 16 * (I - 48) + J - 48 +8080 C% = C% + K +8099 RETURN +8999 Program exit and error handler +9000 CLOSE #1 +9010 CLOSE #2 +9020 CLOSE +9030 PRINT "Records processed:";B +9999 END |
