2022-07-12 13:41 — asano
カテゴリー:
Nanoprocessor対応はAS-users MLに投げて無事本家にマージされました。
で次は何をやろうかなと考えているわけですが、V60は作者のAlfredさんが取り組んでいるような書き込みがありましたし、TRONは気軽に手を出せるようなシロモノではありません。
HD1-6120ボード(ソフトウェア編)で短ループのテストしただけになっているIM6100 / HD1-6120がASで使えるようになればUniversal Monitor移植も視野に入ってきます。
やってみたいのですが... IM6100系のアセンブラは結構特殊なところがあって楽ではなさそうです。気になる点について実現方法を考えてみました。
複合命令
やはりIM6100系の特徴といえばこの複合命令でしょう。通常、命令語は機能を表す部分が一つとその対象を表す部分がいくつか(0のこともある)で構成されていますが、IM6100系には機能を表す部分が複数あるのです。
例えばOperate Instruction (Group 3)というグループの命令は以下のようになっています。
1 | 1 | 1 | 1 | CLA | MQA | - | MQL | - | - | - | 1 |
CLA, MQA, MQLをすべて0にした7401(8)(IM6100系では通常8進表記します)はNOP
命令(何もしない)、CLAのみ1にした7601(8)はCLA
命令(ACをクリア)、MQAのみ1にした7501(8)はMQA
命令(MQとACの論理和がACに入る)、MQLのみ1にした7421(8)はMQL
命令(ACの値をMQにいれ、ACをクリア)です。
MQAとMQLを1にした7521(8)にはSWP
命令(ACとMQを入れ替える)というニーモニックが特別に用意されていますが、MQA MQL
という書き方もできます。
さらにACL, MQA, MQLをすべて1にした7721(8)は専用のニーモニックは無くCLA SWP
などと書くしかありません。
このニーモニックが複数並ぶというのがAS的にはちょっと厄介です。
- 複数行に分けて記述
ニーモニックによる分岐の仕組みをそのまま利用し、直前の命令と一緒にできるなら一緒にする(ざっと見ただけですがμPD7720がこれに近いことやっているような) - 組み合わせニーモニックを登録
空白は含められないので「CLA/SWP」のように考えられる組み合わせのニーモニックを片っ端から登録する - オペランドでテーブルを引く
2つ目以降はオペランドとしてArgStr[]
に入っているのでテーブルを引き直す
なるべくオリジナルのアセンブラ書式に合わせるという点では3がよいですが、有効な組み合わせかの判定が大変そうです。楽なのは2ですね。
区切り文字
複数のオペランドを持つ命令はありませんが、インダイレクトアドレッシングのJMP I LABEL
のように「I」とラベルの間を空白にしようとするとDivideChars = " ";
としなければなりません。
また複合命令で3を採用する場合もこうしておかないと1つ目と2つ目のニーモニックの間は空白、2つ目と3つ目の間は「,」などということになってしまいます。
これやると式に空白使えなくなったり悪影響が大きそうです。
8進数
オリジナルでは8進なんですが...
強制的にRADIX 8
してしまうのは影響が大きすぎるかな。
リスト出力はlistradix=8すれば見やすくはなりますが、16ビット分表示されてしまうんですよね。これ変更する方法あるのかな。
定数
ニーモニックの代わりにラベルや定数を書くとその値が配置される機能、独自のIOT命令などを簡単に定義できるし、DEFB
みたいな疑似命令を用意しなくていいのは楽なのですが...
if (!LookupInstTable(InstTable, OpPart.str.p_str))
WrStrErrorPos(ErrNum_UnknownInstruction, &OpPart);
MakeCode_xxxx()
のここでエラーにする前に式評価できるか試せば良いのかな。
文字列
文字列はどうするのが良いでしょう?
- 12ビットの下8ビットにASCIIのまま入れる
- 何らかのテーブルで6ビットにしてパックする
コメントを追加