diff options
Diffstat (limited to 'src/emu/machine/segacdblock.c')
| -rw-r--r-- | src/emu/machine/segacdblock.c | 92 |
1 files changed, 80 insertions, 12 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index 25b378b18ef..ec90cb82ef4 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -161,7 +161,7 @@ void segacdblock_device::cd_defragblocks(partitionT *part) temp2 = part->bnum[i]; part->bnum[i] = part->bnum[j]; part->bnum[j] = temp2; - printf("Defrag %d %d\n",i,j); + //printf("Defrag %d %d\n",i,j); } } } @@ -320,7 +320,7 @@ void segacdblock_device::device_validity_check(validity_checker &valid) const void segacdblock_device::SH1CommandExecute() { - if(m_cr[0] != 0) + if(m_cr[0] != 0 &&((m_cr[0] & 0xff00) != 0x5100)) printf("CD CMD: %04x %04x %04x %04x\n",m_cr[0],m_cr[1],m_cr[2],m_cr[3]); @@ -334,12 +334,14 @@ void segacdblock_device::SH1CommandExecute() case 0x06: cd_cmd_end_transfer(); break; case 0x10: cd_cmd_play_disc(); break; - + case 0x11: m_cd_state = CD_STAT_PAUSE; set_flag(CMOK); break; // ... + case 0x30: cd_cmd_set_device_connection(m_cr[2] >> 8); break; + case 0x40: cd_cmd_set_filter_range(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 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; @@ -348,7 +350,9 @@ void segacdblock_device::SH1CommandExecute() 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; + case 0x61: cd_cmd_get_sector(false); break; + case 0x62: cd_cmd_delete_sector(); break; + case 0x63: cd_cmd_get_sector(true); break; // get then delete sector case 0x67: cd_cmd_get_copy_error(); break; case 0x70: cd_cmd_change_dir(((m_cr[2] & 0xff)<<16) | (m_cr[3] & 0xffff) ); break; @@ -772,6 +776,8 @@ void segacdblock_device::cd_cmd_end_transfer() set_flag(EHST); } } + else + set_flag(EHST); m_dma_size = 0; set_flag(CMOK); @@ -829,6 +835,17 @@ void segacdblock_device::cd_cmd_set_device_connection(UINT8 param) set_flag(CMOK); } +void segacdblock_device::cd_cmd_set_filter_range(UINT8 filter_number) +{ + CDFilters[filter_number].fad = ((m_cr[0] & 0xff)<<16) | m_cr[1]; + CDFilters[filter_number].range = ((m_cr[2] & 0xff)<<16) | m_cr[3]; + + + cd_standard_return(false); + set_flag(ESEL); + set_flag(CMOK); +} + void segacdblock_device::cd_cmd_set_filter_subheader_conditions() { UINT8 filter_number = (m_cr[2]>>8)&0xff; @@ -977,7 +994,7 @@ void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number) - printf("%d\n",m_dr[3]); + //printf("%d\n",m_dr[3]); set_flag(DRDY); set_flag(CMOK); @@ -1032,7 +1049,7 @@ void segacdblock_device::cd_cmd_set_sector_length(UINT8 length_in, UINT8 length_ set_flag(CMOK); } -void segacdblock_device::cd_cmd_get_then_delete_sector() +void segacdblock_device::cd_cmd_get_sector(bool AutoDelete) { UINT32 sectnum = m_cr[3]; UINT32 sectofs = m_cr[1]; @@ -1067,7 +1084,54 @@ void segacdblock_device::cd_cmd_get_then_delete_sector() set_flag(EHST); set_flag(DRDY); set_flag(CMOK); - DeleteSectorMode = true; + DeleteSectorMode = AutoDelete; +} + +void segacdblock_device::cd_cmd_delete_sector() +{ + UINT32 sectnum = m_cr[3]; + UINT32 sectofs = m_cr[1]; + UINT32 bufnum = m_cr[2]>>8; + + if (partitions[bufnum].numblks < sectnum) + { + printf("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); + m_dr[0] = CD_STAT_REJECT; + + set_flag(CMOK|EHST); + debugger_break(machine()); + return; + } + // @todo reject states + m_TransferActive = false; + cd_standard_return(false); // cheap hack + + m_dr[0] = m_cd_state; + + cd_getsectoroffsetnum(bufnum, §ofs, §num); + for (INT32 i = xfersectpos; i < xfersectpos+xfersectnum; i++) + { + partitions[bufnum].size -= partitions[bufnum].blocks[i]->size; + cd_free_block(partitions[bufnum].blocks[i]); + partitions[bufnum].blocks[i] = (blockT *)NULL; + partitions[bufnum].bnum[i] = 0xff; + } + + // defrag what's left + cd_defragblocks(transpart); + + partitions[bufnum].numblks -= sectnum; + + // clean up our state + //transpart->size -= m_dma_size; + //transpart->numblks -= xfersectnum; + + /* @todo check this */ + //xfertype = CDDMA_STOPPED; + + + set_flag(EHST); + set_flag(CMOK); } void segacdblock_device::cd_cmd_get_copy_error() @@ -1565,9 +1629,11 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int { if((m_cd_state & 0x0f00) == CD_STAT_PAUSE) { - //if(!(m_hirq & BFUL)) - // m_cd_state = CD_STAT_PLAY; - + if(!(m_hirq & BFUL) && m_TempPause == true) + { + m_TempPause = false; + m_cd_state = CD_STAT_PLAY; + } m_cd_timer->adjust(attotime::from_hz(150)); } @@ -1613,7 +1679,9 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int if(m_hirq & BFUL) { //m_cd_state = CD_STAT_PAUSE; - printf("%04x\n",m_hirq); + m_TempPause = true; + m_cd_state = CD_STAT_PAUSE; + printf("%04x %d\n",m_hirq,freeblocks); } m_cd_timer->adjust(attotime::from_hz(150)); |
