現在地

ノウハウ・テクニック

NASトラブル(解決編)

カテゴリー:

昨日の続きです。

一度アクセスしたところに続けてアクセスすると(キャッシュが効いているためか)今度はすぐに応答があります。下回りのほうで何かが起こっている可能性が高くなってきます。

ここでふとリソースモニターを確認するとCPU使用率もメモリ使用率も低いままです。Linuxは詳しくはありませんが、こういう場合はI/O待ちが疑われます。それで各HDDの状態を確認すると1台に警告が出ていました。ただ入出力状態は正常で、SMART情報のみが警告状態です。

入出力に問題がないのなら(早めにHDD交換するべきでしょうが)すぐに影響は無いはず。

念のためにシステムログを確認したら...

Z280固有の初期化(その1)

Z280は特別な初期化をしなくても高速なZ80として動作するので何もしていませんでしたが、Z180の初期化を加えたのでZ280でもやってみました。ゆくゆくはトラップの対応などもやってみたいと考えています。

以下はCPU判別でZ280であると判定されたところです。

Z180の不正命令TRAPを捕まえよう

Z8S180の前にやってみたいことがあります。

Z180には未定義な命令を実行しようとした時に発生するTRAP割り込みというものがあります。これを捕まえてRST 38Hによるブレークのようにアドレスやレジスタが表示できれば便利でしょう。

ということで調べ始めたのですが、思った以上にハードルが高く簡単ではありませんでした。

まず未定義な命令を実行しようとした時に何が起こるかです。

  1. ITC(Interrupt TRAP Control)レジスタのTRAPビットが1になる
  2. PCの値がスタックに積まれる
  3. 論理アドレス0000Hにジャンプする

えっ、0000Hってリセットと同じではないですか。MMUで論理アドレス0000Hに異なる物理アドレスを設定していれば問題ありませんが、ROM, RAMともに16kBしかないSBCZ80でこのためだけにMMUを有効にするのはかなり面倒です。

救済策も用意されていて、1.のTRAPビットはリセットで0になるので0000HからのルーチンでこれをチェックすればリセットなのかTRAPなのかは判別できるようになっています。

Z180の判別と初期化

カテゴリー:

今回はZ80180-Z80 ADAPTER for SBCZ80のソフトウェア編です。

SBCZ80にZ80180-Z80 ADAPTER for SBCZ80を載せてもそのままでは正常に動作しません。

Z180ではZ80から追加された機能をコントロールするための内蔵レジスタがI/O空間の00H~3FHに配置されていますが、SBCZ80ではZ80 SIOがI/O空間の00H~03Hに配置されており、アドレスが重なってしまっているからです。SBCZ80を改造してZ80 SIOのアドレスを変更する手もありますが、Z180の内蔵レジスタはI/O Control Register(ICR, 3FH)で移動可能なのでこちらを移動することにします。

以上の変更で一応動作するようにはなりますが、さらにいくつかのレジスタを設定することでパフォーマンスが上がりますので設定しておきます。

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も一緒に交換です。

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

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

Z80のRレジスタについて

カテゴリー:

Universal MonitorのZ80版にR(egister)コマンド実装していてRレジスタの挙動について誤解していたことがわかりました。そこで今回はZ80のRレジスタについて書いてみることにします。

今さら役に立つ機会なんて無いでしょうけどね。

これまでのRレジスタについての理解はざっとこんなところでした。

  1. リフレッシュアドレスは7ビットなので7ビットのレジスタ(最上位ビットは常に0)
  2. 1命令実行のたびにインクリメントされる
  3. LD A,R, LD R,A命令で値の出し入れができる

はっきり言ってあまり使い道はありません。ゲームなどの簡易乱数発生器として使うか、プロテクトのチェッカルーチンで解析妨害のために使うくらいしか思いつきません。あとは同じ値を代入し続けてソフト的にリフレッシュ動作を不全にするくらいでしょうか。

普通なら無かったことにしても構わないレジスタなのですが...

GAL動かしてみた 第3回:GAL内部とオープンドレインの制約

カテゴリー:

前回予告したようにGAL16V8でオープンドレイン出力を実現するときの制約について書いてみます。

これ説明するためにはGAL16V8の内部構成の知識がある程度必要です。そこでデータシート記載のブロック図を見てみます。
GAL16V8 Functional Block Diagram (part)
同等の回路が並んでいるのでこれは一部分、全体の約1/3ほどです。

[UniMon] RP2A03判別 と Lコマンド追加

カテゴリー:

先日のRP2A03ボードによってRP2A03判別ルーチンの確認ができたのでここに記しておきます。

まず判別するためには両者の違いを利用することになりますが、簡単なのはRP2A03で削除されている10進演算機能の有無を使う方法です。

他にも内蔵のAudio Processing Unit(APU)などのレジスタを参照する方法も考えられなくは無いですが、RP2A03以外では何がつながっているかわからず、誤判別や思わぬ副作用の原因になるかもしれません。

それではソースコードです。

ページ