170ON ERROR OSCLI("FX 3 0"):OSCLI("FX 2 2"):PRINT"Error!":REPORT:PRINT" at line ";ERL:SOUND 1,-15,0,5:END
180:
190CLS
200PRINT'CHR$141;" BBC to Archimedes file transfer"'CHR$141;" BBC to Archimedes file transfer"
210PRINT'"Do not type anything here; the Arc"'"has full control."'"Facilities include file transfer either"'"way, and BBC file renaming and deletion."'
220*FX 3 3
230VDU 32
240*fx 3 0
250REPEAT
260PRINT"Awaiting command from Archimedes"
270*fx 2 1
280*fx 3 0
290INPUT com$
300IF com$="catalogue" THEN PROCcat
310IF com$="delete file" THEN PROCdel
320IF com$="transfer to arc" THEN PROCtrans
330IF com$="quit" THEN PROCquit
340IF com$="transfer to bbc" THEN PROCtransbbc
350IF com$="rename" THEN PROCrename
360IF com$="baud" THEN PROCbaud
370IF com$="lock" THEN PROClock
380IF com$="lock file" THEN PROClockfile
390*FX 3 0
400UNTIL end%
410END
420:
430DEFPROCquit
440end%=-1
450*FX 3 0
460*FX 2 2
470PRINT"Ending session"'
480SOUND 1,-15,100,5
490ENDPROC
500:
510DEFPROCdel
520*fx 2 1
530*fx 3 0
540PRINT"Delete; File: ";dir$;".";
550INPUTLINE""file$
560ok%=FNokalter(file$)
570IF ok% THEN OSCLI("Delete "+dir$+"."+file$)
580*fx 3 3
590*fx 2 2
600IF ok% THEN PRINT"deleted";CHR$13; ELSE PRINT"locked";CHR$13;
610*fx 3 0
620ENDPROC
630:
640DEFPROCrename
650*FX 2 1
660*FX 3 0
670INPUT'"Rename; old file:"old$
680INPUTLINE"New file:"new$
690ok%=FNokalter(old$)
700IF ok% THEN OSCLI("rename "+dir$+"."+old$+" "+dir$+"."+new$)
710*fx 3 3
720*fx 2 2
730IF ok% THEN PRINT"renamed";CHR$13; ELSE PRINT"locked";CHR$13;
740*fx 3 0
750ENDPROC
760:
770DEFPROCcat
780*fx 3 0
790INPUT"Directory:"dir$
800OSCLI("Dir "+dir$)
810PRINT"Reading catalogue"
820FOR f%=0 TO 32:f$(f%)="":NEXT
830FOR byte%=b% TO b%+300 STEP 4:!byte%=0:NEXT
840*CAT
850*FX 2 2
860X%=cb% MOD 256
870Y%=cb% DIV 256
880A%=8
890cb%?0=0
900cb%!1=b%
910cb%!5=32
920cb%!9=0
930CALL &FFD1
940files%=0
950p%=b%
960REPEAT
970IF FNfname(p%)<>"" THEN files%=files%+1:f$(files%)=FNfname(p%):p%=p%+?p%+1
980UNTIL ?p%=0
990PRINT"Sending ";files%;" filenames"
1000*FX 3 3
1010PRINT FNdiscname(osbuff%);CHR$13;
1020PRINT files%;CHR$13;
1030IF files%=0 THEN PRINT" ";CHR$13;:OSCLI("FX 3 0"):ENDPROC
1040FOR f%=1 TO files%
1050PRINT;f$(f%);CHR$13;
1060*fx 3 0
1070PRINT f$(f%)
1080*fx 3 3
1090$(osbuff%+30)=LEFT$(f$(f%),68)
1100!osbuff%=osbuff%+30
1110X%=osbuff% MOD 256
1120Y%=osbuff% DIV 256
1130A%=5
1140A%=USR(&FFDD) AND 255
1150PRINTosbuff%!10;CHR$13;
1160PRINTosbuff%!14;CHR$13;
1170PRINTFNfiletype(f$(f%));CHR$13;
1180NEXT
1190*FX 3 0
1200ENDPROC
1210:
1220DEFPROCtrans
1230*FX 2 1
1240*FX 3 2
1250INPUTLINE f$
1260type%=FNfiletype(f$)
1270FH%=OPENIN(f$)
1280*FX 3 3
1290PRINT;EXT#FH%;CHR$13;
1300PRINT;type%;CHR$13;
1310*FX 2 1
1320*FX 3 2
1330INPUT OK$
1340*FX 2 2
1350*FX 3 0
1360IF OK$<>"OK" THEN PRINT"Communication error":ENDPROC ELSE PRINT"Sending"
1370*FX 3 3
1380FOR F%=1 TO EXT#FH%
1390VDU BGET#FH%
1400NEXT
1410*FX 3 0
1420CLOSE#FH%
1430PRINT"Finish";
1440*FX 2 1
1450*FX 3 2
1460INPUT OK$
1470*FX 2 2
1480*FX 3 0
1490IF OK$="OK" THEN PRINT"ed"'
1500ENDPROC
1510:
1520DEFPROCtransbbc
1530*fx 2 1
1540*fx 3 0
1550ok%=-1
1560PRINT"Receiving file to ";dir$
1570INPUTLINE"Filename:"file$
1580INPUT"Length:"len%
1590F%=OPENIN(dir$+"."+file$)
1600IF F%<>0 THEN CLOSE#F%:ok%=FNokalter(dir$+"."+file$)
1610IF ok% THEN F%=OPENOUT(dir$+"."+file$)
1620*fx 3 3
1630*fx 2 2
1640IF ok% THEN PRINT"receiving";CHR$13; ELSE PRINT"locked";CHR$13;
1650*fx 2 1
1660*FX 3 0
1670FOR block%=1 TO len% STEP 128
1680fails%=0
1690REPEAT
1700crc%=0
1710FOR byte%=block% TO FNlower(block%+127,len%)
1720g%=GET
1730?(transbuff%-block%+byte%)=g%
1740crc%=crc%+g%
1750NEXT
1760*fx 3 3
1770PRINT crc%;CHR$13;
1780*FX 3 2
1790INPUT confirm$
1800IF confirm$<>"crc ok" THEN fails%=fails%+1:SOUND 1,-15,0,2
1810UNTIL confirm$="crc ok" OR fails%>=3
1820IF fails%>=3 THEN OSCLI("FX 3 0"):OSCLI("FX 2 2"):CLOSE#0:PRINT'"Failed to transfer block":END
1830FOR byte%=block% TO FNlower(block%+127,len%)
1840BPUT#F%,?(transbuff%-block%+byte%)
1850NEXT
1860NEXT
1870REM FOR byte%=1 TO len%
1880REM BPUT#F%,GET
1890REM NEXT
1900CLOSE#F%
1910$(osbuff%+30)=dir$+"."+file$
1920!osbuff%=osbuff%+30
1930osbuff%!2=0
1940X%=osbuff% MOD 256
1950Y%=osbuff% DIV 256
1960A%=2
1970CALL&FFDD
1980osbuff%!6=0
1990A%=3
2000CALL&FFDD
2010*fx 2 2
2020*fx 3 3
2030PRINT"finished";CHR$13;
2040*fx 3 0
2050ENDPROC
2060:
2070DEFPROCbaud
2080old%=rate%
2090*fx 2 1
2100*fx 3 0
2110INPUT'"New baud index:"rate%
2120OSCLI("FX 7,"+STR$(rate%))
2130OSCLI("FX 8,"+STR$(rate%))
2140*fx 3 3
2150PRINT"baud reset";CHR$13;
2160*fx 3 0
2170*fx 2 1
2180i$=""
2190REPEAT
2200i%=INKEY(100)
2210IF i%<>13 AND i%<>-1 THEN i$=i$+CHR$(i%)
2220UNTIL i%=13 OR i%=-1
2230IF i$<>"baud confirm" THEN OSCLI("FX 7,"+STR$(old%)):OSCLI("FX 8,"+STR$(old%)):OSCLI("FX 3,0"):PRINT"Failed to confirm new speed":rate%=old%