uPD70616 あせんぶらその3

アドレッシングモード

[disp[Rn/PC] ] の構文解析は実装完了。文節の先頭と最後に[]があるか確認して、] を \0 にすり替えて、1文字ずらした上で disp[Rn/PC] の解析関数に飛ばす。その結果を見て、モードを2重indirect にすげかえる。

残りの [disp[Rn]](Rx) は実装できていない。前述のごまかしを利かせるのが面倒そうだから。 C で力業な解析は面倒なので正規表現を使いたい。それだったらマッチも加えて \[(.+)\[(PC|R[0-9][0-9]|SP)\]\]\((R[0-9][0-9])\) みたいな形でとれるのになー。

これを商売に使うわけでもないし、需要は私とのすけさんだけだからまあいいや。

Mame ビルド

Mingw を替えたりしたのでついでにコンパイルしなおすかと思ったら、おもいっきりはまって半日使った。一通り作業をしたあと、公式で配布されているバイナリで要求を満たすことに気づく。はー情けない。

pseudo

ROM に命令を埋め込むところまできたので、目的のプログラムを書く。そうするとあらがでてくる。

  • pop, push 系の型は w が標準だが指定しない、暗黙の型の実装ができていない
  • popm, pushm 系の型が特殊
  • Format III の実装にバグがあった。 opcode の bit0 に m をいれるなんて。
  • not の引数が2つでなにそれとか、 btst みたいな bit 判別ってどーやるのとか基本知識がイマイチ。

これらを修正して目的のプログラムが動き出したので今日中に終わるなと思って、画面出力の仕様を眺める。... よくわからん。2時間使って仕様はわかったのでプログラムを書いてみるか。pseudo の実装がまったくできてない。

データを置く pseudo をみたところ、 intel 系と moto 系の関数が使える。命令名称は intel 系は db, dw, dd となっており、moto 系は dc.? となっている。uPD70616 は h が 16bit, w が 32bit で dw, dd を使うと混乱するのでナシだなと思い、moto系を採用。

よくよく調べると moto 系の実装は関数のネストが異様に深くて読めないし、big endian 決めうちだった。 moto 系 le の 6502 は 16bit までで別実装だし... というわけでアセンブラ側の改修まで来た。

あと1日かかるのは確定したので、別作業をやったほうがよさそう。