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