現在地

[UniMon] RP2A03判別 と Lコマンド追加


カテゴリー:

先日の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も逆になります。

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。