diff options
author | hap <happppp@users.noreply.github.com> | 2022-04-26 14:17:32 +0200 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2022-04-27 01:31:37 +1000 |
commit | 56ecdeef03760349175a112b23f67e3402ffa0c7 (patch) | |
tree | abf32d9e811742b3e097443c827f79bc7fd86e51 | |
parent | e0c599d620a498448cb64ea128237774fff8ccc1 (diff) |
jaguarcd: fix nodisc crash again
-rw-r--r-- | src/mame/drivers/jaguar.cpp | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/src/mame/drivers/jaguar.cpp b/src/mame/drivers/jaguar.cpp index 6767856bfd6..b6771efe453 100644 --- a/src/mame/drivers/jaguar.cpp +++ b/src/mame/drivers/jaguar.cpp @@ -1231,8 +1231,15 @@ void jaguarcd_state::butch_regs_w(offs_t offset, uint32_t data, uint32_t mem_mas switch((m_butch_regs[offset] & 0xff00) >> 8) { case 0x03: // Read TOC - uint32_t msf; - + { + if(!m_cd_file) // No disc + { + m_butch_cmd_response[0] = 0x400; + m_butch_regs[0] |= 0x2000; + m_butch_cmd_index = 0; + m_butch_cmd_size = 1; + return; + } if(m_butch_regs[offset] & 0xff) // Multi Session CD, TODO { m_butch_cmd_response[0] = 0x0029; // illegal value @@ -1242,7 +1249,7 @@ void jaguarcd_state::butch_regs_w(offs_t offset, uint32_t data, uint32_t mem_mas return; } - msf = m_cd_file->get_track_start(0) + 150; + uint32_t msf = m_cd_file->get_track_start(0) + 150; /* first track number */ m_butch_cmd_response[0] = 0x2000 | 1; @@ -1259,45 +1266,57 @@ void jaguarcd_state::butch_regs_w(offs_t offset, uint32_t data, uint32_t mem_mas m_butch_cmd_index = 0; m_butch_cmd_size = 5; break; + } + case 0x14: // Read Long TOC + { + if(!m_cd_file) // No disc { - uint32_t msf; - int ntrks = m_cd_file->get_last_track(); - - for(int i=0;i<ntrks;i++) - { - msf = m_cd_file->get_track_start(i) + 150; - - /* track number */ - m_butch_cmd_response[i*5+0] = 0x6000 | (i+1); - /* attributes (?) */ - m_butch_cmd_response[i*5+1] = 0x6100 | 0x00; - - /* start of track minutes */ - m_butch_cmd_response[i*5+2] = 0x6200 | ((msf / 60) / 60); - /* start of track seconds */ - m_butch_cmd_response[i*5+3] = 0x6300 | (msf / 60) % 60; - /* start of track frame */ - m_butch_cmd_response[i*5+4] = 0x6400 | (msf % 75); - } + m_butch_cmd_response[0] = 0x400; m_butch_regs[0] |= 0x2000; m_butch_cmd_index = 0; - m_butch_cmd_size = 5*ntrks; + m_butch_cmd_size = 1; + return; } + int ntrks = m_cd_file->get_last_track(); + + for(int i=0;i<ntrks;i++) + { + uint32_t msf = m_cd_file->get_track_start(i) + 150; + + /* track number */ + m_butch_cmd_response[i*5+0] = 0x6000 | (i+1); + /* attributes (?) */ + m_butch_cmd_response[i*5+1] = 0x6100 | 0x00; + + /* start of track minutes */ + m_butch_cmd_response[i*5+2] = 0x6200 | ((msf / 60) / 60); + /* start of track seconds */ + m_butch_cmd_response[i*5+3] = 0x6300 | (msf / 60) % 60; + /* start of track frame */ + m_butch_cmd_response[i*5+4] = 0x6400 | (msf % 75); + } + m_butch_regs[0] |= 0x2000; + m_butch_cmd_index = 0; + m_butch_cmd_size = 5*ntrks; break; + } + case 0x15: // Set Mode m_butch_regs[0] |= 0x2000; m_butch_cmd_response[0] = 0x1700 | (m_butch_regs[offset] & 0xff); m_butch_cmd_index = 0; m_butch_cmd_size = 1; break; + case 0x70: // Set DAC Mode m_butch_regs[0] |= 0x2000; m_butch_cmd_response[0] = 0x7000 | (m_butch_regs[offset] & 0xff); m_butch_cmd_index = 0; m_butch_cmd_size = 1; break; + default: printf("%04x CMD\n",m_butch_regs[offset]); break; |