このページは前回と前々回の内容の理解を前提とした、まとめページとなります。そのため、直接こちらに飛んできた場合は、先に準備と実装のページを読んでいただくと助かります。
前回までの実装で Z80 のニーモニックのままで、展開処理を実行できる前準備が整いました。こちらは一つ一つ確実に処理を置き換えていきます。まずは Z80 ソースコードの冒頭部分です。
準備
実装
前回までの実装で Z80 のニーモニックのままで、展開処理を実行できる前準備が整いました。こちらは一つ一つ確実に処理を置き換えていきます。まずは Z80 ソースコードの冒頭部分です。
次のこちらがコンバートした C# ソースとなります。
見ての通り、殆どそのまま各命令を置き換えているだけとなります。元々の処理系がアセンブラですので、どうしてもラベルジャンプは避けられず、結果、ここに見えているだけでも相当数の goto の記述になっています。C# としては大変汚いソースコードですね…。
なんていうか、まんまアセンブラソースに見えますよね…。そして、与えられた元データに異常がある場合は、延々とデコードし続ける、所謂暴走状態になります。その場合は、配列範囲外が起きる事を期待して try{}catch() してますが、ここは今後の課題になるかもです。理由はポインタが HL である以上、配列範囲外が出てくる可能性は小さいと思うのです。ここは、テーブルアドレス 0xFF00 を HL が超えたらとかの監視が必要になるかもです。与えるデータによっては暴走まで再現するはずなので、厄介ですよね…。
20240820-1830追記
安全装置をループの真ん中に設置してみました。
最後にこのソースの使い方ですが、動作そのものは仮想 Z80 のメモリ空間内で実行します。そのため、冒頭の HL と DE の初期値は、適切に変更が必要です。
HL は解凍前のデータアドレス、DE は展開先のアドレスです。サンプルでは16KB程度の展開を行うつまりでアドレス設定をしていますが、32KBオーバーの場合は、HL = 0x8000 DE = 0x0000 ぐらいに変更するのが良いかと思います。そして、圧縮率によっては、展開後のサイズが 32KB を超えると、上手く展開できなくなるかもしれません。このあたりの調整は必要です。つまりは Z80 で動作するように調整が必要というデコードルーチンなのです。
20240820-1830追記
安全装置をループの真ん中に設置してみました。
最後にこのソースの使い方ですが、動作そのものは仮想 Z80 のメモリ空間内で実行します。そのため、冒頭の HL と DE の初期値は、適切に変更が必要です。
HL は解凍前のデータアドレス、DE は展開先のアドレスです。サンプルでは16KB程度の展開を行うつまりでアドレス設定をしていますが、32KBオーバーの場合は、HL = 0x8000 DE = 0x0000 ぐらいに変更するのが良いかと思います。そして、圧縮率によっては、展開後のサイズが 32KB を超えると、上手く展開できなくなるかもしれません。このあたりの調整は必要です。つまりは Z80 で動作するように調整が必要というデコードルーチンなのです。
Exomizer Decode CSharp.zip
20240819-1330
森永乳業
2024-05-20
コメント