40 PP%=150 E%=060 PN%=066 IF E%<>0 THEN GOTO 500070 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 9095 PRINT "Transmission started"96 GOSUB 2000100 S$=CHR$(21) 'Start transmission101 E%=0105 CALL "ci"(PN%,"w",@E%, S$)106 IF E%<>0 THEN STOP110 GOSUB 3000120 IF ASC(MID$(C$, 1,1))<>1 THEN GOTO 1000 'SOH130 KN%=ASC(MID$(C$,2,1)) 'packet number140 NP%=ASC(MID$(C$,3,1)) '1 complement of packet number150 IF KN%+NP%<>255 THEN GOTO 1000155 IF (PP% AND 255)<>KN% THEN STOP160 PK$=MID$(C$, 4, 128) 'packet170 CK%=ASC(MID$(C$, 132, 1))175 CC%=0180 FOR I=1 TO 128190 CC%=CC%+ASC(MID$(PK$,I,1))200 NEXT210 IF (CC% AND 255) <> CK% THEN PRINT "bad checksum":GOTO 1000215 PRINT ".";216 PP%=PP%+1217 PRINT #1, PK$;225 S$=CHR$(6)230 GOTO 1051000 PRINT "transmission error"1001 GOSUB 20001005 S$=CHR$(21)1010 GOTO 1052000 REM empty buffer2002 KK%=02010 HS%=0:DS%=02015 BC%=02020 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%)2021 IF BC%<1 THEN GOTO 20402022 IF BC%>255 THEN BC%=2552023 KK%=KK%+BC%2025 P$=SPACE$(BC%)2030 CALL "ci"(PN%, "r", @E%, P$, BC%)2035 GOTO 20102040 PRINT "removed ";KK%;"char"2050 RETURN3000 P$=SPACE$(1)3001 CALL "ci"(PN%, "sr",@E%, @HS%, @DS%,@BC%):IF E%<>0 THEN STOP3002 IF BC%=0 THEN GOTO 3001 ELSE CALL "ci"(PB%, "r", @E%, P$,1)3003 IF E%<>0 THEN STOP3005 C$=""3006 IF P$=CHR$(4) THEN GOTO 4000 'end of transmission3010 IF P$=CHR$(1) THEN C$=C$+P$ ELSE STOP3016 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%)3017 IF BC%<131 THEN GOTO 30163018 IF E%<>0 THEN STOP3019 P$=SPACE$(131)3020 CALL "ci"(PN%, "r", @E%, P$,131)3021 IF E%<>0 THEN STOP3030 C$=C$+P$3040 RETURN4000 CALL "ci"(PN%, "w", @E%, CHR$(21))4010 CALL "ci"(PN%, "sr", @E%, @HS%, @DS%, @BC%)4020 IF BC%<1 THEN GOTO 40104030 C$=SPACE$(1)4040 CALL "ci"(PN%, "r", @E%,C$,1)4050 IF C$<>CHR$(4) THEN GOTO 40004060 CALL "ci"(PN%, "w", @E%, CHR$(6))4065 PRINT4070 PRINT "End of transmission"4075 CLOSE 14080 END5000 PRINT "Errore di trasmissione: "; E%5010 STOP