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


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

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

[第58回]



●JMP

JMP命令は絶対アドレスを指定する命令と間接アドレス指定の命令があります。
フラグは変化しません。
以下の命令があります。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 JMP a  4C  JMP $1234  3  3
 JMP (a)  6C  JMP ($1234)  3  5
 JMP (a,x)  7C  JMP ($1234,x)  3  6

a (a) (a,x)はアドレッシングモードです。
aは絶対アドレスです。
,xはxの値で修飾することを示します。
()は間接アドレス指定です。
()内で指定するアドレスの値が最終的な下位アドレスになりその次のアドレスの値が最終的な上位アドレスになります。
(a)、(a,x)はJMP以外では使われません。
W65C02のアドレッシングモードは[第4回]で説明していますので適宜参照してください。

下はテストプログラム(ソースプログラム)です。
;w65c02test32 26/8/12
;
;JMP
;
        org $8000
;
        lda #$20;jp2
        sta $10
        ldy #$80
        sty $11
        lda #$29;jp3
        sta $20
        sty $21
        ldx #$10
        jmp jp1
;
        nop
        nop
        nop
;
jp1:
        lda #$00
        sta $00
        jmp ($0010);jp2
;
        nop
        nop
        nop
;
;jp2
        inc
        sta $01
        jmp ($0010,x);jp3
;
        nop
        nop
        nop
;
;jp3
        inc
        sta $02
        stp
;end

nopに意味はありません。
適当に入れているだけです。
W65C02アセンブラでアセンブルしました。

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

0000        ;w65c02test32 26/8/12
0000        ;
0000        ;JMP
0000        ;
8000            org $8000
8000        ;
8000 A920       lda #$20;jp2
8002 8510       sta $10
8004 A080       ldy #$80
8006 8411       sty $11
8008 A929       lda #$29;jp3
800A 8520       sta $20
800C 8421       sty $21
800E A210       ldx #$10
8010 4C1680     jmp jp1
8013        ;
8013 EA         nop
8014 EA         nop
8015 EA         nop
8016        ;
8016        jp1:
8016 A900       lda #$00
8018 8500       sta $00
801A 6C1000     jmp ($0010);jp2
801D        ;
801D EA         nop
801E EA         nop
801F EA         nop
8020        ;
8020        ;jp2
8020 1A         inc
8021 8501       sta $01
8023 7C1000     jmp ($0010,x);jp3
8026        ;
8026 EA         nop
8027 EA         nop
8028 EA         nop
8029        ;
8029        ;jp3
8029 1A         inc
802A 8502       sta $02
802C DB         stp
802D        ;end

最初に絶対JMP命令JMP JP1を実行します。
JMP先のアドレスJP1($8016)のところで$00に00を入れます。
次の相対JMP命令JMP ($0010)は$0010、$0011に入れたアドレスへのジャンプです。
$0010、$0011にはプログラムの先頭で8020を入れてありますから$8020(JP2)へジャンプします。
ジャンプ先で$01に01を入れます。
次の相対JMP命令JMP ($0010,x)は$0010にXの値を加算したアドレスに入っているアドレス(ほんとにややこしいです)にジャンプします。
Xにはプログラムの前の方で10を入れてありますから$0020と$0021に入っているアドレスにジャンプします。
$0020、$0021にはプログラムの先頭で8029を入れてありますから$8029(JP3)へジャンプします。
ジャンプ先で$02に02を入れます。

65c02test32.binをロードして/runを実行しました。

実行した結果アドレス00に00が、アドレス01に01が、アドレス02に02が入りました。

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

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