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

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

[第166回]


●仮想FDDフォーマットプログラムVFORMAT.EXE

前回は、/LDコマンドの説明をいたしました。
CP/M互換DOSでは、「RAM」の0100番地から始まるトランジェントエリアにユーザープログラムをロードしなければなりません。
そこで/LDコマンドを少し変更して、アドレス0000〜7FFFの範囲を指定したときはRAMを選択して、そこにロードするようにしました。

これでやっとCP/M互換DOSのテストに入れます、と前回は書きましたが、まだ肝心要のものが残っていました。
仮想フロッピーディスクドライブです。

CP/Mシステムを動かすにはフロッピーディスクが必要不可欠です。
しかし、今更フロッピーディスクはいくらなんでも時代遅れです。
いまどきは1TBなんて少し昔ならば想像すらできなかったような超大容量のハードディスクもごく当たり前になってしまいました。
このハードディスクを使わない、という手はありません。

ただ時代遅れであろうとどうであろうと、CP/MはれっきとしたDOS(Disk Operation System)です。
CP/Mのルールでフォーマットしたディスクをアクセスして使いますから、Windowsのディスクシステムをそのまま使う、というわけにはいきません。

そこで前々からコメントしております仮想FDD(仮想フロッピーディスクドライブ)システムを考えました。
Windowsから見れば、Windowsのディスクシステム上のデータファイルなのですけれど、CP/M互換DOSから見ればCP/M用のフロッピーディスクドライブがそこにある、というものです。

仮想FDDなどといいますと、なんだかとてつもなく難しいもののように思えるかもしれませんが、それほどむつかしいものではありません。
かってND80ZVのRAM上に仮RAMディスクなるものを作りました([第10回]参照)。
それの大規模なものをWindowsのハードディスク(通常Cドライブ)上にファイルとして作成するだけです。

文章で説明をしているより見ていただいたほうが早いですね。



普通ですとND80ZVのZB3BASICのシステムはND80Z3フォルダに置くのですけれど、今はデバッグ中ですから、CPP(C++)フォルダの中にND3ZBDOSというフォルダを作って、そこでテストをしています。

そのND3ZBDOSフォルダの中を見ていただきますと、上のほうにa.vfdとb.vfdというファイルがあります。
これが仮想フロッピーディスクドライブです。
CP/Mでは最大8MBのフロッピーディスクまで扱うことができました。
しかしいきなり8MBもの容量にしますと、いろいろ面倒なことが出てきますので、今は適当なところで2MBの仮想FDDとしてAドライブとBドライブを作成しました。

そこで、やっと本日のテーマになりました。
この仮想FDD(フロッピーディスクドライブ)ファイルはどのようにしてつくるのか、というお話です。
もちろんプログラムで作ります。
Windowsのファイルとして作りますから、C++(Borland C++)のプログラムとして作ります。
Borland C++は以前に、CPUをつくろう![第189回]CPUをつくろう![第278回]PICでUSBを![第40回]で紹介をいたしました。

下が仮想FDDファイルを作成するVFORMAT.EXEのソースプログラムリスト(VFORMAT.CPP)です。
ご覧の通り、たったこれだけの簡単なプログラムです。

//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

本当はこのプログラムについても、簡単に説明をするとよいのですけれど、そこまでしておりますと、なかなか先へ進めません。
いずれそのうち、ということで、ここはソースリストをお見せするだけ、ということにいたします。

実際に使っているところをお見せしましょう。



VFORMATを実行すると、新規作成(またはフォーマット)するドライブ名を聞いてきます。
CP/MではA〜Pまでのドライブを扱えますが、まだテスト中ですからA〜Dまでが対象です。
ここではc[Enter]と入力しました。
続いて
y[Enter]と入力すると、作業は瞬時に完了し、
end of format
と表示されます。
DIRコマンド(ややこしいですけれど、CP/Mのコマンドではありません。MSDOSのコマンドです)で、C.VFDがちゃんと作成されたことを確認できました。

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

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