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