[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第55回]
●BBR,BBS
BBR、BBSは[第28回]で説明をしました。
前回のBRAなどと同じ相対ジャンプ命令です。
BBRはBEQに近い命令です。
またBBSはBNEに近い命令です。
BEQ、BNEは直前のZフラグの状態によってジャンプします。
それに対してBBR、BBSは指定するゼロページアドレスのデータの特定ビットが0か1かによってジャンプします。
BRAなどのオペランドはジャンプ先までのバイト数データのみですがBBR、BBSはゼロページアドレスとジャンプ先までのバイト数データの2つのオペランドを持ちます。
BBRには以下の命令があります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| BBR0 zp,r | 0F | BBR0 $12,#$34 | 2 | 2 |
| BBR1 zp,r | 1F | BBR1 $12,#$34 | 2 | 2 |
| BBR2 zp,r | 2F | BBR2 $12,#$34 | 2 | 2 |
| BBR3 zp,r | 3F | BBR3 $12,#$34 | 2 | 2 |
| BBR4 zp,r | 4F | BBR4 $12,#$34 | 2 | 2 |
| BBR5 zp,r | 5F | BBR5 $12,#$34 | 2 | 2 |
| BBR6 zp,r | 6F | BBR6 $12,#$34 | 2 | 2 |
| BBR7 zp,r | 7F | BBR7 $12,#$34 | 2 | 2 |
zpはゼロページアドレスを示します。
rは相対ジャンプの値数であることを示します。
BBR0はゼロページアドレスのデータのビット0が0の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
フラグ、ゼロページアドレスのデータは変化しません。
BBR1〜BBR7はそれぞれゼロページアドレスのデータのビット1〜7が0の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
フラグ、ゼロページアドレスのデータは変化しません。
BBSには以下の命令があります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| BBS0 zp,r | 8F | BBS0 $12,#$34 | 2 | 2 |
| BBS1 zp,r | 9F | BBS1 $12,#$34 | 2 | 2 |
| BBS2 zp,r | AF | BBS2 $12,#$34 | 2 | 2 |
| BBS3 zp,r | BF | BBS3 $12,#$34 | 2 | 2 |
| BBS4 zp,r | CF | BBS4 $12,#$34 | 2 | 2 |
| BBS5 zp,r | DF | BBS5 $12,#$34 | 2 | 2 |
| BBS6 zp,r | EF | BBS6 $12,#$34 | 2 | 2 |
| BBS7 zp,r | FF | BBS7 $12,#$34 | 2 | 2 |
BBS0はゼロページアドレスのデータのビット0が1の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
フラグ、ゼロページアドレスのデータは変化しません。
BBS1〜BBS7はそれぞれゼロページアドレスのデータのビット1〜7が1の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
フラグ、ゼロページアドレスのデータは変化しません。
下はテストプログラム(ソースプログラム)です。
;w65c02test28 26/8/11
;
;bbr,bbs
;
org $8000
;
stz $00
lda #$01
sta $01
bbr0 $00,jp1;bbr0
bra err0
jp2:
bbr1 $01,jp3;bbr1,01<01
bra err2
jp4:
bbr2 $01,jp5;01<01
bra err2
jp6:
bbr3 $01,jp7;01<04
bra err2
jp8:
bbr4 $01,jp9;01<08
bra err2
jp10:
bbr5 $01,jp11;01<10
bra err2
jp12:
bbr6 $01,jp13;01<20
bra err2
jp14:
bbr7 $01,jp15;01<40
bra err2
;
jp1:
bbs0 $01,jp2;bbs0,01<01
bra err1
jp3:
asl $01;01<02
bbs1 $01,jp4;bbs1
bra err1
jp5:
asl $01;01<04
bbs2 $01,jp6
bra err1
jp7:
asl $01;01<08
bbs3 $01,jp8
bra err1
jp9:
asl $01;01<10
bbs4 $01,jp10
bra err1
jp11:
asl $01;01<20
bbs5 $01,jp12
bra err1
jp13:
asl $01;01<40
bbs6 $01,jp14
bra err1
jp15:
asl $01;01<80
bbs7 $01,end
bra err1
;
err0:stz $02
stp
err1:
lda #$01
sta $02
stp
err2:
lda #$02
sta $02
stp
end:
lda #$03
sta $02
stp
;end
|
W65C02アセンブラでアセンブルしました。

下はアセンブルした結果作成されたアセンブルリストです。
0000 ;w65c02test28 26/8/11 0000 ; 0000 ;bbr,bbs 0000 ; 8000 org $8000 8000 ; 8000 6400 stz $00 8002 A901 lda #$01 8004 8501 sta $01 8006 0F0025 bbr0 $00,jp1;bbr0 8009 8059 bra err0 800B jp2: 800B 1F0125 bbr1 $01,jp3;bbr1,01<01 800E 805A bra err2 8010 jp4: 8010 2F0127 bbr2 $01,jp5;01<01 8013 8055 bra err2 8015 jp6: 8015 3F0129 bbr3 $01,jp7;01<04 8018 8050 bra err2 801A jp8: 801A 4F012B bbr4 $01,jp9;01<08 801D 804B bra err2 801F jp10: 801F 5F012D bbr5 $01,jp11;01<10 8022 8046 bra err2 8024 jp12: 8024 6F012F bbr6 $01,jp13;01<20 8027 8041 bra err2 8029 jp14: 8029 7F0131 bbr7 $01,jp15;01<40 802C 803C bra err2 802E ; 802E jp1: 802E 8F01DA bbs0 $01,jp2;bbs0,01<01 8031 8032 bra err1 8033 jp3: 8033 0601 asl $01;01<02 8035 9F01D8 bbs1 $01,jp4;bbs1 8038 802B bra err1 803A jp5: 803A 0601 asl $01;01<04 803C AF01D6 bbs2 $01,jp6 803F 8024 bra err1 8041 jp7: 8041 0601 asl $01;01<08 8043 BF01D4 bbs3 $01,jp8 8046 801D bra err1 8048 jp9: 8048 0601 asl $01;01<10 804A CF01D2 bbs4 $01,jp10 804D 8016 bra err1 804F jp11: 804F 0601 asl $01;01<20 8051 DF01D0 bbs5 $01,jp12 8054 800F bra err1 8056 jp13: 8056 0601 asl $01;01<40 8058 EF01CE bbs6 $01,jp14 805B 8008 bra err1 805D jp15: 805D 0601 asl $01;01<80 805F FF010D bbs7 $01,end 8062 8001 bra err1 8064 ; 8064 err0:stz $02 8064 DB stp 8065 err1: 8065 A901 lda #$01 8067 8502 sta $02 8069 DB stp 806A err2: 806A A902 lda #$02 806C 8502 sta $02 806E DB stp 806F end: 806F A903 lda #$03 8071 8502 sta $02 8073 DB stp 8074 ;end |
2週間ほど前に作ってテストしたプログラムなのですがこうして今見るとなんだかなあというよくわからないプログラムを書いています。
先頭のstz $00は意味がありません。
多分前に書いたプログラムの消し忘れかと。
BBRの最初の
BBR0 $00,JP1
はその前に実行した
STZ $00
を受けているのですが肝心のZの値が不明ですからここも間違っています。
このときだけerr0にジャンプしているのもおかしいですね。
そのほかのところは一応間違ってはいないようなので今回はこのままにしておきます。
ちょっとややこしいことをやっています。
同時にマイナス方向へのジャンプの確認をしようとしたので余計にわかりにくいプログラムになってしまいました。
エラーがあった場合BBS命令のエラーなら$02に01が入ります。
BBR命令のエラーなら$02に01が入ります。
そのときのビットが$01に残ります。
エラーが無く正常に終了した時は$02は03になります。
65c02test28.binをロードして実行しました。

$02が03なのでエラー無く正常に終了したことがわかります。
$01は最後のビット7のチェックのための値80になっています。
W65C02マイコンボードの製作[第55回]
2026.8.26 upload
前へ
次へ
ホームページトップへ戻る