NEC PC-98シリーズエミュレーターを語ろう23 (846レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
230(2): 名無しさん@お腹いっぱい。 (ワッチョイ b3af-T7LG) [] 2024/05/05(日) 02:37:23.49 ID:KHevWzEV0(1/4) AAS
OPNA YM2608のクロックサイクル精度でのシミュレーション(エミュレーション)ってものを見かけて、猫にも使えないかってことで np2 fmgen の方に書いたことをこちらにも共有いたします
外部リンク:github.com
使い方は文書化されてないけどソースコード眺めたところおそらく次のような感じです
便宜上 YM2608 OPNA の場合を言うと、fmopna_2608.h を include してfmopna_t型の構造体を指すポインタとマスタークロック信号(0もしくは1(非0)で、交互?)を渡して FMOPNA_Clock() を呼び出す度にfmopna_t型の構造体が1クロック(半クロック?)後の状態に更新されるって形だと思います
外部リンク[h]:github.com を見ると fmopna_t は最初のメンバーとしてfmopna_input_t型の input を持ってるんですが、fmopna_input_t型は YM2608 OPNA の入力端子に相当するみたいです
具体的には全てのメンバーがint型として定義されてて、clk, ic, cs, wr, rd, a0, a1, data, test, gpio_a, gpio_b, dt0, dm, ad, da とあります
YAMAHA LSI Data Book 音源編(1994-10、CATALOG No.: 7610002)の YM2608B の節(外部リンク[pdf]:www.quarter-dev.info)で、端子機能を見るとこれらが入力(もしくは入出力)の端子として記されています
231(1): 名無しさん@お腹いっぱい。 (ワッチョイ b3af-T7LG) [] 2024/05/05(日) 02:39:41.15 ID:KHevWzEV0(2/4) AAS
>>230
「変数名,番号,機能」の順に対応を記すと
clk, 63, マスタークロック(7.9872MHz)
ic, 33, 初期化(イニシャルクリア)
cs, 57, CPUインターフェース チップセレクト信号
wr, 58, CPUインターフェース データライト信号
rd, 59, CPUインターフェース データリード信号
a0, 60, CPUインターフェース バスコントロール信号
a1, 61, CPUインターフェース バスコントロール信号
data, 2〜9, CPUインターフェース データバス D0(最下位ビット)〜D7(最上位ビット)
test, 40, LSIテスト端子
gpio_a, 17〜10, 汎用I/Oポート A0(最下位ビット)〜A7(最上位ビット)
gpio_b, 25〜18, 汎用I/Oポート B0(最下位ビット)〜B7(最上位ビット)
dt0, 41, 外部メモリからのデータ出力 DO0
dm, 49〜55, 外部メモリからのデータ出力 DO1〜DO7(DO0は48番にはなく上記の41番)
ad, 36, ADコンバーター アナログ入力
da, 38, ADコンバーター AD変換 基準電圧
見事に(プログラムでのシミュレーションでは必要のない)電源とAD変換用のコンデンサーの入力以外は全て定義されてることがわかります
232(1): 名無しさん@お腹いっぱい。 (ワッチョイ b3af-T7LG) [] 2024/05/05(日) 02:41:38.97 ID:KHevWzEV0(3/4) AAS
>>231
同様に、出力も fmopna_t 内に定義されています
「変数名,番号,機能」の順に対応を記すと
int o_gpio_a, 17〜10, 汎用I/Oポート A0(最下位ビット)〜A7(最上位ビット)
int o_gpio_b, 25〜18, 汎用I/Oポート B0(最下位ビット)〜B7(最上位ビット)
int o_spoff, 34, スピーカー ON/OFF 用スイッチ
int o_a8, 42, 外部メモリへのアドレス出力 A8
int o_romcs, 43, 外部メモリに ROM を使用した場合のデータ取り込み用タイミング信号
int o_mden, 44, 外部メモリに DRAM を使用した場合のデータ取り込み用タイミング信号
int o_we, 45, 外部メモリインターフェース 有効化信号
int o_cas, 46, 外部メモリインターフェース CASアドレスラッチ信号
int o_ras, 47, 外部メモリインターフェース RASアドレスラッチ信号
int o_dm, 48〜55, 外部メモリへのアドレス出力 A0〜A7、外部メモリへのデータ入力 DI0〜DI7
float o_analog, 27, SSG部アナログ信号(ソースフォロワ出力)
int o_sh1, 29, DACインターフェース CHANNEL1 ラッチ出力(同期信号)
int o_sh2, 30, DACインターフェース CHANNEL2 ラッチ出力(同期信号)
int o_opo, 31, DACインターフェース シリアルデータ
int o_s, 64, DACインターフェース DAC用ビットクロック
int o_irq_pull, 56, CPUインターフェース 割り込み要求信号
int o_data, 2〜9, CPUインターフェース データバス D0(最下位ビット)〜D7(最上位ビット)
233: 名無しさん@お腹いっぱい。 (ワッチョイ b3af-T7LG) [] 2024/05/05(日) 02:43:40.79 ID:KHevWzEV0(4/4) AAS
>>232
まとめると、素人目でソースコードを見たところ
・fmopna_t のインスタンスを変数に保持する
・fmopna_t.input(fmopna_input_t型)に必要なら値を書き込む
→ FMOPNA_Clock() にポインタ渡してクロック進める
→ fmopna_t の o_〜 メンバーから必要なら適宜出力を読む
を繰り返す
みたいに使うように見えます
こちらの YAMAHA LSI の資料もきっと参考になるかと
外部リンク[php]:www.quarter-dev.info
fmgen の fmgen_fmgwrap.cpp でいうところの OPNA_SetReg()、OPNA_Mix() みたいな wrapper があった方が扱いやすいですが、それらは用意されてません(ので手元でも作れるか見てみます)
以上こちらにもご参考まで情報共有いたしました
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.131s*