2018.8.10
前へ
次へ
ホームページトップへ戻る


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第69回]



●/SVのテストで想定外の結果が…(2)

前回は/SVをセグメント指定ができるように機能追加をして、そのテストをしたところ、想定外の異常事態が発生してしまいました。
というところで終りました。
今回はそこからの続きです。
想定外の結果になってしまったときの画面コピーを再掲します。

/SV SVTEST.TXT,8000,8066[1000]
を実行してセーブしたSVTEST.TXTを/LDコマンドでセグメントベース[2000]のアドレス9000にロードしたあと、DMコマンドで確認したところ、全然セーブされていないことがわかりました。
DMで表示された奇妙なデータ列にもちょっと疑問は残りますが、それはさておき、別のセグメントベース[1000]のアドレス9000にロードしたところ今度は正しくロードできました。
/SVの問題ではないようです。
ではなぜセグメントベース[2000]のアドレス9000にはロードできなかったのか?
ということなのですが、ここでひょっとしたら、と思い当たることがありましたので確認してみました。
思い当たることというのは、RAMのセレクト端子LMCSの設定についてです。
調べてみましたら[第11回]で書いていました。
もう1年半以上も前の記事です。

そこから今回の問題に関係するところを下に引用します。
−−−−−−−−−−−−−−−−−−−引用 ここから−−−−−−−−−−−−−−−−−−−−−−−
LMCSレジスタにはプログラムの先頭のところでUMCSの設定に続いて、下のように1F3Fを設定しています。

[00057] F007  BAA2FF            MOV DX,FFA2;lmcs
[00058] F00A  B83F1F            MOV AX,1F3F
[00059] F00D  EF                OUT DX,AX

RAMアドレスとして00000〜1FFFFの128KBの設定です。
これは試作段階ではRAMとして628128を実装しているためです。
RAMについてはその後に512KBのRAMを搭載するように考えていますので、もしそのようになればLMCSの設定値は変更することになります。
−−−−−−−−−−−−−−−−−−−引用 ここまで−−−−−−−−−−−−−−−−−−−−−−−−
そういうことだったのでした。
ここに書いていますように、その後に実際に512KBのRAMを実装することにしたのですが、LMCSの設定のことなどすっかり忘れてしまい当初の設定のまま、つまりRAMがアクセスできる範囲は128KB(セグメントベース[0000]のアドレス0000〜FFFF、[1000]のアドレス0000〜FFFF)なのでそれより後ろのセグメントベース[2000]はアクセスできない領域だったのでした。

それでとりあえずは納得できたのですが。
ちょっと気になるのは、それではアクセスできないはずのセグメントベース[2000]のアドレス9000〜をDMコマンドで表示させたところ、奇妙なデータ列が表示されたのはなぜか、ということです。
実はこれについても思い当たることがあります。

AM188は端子に2以上の機能を割り付けています。
データバス用のAD0〜AD7にはその名の通りアドレスバス下位8ビットA0〜A7とデータバスD0〜D7がタイミングをずらして出力されています。
当初はそのことには気が付かなかったのですが、ちょっと問題があることに途中で気が付いて今はUMCS(ROMセレクト)もLMCS(RAMセレクト)もAD0〜AD7にアドレスを出力することを禁止する設定にしています。
その設定(DAビット)については[第10回]および[第11回]で引用したデータシートに記載があります。

DAビットはデフォルトでは0(アドレスが出力される)になっているということなので、ここは推測なのですがLMCSの設定範囲外のアドレスではデフォルトの設定が有効になって、データバスラインにアドレスのA0〜A7が出力されてしまうのでは、と思います。
もちろんそれは本来データが出力されるタイミング(そしてCPUがデータを読み込むタイミング)よりも前の期間なのですが、RAMがアクセス範囲外なので本来RAMからデータが出力される期間はハイインピーダンス(実際は抵抗でプルアップしています)になるため、出力されたアドレスがそのまま残っていてデータとして読み込まれてしまうのだと考えられます。
DM 9000,9066[2000]
の表示データがアドレス下位8ビットと同じ値なのはそれで説明がつくと思います。

真夏の怪談はやっぱり「幽霊の正体見たり枯れ尾花」でありました。
正体、もとい理由がわかりましたので、そのまま画面上で修正プログラムを実行しました。



RAMアドレスの適当なところ、1000〜に下のプログラムを書いて実行(JP 1000)しました。

1000 BAA2FF  MOV DX,FFA2
1003 B8BC7F  MOV AX,7FBC
1006 EF      OUT DX,AX
1007 CB      RETF

設定データについては説明は省略します。
[第11回]で引用したデータシートを参照してください。
プログラムの最後がRETFであることについては[第26回]を参照してください。

そのようにしてからもう一度
/LD SVTEST.TXT,9000[2000]
を実行し、その後DMで確認したところ、今度はオバケなど出ずにちゃんと正しくロードされたことが確認できました。

これにて一件落着。
めでたし、めでたし、であります。

16ビットマイコンボードの製作[第69回]
2018.8.10upload

前へ
次へ
ホームページトップへ戻る