2022-07-30 21:24 — asano
カテゴリー:
HD1-6120ボードを作ってから約2年、ASが使えるようになったのでUniversal Monitorの移植に着手しました。
ボード完成以来ソフトウェア編での無限ループ確認くらいしかしていなかったのですが、やっとまともなプログラムが動かせます。いくつかあった問題は、ASはIM6100対応を行ない、EMILY Boardも12ビット8進表示モードを作ったことでほぼ解決しています。
残るUniversal Monitorの仕様は... 常に8進表示でダンプ時のASCII表示は無しとすることにします。
そう決まればあとは黙々と実装するのみです。
現在 D(ump), G(o), S(et) の各コマンドができて L(oad) はインテルHEXのみ実装してデバッグ中といった状況です。
ある程度のプログラムを書いてこのIM6100の癖がわかってきたので書いてみたいと思います。
- イミディエイトがない
これはASのIM6100対応(その4)でも書きました。 - 単純なロード・ストアもない
メモリからアキュムレータへのロード命令はないので先にクリアしておいてから加算します。ストアはDCA
命令で可能ですが、ストア後にアキュムレータを勝手にクリアしてしまうので要注意。 - 加算はあれども減算はない
加算命令TAD
はありますが減算命令はありません。インクリメントIAC
はありますがデクリメントはありません。2の補数を求めて加算することになります。 - レジスタがない
アキュムレータAC
はありますが、何をするにも必要ですぐ壊れるので値を入れておくことができません。すべてメモリに置くのが基本です。CONIN
,CONOUT
ルーチンなどとの文字のやり取りもメモリに置いています。
HD1-6120にはMQレジスタというのもありますが、IM6100でも動くはず(実機ないので確認はできない)を目標にしているので使用していません。 - 比較命令もない
減算(もないので符号反転して加算)するしかありません。連続して比較するときは次のようにします。109/ 5056 : 007200 CLA 110/ 5057 : 001144 TAD CH 111/ 5060 : 007450 SNA 112/ 5061 : 005244 JMP WSTART 113/ 5062 : 114/ 5062 : 001313 TAD L -'D' 115/ 5063 : 007450 SNA 116/ 5064 : 005714 JMP IL DUMP 117/ 5065 : 001315 TAD L 'D'-'G' 118/ 5066 : 007450 SNA 119/ 5067 : 005716 JMP IL GO
109,110行でアキュムレータにロードして、111,112行は0との比較をします。0はそのまま判定できるので楽です。114~116行では'D'と比較するために引きます。次に'G'と比較したいのですが... もう一度ロードして'G'を引くより、さっき引いた'D'を足し戻すのと'G'を引くのをまとめて(117行)行なった方が短く速いです。
- メモリの参照
JMP
,TAD
命令などメモリを指す方法は、アドレスを直接命令に書くか、ポインタのアドレスを命令に書くかです。詳しくはASのIM6100対応(その2)を参照ください。いずれの場合も命令のアドレスフィールドは7ビットしかないので近傍に置いておかなくてはなりません。しかもPC相対ではないので常に128ワードのページを意識していなくてはなりません。 - オートインデックス
ポインタとしてゼロページの0010(8)~0017(8)を使用するとオートインデックス機能といって自動でインクリメントされます。これは便利なのですが、インクリメントするしないを使い分けられないのと、プリインクリメントなのが要注意点です。 - ループ
ISZ
というZ80のDJNZ
のような命令があります。インクリメントなのでループ回数は負の値にしなければならないのと、条件スキップなのでループのためのJMP
は別途必要です。
これはメモリ上の値をインクリメントするためにも使えます。0になる可能性があるならスキップを無効化するために次をNOP
にしておきます。 - サブルーチン
スタックは無い(HD1-6120では追加されています)ので戻りアドレスを独特な形で保存します。サブルーチンコール命令JMS
命令は、戻りアドレスを指定された番地に書き込み、その次のアドレスにジャンプします。つまりサブルーチンの先頭アドレスに保存するのです。戻るときは先頭アドレスを指定してインダイレクトジャンプします。
再帰呼び出しが出来ないのとROM化ができないのが欠点です。
個人的にはページ境界を意識しなくてはならないのが一番嫌ですね。あとは慣れてしまえばどうということは無いです。
ページ境界を超えるととたんにアクセスが大変になるのでサブルーチンが2つ以上のページにまたがるのは避けたいところですが、ルーチン毎にページを送っていくと後半未使用なページが増えてただでさえ狭いメモリ空間を圧迫します。しかも条件アセンブルでオプション機能のON/OFFをしようとすると...
とりあえずはメモリ空間の半分 2kW を超えるまではメモリ効率はあまり考えないようにしようかと。
コメントを追加