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