メモリカード読み込み

EDU mk2用のnicoBasicにメモリカード読み込み機能(fopen、fread、fclose)を付けてみました。
まだ実験中です。

1 dim buf(40)
2 fopen "test.bmp"
3 fread buf,14
4 fclose
5 for i=0 to 13
6 print buf(i)
7 print ","
8 next


▲ファイルダンプの実行結果。
test.bmpというファイルの先頭14バイトを読み込んでいます。
読んだデータは配列に入ります。
読み込めるサイズはたったの50バイトだけ、、、これから改善します。


↑↑テスト画像です。
これをBMPファイル「test.bmp」で保存します。
サイズは122x32pixel。モノクロ2値で保存しました。


test.bmpのファイルダンプです(16進数)。実行結果と見比べると、合ってることがわかります。

このBMPファイルの構造は次のとおりです。
・ピンクの部分:fileヘッダ14バイト
・白の部分:infoヘッダ40バイト。画像サイズやビット深度などの情報です。
・水色の部分:パレット情報(2色x4)=8バイト。
・黄色の部分:ビットマップデータ。一番下のラインから格納しています。

1 cls:dim buf(40)
2 fopen "test.bmp"
3 fread buf,14
4 fread buf,40
5 fread buf,8
6 for y=31 to 0 step -1
7 x=0:fread buf,16
8 for i=0 to 15
9 msk=128
10 while msk
11 if msk and buf(i) then pset x,y,1
12 x=x+1:msk=msk/2
13 wend
14 next
15 next
16 fclose


BMPファイルの表示プログラムの実行結果。
見事にBMPファイルが表示されました。

プログラムでは先頭62バイトのヘッダを読み飛ばしています。
1画面ぶんのデータをいっぺんに配列に格納できないので、1ラインずつpset命令で描画しています。
1ラインあたりのバイト数は(122pixel / 8)+1=16バイト。8の倍数ではないので、+1させています。

動作は遅いです。
表示が終わるまでに16秒くらいかかってしまいました。
これもなんとか改善したいです。


↓nicobasicのバイナリです。
http://sourceforge.jp/projects/nicobasic/releases/