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
前へ
次へ
ホームページトップへ戻る