ファイル入出力

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 をクリックするとソースを展開します。元に戻すにはブラウザの再読み込みボタンを押してください。


LISTX.BAS

1990年代に F-BASIC 向けに作成したものを、PC-BASIC のためにエラー番号を修正しました。 今回 XON/XOFF の動作は試していませんが、これは RS-232C(シリアルポート)で接続した場合に入力バッファが一杯になる前にこれらの信号をやりとりして一時的に出力を待ち合わせる機能です。

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

Copyright © 2020 たかはしのんき. All rights reserved.