[新連載開始]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
前へ
次へ
ホームページトップへ戻る