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