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


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

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

[第68回]



●/BPD ●リセット時のSP

/BPはプログラムデバッグの古典的な方法ですがRAM上のプログラムのデバッグを簡単に行なうことができるので命令の実行結果などを確認したいときなどに使うと効果的です。
ところで私などの場合ですけれどそういうデバッグ作業をやっていて途中でメモリの中身を確認したり突然の電話に対応したりしているとどこにブレークポイントを設定したのかそれともまだ設定してなかったのか忘れてしまうことがままあります。
W65C02テストボードのベースになっているPICUSBIOBASICは画面表示をスクロールして前にさかのぼって見ることができるのですがあれこれ表示させたあとですとその表示の中から/BPの設定を確認するのが面倒なこともあります。
/BPDはそんなときのために作ったコマンドです。
/BPDを実行すると現在のブレークポイントの設定の有無が表示されます。

前回と同じプログラムを使ってブレークポイントを設定するなかで/BPDを使ってみます。
前回使ったテストプログラム65c02test21bはW65C02のSP(スタックポインタ)についての理解がよくできていなかったときに書いたプログラムなのでプログラムの先頭でSPの設定をしていませんでした。
もっともこのプログラムに限って言うとスタックを使わないプログラムなので敢えてSPを設定しなくてもただ実行するだけなら問題はありません。
しかし前回や今回のようにブレークポイントを設定するデバッグを行なうためにはSPの設定が必要になります。
そこで今回のテストのために65C02TEST21の先頭にSPの設定を付け加えました。
下はそのようにしたプログラム(アセンブル後のリストプログラム)65C02TEST21C.LSTです。
0000        ;w65c02test21c 26/8/19 9/8
0000        ;
0000        ;ASL,LSR,ROL,ROR
0000        ;
8000            org $8000
8000        ;
8000 A2FF       ldx #$ff
8002 9A         txs
8003        ;set data
8003 A210       ldx #$10
8005 A912       lda #$12
8007 8D0010     sta $1000;1000<12,,,a
800A A934       lda #$34
800C 9D0010     sta $1000,x;1010<34,,,a,x
800F A956       lda #$56
8011 8510       sta $10;10<56,,,zp
8013 A978       lda #$78
8015 9510       sta $10,x;20<78
8017        ;A<78
8017        ;
8017 8530       sta $30;A,,,<78
8019 AD0010     lda $1000
801C 8531       sta $31;a<12
801E BD0010     lda $1000,x
8021 8532       sta $32;a,x<34
8023 A510       lda $10
8025 8533       sta $33;zp<56
8027 B510       lda $10,x
8029 8534       sta $34;zp,x<78
802B 8A         txa
802C 8535       sta $35;x<10
802E A09A       ldy #$9a
8030 98         tya
8031 8536       sta $36;y<9a
8033        ;
8033        ;asl start
8033 A530       lda $30;A
8035 0A         asl;78 01111000>11110000 f0
8036 8540       sta $40;f0
8038 0E0010     asl $1000;12 00010010>00100100 24
803B AD0010     lda $1000
803E 8541       sta $41;24
8040 1E0010     asl $1000,x;34 00110100>01101000 68
8043 BD0010     lda $1000,x
8046 8542       sta $42;68
8048 0610       asl $10;56 01010110>10101100 ac
804A A510       lda $10
[以下省略]

説明の都合で後半を省略しました。
下はテスト中の画面です。

前の方はスクロールして見えません。
PICUSBIOBASICはログ機能付きです。
ログがあると後から確認ができるのでとても便利です。
前回と同様ログを見ながら説明をします。

logfile piciolog\0909082908.txt open
*** pic i/o ***
picio-08 connected
write & check FFFC=00,FFFD=80
loading 65c02bp.bin ...002e(46)bytes loaded,from FF80 to FFAD
>/ld 65c02test21c.bin,8000
loading 65c02test21c.bin ...00b9(185)bytes loaded,from 8000 to 80B8
>/bp 8036
>/run
/run sent
8036[85] SP=FF,A=F0,X=10,Y=9A,F=B4,[N=1 V=0 - B=1 D=0 I=1 Z=0 C=0]
>/cm 0040
0040 F0-00 0041 C9- /cm end
>/bp 8038
>/rt
/rt sent
8038[0E] SP=FF,A=F0,X=10,Y=9A,F=B4,[N=1 V=0 - B=1 D=0 I=1 Z=0 C=0]
>/cm 0040
0040 F0- /cm end
>/cm 0041
0041 C9- /cm end
>/bp 8040
>/rt
/rt sent
8040[1E] SP=FF,A=24,X=10,Y=9A,F=34,[N=0 V=0 - B=1 D=0 I=1 Z=0 C=0]
>/cm 0041
0041 24- /cm end
>/bpd
no break adrs
>/bp 8043
>/rt
/rt sent
8043[BD] SP=FF,A=24,X=10,Y=9A,F=34,[N=0 V=0 - B=1 D=0 I=1 Z=0 C=0]
>/cm 1010
1010 68- /cm end
>/bpd
no break adrs
>/bp 8048
>/bpd
break adrs:8048
>/rt
/rt sent
8048[06] SP=FF,A=68,X=10,Y=9A,F=34,[N=0 V=0 - B=1 D=0 I=1 Z=0 C=0]
>/cm 0042
0042 68- /cm end
>/bpd
no break adrs
>/exit

リモート接続を終了しました
logfile closed at Wed Sep 09 08:39:59 2026

/BPを最初に設定したときは/RUNコマンドでユーザープログラムの実行を開始します。
ブレークしてレジスタが表示されたあとそこでブレーク操作をしないで続きを実行するなら何もしないで/RTコマンドを実行します。
続いて次のチェックしたいポイントでブレークしたいときは同じように/BPでそのアドレスを設定してから/RTコマンドを入力します。
ログではそのようにして続けてブレークポイントを設定してデバッグをしています。
途中/BP 8043の設定の後/RTでブレーク後に/BDPを実行しています。
そこではすでにブレークしたあとですからブレークポイントは設定されていません。
no break adrs
と表示されました。
その下のところで/BP 8048を実行した後の/BPDの入力では
break adrs:8048
と表示されました。
このときはユーザープログラムのアドレス8048がブレークコード00に書き換えられています。
それを元に戻すコマンドも考えたのですがまさかの手違いをしてしまう可能性があると思ってそれは用意しないことにしました。
ブレークコードは/RTを実行してそこでブレーク処理が行なわれればそのときにもとの命令コードに戻されます。
続けてデバッグ作業をするには/RTを実行して命令コードをもとに戻すことを忘れないようにしてください。
もっともそのまま終っても元のプログラムはバイナリファイルとして残っているはずですから構わないのですけれど。

●リセット時のSP

ブレークポイントプログラムの動作を検証する過程でW65C02のSPが不思議な動作をすることを経験しました。
またしてもW65C02のあるあるです。
当初は8080やZ80と同じつもりでデバッグプログラムを作ったのですがSPがなぜか3バイトずれてしまいます。
その理由がわからずたっぷり半日をつぶしてしまいました。
ブレークプログラムはBRK命令でブレークして必要な処理を行なった後STP命令でシステムに戻ります。
そのようにしないとレジスタの値などを表示させることができないからです。
STP命令の実行後はリセットによりユーザープログラムに復帰します。
そのときにRTI命令を使います。
当然のことながらスタックが必要になります。
一連の流れのなかでSPの値は維持されているはずと思ったのがZ80の頭による思い込みでした。
動かぬはずのSPがなぜか−3されてしまいます。
こういうときは迷わずGoogleに聞いてみるべきであります。
実は実は。
そのあたりのノートをしっかり見てみましたら。
「Googleで確認」
と書いてありました。
何を確認したのでしょう?
きっと同じ問題で悩んだ結果Googleで確認して問題をクリアしたはずです。
悲しいことに全く記憶にありません。
どうやらまた同じ問題で悩んでしまったようです。
問題はリセットにありました。



そうそう。
確かそういうことでした。
W65C02はリセットによって影響を受けるということだったようでした(でも記憶にないなあ)。
今あらためて読んでみますと$FDになることが多いと書いてあります。
そういうことだったか!
多分2〜3週間も前に同じことを叫んでいたのだと思います(記憶にございません)。
そして極めつけがこちら。



おお。おお。おお。納得です。
もう二度と同じ轍を踏まぬようにこれからはしっかり記録を取るようにいたします。
そのように心に誓ったことなどじきに忘れてしまいますです。
なんと悲しいこと。

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

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