2015.2.20

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第136回]


●BTKおよびBINファイル作成プログラム(2)

前回説明をしましたBTKおよびBINファイル作成プログラムHTOB.EXEですが、実は最初にプログラムを作ってテストをしてみましたら、実に気持ちの悪い動作をすることに気が付きました。
最初はどうしてそういうことになるのか、全く見当がつかず、しばらくあれこれネットを検索して調べてみたりして悩んでいました。

そのうちに
あ。
そういうことだったのか、とやっと気が付いたのでしたが。
これをそのままにしておきますと、いつかそのうちに、また同じことで悩んでしまうかもしれません。

忘れないようにノートに書き留めておけばよろしいのですけれど。
悲しいことに、ノートのどこに書いたのか、じきに忘れてしまいます。
それどころか、ノートに書いたことすら忘れてしまいますから、もうお話にもなりません。

そこで、こうやって、備忘録がわりに、HPに書いておくことにいたしました。

うむむ。
せんだってのように、HPに書いたこともやっぱり忘れてしまいますから、どこに書いても同じことか。

あ。
しかし。
ノートに書いたものを後で探し出す場合には、自力によるほかはありませぬ(これには大変なエネルギーが要りまする)。
HPに書いた場合には、ひょっとするとGoogleさまにお尋ねすれば教えてくれるやも知れませぬ。

でありますから、やっぱりノートではなくて、ここに書きとめておくことにいたします。

何が起きていたのかといいますと。
下が気が付かずにうっかり間違えてしまったプログラムです。
ええ。
間違っているところがあります。

// translate from htx to btx & bin
//
#include <stdio.h>
#include <string.h>
        FILE *htxfp;
        FILE *btkfp;
        FILE *binfp;
        char htxfname[50];
        char btkfname[50];
        char binfname[50];
        int n;
        int c;
        int i;
        int j;
        int k;
        int H;
        int L;
        int x;
//
        int hextobin();
//
void main(){
        printf("infilename=");
        gets(htxfname);
        n=strlen(htxfname);
        i=0;
        while(i<n){
                btkfname[i]=htxfname[i];
                binfname[i]=htxfname[i];
                if(htxfname[i]==0x2e)break;
                i++;
                }
        if(i==n){
                strcat(htxfname,".htx");
                strcat(btkfname,".btk");
                strcat(binfname,".bin");
                }
        else{
                strcat(btkfname,"btk");
                strcat(binfname,"bin");
                }
        printf("infile=%s\n",htxfname);
        printf("outfile1=%s\n",btkfname);
        printf("outfile2=%s\n",binfname);
        htxfp=fopen(htxfname,"r");
        if(!htxfp){printf("%s cannot open\n",htxfname);return;}
        btkfp=fopen(btkfname,"wb");
        if(!btkfp){printf("%s cannot open\n",btkfname);fclose(htxfp);return;}
        binfp=fopen(binfname,"wb");
        if(!binfp){printf("%s cannot open\n",binfname);fclose(htxfp);fclose(btkfp);return;}
//
        printf("start to convert\n");
        i=0;
        j=0;
        k=0;
        while(1){
                c=fgetc(htxfp);
                if(c==EOF)break;
                H=c;
                i++;
                c=fgetc(htxfp);
                if(c==EOF)break;
                i++;
                L=c;
                if(!hextobin()){printf("\n***error! not HTX\n\n");break;};
                fputc(x,btkfp);
                j++;
                if(j>4){fputc(x,binfp);k++;}
                }
        fclose(htxfp);
        fclose(btkfp);
        fclose(binfp);
        if(i==0)printf("\n***error! file is empty\n\n");
        printf("%s=%dbytes\n",htxfname,i);
        printf("%s=%dbytes\n",btkfname,j);
        printf("%s=%dbytes\n",binfname,k);
        printf("end\n");
}
//
int hextobin(){
        if(H>=0x30 && H<=0x39)x=(H-0x30)*16;
        else if(H>=0x41 && H<=0x46)x=(H-0x37)*16;
        else return 0;
        if(L>=0x30 && L<=0x39)x=x+(L-0x30);
        else if(L>=0x41 && L<=0x46)x=x+(L-0x37);
        else return 0;
        return 1;
        }
//  
私はずっとフリーのCコンパイラBorland C++ V5.5を使っています。

朗報です!!
Borland C++ V5.5は一時供給を停止してしまっていました。
ところが念のためネットで検索してみましたら、いまでも無償で入手できることがわかりました。
供給元はエンバカデロhttp://www.embarcadero.com/jp/products/cbuilder/free-compilerです。
Borland C++はエンバカデロ(embarcadero)に身売りされたようです。
いつまたほかに身売りされてしまうかわかりませんから、今の内にダウンロードしておくことをおすすめします。

えっと。
それで、上のプログラムをコンパイルしますと。

エラーにもならずにコンパイルが終了します。
そこでさっそく実行してみますと。

見たところまともに実行されているように思えるのですけれど。
よっく見ますと、おかしなところがあります。
mvftst1.htxのサイズが163bytesになっています。
おかしいじゃありませんか。
htxファイルは1バイトのデータをHEX表示にしてそれをASCIIに直したものですから、偶数にならなければおかしいです。
期待していたのは162バイトなのです。
なぜか、1バイト多い?

MVFTST1.HTXのプロパティを確認してみました。

ほらね。
164バイト。偶数です。
え?
164バイト?
162バイトじゃない?

DEBUGコマンドでMVFTST1.HTXの中身を確認してみました。

おお。
最後に0D0Aがあります。
念のためにASM80.COMのソースを確認してみました。
確かにHTXファイルの最後には0D0Aコードがつけ加えられることを確認しました。

しかし。
それならば。
mvftst1=164bytesでなければならないはず。
いや、そもそも最後に0D0Aの2バイトを読み込んだ時点で、それはASCIIコードではありませんから、それなら
not HTX のエラーメッセージが表示されるはずです。
うむむ。
何かがおかしい。

さて、C++に詳しいお方でしたら、私がやってしまった間違いにお気付きのことと思います。

ですが、本日も説明書作成の最終作業に取り組んでおりまして、時間がありません。
この続きは次回に書くことにいたします。

MYCPU80でCP/Mを![第136回]
2015.2.20upload

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