diff options
author | angelosa <salese_corp_ltd@email.it> | 2015-07-14 00:19:00 +0200 |
---|---|---|
committer | angelosa <salese_corp_ltd@email.it> | 2015-07-14 00:19:00 +0200 |
commit | b1c8ebcdf306b2bd0fb6b8872b2d20d6b6d53530 (patch) | |
tree | f88f0cde4009883a5b087930b63262be06189254 | |
parent | 50fb87a24581fdee866930ba604624aea476e0c2 (diff) |
Temp, just to trigger a debugger_break on dword access ...
-rw-r--r-- | src/emu/machine/segacdblock.c | 53 | ||||
-rw-r--r-- | src/emu/machine/segacdblock.h | 6 |
2 files changed, 57 insertions, 2 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index d0cc1d80d73..1f782cf68f8 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -262,7 +262,10 @@ void segacdblock_device::SH1CommandExecute() case 0x48: cd_cmd_reset_selector(m_cr[0] & 0xff, m_cr[2] >> 8); break; + case 0x51: cd_cmd_get_sector_number(m_cr[2] >> 8); 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 0x67: cd_cmd_get_copy_error(); break; case 0x70: cd_cmd_change_dir(((m_cr[2] & 0xff)<<16) | (m_cr[3] & 0xffff) ); break; @@ -521,7 +524,18 @@ void segacdblock_device::make_dir_current(UINT32 fad) } } - +void segacdblock_device::cd_getsectoroffsetnum(UINT32 bufnum, UINT32 *sectoffs, UINT32 *sectnum) +{ + if (*sectoffs == 0xffff) + { + // last sector + printf("CD: Don't know how to handle offset ffff\n"); + } + else if (*sectnum == 0xffff) + { + *sectnum = partitions[bufnum].numblks - *sectoffs; + } +} void segacdblock_device::cd_standard_return(bool isPeri) { @@ -748,6 +762,20 @@ void segacdblock_device::cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_n set_flag(CMOK); } +void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number) +{ + m_dr[0] = m_cd_state; + m_dr[1] = 0; + m_dr[2] = 0; + if (partitions[buffer_number].size == -1) + m_dr[3] = 0; + else + m_dr[3] = partitions[buffer_number].numblks; + + set_flag(DRDY); + 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 }; @@ -762,6 +790,27 @@ 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() +{ + UINT32 sectnum = m_cr[3]; + UINT32 sectofs = m_cr[1]; + UINT32 bufnum = m_cr[2]>>8; + + // @todo reject states + cd_getsectoroffsetnum(bufnum, §ofs, §num); + m_dma_src = 0; + m_dma_size = 0; + transpart = &partitions[bufnum]; + + m_TransferActive = true; + cd_standard_return(false); // cheap hack + m_dr[0] = CD_STAT_TRANS | m_cd_state; + + sourcetype = SOURCE_DATA; + set_flag(EHST); + set_flag(CMOK); +} + void segacdblock_device::cd_cmd_get_copy_error() { m_dr[0] = m_cd_state | 0; @@ -934,6 +983,7 @@ void segacdblock_device::dma_setup() sourcetype = SOURCE_NONE; break; case SOURCE_DATA: + set_flag(DRDY); break; case SOURCE_AUDIO: break; @@ -1045,7 +1095,6 @@ segacdblock_device::partitionT *segacdblock_device::cd_filterdata(filterT *flt, // did the allocation succeed? if (filterprt->blocks[filterprt->numblks] == (blockT *)NULL) { - printf("mammt\n"); *p_ok = 0; return (partitionT *)NULL; } diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h index 1163d336fdb..25abd674395 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -174,6 +174,7 @@ private: filterT CDFilters[MAX_FILTERS]; filterT *CDDeviceConnection; partitionT partitions[MAX_FILTERS]; + partitionT *transpart; blockT blocks[MAX_BLOCKS]; blockT curblock; partitionT *cd_read_filtered_sector(INT32 fad, UINT8 *p_ok); @@ -207,9 +208,13 @@ private: void cd_cmd_set_device_connection(UINT8 param); // 0x40 void cd_cmd_reset_selector(UINT8 reset_flags, UINT8 buffer_number); + + // 0x50 + void cd_cmd_get_sector_number(UINT8 buffer_number); // 0x60 void cd_cmd_set_sector_length(UINT8 length_in, UINT8 length_out); + void cd_cmd_get_then_delete_sector(); void cd_cmd_get_copy_error(); // 0x70 @@ -240,6 +245,7 @@ private: std::vector<direntryT> curdir; // current directory int numfiles; // # of entries in current directory int firstfile; // first non-directory file + void cd_getsectoroffsetnum(UINT32 bufnum, UINT32 *sectoffs, UINT32 *sectnum); }; |