このページは前回と前々回の内容の理解を前提とした、まとめページとなります。そのため、直接こちらに飛んできた場合は、先に準備と実装のページを読んでいただくと助かります。

準備


実装


前回までの実装で Z80 のニーモニックのままで、展開処理を実行できる前準備が整いました。こちらは一つ一つ確実に処理を置き換えていきます。まずは Z80 ソースコードの冒頭部分です。
Z80ソースコード
次のこちらがコンバートした C# ソースとなります。
C#ソースコード
見ての通り、殆どそのまま各命令を置き換えているだけとなります。元々の処理系がアセンブラですので、どうしてもラベルジャンプは避けられず、結果、ここに見えているだけでも相当数の goto の記述になっています。C# としては大変汚いソースコードですね…。

なんていうか、まんまアセンブラソースに見えますよね…。そして、与えられた元データに異常がある場合は、延々とデコードし続ける、所謂暴走状態になります。その場合は、配列範囲外が起きる事を期待して try{}catch() してますが、ここは今後の課題になるかもです。理由はポインタが HL である以上、配列範囲外が出てくる可能性は小さいと思うのです。ここは、テーブルアドレス 0xFF00 を HL が超えたらとかの監視が必要になるかもです。与えるデータによっては暴走まで再現するはずなので、厄介ですよね…。

20240820-1830追記
安全装置をループの真ん中に設置してみました。
安全装置
最後にこのソースの使い方ですが、動作そのものは仮想 Z80 のメモリ空間内で実行します。そのため、冒頭の HL と DE の初期値は、適切に変更が必要です。
EXpDeexo
HL は解凍前のデータアドレス、DE は展開先のアドレスです。サンプルでは16KB程度の展開を行うつまりでアドレス設定をしていますが、32KBオーバーの場合は、HL = 0x8000 DE = 0x0000 ぐらいに変更するのが良いかと思います。そして、圧縮率によっては、展開後のサイズが 32KB を超えると、上手く展開できなくなるかもしれません。このあたりの調整は必要です。つまりは Z80 で動作するように調整が必要というデコードルーチンなのです。

Exomizer Decode CSharp.zip
20240819-1330

※これはもはや宝石箱やー!一気に食べちゃダメですよ、糖質とりすぎで太っちゃいますから。しかし、冷蔵庫にこんなん入ってたら辛坊たまらんかもですが^^;