2026.9.7
前へ

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


[新連載開始]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

前へ

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