diff options
| author | 2015-07-16 00:45:57 +0200 | |
|---|---|---|
| committer | 2015-07-16 00:45:57 +0200 | |
| commit | 6caaf42e1974ebc06adbcfe444c51fd82d33788c (patch) | |
| tree | 3f032b7ce4ef8f92740e244b6bc9e09e4f0dfe62 | |
| parent | 6068eba5ae2de9ace5232e48374ae696c645ff4d (diff) | |
Command 0x54 (Falcom Classics 2)
| -rw-r--r-- | src/emu/machine/segacdblock.c | 36 | ||||
| -rw-r--r-- | src/emu/machine/segacdblock.h | 1 |
2 files changed, 31 insertions, 6 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index c35d0baf712..a6cbb0eed3f 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -353,7 +353,7 @@ void segacdblock_device::SH1CommandExecute() 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 0x54: Falcom Classics 2 + case 0x54: cd_cmd_get_sector_info(m_cr[1] & 0xff,m_cr[2] >> 8); break; // Falcom Classics 2 case 0x60: cd_cmd_set_sector_length(m_cr[0] & 0xff, m_cr[1] >> 8); break; case 0x61: cd_cmd_get_sector(false); break; case 0x62: cd_cmd_delete_sector(); break; @@ -802,16 +802,19 @@ void segacdblock_device::cd_cmd_play_disc() if(play_mode) { printf("play mode enabled %02x\n",play_mode); - debugger_break(machine()); + //debugger_break(machine()); } + + UINT32 start_pos = ((m_cr[0] & 0xff) << 16) | (m_cr[1] & 0xffff); + UINT32 end_pos = ((m_cr[2] & 0xff) << 16) | (m_cr[3] & 0xffff); if(m_cr[2] & 0x8000) { - printf("preserve current position\n"); + printf("preserve current position %04x\n",m_cr[2]); debugger_break(machine()); + end_pos += m_FADEnd; } - UINT32 start_pos = ((m_cr[0] & 0xff) << 16) | (m_cr[1] & 0xffff); - UINT32 end_pos = ((m_cr[2] & 0xff) << 16) | (m_cr[3] & 0xffff); + if(start_pos & 0x800000) { if(start_pos == 0xffffff) @@ -825,6 +828,7 @@ void segacdblock_device::cd_cmd_play_disc() printf("track mode\n"); debugger_break(machine()); } + if(end_pos & 0x800000) { if(end_pos == 0xffffff) @@ -868,7 +872,7 @@ void segacdblock_device::cd_cmd_set_filter_range(UINT8 filter_number) CDFilters[filter_number].range = ((m_cr[2] & 0xff)<<16) | m_cr[3]; printf("FAD Range set %08x %08x\n",CDFilters[filter_number].fad,CDFilters[filter_number].range); - debugger_break(machine()); + //debugger_break(machine()); cd_standard_return(false); set_flag(ESEL); @@ -1070,6 +1074,26 @@ void segacdblock_device::cd_cmd_get_actual_size() set_flag(CMOK); } +void segacdblock_device::cd_cmd_get_sector_info(UINT8 sector_offset, UINT8 buffer_number) +{ + if (buffer_number >= MAX_FILTERS || !partitions[buffer_number].blocks[sector_offset]) + { + m_dr[0] |= CD_STAT_REJECT & 0xff00; + printf("Get sector info reject\n"); + debugger_break(machine()); + } + else + { + m_dr[0] = m_cd_state | ((partitions[buffer_number].blocks[sector_offset]->FAD >> 16) & 0xff); + m_dr[1] = partitions[buffer_number].blocks[sector_offset]->FAD & 0xffff; + m_dr[2] = ((partitions[buffer_number].blocks[sector_offset]->fnum & 0xff) << 8) | (partitions[buffer_number].blocks[sector_offset]->chan & 0xff); + m_dr[3] = ((partitions[buffer_number].blocks[sector_offset]->subm & 0xff) << 8) | (partitions[buffer_number].blocks[sector_offset]->cinf & 0xff); + } + + 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 e6443edbd1b..5b0c260ad7e 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -218,6 +218,7 @@ private: 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_sector_info(UINT8 sector_offset, UINT8 buffer_number); void cd_cmd_get_actual_size(); // 0x60 |
