2026.9.20
前へ

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


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

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

[第77回]



●BBR、BBSのバイト数、クロック数を訂正しました

前回のログの/CMがつぶれていましたので直しました。
現在W65C02命令説明書の作成を進めています。
頑張って作業したお蔭でほぼ完了直前まで進めました。
その過程で過去記事のミスを発見しました。
[第55回]でBBRとBBSについて説明していますが命令のバイト数が2になっています。
本文ではオペランドが2バイトあると書いているのに(ということは命令コードを含めると3バイトになります)表は2バイトになっています。
それとクロック数も2になっています。
これも明らかにおかしいです。
W65C02の命令クロック数についてはこちら↓から引用させていただいたのですが。
https://www.zophar.net/fileuploads/2/10533qqcap/6502ref.html
あらためて確認してみたところそのようになっていました。
どうやら誤記のようです。
こういう場合はGoogle様にお聞きすることが多くなりました。
それで今回もお尋ねしてみましたところ下のご託宣をいただきました。



しかし。
ちょいと怪しいフシがあります。
ページをまたぐ場合には1クロック追加になるというところは素直に納得いたします。
しかし分岐しても分岐しなくても同じクロック数というところはどうもおかしい。
Googleはときとしてまことしやかにしれっとして真っ赤な嘘を吐くことがありますです。
ご用心ご用心。

疑念が生じたときは身をもって体験してみるべきであります。
過去記事を確認してみたところ[第28回]で簡単なプログラムを作って動作確認をしています。
このプログラムを使ってロジアナで確認をしてみることにしました。
下はアセンブルした結果生成されたリストファイルです。
0000            ;w65c02testc 26.7.26
0000            ;
8000            org $8000
8000        ;
8000 A900       lda #$00
8002 8502       sta $02
8004 8505       sta $05
8006 0F0205     bbr0 $02,$05
8009 1A         inc
800A 1A         inc
800B 1A         inc
800C 1A         inc
800D 1A         inc
800E 1A         inc
800F 1A         inc
8010 1A         inc
8011 1A         inc
8012 1A         inc
8013 1A         inc
8014 1A         inc
8015 8512       sta $12
8017 DB         stp
8018        ;end

[第28回]でこのプログラムを実行してその結果を確認しています。
BBR0はゼロページアドレスの値のビット0が0の時にジャンプする命令です。
$02の値は00ですから相対ジャンプ値$05が示す先にジャンプします。
プログラムを実行した結果からジャンプ先のアドレスが$800Eであることがわかりました。
そのデータをもとにして65C02TESTC.BINをロードして実行してみました。

/RUNを2回実行していますがそのわけは後で説明します。
下は1回目の/RUNを実行してそれをカメレオンロジアナで測定した画像です。

今回の目的はBBR0の実行クロック数の確認です。
それだけならアドレスの下位4ビットとクロックを見ればわかるはずです。
PROBE00〜PROBE03はA0〜A3です。
PROBE04はCPUクロックです。
今回はCPUクロック10MHzで実行しました。
PROBE03のところにアドレスを追記しました。
BBR0は$8006〜$8008の3バイトです。
PROBE04のところにBBR0の実行クロックを追記しました。
クロックbRと4で$02を読んで確認しているようです。
其の後クロックbTでジャンプ先データ(アドレス$8008)を読んでいます。
そしてクロックbUでアドレス$8009を読んだ後$800Eにジャンプしたことがわかります。
命令の意味から考えるとクロックbUのアドレス$8009はダミーリードと考えられます。
この場合800Eにジャンプするまでにかかったクロック数は6クロックだということになります。
あれ?
Google様。
ひょっとしてお間違いを。
で。
念のため2回目の/RUNです。
今度は/CMで$02を#$01にしました。
下がその結果です。

$02のビット0を1にしましたから$800Eにはジャンプしないで今回は次のアドレス$8009、$800Aと進みました。
この場合には$8009も実行されていますからBBR0の実行クロック数は5クロックです。
ほらあ。
Googleさまあ。
ウソついちゃ駄目じゃありませんか。

ということで[第55回]はそのように訂正いたしました。
表のクロック数の5はBBR、BBSで条件が満たされなかったためジャンプしなかったときのクロック数で6にはその場合にページをまたいで実行したときと条件が満たされてジャンプした場合の両方が含まれます。
7は条件が満たされページをまたいでジャンプした場合です。
なおページをまたいだ場合については実際に確認はしていません。
多分そうなるだろうという推測で書いています。

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

前へ

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