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


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

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

[第54回]



●BRA,BCC,BCS,BNE,BEQ,BPL,BMI,BVC,BVS

前回説明しましたBIT命令のマシン語コードが間違っていましたので修正しました。

BRAは相対ジャンプ命令です。
現在のプログラムカウンタにオペランドの値(+127〜−128)を加算することでその範囲のアドレスにジャンプします。
オペランドの値数は8ビットの値です。
符号付きの16進数です。
00〜7F(0〜127)が+方向へのジャンプでFF〜80(−1〜−128)が−方向へのジャンプです。
BRAは[第23回][第27回]でオペランドの値数とジャンプするアドレスとの関係について検証しています。
BCC〜BVSも同じ相対ジャンプ命令ですがBRAが無条件でジャンプするのに対してBCC〜BVSはそれぞれ対象とするフラグのON/OFFによってジャンプします。
以下の命令があります。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 BRA r  80  BRA #$12  2  3/4
 BCC r  90  BCC #$12  2  2/3/4
 BCS r  B0  BCS #$12  2  2/3/4
 BNE r  D0  BNE #$12  2  2/3/4
 BEQ r  F0  BEQ #$12  2  2/3/4
 BPL r  10  BPL #$12  2  2/3/4
 BMI r  30  BMI #$12  2  2/3/4
 BVC r  50  BVC #$12  2  2/3/4
 BVS r  70  BVS #$12  2  2/3/4

rは相対ジャンプの値数であることを示します。
BCCはCフラグ(キャリーフラグ)が0(Clear)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BCSはCフラグ(キャリーフラグ)が1(Set)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BNEはZフラグが0(Not Equal)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BEQはZフラグが1(Equal)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BPLはNフラグが0(結果がPlus)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BMIはNフラグが1(結果がMinus)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BVCはVフラグが0(Clear)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
BVSはVフラグが1(Set)の時にrが示すアドレス(相対アドレス)にジャンプします。
それ以外の時は次の命令を実行します。
下はテストプログラム(ソースプログラム)です。
;w65c02test27 26/8/11
;
;branch
;
        org $8000
;
        ldx #$fd
        txs
        lda #$01
        sta $30
        ldx #$00
        php;0?xxxx1?
        pha
        bra jp1;bra
jp2:
        asl;c=0 a=0
        php;0?xxxx10
        pha
        bcc jp3;bcc             
        ldx #$02
        bra err
jp4:
        inc;a=01
        php;0?xxxx00
        pha
        bne jp5;bne
        ldx #$04
        bra err
jp6:
        ror;a=0,c=1
        ror;a=80,c=0
        php;1?xxxx00
        pha
        bmi jp7
        ldx #$06
        bra err
jp8:
        adc #$01;a=02,c=0
        php;00xxxx00
        pha
        bvc end
        ldx #$08
        bra err
;
jp1:
        lsr;c=1 a=0
        php;0?xxxx11
        pha
        bcs jp2;bcs
        ldx #$01
        bra err
jp3:
        php;0?xxxx10
        pha
        beq jp4;beq
        ldx #$03
        bra err
jp5:
        php;0?xxxx00
        pha
        bpl jp6;bpl
        ldx #$05
        bra err
jp7:
        adc #$80;a=0,v=1,c=1
        php;01xxxx11
        pha
        bvs jp8;bvs
        ldx #$07
        bra err
;
;stack
;fd 0?xxxx1?
;fb 0?xxxx11
;f9 0?xxxx10
;f7 0?xxxx10
;f5 0?xxxx00
;f3 0?xxxx00
;f1 1?xxxx00
;ef 01xxxx11
;ed 00xxxx00
;
end:
err:
        stx $30;if not err $30<00
        tsx
        stx $31;sp
        stp
;end

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

下はアセンブルした結果作成されたアセンブルリストです。

0000        ;w65c02test27 26/8/11
0000        ;
0000        ;branch
0000        ;
8000            org $8000
8000        ;
8000 A2FD       ldx #$fd
8002 9A         txs
8003 A901       lda #$01
8005 8530       sta $30
8007 A200       ldx #$00
8009 08         php;0?xxxx1?
800A 48         pha
800B 8026       bra jp1;bra
800D        jp2:
800D 0A         asl;c=0 a=0
800E 08         php;0?xxxx10
800F 48         pha
8010 902A       bcc jp3;bcc             
8012 A202       ldx #$02
8014 8040       bra err
8016        jp4:
8016 1A         inc;a=01
8017 08         php;0?xxxx00
8018 48         pha
8019 D029       bne jp5;bne
801B A204       ldx #$04
801D 8037       bra err
801F        jp6:
801F 6A         ror;a=0,c=1
8020 6A         ror;a=80,c=0
8021 08         php;1?xxxx00
8022 48         pha
8023 3027       bmi jp7
8025 A206       ldx #$06
8027 802D       bra err
8029        jp8:
8029 6901       adc #$01;a=02,c=0
802B 08         php;00xxxx00
802C 48         pha
802D 5027       bvc end
802F A208       ldx #$08
8031 8023       bra err
8033        ;
8033        jp1:
8033 4A         lsr;c=1 a=0
8034 08         php;0?xxxx11
8035 48         pha
8036 B0D5       bcs jp2;bcs
8038 A201       ldx #$01
803A 801A       bra err
803C        jp3:
803C 08         php;0?xxxx10
803D 48         pha
803E F0D6       beq jp4;beq
8040 A203       ldx #$03
8042 8012       bra err
8044        jp5:
8044 08         php;0?xxxx00
8045 48         pha
8046 10D7       bpl jp6;bpl
8048 A205       ldx #$05
804A 800A       bra err
804C        jp7:
804C 6980       adc #$80;a=0,v=1,c=1
804E 08         php;01xxxx11
804F 48         pha
8050 70D7       bvs jp8;bvs
8052 A207       ldx #$07
8054 8000       bra err
8056        ;
8056        ;stack
8056        ;fd 0?xxxx1?
8056        ;fb 0?xxxx11
8056        ;f9 0?xxxx10
8056        ;f7 0?xxxx10
8056        ;f5 0?xxxx00
8056        ;f3 0?xxxx00
8056        ;f1 1?xxxx00
8056        ;ef 01xxxx11
8056        ;ed 00xxxx00
8056        ;
8056        end:
8056        err:
8056 8630       stx $30;if not err $30<00
8058 BA         tsx
8059 8631       stx $31;sp
805B DB         stp
805C        ;end

フラグによってジャンプするのでそのときのフラグをスタックにプッシュしながら進みます。
フラグの状態とそれによってジャンプするアドレスが想定したものと違っていた場合にはerr:にジャンプします。
エラーの場合には$30にそのときのXレジスタの値が入ります。
また$31にはそのときのスタックポインタの値が入ります。
エラーが無く正しく終了した場合には$30には00が入ります。

65c02test27.binをロードして実行しました。

$30は00ですからプログラムが正しく実行されたことがわかります。

念のために/DM 01でスタックの値を確認しました。


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

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