[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第18回]
●/CM,/DM,/RUN
出来上がるのを待っております2回目のW65C02テストボードも現在手元にありますテストボードもボード上のRAMにデータやプログラムをWRITE/READすることでW65C02の動作を確認しようというものです。
ずっと昔ならばここはアドレスバスとデータバスにトグルスイッチとLEDをとりつけておいてCPUをホールドさせておいてスイッチをパチパチやりながらRAMにデータを書き込むところです。
手間がかかりますが昔はそれしか方法がありませんでした。
現在進行中のW65C02テストボードはそのスイッチとLEDの代わりにPIC18F45K50を使ってやってしまいます。
ソフトとしてはPICUSBIOのBASICインタプリタをそのまま組み込んでそれを使いますからスイッチパチパチに比べたら格段に楽であることは間違いありません。
そうは言っても初号機は設計がまずくてRAMにデータを書くにも読み出すにも面倒なプログラムを書かなくてはなりません。
どこがまずかったかと言いますと。
アドレスを上位8ビットと下位8ビットに分けてそれをPIC18F45K50のRD0〜RD7から出力して2個の74HC373にラッチしています。
PIC18F45K50は40pinのPICで出力は半端なものを含めてPORTA〜PORTEまで5ポートもあります。
アドレス16ビットとデータ8ビットならそれで間に合いますがテストのためにW65C02の制御ラインの全てに割り当てようとすると少し不足してしまいます。
それを補うためにアドレス出力に8ビットラッチを使うように考えたのでした。
それはよかったのですがアドレスを74HC373に書き込むだけではなくてデータバスにも同じPORTDを使ったところに問題がありました。
RAMのデータの読み書きをするには先にアドレスをラッチしておかなければなりません。
そのためのPORTDはRAMのデータラインにつながっています。
なのでアドレスを74HC373にWRITEする前にRAMをディスイネーブルにしておかなければなりません。
そのようにしないとPORTDの出力とRAMの出力がぶつかってしまいます。
毎回のRAMのアクセスの度にRAMのディスイネーブルとイネーブルの操作が間に入ってしまいます。
実際にプログラムを書く段になってそのことに気が付きました。
これは面倒です。
さらにアドレスも上位と下位に分けていますから少なくとも下位8ビットは毎回ラッチし直さなければなりません。
その結果が[第13回]のなんとも堪らないプログラムになってしまいました。
よくよく考えて確認してみましたらアドレスをラッチするのは上位8ビットだけでよくて下位8ビットはPORTDの出力をそのまま使えばよかったのでした。
そしてデータラインにはアドレスから切り離して別のポートを使うことで上記の面倒な操作をかなり省くことができます。
2回目のテスト基板では出力ポートの割り振りを考えてアドレス出力にはRA0〜RA5とRC6、RC7を割り当ててデータバスにRD0〜RD7を割り当てました。
1回目の回路を利用できるところはそのまま使おうと手抜きをしたため今考えると2回目の回路にもまずいところがありました。
データラインにPORTDを使うところはそれでよいのですがアドレスにはPORTBを使うほうがすっきりします。
それというのも8ビット揃っているのはPORTBとPORTDだけでPORTA、PORTC、PORTEは半端だからです。
やっぱり手抜きをしてはいけません。
まだこれからW65C02ボードは進化させていくつもりですからもしこの先PIC18F45K50を使うテストボードを製作することがあればそのようにしたいと思います。
それはそれとして今回の本題です。
確かにBASICを使えばソフトは楽になります。
それでもRAMの読み書きには複数の命令を組み合わせて使うことになります。
単純なWRITE/READならもっと簡単にできそうなものですが…。
そこでND80Zモニタプログラムなどで使っているCMコマンドとDMコマンドの機能があれば便利ではないかということを思い付きました。
これも2回目の基板が出来てきてから取り掛かればよいのですけれど…。
プログラムを考えているうちに結局現在の基板で作ってしまいました。
2回目の基板ができてきたらそれに合わせてまたプログラムを作り直します。
機能としては/CM(Change Memory)があればよいのですがついでに/DM(Memory DumpなのですがCMに合わせてDMにしています)も作ってしまいました。
さらにさらについでなのでW65C02のためのSTARTコマンドとして/RUNも作りました。
PICUSBIOのBASIC機能とは別の機能なのでそこを区別するために/をつけました。
以下は実際の実行を記録した画像です。
まずは/DMコマンドです。

操作を簡略にすることとW65C02が256バイト単位のページという概念をもっていることからアドレスの指定に代えてページ(アドレス上位8ビット)を指定することにしました。
データの表示はページ単位(256バイト)で行ないます。

/DMはメモリ内容を一括して読み出してそれを表示します。
メモリに値を書き込む機能はありません。
メモリに値を書き込むには/CMを使います。
/CMコマンドを使って[第13回]のプログラムと同じことをしてみました。

コマンドでダイレクトにメモリにアクセスするとこんなにも簡単になります。
あっと。
うっかりしてFF04にDBを書くつもりでBBを書いてしまいました。
前のアドレスに戻るには[←]キーを押します。

DBに書き換えました。
/CMコマンドを終了するには[Ctrl][B]か[Enter]を入力します。

ちなみに/CMコマンドで何も入力しない(書き換えない)で次のアドレスに進むには[→]キーか[Space]を押します。
念のために/DMコマンドで確認してみました。

ちゃんと書き換わっています。
とても便利です。
入力したプログラムを実行するとゼロページのアドレス0012にBBが書き込まれるはずです。
それもあらかじめ/DMコマンドで確認しておきます。

0012の値はDEです。
/RUNコマンドを実行しました。

PICUSBIOのBASICプログラムを実行するためのコマンドはRUNです。
それと区別するために/RUNコマンドにしました。
/RUNコマンドはボード上のW65C02のリセットを解除して一瞬スタートさせたあとすぐにリセット状態にします。
今気が付きました。
/RUNはスタートするだけにするべきです。
そのうち長いプログラムやエンドレスのプログラムも実行させることになると思います。
プログラムを実行後に停止させるには/STOPコマンドを用意するべきです。
実行結果を確認してみました。

あれ?
書き換わっていませんね。
そうでした。
うっかりしていました。
W65C02はアドレスFFFCとFFFDに開始アドレスを書いておかなければいけませんでした。
/CMコマンドで開始アドレスを設定します。

ちょいとあせって入力を確認するため[←]を入力するところを押し間違えてしまいました。
16進数または許される機能キー以外を入力すると「?」が表示されてもう一度同じアドレスが表示されます。
今度は間違えないように[←]を続けて2回押したあと[Enter]で/CMを終了しました。
もう一度/RUNを実行しました。

果たして結果はいかに?
今度はBBに書き換わりました。

念のためにFF01のBBをAAに書き換えてからもう一度/RUNコマンドを実行しました。

/CMコマンドで0012がAAに書き換わったことを確認しました。
W65C02マイコンボードの製作[第18回]
2026.7.20 upload
前へ
次へ
ホームページトップへ戻る