16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第52回]
●AM188EMのCLOCK(2)
前回はAM188のCPUクロックがDatasheetによれば外付けしたクリスタルと同じ周波数になるはずのところ、その1/2の周波数になってしまう、と書きました。
私の大ポカでありました。
自分の不行き届きを棚に上げておいて、AMDを揶揄しているかのことまで書いてしまいました。
穴があったら入りたいとはまさにこのことです。
AMD様、お許しあれ。
どういうことかといいますと。
本日になって、たまたまAM188の初期設定について確認していて、ふと「ちょっと待てよお、ひょっとしたらアクセスタイムの遅いデバイスのためにWaitの挿入ができるのでは?」なんてことが突然頭をかすめました。
それでUser’s Manualを確認してみました。
こちらはROMのセレクト信号の設定です。
R1、R0の設定で最大3クロックのWaitが挿入できます。
下がその説明のページです。
こちらはRAMのセレクト信号の設定です。
こちらもR1、R0の設定で3クロックまでWaitを挿入できます。
下はその説明のページです。
こちらはPeripheral(周辺I/O)のセレクト信号の設定です。
こちらもR3、R1、R0の設定によって最大15クロックのWaitが挿入できます。
下はその説明のページです。
おおお。
ひょっとしたら。
まさか。
[00064] ;AM188 INIT [00065] 0112 BAA0FF START01:MOV DX,FFA0;umcs [00066] 0115 B83FE0 MOV AX,E03F;128k,noready [00067] 0118 EF OUT DX,AX [00068] 0119 BAA2FF MOV DX,FFA2;lmcs [00069] 011C B83F1F MOV AX,1F3F [00070] 011F EF OUT DX,AX [00071] 0120 BA78FF MOV DX,FF78;pdir1 [00072] 0123 B8FEFF MOV AX,FFFE;pcs0 active [00073] 0126 EF OUT DX,AX [00074] 0127 BAA8FF MOV DX,FFA8;mpcs [00075] 012A B8BF80 MOV AX,80BF [00076] 012D EF OUT DX,AX [00077] 012E BAA4FF MOV DX,FFA4;pacs [00078] 0131 B87600 MOV AX,0076;i/o base address=0000 17.2.24 [00079] 0134 EF OUT DX,AX [00080] 0135 B080 MOV AL,80;all port out ******** for test [00081] 0137 E683 OUT 83,AL;82C55 |
その、まさかでありました。
UMCS(ROMセレクト)もLMCS(RAMセレクト)もどちらもしっかり3クロックのWaitが入っておりました。
PACS(I/Oセレクト)についても2クロックのWaitをかけておりました。
ううう。
完全に忘れてしまっておりました。
おそらく最初にテストを始める段階で、念のためにしっかりWaitをかけておいたほうがいいだろう、と考えてそのようにしたのだろうと思います(記憶にございません)。
WaitはメモリやI/OにアクセスしてREAD/WRITEするたびに挿入されますから、トータルの実行時間はかなり遅くなるはずです。
あらためて計算をしてみましたら、下のリストのようになりました。
;;; clock test for am188,,,3ck wait! ; ORG=8000 ; MOV AL,80 OUT 83,AL LOOP:XOR AL,AL;3+6 9*0.05=0.45 OUT 80,AL;9+8 17*0.05=0.85 11.25+0.45+1.15+0.45+0.85=14.15us CALL T5US;11.25us DEC AL;3+6 9*0.05=0.45 OUT 80,AL;9+8 17*0.05=0.85 11.25+0.45+0.85=12.5us CALL T5US;11.25us INC AL;3+6 9*0.05=0.45 JMP LOOP;14+9 23*0.05=1.15 ; ;5us timer clock 20MHz T5US:MOV CL,06 T5US2:DEC CL;3+6 JNZ T5US2;13+6,,,28*6=168 RET;20+9 CALL=19+9,,,57 168+57=225 225*0.05=11.25us ; ;END |
計算した結果は、Lの期間が12.5μSでHの期間が14.15μsになりました。
前回はLが16μsでHが18μsでした。
ちょっと計算と合いませんが、何かほかのファクターが関係しているのかもしれません。
こういうことがわかったので、逆にWaitを全部はずしたらどうなるかをテストしてみました。
RAMにシステムプログラムをロードして、RAM上でテストを行ないました。
BAA2FFはMOV DX,FFA2 (LMCSのアドレス)です。
B83C1FはMOV AX,1F3C (末尾2ビット00はWaitゼロ)です。
EFはOUT DX,AXです。
次のBAA4FFはMOV DX,FFA4 (PACSのアドレス)です。
B87400はMOV AX,0074 (ビット3、1、0=0はWaitゼロ)です。
EFはOUT DX,AXです。
最後のCBはRETFです。
RETFについては[第26回]で説明をしています。
JP 8000で、設定変更を実行したのち、JP 1000でRAMシステムに切り換えました。
クロックテストプログラムをロードして、実行しました。
ノンウエイトでの出力波形です。
Lが10μs、Hが12μsほどです。
前回の計算ではLが約7.6μsでHが約8.5μsのはずでしたから、まだ何かのファクタがからんでいるようですが、Waitがかかっていることに気が付かないでテストをした前回の結果ではLが約16μs、Hが約18μsでしたから、かなり速くなったことは事実です。
うう。
ひょっとしてAM188はデータバスが8ビットですけれど本来の8086(AM186)はデータバスが16ビットのはず。
それがからんでいる?
それについては、あらためて確認してみることにいたします。
それはそれとして、どうやら20MHz水晶を外付けすることで内部CPUクロックも20MHz動作になるようです。
そういうことならば当初の方針通り、20MHz水晶でいきましょう。
16ビットマイコンボードの製作[第52回]
2018.7.9upload
前へ
次へ
ホームページトップへ戻る