2024-02-08 21:54 — asano
カテゴリー:
SC61860対応ができたので、続いてSC62015の対応を進めます。
SC62015はSC61860から一転かなり厄介です。ニーモニック数が少ないのに対し、アドレッシングモードが複雑だからです。
ASはアーキテクチャ共通の動作としてソースの1行をラベル部・ニーモニック部・オペランド部に分割し、さらにニーモニック部によって各デコードルーチンに分岐してくれます。IM6100のようにこのフォーマットが特殊な場合はちょっと面倒ですが、そうでなければお任せにすることができます。
一方でオペランドのパースは自分で書かなくてはなりません。
SC61860のオペランドは定数のみで、定数式の評価ルーチンは用意されているのでほぼ呼び出すだけですみました。
SC62015では定数式(即値)の他に複雑なアドレッシングモードの表記があり、中でも厄介なのが[(BP+12)+16]
のような内部RAM・ベースアドレッシングです。これ動作としてはBPレジスタの値に12を加えたアドレスの内部RAMから20ビットのアドレスを読み出し、それに16を加えたアドレスが実効アドレスになります。
さて、これをどうパースするかですが......
まず先頭の[
と末尾の]
をチェックします。MN1610対応のときは自分で書いてしまいましたが、IsIndirectGen(str, "[]")
という専用のルーチンが存在していました。今回はこれを使用します。
続いて(
, BP
, +
まではいいのですが、12
の部分は任意の定数式なので評価ルーチンを呼び出すことになります。ところがこの評価ルーチン、後ろに余計なものがついているとエラーになってしまうので)
の手前までを切り出さなくてはならないのですが......
)
の位置はどう見つければよいのでしょうか?
12
の部分は今回は数値定数ですが、任意の式が書けるので単純に)
にサーチするだけではダメです。括弧が入れ子になっているかもしれないので「開き」と「閉じ」の括弧を数えなくてはなりません。'('
のような文字定数の括弧は除外しなくてはならないのでクオート・ダブルクオートも考慮しなくてはなりません。さらに'\''
のようなエスケープも考えなくてはなりません。
こんなの本来は式評価ルーチンの仕事だと思うのですが......
EVAL
は想定外の文字を見つけるまで評価してその位置も返します。呼び出した側が必要ならエラーの判定を行ないます。Universal Monitorの16進評価ルーチン
RDHEX
も同様です。
同様の処理が必要になるNS32kのコードジェネレータcodens32k.c
を参考に読んでみたところ、FindClosingParenthese(str)
という閉じ括弧を探す専用のルーチンが存在しました。
Bld261で修正が入っています。
これで一通りの実装が出来たわけですが、JR
のディスプレースメント計算時の原点はどこか、内部RAMアクセス時のPX
, PY
の使い分け、など参考にした「ポケコン うらわざ大事典 特別版」の解釈に不安がある項目が残りました。別な資料で確認を取りたいところです。
ということで再度検索をしていたところ「ESR-L Instruction Manual」という資料を発見しました。シャープ自身によるマニュアルです。これによると......
JR
の原点は次の命令(これはZ80などと同じ)のようです。
PX
, PY
はこれまでデスティネーションはPX
でソースがPY
だと思っていたのですが、両方で内部RAMを選択したときのソースがPY
の他は全てPX
を使用するようです。
前回付けたパッチにはここまで反映しています。
その後シャープによるSC61860の資料を教えていただいたので次回はそれについて書こうと思います。余裕があったらテストデータの作成についても書くかもしれません。
コメントを追加