現在地

P(unch)コマンドの拡張


カテゴリー:

先日Universal MonitorのH8/500移植をやってP(unch)コマンドまで実装しましたが、H8/300には未実装になっていたのを思い出してこちらも実装しました。

その前に......

これまでH8/300とH8/300Hのノーマルモードを同じものと勘違いしていまして、アドバンストモードを使うか条件アセンブルするようにしていました。とはいえH8/300もH8/300Hのノーマルモードも動作環境は無いので、基本H8/300Hのアドバンストモードを前提にレジスタ間接アドレッシングなどの切り替え準備くらいで書いていました。

ふと、手元にH8/330(これはH8/300ファミリ)があるのでこれ用にアセンブルできるか試してみたところ予想外に大量のエラーが発生しました。それもアドレス長が異なるどころではなく、INCのような基本的だと思っていた命令が無いといったものが大量にです。

それで調べなおしたところH8/300とH8/300Hのノーマルモードは別物だったわけです。とはいえH8/500と異なりH8/300HはH8/300の上位互換なのでH8/300命令のみで書けば共用できなくはないのですが......

最初はこれも条件アセンブルで何とかしようかと考えていましたが、切り替えがそこら中に散らばってしまうので非常に読みづらくなりそうです。それではとH8/300命令のみで書くとかなり冗長になってしまいます。

そこで、今あるコードはH8/300H専用にしてH8/300用は必要になった時に新たに書くことにしました。

それでは本題のP(unch)コマンドです。

いままで通りの仕様でも良いのですが、せっかくなので何点か拡張しました。

まずL(oad)コマンドのS2レコード対応していることからP(unch)も24ビットアドレスに対応しました。オプションに'M'を追加し24ビットアドレスのS2レコードを生成します。’S'を指定した場合でもアドレスが16ビットに収まらなくなった場合はそこからS2レコードに切り替わります。いずれの場合もエンドレコードはS9に固定しています。

S1レコードとS2レコードの混在、S2レコードをS9で終端すること、この二者は仕様として微妙ですが大抵のツールは問題なく扱えるようなので取りあえずこうしています。困ったときに対応考えることにします。

インテルHEXを選択した場合もアドレスが16ビットに収まらなくなったら04レコードを生成します。02レコードは8086の仕様に強く依存しているので使用しません。

この形式はL(oad)コマンドがまだ対応していないので、そちらも早く対応していきたいですね。

最後に第3パラメータで出力アドレスを変更可能にしました。これは省略可能で、省略するとメモリアドレスがそのまま使用されます。これはメモリアドレスからのオフセットではないので注意してください。

今後の他プロセッサへの展開ですが、メモリ空間によって次のように考えています。

  1. 64kB以内のもの
    S2, S3レコードへの対応は行なわない
    04レコードへの対応も行わない
    出力アドレスには対応する
  2. セグメント・ページなどで64kBを超えるもの
    S2, S3レコードへの対応は行なわない
    04レコードへの対応も行わない
    出力アドレスには対応する
  3. リニアに64kBを超えるもの
    S2レコードに対応する
    16MBを超える場合はS3レコードにも対応する
    04レコードに対応する
    出力アドレスに対応する

とは言え新プロセッサ対応の方が私の中で優先順位は上なので少しずつ対応していくことになると思います。


コメント

初期のH8のアーキテクチャは、意地でもモトローラの仕様に寄せてなるものか、という鋼の意思を感じる。
レジスタを汎用16本にせず専用8本にしたり、メモリアクセスをリニア式にせずセグメント式にしたり。
ZTATのワインドダウト事件の後に泥沼の訴訟にもなったし、その事前対策の意味もあったと思う。

たしかにH8/500は不思議な仕様に感じますね。300系はその揺り戻しなのかな。
一方H16はあちこち妙に68000臭さがあります。

モトローラとの訴訟やTRONCHIPで大丈夫になったところまで、後にH8/300HやSHでは踏み込んだのかも。
H16はインターネット上に記録が少ないが、日立も似ていると思ったからすぐに辞めたんでしょうね。
https://seminowa.tokyo/seminowa_public/maki_analects.html
当時の雑誌(プロセッサ?)の記事の記憶ですが、68000よりVAX似でレジスタバンクお化けでコストが高そうだと感じた気が。
インテルと訴訟していた日本電気は、逆にV60/70でVAXに仕様を寄せていた。探せばなんかでてくるかも。

リンクのサイトは知りませんでした。興味深い項目が並んでいるのでじっくり読みたいと思います。

さて、H16のレジスタバンクは最大で16バンクですが、いくつ使うか決めて残りはRAMとして使えます。容量的にも1kBなので、内蔵RAMやキャッシュとして当時の一般的なレベルに思います。

確かにVAX似と言われればそうですね。最初に気になったのがリセット入力のところで、あれが68000そっくりなので以後は68000に似ているかどうかに私が引っ張られた面はあると思います。

コメントを追加

Plain text

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