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