[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第81回]
●USBによるデータの送受信(3)DMAON,DMAOFF,MWRITE,MREAD
前回はW65C02とPIC18F45K50との間でDMAを使ったDATA送受信の「はじめの一歩」テストを行ないました。
PIC18F45K50にはPICUSBBASICが組み込んであります。
そのBASICを使って動作テストを行ないました。
テスト的基本的な動作確認をしただけですがとにかくPICUSBBASICで組んだプログラムでW65C02を一時停止させてDMAでRAMにデータを書きDMA解除後にW65C02がその値を読み込んで別の値をRAMに書きました。
ごくごく基本的なデータ送受信の雛形のような動作ができました。
PIC18F45K50の側のBASICプログラムがDMAを使ってRAMにアクセスしているのでW65C02側のマシン語プログラムはそのことに気付きません。
ゼロページにバッファ領域として設定した$F2が01になったら$F3の値を読みその値を+1して$F5に書いて$F4を01にします。
同時に$F2を00にします。
PICUSBBASICの側はBASICのpicout命令を使ってDMAでRAMにアクセスします。
前回はW65C02の側が正しくRAMの値を読みその結果としてRAMに値を書くことができるかどうかを確認したかったのでBASICのプログラムはRAMに値を書くだけでそれにW65C02が応答したことの確認はBASICプログラムの終了後に/CMコマンドで行ないました。
BASICのプログラムはDMAでRAMに値を書くだけというごくごく簡単なものでしたがたったそれだけの動作をするのに結構長いプログラムになってしまいました。
長いのですけれどそれは必要な手続きなのでPICUSBBASICのBASIC命令を使うならば前回のようなプログラムになってしまいます。
さらに本来ならばそれに追加してW65C02がRAMに書いた値も読み出さなければなりません。
しかもそれはごくごく基本的なサンプルプログラムなのでそれを参考にしてユーザーがプログラムを書くということになりますといくらBASICは簡単ですと言っても実際にはなかなかに大変なプログラムになってしまいます。
とにかく。
DMAを使ってW65C02とDATAの送受信ができることは確認できましたので今回はそれをBASICで「簡単に」行なえるようにW65C02テストボードに特化したBASIC命令を追加しました。
それと同時に前回のBASICプログラムの先頭で行なっていた初期的な設定はW65C02プログラムを実行するときの/RUNコマンドに組み込みました。
前回のBASICプログラムが面倒なものになったのはPIC18F45K50が苦手なRAMアクセスを全てI/Oポートに対するpicout命令でしなければならなかったからでした。
やっていることはDMAでRAMにアクセスするためにW65C02を一時停止させてバスを開放させることと、RAMにアドレスを指定して値を書き込むこと、同じくアドレスを指定して値を読み出すこととそしてDMAを終了して待たせていたW65C02のプログラムの実行を再開させることです。
前回のBASICはそれらの動作を複数のpicout命令を組み合わせて行ないました。
今回はそれを新しく作ったBASIC命令で行なえるようにしました。
追加したのは以下の命令です。
1)DMAON
W65C02を一時停止させてバスを開放させます。
2)DMAOFF
DMAを終了して停止していたW65C02の実行を再開させます。
3)MWRITE
RAMのアドレス(下位8ビット)に8ビットの値を書き込みます。
書式は MWRITE adrs,data です。
今回の設定ではシステムの別のところでRAMアドレスの上位8ビットは00に設定していますが将来の汎用性を担保するため下位アドレスのみを指定する命令になっています。
4)MREAD
RAMのアドレス(下位8ビット)から8ビットの値を読み出します。
書式は MREAD(adrs) です。
これは前回のBASICプログラムにはなかった動作です。
下が前回のBASICプログラムを上記命令を使って置き換えてさらにRAMから値を読み出す部分を追加したプログラムです。
10 input a 20 dmaon 30 mwrite $f2,a 40 mwrite $f3,1 50 dmaoff 60 dmaon 70 b=mread($f5) 75 print "b=",b 80 if b=1 goto *rd 90 dmaoff 100 goto 60 110 *rd 120 d=mread($f4) 130 print "d=",hex$(d) 135 mwrite $f5,0 140 dmaoff |
随分簡単になりましたでしょう。
前回のプログラムに相当するのは行番号10〜50の部分のみです。
そこから後ろはDMAで同じくRAMにアクセスしてW65C02が書いた値を読み出してそれを表示するという部分です。
このプログラムだけを見るとDMAOFFした直後にすぐまたDMAONしているのでW65C02がプログラムを実行する時間が無いように見えますがPICUSBBASICはインタプリタなのでマシン語に比べて命令の実行にはそれなりに時間がかかります。
念のために間にFOR NEXT文を入れてみたのですがそんなことをしなくてもW65C02の側のプログラムは短いので問題なく実行できました。
W65C02のCPUクロックは10MHzです。
最初に前回と同じ65C02TEST52.BINをロードしました。
次に上のBASICプログラム(RWTEST2E.TXT)をロードしました。

先にW65C02のプログラム(65C02TEST52.BIN)を/RUNコマンドで実行開始しました。
その後BASICプログラム(RWTEST2E.TXT)をRUNコマンドで実行開始しました。

aには$12を入力しました。
bには$F5から読んだ値が入ります。
b=1なのでW65C02が$F2の値を読んでそれを+1した値を$F4に書き込み$F5を01にしたことが確認できます。
そこで$F4の値を読んで変数dに入れた後$F5に00を書いてDMAを終ります。
これならまずまず実用になりますでしょう。
W65C02マイコンボードの製作[第81回]
2026.9.26 upload
前へ
次へ
ホームページトップへ戻る