Skip to content

Commit

Permalink
Preliminary support for kof98ae V ROM (#27)
Browse files Browse the repository at this point in the history
* Add support for extending neogeo v rom definitions

* Expand the v rom that can be read to 2000000

* Added v file size log output and v5 romset fixes
  • Loading branch information
odarknighto authored Feb 26, 2025
1 parent 6cd857c commit 3dac52c
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 44 deletions.
97 changes: 72 additions & 25 deletions 3rdparty/ymfm/src/ymfm_adpcm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
//*********************************************************
Expand Down Expand Up @@ -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));
}
}


Expand All @@ -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)
{
Expand All @@ -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
Expand Down
7 changes: 6 additions & 1 deletion 3rdparty/ymfm/src/ymfm_adpcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@

namespace ymfm
{

// ²K¥[¥þ§½ÅܶqÁn©ú
extern uint32_t g_ym_rom_size;
//*********************************************************
// INTERFACE CLASSES
//*********************************************************
Expand Down Expand Up @@ -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); }
Expand Down Expand Up @@ -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;
};


Expand Down
4 changes: 2 additions & 2 deletions src/devices/sound/ymopn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@ template<typename ChipClass>
ym2610_device_base<ChipClass>::ym2610_device_base(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, device_type type) :
ymfm_ssg_device_base<ChipClass>(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")
{
Expand Down
28 changes: 12 additions & 16 deletions src/hbmame/drivers/kof98.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) )
Expand Down Expand Up @@ -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) )
Expand All @@ -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) )
Expand Down Expand Up @@ -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) )
Expand Down Expand Up @@ -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) )
Expand Down
6 changes: 6 additions & 0 deletions src/hbmame/drivers/neogeo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}


Expand Down

0 comments on commit 3dac52c

Please sign in to comment.