復活!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",§no); 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
前へ
次へ
ホームページトップへ戻る