'(w7anf@qsl.net) (w7anf@qsl.net) REM crc16.bas Jim FitzSimons W7ANF 27 March, 2001 DO DO PRINT "file name "; INPUT FileName$ 'Check for valid file. IF (FileName$ = "") OR (FileName$ = CHR$(27)) THEN END IF UCASE$(DIR$(FileName$)) = UCASE$(FileName$) THEN EXIT DO PRINT FileName$; " does not exist. " LOOP OPEN FileName$ FOR INPUT AS #1 REDIM MessageLines$(1 TO 513) Message$ = "" FOR LineNumber% = 1 TO 513 IF Message$ = "" THEN IF EOF(1) THEN EXIT FOR LINE INPUT #1, Message$ END IF IF LEN(Message$) < 81 THEN MessageLines$(LineNumber%) = Message$ Message$ = "" ELSE MessageLines$(LineNumber%) = LEFT$(Message$, 80) Message$ = RIGHT$(Message$, LEN(Message$) - 80) END IF NEXT LineNumber% CLOSE #1 IF LineNumber% <= 512 THEN EXIT DO PRINT "The maximum number of lines is 512 at 80 characters per line." LOOP TotalLines% = LineNumber% - 1 PRINT FileName$; " has"; TotalLines%; " lines." TotalParts% = INT((TotalLines% - 1) / 16) + 1 PRINT "There are"; TotalParts%; " parts in this message." OPEN "crc16.out" FOR OUTPUT AS #1 LineNumber% = 1 FOR Part% = 1 TO TotalParts% 'CR and LF are not included in the CRC checksum. crc& = 0 FOR k% = 1 TO 16 message$ = MessageLines$(LineNumber%) FOR I% = 1 TO LEN(message$) crc& = crc& XOR (ASC(MID$(message$, I%, 1)) * 256&) FOR j% = 0 TO 7 IF (crc& AND &H8000) <> 0 THEN crc& = ((crc& AND &H7FFF) * 2) XOR 4129& ELSE crc& = crc& * 2 END IF NEXT j% NEXT I% kk% = k% LineNumber% = LineNumber% + 1 IF LineNumber% > TotalLines% THEN EXIT FOR NEXT k% PRINT #1, "--- begin"; crc&; " crc part"; Part%; PRINT #1, " of "; TotalParts%; crc&; " ---" FOR k% = 1 TO kk% PRINT #1, MessageLines$(LineNumber% + k% - kk% -1) NEXT k% PRINT "--- end"; crc&; " crc part"; Part%; PRINT " of "; TotalParts%; crc&; " ---" PRINT #1, "--- end"; crc&; " crc part"; Part%; PRINT #1, " of "; TotalParts%; crc&; " ---" NEXT Part% CLOSE #1 END '(w7anf@qsl.net) (w7anf@qsl.net)