現在地

ソフトウェア

MC68010の判別(補足)

今回はブレーク処理についての予定でしたが、MC68010の判別で書き足らなかったことがいくつかありますのでそちらを書くことにします。

MC68008の判別

MC68008の判別もできないか考えたのですが...

  1. ソフトウェア的にはMC68000からの命令等の追加・変更はありません
  2. 最初MC68008は8ビットバスなので奇数番地からのワードアクセスで判別できるのではないかと思ったのですが、データシートによると奇数アドレスからのワード・ロングワードアクセスはアドレスエラー例外を発生するとあるのでこれで判別はできません。
  3. プリフェッチキューあたりに相違があるかもしれませんがデータシートからはよくわかりませんでした。実機が試せるようになったら見てみたいところではあります。

MC68010の判別は例外処理に必要なのに対し、MC68008の判別はどうしても必要というわけではありません。3.を試すにしても優先度はかなり低いですね。

MC68010の判別

SH7045ボードへのUniversal Monitorの移植に着手したのですが、その前にMC68000系で動くようになっていますのでそのあたりの話を何回かに分けて書こうと思います。

MC68000自体は30年ほど前にいじっていて(だから未経験のプロセッサを優先して後回しになっていました)サクサク書いていたのですが、これまで書いたことがなかったのがプロセッサの識別です。

当時からMC68010は載せていましたがモニタは専用にアセンブルしていました。

N BASIC上で動く簡易クロスアセンブラを使用していたので条件アセンブルなどはできずソースを別個に管理していたように記憶しています。

ですからMPUを載せかえる時はROMも一緒に交換です。

今回は基本部分がすんなり動作したので識別ルーチンに挑戦することにします。

識別の原理はもちろんプロセッサによる挙動の違いを検出するわけですが、これにはいくつかのパターンがあります。

HD1-6120ボード(ソフトウェア編)

テーマ:

予告どおりソフトウェア編です。これまでの「ソフトウェア編」ではモニタ程度のものが動いていることが多かったと思いますが、今回はプログラムの実行ができているらしいとわかる程度です。

最も簡単なテストプログラムは実行開始番地で無限ループさせるものでしょう。

HD1-6120(IM6100も)は0FFFH番地から実行を始めますので、ここに0FFFH番地へのJMP命令を置きます。これを実行させておいてアドレスバスの状態を観察するとA0A11までがすべて"H"になっていて0FFFH番地を読み続けていることがわかります。

次に異なるアドレスでループさせてみます。

HD1-6120でダイレクトにJMPできる先は、同ページ(アドレスの上位5ビットが同じ)か0ページ(アドレスの上位5ビットがすべて0)だけです。それ以外へ飛びたいときは同ページか0ページにアドレスを書いておいて間接アドレッシングを使います。ここでは簡単に0ページで試してみます。

ポケコンパイラ

テーマ:

カテゴリー:

またまた懐かしいファイルが出てきました。

ファイル
30年以上前のもの、ポケコン用のコンパイラをハンド逆アセンブルして解析した資料です。バイナリで1.5kB程を全部手書きしていました。

掲載誌(『I/O』1984年12月号)もまだ持っていたので何箇所か比較してみましたが、それで間違いないようです。

対象機種のPC-1251は所有していませんでしたので、単に中身というか仕組みを知りたかっただけなのか、PC-1261への移植を企図していたのかもしれません。最終的に移植はしていませんが。

ASに新CPU対応を(その4)

モニタも動いてこれまでに実装済みのMN1610命令に問題無いことがわかり、時間にも余裕が出てきたので、残りのMN1613拡張命令も一気に実装してしまいました。

MN1613で追加された命令にはパースの面倒なアドレッシングなどは無く、命令の数が多いだけの単純作業に近かったですね。

一段落したので現時点のファイル(asl-patch-20191120.tar_.gz)を添付しておきます。

ビルド方法

MN1613ボード(モニタ移植編)

テーマ:

前回は簡単なテストプログラムを動かしましたが、その後アセンブラもある程度動作するようになったのでいつものUniversal Monitorを移植することにします。

しばらくボードを動かしていなかったので念のためにもう一度小さなプログラムを試してみましたが、何故か動作が変というかいきなり暴走している感じです。
原因はいくつか考えられます。

  1. ボードかCPUが壊れてしまった
  2. (リセット動作には不明な点が多いので)以前動いたのは偶然だった
  3. アセンブラが誤ったコードを吐いている

ハンドアセンブルと比較したり、以前と同じコードを試したりで3.で無いことはすぐに判明しました。

ASに新CPU対応を(その3)

あれから作者の方と連絡とって質問したり、ID番号もらったり...
軽い気持ちで始めたのですが、ここまできたら本家への追加を目指そうかな。

以下は既存のcode***.cを参考に推測・試行錯誤した結果です。全体を理解して書いているわけではないので、間違っていたり作者の意図しない使い方をしたりしているかもしれません。ご了承ください。

前回厄介と書いたメモリに関係する L, ST, B, BAL, IMS, DMS の各命令も使えるようになりました。これらをデコードする DecodeAdr は長いのでゼロページ間接インデックス(MN1610で一番複雑)を例にみてみます。

ASに新CPU対応を(その2)

昨日に引き続きASのMN1610対応についてです。

以下は既存のcode***.cを参考に推測・試行錯誤した結果です。全体を理解して書いているわけではないので、間違っていたり作者の意図しない使い方をしたりしているかもしれません。ご了承ください。

前回の SwitchTo_MN1610() の最後で呼び出していた InitFields() です。

ページ