[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第67回]
●/BP ,/RT(2)
前回の続きです。
今回は以前に使ったテストプログラムにブレークポイントを設定して実行してみます。
いつもですと実行したときの画像をお見せするのですがちょつと時間が経っていてそのときの画像が残っていません。
もう一度実行してもよいのですけれど。
そのときのログがそのまま残っていましたので今回はそのログを使って説明をします。
下が実行時のログです。
logfile piciolog\0819110925.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 65c02test21b.bin,8000 loading 65c02test21b.bin ...00b6(182)bytes loaded,from 8000 to 80B5 >/bp 8075 >/run /run sent adrsL=29,data=a6 break! 8075[2A] SP=42,A=78,X=10,Y=9A,F=75,[N=0 V=1 - B=1 D=0 I=1 Z=0 C=1] >bp 8078 error! erc=54 bp 8078 >/bp 8078 >/rt /rt sent adrsL=29,data=a6 break! 8078[2E] SP=42,A=F1,X=10,Y=9A,F=F4,[N=1 V=1 - B=1 D=0 I=1 Z=0 C=0] >/bp 807e >/rt /rt sent adrsL=29,data=a6 break! 807E[85] SP=42,A=24,X=10,Y=9A,F=74,[N=0 V=1 - B=1 D=0 I=1 Z=0 C=0] >/exit リモート接続を終了しました logfile closed at Wed Aug 19 11:13:24 2026 |
[第48回]で説明したローテイト命令のテストプログラム(65c02test21b.bin)でブレークテストをしました。
下は5c02test21bのアセンブルリストです。
プログラム名の最後にbがついていますからそのときのリストを少し直しているようです。
全体のリストは長くなるので前半は省略しました。
最初にブレークプログラム(65c02bp.bin)をロードします。
これは最終的にはシステムに組み込んでしまいます。
今はテスト段階です。
そうしておいてユーザープログラムをロードします。
これは今までと同じです。
/LD 65c02test21b.bin,8000を実行しました。
ブレークポイントを設定します。
/BP 8075[Enter]です。
アドレス8075のROL命令のところです(下のリスト参照)。
/BPで設定するアドレスは第一バイト(命令コード)のアドレスです。
このコード(2A)がブレークコード(00)に置き換えられます。
するとその直前(8073、8074)を実行した直後にブレークすることになります。
/runを実行しました。
ブレークコードが実行されてそのときのアドレス、レジスタの内容が表示されました。
このときはまだスタックポインタに対する理解が不足していたらしくSPを設定しないでユーザープログラムを実行したようです。
SP=42なんておかしな値になっています。
A=78になっています。
これには説明が必要です。
/BPの働きは指定したアドレスの直前でブレークする機能です。
/BP 8075の場合8075のひとつ前8073のLDA $50の実行直後にブレークします。
そこでは$50にある値をAレジスタ(アキュムレータ)に入れています。
$50には8054 STA $50でその前に実行されたLSRの結果(=78)が入っています。
Xレジスタ、Yレジスタにはそれぞれプログラムの前のほうで実行したLDX、LDYでの値がそのまま残っています。
フラグレジスタはW65C02ではPレジスタなのですが直感的にPではイメージし難いのでここは独断と偏見でFにしています。
F=75ですがこれでは人間様にはわかりません。
ですのでその後ろの[]の中に各フラグごとの値を表示させています。
F=75をビットごとに示すと
[N=0 V=1 − B=1 D=0 I=1 Z=0 C=1]
になります。
直前に実行したLDA命令ではN、Zフラグのみ変化します。
Aレジスタにロードした値は78ですからN=0、Z=0です。
そのほかのフラグはそれよりも前にセット、クリアされたものがそのまま保持されています。
続いてブレーク操作をするには次のブレークポイント(任意の次にブレークさせたいアドレス)を/BPで設定します。
おや。
誤入力してしまいました。
コマンドは/をつけないとエラーになってしまいます。
/BP 8078[Enter]
と入力しました。
このあと
/RT[Enter]
と入力するとブレークして止まっていたアドレスから続きが実行されます。
そのときに次のブレークポイントが設定されていればそのアドレスで再びブレークします。
途中にBRA命令などがあって指定したブレークポイントが実行されないとそのまま(ブレークしないまま)プログラムが実行されてしまいます。
0000 ;w65c02test21b 26/8/19 0000 ; 0000 ;ASL,LSR,ROL,ROR 0000 ; 8000 org $8000 8000 ; 8000 ;set data 8000 A210 ldx #$10 (省略) 802B A09A ldy #$9a (省略) 8051 ;lsr start 8051 A540 lda $40;f0 8053 4A lsr;f0 11110000>01111000>78 8054 8550 sta $50;78 (省略) 8073 ;rol start 8073 A550 lda $50;78 8075 2A rol;78 01111000>11110001 c=0 f1 8076 8560 sta $60;f0 8078 2E0010 rol $1000;12 00010010>00100100 c=0 24 807B AD0010 lda $1000 807E 8561 sta $61;24 8080 3E0010 rol $1000,x;34 00110100>01101000 c=0 68 8083 BD0010 lda $1000,x 8086 8562 sta $62;68 8088 2610 rol $10;56 01010110>10101100 c=0 ac 808A A510 lda $10 808C 8563 sta $63;ac 808E 3610 rol $10,x;78 01111000>11110000 c=0 f0 8090 B510 lda $10,x 8092 8564 sta $64;f0 8094 ; 8094 ;ror start 8094 A560 lda $60 8096 6A ror;f0 11110001>01111000 c=1 78 8097 8570 sta $70;78 8099 6E0010 ror $1000;24 00100100>10010010 c=0 92 809C AD0010 lda $1000 809F 8571 sta $71;12 80A1 7E0010 ror $1000,x;68 01101000>3\00110100 c=0 34 80A4 BD0010 lda $1000,x 80A7 8572 sta $72;34 80A9 6610 ror $10;ac 10101100>01010110 c=0 56 80AB A510 lda $10 80AD 8573 sta $73;56 80AF 7610 ror $10,x;f0 11110000>01111000 c=0 78 80B1 B510 lda $10,x 80B3 8574 sta $74;78 80B5 DB stp 80B6 ;end |
W65C02マイコンボードの製作[第67回]
2026.9.7 upload
前へ
ホームページトップへ戻る