[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第25回]
●BRA(3)後方への相対ジャンプ
前回はBRA命令の前方へのジャンプについて確認をしました。
今回は後方への相対ジャンプについて検証します。
相対距離の値の算出方法は前方にジャンプする場合と同じですがその値が負数であるというところが直感的な理解を妨げます。
ともかくはテストプログラムを作ってそれを実行した結果がどうなるかを確認してみることにします。
後方にジャンプするプログラムは少し面倒です。
こんなプログラムを作ってみました。
これはアセンブラのソースプログラムです。
プログラムの考え方は前回の前方への相対ジャンププログラムと基本的に同じです。
;w65c02test7 26.7.23
;
org $8000
;
lda #$00
bra #$05
dec
dec
sta $10
stp
bra #$f9
;end
|
何をやっているのかはマシン語プログラムを見ないとすぐには理解できません。
W65C02アセンブラでアセンブルしました。

下がW65C02アセンブラを実行して得られたアセンブルリストです。
0000 ;w65c02test7 26.7.23 0000 ; 8000 org $8000 8000 ; 8000 A900 lda #$00 8002 8005 bra #$05 8004 3A dec 8005 3A dec 8006 8510 sta $10 8008 DB stp 8009 80F9 bra #$f9 800B ;end |
アキュムレータに00を入れた後BRA命令で5バイト分の距離を相対ジャンプします。
ジャンプ先は8004+5=8009になります。
そこには後方への相対ジャンプ命令BRA #$F9があります。
前回のテストによって相対ジャンプでのオペランドの算出方法はすでに確認できていますからここではその考えに基いて必要な値を事前に算出してあります。
8009のBRA命令によってジャンプしたいアドレスは後方の8004です。
その計算は8004−800Bを行なうことで得られます。
結果は負数になります。
筆算ではこうなります。
104 …引ききれないので上位にボローの1を置く
00B(− これは10進数で考えて260−11の計算をすることと同じ
F9 =249
CPUがする16進数の計算だとそうなります。
負数の計算はわかりにくいですよねえ。
本当にそういうことでよいのか実際にバイナリファイルをロードして実行して確認してみます。

今回は最後にアキュムレータの値をアドレス0010に入れます。
なのでプログラムを実行する前に/CMで0010の値を確認しました。
プログラム実行前の0010の値は3Aでした。
/RUNを実行した後再度/CMで0010の値を確認したところFEに変わっていました。
もう一度先ほどのアセンブルリストを再掲します。
0000 ;w65c02test7 26.7.23 0000 ; 8000 org $8000 8000 ; 8000 A900 lda #$00 8002 8005 bra #$05 8004 3A dec 8005 3A dec 8006 8510 sta $10 8008 DB stp 8009 80F9 bra #$f9 800B ;end |
BRA #$F9の実行によってアドレス8004に戻った後DEC命令を2回実行してからその結果の値を0010に書いてSTOPします。
最初に00だったところからDECを2回実行しましたから結果はFEになります。
後方にジャンプするBRA命令についても考えた通りの結果になることが確認できました。
W65C02マイコンボードの製作[第25回]
2026.7.27 upload
前へ
次へ
ホームページトップへ戻る