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


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

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

[第45回]



●INC,INX,INY,DEC,DEX,DEY●リセットとスタックポインタの値

このところW65C02の命令について検証をしながら書いています。
実は昨日時点でW65C02の全ての命令について検証を終りました。
命令だけではなくてINT(IRQB)、NMI(NMIB)についても動作確認済みです。
それらの検証にあたってはテストプログラムを作成して実際に実行して動作を確認しました。
テストプログラムは前回実行したのがbP9ですが本日時点でプログラムbS1まで作成しています。
それらの検証結果についてはノートに要点を記録すると同時にホームページの下書きの形で書き進めてきています。
今日現在で[第65回]まで書いています。
それらはこれから毎日順次アップロードしていくつもりです。
ちなみに[第63回]はNMI/RETI、[第64回]はIRQB、[第65回]はWAIです。
検証作業を進めていくなかで新たに経験することがいろいろ出てきます。
まだアップロードしていない記事については経験したことをもとにして内容を修正したりしていますがすでにアップロードした後でわかったこともあります。
それについてはとりあえず過去記事のその部分に訂正のための取消線を入れた上で後日追記するように考えています。

今回は元の下書き原稿ではINC〜DEYについて説明するだけでしたが表記タイトルの通りスタックポインタについて追記いたします。
過去記事で、リセットするとスタックポインタの値がFDに初期化されると書きました。
ところがテストを進めていくうちにそのようにならない事例を経験するようになりました。
ハードウェアリセット(pin40へのL入力)によってもそのようにならずになんだかおかしな値になるというものです。
完全に電源をOFFにしてパワーオンリセットが利く状態の後ではスタックポインタの値がFDになります。
どうもこれはおかしいということでその後はテストプログラムの先頭にスタックポインタに初期値(のつもりで)FDを入れるようにしました。
それが本日(8月16日)になってさらに進んだプログラムとその動作テストをするなかで通常の電源ONの状態でハードウェアリセットをかけるとスタックポインタの値がその直前の値−3になることを確認しました。
Z80や8080はリセットによってスタックポインタに初期値は設定されません。
ところがたまたまW65C02ではFDになることを経験したためW65C02ではそうなのかと思ってしまいました。
しかし今回リセットによってそれ以前のスタックポインタの値が−3されることを経験してどうもそこには何かがあるらしいと気付きました。
こちらがその確認をしたときの画像です。

スタックポインタにFDをセットした後にリセットをかけるとそれだけでその値がFAになってしまいます。
上の画像ではアドレスFD、FC、FBを飛ばしてスタックへの値の格納がFAからになっています。
これはおかしい。
こういうときにはGoogle様にお聞きするのが一番得策なようです。
それでお尋ねしてみましたら。

うわあ。
何だそれは。
でも納得であります。
Google様のおかげでまたひとつ謎がクリアされました。

以上スタックポインタに関しての追記でした。
本題に戻ります。

INCはメモリの値を+1します。
オペランド無しのINC命令はアキュムレータを+1します。
演算の結果によってNおよびZフラグがセット、リセットされます。
N(Negative)は結果が負のときにセットされ0または正のときリセットされます。
Z(Zero)は結果が0のときにセットされます。
以下の命令があります。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 INC a  EE  ADC $1234  3  6
 INC a,x  FE  ADC $1234,x   3  7
 INC zp  E6  ADC $12  2  5
 INC zp,x  F6  ADC $12,x  2  6
 INC A  1A  INC  1  2

a a,x zp zp,xはアドレッシングモードです。
aは絶対アドレスでzpはゼロページです。
,xはxの値で修飾することを示します。
Aはアキュムレータです(アセンブラ書式ではオペランド無しになります)。
W65C02のアドレッシングモードは[第4回]で説明していますので適宜参照してください。

INXはXレジスタを+1します。
フラグについてはINCと同じです。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 INX  E8  INX  1  2


INYはYレジスタを+1します。
フラグについてはINCと同じです。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 INY  C8  INY  1  2


DECはメモリの値を−1します。
オペランド無しのDEC命令はアキュムレータを−1します。
演算の結果によってNおよびZフラグがセット、リセットされます。
N(Negative)は結果が負のときにセットされ0または正のときリセットされます。
Z(Zero)は結果が0のときにセットされます。
以下の命令があります。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 DEC a  CE  DEC $1234  3  6
 DEC a,x  DE  DEC $1234,x   3  7
 DEC zp  C6  DEC $12  2  5
 DEC zp,x  D6  DEC $12,x  2  6
 DEC A  3A  DEC  1  2


DEXはXレジスタを−1します。
フラグについてはDECと同じです。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 DEX  CA  DEX  1  2


DEYはYレジスタを−1します。
フラグについてはにDECと同じです。
 ニーモニック  マシン語コード  アセンブラ書式 バイト数 クロック数
 DEY  88  DEY  1  2



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

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