summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2015-07-23 22:12:35 +0200
committer angelosa <salese_corp_ltd@email.it>2015-07-23 22:12:35 +0200
commitc57b8b90ac9cac32432cc56e7277df9346deaf30 (patch)
treefec5600ee77a06acc14ae2db1389c756a2ba109f
parentb0d7f5e653ad49440ef31bdcf94f8cdc57fdafe0 (diff)
Add the two missing Astal CD commands.
ToDo documenting up to the Wazoo because yes.
-rw-r--r--src/emu/machine/segacdblock.c54
-rw-r--r--src/emu/machine/segacdblock.h2
-rw-r--r--src/mess/drivers/saturn.c2
3 files changed, 54 insertions, 4 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c
index 51741f2791e..a3118867628 100644
--- a/src/emu/machine/segacdblock.c
+++ b/src/emu/machine/segacdblock.c
@@ -28,9 +28,28 @@
33cc open, nodisc, fatal -> r0
2f10 "Last CD-DMA buffer address write %08x",r14
-@todo
-- (fill up this section once pull request these files);
-- use #define or a struct instead of m_cr[x] (starts counting from 1, shrug)
+@todo In no order:
+- use #define or a struct / enum instead of m_cr[x] (starts counting from 1, shrug);
+- Write a debug function for checking if m_cr changes values (dummy paranoid check).
+- Improve command timings. "CMOK setted up with CMOK enabled" can be a good preliminary indication for that;
+- Improve DMA, add missing features.
+- Improve buffer FIFO, starting from the basic fact that SH-1 might always transmit with 16-bit bus.
+- Remove debugger breaks (missing known features at very least).
+- Fix TOC and correlated command 0x03 for CD-ROM player.
+- HIRQ Registers are not yet, for timing and for how they really works (DRDY as an example);
+- Proper Periodic, Wait, Transfer in progress, Busy, Scan, Seek, Stand-By CD states;
+- Add missing commands, namely:
+ - Seek &| Pause command 0x11.
+ - Subchannel RW command 0x20 for CD-ROM Player.
+ - Assault Suit Leynos 2: won't work if Read File fails.
+ - Lunar 2: Add Transfer File Info 254;
+ - Yoshimoto Mahjong: CD state reject;
+ - Zero Divide: won't work without seeking position.
+- Whizz / Time Gal: fix stall.
+- Falcom Classics 2: fix start button not pressing (caused by CD Block time out for a thread);
+- pull request, otherwise might as well still use saturn_cdblock branch.
+- Add MPEG support, or die trying @spoiler it's a sub-system @endspoiler;
+- Document & optimize;
@notes
- doomj: A work RAM H buffer (0x260666b0) never zeroed during gameplay;
@@ -135,6 +154,8 @@ WRITE16_MEMBER(segacdblock_device::hirq_mask_w) { printf("%04x\n",m_hirq_mask);
void segacdblock_device::SH2SendsCommand()
{
+
+
if(m_cmd_issued != 0xf)
fatalerror("SH-2 attempted to write a command in-the-middle %04x\n",m_cmd_issued);
@@ -360,7 +381,9 @@ void segacdblock_device::SH1CommandExecute()
case 0x40: cd_cmd_set_filter_range(m_cr[2] >> 8); break;
case 0x42: cd_cmd_set_filter_subheader_conditions(); break;
+ case 0x43: cd_cmd_get_filter_subheader_conditions(m_cr[2] >> 8); break;
case 0x44: cd_cmd_set_filter_mode(m_cr[0] & 0xff, m_cr[2] >> 8); break;
+ case 0x45: cd_cmd_get_filter_mode(m_cr[2] >> 8);
case 0x46: cd_cmd_set_filter_connection(m_cr[2] >> 8); break;
case 0x48: cd_cmd_reset_selector(m_cr[0] & 0xff, m_cr[2] >> 8); break;
@@ -980,6 +1003,18 @@ void segacdblock_device::cd_cmd_set_filter_subheader_conditions()
set_flag(CMOK);
}
+void segacdblock_device::cd_cmd_get_filter_subheader_conditions(UINT8 filter_number)
+{
+ m_dr[0] = m_cd_state | (CDFilters[filter_number].chan & 0xff);
+ m_dr[1] = (CDFilters[filter_number].smmask << 8) | (CDFilters[filter_number].cimask & 0xff);
+ m_dr[2] = CDFilters[filter_number].fid & 0xff;
+ m_dr[3] = (CDFilters[filter_number].smval << 8) | (CDFilters[filter_number].cival & 0xff);
+
+ set_flag(ESEL);
+ set_flag(CMOK);
+}
+
+
void segacdblock_device::cd_cmd_set_filter_connection(UINT8 filter_number)
{
if (m_cr[0] & 1) // set true condition
@@ -1002,6 +1037,8 @@ void segacdblock_device::cd_cmd_set_filter_mode(UINT8 mode, UINT8 filter_number)
}
else
{
+ if(filter_number >= MAX_FILTERS)
+ fatalerror("set filter mode > 0x24???");
CDFilters[filter_number].mode = mode;
}
@@ -1011,6 +1048,17 @@ void segacdblock_device::cd_cmd_set_filter_mode(UINT8 mode, UINT8 filter_number)
set_flag(CMOK);
}
+void segacdblock_device::cd_cmd_get_filter_mode(UINT8 filter_number)
+{
+ m_dr[0] = m_cd_state | CDFilters[filter_number].mode;
+ m_dr[1] = 0;
+ m_dr[2] = 0;
+ m_dr[3] = 0;
+
+ set_flag(ESEL);
+ set_flag(CMOK);
+}
+
void segacdblock_device::cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_number)
{
int i;
diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h
index 18db5619c88..edbbb5655c1 100644
--- a/src/emu/machine/segacdblock.h
+++ b/src/emu/machine/segacdblock.h
@@ -212,6 +212,8 @@ private:
// 0x40
void cd_cmd_set_filter_range(UINT8 filter_number);
void cd_cmd_set_filter_mode(UINT8 mode, UINT8 filter_number);
+ void cd_cmd_get_filter_subheader_conditions(UINT8 filter_number);
+ void cd_cmd_get_filter_mode(UINT8 filter_number);
void cd_cmd_set_filter_subheader_conditions();
void cd_cmd_set_filter_connection(UINT8 filter_number);
void cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_number);
diff --git a/src/mess/drivers/saturn.c b/src/mess/drivers/saturn.c
index 77f652983cd..27c7b9f2c6b 100644
--- a/src/mess/drivers/saturn.c
+++ b/src/mess/drivers/saturn.c
@@ -117,7 +117,7 @@ READ32_MEMBER( sat_console_state::abus_dummy_r )
In the grandscheme of how cache really works it's probably using 0x6000348 RAM register for doing a
task then purge the line and recopy the right ISM buffer.
- @todo stupid hack, not going to be officially released.
+ @todo stupid hack, not going to be officially released like this.
*/
WRITE32_MEMBER( sat_console_state::astal_cache_hack_w )
{