2013.7.1
前へ
次へ
ホームページトップへ戻る

復活!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


ここでは513DからがFCBです。
前から13バイト目のエクステントは00になっていますがその後ろの2バイトは00ではありません。
こういうところはきちんと00にしておいてほしいなあ。
ですけれど。
まあ、上でも書きましたようにこの2バイトが実際に何に使われるのか、あるいは使われないのかはっきりしないところもありますから、とりあえずこの2バイトはファイル名検索からは外すことにしてプログラムを書き換えました。
そうしましたら。

おお!
SQUARO.COMが実行できるようになりましたよ。

SQUARO.COMは平方根の計算プログラムなのだそうです。
へえっ?
COBOLは事務処理用だとばかり思っていたのですけれど…。
そうか。
事務処理でも平方根を使う場合もあるわけか(本当に使うか?)。

うむむ。
ちゃんとルート5は「富士山麓オーム鳴く」になっていますね。
COBOLも大したもんじゃありませんか。

あれっ?
ルート2は、「一夜一夜にひとみごろ」じゃありませんでしたっけ?

ほらあ。
そうでしょう。

’3’が落ちてますよ。
でも、まあ、事務計算ですからいいか(って、よくないでしょう)。

うむむ。
なんだろうなって気になっていたのですけれど。
KEY IN ”A” AS 9(7)V9(11)
の意味が分かりましたよ。
多分、数値の入力フォーマットが9999999.99999999999ということなのじゃないでしょうか?

試してみました。

おや。
どうやら9(7)V9(11)ではなくて9(7)V9(9)の間違いのようですねえ。
しかもその範囲でも大きい数は苦手なようです。

うむむ。
COBOLは大きい桁の数値の演算を正確に扱えるというのがウリだったはずですけれど…(FORTRANは近似値計算)。
ま、しかしルート9999999.999999999がここまで計算できれば大したもんじゃありませんか。
なんたって8ビットCPUなんですから。

ちなみに正確な計算ではこうなります。


●DDTの入手先

DDT(Dinamic Debugging Tool)の入手先です。
こちらのサイト(http://www.retroarchive.org/cpm/os/os.htm)のDRIPAK.ZIPをダウンロードして解凍するとフォルダがいっぱい現れます。
そのうちのCPM_2−2フォルダの中のUTILSRCフォルダを開くとCPM2.2用ユーティリティフォルダがいっぱいできています。
すごい。お宝の山です。
そこのDDTフォルダを開くとDDT.C80があります。
これがDDT.COMです。
Zドライブ(Zフォルダ)にコピーしてから、拡張子をC80→COMに変更します。
REN DDT.C80 DDT.COM です。

こんな感じです。

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
-

ワンボードマイコンでCP/Mを![第431回]
2013.7.1upload

前へ
次へ
ホームページトップへ戻る