1990年代にFM-7のプログラムをFM-TOWNSなどにコピーするために作ったLISTX.BASというプログラムをPC-BASIC上で動作するように直しました。
run"listx
コマンドで作成したプログラム LISTX.BAS
を読み込んで実行しています。
保存するときは、save"Q0",a
のように a
(ASCII) をしてしておくと、テキストになります。省略するとバイナリになってしまいます。
Ok run"listx Filename? listx.bas Ok 100 'LISTX - List Files with Xon/Xoff 110 ' (C) 1990,1994 N.Takahashi 120 ' 130 ON ERROR GOTO 470 140 ' 150 DIM S1$(10) 160 TRUE=1=1 : FALSE=NOT TRUE 170 DEF FN CTRL$(A$)=CHR$(ASC(A$) MOD 32) 180 XON$=FN CTRL$("q") : XOFF$=FN CTRL$("s") 190 LINE INPUT "Filename? ";F$ 200 GOSUB 530 - 中略 - 700 IF S1$(N)="" THEN S1$(N)="KYBD:" 710 RETURN 720 ' 730 IF LOF(3)=0 THEN RETURN 740 X$=INPUT$(1,3) 750 IF X$=XON$ GOTO 730 760 IF X$=XOFF$ GOTO 740 770 PRINT X$; : GOTO 730 Ok
expand source をクリックするとソースを展開します。元に戻すにはブラウザの再読み込みボタンを押してください。
1990年代に F-BASIC 向けに作成したものを、PC-BASIC のためにエラー番号を修正しました。 今回 XON/XOFF の動作は試していませんが、これは RS-232C(シリアルポート)で接続した場合に入力バッファが一杯になる前にこれらの信号をやりとりして一時的に出力を待ち合わせる機能です。
F$
に ">"
があるときに出力先をリダイレクトします。F$
の ","
で区切られた入力ファイルを配列 S1$
に格納します。"SCRN:"
(画面)がオープンされます。ERR=62
は PC-BASIC の Input past end
(ファイルの全てのデータを読んだ後に INPUT 文を実行した)ですが、F-BASIC では ERR=54
でした。ERR=57
は PC-BASIC の Device I/O error
(使用したデバイスに入出力エラーが発生した)ですが、F-BASIC では ERR=53
でした。100 'LISTX - List Files with Xon/Xoff 110 ' (C) 1990,1994 N.Takahashi 120 ' 130 ON ERROR GOTO 470 140 ' 150 DIM S1$(10) 160 TRUE=1=1 : FALSE=NOT TRUE 170 DEF FN CTRL$(A$)=CHR$(ASC(A$) MOD 32) 180 XON$=FN CTRL$("q") : XOFF$=FN CTRL$("s") 190 LINE INPUT "Filename? ";F$ 200 GOSUB 530 210 GOSUB 610 220 OPEN "O",#2,D$ 230 IF MID$(D$,1,5)="COM0:" THEN U=TRUE ELSE U=FALSE 240 IF U THEN OPEN "I",#3,D$ 250 FOR I=1 TO N 260 IF MID$(S1$(I),1,5)="COM0:" THEN D=TRUE ELSE D=FALSE 270 IF MID$(S1$(I),1,5)="KYBD:" THEN K=TRUE ELSE K=FALSE 280 OPEN "I",#1,S1$(I) 290 IF D THEN OPEN "O",#3,S1$(I) 300 WHILE TRUE 310 LINE INPUT #1,L$ 320 IF (K OR D) AND L$="/E" THEN 390 'token for EOF 330 IF D THEN PRINT #3,XOFF$; 340 IF U THEN FOR J=1 TO 100 : NEXT J : GOSUB 730 350 PRINT #2,L$ 360 IF D THEN PRINT #3,XON$; 370 WEND 380 ' 390 CLOSE #1 400 IF D THEN PRINT #3,"Thanks!" : CLOSE #3 410 NEXT I 420 IF U THEN FOR J=1 TO 100 : NEXT J : GOSUB 730 : PRINT #2,"/E" 430 CLOSE #2 440 IF U THEN GOSUB 730 : CLOSE #3 450 END 460 ' 470 IF ERR=62 THEN RESUME 390 480 IF ERR=57 AND ERL=740 THEN RESUME 740 'Device I/O Error 490 ON ERROR GOTO 0 500 ERROR ERR 510 END 520 ' 530 REDIRECT=INSTR(F$,">") 540 IF REDIRECT=0 THEN S$=F$ : D$="SCRN:" : GOTO 590 550 S$=LEFT$(F$,REDIRECT-1) 560 D$=MID$(F$,REDIRECT+1) 570 IF D$="" THEN D$="SCRN:" 580 IF D$="/P" OR D$="/p" THEN D$="LPT0:" 590 RETURN 600 ' 610 P=1 : N=1 620 CONCAT=INSTR(P,S$,",") 630 IF CONCAT=0 THEN 690 640 S1$(N)=MID$(S$,P,CONCAT-P) 650 IF S1$(N)="" THEN S1$(N)="KYBD:" 660 P=CONCAT+1 670 N=N+1 : IF N>10 THEN ERROR 2 680 GOTO 620 690 S1$(N)=MID$(S$,P) 700 IF S1$(N)="" THEN S1$(N)="KYBD:" 710 RETURN 720 ' 730 IF LOF(3)=0 THEN RETURN 740 X$=INPUT$(1,3) 750 IF X$=XON$ GOTO 730 760 IF X$=XOFF$ GOTO 740 770 PRINT X$; : GOTO 730