diff --git a/3rdparty/ymfm/src/ymfm_adpcm.cpp b/3rdparty/ymfm/src/ymfm_adpcm.cpp index 4bc22beb2b0..97f18d4ebda 100644 --- a/3rdparty/ymfm/src/ymfm_adpcm.cpp +++ b/3rdparty/ymfm/src/ymfm_adpcm.cpp @@ -32,7 +32,41 @@ namespace ymfm { - +// 定義全局變量 +uint32_t g_ym_rom_size = 0xFFFFFF; + void init_ym_rom_size() { + static bool initialized = false; + if (!initialized) { + // 嘗試打開文件 + FILE* fp = fopen(".ym_size.tmp", "r"); + if (fp) + { + // 準備一個緩衝區來讀取文本 + char buffer[32] = {0}; + if (fgets(buffer, sizeof(buffer), fp)) + { + // 將十六進制字符串轉換為數值 + unsigned int read_size = 0; + if (sscanf(buffer, "%x", &read_size) == 1) + { + g_ym_rom_size = read_size; + } + } + fclose(fp); + if (remove(".ym_size.tmp") != 0) + { + // 如果 remove 失敗,記錄錯誤 + if (FILE* debug = fopen("file_delete_error.txt", "w")) + { + fprintf(debug, "Failed to delete ym_size.tmp\n"); + perror("Error details"); // 輸出系統錯誤信息 + fclose(debug); + } + } + initialized = true; + } + } + } //********************************************************* // ADPCM "A" REGISTERS //********************************************************* @@ -121,26 +155,25 @@ void adpcm_a_channel::save_restore(ymfm_saved_state &state) void adpcm_a_channel::keyonoff(bool on) { - // QUESTION: repeated key ons restart the sample? - m_playing = on; - if (m_playing) - { - m_curaddress = m_regs.ch_start(m_choffs) << m_address_shift; - m_curnibble = 0; - m_curbyte = 0; - m_accumulator = 0; - m_step_index = 0; - - // don't log masked channels - if (((debug::GLOBAL_ADPCM_A_CHANNEL_MASK >> m_choffs) & 1) != 0) - debug::log_keyon("KeyOn ADPCM-A%d: pan=%d%d start=%04X end=%04X level=%02X\n", - m_choffs, - m_regs.ch_pan_left(m_choffs), - m_regs.ch_pan_right(m_choffs), - m_regs.ch_start(m_choffs), - m_regs.ch_end(m_choffs), - m_regs.ch_instrument_level(m_choffs)); - } + m_playing = on; + if (m_playing) + { + m_curaddress = m_regs.ch_start(m_choffs) << m_address_shift; + m_curnibble = 0; + m_curbyte = 0; + m_accumulator = 0; + m_step_index = 0; + + // don't log masked channels + if (((debug::GLOBAL_ADPCM_A_CHANNEL_MASK >> m_choffs) & 1) != 0) + debug::log_keyon("KeyOn ADPCM-A%d: pan=%d%d start=%04X end=%04X level=%02X\n", + m_choffs, + m_regs.ch_pan_left(m_choffs), + m_regs.ch_pan_right(m_choffs), + m_regs.ch_start(m_choffs), + m_regs.ch_end(m_choffs), + m_regs.ch_instrument_level(m_choffs)); + } } @@ -150,6 +183,7 @@ void adpcm_a_channel::keyonoff(bool on) bool adpcm_a_channel::clock() { + init_ym_rom_size(); // 確保已初始化 // if not playing, just output 0 if (m_playing == 0) { @@ -175,10 +209,23 @@ bool adpcm_a_channel::clock() m_playing = m_accumulator = 0; return true; } - - m_curbyte = m_owner.intf().ymfm_external_read(ACCESS_ADPCM_A, m_curaddress++); - data = m_curbyte >> 4; - m_curnibble = 1; + // 當Channel 3且需要修改地址時 + uint32_t read_address = m_curaddress; + uint32_t reg_value = m_regs.read(m_choffs + 0x08); + + if (g_ym_rom_size > 0x1000000) + { + if (reg_value >= 0xF0) + { + read_address += 0x1000000; + } + } + + // 使用修改後的地址進行實際讀取 + m_curbyte = m_owner.intf().ymfm_external_read(ACCESS_ADPCM_A, read_address); + m_curaddress++; // 只增加原始地址,不使用修改後的地址 + data = m_curbyte >> 4; + m_curnibble = 1; } // otherwise just extract from the previosuly-fetched byte diff --git a/3rdparty/ymfm/src/ymfm_adpcm.h b/3rdparty/ymfm/src/ymfm_adpcm.h index d74e24f2770..ae62a270cc7 100644 --- a/3rdparty/ymfm/src/ymfm_adpcm.h +++ b/3rdparty/ymfm/src/ymfm_adpcm.h @@ -37,7 +37,8 @@ namespace ymfm { - +// 添加全局變量聲明 +extern uint32_t g_ym_rom_size; //********************************************************* // INTERFACE CLASSES //********************************************************* @@ -98,6 +99,7 @@ class adpcm_a_registers uint32_t dump_mask() const { return bitfield(m_regdata[0x00], 0, 6); } uint32_t total_level() const { return bitfield(m_regdata[0x01], 0, 6); } uint32_t test() const { return m_regdata[0x02]; } + uint8_t read(uint32_t index) const { return m_regdata[index]; } // per-channel registers uint32_t ch_pan_left(uint32_t choffs) const { return bitfield(m_regdata[choffs + 0x08], 7); } @@ -160,6 +162,9 @@ class adpcm_a_channel int32_t m_step_index; // index in the stepping table adpcm_a_registers &m_regs; // reference to registers adpcm_a_engine &m_owner; // reference to our owner + uint32_t m_modified_start; + uint32_t m_modified_end; + bool m_address_modified; }; diff --git a/src/devices/sound/ymopn.cpp b/src/devices/sound/ymopn.cpp index 4f71646ad1d..e2b480c35f5 100644 --- a/src/devices/sound/ymopn.cpp +++ b/src/devices/sound/ymopn.cpp @@ -150,8 +150,8 @@ template ym2610_device_base::ym2610_device_base(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, device_type type) : ymfm_ssg_device_base(mconfig, tag, owner, clock, type), device_memory_interface(mconfig, *this), - m_adpcm_a_config("adpcm_a", ENDIANNESS_LITTLE, 8, 24, 0), - m_adpcm_b_config("adpcm_b", ENDIANNESS_LITTLE, 8, 24, 0), + m_adpcm_a_config("adpcm_a", ENDIANNESS_LITTLE, 8, 25, 0), + m_adpcm_b_config("adpcm_b", ENDIANNESS_LITTLE, 8, 25, 0), m_adpcm_a_region(*this, "adpcma"), m_adpcm_b_region(*this, "adpcmb") { diff --git a/src/hbmame/drivers/kof98.cpp b/src/hbmame/drivers/kof98.cpp index 116e2182cc9..11152a28ae0 100644 --- a/src/hbmame/drivers/kof98.cpp +++ b/src/hbmame/drivers/kof98.cpp @@ -2110,15 +2110,14 @@ ROM_START( kof98ult ) // all confirmed. NEO_BIOS_AUDIO_256K( "242ae.m1", CRC(9ade0528) SHA1(67d0c3b146d369416b84c081544fe51fc6c2a140) ) - ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 ) + ROM_REGION( 0x2000000, "ymsnd:adpcma", 0 ) ROM_LOAD( "242.v1", 0x000000, 0x400000, CRC(b9ea8051) SHA1(49606f64eb249263b3341b4f50cc1763c390b2af) ) ROM_LOAD( "242.v2", 0x400000, 0x400000, CRC(cc11106e) SHA1(d3108bc05c9bf041d4236b2fa0c66b013aa8db1b) ) ROM_LOAD( "242.v3", 0x800000, 0x400000, CRC(044ea4e1) SHA1(062a2f2e52098d73bc31c9ad66f5db8080395ce8) ) ROM_LOAD( "242.v4", 0xc00000, 0x400000, CRC(7985ea30) SHA1(54ed5f0324de6164ea81943ebccb3e8d298368ec) ) + ROM_LOAD( "242ae.v5", 0x1000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - ROM_REGION( 0x1000000, "ymsnd:adpcmb", 0 ) - ROM_LOAD( "242ae.v5", 0x000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - + ROM_REGION( 0x6000000, "sprites", 0 ) ROM_LOAD16_BYTE( "242ult.c1", 0x0000000, 0x800000, CRC(8e297a35) SHA1(8177d37dba3e1e3aea74d255d0a292d03c430c0b) ) ROM_LOAD16_BYTE( "242ult.c2", 0x0000001, 0x800000, CRC(d8a4b216) SHA1(7a8aee14008ee9ccef0d76f710d6d4029098548d) ) @@ -2989,14 +2988,13 @@ ROM_START( kof98s25 ) // Anniversary Edition NEO_BIOS_AUDIO_256K( "242ae.m1", CRC(9ade0528) SHA1(67d0c3b146d369416b84c081544fe51fc6c2a140) ) - ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 ) + ROM_REGION( 0x2000000, "ymsnd:adpcma", 0 ) ROM_LOAD( "242.v1", 0x000000, 0x400000, CRC(b9ea8051) SHA1(49606f64eb249263b3341b4f50cc1763c390b2af) ) ROM_LOAD( "242.v2", 0x400000, 0x400000, CRC(cc11106e) SHA1(d3108bc05c9bf041d4236b2fa0c66b013aa8db1b) ) ROM_LOAD( "242.v3", 0x800000, 0x400000, CRC(044ea4e1) SHA1(062a2f2e52098d73bc31c9ad66f5db8080395ce8) ) ROM_LOAD( "242.v4", 0xc00000, 0x400000, CRC(7985ea30) SHA1(54ed5f0324de6164ea81943ebccb3e8d298368ec) ) + ROM_LOAD( "242ae.v5", 0x1000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - ROM_REGION( 0x1000000, "ymsnd:adpcmb", 0 ) - ROM_LOAD( "242ae.v5", 0x000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) ROM_REGION( 0x6000000, "sprites", 0 ) ROM_LOAD16_BYTE( "242ae.c1", 0x0000000, 0x800000, CRC(0319cfc9) SHA1(f275015d6bddf392936b35cd7399f929a6d63d29) ) @@ -3023,14 +3021,13 @@ ROM_START( kof98s26 ) // Anniversary Edition : all confirmed NEO_BIOS_AUDIO_256K( "242ae.m1", CRC(9ade0528) SHA1(67d0c3b146d369416b84c081544fe51fc6c2a140) ) - ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 ) + ROM_REGION( 0x2000000, "ymsnd:adpcma", 0 ) ROM_LOAD( "242.v1", 0x000000, 0x400000, CRC(b9ea8051) SHA1(49606f64eb249263b3341b4f50cc1763c390b2af) ) ROM_LOAD( "242.v2", 0x400000, 0x400000, CRC(cc11106e) SHA1(d3108bc05c9bf041d4236b2fa0c66b013aa8db1b) ) ROM_LOAD( "242.v3", 0x800000, 0x400000, CRC(044ea4e1) SHA1(062a2f2e52098d73bc31c9ad66f5db8080395ce8) ) ROM_LOAD( "242.v4", 0xc00000, 0x400000, CRC(7985ea30) SHA1(54ed5f0324de6164ea81943ebccb3e8d298368ec) ) + ROM_LOAD( "242ae.v5", 0x1000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - ROM_REGION( 0x1000000, "ymsnd:adpcmb", 0 ) - ROM_LOAD( "242ae.v5", 0x000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) ROM_REGION( 0x6000000, "sprites", 0 ) ROM_LOAD16_BYTE( "242ae.c1", 0x0000000, 0x800000, CRC(0319cfc9) SHA1(f275015d6bddf392936b35cd7399f929a6d63d29) ) @@ -3763,15 +3760,15 @@ ROM_START( kof98hh02 ) //kof98ae2016h NEO_BIOS_AUDIO_256K( "242ae.m1", CRC(9ade0528) SHA1(67d0c3b146d369416b84c081544fe51fc6c2a140) ) - ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 ) + ROM_REGION( 0x2000000, "ymsnd:adpcma", 0 ) ROM_LOAD( "242.v1", 0x000000, 0x400000, CRC(b9ea8051) SHA1(49606f64eb249263b3341b4f50cc1763c390b2af) ) ROM_LOAD( "242.v2", 0x400000, 0x400000, CRC(cc11106e) SHA1(d3108bc05c9bf041d4236b2fa0c66b013aa8db1b) ) ROM_LOAD( "242.v3", 0x800000, 0x400000, CRC(044ea4e1) SHA1(062a2f2e52098d73bc31c9ad66f5db8080395ce8) ) ROM_LOAD( "242.v4", 0xc00000, 0x400000, CRC(7985ea30) SHA1(54ed5f0324de6164ea81943ebccb3e8d298368ec) ) + ROM_LOAD( "242ae.v5", 0x1000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - ROM_REGION( 0x1000000, "ymsnd:adpcmb", 0 ) - ROM_LOAD( "242ae.v5", 0x000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) + ROM_REGION( 0x6000000, "sprites", 0 ) ROM_LOAD16_BYTE( "242aea.c1", 0x0000000, 0x800000, CRC(086ec060) SHA1(dace47c251e5c9bea771e221bf550e1b4af5212d) ) ROM_LOAD16_BYTE( "242aea.c2", 0x0000001, 0x800000, CRC(16b9a9a2) SHA1(c8b757e6a84bae33caab07de27ca6c3d84d1893a) ) @@ -5994,14 +5991,13 @@ ROM_START( kof98hh131 ) //kof98cps NEO_BIOS_AUDIO_256K( "242hx131.m1", CRC(564b53f8) SHA1(b8f3842d03f19f7af3077373db6410619380b579) ) - ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 ) + ROM_REGION( 0x2000000, "ymsnd:adpcma", 0 ) ROM_LOAD( "242.v1", 0x000000, 0x400000, CRC(b9ea8051) SHA1(49606f64eb249263b3341b4f50cc1763c390b2af) ) ROM_LOAD( "242.v2", 0x400000, 0x400000, CRC(cc11106e) SHA1(d3108bc05c9bf041d4236b2fa0c66b013aa8db1b) ) ROM_LOAD( "242.v3", 0x800000, 0x400000, CRC(044ea4e1) SHA1(062a2f2e52098d73bc31c9ad66f5db8080395ce8) ) ROM_LOAD( "242.v4", 0xc00000, 0x400000, CRC(7985ea30) SHA1(54ed5f0324de6164ea81943ebccb3e8d298368ec) ) + ROM_LOAD( "242ae.v5", 0x1000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) - ROM_REGION( 0x1000000, "ymsnd:adpcmb", 0 ) - ROM_LOAD( "242ae.v5", 0x000000, 0x400000, CRC(afdd9660) SHA1(0d67fb61111256c0d74d4f2b473ab5a42d1909b9) ) ROM_REGION( 0x6000000, "sprites", 0 ) ROM_LOAD16_BYTE( "242hx131.c1", 0x0000000, 0x800000, CRC(9cb35021) SHA1(28f6743acfe4d4d52111fbb4000bd88b012a0e42) ) diff --git a/src/hbmame/drivers/neogeo.cpp b/src/hbmame/drivers/neogeo.cpp index 4aca77892e4..577dd0e43b9 100644 --- a/src/hbmame/drivers/neogeo.cpp +++ b/src/hbmame/drivers/neogeo.cpp @@ -627,6 +627,12 @@ void neogeo_state::init_neogeo() m_maincpu->space(AS_PROGRAM).install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16smo_delegate(*this, FUNC(neogeo_state::in1_r))); m_sprgen->set_sprite_region(m_region_sprites->base(), m_region_sprites->bytes()); m_sprgen->set_fixed_regions(m_region_fixed->base(), m_region_fixed->bytes(), m_region_fixedbios); + FILE *fp = fopen(".ym_size.tmp", "w"); + if (fp) { + uint32_t ymsize = ym_region_size; + fprintf(fp, "%x", ymsize); // 以十六進制文本形式寫入 + fclose(fp); + } }