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


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

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

[第13回]



●W65C02テストプログラム

現在は2回目となるW65C02テスト基板作成の最終段階です。
1回目のテスト基板は全く駄目ではありませんが余り賢くない回路で作ってしまったためテストをするためのPIC18F45K50のプログラムを作成するのに手間がかかってしまいます。
それがわかったために新しいテスト基板を作ることにしました。
その基板ができてきてからW65C02に対する動作テストプログラムを作ったほうが楽だと期待しています。
しかし。
今作っている2回目の試作基板は1回目の試作基板に比べてメモリの書き込み読み出しのところの回路は大きく改良しましたがその一方でW65C02の動作テストをするための回路は基本的には1回目と変わっていません。
もしもその部分に考え方の間違いがあれば2回目のテスト基板を作っても基本的なところで進展はないことになってしまいます。
つまりはW65C02の動作テストをするために3回目の試作基板を作るはめになります。
そこのところをよくよく考えてみましたら。
確かに現在手元にある試作基板を使ってW65C02の動作テストのためのプログラムを作るのはホネが折れますができないわけではありません。
昔ならスイッチをパチパチやりながらテストプログラムをRAMに1バイトずつ書き込んでいったところです。
それに比べたら何ほどのことがありましょうや。
ということで。
覚悟をきめました。
まずは今最後の仕上げにかかっております試作基板のアートワーク作業を一時中断して現行基板でW65C02のもっとも基本的な動作テストプログラムを書いてテストしてみることにしました。
W65C02はリセットからスタートすると最初にアドレスFFFCとFFFDのデータを読んでその値が示すアドレスにジャンプします。
FFFCの値がジャンプ先の下位アドレスでFFFDの値がジャンプ先の上位アドレスです。
テストプログラムは簡単にするためアドレスFF00から書くことにします。
ですからRAMのFFFCには00をFFFDにはFFを書いておきます。
FF00から書くテストプログラムは簡単に動作確認ができるように以下のプログラムにします。

FF00 A9BB   LDA #$BB …アキュムレータにデータBBをロードする
FF02 8512   STA 12 …アキュムレータの値をゼロページの0012に書き込む
FF04 DB     STP …実行をストップする

PIC18F45K50のPICUSBIOプログラムを使ってRAMに上記を書き込みます。
この間W65C02はRESET状態にしておきます。
書込みが終ったら短時間W65C02のRESETを解除してから再びRESET状態にします。
そしてRAMのアドレス0012を見ます。
そこにBBが書かれていたらW65C02が実際に起動してプログラムを実行した証しとなります。
下が即席で作ったフログラムです。
   10 'ram r/w test
   20 picout TRISA,0
   30 picout TRISB,0
   40 picout PORTB,$FE:'w=h
   50 picout TRISE,0
   60 picout TRISD,0
   70 picout PORTA,1:'ram disabel
   80 picout PORTD,$FF:'adrsH FF set
   90 picout PORTE,2:'adrsH select
  100 picout PORTE,1:'adrsH set & adrsL select
  110 picout PORTD,$FC:'adrsL FC set
  120 picout PORTE,0:'adrs lock
  130 picout PORTA,0:'ram actibe
  140 picout PORTD,0:'data 00 set
  150 picout PORTB,$7E:'w=L
  160 picout PORTB,$FE:'w=h
  170 picout PORTA,1:'ram disabel
  180 '
  190 '
  200 picout PORTE,1:'adrsL select
  210 picout PORTD,$FD:'adrsL FD set
  220 picout PORTE,0:'adrs lock
  230 picout PORTA,0:'ram actibe
  240 picout PORTD,$FF:'data FF set
  250 picout PORTB,$7E:'w=L
  260 picout PORTB,$FE:'w=h
  270 picout PORTA,1:'ram disabel
  280 '
  290 '
  300 picout PORTE,1:'adrsL select
  310 picout PORTD,0:'adrsL 00 set
  320 picout PORTE,0:'adrs lock
  330 picout PORTA,0:'ram actibe
  340 picout PORTD,$A9:'data A9 set
  350 picout PORTB,$7E:'w=L
  360 picout PORTB,$FE:'w=h
  370 picout PORTA,1:'ram disabel
  380 '
  390 '
  400 picout PORTE,1:'adrsL select
  410 picout PORTD,1:'adrsL 01 set
  420 picout PORTE,0:'adrs lock
  430 picout PORTA,0:'ram actibe
  440 picout PORTD,$BB:'data BB set
  450 picout PORTB,$7E:'w=L
  460 picout PORTB,$FE:'w=h
  470 picout PORTA,1:'ram disabel
  480 '
  490 '
  500 picout PORTE,1:'adrsL select
  510 picout PORTD,2:'adrsL 02 set
  520 picout PORTE,0:'adrs lock
  530 picout PORTA,0:'ram actibe
  540 picout PORTD,$85:'data 85 set
  550 picout PORTB,$7E:'w=L
  560 picout PORTB,$FE:'w=h
  570 picout PORTA,1:'ram disabel
  580 '
  590 '
  600 picout PORTE,1:'adrsL select
  610 picout PORTD,3:'adrsL 03 set
  620 picout PORTE,0:'adrs lock
  630 picout PORTA,0:'ram actibe
  640 picout PORTD,$12:'data 12 set
  650 picout PORTB,$7E:'w=L
  660 picout PORTB,$FE:'w=h
  670 picout PORTA,1:'ram disabel
  680 '
  690 '
  700 picout PORTE,1:'adrsL select
  710 picout PORTD,4:'adrsL 04 set
  720 picout PORTE,0:'adrs lock
  730 picout PORTA,0:'ram actibe
  740 picout PORTD,$DB:'data DB set
  750 picout PORTB,$7E:'w=L
  760 picout PORTB,$FE:'w=h
  770 picout PORTA,1:'ram disabel
  780 '
  790 '
  800 picout PORTE,1:'adrsL select
  810 picout PORTD,$FC:'adrsL FC set
  820 picout PORTE,0:'adrs lock
  830 picout PORTA,0:'ram actibe
  840 picout TRISD,$FF:'for data read
  850 print "adlsL=FC,data=";
  860 print hex$(picin(PORTD))
  870 picout PORTA,1:'ram disabel
  880 picout TRISD,0:'for adrs set
  890 '
  900 picout PORTE,1:'adrsL select
  910 picout PORTD,$FD:'adrsL FD set
  920 picout PORTE,0:'adrs lock
  930 picout PORTA,0:'ram actibe
  940 picout TRISD,$FF:'for data read
  950 print "adlsL=FD,data=";
  960 print hex$(picin(PORTD))
  970 picout PORTA,1:'ram disabel
  980 picout TRISD,0:'for adrs set
  990 '
 1000 picout PORTE,1:'adrsL select
 1010 picout PORTD,0:'adrsL 00 set
 1020 picout PORTE,0:'adrs lock
 1030 picout PORTA,0:'ram actibe
 1040 picout TRISD,$FF:'for data read
 1050 print "adlsL=00,data=";
 1060 print hex$(picin(PORTD))
 1070 picout PORTA,1:'ram disabel
 1080 picout TRISD,0:'for adrs set
 1090 '
 1100 picout PORTE,1:'adrsL select
 1110 picout PORTD,1:'adrsL 01 set
 1120 picout PORTE,0:'adrs lock
 1130 picout PORTA,0:'ram actibe
 1140 picout TRISD,$FF:'for data read
 1150 print "adlsL=01,data=";
 1160 print hex$(picin(PORTD))
 1170 picout PORTA,1:'ram disabel
 1180 picout TRISD,0:'for adrs set
 1190 '
 1200 picout PORTE,1:'adrsL select
 1210 picout PORTD,2:'adrsL 02 set
 1220 picout PORTE,0:'adrs lock
 1230 picout PORTA,0:'ram actibe
 1240 picout TRISD,$FF:'for data read
 1250 print "adlsL=02,data=";
 1260 print hex$(picin(PORTD))
 1270 picout PORTA,1:'ram disabel
 1280 picout TRISD,0:'for adrs set
 1290 '
 1300 picout PORTE,1:'adrsL select
 1310 picout PORTD,3:'adrsL 03 set
 1320 picout PORTE,0:'adrs lock
 1330 picout PORTA,0:'ram actibe
 1340 picout TRISD,$FF:'for data read
 1350 print "adlsL=03,data=";
 1360 print hex$(picin(PORTD))
 1370 picout PORTA,1:'ram disabel
 1380 picout TRISD,0:'for adrs set
 1390 '
 1400 picout PORTE,1:'adrsL select
 1410 picout PORTD,4:'adrsL 04 set
 1420 picout PORTE,0:'adrs lock
 1430 picout PORTA,0:'ram actibe
 1440 picout TRISD,$FF:'for data read
 1450 print "adlsL=04,data=";
 1460 print hex$(picin(PORTD))
 1470 'picout PORTA,1:'ram disabel
 1480 'picout TRISD,0:'for adrs set
 1490 '
 1500 picout PORTE,4:'373 disable
 1505 picout TRISB,$80
 1510 picout PORTB,$FF:'65c02 start
 1520 picout PORTB,$FE:'65c02 reset
 1530 picout PORTA,1:'ram disabel
 1540 picout TRISD,0:'for adrs set
 1550 picout PORTE,1:'adrsL select
 1560 picout PORTD,$12:'adrsL 12 set
 1570 picout PORTE,0:'adrs lock
 1571 picout PORTE,2:'for adrsH set
 1572 picout PORTD,0:'adrsH 00 set
 1573 picout PORTE,0:'adrs lock
 1580 picout PORTA,0:'ram actibe
 1590 picout TRISD,$FF:'for data read
 1600 print "adlsL=12,data=";
 1610 print hex$(picin(PORTD))

めちゃめちゃ面倒ですけれど要はRAMにアドレスを設定してそこにデータ(W65C02のマシン語命令コード)を書き込む作業を繰り返しているだけですからその部分をコピーしながらアドレス値とコードのところを書き換えていくという作業の繰り返しです。
実際の作業は見た目よりも楽ではありました。
1480行までがW65C02を停止(RESET)しておいてRAMへ命令コードを書き込む作業です。
1510行でW65C02のRESETを解除し一瞬W65C02を動作させた後1520行で再びRESETをかけます。
そこから後ろでRAMのアドレス0012の値を読み出します。
次回はプログラムを実際に動作させた結果について書きます。

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

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