CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

単純ループ実行

ROMにJMP$(0xEB/0xFE)を焼き込めたのでこれをさっそく実行してみました

ch1:データバスD2 ch2:ROMのアドレスバスA0

見た感じ、安定にループしているようです。実行しているコードを確認するため、いつものようにロジアナをつなぐまでもなくバス各ピンのバタつき具合を1本1本確認していきます。(H,L:ロジックレベル貼り付き変化なし、*:常時変化)

 データバスD15~D0:HHHH HHH* HHH* H*HH

 データバスD31~D16:HHHH HHHH HHHH HHHH

 ROMのアドレスバスA17~A0:LH HHHH HHHH HHHH HH** 

となっているのでアドレス0xFFFFFFF0~0xFFFFFFFFからデータ0xFEEBと0xFFFFを繰返し読み出しているのでOKです。コードの実体は1ワードしかありませんが相当先までプリフェッチしているようです

コードのフェッチサイクルはやはり3.2MHz(約300ns)程度かかっていて、これはウェイト処理を最適化すればもっと速くなるはずです。マニュアルを見ると486CPUのウェイト挿入は以下のようなタイミングになっています

T2ステートの後縁でRDY#信号をサンプリングしHだったら追加のT2ステートを挿入します。このRDY#を生成するウェイトジェネレータは現状こうなっています

ADS#のアドレス確定と同時にRDY#をネゲート、そこからカウンタでCPUCLK32MHzを8個カウントでFFを反転してRDY#をアサートします

ch1:ADS# ch2:RDY#

ADS#の立上りからRDY#のネゲート期間(Wait時間)が1/32MHz*8=250ns確かに生成されています。使用しているROM:HN27C4096ACC-10/CEまたは/OEからのアクセスタイム100nsを保証しているので十分余裕があり、さらにウェイトを半分くらいにしてもいけそうです