summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2015-07-15 01:38:38 +0200
committer angelosa <salese_corp_ltd@email.it>2015-07-15 01:38:38 +0200
commit71f6586f4a331bc296f37c494eec4fe1bfe19bb7 (patch)
treee947c051c77d57375de83c291e73d2ba43c7282d
parentb328d4ab16c750b274e270b784ff3f1d4d3ce4ad (diff)
cmd 0x61 in whizz, yay ...
-rw-r--r--src/emu/machine/segacdblock.c100
-rw-r--r--src/emu/machine/segacdblock.h9
2 files changed, 107 insertions, 2 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c
index c7c4f7cf81c..25b378b18ef 100644
--- a/src/emu/machine/segacdblock.c
+++ b/src/emu/machine/segacdblock.c
@@ -30,6 +30,7 @@
@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)
*/
@@ -336,9 +337,15 @@ void segacdblock_device::SH1CommandExecute()
case 0x30: cd_cmd_set_device_connection(m_cr[2] >> 8); break;
+ case 0x42: cd_cmd_set_filter_subheader_conditions(); break;
+ case 0x44: cd_cmd_set_filter_mode(m_cr[0] & 0xff, m_cr[2] >> 8); break;
+ 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;
+ case 0x50: cd_cmd_get_buffer_size(); break;
case 0x51: cd_cmd_get_sector_number(m_cr[2] >> 8); break;
+ case 0x52: cd_cmd_calculate_actual_size(); break;
+ case 0x53: cd_cmd_get_actual_size(); break;
case 0x60: cd_cmd_set_sector_length(m_cr[0] & 0xff, m_cr[1] >> 8); break;
case 0x63: cd_cmd_get_then_delete_sector(); break;
@@ -822,6 +829,53 @@ void segacdblock_device::cd_cmd_set_device_connection(UINT8 param)
set_flag(CMOK);
}
+void segacdblock_device::cd_cmd_set_filter_subheader_conditions()
+{
+ UINT8 filter_number = (m_cr[2]>>8)&0xff;
+
+ CDFilters[filter_number].chan = m_cr[0] & 0xff;
+ CDFilters[filter_number].smmask = (m_cr[1]>>8)&0xff;
+ CDFilters[filter_number].cimask = m_cr[1]&0xff;
+ CDFilters[filter_number].fid = m_cr[2]&0xff;
+ CDFilters[filter_number].smval = (m_cr[3]>>8)&0xff;
+ CDFilters[filter_number].cival = m_cr[3]&0xff;
+
+ cd_standard_return(false);
+ 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
+ CDFilters[filter_number].condtrue = (m_cr[1]>>8)&0xff;
+
+ if (m_cr[0] & 2) // set false condition
+ CDFilters[filter_number].condfalse = m_cr[1]&0xff;
+
+ set_flag(ESEL);
+ set_flag(CMOK);
+ cd_standard_return(false);
+}
+
+void segacdblock_device::cd_cmd_set_filter_mode(UINT8 mode, UINT8 filter_number)
+{
+ // initialize filter?
+ if (mode & 0x80)
+ {
+ memset(&CDFilters[filter_number], 0, sizeof(filterT));
+ }
+ else
+ {
+ CDFilters[filter_number].mode = mode;
+ }
+
+ cd_standard_return(false);
+
+ set_flag(ESEL);
+ set_flag(CMOK);
+}
+
void segacdblock_device::cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_number)
{
int i;
@@ -899,6 +953,16 @@ void segacdblock_device::cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_n
set_flag(CMOK);
}
+void segacdblock_device::cd_cmd_get_buffer_size()
+{
+ m_dr[0] = m_cd_state;
+ m_dr[1] = (freeblocks > 200) ? 200 : freeblocks;
+ m_dr[2] = 0x1800;
+ m_dr[3] = 200;
+ set_flag(CMOK);
+
+}
+
void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number)
{
m_dr[0] = m_cd_state;
@@ -907,7 +971,6 @@ void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number)
if (partitions[buffer_number].size == -1)
{
m_dr[3] = 0;
- debugger_break(machine());
}
else
m_dr[3] = partitions[buffer_number].numblks;
@@ -920,6 +983,41 @@ void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number)
set_flag(CMOK);
}
+void segacdblock_device::cd_cmd_calculate_actual_size()
+{
+ UINT32 bufnum = m_cr[2]>>8;
+ UINT32 sectoffs = m_cr[1];
+ UINT32 numsect = m_cr[3];
+
+ m_CalculateActualSize = 0;
+ if (partitions[bufnum].size != -1)
+ {
+ INT32 i;
+
+ for (i = 0; i < numsect; i++)
+ {
+ if (partitions[bufnum].blocks[sectoffs+i])
+ {
+ m_CalculateActualSize += (partitions[bufnum].blocks[sectoffs+i]->size / 2);
+ }
+ }
+ }
+
+ cd_standard_return(false);
+ set_flag(ESEL);
+ set_flag(CMOK);
+}
+
+void segacdblock_device::cd_cmd_get_actual_size()
+{
+ m_dr[0] = m_cd_state | ((m_CalculateActualSize>>16)&0xff);
+ m_dr[1] = (m_CalculateActualSize & 0xffff);
+ m_dr[2] = 0;
+ m_dr[3] = 0;
+ set_flag(ESEL);
+ set_flag(CMOK);
+}
+
void segacdblock_device::cd_cmd_set_sector_length(UINT8 length_in, UINT8 length_out)
{
const int sectorSizes[4] = { 2048, 2336, 2340, 2352 };
diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h
index aad114a0e34..c742013d6c4 100644
--- a/src/emu/machine/segacdblock.h
+++ b/src/emu/machine/segacdblock.h
@@ -208,10 +208,16 @@ private:
// 0x30
void cd_cmd_set_device_connection(UINT8 param);
// 0x40
+ void cd_cmd_set_filter_mode(UINT8 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);
-
+
// 0x50
+ void cd_cmd_get_buffer_size();
void cd_cmd_get_sector_number(UINT8 buffer_number);
+ void cd_cmd_calculate_actual_size();
+ void cd_cmd_get_actual_size();
// 0x60
void cd_cmd_set_sector_length(UINT8 length_in, UINT8 length_out);
@@ -256,6 +262,7 @@ private:
bool m_playtype;
sega_cdrom_get_adr_control(cdrom_file *file, int track);
int m_CurrentTrack;
+ int m_CalculateActualSize;
//bool m_BufferFull;
};