[今更誰得] PB-1000用FDドライブMD-100を使ってランダムアクセスファイルを操作する #カシオ #ポケコン


先日のエントリで無事に使えるようになったMD-100ですが、まあとにかくデカイゴツイ。

昨今のちょっとしたノートPCと比べても大きいし厚いし重いです。

なんだかんだで便利なFDD

自分的には、最初に入手したFA-7の予備機としてRS-232Cが使えればいいか(+ちょっとFDDが使えて体験できればいいか)くらいにしか考えていなかったのですが、メディアも調達できて、テストしてみて普通に使えるとわかると、PCにケーブルつないで転送して・・・よりは、なんだかんだでやっぱり遥かに楽なので、ついつい使ってしまいます。

しかしながら、DOS以降のPCに慣れきってしまっていた中の人的には、MD-100のFDへのアクセスはなかなかにブラックボックス感が強いなあと感じます。

メニューから[disk]をタッチすればFDに保存されているファイルの一覧は見れるのですが、見れるのは本当にファイルの一覧(とその属性:BASIC、マシン語、テキストファイルの区別)のみで、各ファイルのファイルサイズも残り容量も見ることができない・・・というのが、なんともいえず気持ち悪い感じがしてしまいます。

ちなみにMD-100で扱える1DDディスクの容量は約320KB。

PB-1000本体のメモリが最大40KBですから、メモリ容量全体の8倍の内容が格納できる計算です。令和の現代で書いても全く凄さが伝わらないかもしれませんが、当時からしたら十分すぎる容量なんですよね。

ランダムアクセスできるファイル

あと、これまた時代だなと思うのが、ディスク上のファイルに対して直接ランダムアクセスができるという点でしょうか。今どきならば、ディスクの内容を全部メモリにロードしてから、メモリ上でアクセスすればよいのかもしれませんが、メインメモリに限りがあるポケコンではファイル内容全部をメモリにロードするのはファイルの大きさに依存するのでちょっと厳しいところがあるわけですね。

まず、ランダムアクセスのファイルをどう作るかなんですが、実はランダムアクセスファイルはディスク上にしか作れません。つまりPB-1000本体のメモリ上にあるファイルをそのままディスク上にセーブすればランダムアクセスファイルになるわけじゃないんですね。

で、じゃあどうするかというと、プログラムで作るんですw

たとえば、PCで作ったテキストファイルをRS-232Cで転送して本体メモリに保存したテキストファイルをランダムアクセスファイルにして保存するようなプログラムは以下となります。



1000 OPEN "ERRMSG.TXT" FOR INPUT AS #1
1020 OPEN "0:ERRMSGD.TXT" AS #2
1025 REM ON ERROR GOTO 2000
1030 FIELD #2,2 AS CI$,2 AS EI$,128 AS MI$
1035 P=1
1040 IF EOF(1) OR P>33 THEN 2000
1050 INPUT #1,CO$,EO$,MO$
1052 PRINT "[";P;"]:";CO$;",";EO$,MO$
1054 LSET CI$=CO$:LSET EI$=EO$:LSET MI$=MO$
1060 PUT #2,P
1070 P=P+1
1080 GOTO 1040
2000 CLOSE #1:CLOSE #2:END
		

※印刷イメージの表示には、PBロッキーさん(https://blog.pb-100.ga/)作の"hamura.css"(https://github.com/PB-100/hamura.css)を利用させていただいています。


ちなみにサンプルに使ったファイルは、PB-1000のエラーメッセージとその内容で、ファイル名はERRMSG.TXT、出力先のランダムアクセスファイル名はERRMSGD.TXTです。


1,OM,Memory Overflow
2,SN,Syntax Error
3,ST,String length
4,TC,Formula too complex
5,BV,I/O Buffer overflow
6,NR,I/O Buffer Not Ready
7,RW,I/O Device operation
8,BF,Improper filename specification
9,BN,Improper file number specification
10,NF,file Not Found
11,LB,Low Battery in FDD
12,FL,Disk space unavailable
13,OV,Value exceeds allowable calculation result or input range
14,MA,Mathematical error such as division by zero / Argument exceeds allowable calculation range
15,DD,Double Declaration of identical array
16,BS,Subscript or parameter outside of allowable range
17,FC,Error use of Function or statement/Illegal command used in direct mode or program mode, cal mode/Attempt to use undeclared array
18,UL,Destination line number does not exist/input statement without line number in BASIC editing mode
19,TM,Type Mismatch
20,RE,RESUME statement outside of error handling routine
21,PR,Password or Write-protected
22,DA,READ statement when no DATA present
23,FO,no FOR against NEXT
24,NX,no NEXT against FOR
25,GS,Mismatch GOSUB and RETURN
26,FM,Unformat or Damaged disk
27,FD,FIELD statement length exceeds 256 chars
28,OP,Access Unopened file/Open already opened file
29,AM,random access/file mode(input/output)/baud rate mismatch etc.
30,FR,Framing Error detected by RS232C port
31,PO,Parity Error or over run error detected by RS232C port
32,DF,Undefined command sent to FDD,Abnormally in FDD
0,??,Undefined error
		



ファイルディスクリプタをディスクにしてオープンし、FOR INPUT/OUTPUTなどを省略すると、ランダムアクセスファイルとみなされます。

ランダムアクセスファイルのフォーマットは1レコードごとにサイズが決められていて、その配分をFIELD文で決めて出力します。

一方、メモリ上のテキストファイルはシーケンシャルですが、シーケンシャルファイルは1フィールドごとのサイズの指定はありません。

シーケンシャルファイルから読み込んだ内容を、ランダムファイルに書き込む手順ですが、単にFIELDで指定した変数に値を代入して、PUT文で書き込み、かなと思っていたのですが、LSET/RSETという文を使って代入しないと書き込めない仕様のようでした。ここが分からず最初は何も書き込まれなくて悩みました。

PUT文ではレコード番号を指定することで、任意のレコードに対して書き込めます。

で、書き込んだファイルに対しては、同じ形のFIELD文を使い、GETで読み込みますが、GET文も同様にレコード番号を指定し、任意の番号を読み込めます。


1000 'RANDOM ACCESS TEST
1010 OPEN "0:ERRMSGD.TXT" AS #1
1020 FIELD #1,2 AS CI$,2 AS EI$,128 AS MI$
1030 CLS
1040 INPUT "ERROR NO?",P
1050 GET #1,P
1060 PRINT CI$;":";EI$;" ERROR"
1070 PRINT MID$(MI$,1,95);
1080 IF INKEY$="" THEN 1080
1090 GOTO 1030
		



検索してレコードを抽出することはできないので、レコード番号で指定できるようなデータでないといけないところはあるのですが、そこがフィットすれば面白い仕様かと思いますね。

という、またしても一体世界で何人の役に立つのか自分でも良くわからないレベルの今更誰得記事を挙げてしまいました。

現場からは以上です。



コメント