G801 ROM解析事始

「G801 ROM解析事始」の編集履歴(バックアップ)一覧はこちら

G801 ROM解析事始」(2013/03/21 (木) 20:33:47) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

***目標  ・SDCCからG801のBASIC ROM内にある浮動小数点演算などをコールすることが出来るライブラリ関数を作る  ・シャープのポケコンはIOCSのコールアドレスやBASICのワークエリアに共通点が多いため。自他のG850系列の解析時の助けになることを期待する。  ・以上を実現するため、まずバンクの少ないG801のROMを解析してみる。  ・その過程、手順を逐次追記する ---- ***1日目  ネットで拾ってきたPC-E220マニュアル(ドイツ語版)等を参考に、G801のメモリマップを推測すると以下のようになる。 0000-1FFF RAM 2000-3FFF RAM IMAGE 4000-5FFF RAM IMAGE 6000-7FFF RAM IMAGE(BASICのワークとしてアクセス?) 8000-BFFF ROM BANK0固定 C000-FFFF ROM BANK1/BANK2/BANK3を切り替え  Z-80ではリセット時にプログラムカウンタが0000Hとなるため0番地付近がRAMではまずい。バンクのうちひとつがリセット時に0番地付近に割り当てられるのではと推測。  エミュレーターg800へのROM吸出し時にBANK0の先頭がC32C12 つまりJP 122CHとなっているのを見た。これはRAM領域へのジャンプであり不自然、BANK0がブートROMになっていて、リセット時には以下の様になるのではと推測。 0000-3FFF ROM BANK0 (ブートROMとしてここに割当てられる) 4000-7FFF ???(ROMが来るのかRAMが来るのか不明) 8000-BFFF ROM BANK0 C000-FFFF ROM BANK1/BANK2/BANK3 ---- ***2日目  以降、0000h~03FFFHにBANK0が割り当てられた状態をBANK4と呼ぶことにする。  g800用のROM吸出しプログラムを改造、本来のアドレスに置かれているようにインテルHEXファイルを出力しなおした。   BANK0 8000~BFFF   BANK1~3 C000~FFFF   BANK4 0000~3FFF(BANK0がこのアドレスに割当たっているとみなす) それを逆アセンブラhojaにかけて解析する。  吸出しプログラムが不完全なようでチェックサムエラーが出たり、逆アセンブルリストが表示されないバンクがあるが。BANK0,BANK4の逆アセンブルのみ成功。  その動作を追うと、0000HでJP 122CH(BANK4内)にジャンプした後IM1 DI BANK1をセットと処理した後。FFFAH(BANK1)番地にジャンプしている。  どうやらリセット後のシーケンスは以上の推測で当たりかと思われる。 ---- ***3日目  ポケコンの変数は全て浮動小数点であり、32767を超える数値に対してAND等のビット演算を行うことが出来ない。  多分それが原因でインテルHEXファイルが正確に出力されていないようで、チェックサムが合わない、ファイルが大きすぎるなどのエラーが続出、hojaに適合したヘキサファイルを作ることが出来なかった。  苦肉の策として、作ったヘキサファイルからバイナリファイルを作って逆アセンブルすることにした。  HSPで変換プログラムを作ってインテルヘキサ形式からバイナリに変換し、hojaに渡すときに-oXXXX オブションで配置されるアドレスを指定して逆アセンブルしてやると、すんなり成功。  とりあえずこれでG801の全バンクの逆アセンブルリストが得られた。  参考までに、HSP製変換プログラムと変換用バッチファイルを示す。  で、前回のリセット処理からちょっとだけ進む。 リセット時には普段8000HにあるBANK0が0000Hからにも割り当てられる 0000H番地から実行スタート 122CHへジャンプ 割り込みモード1、割り込み禁止 C000HからのバンクをBANK1にセット BANK1のFFFAHへジャンプする ----ここから今回---- FFFAHからすぐにC000H(BANK1)へジャンプ SPを7FFEH番地にセット いろいろI/Oに出力 .....  さて、これでやっとG801のROMを解析する準備が整った… ---- ***4日目以降の予定  ・ROMのどこを重点的に解析するかのあたりをつける  ・BASICの各種処理ルーチンを呼び出す前に、引数となる不動小数点数を格納する「浮動小数点アキュムレータ」なるものが必要な引数の数だけ存在するはず。マシン語のデータ列検索ルーチンを使ってその領域を特定してゆく。
***目標  ・SDCCからG801のBASIC ROM内にある浮動小数点演算などをコールすることが出来るライブラリ関数を作る  ・シャープのポケコンはIOCSのコールアドレスやBASICのワークエリアに共通点が多いため。自他のG850系列の解析時の助けになることを期待する。  ・以上を実現するため、まずバンクの少ないG801のROMを解析してみる。  ・その過程、手順を逐次追記する ---- ***1日目  ネットで拾ってきたPC-E220マニュアル(ドイツ語版)等を参考に、G801のメモリマップを推測すると以下のようになる。 0000-1FFF RAM 2000-3FFF RAM IMAGE 4000-5FFF RAM IMAGE 6000-7FFF RAM IMAGE(BASICのワークとしてアクセス?) 8000-BFFF ROM BANK0固定 C000-FFFF ROM BANK1/BANK2/BANK3を切り替え  Z-80ではリセット時にプログラムカウンタが0000Hとなるため0番地付近がRAMではまずい。バンクのうちひとつがリセット時に0番地付近に割り当てられるのではと推測。  エミュレーターg800へのROM吸出し時にBANK0の先頭がC32C12 つまりJP 122CHとなっているのを見た。これはRAM領域へのジャンプであり不自然、BANK0がブートROMになっていて、リセット時には以下の様になるのではと推測。 0000-3FFF ROM BANK0 (ブートROMとしてここに割当てられる) 4000-7FFF ???(ROMが来るのかRAMが来るのか不明) 8000-BFFF ROM BANK0 C000-FFFF ROM BANK1/BANK2/BANK3 ---- ***2日目  以降、0000h~03FFFHにBANK0が割り当てられた状態をBANK4と呼ぶことにする。  g800用のROM吸出しプログラムを改造、本来のアドレスに置かれているようにインテルHEXファイルを出力しなおした。   BANK0 8000~BFFF   BANK1~3 C000~FFFF   BANK4 0000~3FFF(BANK0がこのアドレスに割当たっているとみなす) それを逆アセンブラhojaにかけて解析する。  吸出しプログラムが不完全なようでチェックサムエラーが出たり、逆アセンブルリストが表示されないバンクがあるが。BANK0,BANK4の逆アセンブルのみ成功。  その動作を追うと、0000HでJP 122CH(BANK4内)にジャンプした後IM1 DI BANK1をセットと処理した後。FFFAH(BANK1)番地にジャンプしている。  どうやらリセット後のシーケンスは以上の推測で当たりかと思われる。 ---- ***3日目  ポケコンの変数は全て浮動小数点であり、32767を超える数値に対してAND等のビット演算を行うことが出来ない。  多分それが原因でインテルHEXファイルが正確に出力されていないようで、チェックサムが合わない、ファイルが大きすぎるなどのエラーが続出、hojaに適合したヘキサファイルを作ることが出来なかった。  苦肉の策として、作ったヘキサファイルからバイナリファイルを作って逆アセンブルすることにした。  HSPで変換プログラムを作ってインテルヘキサ形式からバイナリに変換し、hojaに渡すときに-oXXXX オブションで配置されるアドレスを指定して逆アセンブルしてやると、すんなり成功。  とりあえずこれでG801の全バンクの逆アセンブルリストが得られたので、前回のリセット処理からちょっとだけ進めることができた。 リセット時には普段8000HにあるBANK0が0000Hからにも割り当てられる 0000H番地から実行スタート 122CHへジャンプ 割り込みモード1、割り込み禁止 C000HからのバンクをBANK1にセット BANK1のFFFAHへジャンプする ----ここから今回---- FFFAHからすぐにC000H(BANK1)へジャンプ SPを7FFEH番地にセット いろいろI/Oに出力 .....  さて、これでやっとG801のROMを解析する準備が整った… ---- ***4日目以降の予定  ・ROMのどこを重点的に解析するかのあたりをつける  ・BASICの各種処理ルーチンを呼び出す前に、引数となる不動小数点数を格納する「浮動小数点アキュムレータ」なるものが必要な引数の数だけ存在するはず。マシン語のデータ列検索ルーチンを使ってその領域を特定してゆく。

表示オプション

横に並べて表示:
変化行の前後のみ表示: