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

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

[第228回]


●仮想FDD(フロッピーディスクドライブ)について

またまた何日か更新できませんでした。
前回も書いたことですが、なかなかに大変な作業をやっているものですから、つい記事を書くのが後回しになってしまいます。
今しばらくのご辛抱をお願いいたします。

さて本日のテーマですが、実は以前にND80ZVをご購入いただいたお客様からメールをいただきました。
仮想FDDについてよくわかりません。
ハードディスクに直接アクセスしているのでありませんか。
というような内容でした。

いや。そういうものではありません。
ごくフツーのWindowsファイル(厳密に言えばDOSファイル)です。
何も特別難しいことはしていないのですけれど。

仮想FDDについては[第219回]でざっと簡単に説明をいたしました。
主に構造について書きましたが、わかりにくかったもしれません。
仮想フロッピーディスクなどというと何かめちゃめちゃ難しくて特殊なものだ、と誤解されてしまいそうですが、特殊でも何でもありません。
ごくフツーのデータファイルです。
[第219回]で書きましたように、1レコードが128バイトで、それが全体として16384レコードからなるデータファイルを考えていただければよいのです。
そのほかには何の仕掛けもありません。
そのファイルの作り方については、[第166回]でフォーマットプログラムをご紹介しました。

あ。
もう一度、プログラムリストをお見せしましょうか。

//format of virtual disk drive(2MB)
//12/2/2 2/4 2/11 2/13 2/25
#include <stdio.h>
//
#define REC_SIZE 128L
//
void main()
{
        FILE *fp;
        int max_rec=16384;// 16sector*1024block
        int i;
        char dname;
        char inbf[80];
        char drivename[6]="a.vfd\0";
        unsigned char recdata[129]="\0";
        for(i=0;i<128;i++)recdata[i]=0xe5;
//
while(1){
        printf("drive no?(input a-d):");
        scanf("%s",inbf);
        if (inbf[0]>=0x41 && inbf[0]<=0x44)break;//A-D?
        else if(inbf[0]>=0x61 && inbf[0]<=0x64)break;//a-d?
        printf("bad drive no.\n");
        }
        dname=inbf[0];
        printf("フォーマットすると全てのデータが失われます。y:実行 n:中止\n:");
        scanf("%s",inbf);
        if(inbf[0]!=0x59 && inbf[0]!=0x79){printf("実行を中止しました\n");return;}
//
        drivename[0]=dname;
        fp=fopen(drivename,"wb+");
        for(i=0;i<max_rec;i++)fwrite(recdata,128,1,fp);// s
        fclose(fp);
        printf("end of format\n");
}
//end

たったこれだけの簡単なものですが、コアな部分はさらに短くて、実際にファイルを作成しているのは最後の数行だけです。
fopenでバイナリファイル(”wb+”)をオープンして、fwriteでレコードを必要個数作成して、最後にfcloseします。
ええ。
それだけです。
ああ。
フォーマットですから、上のほうで
for(i=0;i<128;i++)recdata[i]=0xe5;
を実行して128バイトのレコード全体をE5Hで埋めたヒナ型を作成して、それをfwriteのところで書き込んでいます。
ごくフツーのデータファイルですからWindowsのアプリケーションで開くこともできます。
ただバイナリファイルですから普通のアプリケーションでは開いてもゴミだらけの状態になってしまいます。

参考までに、仮想FDDファイルa.vfdをTeraPadで開いてみました。

「ファイルの種類」には「すべてのファイル」を指定します。
すると、こうなります。

改行コードがないため先頭のディレクトリ部分がずっと長い1行になっています(右に隠れています)。
その下にはCP/Mのプログラム(F80かBASIC80か?)らしきものが読み取れます。

ワードパッドでも開いてみました。


いかがでしょうか。
仮想FDDがごく普通のファイルであることが少しはご理解いただけましたでしょうか。

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

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