10 REM ******************************** 20 REM * * 30 REM * SAFT.BAS * 40 REM * * 50 REM * Simple ASCII File Transfer * 60 REM * f|r ABC-80 * 70 REM * Author Hans Nilsson * 80 REM * Modifiering G Tidner 820714 * 90 REM ******************************** 100 GOSUB 1500 110 DIM A$=132%,L$=120% : ; CHR$(12) 120 H$="0123456789ABCDEF" 130 DIM Q0$=253%,A0$=253% 140 F$="V24:" : F%=1% : T8%=0% 150 B2%=-22 : REM Cell f|r Ctrl-B 160 OPEN F$ ASFILE 1% 170 ; : ; "This is ABC-80 Saft" : ; 180 PRINT "0. Terminal mode" 190 PRINT "1. Help" 200 PRINT "2. Send text file from ABC-80" 210 PRINT "3. Receive text file into ABC-80" 220 PRINT "4. Other commands" 230 PRINT "5. Exit from SAFT" 240 ; "Enter choice number:"; : GET G$ : ; G$ : G%=ASC(G$) : IF G%=13% GOTO 400 250 G%=G%-ASC("0") 260 U2%=-1% : U3%=0% : Q%=0% 270 T9%=0% : L9%=0% : U9%=253% 280 IF G%>0% THEN POKE B2%,61% 290 ON G%+1% GOTO 400,170,440,740,300,1470 300 ; : ; "1. Timing options" 310 PRINT "2. Send byte file from ABC-80" 320 PRINT "3. Receive byte file into ABC-80" 330 PRINT "4. Change terminal parameters" : ; "5. Exit from menu" 340 ; "Enter choice number:"; : GET G$ : ; G$ : G2%=ASC(G$)-ASC("0") 350 ON G2% GOTO 360,440,740,370,170 360 T8%=1% : ; "Timing option selected!" : GOTO 170 370 ; "V24:"; : INPUT F$ : F$="V24:"+F$ 380 REM ---- TERMINAL MODE ---- 390 OPEN F$ ASFILE 1% 400 POKE B2%,2% 410 ; : ; "You are now in terminal mode, type CTRL-P to stop." 420 FOR N=1 TO 2000 : NEXT N 430 INPUT #F%,A$ : GOTO 170 440 REM ---- TRANSMIT FILE ---- 450 PRINT "Enter filename"; 460 INPUT I$ : ONERRORGOTO 480 470 OPEN I$ ASFILE 2 : GOTO 510 480 ONERRORGOTO 0 490 PRINT "CAN NOT OPEN FILE!" 500 GOTO 450 510 A$="=+" 520 GOSUB 1160 : REM TX MESSAGE 530 GOSUB 1210 : REM RX PROMPTER 540 A1$=LEFT$(A$,1) 550 IF A1$="?" THEN A$=S$ : GOTO 520 560 IF Q%=-1% GOTO 690 570 IF A1$="-" GOTO 1120 : REM RX ABORT 580 IF A1$<>"+" GOTO 1080 : REM ERROR 590 C%=0% : A$="=*" 600 FOR K%=1 TO 21 : IF K%<21 GOTO 620 610 A%=C% AND 255% : GOTO 650 620 GOSUB 1260 : REM GET ONE BYTE 630 IF Q%=-1% THEN A$=A$+"ZZ" : GOTO 670 640 A%=Q% : C%=C%+A% 650 A%=CALL(65408%,A%) 660 A$=A$+CHR$(A%/256%)+CHR$(A% AND 255%) 670 NEXT K% 680 S$=A$ : GOTO 520 690 A$="=/" 700 GOSUB 1160 : GOSUB 1210 710 IF A$<>"+" GOTO 1120 720 PRINT "Send done, ";T9%;" bytes, ";L9%;" lines" 730 CLOSE 2% : GOTO 170 740 REM ---- RECEIVE FILE ---- 750 PRINT "Enter filename"; 760 INPUT A$ 770 PREPARE A$ ASFILE 2% 780 A$="=+" 790 GOSUB 1160 : REM TX PROMPTER 800 GOSUB 1210 : REM RX LINE 810 A1$=LEFT$(A$,1) 820 IF A1$="+" GOTO 780 830 IF A1$="-" GOTO 1140 840 IF A1$="/" GOTO 1040 850 IF A1$<>"*" GOTO 1110 860 IF LEN(A$)<43 GOTO 1110 870 C%=0% 880 FOR K%=1% TO 21% 890 A1$=MID$(A$,K%*2%,1%) 900 IF A1$="Z" GOTO 1020 910 A2$=MID$(A$,K%*2%+1%,1%) 920 A%=ASC(A1$)*256%+ASC(A2$) 930 A%=CALL(65438%,A%) 940 IF K%<21% GOTO 980 950 C%=C% AND 255% 960 IF A%<>C% THEN A$="=?" : GOTO 790 970 GOTO 1020 980 Q%=A% : T9%=T9%+1% : ; CHR$(Q%); 990 IF G%<>4% AND A%=10% THEN L9%=L9%+1% : GOTO 1010 1000 GOSUB 1440 : REM PRINT ONE BYTE 1010 C%=C%+A% 1020 NEXT K% 1030 GOTO 780 1040 IF G%<>4% THEN Q%=3% : GOSUB 1440 1050 A$="=+" : GOSUB 1160 1060 ; "Receive done, ";T9%;" bytes, ";L9%;" lines" 1070 CLOSE 2% : GOTO 170 1080 PRINT "Sender aborted receiver, illegal message" 1090 A$="=-" : GOSUB 1160 1100 CLOSE 2% : GOTO 1470 1110 PRINT "Receiver aborted sender, illegal message" : GOTO 1090 1120 PRINT "Sender aborted by receiver!" 1130 GOTO 1100 1140 PRINT "Receiver aborted by sender!" 1150 GOTO 1100 1160 REM --- SLEEP 0.1 S AND TRANSMIT A$ 1170 IF T8%>0% THEN FOR I=1 TO 100 : NEXT I 1180 PRINT "TX:";A$ 1190 PRINT #F%,A$+CHR$(13); 1200 RETURN 1210 REM ** RECEIVE ONE LINE IN A$ ** 1220 REM ** STRIPPED FROM = AND CR ** 1230 INPUT #F%,A$ 1240 PRINT "RX:=";A$ 1250 RETURN 1260 REM --- GET ONE BYTE FROM FILE --- 1270 REM ** INTO Q%. EOF-> Q%=-1 *** 1280 IF Q%=-1% RETURN 1290 IF G%<>4% GOTO 1370 1300 IF U3%>0% GOTO 1340 1310 U2%=U2%+1% : ONERRORGOTO 1430 1320 Z%=CALL(28666%,2%)+CALL(28668%,U2%) 1330 U3%=1% : ONERRORGOTO 0 1340 Q%=ASC(MID$(Q0$,U3%,1%)) 1350 U3%=U3%+1% : IF U3%>U9% THEN U3%=0% 1360 T9%=T9%+1% : ; CHR$(Q%); : RETURN 1370 IF U3%>0% GOTO 1410 1380 ONERRORGOTO 1430 1390 INPUTLINE #2%,L$ : ONERRORGOTO 0 1400 L9%=L9%+1% : U3%=1% : U9%=LEN(L$) 1410 Q%=ASC(MID$(L$,U3%,1%)) 1420 GOTO 1350 1430 Q%=-1% : RETURN 1440 REM --- PRINT ONE BYTE IN Q% -- 1450 REM --- TO THE RECEIVE FILE --- 1460 PRINT #2%,CHR$(Q%); : RETURN 1470 ; : ; "Goodbye from ABC-80 SAFT" 1480 POKE B2%,2% 1490 END 1500 REM Initiering av maskinkodsrutin 1510 POKE -128%,197%,123%,67%,31%,31%,31%,31%,205%,147%,255%,79%,120%,205%,147%,255% 1520 POKE -113%,111%,97%,193%,201%,230%,15%,33%,193%,255%,95%,22%,0%,25% 1530 POKE -100%,126%,201%,122%,205%,180%,255%,23%,23%,23%,23%,230%,240%,87% 1540 POKE -87%,123%,205%,180%,255%,230%,15%,178%,38%,0%,111%,201%,254%,65% 1550 POKE -74%,250%,190%,255%,214%,65%,198%,10%,201%,214%,48%,201%,48%,49%,50%,51% 1560 POKE -59%,52%,53%,54%,55%,56%,57%,65%,66%,67%,68%,69%,70% 1570 RETURN