10 REM xsend program, version 1.1 15 REM XMODEM send for the Olivetti M20 20 REM By Davide Bucci and Chris Groessler, 2005-2006 30 PN%=0: REM Port number 35 B$="":CS%=0 40 PRINT "XMODEM send program" 50 INPUT "Enter file name: ", F$ 60 OPEN "i",1,F$ 61 SZ%=LOF(1):MS%=INT(SZ%/128) 62 PRINT "File size: ";SZ%;"bytes" 63 PRINT "Total transmission length: ";SZ%/128;"packets" 70 PRINT "Give the receive command on the uploader" 80 BC%=0:E%=0:PK%=1 81 GOSUB 2000 85 CALL "ci"(PN%,"sr",@E%,,,@BC%) 90 IF BC%<1 THEN GOTO 85 95 P$=SPACE$(1) 100 CALL "ci"(PN%, "r", @E%, P$,1) 110 IF ASC(P$)=21 THEN GOTO 150 120 IF ASC(P$)=6 THEN PK%=PK%+1:GOTO 150 130 IF ASC(P$)=4 THEN GOTO 4000 140 PRINT "Unexpected character":STOP 150 PRINT "transmitting packet n";PK%; 160 GOSUB 3000 170 PRINT CHR$(13); 180 CALL "ci"(PN%, "w", @E%, CHR$(1), CHR$(PK% AND 255)) 190 CALL "ci"(PN%, "w", @E%, CHR$(255-(PK% AND 255))) 200 CALL "ci"(PN%, "w", @E%, S$) 210 CK%=0 220 FOR I%=1 TO 128 230 CK%=CK%+ASC(MID$(S$,I%,1)) 240 NEXT 250 CALL "ci"(PN%, "w", @E%,CHR$(CK% AND 255)) 255 IF (PK%)*128>=SZ% THEN GOTO 300 260 GOTO 85 300 PRINT :PRINT "End of transmission" 310 CALL "ci"(PN%, "w", @E%, CHR$(4)) 320 CALL "ci"(PN%, "sr", @E%,,,@BC%) 330 IF BC%<1 THEN GOTO 320 340 P$=SPACE$(1) 350 CALL "ci"(PN%, "r", @E%, P$,1) 360 IF ASC(P$)<>21 THEN STOP 370 CALL "ci"(PN%, "w", @E%, CHR$(4)) 380 CALL "ci"(PN%, "sr", @E%,,,@BC%) 390 IF BC%<1 THEN GOTO 380 400 CALL "ci"(PN%, "r", @E%, P$,1) 410 IF ASC(P$)<>6 THEN STOP 420 CLOSE 1 430 PRINT "Transfer completed" 440 END 2000 BC%=1 2010 WHILE BC%>0 2020 CALL "ci"(PN%, "sr", @E%,,,@BC%) 2025 PRINT BC% 2030 IF BC%>255 THEN BC%=255 2040 P$=SPACE$(BC%) 2050 CALL "ci"(PN%, "r", @E%, P$, BC%) 2060 WEND 2070 RETURN 3000 ' Read a 128 bytes packet 3001 A$="":L%=128:IF CS%>=MS% THEN L%=1 3002 CS%=CS%+1 3005 WHILE (LEN(B$)<128 AND NOT(EOF(1))) 3010 IF A$="" THEN A$=INPUT$(L%,#1) 3016 PP%=128-LEN(B$) 3020 B$=B$+LEFT$(A$, PP%) 3030 A$=MID$(A$, PP%+1) 3040 WEND 3050 S$=LEFT$(B$,128) 3060 B$=MID$(B$,129)+A$ 3070 IF LEN(S$)<128 THEN S$=S$+SPACE$(128-LEN(S$)) 3080 RETURN