現在地

プログラミング

アドレスエラー・バスエラー (その2)

カテゴリー:

前回はMC68000/MC68008について書いたので今回はMC68010/MC68012です。

MC68010 / MC68012

MC68000/MC68008ではアドレスエラー・バスエラーからのソフトウェアによる復帰はできませんでした。それを改善したのがMC68010(とメモリ空間を拡大したMC68012)です。

そのためには例外処理を行なっている間復帰に必要な内部状態を保存しておかなくてはなりません。内部にこっそり保存するという方法も考えられなくはありませんが、MC68010ではスタックに積むことで保存します。

アドレスエラー・バスエラー発生時のスタックには以下のように29ワードという大量の情報が積まれています。

アドレスエラー・バスエラー

カテゴリー:

Universal Monitor 68000は自分のボードで動かせるMC68000, MC68010まで対応し、MC68020以降は動かす人もいないだろうから後回し、と思っていたのですが...

なんとMC68030で動かした方がおられます(リンク参照)。

これは判別やら例外処理やら対応しなくてはと思いソースを見たところ、MC68010のアドレスエラー・バスエラーの表示を作りかけたままになっておりました。これを放置したまま他の変更を行なうのは混乱の元(一応 Subversion で管理してはいますが...)なのでまずこれを完了させることにしました。

MC68000系では割り込みの他、ゼロ除算や未定義命令の実行などが発生したときにあらかじめ用意したルーチンを実行する機能があります。これを例外処理といいます。

原則として(復帰できるように)発生時のPCとSRをスタックに積んでから実行するのですが、アドレスエラーとバスエラーの場合はさらに多くの情報がスタックに積まれます。

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

ASのIM6100対応(その4)

カテゴリー:

前回の最後に複合命令の処理がイマイチと書いたのは次のようなことです。

     	SNL MQA

SNLはグループ2ですから次のMQAは共通命令テーブルとグループ2の命令テーブルを探すことになります。ところがこれはグループ3なので当然見つかりません。

結果として"unknown instruction"エラーになるわけですが、MQAは存在する命令でただSNLとグループが違っているだけです。"invalid instruction combination"エラーの方がより親切というものでしょう。

そこですべてを1つの命令テーブルに入れることにしました。各命令ごとに複合命令にできるか、できるならどのグループかの情報を付加して組み合わせられるか判定します。

ASのIM6100対応(その3)

カテゴリー:

ASでは数多くのエラーメッセージが用意されており大抵はその中から選べるのですが、新たなプロセッサへの対応をしているとどれもしっくりこないことがあります。

そこで3回目の今回はエラーメッセージの追加方法を書いてみます。

IM6100には元になったミニコンPDP-8のコンソールパネルを再現するための特別なモードがあり、そのモードでしか実行できない命令あるいは逆に通常モードでしか実行できない命令があります。これは他のプロセッサにはない概念なので適当なエラーメッセージは存在しません。

これを例にエラーメッセージの追加方法について書いていきます。

まずはエラーの名称(表示内容ではなくプログラム中から参照するときの識別子です)とエラー番号を決めます。ちなみにエラー番号は1000未満だと"Warning", 1000以上だと"Error"として扱われます。

最初はどう決めてよいかわからないと思いますので既存のものを参考にするのが良いでしょう。

これをerrmsg.hに追加します。

ASのIM6100対応(その2)

カテゴリー:

第2回目はメモリ参照命令についてです。

IM6100のメモリ参照命令は6つ(うち2つはジャンプ系)しかありません。フォーマットも単純です。

0 1 2 3 4 5 6 7 8 9 10 11
Op Code (0-5) IA MP Page Relative Address

Op Code部が6の場合は入出力のIOT命令、7の場合はOperate命令(前回の複合命令はこれ)です。

ASのIM6100対応(その1)

カテゴリー:

前回楽ではなさそうと書きましたが、基本機能は動くようになりましたのでIM6100対応について数回に分けて書いていきたいと思います。

第1回目は複合命令の処理です。

前回3種類のアイデアを書きましたが最終的にはオリジナルのアセンブラ書式に近い3番目を採用しました。

ASの一般的な処理を知らないとわかりにくいと思いますので、簡単に説明しておきます。

まずSwitchTo_xxxx()関数(これはCPU疑似命令で切り替わったときに呼ばれます)で必要な命令を登録します。特殊な疑似命令が必要ならそれもここで登録します。

	AddMR("AND", 00000);
	AddMR("TAD", 01000);

ここでAddMR()は同じ引数を繰り返すのが面倒で用意したラッパーなので、例えば1行目は以下のように書いたのと同じです。

ASのIM6100対応を検討する

Nanoprocessor対応はAS-users MLに投げて無事本家にマージされました。

で次は何をやろうかなと考えているわけですが、V60は作者のAlfredさんが取り組んでいるような書き込みがありましたし、TRONは気軽に手を出せるようなシロモノではありません。

HD1-6120ボード(ソフトウェア編)で短ループのテストしただけになっているIM6100 / HD1-6120がASで使えるようになればUniversal Monitor移植も視野に入ってきます。

やってみたいのですが... IM6100系のアセンブラは結構特殊なところがあって楽ではなさそうです。気になる点について実現方法を考えてみました。

複合命令

やはりIM6100系の特徴といえばこの複合命令でしょう。通常、命令語は機能を表す部分が一つとその対象を表す部分がいくつか(0のこともある)で構成されていますが、IM6100系には機能を表す部分が複数あるのです。

例えばOperate Instruction (Group 3)というグループの命令は以下のようになっています。

ASのNanoprocessor対応

1820-1692も例によって適当な開発環境が見当たりません。

というわけでCP-1600のときと同様にASのコードジェネレータを書いてみました。CP-1600同様これも書式は簡単で命令数も少なく、着手してから半日ほどでテストも含めて書けました。

現時点のパッチなどをhttps://electrelic.com/pub/asl-Nanoprocessor-20220616/に置いておきます。

  1. asl-1.42bld223を展開してそのトップディレクトリでpatch -p1 < Nanoprocessor.patchでパッチを当てます。
  2. バイナリファイルt_nano.oritests/t_nanoにコピーします。

後は普通にビルドできるはずです。

NSC800ボード(ソフトウェア編)

予告通りNSC800ボードのソフトウェア編をお送りします。

NSC800はソフトウェア的にはZ80互換なので基本的にはZ80用のUniversal Monitorがそのまま動作します。とはいえ例外もありまして今回は以下の3点を追加・変更しています。

一つ目はコンソールドライバです。

これまではZ80 SIOかHD64180系・Z280の内蔵シリアル用しか無かったのでEMILY Boardのものを追加しました。適当なCPUから移植するだけなのですが...

実はCONOUTルーチンでAレジスタ保存するのを忘れてハマってしまいました。

ページ