MAP1 IN'CHR,X,1 MAP1 DISK'FSPEC,S,24 MAP1 IN'UNIT,F,,0 MAP1 OUT'UNIT,F,,0 MAP1 DISK'UNIT,F,,3 MAP1 ERROR'UNIT,F,,4 ! MAP1 COM'FSPEC,S,24 MAP1 SOH,X,1,CHR$(1) MAP1 CTRLC,X,1,CHR$(3) MAP1 EOT,X,1,CHR$(4) MAP1 ACK,X,1,CHR$(6) MAP1 NAK,X,1,CHR$(21) MAP1 CHECK'SUM,F MAP1 BLOCK'LENGTH,F,,128 MAP1 IO'REC,X,128 MAP1 BLOCK'COUNT,F,,1 MAP1 NEXT'NAK,F MAP1 I,F INPUT LINE "Receive fspec?",DISK'FSPEC XCALL IMG OPEN #DISK'UNIT, DISK'FSPEC, OUTPUT ! INPUT LINE "Communications trmdef?",COM'FSPEC ! COM'FSPEC = "" ! OPEN #IN'UNIT, "TRM:"+COM'FSPEC, INPUT ! OPEN #OUT'UNIT, "TRM:"+COM'FSPEC, OUTPUT FLUSH'BUFFER: IF EOF(IN'UNIT) GOTO START'NAKING INPUT LINE #IN'UNIT, IN'CHR GOTO FLUSH'BUFFER START'NAKING: NEXT'NAK = TIME NEXT'NAK'LOOP: IF EOF(IN'UNIT) = 0 GOTO LOOK'FOR'SOH IF NEXT'NAK > TIME GOTO NEXT'NAK'LOOP PRINT #OUT'UNIT, NAK; NEXT'NAK = TIME+10 GOTO NEXT'NAK'LOOP LOOK'FOR'SOH: INPUT LINE #IN'UNIT, IN'CHR IN'CHR = CHR$(ASC(IN'CHR) AND 127) IF IN'CHR = CTRLC GOTO CTRLC'ABORT IF IN'CHR = EOT GOTO EOT'FOUND IF IN'CHR <> SOH GOTO START'NAKING ! IF IN'CHR <> SOH & PRINT #0,"?";ASC(IN'CHR);IN'CHR; : & GOTO START'NAKING INPUT LINE #IN'UNIT, IN'CHR IF ASC(IN'CHR) <> BLOCK'COUNT GOTO BAD'BLOCK'COUNT INPUT LINE #IN'UNIT, IN'CHR IF 255-ASC(IN'CHR) <> BLOCK'COUNT GOTO BAD'BLOCK'COUNT CHECK'SUM = 0 INPUT LINE #IN'UNIT, IO'REC FOR I = 1 TO BLOCK'LENGTH CHECK'SUM = CHECK'SUM+ASC(IO'REC[I;1]) NEXT INPUT LINE #IN'UNIT, IN'CHR IF ASC(IN'CHR) <> (CHECK'SUM AND 255) GOTO BAD'CHECK'SUM PRINT #DISK'UNIT, IO'REC; BLOCK'COUNT = BLOCK'COUNT+1 PRINT #OUT'UNIT, ACK GOTO LOOK'FOR'SOH BAD'BLOCK'COUNT: GOTO START'NAKING EOT'FOUND: PRINT #OUT'UNIT, ACK; END CTRLC'ABORT: END BAD'CHECK'SUM: GOTO START'NAKING