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


[新連載開始]W65C02マイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第34回]



●14MHzに挑戦

前回のロジアナでの解析によってわかったことがあります。
W65C02のメモリに対するREAD/WRITEは1クロックサイクルで実行されます。
W65C02Sの最高クロックは14MHz(+5Vのとき)です。
そのときの1クロックサイクルは70nsです。
ということはW65C02を14MHzで動作させるためにはアクセスタイムが70nsかそれよりも速いRAMが必要になります。
たまたま手元にはHM628128ALP−7があります。
アクセスタイムは70nsですからぎり間に合いそうです。
それで試してみたのですが前回書きましたようにCPUクロック14MHzではだめでした。
前回はクロックを落としてロジアナで解析したところI/Oアクセスの後のタイミングがきついことがわかりました。
W65C02はメモリとI/Oの区別がありません。
メモリとI/Oを区別するMEMRQ信号やIORQ信号などはありません。
メモリマップの一部をI/O用に確保します。
その際にメモリとI/Oのアクセスがぶつからないようにロジック回路などでセレクト回路をつくって両者を分離します。
メモリアクセスだけならばそのような回路は不要です(厳密に言えば複数のメモリICを使う場合にはアドレスによって各メモリICを分けるセレクト回路は必要です)。
前回わかったことはI/Oとメモリを分けるためのセレクト回路のところのわずかな遅れ時間(約20ns)のためにアクセスタイムが70nsのHM628128ALP−7でもCPUクロックが14MHzではアクセスが間に合わないのではないかということでした。
それが原因で14MHzではこけてしまうのでは?
もしそうだとすると。
I/Oアクセスをしないプログラムなら14MHzでもうまく実行できるのでは。
まあ現実的な話をしますと。
マイコンシステムにI/Oがないというのはちょっと考えられないのですけれど。
I/OアクセスのときだけWAITを挿入するのは有りだと思います。
しかしそれだけ回路が複雑になるのでそれは余りやりたくはありません。
それなら普通にクロックを落としたほうが楽です。
ここはそんなこんなは余り深く考えないで単なる思い付きです。
とにかくどうなるか試してみましょうぐらいのノリでやってみることにしました。
下は試しに作ったテストプログラム(ソースプログラム)です。
        ;w65c02test16 26.8.5
        ;
        ;I/Otest
        ;
        org $8000
        ;
        wk=$1000
        ;
loop:
        lda wk
        sta wk
        bra loop
        ;
        ;end

[第29回]で作ったプログラムでI/Oアドレス($0200)にREAD/WRITEするところをRAMアドレス($1000)へのREAD/WRITEに変えました。
こちらがW65C02アセンブラでアセンブルして生成されたアセンブルリストです。
0000            ;w65c02test16 26.8.5
0000            ;
0000            ;I/Otest
0000            ;
8000            org $8000
8000            ;
8000 0010       wk=$1000
8000            ;
8000        loop:
8000 AD0010     lda wk
8003 8D0010     sta wk
8006 80F8       bra loop
8008            ;
8008            ;end

I/Oアドレス($0200)→メモリアドレス($1000)に変わっただけでほかは[第29回]プログラムと同じです。
上記プログラムのバイナリファイルをロードして実行してみました。
そうしましたら。

いけたじゃありませんか。
上側(CH1)がWRITEパルスで下側(CH2)がCPUクロックです。
しっかりループしています。
1000nsのところにクロックパルスが14ありますから間違いなく14MHzです。
前のWRITEパルスから次のWRITEパルスまで11クロック(11サイクル)です。
これも前回のロジアナでの解析の結果と一致しています。
水平時間軸をdiv=50nsにしました。

やったぜベイビーというところです。
そこでもう一押し。
普通のメモリREAD/WRITEのところをゼロページへのアクセスに変えてみました。
下はソースプログラムです。
        ;w65c02test17 26.8.5
        ;
        ;I/Otest
        ;
        org $8000
        ;
loop:
        lda $20
        sta $21
        bra loop
        ;
        ;end

こちらはW65C02アセンブラでアセンブルして生成されたアセンブルリストです。
0000            ;w65c02test17 26.8.5
0000            ;
0000            ;I/Otest
0000            ;
8000            org $8000
8000            ;
8000        loop:
8000 A520       lda $20
8002 8521       sta $21
8004 80FA       bra loop
8006            ;
8006            ;end

ダメ押しの一点。
さあどうだ。
と気負いこんでやってみましたら。
あれれ。

おかしいじゃありませんか。
なんだか先ほどのプログラムよりもクロック数が多いような。
本来ならばWRITEからWRITEまで9クロックのはずなのですが。

なぜか14クロックもあります。
オシロスコープの波形は安定していますからこの状態で動いていることは間違いありません。
繰り返し試してみたのですが結果は同じでした。
これは推測ですが。
ゼロページに対するアクセスは内部処理に時間がかかるのでは?
その結果として次のメモリアクセスに余裕がなくなって誤読み込みをしてしまうのでは?
そうなら暴走するところですがたまたまうまく動く状況になっているのではないかと。
ただの推測です。
しかしそこをさらに追求したとてどうなるものでもありません。
ううむ。
I/Oアクセスをしないプログラムならうまくいくかと思ったのですけれど。
結論としてはやっぱりアクセスタイム70nsのRAMではCPUクロック14MHzは無理ということに落ち着きそうです。

ならば。
次なる一手は。
それは次回にて。

W65C02マイコンボードの製作[第34回]
2026.8.5 upload

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