[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第41回]
●ADC,SBC
ADCはキャリーを含む8ビットの加算命令です。
アキュムレータとメモリまたは即値とキャリーを加算して結果をアキュムレータに格納します。
ADCと次のSBCはアキュムレータのみに対する演算です。
Xレジスタ、Yレジスタに対する加算、減算命令はありません。
演算の結果によってN、V、Z、Cの各フラグがセット、リセットされます。
N(Negative)は結果が負のときにセットされ0または正のときリセットされます。
V(Overflow)はオーバーフローのときセットされます。
Z(Zero)は結果が0のときにセットされます。
C(Carry)はキャリーが発生したときにセットされます。
フラグレジスタは8ビットでビット内の配列は次の通りです。
N V x x x x Z C
xについては今は気にしなくてよいです。
以下の命令があります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| ADC a | 6D | ADC $1234 | 3 | 4 |
| ADC a,x | 7D | ADC $1234,x | 3 | 4 |
| ADC a,y | 79 | ADC $1234,y | 3 | 4 |
| ADC # | 69 | ADC #$12 | 2 | 2 |
| ADC zp | 65 | ADC $12 | 2 | 3 |
| ADC (zp,x) | 61 | ADC ($12,x) | 2 | 6 |
| ADC (zp) | 72 | ADC ($12) | 2 | 5 |
| ADC zp,x | 75 | ADC $12,x | 2 | 4 |
| ADC (zp),y | 71 | ADC ($12),y | 2 | 5 |
a a,x a,y # zp (zp,x) (zp) zp,x (zp),y はアドレッシングモードです。
aは絶対アドレスでzpはゼロページです。
,xはxの値で修飾することを示します。
,yはxの値で修飾することを示します。
#は8ビットの即値です。
16ビットの即値はありません。
()は間接アドレス指定です。
()内で指定するアドレスの値が最終的な下位アドレスになりその次のアドレスの値が最終的な上位アドレスになります。
W65C02のアドレッシングモードは[第4回]で説明していますので適宜参照してください。
SBCはキャリー(ボロー)を含む8ビットの減算命令です。
アキュムレータからメモリまたは即値とキャリー(ボロー)を減算して結果をアキュムレータに格納します。
フラグについてはADCと同じです。
以下の命令があります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| SBC a | ED | SBC $1234 | 3 | 4 |
| SBC a,x | FD | SBC $1234,x | 3 | 4 |
| SBC a,y | F9 | SBC $1234,y | 3 | 4 |
| SBC # | E9 | SBC #$12 | 2 | 2 |
| SBC zp | E5 | SBC $12 | 2 | 3 |
| SBC (zp,x) | E1 | SBC ($12,x) | 2 | 6 |
| SBC (zp) | F2 | SBC ($12) | 2 | 5 |
| SBC zp,x | F5 | SBC $12,x | 2 | 4 |
| SBC (zp),y | F1 | SBC ($12),y | 2 | 5 |
SBCのCフラグはややこしいです。
どうしてそういう仕様になっているのかちょっと納得がいかぬところがあります。
そのことについては後の回で実際のプログラムを使って説明をするつもりです。
W65C02マイコンボードの製作[第41回]
2026.8.12 upload
前へ
次へ
ホームページトップへ戻る