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