復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第431回]
●MS−COBOL(3)
前回からの続きです。
CP/MではファイルのOPENやファイルのREAD/WRITEなどのファイル操作の場合にFCB(File Control Block)という32〜36バイトのエリアをRAM上に設けて、そこにファイル名情報などを書き込んで、それをディスクアクセスの際のファイルサーチに利用します。
FCBエリアはメモリ上で36バイト以上連続して空いているところならばどこでも指定できます。
下はデフォルトのFCBエリアとして使われるアドレス005CH〜をFCBエリアとしたときの、FCBの内容を示したものです。
005C 1バイト ディスクドライブa@カレントディスクは00、Aドライブは01、Bドライブは02というように指定する。
005D〜0054 8バイト ファイル名。8文字に満たない場合には後ろの余ったところは20H(スペース)で埋める。
0065〜0067 3バイト 拡張子。3文字に満たない場合には後ろの余ったところは20H(スペース)で埋める。
0068 1バイト エクステント(拡張aj通常はここには00を置く。
0069〜006A 2バイト システムが使用することになっているが何に使われるか不明。通常は00を置く。
006B 1バイト 記録レコード数
006C〜007B 16バイト ファイルアローケーションマップ データブロックのブロックbェ記録される。
007C 1バイト シーケンシャルREAD/WRITEのとき、次にアクセスするレコードb置く。
007D〜007F 3バイト ランダムアクセスのときに、次にアクセスするレコードb置く。
以上のうち、ファイルオープンで指定する必要があるのは005C〜0068の13バイトです。
前回はつい「ルール違反」などと書いてしまいましたが、実のところどういうルールなのかいまひとつわかっていないところがあります。
どうやらほぼ確実なのはファイル名の比較、検索には0069の1バイトは使われていないらしいということです。
しかし006Aはファイル名の比較、検索には使われるらしいということで(今となってはその根拠もちょっとあいまいなのですが)、ここはファイル名比較の場合にチェックしていました。
通常ドライブに新規ファイルとしてセーブされるときには、この位置の2バイトは00が書き込まれます。
ですので、ファイルオープンするためにFCBを作成する場合には、たいていはここは00をいれます。
と、私は思い込んでいました。
しかし。
考えてみればドライブ名〜エクステントまでの13バイトさえあれば、ファイルOPENには十分だとも言えます。
確かに。
でも、今までテストをしてきたプログラムでは、その後ろの2バイトも00にするというFCBになっていたのです。
ですので、てっきりそういうものだと思ってファイル名比較のルーチンを書いていました。
もうおわかりかと思います。なぜファイルOPENでこけてしまったか?
もう一度前回お見せしましたログファイルのFCBのメモリダンプ部分をお見せします。
-d5130 5130 C8 3E FF B7 C9 01 00 4C 3A 00 00 CC 52 00 52 55 .>.....L:...R.RU 5140 4E 43 4F 42 20 20 43 4F 4D 00 48 E4 15 75 39 31 NCOB COM.H..u91 5150 75 57 31 61 01 00 36 00 4F A2 30 66 D3 3E 3E 00 uW1a..6.O.0f.>>. 5160 5D 3A 38 51 FE 41 DA 6E 51 D6 40 32 3D 51 11 00 ]:8Q.A.nQ.@2=Q.. 5170 01 0E 1A CD 05 00 11 3D 51 0E 0F CD 05 00 3C CA .......=Q.....<. 5180 A9 51 AF 32 5D 51 21 00 01 EB D5 0E 1A CD 05 00 .Q.2]Q!......... 5190 11 3D 51 0E 14 CD 05 00 D1 B7 C0 21 80 00 19 3A .=Q........!...: 51A0 37 51 BC DA B4 51 C3 89 51 11 BA 51 0E 09 CD 05 7Q...Q..Q..Q.... 51B0 00 C3 00 00 11 D8 51 C3 AC 51 2A 2A 20 43 4F 42 ......Q..Q** COB 51C0 4F 4C 20 45 78 65 63 75 74 6F 72 20 6E 6F 74 20 OL Executor not 51D0 66 6F 75 6E 64 0D 0A 24 2A 2A 20 43 4F 42 4F 4C found..$** COBOL 51E0 20 45 78 65 63 75 74 6F 72 20 74 6F 6F 20 6C 61 Executor too la |
Z>ren ddt.c80 ddt.com rename z\DDT.C80 DDT.COM done Z>ddt DDT VERS 2.2 -l0100 0100 LXI B,0FBC 0103 JMP 013D 0106 MOV B,E 0107 MOV C,A 0108 MOV D,B 0109 MOV E,C 010A MOV D,D 010B MOV C,C 010C MOV B,A 010D MOV C,B 010E MOV D,H - |