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


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

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

[第28回]



●BBR

BBR命令は[第24回]の最初のところに少し書きました。
今まで書いてきました相対ジャンプ命令はオペランドが1つです。
それはZ80のJR命令などと同じです。
しかしBBRとBBSはオペランドが2つあります。
その1つは他の相対ジャンプ命令と同様にジャンプ先までの相対距離を示します。
もう1つは対象とするメモリのゼロページアドレスです。
どちらが第1オペランドでどちらが第2オペランドかについてその前の回では間違った記述をしてしまいました。
その後にテストプログラムを作って確かめてみたところ間違ったことを書いていたことがわかりましたので[第24回]で訂正をしました。
今回はその時にテストに使ったプログラムについて書きます。
下がテストプログラム(ソースプログラム)です。
        ;w65c02testc 26.7.26
        ;
        org $8000
;
        lda #$00
        sta $02
        sta $05
        bbr0 $02,$05
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        sta $12
        stp
;end

相対ジャンプ命令はラベルを使わないと何をやっているのかが分かり難いです。
しかし今回は相対ジャンプ距離を示すオペランドが第1バイトなのか第2バイトなのかを確認するためのテストプログラムですからラベルを使うわけにはいきません。
ラベルはW65C02アセンブラの機能なのですが今回のテストの結果を見なければアセンブラにBBRとBBSのラベル機能を組み込むことができません。何を言っているのかよくわからんぞということかもしれませんが。
まましばらくご辛抱を。
W65C02アセンブラでアセンブルしました。


下はアセンブルした結果生成されたリストファイルです。
0000            ;w65c02testc 26.7.26
0000            ;
8000            org $8000
8000        ;
8000 A900       lda #$00
8002 8502       sta $02
8004 8505       sta $05
8006 0F0205     bbr0 $02,$05
8009 1A         inc
800A 1A         inc
800B 1A         inc
800C 1A         inc
800D 1A         inc
800E 1A         inc
800F 1A         inc
8010 1A         inc
8011 1A         inc
8012 1A         inc
8013 1A         inc
8014 1A         inc
8015 8512       sta $12
8017 DB         stp
8018        ;end

このプログラムで何がやりたいかと言いますと。
BBR0はゼロページアドレスの値のビット0が0の時にジャンプする命令です。
もし$02がゼロページアドレスならば$02の値は00ですから相対ジャンプ値$05が示す先にジャンプします。
もし$05がゼロページアドレスならば$05の値は00ですから相対ジャンプ値$02が示す先にジャンプします。
厳密に言えば相対ジャンプ値はただの16進数ですから#をつけなければいけません。
しかしこの命令のそもそもの定義として相対ジャンプ値を置くべきオペランドは定数値としての16進数しか置けません。
つまりその値がゼロページアドレスとされることはありません。
ということで自作W65C02アセンブラでは$xxと書いてもそれがゼロページとして解釈されない命令に対しては#を省略しても構わないというゆるいアセンブラにしてあります。
65c02testc.binをロードして/runを実行しました。

結果は。
/CMで0012を確認したところ/RUNを実行する前はDEだったのが07になりました。
さきほどのリストを再掲します。
0000            ;w65c02testc 26.7.26
0000            ;
8000            org $8000
8000        ;
8000 A900       lda #$00
8002 8502       sta $02
8004 8505       sta $05
8006 0F0205     bbr0 $02,$05
8009 1A         inc
800A 1A         inc
800B 1A         inc
800C 1A         inc
800D 1A         inc
800E 1A         inc
800F 1A         inc
8010 1A         inc
8011 1A         inc
8012 1A         inc
8013 1A         inc
8014 1A         inc
8015 8512       sta $12
8017 DB         stp
8018        ;end

0012の値は07ですからincが7回実行されたことになります。
するとジャンプ先のアドレスは800Eです。
ジャンプ前のPCの値は8009のはずですから800E−8009を計算すると5になります。
BBR0の第2オペランドが$05ですからこのテストの結果から第2オペランドが相対ジャンプ移動量を示していることが分かりました。
そういうことですけれど。
念には念を入れて。
もうひとつテストプログラムを書きました。
念のために。
BBR0の第2オペランドの値を$04にしました。
下がソースプログラムです。
        ;w65c02testd 26.7.26
        ;
        org $8000
;
        lda #$00
        sta $02
        sta $04
        bbr0 $02,$04
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        inc
        sta $12
        stp
;end

W65C02アセンブラでアセンブルしました。


下はアセンブルした結果生成されたリストファイルです。
0000            ;w65c02testd 26.7.26
0000            ;
8000            org $8000
8000        ;
8000 A900       lda #$00
8002 8502       sta $02
8004 8504       sta $04
8006 0F0204     bbr0 $02,$04
8009 1A         inc
800A 1A         inc
800B 1A         inc
800C 1A         inc
800D 1A         inc
800E 1A         inc
800F 1A         inc
8010 1A         inc
8011 1A         inc
8012 1A         inc
8013 1A         inc
8014 1A         inc
8015 8512       sta $12
8017 DB         stp
8018        ;end

アドレス8008以外は前回と同じマシン語コードに翻訳されました。
結果は想像できますけれど念のためです。
実行して確認をしてみます。

実行した結果0012の値は08になりました。
inc命令が8回実行されたことを示しています。
ジャンプ先アドレスは800Dです。
800D−8009=4ですから第2オペランドの値と一致しています。

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

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