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


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

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