2020-04-14 11:50 — asano
カテゴリー:
先日のRP2A03ボードによってRP2A03判別ルーチンの確認ができたのでここに記しておきます。
まず判別するためには両者の違いを利用することになりますが、簡単なのはRP2A03で削除されている10進演算機能の有無を使う方法です。
他にも内蔵のAudio Processing Unit(APU)などのレジスタを参照する方法も考えられなくは無いですが、RP2A03以外では何がつながっているかわからず、誤判別や思わぬ副作用の原因になるかもしれません。
それではソースコードです。
59/ F638 : F8 SED
60/ F639 : 18 CLC
61/ F63A : A9 05 LDA #5
62/ F63C : 69 05 ADC #5
63/ F63E : C9 0A CMP #10
64/ F640 : D8 CLD
65/ F641 : F0 2D BEQ ID2A03
66/ F643 : ;; 6502
このルーチンに入ってくる時点でBRA
命令などの拡張されたCMOS版の65C02は分離済みです。
59行目でDフラグを立てて10進演算モード(RP2A03にはない)に入ります。
60行目でCフラグ(キャリー)をクリアします。6502系にはキャリーを含まない加算命令が無いためです。
61,62行目で5+5を実行します。もし10進演算モードのある6502であれば結果は16($10)に、ないRP2A03であれば10($0A)になりますので、63行目で10かどうか比較を行ないます。
10進演算モードのままになっていると以降の動作に支障をきたすので64行目でDフラグをクリアしておきます。
65行目では2つ上の比較に基づきRP2A03(10)の場合に分岐します。
これとは別に、HEXファイルを取り込むためのL
コマンドを追加しました。6800版からの移植ですが、以下のような点に注意が必要だっただけでほぼ一対一の対応です。
- Bレジスタが存在しないのでカウンタをゼロページに置きました。
DEC
命令が使えるので助かりました。 - インデックスレジスタが8ビットしかないのでレコードの先頭アドレスをゼロページに置き、
(zaddr),Y
でアクセスしています。 - 減算時のキャリーが逆なので、
BCC
,BCS
も逆になります。
コメントを追加