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

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第94回]


●TXT2TBF

前回はTBFからTXTファイルを生成するTBF2TXTプログラムを作りました。
バイナリファイルを読み込んでテキストファイルを作成するプログラムがあるのでしたら、その逆の動作をするプログラムがあってもいいじゃないか、とまた余計なことを考えてしまいます。

ということで、今回はTXTファイルからTBFを生成するプログラムを作ってしまいました。
TXTファイルをTBFファイルに変換しますから名づけてTXT2TBF.EXEです。
下がソースプログラムリストです。

// txt to tbf
// from tbf2txt.cpp
//20/9/15 9/16 9/18
#include <stdio.h>
#include <string.h>
//
        FILE *rfp;
        FILE *wfp;
        char *fname;
///
void main(int argn,char *args[])
{
        int inbfn;
        int d;
        int e;
        int i;
        int j;
        int dendh;
        int dendl;
        int dend;
        int nh;
        int n;
        int dd;
        char strbf[10];
        char rfname[20];
        char wfname[20];
        char outdata[4096];
        if (argn!=2){printf("no file name!\n");return;}
        fname=args[1];
        strcpy(rfname,fname);
        strcat(rfname,".txt");
        //file open
        if(!(rfp=fopen(rfname,"rb")))
                {printf("ファイルがみつからない %s\n",rfname);return;}// pass to end
        strcpy(wfname,fname);
        strcat(wfname,".tbf");
        wfp=fopen(wfname,"wb");
//read file
        fseek(rfp,0,SEEK_END);
        inbfn=ftell(rfp);
        fseek(rfp,0,SEEK_SET);
        j=0x17;
        i=0;
        while(i<inbfn)
                {
                dd=0;
                while(1)
                        {
                        d=fgetc(rfp);
                        i++;
                        if(d<0x30)break;
                        if(d>0x39)break;
                        dd=dd*10+d-0x30;
                        }
                nh=dd/256;
                n=dd%256;
                outdata[j]=n;
                j++;
                if(j>4096){printf("出力データサイズが4096を越えた(a)\n");return;}
                outdata[j]=nh;
                j++;
                if(j>4096){printf("出力データサイズが4096を越えた(b)\n");return;}
                e=0;
                while(1)
                        {
                        if(d!=0x20)break;
                        d=fgetc(rfp);
                        i++;
                        if(i>=inbfn){e=1;break;}
                        }
                if(e==0)
                        {
                        while(1)
                                {
                                if(d>=0x61 && d<=0x7A)d=d-0x20;//'a'-'z'-->'A'-'Z'
                                outdata[j]=d;
                                j++;
                                if(j>4096){printf("出力データサイズが4096を越えた(d)\n");return;}
                                d=fgetc(rfp);
                                i++;
                                if(i>=inbfn)break;
                                if(d==0x0a)break;
                                }
                        }
                }
        fclose(rfp);
//write file
        dendh=j/256+0x90;
        dendl=j%256;
        for(i=0;i<0x15;i++)outdata[i]=0;
        outdata[0x15]=dendl;
        outdata[0x16]=dendh;
        for(i=0;i<=j;i++)
                {
                d=outdata[i];
                fputc(d,wfp);
                }
        fclose(wfp);
        printf("done\n");
}


前回のTBF2TXTに比べるとかなり複雑です。
TBF2TXTの場合には主としてバイナリコードで書かれた文字列をそのまま抜き出してファイルにすればよいだけでしたので、割と簡単なプログラムでしたが、今回はTINY BASICの仕様に合わせてバイナリ化しなければならないため、それだけ複雑なプログラムになってしまいました。

今回もBorland C++コンパイラ(BCC55)でコンパイルしました。
なお今回テストに使ったTXTプログラム(TEST3.TXT)を下に示します。

10 rem tiny basic test
20 for x=0 to 25
30p.x,
40n.x


テストのため行番号と命令文の間にスペースを入れた行と行番号の後ろに間を空けないですぐに命令文を書いた行があります。
下はTXT2TBF.EXEでTEST3.TXTを読み込んでテスト実行してみたときの画像です。



TXT2TBF.EXEの実行によって作成されたTEST3.TBFをまずDIRコマンドで表示させてみました。
確かに作成されていることが確認できました。
ファイルサイズがわずか75バイトと非常に小さいです。
TXT2TBF.EXEでは作成するバイナリファイルの開始アドレスは9000を想定していますが、終わりは9FFFではなくて、実際にバイナリ変換した場合のプログラムの終わりのアドレスまでのファイルとして作成するからです。
念のためDEBUGコマンドでTEST3.TBFの中身を確認しました。
DEBUGコマンドで開いた場合のアドレス0149がファイルエンドです。
このファイルをND80Z3.5のRAMアドレス9000から/LDコマンドでロードしたとき最終データはアドレス9059になります。
そのアドレスに+1したアドレス(905A)がTINY BASICのTXTUNFのデータになります。
DEBUGコマンドで確かめたアドレス0115、0116にその値があります。
0115、0116はアドレス9000からロードしたときTXTUNFのアドレス9015、9016になります。
ちゃんとうまく変換できているようです。

念のため本当にこのファイルをメモリに読み込んでTINY BASICで正しく実行できるかどうか試してみました。



正しくリスト表示でき、正しく実行できました。

復活!TINY BASIC[第94回]
2020.9.19upload

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