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