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


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

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

[第9回]


●Peripheral Control Block(PCB)

中2日更新ができませんでした。
遅めの正月休み?
そんなものはありませぬ。
元日からずっとお休みなしでお勤めしておりましたです。
実はここ数日いよいよ独立大作戦のソフトウェア作成にかかっておりまして、それがなかなかに難航して、それで時間がなくて2日間更新ができませんでした。
本日も朝からずっとかかりっきりでやっておりまして、ちょっと落ち着いて書いているだけのゆとりがありません。
余り時間がありませんので今回も少し書くだけで終ってしまいそうです。
独立大作戦のほうの進行状況についても、近いうちに報告できると思います。

前にお見せした「16ビット版TK−80モニタプログラム」の初めのところのリストですが、前回書きました理由などから、少しですがプログラムを直しましたので、もう一度その部分をお見せします。

[00053]                     ;
[00054] F000  BAA0FF        START0:MOV DX,FFA0;umcs
[00055] F003  B83FE0            MOV AX,E03F;128k,noready
[00056] F006  EF                OUT DX,AX
[00057] F007  BAA2FF            MOV DX,FFA2;lmcs
[00058] F00A  B83F1F            MOV AX,1F3F
[00059] F00D  EF                OUT DX,AX
[00060] F00E  BA70FF            MOV DX,FF70;piomode0
[00061] F011  B80100            MOV AX,0001
[00062] F014  EF                OUT DX,AX
[00063] F015  BA72FF            MOV DX,FF72;pdir0
[00064] F018  B80EFC            MOV AX,FC0E
[00065] F01B  EF                OUT DX,AX
[00066] F01C  BA78FF            MOV DX,FF78;pdir1
[00067] F01F  B8FEFF            MOV AX,FFFE;pacs active
[00068] F022  EF                OUT DX,AX
[00069] F023  BAA8FF            MOV DX,FFA8;mpcs
[00070] F026  B8B880            MOV AX,80B8
[00071] F029  EF                OUT DX,AX
[00072] F02A  BAA4FF            MOV DX,FFA4;pacs
[00073] F02D  B87608            MOV AX,0876;i/o base address=8000
[00074] F030  EF                OUT DX,AX
[00075] F031  BA8380            MOV DX,8083;**** 82c55
[00076] F034  B080              MOV AL,80;**** all port out
[00077] F036  EE                OUT DX,AL;****
[00078] F037  8CC8              MOV AX,CS;*****
[00079] F039  BA8080            MOV DX,8080;*****
[00080] F03C  EF                OUT DX,AX;*****
[00081]                     ;
[00082]                     ;monitor start
[00083]                     ;
[00084] F03D  B0FF          MONST:MOV AL,FF

START0:からMONST:の前までが、リセット後の初期設定部分です。
[00075]から下はCPUの初期設定には関係ありません。
[00054]〜[00074]がAM188が動作するために必要な初期設定です。
FFXX番地にOUT出力をしています。
8086のOUT命令でも8080と同じようにI/Oアドレスを直接指定してダイレクトに出力するOUT命令がありますが、使える範囲が限られているため、普通はこのリストにあるようにDXレジスタとALまたはAXレジスタを使ったOUT命令を使います。
メモリに対するMOV命令はレジスタを特定しないで使えるものが多いのですが、OUT命令でアドレスを指定できるのはDXレジスタだけで、値を出力できるのはAXレジスタ(16ビット)またはALレジスタ(8ビット)に限られます。

上のリストで出力しているアドレスFFXXはAM188の内蔵レジスタでPeripheral Control Brock(PCB)という256バイトの連続したレジスタです。
機能ごとに16ビット×128個もあります。
8086や8088にはありません。

AM188はまだほんの少しさわっただけなので、とても128個のレジスタの全てについては理解できていません。
忘れてしまわないうちに、とりあえず必要最小限の内容について、メモ書き程度にまとめて記します。

PCBは256バイトの連続したレジスタブロックで下位8ビットが00になるアドレスなら、I/Oアドレスでもメモリアドレスでもマッピングすることができます。
リセット後はI/OアドレスのFF00〜FFFFにマッピングされます。
下はPCBの一部(アドレスA0〜FF)です。


[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual

16ビット長なので下位8ビットが偶数番地、上位8ビットが奇数番地に割り付けられます。
たとえばUpper Memory Chip Select Registerはリセット後はFFA0、FFA1に割り付けられます。

ではこのPCBブロックをメモリアドレスあるいはI/Oアドレスのどこに割り付けるのかということをどこで設定するのかといいますと、それもこのPCBレジスタで行ないます。
なんだか卵が先か鶏が先か、という感じがしますが、そこのところは命令の実行タイミングにあわせてうまくマッピングの切り換えができるようです。

本日は時間がありませんので、オフセットアドレスFE(リセット後はI/OアドレスのFFFE)のPeripheral Control Block Relocation Registerについてだけ簡単に書いておきます。
下はUser’s Manualからの引用です。


[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual

256バイトのPCBのベースアドレス(オセット00のアドレス)を指定するレジスタです。
リセット後は初期値として20FFが設定されます。
ビット14は割込みコントローラのモード設定で、=0はMasterモードです(具体的にはどういうことなのか、ちょっとまだ理解していません)。
ビット12はPCBをメモリマップに割り付けるか(=1)、I/Oマップに割り付けるか(=0)を指定します。
初期値のビット12は0ですからI/Oマップに割り付けられます。
下位12ビットは0FFですが、I/Oマップのときは上位4ビットは無視されます。
FFはI/Oマップの上位8ビットの値で、下位8ビットは常に00ですから、PCBのベースアドレスはFF00になります。

ということなのですが、64KBものI/O空間があるのですから、ここは上記の初期設定のままでよいと思います。

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

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