現在地

HD1-6120ボード(モニタ移植編)


カテゴリー:

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の癖がわかってきたので書いてみたいと思います。

  1. イミディエイトがない
    これはASのIM6100対応(その4)でも書きました。
  2. 単純なロード・ストアもない
    メモリからアキュムレータへのロード命令はないので先にクリアしておいてから加算します。ストアはDCA命令で可能ですが、ストア後にアキュムレータを勝手にクリアしてしまうので要注意。
  3. 加算はあれども減算はない
    加算命令TADはありますが減算命令はありません。インクリメントIACはありますがデクリメントはありません。2の補数を求めて加算することになります。
  4. レジスタがない
    アキュムレータACはありますが、何をするにも必要ですぐ壊れるので値を入れておくことができません。すべてメモリに置くのが基本です。CONIN, CONOUTルーチンなどとの文字のやり取りもメモリに置いています。
    HD1-6120にはMQレジスタというのもありますが、IM6100でも動くはず(実機ないので確認はできない)を目標にしているので使用していません。
  5. 比較命令もない
    減算(もないので符号反転して加算)するしかありません。連続して比較するときは次のようにします。
         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行)行なった方が短く速いです。

  6. メモリの参照
    JMP, TAD命令などメモリを指す方法は、アドレスを直接命令に書くか、ポインタのアドレスを命令に書くかです。詳しくはASのIM6100対応(その2)を参照ください。いずれの場合も命令のアドレスフィールドは7ビットしかないので近傍に置いておかなくてはなりません。しかもPC相対ではないので常に128ワードのページを意識していなくてはなりません。
  7. オートインデックス
    ポインタとしてゼロページの0010(8)~0017(8)を使用するとオートインデックス機能といって自動でインクリメントされます。これは便利なのですが、インクリメントするしないを使い分けられないのと、プリインクリメントなのが要注意点です。
  8. ループ
    ISZというZ80のDJNZのような命令があります。インクリメントなのでループ回数は負の値にしなければならないのと、条件スキップなのでループのためのJMPは別途必要です。
    これはメモリ上の値をインクリメントするためにも使えます。0になる可能性があるならスキップを無効化するために次をNOPにしておきます。
  9. サブルーチン
    スタックは無い(HD1-6120では追加されています)ので戻りアドレスを独特な形で保存します。サブルーチンコール命令JMS命令は、戻りアドレスを指定された番地に書き込み、その次のアドレスにジャンプします。つまりサブルーチンの先頭アドレスに保存するのです。戻るときは先頭アドレスを指定してインダイレクトジャンプします。
    再帰呼び出しが出来ないのとROM化ができないのが欠点です。

個人的にはページ境界を意識しなくてはならないのが一番嫌ですね。あとは慣れてしまえばどうということは無いです。

ページ境界を超えるととたんにアクセスが大変になるのでサブルーチンが2つ以上のページにまたがるのは避けたいところですが、ルーチン毎にページを送っていくと後半未使用なページが増えてただでさえ狭いメモリ空間を圧迫します。しかも条件アセンブルでオプション機能のON/OFFをしようとすると...

とりあえずはメモリ空間の半分 2kW を超えるまではメモリ効率はあまり考えないようにしようかと。

参考文献・関連図書: 
”Intersil IM6100 CMOS 12 bit Microprocessor”, Intersil.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。