CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ファイルフォーマット

SDカード内に出来上がったファイルはカードアダプタを介してPCのエクスプローラで読取り
できるのですが、お絵かきツールで画像データとして開こうとすると「ファイルが壊れている」
とかいわれて開くことができません。

同じサイズの空のbitmapファイルをPC上で作成してそれぞれバイナリエディタで開いてみると
ヘッダの中のサイズや解像度を示す数値のエンディアンがひっくり返っていることが判りました。

bitmapファイルのヘッダは以下のように定義されますが、各要素の数値はリトルエンディアンで
設定しなければダメと言う事です。IntelのCPUではそのまま代入すればよかったのですけど。

/* ビットマップヘッダ 14byte */
typedef struct tagBITMAPFILEHEADER {
  unsigned short bfType;
  unsigned long  bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned long  bfOffBits;
} BITMAPFILEHEADER;

/* 情報ヘッダ 40byte */
typedef struct tagBITMAPINFOHEADER{
    unsigned long  biSize;
    long           biWidth;
    long           biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long  biCompression;
    unsigned long  biSizeImage;
    long           biXPixPerMeter;
    long           biYPixPerMeter;
    unsigned long  biClrUsed;
    unsigned long  biClrImporant;
} BITMAPINFOHEADER;

モトローラの流れを汲むH8では数値表現はビッグエンディアンなので
代入前にint型2バイトとlong型4バイトのエンディアン変換を挿入しました

  bhead.bitmapfileheader.bfType=	endianS('B'|('M'<<8));
   bhead.bitmapfileheader.bfSize=	endianL(sizeof(BITMAPFILEHEADER)+imgsize);
   bhead.bitmapfileheader.bfReserved1=	endianS(0x00);
   bhead.bitmapfileheader.bfReserved2=	endianS(0x00);
  bhead.bitmapfileheader.bfOffBits=	endianL(hdrsize+pltsize);

    bhead.bitmapinfoheadr.biSize=	endianL(sizeof(BITMAPINFOHEADER));
    bhead.bitmapinfoheadr.biWidth=	endianL(XSIZE);
    bhead.bitmapinfoheadr.biHeight=	endianL(YSIZE);
    bhead.bitmapinfoheadr.biPlanes=	endianS(1);
  bhead.bitmapinfoheadr.biBitCount=	endianS(8);
    bhead.bitmapinfoheadr.biCompression=   endianL(0);
   bhead.bitmapinfoheadr.biSizeImage=	endianL(imgsize);
    bhead.bitmapinfoheadr.biXPixPerMeter=  endianL(0xb88);
    bhead.bitmapinfoheadr.biYPixPerMeter=  endianL(0xb88);
    bhead.bitmapinfoheadr.biClrUsed=       endianL(0);
    bhead.bitmapinfoheadr.biClrImporant=   endianL(0);

TCP/IPプロトコルスタックを作ったとき同じようなミスをしていたのを思い出しました。
修正したコードで再度ファイルを作ると、今度はペイントでファイルを開けました

イメージ 1

                               (原寸大)
小さっ! しかも真っ黒だし