| 
									
										
										
										
											2023-11-22 16:35:02 -05:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2023 nukeykt | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is part of YM3812-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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  YM3812 emulator | 
					
						
							|  |  |  |  *  Thanks: | 
					
						
							|  |  |  |  *      Travis Goodspeed: | 
					
						
							|  |  |  |  *          YM3812 decap and die shot | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int mclk; | 
					
						
							|  |  |  |     int address; | 
					
						
							|  |  |  |     int data_i; | 
					
						
							|  |  |  |     int ic; | 
					
						
							|  |  |  |     int cs; | 
					
						
							|  |  |  |     int rd; | 
					
						
							|  |  |  |     int wr; | 
					
						
							|  |  |  | } fmopl2_input_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     fmopl2_input_t input; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int mclk1; | 
					
						
							|  |  |  |     int mclk2; | 
					
						
							|  |  |  |     int clk1; | 
					
						
							|  |  |  |     int clk2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int prescaler_reset_l[2]; | 
					
						
							|  |  |  |     int prescaler_cnt[2]; | 
					
						
							|  |  |  |     int prescaler_l1[2]; | 
					
						
							|  |  |  |     int prescaler_l2[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int reset1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int fsm_reset_l[2]; | 
					
						
							|  |  |  |     int fsm_reset; // wire
 | 
					
						
							|  |  |  |     int fsm_cnt1[2]; | 
					
						
							|  |  |  |     int fsm_cnt2[2]; | 
					
						
							|  |  |  |     int fsm_cnt1_of; // wire
 | 
					
						
							|  |  |  |     int fsm_cnt2_of; // wire
 | 
					
						
							|  |  |  |     int fsm_sel[13]; | 
					
						
							|  |  |  |     int fsm_cnt; // wire
 | 
					
						
							|  |  |  |     int fsm_ch_out; | 
					
						
							|  |  |  |     int fsm_do_fb; | 
					
						
							|  |  |  |     int fsm_load_fb; | 
					
						
							|  |  |  |     int fsm_l1[2]; | 
					
						
							|  |  |  |     int fsm_l2[2]; | 
					
						
							|  |  |  |     int fsm_l3[2]; | 
					
						
							|  |  |  |     int fsm_l4[2]; | 
					
						
							|  |  |  |     int fsm_l5[2]; | 
					
						
							|  |  |  |     int fsm_l6[2]; | 
					
						
							|  |  |  |     int fsm_out[16]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int io_rd; | 
					
						
							|  |  |  |     int io_wr; | 
					
						
							|  |  |  |     int io_cs; | 
					
						
							|  |  |  |     int io_a0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int io_read0; | 
					
						
							|  |  |  |     int io_read1; | 
					
						
							|  |  |  |     int io_write; | 
					
						
							|  |  |  |     int io_write0; | 
					
						
							|  |  |  |     int io_write1; | 
					
						
							|  |  |  |     int io_dir; | 
					
						
							|  |  |  |     int io_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int data_latch; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int write0; | 
					
						
							|  |  |  |     int write0_sr; | 
					
						
							|  |  |  |     int write0_latch[6]; | 
					
						
							|  |  |  |     int write1; | 
					
						
							|  |  |  |     int write1_sr; | 
					
						
							|  |  |  |     int write1_latch[6]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int reg_sel1; | 
					
						
							|  |  |  |     int reg_sel2; | 
					
						
							|  |  |  |     int reg_sel3; | 
					
						
							|  |  |  |     int reg_sel4; | 
					
						
							|  |  |  |     int reg_sel8; | 
					
						
							|  |  |  |     int reg_selbd; | 
					
						
							|  |  |  |     int reg_test; | 
					
						
							|  |  |  |     int reg_timer1; | 
					
						
							|  |  |  |     int reg_timer2; | 
					
						
							|  |  |  |     int reg_notesel; | 
					
						
							|  |  |  |     int reg_csm; | 
					
						
							|  |  |  |     int reg_da; | 
					
						
							|  |  |  |     int reg_dv; | 
					
						
							|  |  |  |     int rhythm; | 
					
						
							|  |  |  |     int reg_rh_kon; | 
					
						
							|  |  |  |     int reg_sel4_wr; // wire
 | 
					
						
							|  |  |  |     int reg_sel4_rst; // wire
 | 
					
						
							|  |  |  |     int reg_t1_mask; | 
					
						
							|  |  |  |     int reg_t2_mask; | 
					
						
							|  |  |  |     int reg_t1_start; | 
					
						
							|  |  |  |     int reg_t2_start; | 
					
						
							|  |  |  |     int reg_mode_b3; | 
					
						
							|  |  |  |     int reg_mode_b4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int t1_cnt[2]; | 
					
						
							|  |  |  |     int t2_cnt[2]; | 
					
						
							|  |  |  |     int t1_of[2]; | 
					
						
							|  |  |  |     int t2_of[2]; | 
					
						
							|  |  |  |     int t1_status; | 
					
						
							|  |  |  |     int t2_status; | 
					
						
							|  |  |  |     int unk_status1; | 
					
						
							|  |  |  |     int unk_status2; | 
					
						
							|  |  |  |     int timer_st_load_l; | 
					
						
							|  |  |  |     int timer_st_load; | 
					
						
							|  |  |  |     int t1_start; | 
					
						
							|  |  |  |     int t1_start_l[2]; | 
					
						
							|  |  |  |     int t2_start_l[2]; | 
					
						
							|  |  |  |     int t1_load; // wire
 | 
					
						
							|  |  |  |     int csm_load_l; | 
					
						
							|  |  |  |     int csm_load; | 
					
						
							|  |  |  |     int csm_kon; | 
					
						
							|  |  |  |     int rh_sel0; | 
					
						
							|  |  |  |     int rh_sel[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int keyon_comb; | 
					
						
							|  |  |  |     int address; | 
					
						
							|  |  |  |     int address_valid; | 
					
						
							|  |  |  |     int address_valid_l[2]; | 
					
						
							|  |  |  |     int address_valid2; | 
					
						
							|  |  |  |     int data; | 
					
						
							|  |  |  |     int slot_cnt1[2]; | 
					
						
							|  |  |  |     int slot_cnt2[2]; | 
					
						
							|  |  |  |     int slot_cnt; | 
					
						
							|  |  |  |     int sel_ch; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int ch_fnum[10][2]; | 
					
						
							|  |  |  |     int ch_block[3][2]; | 
					
						
							|  |  |  |     int ch_keyon[2]; | 
					
						
							|  |  |  |     int ch_connect[2]; | 
					
						
							|  |  |  |     int ch_fb[3][2]; | 
					
						
							|  |  |  |     int op_multi[4][2]; | 
					
						
							|  |  |  |     int op_ksr[2]; | 
					
						
							|  |  |  |     int op_egt[2]; | 
					
						
							|  |  |  |     int op_vib[2]; | 
					
						
							|  |  |  |     int op_am[2]; | 
					
						
							|  |  |  |     int op_tl[6][2]; | 
					
						
							|  |  |  |     int op_ksl[2][2]; | 
					
						
							|  |  |  |     int op_ar[4][2]; | 
					
						
							|  |  |  |     int op_dr[4][2]; | 
					
						
							|  |  |  |     int op_sl[4][2]; | 
					
						
							|  |  |  |     int op_rr[4][2]; | 
					
						
							|  |  |  |     int op_wf[2][2]; | 
					
						
							|  |  |  |     int op_mod[2]; | 
					
						
							|  |  |  |     int op_value; // wire
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int eg_load1_l; | 
					
						
							|  |  |  |     int eg_load1; | 
					
						
							|  |  |  |     int eg_load2_l; | 
					
						
							|  |  |  |     int eg_load2; | 
					
						
							|  |  |  |     int eg_load3_l; | 
					
						
							|  |  |  |     int eg_load3; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int trem_carry[2]; | 
					
						
							|  |  |  |     int trem_value[2]; | 
					
						
							|  |  |  |     int trem_dir[2]; | 
					
						
							|  |  |  |     int trem_step; | 
					
						
							|  |  |  |     int trem_out; | 
					
						
							|  |  |  |     int trem_of[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int eg_timer[2]; | 
					
						
							|  |  |  |     int eg_timer_masked[2]; | 
					
						
							|  |  |  |     int eg_carry[2]; | 
					
						
							|  |  |  |     int eg_mask[2]; | 
					
						
							|  |  |  |     int eg_subcnt[2]; | 
					
						
							|  |  |  |     int eg_subcnt_l[2]; | 
					
						
							|  |  |  |     int eg_sync_l[2]; | 
					
						
							|  |  |  |     int eg_timer_low; | 
					
						
							|  |  |  |     int eg_shift; | 
					
						
							|  |  |  |     int eg_state[2][2]; | 
					
						
							|  |  |  |     int eg_level[9][2]; | 
					
						
							|  |  |  |     int eg_out[2]; | 
					
						
							|  |  |  |     int eg_dokon; // wire
 | 
					
						
							|  |  |  |     int eg_mute[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int block; | 
					
						
							|  |  |  |     int fnum; | 
					
						
							|  |  |  |     int keyon; | 
					
						
							|  |  |  |     int connect; | 
					
						
							|  |  |  |     int connect_l[2]; | 
					
						
							|  |  |  |     int fb; | 
					
						
							|  |  |  |     int fb_l[2][2]; | 
					
						
							|  |  |  |     int multi; | 
					
						
							|  |  |  |     int ksr; | 
					
						
							|  |  |  |     int egt; | 
					
						
							|  |  |  |     int vib; | 
					
						
							|  |  |  |     int am; | 
					
						
							|  |  |  |     int tl; | 
					
						
							|  |  |  |     int ksl; | 
					
						
							|  |  |  |     int ar; | 
					
						
							|  |  |  |     int dr; | 
					
						
							|  |  |  |     int sl; | 
					
						
							|  |  |  |     int rr; | 
					
						
							|  |  |  |     int wf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int lfo_cnt[2]; | 
					
						
							|  |  |  |     int t1_step; // wire
 | 
					
						
							|  |  |  |     int t2_step; // wire
 | 
					
						
							|  |  |  |     int am_step; // wire
 | 
					
						
							|  |  |  |     int vib_step; // wire
 | 
					
						
							|  |  |  |     int vib_cnt[2]; | 
					
						
							|  |  |  |     int pg_phase[19][2]; | 
					
						
							|  |  |  |     int dbg_serial[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int noise_lfsr[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int hh_load; | 
					
						
							|  |  |  |     int tc_load; | 
					
						
							|  |  |  |     int hh_bit2; | 
					
						
							|  |  |  |     int hh_bit3; | 
					
						
							|  |  |  |     int hh_bit7; | 
					
						
							|  |  |  |     int hh_bit8; | 
					
						
							|  |  |  |     int tc_bit3; | 
					
						
							|  |  |  |     int tc_bit5; | 
					
						
							|  |  |  |     int op_logsin[2]; | 
					
						
							|  |  |  |     int op_shift[2]; | 
					
						
							|  |  |  |     int op_pow[2]; | 
					
						
							|  |  |  |     int op_mute[2]; | 
					
						
							|  |  |  |     int op_sign[2]; | 
					
						
							|  |  |  |     int op_fb[2][13][2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int pg_out; // wire
 | 
					
						
							|  |  |  |     int pg_out_rhy; // wire
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int accm_value[2]; | 
					
						
							|  |  |  |     int accm_shifter[2]; | 
					
						
							|  |  |  |     int accm_load1_l; | 
					
						
							|  |  |  |     int accm_load1; | 
					
						
							|  |  |  |     int accm_clamplow; | 
					
						
							|  |  |  |     int accm_clamphigh; | 
					
						
							|  |  |  |     int accm_top; | 
					
						
							|  |  |  |     int accm_sel[2]; | 
					
						
							|  |  |  |     int accm_mo[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int o_sh; | 
					
						
							|  |  |  |     int o_mo; | 
					
						
							|  |  |  |     int o_irq_pull; | 
					
						
							|  |  |  |     int o_sy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int data_o; | 
					
						
							|  |  |  |     int data_z; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int o_clk1; | 
					
						
							|  |  |  |     int o_clk2; | 
					
						
							|  |  |  |     int o_reset1; | 
					
						
							|  |  |  |     int o_write0; | 
					
						
							|  |  |  |     int o_write1; | 
					
						
							|  |  |  |     int o_data_latch; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 04:19:58 -05:00
										 |  |  |     int op_value_debug; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-22 16:35:02 -05:00
										 |  |  | } fmopl2_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-22 19:32:14 -05:00
										 |  |  | // modification
 | 
					
						
							|  |  |  | void FMOPL2_Clock(fmopl2_t *chip); |