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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第167回]


●仮想FDDセクタ内容表示プログラム

前回は仮想FDDフォーマットプログラムについて説明をしました。
CP/M互換DOSプログラムが正しく動作すれば、仮想FDDが本来のフロッピーディスクと同じように機能して、そこにプログラムファイルやデータファイルをセーブしたり、またそこからプログラムファイルをロードして実行することなどができます。

しかしそれはCP/M互換DOSプログラムが正しく動くようになったら、そのようにできる、というお話で、最初からそんなに都合良くはいきません。
当然デバッグをすることになります。

そういうことになりますと、果たして本当にルール通りに仮想FDDのディレクトリエリアにFCBが正しく書き込みできているかどうか、またデータ(プログラム)がルール通りにセクタに書き込まれているのかどうか、仮想FDDの中味を確認してみたくなります。

実際デバッグの過程でそうする必要が出てきましたので、「仮想FDDセクタ内容表示プログラム」を作りました。
前回の仮想FDDフォーマットプログラムと同様、Borland C++コンパイラで作成しました。
下がそのソースリストです。

//sector dump of virtual disk drive(2MB)
// 12/2/25
#include <stdio.h>
//
#define REC_SIZE 128L
//
void main()
{
        FILE *fp;
        long offset;
        int max_rec=16384;// 16sector*1024block
        int i,j,ln;
        int d;
        int sectno;
        char wk[2]="\0";
        char inbf[80];
        char drivename[6]="a.vfd\0";
        unsigned char recdata[129]="\0";        
//
while(1){
        printf("drive no?(input a-d):");
        scanf("%s",inbf);
        drivename[0]=inbf[0];
        fp=fopen(drivename,"rb");
        if(!fp){printf("can't open %s\n",drivename);continue;}
        break;
        }
while(1){
        printf("sector no?(0-%d):",max_rec-1);
        scanf("%d",&sectno);
        if(sectno<0)break;
        if(sectno>=max_rec){printf("how?\n");continue;}
// sector dump
        offset=REC_SIZE*sectno;
        fseek(fp,offset,SEEK_SET);
        fread(&recdata,128,1,fp);
        for(i=0;i<8;i++){
                ln=i*16;
                printf("%04X ",ln);
                for(j=0;j<16;j++)printf("%02X ",recdata[ln+j]);
                for(j=0;j<16;j++){
                        d=recdata[ln+j];
                        if(d<0x20||d>=0x80)wk[0]=0x2e;
                        else wk[0]=d;
                        printf("%s",wk);
                        }
                printf("\n");
                }
        }
        fclose(fp);
}
//end

前回の仮想FDDフォーマットプログラムのリストも同じなのですが、プログラムリストの先頭に記入した作成日付をご確認ください。
今年の2月になっておりますでしょう。
そうなのです。
実は仮想FDDのシステムは今年2月におおまかなテストはすでに完了していたのです。

まあ、こういう言い方をしますと何なのですけれど、そこがプロとアマの違いといいましょうか。
アマでしたら、ただ想像しているだけの段階で「こう言うものを作りますよ」なんて景気良くブチ上げておいて、「でもやってみたらできませんでした」ということでも許されますけれど、プロともなりますと、それでメシを食っておりますものですから、「やっぱりできませんでした」では済まされません。
場合によっては責任問題にもなりかねません。

おお、そういえば某IBM様が銀行様から訴えられておりましたですね。
まあ、私ら風情がかかわるようなシステムとは規模が違いますから、同列には申しあげられませんでしょうけれど。
近年、職人とかプロとかのスキルが問われることがよくありますようで。

実のところかく言う私めも、そんな大口をたたけるほど技術があるわけでもありませんから、ここは先人の轍を踏まぬよう、慎重にことを運びたいと常々自戒に努めておりますです。

さて余談は置きまして。
仮想FDDセクタ内容表示プログラムVFDUMP.EXEを実行中の画像です。



VFDUMPを実行するとドライブ名を聞いてきます。
Aドライブを選択しました。
次にセクタb入力します。
一番先頭の第0セクタを指定しました。
ディレクトリの先頭セクタです。

テストプログラムVFTST1.COMとMBASIC.COMのFCBがあります。
MBASIC.COMはサイズが大きいので1個のFCBだけでは収まりません。
2個のFCBが使われています。
VFTST1.COMは使用しているブロックbェ02だけですが、MBASIC.COMは03ブロックから0Eブロックまでを占有しています。

次にセクタbR2を表示させてみました。
セクタbR2は、第02ブロックの先頭セクタです。
仮RAMディスクシステムでは当初ブロック当り4セクタでテストを行ないましたが、今回の仮想FDDシステムでは1ブロックは16セクタです。
ですからVFTST1.COMのプログラム本体が書き込まれている第02ブロックの先頭のセクタbヘ32になります。
セクタbR2には間違い無くVFTST1.COMのマシン語プログラムコードが書き込まれています。

VFDUMP.COMを終了するときは、−1[Enter]を入力します。

いかがでしょうか?
簡単なツールですけれど、ちょいとこういうものを作りますと、デバッグに役立ちます。

職人の話の続きになりますが、昔の職人はまず道具を作ることから始めたと聞いております。
確かに「餅は餅屋に」も理屈ではありますし、効率良く分業してこそ、進歩があるのかも知れませんが、技術屋が他人の技術に頼りきり、ということになりましたら、それはちょいと情けないのでは、と思います。
ソフト屋としましては、できるだけ必要なツールは自分で作る、を基本としていきたいものです。

あ。
今思い出しました。
MSDOSにはDEBUGというコマンドがありまして、それでファイルをロードしてその中味を16進ダンプして見ることができます。
最初はそれを利用しようと思ったのですけれど。
2MBもあるファイルはDEBUGコマンドでは大きすぎて開くことができませんでした。
それでVFDUMPプログラムを作ったのでした。

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

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