G801 ROM解析事始

目標

 ・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の各種処理ルーチンを呼び出す前に、引数となる不動小数点数を格納する「浮動小数点アキュムレータ」なるものが必要な引数の数だけ存在するはず。マシン語のデータ列検索ルーチンを使ってその領域を特定してゆく。
最終更新:2013年03月21日 20:33