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


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

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

[第53回]



●BIT

BITはビットテスト命令です。
アキュムレータとメモリまたは即値との間のANDを計算してその結果によってZフラグをON/OFFします。
アキュムレータおよびメモリの値は変わりません。
BITはアキュムレータのみの命令です。
Xレジスタ、Yレジスタに対する命令はありません。
BITは一般に特定の1ビットが0か1かをチェックするのに使われます。
W65C02のBITにはそのほかに少し変わった機能があります。
ターゲット(オペランド)が即値以外の場合ターゲットのビット7の1、0がそのままNフラグの1、0になり、ビット6の1、0がVフラグの1、0になります。
BITには以下の命令があります。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 BIT a  2C  BIT $1234  3  4
 BIT a,x  3C  BIT $1234,x   3  4
 BIT #  89  BIT #$12  2  2
 BIT zp  24  BIT $12  2  3
 BIT zp,x  34  BIT $12,x  2  4

a a,x # zp zp,x はアドレッシングモードです。
aは絶対アドレスでzpはゼロページです。
,xはxの値で修飾することを示します。
#は8ビットの即値です。
16ビットの即値はありません。
W65C02のアドレッシングモードは[第4回]で説明していますので適宜参照してください。
下はテストプログラム(ソースプログラム)です。
;w65c02test26 26/8/11
;
;BIT
;
        org $8000
;
;       $30 stack on start
;       $31 stack on stop
;       $32 x on end of check(if not ff x is error adrs)
;       $33 y stack on end of check
;       $34 data
;       $35 stack data
;
        ldx #$fd;stack pointer
        txs
;set data
        ldx #$10
        lda #$12
        sta $1000;1000<12,,,a
        lda #$34
        sta $1000,x;1010<34,,,a,x
        lda #$56
        sta $10;10<56,,,zp
        lda #$78
        sta $21;$11,x,,,<78 zp,x
;
;start
        tsx;stack pointer to x
        stx $30
;
        php;???
        pha;dummy
        lda #$00
        ldx #$10
        bit #$c0
        php;0?xxxx1x
        pha
        inc;01
        bit #$c0
        php;0?xxxx1x
        pha
;
        asl;02
        bit $1000;12
        php;00xxxx0x
        pha
        asl;04
        bit $1000,x;34
        php;00xxxx0x
        pha
        asl;08
        bit #$bc
        php;00xxxx0x
        pha
        asl;10
        bit $10;56
        php;01xxxx0x
        pha
        asl;20
        bit $11,x;,,,21<78,,,zp,x
        php;01xxxx0x
        pha
        asl;40
        bit #$40
        php;01xxxx0x
        pha
        asl;80
        bit #$80
        php;11xxxx0x
        pha
        ldy #$80
        sty $20
        bit $20
        php;10xxxx0x
        pha
        tsx;stack pointer to x
        stx $31
;
;check data set
        lda #$80;stack f7
        sta $40
        lda #$c0
        sta $41
        lda #$40
        sta $42
        lda #$40
        sta $43
        lda #$40
        sta $44
        lda #$00
        sta $45
        lda #$00
        sta $46
        lda #$00
        sta $47
;
;check start
        ldx #$07
        ldy #$f7
loop:
        lda $0100,y
        and #$c2;flag
        cmp $40,x
        bne err
        dey
        dey
        dex
        bpl loop;end if x=ff
;check end
err:
        stx $32
        sty $33
        sta $35
        lda $40,x
        sta $34
        stp
;end

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

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

0000        ;w65c02test26 26/8/11
0000        ;
0000        ;BIT
0000        ;
8000            org $8000
8000        ;
8000        ;   $30 stack on start
8000        ;   $31 stack on stop
8000        ;   $32 x on end of check(if not ff x is error adrs)
8000        ;   $33 y stack on end of check
8000        ;   $34 data
8000        ;   $35 stack data
8000        ;
8000 A2FD       ldx #$fd;stack pointer
8002 9A         txs
8003        ;set data
8003 A210       ldx #$10
8005 A912       lda #$12
8007 8D0010     sta $1000;1000<12,,,a
800A A934       lda #$34
800C 9D0010     sta $1000,x;1010<34,,,a,x
800F A956       lda #$56
8011 8510       sta $10;10<56,,,zp
8013 A978       lda #$78
8015 8521       sta $21;$11,x,,,<78 zp,x
8017        ;
8017        ;start
8017 BA         tsx;stack pointer to x
8018 8630       stx $30
801A        ;
801A 08         php;???
801B 48         pha;dummy
801C A900       lda #$00
801E A210       ldx #$10
8020 89C0       bit #$c0
8022 08         php;0?xxxx1x
8023 48         pha
8024 1A         inc;01
8025 89C0       bit #$c0
8027 08         php;0?xxxx1x
8028 48         pha
8029        ;
8029 0A         asl;02
802A 2C0010     bit $1000;12
802D 08         php;00xxxx0x
802E 48         pha
802F 0A         asl;04
8030 3C0010     bit $1000,x;34
8033 08         php;00xxxx0x
8034 48         pha
8035 0A         asl;08
8036 89BC       bit #$bc
8038 08         php;00xxxx0x
8039 48         pha
803A 0A         asl;10
803B 2410       bit $10;56
803D 08         php;01xxxx0x
803E 48         pha
803F 0A         asl;20
8040 3411       bit $11,x;,,,21<78,,,zp,x
8042 08         php;01xxxx0x
8043 48         pha
8044 0A         asl;40
8045 8940       bit #$40
8047 08         php;01xxxx0x
8048 48         pha
8049 0A         asl;80
804A 8980       bit #$80
804C 08         php;11xxxx0x
804D 48         pha
804E A080       ldy #$80
8050 8420       sty $20
8052 2420       bit $20
8054 08         php;10xxxx0x
8055 48         pha
8056 BA         tsx;stack pointer to x
8057 8631       stx $31
8059        ;
8059        ;check data set
8059 A980       lda #$80;stack f7
805B 8540       sta $40
805D A9C0       lda #$c0
805F 8541       sta $41
8061 A940       lda #$40
8063 8542       sta $42
8065 A940       lda #$40
8067 8543       sta $43
8069 A940       lda #$40
806B 8544       sta $44
806D A900       lda #$00
806F 8545       sta $45
8071 A900       lda #$00
8073 8546       sta $46
8075 A900       lda #$00
8077 8547       sta $47
8079        ;
8079        ;check start
8079 A207       ldx #$07
807B A0F7       ldy #$f7
807D        loop:
807D B90001     lda $0100,y
8080 29C2       and #$c2;flag
8082 D540       cmp $40,x
8084 D005       bne err
8086 88         dey
8087 88         dey
8088 CA         dex
8089 10F2       bpl loop;end if x=ff
808B        ;check end
808B        err:
808B 8632       stx $32
808D 8433       sty $33
808F 8535       sta $35
8091 B540       lda $40,x
8093 8534       sta $34
8095 DB         stp
8096        ;end

やっぱり余りよいテストプログラムではありませんね。
何をやっているのかよくわからないプログラムになってしまいました。
フラグを確認するのが目的なのでフラグをスタックにプッシュしておいて後でそれを確認します。
フラグといっても確認する中心はZフラグです。
ターゲットが#$のときはNフラグ、Vフラグはそれ以前の値のままになります。
それ以外の場合にはNフラグ、Vフラグはターゲットのビット7、ビット6と同じになります。
Vフラグは何を知るためだかちょっとよくわかりませんがNフラグはターゲットが負数であることを確認するのに役立ちます。
ANDとかORAでも確認できますがその場合にはアキュムレータが変化してしまいます。
そのあたりが使い道かと思います。
このプログラムも試行しながら結果のフラグを確認しました。
プログラムの終わりにスタックにプッシュしたフラグ値を確認するためのチェックプログラムを置きました。
$30にはプログラム開始時のスタックポインタの値(FD)が入ります。
$31にはプログラム終了時のスタックポインタの値が入ります。
チェックの結果が全て正しければ$32にFFが入ります。
$33には終了時のスタックポインタの値が入ります。
チェックでエラーがあればそのときの比較データが$34に入り、フラグの値が$35に入ります。

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

実行後に$30〜の値を確認しました。
$30がFD、$31はE7になっています。
$32はFFなので比較が正しく終了したことがわかります。

念のため/DM 01でスタックエリアを表示しました。


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

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