MSXBASIC ビットイメージ 16進から2進(バイナリ)相互変換 LZH解凍 | MSXさいたま仮想鉄道ブログ

MSXさいたま仮想鉄道ブログ

A列車で行こう9の仮想鉄道ブログです。

今回はMSXのビットマップの圧縮を考えてみます。
単色の色を描いた場合に16進コードに変換できれば画像を保存するデータの節約になります。
ビットイメージは0~FF(0xff)までの16進数をビット配列に変換して画面に出力するものです。
HEXaの表記がFFhとかFFHで最後にhがついてBASICでは&Hになっています。
0x323Dの場合はVAL("&H"+"323D")になります。バイナリは&Bです。

50行から90行は出力のためのプログラムです。

 

座標系はXが右方向Yが下方向になっていますので、こんなふうになります。
BIN$で2が10、3が11というふうにビットに変換します。
ただ8ケタではないので11なら2桁ですから7桁+2桁を加えて右から8桁をカットします。
これを右から左に座標にビットを配置します。

0と1の2進数を視覚的にするとこのようなグラフィックが表示されます。
プリンタを制御した経験がある方はご存じかと思いますが、
00~FFのビットのイメージを横にしたもので、
これを元に当時はテストイメージを印刷していきました。
このイメージが出力できれば画面印刷できる具合でしたね。

 

これがメモリの場合はイメージが縦になります。

プログラムの座標系をYからXなどに変えます。



0~211のコードがこんなふうになります。
MSXの画面は縦が211までなので止めています。
例えばスプライトのデータを表示させることができますので
マシン語モニタにイメージを表示させることもできます。
ゲームのキャラクタデータなど一目でわかりますね。
2進から16進にするプログラムです。
40行で少しコンパクトにしています。


例えば□■■■□■■□なら01110110で76hとわかります。
プログラムを実行すると00000000と表示されるので1に変えてEnterキーを押したところです。
さらにダイレクトで入力すると10進数では118になります。
この76Hをメモリに書き込めばよいです。

MSXのVRAMで16ドットスプライトは左半面を(H)、右半面を(L)にして、
先にHを16ドット分書いてからLを書くことでデータになります。
 

これが16ドットエディタのひな形です。これを半面に分けてデータにします。

プログラムに時間がかかるのでパソコン通信時代ものを代用します。

LZHアーカイブになっているのでLhasaで解凍します。
Windows10ではLZHファイルを開く方法はその他のアプリでLhasaを選択します。
無事、解凍できました。アスキーファイルでロードします。


16ドットと32ドットとビットマップ用で今回は16ドット用にカスタマイズします。
カスタマイズという用語も初耳でカスタマイズできるとかピンときませんでした。
アーカイブとか当時はかなりPC用語が増えてきた感じでした。
特に今回はメモリデータからグラフィックやキャラクタを読めるようにもします。
VRAM操作してコードを高速で書き換えることで開いたり閉じたり開いたり閉じたりと
スプライトのような動的にみせるワザ(動画)などにも使えます。
大作ならグラディウスの地上物の砲台を動かしたりする処理でしょうね。

もっとカンタンに考えてみます。


こんなふうになります。
データ表示はH(上位)が01から始まって34の次はL(下位)で89から40です。
実際の書き込みは01FF01D3~700600348912~10410140になります。

この数値を書き換えればキャラが変わるようになります。




こんなふうにキャラクタを描いていきます。
コードを書けば単色のグラフィックができるのでビットマップデータをかなり節約できますね。

何でもいいので書き換えてみましょう。




簡単に塗りつぶしてみました。
クレーンで何かを運んでいるゲームみたいなものが出来そうです。
48と12ならカラで4FとF2なら積んでいるみたいにできますので、
数値が変わるアドレスに数値を入れればよいです。

 

これはビットイメージから地上のパーツに使おうと描いたものです。
ビットイメージを対象にして何か樹木のようなキャラになるのかなと
やはり16ドットはモザイク風になり複雑なものは無理ですが、
すぐに描ける利点があります。次はデータのロードと保存ですね、
編集中はVRAMに一時保存して書き込む方法でコマンドで保存できるようにします。
ページは1ページでテキストは簡易マシン語モニタ風にして共存できるようにします。
@があるとVRAMで1500Hなら@1500 : 3E3D217011みたいにしたいですね。

 


デバッグ中の画面です。VRAMに書き込む場所を赤ラインで示しています。
さらに6の赤をロードしています。SCREEN5は16色情報を上位下位に保存しています。
上位が複数px、下位が偶数pxで1バイト書き込むと2px分になり、
32バイトで64pxになりますからLINE(0,170)-(63,170),6で試し書きをしています。
ビット反映してみます。

 

ロードできるようになりドット編集ができるように準備ができました。
あとはファイルをロード、セーブできるようにします。

 

 

よく見るとラインは484848は赤が点になったり121212は緑が点になっています。
VRAMの色情報で画面の170ラインのエリアに書き込みました。

バグのような画面ですがVRAMに書くとこんなふうになります。
例えば音声データをVRAMに書き込むともっとバグった感じの画面になるわけです。
このエリアを超えるとスプライトパターンになって誤ってデータを入れると
画面にスプライトがついたりバグったりします。
拡張子はスプライトバイナリデータスクリーン5(SD5)として
ファイルはバイナリ形式の固定ファイル'SPX01.SD5'にしました。
起動するとファイルをロードして閉じると保存するようにします。
MSX環境の多様化のためDOSなど(BDOS)で対応し名前を変更するようにします。
BDOSはDISKBASICになっているので簡易なDOS操作が可能になります。

ディスクの保存版はできたのでモニタを作ることにしました。
あらかじめBLOADしておきます。
これはVRAMの5500HにRAMデータを書き込むことをします。

 

誤って不用意に書き込まないように確認メッセージを作りました。
モニタはインターラプトで復帰します。モニタ版は保存できません。



あとBlueMSXのキー配列はF12キーがリセットされるのでBSキーと間違えて押すことがたまにあります。
ブラインドタッチを誤ると落とし穴に落ちる感じです;
実はMSX2ってROMBASICがメインでMSX2+からDISKBASICに変わったので
MSX2ユーザーでマシン語モニタを作る人はほとんどいなかったと思います。
貧乏だったので10万円程度のディスクドライブを買うことができなかったのもあり、
テープ版で短いプログラムばかりでした。そんなこともあってデータの節約術は身についています。

 



ダウンロードはFULLMSXで2023/02/12の21時から予定しています。

FC2:FULLMSXのホームページ

 

ダウンロード版はまだ仮保存できる環境にしたものです。
RAM/VRAMモードはBLOADとBSAVEやVRAMならSCREEN5:SETPAGE3,3:BLOADみたいに
プログラムを書いてください。次回はスプライトをテストします。
講座というよりMSXパソコンで気になってやってみたいことをプログラミングしていきます。

 

PUTKANJIのように16ドットをパッと表示できるようなものを次世代化してみたくなりました。
漢字ではなく外字で図形イメージを作ればもっと16ドットが面白くなりそうです。
8ドットはMSX文字を表示できるようにしてみたいですね。これは次回にします。

 

最新版は@でSCREEN5のPAGE3のVRAMアドレスを指定します。
テストでは5500Hを使っています。SCREEN5を実行してもデータが残ります。

ビット化されているのでモンハンのようにアイテムがどっさり入る感じになります。
1ラインに8個入るので212ラインで1ページで1,696個(パターン)にもなります。

アイコンのようなものをどんどん作って入れておけば後で使うこともできます。

枠がかなり広くなると思いますw。スプライト版ではスプライトでアドレス移動ができるようになります。

こんなふうに@0000に44を00にしたい場合はドットを入れます。
ただまだ試作版でテスト中です。とにかくコマンドを減らしたいのでスクリプト式を考えています。