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


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

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

[第23回]



●BRA

これまでの作業でW65C02テストボードを使ってボード上のRAMに簡単なマシン語プログラムを書き込んだ後W65C02のRESETを解除してそのプログラムを実行させるという方法でW65C02の命令動作を確認することができました。
テストを簡単にするためにそこには簡単なルールを設けました。
1)プログラム(マシン語コード)の開始アドレスは8000番地とする(事前にFFFC、FFFDを書き換えておくことで開始アドレスを変更することが可能)。
2)プログラムの最後は任意の特定アドレス(ゼロページアドレスが簡便)にプログラムの実行によって知りたいと思う値(16進コード)を書き込んだ後STP命令で終る。
この方法によって簡単にW65C02の初期的な動作確認とかマシン語命令の機能の確認などが行なえることがわかりましたのでもう少しこの方法でテストを進めていきたいと考えています。
マシン語プログラムの動作確認ができることが確かめられたのでまずは最初に確認しておきたいと思っているのがBRA命令です。
BRAは相対ジャンプ命令です。
Z80ではJR命令に相当します。
8080にはこの命令はありません。
Z80では無条件相対ジャンプのほかにCFのON/OFFとZFのON/OFFによる条件付相対ジャンプを合わせて5命令があります。
マシン語プログラム(アセンブラではない)を作成する場合にはこの命令群は扱い難いものでした。
普通のジャンプ命令(絶対ジャンプ)はジャンプ先のアドレスを直接指定するのでメモリマップに従って命令コードを記述できますが相対ジャンプではそれができません。
マシン語のオペランド(パラメータ)にはジャンプ先までの距離を計算してそれを16進数で与えなければなりません。
現在の位置から前に戻る場合にはその値は負数になるので計算はなおさら面倒になります。
8ビットの16進数の負数です。
8ビットを正負に分けて示す場合正数は00〜7Fで負数はFF〜80です。
それをハンドアセンブルで計算するなんて…(嫌でございます)。
さらにハンドアセンブルの場合ジャンプ先までの間に別の命令を追加挿入したり逆に削除したりするとジャンプ先までの距離が変わってしまいますから再計算が必要になります。
さらにさらに追加する命令が多くなってジャンプ先までの距離が128バイトを越えたらアウトです。
面倒なことはこの上もありません。
どうしようもなく嫌々使った唯一の利点はJP命令が3バイト必要なところがJRは2バイトで済むという点でした。
プログラムサイズが大きくなってメモリに収まらないという局面で仕方なくJPをJRに置き換えて無理無理はめこんだりしたものでした。
相対ジャンプ命令が威力を発揮するのはサブルーチンプログラムの中で相対ジャンプ命令を使うとそのサブルーチンは再配置可能(リロケータブル)になるという点です。
ワタシの場合そんな高度なプログラムではなくてもうチカラワザでゴリ押しでプログラムを作ったりしていましたから相対ジャンプ命令は扱い難い命令という印象しかありません。
その思いからは自作アセンブラを作って相対ジャンプ命令のジャンプ先をラベルで指定する機能を付加するようにしたことでやっと開放されました。
余談は置きましてW65C02ではこの相対ジャンプ命令が随分沢山あります。
以下に列挙してみます。
命令コードは1バイトでその後ろに相対距離を示す1バイトの値があります(2バイトの値を持つものもあります)。
()内は命令コード(16進数)です。
1)BRA (80) Branch unconditionally 無条件でジャンプする
2)BCC (90) Branch on Carry Clear CフラグがOFFのときにジャンプする
3)BCS (B0) Branch on Carry Set CフラグがONのときにジャンプする
4)BNE (D0) Branch on Result not Zero ZフラグがOFFのときにジャンプする
5)BEQ (F0) Branch on Result Zero ZフラグがONのときにジャンプする
6)BPL (10) Branch on Result Plus 結果が正(NフラグがOFF)のときにジャンプする
7)BMI (30) Branch on Result Minus 結果が負(NフラグがON)のときにジャンプする
8)BVC (50) Branch on Overflow Clear Vフラグ(オーバーフローフラグ)がOFFのときにジャンプする
9)BVS (70) Branch on Overflow Set Vフラグ(オーバーフローフラグ)がONのときにジャンプする
10)BBR Branch on Bit Reset 第1オペランドで指定するゼロページアドレスの値の指定ビットが0のときにジャンプする(指定ビットにより次の8命令がある)
BBR0 (0F) ビット0が0のときにジャンプする
BBR1 (1F) ビット1が0のときにジャンプする
BBR2 (2F) ビット2が0のときにジャンプする
BBR3 (3F) ビット3が0のときにジャンプする
BBR4 (4F) ビット4が0のときにジャンプする
BBR5 (5F) ビット5が0のときにジャンプする
BBR6 (6F) ビット6が0のときにジャンプする
BBR7 (7F) ビット7が0のときにジャンプする
11)BBS Branch on Bit Set 第1オペランドで指定するゼロページアドレスの値の指定ビットが1のときにジャンプする(指定ビットにより次の8命令がある)
BBS0 (8F) ビット0が1のときにジャンプする
BBS1 (9F) ビット1が1のときにジャンプする
BBS2 (AF) ビット2が1のときにジャンプする
BBS3 (BF) ビット3が1のときにジャンプする
BBS4 (CF) ビット4が1のときにジャンプする
BBS5 (DF) ビット5が1のときにジャンプする
BBS6 (EF) ビット6が1のときにジャンプする
BBS7 (FF) ビット7が1のときにジャンプする

以上の相対ジャンプ命令がありますがジャンプ先までの移動距離(移動バイト数)を算出する計算はすべて同じ方法のはずです。
Z80のJR命令のルールと同じだとするとそれはその相対ジャンプ命令の命令コード(オペランドを含む)を読み込んだ直後のPC(プログラムカウンタ)の値を起点として計算することになるはずです。
それでよいのかどうかということを確かめたいと思います。
それともうひとつBBRとBBSについてはオペランドが2つ(2バイト)あります。
ジャンプ先を示す値が第2バイトで対象メモリアドレス(ゼロページアドレス)が第1バイトだと解釈していますがそれでよいのかどうかそれも確かめたいと思っています。
次回以降で実際にプログラムを作ってそれらを確認してみます。

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

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