40 PP%=1 50 E%=0 60 PN%=0 66 IF E%<>0 THEN GOTO 5000 70 C$=SPACE$(132) 80 PRINT "Olivetti M20 XMODEM receive program. " 81 PRINT "Version 0.1, Davide Bucci 2005" 85 INPUT "Enter file name: ", FI$ 86 OPEN "a",1,FI$ 87 PRINT "Type a key to start transmission" 90 A$=INKEY$:IF A$="" THEN GOTO 90 95 PRINT "Transmission started" 96 GOSUB 2000 100 S$=CHR$(21) 'Start transmission 101 E%=0 105 CALL "ci"(PN%,"w",@E%, S$) 106 IF E%<>0 THEN STOP 110 GOSUB 3000 120 IF ASC(MID$(C$, 1,1))<>1 THEN GOTO 1000 'SOH 130 KN%=ASC(MID$(C$,2,1)) 'packet number 140 NP%=ASC(MID$(C$,3,1)) '1 complement of packet number 150 IF KN%+NP%<>255 THEN GOTO 1000 155 IF (PP% AND 255)<>KN% THEN STOP 160 PK$=MID$(C$, 4, 128) 'packet 170 CK%=ASC(MID$(C$, 132, 1)) 175 CC%=0 180 FOR I=1 TO 128 190 CC%=CC%+ASC(MID$(PK$,I,1)) 200 NEXT 210 IF (CC% AND 255) <> CK% THEN PRINT "bad checksum":GOTO 1000 215 PRINT "."; 216 PP%=PP%+1 217 PRINT #1, PK$; 225 S$=CHR$(6) 230 GOTO 105 1000 PRINT "transmission error" 1001 GOSUB 2000 1005 S$=CHR$(21) 1010 GOTO 105 2000 REM empty buffer 2002 KK%=0 2010 HS%=0:DS%=0 2015 BC%=0 2020 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%) 2021 IF BC%<1 THEN GOTO 2040 2022 IF BC%>255 THEN BC%=255 2023 KK%=KK%+BC% 2025 P$=SPACE$(BC%) 2030 CALL "ci"(PN%, "r", @E%, P$, BC%) 2035 GOTO 2010 2040 PRINT "removed ";KK%;"char" 2050 RETURN 3000 P$=SPACE$(1) 3001 CALL "ci"(PN%, "sr",@E%, @HS%, @DS%,@BC%):IF E%<>0 THEN STOP 3002 IF BC%=0 THEN GOTO 3001 ELSE CALL "ci"(PB%, "r", @E%, P$,1) 3003 IF E%<>0 THEN STOP 3005 C$="" 3006 IF P$=CHR$(4) THEN GOTO 4000 'end of transmission 3010 IF P$=CHR$(1) THEN C$=C$+P$ ELSE STOP 3016 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%) 3017 IF BC%<131 THEN GOTO 3016 3018 IF E%<>0 THEN STOP 3019 P$=SPACE$(131) 3020 CALL "ci"(PN%, "r", @E%, P$,131) 3021 IF E%<>0 THEN STOP 3030 C$=C$+P$ 3040 RETURN 4000 CALL "ci"(PN%, "w", @E%, CHR$(21)) 4010 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%) 4020 IF BC%<1 THEN GOTO 4010 4030 C$=SPACE$(1) 4040 CALL "ci"(PN%, "r", @E%,C$,1) 4050 IF C$<>CHR$(4) THEN GOTO 4000 4060 CALL "ci"(PN%, "w", @E%, CHR$(6)) 4065 PRINT 4070 PRINT "End of transmission" 4075 CLOSE 1 4080 END 5000 PRINT "Errore di trasmissione: "; E% 5010 STOP