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


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

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