furnace/extern/YM2608-LLE/fmopna_impl.h
tildearrow 22f612b32a YM2608-LLE, part 15
OPNB early progress
2024-04-28 12:57:45 -05:00

966 lines
20 KiB
C

/*
* Copyright (C) 2023-2024 nukeykt
*
* This file is part of YM2608-LLE.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* YM2608/YM2610/YM2612 emulator.
* Thanks:
* Raki (ika-musume):
* YM2608B decap
* John McMaster (siliconpr0n.org):
* YM2610 decap
* HardWareMan:
* YM2612 decap
*
*/
// #define FMOPNA_YM2608
// #define FMOPNA_YM2610
// #define FMOPNA_YM2612
#if !defined(FMOPNA_YM2608) && !defined(FMOPNA_YM2610) && !defined(FMOPNA_YM2612)
#error no chip type defined
#endif
typedef struct {
int clk;
int ic; // neg
int cs; // neg
int wr; // neg
int rd; // neg
int a0;
int a1;
int data;
int test; // set to 1
#ifdef FMOPNA_YM2608
int gpio_a;
int gpio_b;
int dt0;
int dm;
int ad;
int da;
#endif
#ifdef FMOPNA_YM2610
int rad;
int pad;
#endif
}
#ifdef FMOPNA_YM2608
fmopna_input_t;
#elif defined (FMOPNA_YM2610)
fmopna_2610_input_t;
#else
fmopna_2612_input_t;
#endif
typedef struct {
#ifdef FMOPNA_YM2608
fmopna_input_t input;
#elif defined (FMOPNA_YM2610)
fmopna_2610_input_t input;
#else
fmopna_2612_input_t input;
#endif
int ic;
int ic_latch1[2];
int ic_latch2[2];
int ic_latch3[2];
int ic_check1;
int ic_check3;
int prescaler_latch[2];
#ifndef FMOPNA_YM2612
int ic_check2;
#endif
#ifdef FMOPNA_YM2608
int prescaler_sel[2];
#endif
int pssel_l[15][2];
int ic_latch_fm[2];
int mclk1;
int mclk2;
int clk1;
int clk2;
#ifndef FMOPNA_YM2612
int aclk1;
int aclk2;
int bclk1;
int bclk2;
int cclk1;
int cclk2;
int dclk;
int ssg_write0;
int ssg_write1;
int ssg_read1;
int write2;
int write3;
int read2;
#endif
#ifdef FMOPNA_YM2608
int read3;
#endif
int read0;
int write0_trig0;
int write0_trig1;
int write0_l[3];
int write0_en;
int write1_trig0;
int write1_trig1;
int write1_l[3];
int write1_en;
#ifdef FMOPNA_YM2608
int write2_trig0;
int write2_trig1;
int write2_l[3];
int write2_en;
#endif
#ifndef FMOPNA_YM2612
int write3_trig0;
int write3_trig1;
int write3_l[3];
int write3_en;
#endif
int data_l;
int data_bus1;
int data_bus2; // inverted
int read_bus;
#ifdef FMOPNA_YM2608
int addr_10[2];
int addr_10h[2];
int addr_12[2];
#endif
int addr_21[2];
int addr_22[2];
int addr_24[2];
int addr_25[2];
int addr_26[2];
int addr_27[2];
int addr_28[2];
#ifdef FMOPNA_YM2608
int addr_29[2];
int addr_ff[2];
#endif
#ifdef FMOPNA_YM2610
int addr_00[2];
int addr_02[2];
int addr_1c[2];
#endif
#ifdef FMOPNA_YM2612
int addr_2a[2];
int addr_2b[2];
int addr_2c[2];
#endif
#ifdef FMOPNA_YM2608
int reg_mask[2];
#endif
#ifndef FMOPNA_YM2612
int reg_test_12[2];
#endif
int reg_test_21[2];
int reg_lfo[2];
int reg_timer_a[2];
int reg_timer_b[2];
int reg_ch3[2];
int reg_timer_a_load[2];
int reg_timer_b_load[2];
int reg_timer_a_enable[2];
int reg_timer_b_enable[2];
int reg_timer_a_reset[2];
int reg_timer_b_reset[2];
#ifdef FMOPNA_YM2608
int reg_sch[2];
int reg_irq[2];
#endif
#ifdef FMOPNA_YM2610
int reg_flags[2];
#endif
int reg_kon_operator[2];
int reg_kon_channel[2];
#ifdef FMOPNA_YM2612
int reg_dac_en[2];
int reg_dac_data[2];
int reg_test_2c[2];
#endif
int fm_address[2];
int fm_data[2];
int write_fm_address[2];
int write_fm_data[2];
int reg_cnt1[2];
int reg_cnt2[2];
int reg_cnt_sync;
int reg_key_cnt1[2];
int reg_key_cnt2[2];
#ifdef FMOPNA_YM2608
int reg_cnt_rss[2];
int reg_cnt_rss_of;
int rss_18;
#endif
int reg_kon_match;
int reg_kon[4][2];
int kon_comb;
int reg_ch3_sel;
int ch3_en;
int ch3_csm;
int ch3_csm_load;
int reg_csm_l;
int reg_sync_timer;
int reg_sync_timer_l[2];
int reg_sync_timer_load;
int timer_a_cnt[2];
int timer_a_of[2];
int timer_a_load;
int timer_a_reg_load;
int timer_a_reg_load_l[2];
int timer_a_status[2];
int timer_b_subcnt[2];
int timer_b_subcnt_of[2];
int timer_b_cnt[2];
int timer_b_of[2];
int timer_b_load;
int timer_b_reg_load;
int timer_b_reg_load_l[2];
int timer_b_status[2];
#ifndef FMOPNA_YM2612
int irq_eos_l;
#endif
#ifdef FMOPNA_YM2608
int irq_mask_eos;
int irq_mask_brdy;
int irq_mask_zero;
#endif
int fm_is30;
int fm_is40;
int fm_is50;
int fm_is60;
int fm_is70;
int fm_is80;
int fm_is90;
int fm_isa0;
int fm_isa4;
int fm_isa8;
int fm_isac;
int fm_isb0;
int fm_isb4;
int reg_a4[2];
unsigned short reg_freq[2][6];
int reg_ac[2];
unsigned short reg_freq_3ch[2][6];
unsigned char reg_connect_fb[2][6];
unsigned char reg_b4[2][6];
int fnum[4];
int kcode[4];
int ch_cnt_sync;
int ch_cnt1[2];
int ch_cnt2[2];
#ifdef FMOPNA_YM2608
unsigned char reg_rss[2][6];
#endif
unsigned char op_multi_dt[2][12][2];
unsigned char op_tl[2][12][2];
unsigned char op_ar_ks[2][12][2];
unsigned char op_dr_a[2][12][2];
unsigned char op_sr[2][12][2];
unsigned char op_rr_sl[2][12][2];
unsigned char op_ssg[2][12][2];
int fsm_cnt1[2];
int fsm_cnt2[2];
int fsm_out[27];
int fsm_op1_sel_l;
int fsm_op2_sel_l;
int fsm_op3_sel_l;
int fsm_op4_sel_l;
int fsm_connect;
int alg_mod_op1_0_l;
int alg_mod_op1_1_l;
int alg_mod_op2_l;
int alg_mod_prev_0_l;
int alg_mod_prev_1_l;
int alg_output_l;
int alg_do_fb[2];
int alg_load_fb;
#ifndef FMOPNA_YM2612
int fsm_rss;
int fsm_rss2;
#endif
int fsm_sel0[2];
int fsm_sel1[2];
int fsm_sel2[2];
int fsm_sel23[2];
int fsm_sel_ch3[2];
#ifndef FMOPNA_YM2612
int fsm_sel11[2];
int fsm_sh1[2];
int fsm_sh2[2];
#endif
#ifdef FMOPNA_YM2612
int fsm_dac_ch6[2];
int fsm_dac_load[2];
int fsm_dac_out_sel[2];
#endif
int lfo_sync[4];
int lfo_subcnt[2];
int lfo_subcnt_of;
int lfo_cnt_rst;
int lfo_cnt[2];
#ifdef FMOPNA_YM2608
int lfo_cnt_of;
int lfo_mode;
#endif
int lfo_cnt_load;
int lfo_fnum1;
int lfo_fnum2;
int lfo_shift;
int lfo_sign;
int lfo_pm;
int lfo_fnum;
int lfo_am;
int pg_block;
int pg_freq;
int pg_dt_multi;
int pg_dt_add;
int pg_freqdt[2];
int pg_multi[5];
int pg_add[6];
int pg_reset[4];
int pg_phase[2][23];
int pg_phase2[2];
int pg_out;
int pg_dbgsync;
#ifdef FMOPNA_YM2610
int pg_dbgsync_l[2];
#endif
int pg_dbg[2];
int dt_add1;
int dt_add2;
int dt_enable[2];
int dt_sum;
int dt_blockmax[2];
int dt_note[2];
int dt_sign[2];
int eg_sync;
int eg_prescaler[2];
int eg_prescaler_clock_l[2];
int eg_clock_delay[2];
int eg_ic[2];
int eg_step[3];
int eg_timer_step[2];
int eg_timer[2];
int eg_timer_sum[2];
int eg_timer_carry[2];
int eg_timer_mask[2];
int eg_timer_masked[2];
int eg_timer_test;
int eg_timer_test_bit[2];
int eg_timer_low_lock;
int eg_shift_lock;
int eg_rate_sel;
int eg_rate_ar;
int eg_rate_dr;
int eg_rate_sr;
int eg_rate_rr;
int eg_rate;
int eg_rate_nonzero[3];
unsigned char eg_state[2][23];
int eg_ks;
int eg_ksv;
int eg_rate2;
int eg_ratenz;
int eg_rate12;
int eg_rate13;
int eg_rate14;
int eg_rate15;
int eg_rate_low;
int eg_rate_slow;
int eg_rate_sum;
int eg_maxrate[2];
int eg_inc2;
int eg_incsh0[2];
int eg_incsh1[2];
int eg_incsh2[2];
int eg_incsh3[2];
int eg_output;
unsigned short eg_level[2][22];
int eg_ssg_inv;
int eg_ssg_enable[2];
int eg_ssg_sign[2];
int eg_ssg_holdup[2];
int eg_ssg_pgreset[2];
int eg_ssg_dir[2];
int eg_ssg_egrepeat[2];
int eg_key[2];
int eg_kon_latch[2];
int eg_kon_event;
int eg_pg_reset[2];
int eg_sl[2][2];
int eg_tl[3][2];
int eg_level_ssg[2];
int eg_slreach;
int eg_level_l[2];
int eg_zeroreach;
int eg_off;
int eg_nextstate;
int eg_state_l;
int eg_mute;
int eg_exp;
int eg_linear;
int eg_inc_total;
int eg_nextlevel[2];
int eg_istantattack;
int eg_kon_csm[2];
int eg_am_l[2];
int eg_am_shift[2];
int eg_of1;
int eg_output_lfo;
int eg_csm_tl;
int eg_ch3_l[2];
int eg_out;
int eg_dbg_sync;
int eg_debug[2];
int eg_debug_inc;
int op_phase1;
int op_phase2;
unsigned short op_mod[2][6];
int op_phase_index;
int op_sign[2];
int op_logsin_base;
int op_logsin_delta;
int op_eglevel;
int op_att;
int op_shift[2];
int op_pow_base;
int op_pow_delta;
int op_pow;
int op_output[4];
unsigned short op_op1_0[2][6];
unsigned short op_op1_1[2][6];
unsigned short op_op2[2][6];
int op_loadfb;
int op_loadop2;
int op_mod_op1_0;
int op_mod_op1_1;
int op_mod_op2;
int op_mod_prev_0;
int op_mod_prev_1;
int op_mod1;
int op_mod2;
int op_mod_sum;
int op_do_fb;
int op_fb;
#ifndef FMOPNA_YM2612
#ifdef FMOPNA_YM2608
int ssg_prescaler1[2];
int ssg_prescaler2[2];
#endif
int ssg_div1[2];
int ssg_div2[2];
int ssg_div3[2];
int ssg_clk;
int ssg_clk1;
int ssg_clk2;
int ssg_ssg_addr;
int ssg_address;
int ssg_freq_a[2];
int ssg_freq_b[2];
int ssg_freq_c[2];
int ssg_noise;
int ssg_mode;
int ssg_level_a;
int ssg_level_b;
int ssg_level_c;
int ssg_env[2];
int ssg_envmode;
int ssg_envadd;
int ssg_envcnt[2];
int ssg_dir[2];
int ssg_hold[2];
int ssg_t2[2];
int ssg_egtrig;
int ssg_egtrig_s;
int ssg_egtrig_rst;
int ssg_eg_sel_l;
int ssg_sel[2];
int ssg_sel_freq;
int ssg_freq_cnt[8];
int ssg_cnt_of[2];
int ssg_sign[2];
int ssg_sign_toggle;
int ssg_cnt_of_l;
int ssg_freq_cnt2[8];
int ssg_sel_freq_l;
int ssg_cnt2_add;
int ssg_sel_eg_l[2];
int ssg_ch_of;
int ssg_cnt_reload;
int ssg_eg_of[2];
int ssg_fr_rst_l;
int ssg_noise_add;
int ssg_noise_cnt[2];
int ssg_noise_of_low;
int ssg_noise_of;
int ssg_test;
int ssg_noise_step;
int ssg_noise_lfsr[2];
int ssg_noise_bit;
int rss_cnt1[2];
int rss_cnt1_sync;
int rss_eclk1_l;
int rss_eclk2_l;
int rss_eclk1;
int rss_eclk2;
int rss_dclk_l;
int rss_fclk_sel[2];
int rss_fclk1;
int rss_fclk2;
int rss_cnt2[2];
int rss_fmcnt[2];
int rss_fmcnt_of;
int rss_fmcnt_sync;
int rss_params[2];
int rss_tl_sel[2];
int rss_tl[2];
int rss_keydm[2];
int rss_keymask[2];
int rss_ic[2];
int rss_key[2];
int rss_stop[2];
int rss_eos_l;
#ifdef FMOPNA_YM2608
int rss_step;
int rss_isend;
#endif
#ifdef FMOPNA_YM2610
int rss_address[2];
int rss_address_wr[2];
int rss_data[2];
int rss_data_wr[2];
int rss_write08;
int rss_write10;
int rss_write18;
int rss_write20;
int rss_write28;
unsigned char rss_reg_pan_tl[2][6];
unsigned char rss_reg_start_l[2][6];
unsigned char rss_reg_start_h[2][6];
unsigned char rss_reg_stop_l[2][6];
unsigned char rss_reg_stop_h[2][6];
int rss_fm_match_l;
int rss_params_start[3];
int rss_params_start_h;
int rss_params_stop[3];
int rss_eos_load;
int rss_rmpx[2];
int rss_roe[4];
int rss_rad_bus;
int rss_stop_flag[2];
#endif
int rss_accum[2];
int rss_regs[2][17];
int rss_delta_ix_load;
int rss_delta_ix;
int rss_ix_load;
int rss_ix;
int rss_cnt1_is1;
int rss_nibble;
int rss_tl_l;
int rss_tl_shift[3];
int rss_sample_load;
int rss_sample;
int rss_multi_ctrl[2];
int rss_multi_accum[2];
int rss_multi_accum_load;
int rss_sample_multi;
int rss_sample_shift_load;
int rss_sample_shift;
int rss_dbg_load;
int rss_dbg_data;
int rss_pan[3];
#ifdef FMOPNA_YM2608
int ad_is6;
int ad_is7;
int ad_is8;
int ad_isc;
int ad_isd;
int ad_ise;
int ad_isf;
int ad_reg_limit_l;
int ad_reg_limit_h;
int ad_reg_prescale_l;
int ad_reg_prescale_h;
int ad_reg_spoff;
int ad_reg_memdata;
int ad_reg_rec;
int ad_reg_rom;
int ad_reg_ramtype;
int ad_reg_da_ad;
int ad_reg_sample;
int ad_sample_l[3];
int ad_read_port_l[2];
int ad_write_port_l[2];
int ad_rw_l[2];
int ad_rw_en;
int ad_rec_start_l[2];
int ad_limit_match[2];
int ad_limit_match2[2];
int ad_mem_sync[2];
int ad_mem_sync_run;
int ad_mem_ptr_store;
int ad_mem_data_l1;
int ad_mem_data_l2;
int ad_mem_addr_bank;
int ad_mem_data_bus;
int ad_mem_bit_cnt[2];
int ad_mem_shift_cnt0_l[2];
int ad_brdy_set_l[2];
int ad_mem_rw_en[2];
int ad_mem_ucnt[2];
int ad_mem_w22;
int ad_dsp_ctrl10_l;
int ad_dsp_alu_neg[2];
int ad_ad_cnt1[2];
int ad_ad_cmp_i;
int ad_ad_shift;
int ad_ad_w53[2];
int ad_ad_w55;
int ad_ad_w55_l[2];
int ad_ad_w56;
int ad_ad_buf;
int ad_ad_input;
int ad_ad_cnt2[2];
int ad_ad_w57[3];
int ad_ad_w58[3]; // sh2
int ad_ad_w60;
int ad_ad_w61[2]; // opo
int ad_ad_w62[2];
int ad_ad_w65_l;
int ad_ad_w66[2];
int ad_ad_w68;
int ad_ad_cnt3[2];
int ad_ad_cnt3_load;
int ad_ad_cnt3_load_val;
int ad_ad_cnt3_of[2];
int ad_ad_cnt3_en[2];
int ad_ad_quiet;
int ad_comp_da;
int ad_dsp_enc_bit;
int ad_dsp_enc_bit_l[2];
int ad_mem_we[2];
int ad_mem_cas[2];
int ad_mem_ras[2];
#else
int ad_mem_pmpx[2];
int ad_mem_poe[2];
#endif
int ad_is0;
int ad_is1;
int ad_is2;
int ad_is3;
int ad_is4;
int ad_is5;
int ad_is9;
int ad_isa;
int ad_isb;
int ad_reg_reset;
int ad_reg_repeat;
int ad_reg_start;
int ad_reg_r;
int ad_reg_l;
int ad_reg_delta_l;
int ad_reg_delta_h;
int ad_reg_start_l;
int ad_reg_start_h;
int ad_reg_stop_l;
int ad_reg_stop_h;
int ad_reg_level;
int ad_code_ptr[2];
int ad_code_ctrl;
int ad_code_ctrl_l;
int ad_w2[2];
int ad_w4[2];
int ad_start_l[3];
int ad_w2_l[2];
int ad_code_end[2];
int ad_addr_isend_l;
int ad_addr_isend_l2[2];
int ad_mem_ctrl;
int ad_mem_ctrl_l;
int ad_mem_code_ptr[2];
int ad_end_sel[2];
int ad_stop_match[2];
int ad_stop_match2[2];
int ad_start_sel[2];
int ad_address_cnt[4][2];
int ad_address_carry[2];
int ad_mem_cond[2];
int ad_mem_bus;
int ad_mem_data_l3;
int ad_mem_data_l4[2];
int ad_mem_w7[2];
int ad_mem_shift_cnt[2];
int ad_mem_nibble;
int ad_mem_w8[2];
int ad_mem_nibble_msb;
int ad_mem_nibble_load;
int ad_mem_mem_en_l[2];
int ad_code_ed_end[2];
int ad_mem_mem_stop[2];
int ad_mem_w10[2];
int ad_w12[2];
int ad_w13[2];
int ad_mem_w15[2];
int ad_mem_w17[2];
int ad_mem_w20[2];
int ad_mem_w21;
int ad_mode6_l[2];
int ad_dsp_bus;
int ad_dsp_ctrl;
int ad_dsp_delta_sel[2];
int ad_dsp_w30_l[2];
int ad_dsp_w31_l[2];
int ad_dsp_w32;
int ad_dsp_w32_l;
int ad_dsp_w33;
int ad_dsp_w34;
int ad_dsp_w36[2];
int ad_dsp_w35_l;
int ad_dsp_cnt1[2];
int ad_dsp_cnt1_run[2];
int ad_dsp_mul_accm1[2];
int ad_dsp_mul_accm1_add1;
int ad_dsp_mul_accm1_add2;
int ad_dsp_mul_accm1_c;
int ad_dsp_mul_accm2;
int ad_dsp_mul_accm2_add1;
int ad_dsp_mul_accm2_add2;
int ad_dsp_mul_accm2_load;
int ad_dsp_w38[2];
int ad_dsp_w40;
int ad_dsp_w41[2];
int ad_dsp_w43[2];
int ad_dsp_w45;
int ad_dsp_w46[2];
int ad_output;
int ad_dsp_cnt2[2];
int ad_dsp_load_alu1[2];
int ad_dsp_load_alu1_h;
int ad_dsp_load_alu2[2];
int ad_dsp_alu_in1;
int ad_dsp_alu_in2;
int ad_dsp_load_res[2];
int ad_dsp_alu_res;
int ad_dsp_alu_shift;
int ad_dsp_alu_mask[2];
int ad_dsp_carry_mode[2];
int ad_dsp_alu_of;
int ad_dsp_read_res[2];
int ad_code_sync[3];
int ad_dsp_w52[2];
int ad_code_reg_id;
int ad_dsp_regs[8];
int ad_dsp_regs_o;
int ad_set_eos;
int ad_dsp_vol_o[2];
int ad_dsp_sregs2[2][2];
int ad_dsp_w69[2];
int ad_mem_dir;
#ifdef FMOPNA_YM2608
int ad_da_data;
int ac_da_shift[2];
int ac_da_w70[2];
int ac_da_set[2];
int opo_da[2];
int opo_ad;
#endif
int ac_fm_output;
int ac_fm_output_en;
int ac_fm_pan;
int ac_fm_accm1[2];
int ac_da_sync2;
int ac_ad_output;
int ac_da_sync;
int ac_da_sync3[2];
int ac_fm_accm2[2];
int ac_rss_sum_l;
int ac_rss_sum_r;
int ac_rss_accm1[2];
int ac_rss_accm2[2];
int ac_rss_load;
int ac_shifter[2];
int ac_shifter_load_l;
int ac_shifter_load_r;
int ac_shifter_bit;
int ac_shifter_top;
int ac_opo;
int sh1_l;
int sh2_l;
int opo_fm;
int last_rss_sample;
#endif
int busy_cnt[2];
int busy_cnt_en[2];
int status_timer_a;
int status_timer_b;
int eg_dbg;
#ifdef FMOPNA_YM2608
int status_brdy;
int status_zero;
int brdy_flag;
int zero_flag;
int zero_set;
#endif
#ifdef FMOPNA_YM2610
int flag_rss_0;
int flag_rss_1;
int flag_rss_2;
int flag_rss_3;
int flag_rss_4;
int flag_rss_5;
int status_rss_0;
int status_rss_1;
int status_rss_2;
int status_rss_3;
int status_rss_4;
int status_rss_5;
#endif
#ifndef FMOPNA_YM2612
int status_eos;
int eos_flag;
int eos_l[2];
int eos_repeat;
#endif
#ifdef FMOPNA_YM2612
int ch_op_output;
int ch_op_add;
int ch_accm_load;
short ch_accm[2][6];
short ch_buf[2][6];
int ch_output;
int ch_load[2];
int ch_sel;
int ch_dbg[2];
int ch_ch6;
int ch_pan;
int o_mol;
int o_mor;
int o_test;
int o_test_d;
#endif
#ifdef FMOPNA_YM2608
int o_gpio_a;
int o_gpio_a_d;
int o_gpio_b;
int o_gpio_b_d;
int o_spoff;
int o_a8;
int o_romcs; // neg
int o_mden;
int o_we; // neg
int o_cas; // neg
int o_ras; // neg
int o_dm;
int o_dm_d;
#endif
#ifdef FMOPNA_YM2610
int o_rmpx;
int o_roe; // neg
int o_rad;
int o_rad_d;
int o_ra8;
int o_ra20;
int o_pmpx;
int o_poe; // neg
int o_pad;
int o_pad_d;
int o_pa8;
int ym2610b;
#endif
#ifndef FMOPNA_YM2612
float o_analog;
float o_analog_ch[3];
int o_sh1;
int o_sh2;
int o_opo;
int o_s;
#endif
int o_irq_pull;
int o_data;
int o_data_d;
int tm_w1;
}
#ifdef FMOPNA_YM2608
fmopna_t;
#elif defined (FMOPNA_YM2610)
fmopna_2610_t;
#else
fmopna_2612_t;
#endif
#ifdef FMOPNA_YM2608
void FMOPNA_Clock(fmopna_t* chip, int clk);
#elif defined (FMOPNA_YM2610)
void FMOPNA_2610_Clock(fmopna_2610_t* chip, int clk);
#else
void FMOPNA_2612_Clock(fmopna_2612_t* chip, int clk);
#endif