DECLARE FUNCTION MySTR$ (n!) DECLARE FUNCTION MyHEX$ (n!) DECLARE FUNCTION SectorRead! (C!, H!, S!, Buffer$) DECLARE FUNCTION SectorWrite! (C!, H!, S!, Buffer$) OPEN "COM2:9600,N,8,1,BIN" FOR RANDOM AS #1 OPEN "sectors.bin" FOR BINARY AS #2 'Starting from Cyli = 0 Head = 0 Sect = 1 'Number of sectors to read or write SectCount = 8064 ' Operation to perform: "READ" or "WRITE" Operation$ = "READ" 'Disk geometry MaxCyli = 651 MaxHead = 63 MaxSect = 63 '--------------------------------------------------------------- '--------------------------------------------------------------- Count = 0 ErrCount = 0 Buffer$ = SPACE$(512) DO SELECT CASE Operation$ '--------------------------------------------------------- ' Read a sector from remote HD to the local file. '--------------------------------------------------------- CASE "READ" PRINT "Receiving sector "; MySTR$(Cyli) + "," + MySTR$(Head) + "," + MySTR$(Sect) + "... "; r = SectorRead(Cyli, Head, Sect, Buffer$) SELECT CASE r CASE 0 PRINT "OK" ErrCount = 0 PUT #2, , Buffer$ CASE ELSE PRINT "ERROR: Bad cecksum!" ErrCount = ErrCount + 1 END SELECT '--------------------------------------------------------- ' Write a sector from the local file to remote HD. '--------------------------------------------------------- CASE "WRITE" PRINT "Sending sector "; MySTR$(Cyli) + "," + MySTR$(Head) + "," + MySTR$(Sect) + "..."; GET #2, , Buffer$ r = SectorWrite(Cyli, Head, Sect, Buffer$) SELECT CASE r CASE 0 PRINT " OK" ErrCount = 0 CASE 1 PRINT " ERROR: Remote host fail!" ErrCount = ErrCount + 1 CASE ELSE PRINT " ERROR: Unknown response from remote host!" ErrCount = ErrCount + 1 END SELECT END SELECT IF ErrCount > 4 THEN PRINT "FATAL: Too many errors..." END END IF IF ErrCount = 0 THEN Count = Count + 1 Sect = Sect + 1 IF Sect > MaxSect THEN Sect = 1 Head = Head + 1 IF Head > MaxHead THEN Head = 0 Cyli = Cyli + 1 IF Cyli > MaxCyli THEN PRINT "FATAL: Cylinder out of range! (End of disk?)" END END IF END IF END IF END IF LOOP WHILE Count < SectCount FUNCTION MyHEX$ (n) a$ = HEX$(n) IF LEN(a$) < 2 THEN a$ = "0" + a$ MyHEX$ = a$ END FUNCTION FUNCTION MySTR$ (n) MySTR$ = LTRIM$(STR$(n)) END FUNCTION FUNCTION SectorRead (C, H, S, Buffer$) Byte$ = SPACE$(1) Buffer$ = SPACE$(512) PRINT #1, "R"; MySTR$(C); ","; MySTR$(H); ","; MySTR$(S); ","; Check = 0 FOR i% = 1 TO 512 Byte$ = INPUT$(1, 1) Check = Check XOR ASC(Byte$) MID$(Buffer$, i%, 1) = Byte$ NEXT i% Byte$ = INPUT$(1, 1) IF Check = ASC(Byte$) THEN SectorRead = 0 ELSE SectorRead = 1 END IF END FUNCTION FUNCTION SectorWrite (C, H, S, Buffer$) Byte$ = SPACE$(1) PRINT #1, "W"; MySTR$(C); ","; MySTR$(H); ","; MySTR$(S); ","; Check = 0 FOR i% = 1 TO 512 Byte$ = MID$(Buffer$, i%, 1) Check = Check XOR ASC(Byte$) PRINT #1, Byte$; NEXT i% PRINT #1, CHR$(Check); Byte$ = INPUT$(1, 1) SELECT CASE Byte$ CASE "T" SectorWrite = 0 CASE "F" SectorWrite = 1 CASE ELSE SectorWrite = 2 END SELECT END FUNCTION