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

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



[第93回]


●TBF2TXT

前回は「中日電工版」TINY BASICにテキストファイルSAVE、LOADの機能を追加しました。
といってもその実体はZB3BASICのバイナリファイルをSAVE、LOADする/SV、/LDを利用してテキストエリアをバイナリファイルとして保存するようにしただけなのですが。
前の回に書きましたようにそうすることが精一杯のところなのです。
ちょいと面倒ではありますけれどそれでなんとかTINY BASICの「テキストプログラム」を保存することができるようになりました。

できるようにはなりましたが。

「テキストプログラム」なのにバイナリファイルとして保存しているために、メモ帳などのテキストエディタで開いて内容を確認してみることができません。
バイナリファイルであっても中身がプレーンテキストであれば、メモ帳で開いてみることはできます。
しかしTBFファイルはテキスト行の本体はプレーンテキストですが、行番号部分は完全にバイナリ化していますし、プログラム本体の前後のテキストではないバイナリデータの部分もあわせてSAVEしてしまっていますので、そのままではテキストエディタで開いてみることはできません。
なんとかプログラム本体のみを抜き出して、行番号部分をもとのテキスト形式に戻すことができれば、メモ帳などで開いてみることができるのですが…。
なるべく余計なことは考えないようにしようと思っているのですが、つい余計なことを考えてしまいます。

そういうファイル変換プログラムを作ればそのようにできるじゃありませんか(ほら、やっぱり考えてしまいました)。
これも面倒といえば面倒な方法かも知れませんが、無いよりはましでありましょう。
それほど難しいプログラムでもありませんから、即席で作ってしまいました。
TBFファイルをTXTファイルに変換しますから名づけてTBF2TXT.EXEです。
下がソースプログラムリストです。

// tbf to txt
// from htx2btk.cpp
//20/9/15 9/26
#include <stdio.h>
#include <string.h>
//
        FILE *rfp;
        FILE *wfp;
        char *fname;
///
void main(int argn,char *args[])
{
        int inbfn;
        int d;
        int i;
        int dendh;
        int dendl;
        int dend;
        int nh;
        int nl;
        int n;
        char strbf[10];
        char rfname[20];
        char wfname[20];
        char data[4096];
        if (argn!=2){printf("no file name!\n");return;}
        fname=args[1];
        strcpy(rfname,fname);
        strcat(rfname,".tbf");
        //file open
        if(!(rfp=fopen(rfname,"rb")))
                {printf("ファイルがみつからない %s\n",rfname);return;}// pass to end
        strcpy(wfname,fname);
        strcat(wfname,".txt");
        wfp=fopen(wfname,"wb");
//read file
        fseek(rfp,0,SEEK_END);
        inbfn=ftell(rfp);
        if(inbfn>4096)
                {printf("ファイルサイズが4096を越えている =%d\n",inbfn);return;}
        fseek(rfp,0,SEEK_SET);
        for(i=0;i<inbfn;i++)
                {
                d=fgetc(rfp);
                data[i]=d;
                }
        fclose(rfp);
//write file
        dendh=data[0x16]+256-0x90;
        dendl=data[0x15];
        if(dendl<0)dendl=dendl+256;
        dend=dendh*256+dendl;
        i=0x17;
        while(i<dend)
                {
                nl=data[i];
                nh=data[i+1];
                if(nl<0)nl=nl+256;
                if(nh<0)nh=nh+256;
                n=nl+nh*256;
                sprintf(strbf,"%d ",n);
                fputs(strbf,wfp);
                i=i+2;
                while(1)
                        {
                        d=data[i];
                        fputc(d,wfp);
                        i++;
                        if(d==0x0d){fputc(0x0a,wfp);break;}
                        }
                }
        fclose(wfp);
        printf("done\n");
}


[2020.9.26注記]プログラムミスがみつかりましたので修正済みのリストに差し換えました。

このプログラムで注意が必要なのは入力ファイル(TBFファイル)はRAMのアドレス9000から読み込んで作成したファイルであることが前提になっている点です。
//write fileのところでファイルエンドの情報をdata[0x16]とdata[0x15]から得ています。
ファイルの先頭がアドレス9000であることが前提なのでこういうプログラムになります。
前回TBFファイルの先頭はアドレス9000から始めるようにしてください、と書いたわけはそこにあります。

さて。
上のプログラムをBorland C++コンパイラ(BCC55)でコンパイルしました。
下はテスト実行してみたときの画像です。



前回作成したTEST2.TBFを読み込んでTEST2.TXTを作成します。
入力ファイルの拡張子はTBF限定です。
TBF2TXT TEST2[Enter]
のようにファイル名を拡張子をつけないでパラメータとして入力します。
作成されるファイルは入力したファイル名に拡張子TXTをつけたファイルになります。
上のテスト例ではTEST2.TBFが入力ファイルで作成されるファイルはTEST2.TXTです。
画面左側では作成されたTEST2.TXTをTeraPadで開いています。
前回作成したときのテキストプログラムの部分のみがテキストファイルとして作成されました。

復活!TINY BASIC[第93回]
2020.9.18upload

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