From 867776875d697581271a07dce6fd5b062ae9b4db Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 14 Feb 2018 23:13:43 -0500 Subject: [PATCH] saturn, sfish2: Move existing CD-ROM emulation down into device --- src/devices/machine/stvcd.cpp | 326 ++++++++++++++++------------------ src/devices/machine/stvcd.h | 198 +++++++++++++++++++++ src/mame/drivers/saturn.cpp | 32 ++-- src/mame/drivers/stv.cpp | 39 ++-- src/mame/includes/saturn.h | 180 ------------------- src/mame/includes/stv.h | 2 + 6 files changed, 387 insertions(+), 390 deletions(-) diff --git a/src/devices/machine/stvcd.cpp b/src/devices/machine/stvcd.cpp index f79c92e04d5..b5f083d3260 100644 --- a/src/devices/machine/stvcd.cpp +++ b/src/devices/machine/stvcd.cpp @@ -24,20 +24,13 @@ ***************************************************************************/ #include "emu.h" -#include "imagedev/chd_cd.h" -#include "includes/saturn.h" -#include "cdrom.h" -#include "machine/timer.h" -#include "sound/cdda.h" -#include "debugger.h" +#include "machine/stvcd.h" + #include "coreutil.h" // super-verbose -#if 0 -#define CDROM_LOG(x) printf x; -#else -#define CDROM_LOG(x) -#endif +//#define VERBOSE 1 +#include "logmacro.h" // HIRQ definitions #define CMOK 0x0001 // command dispatch possible @@ -73,14 +66,42 @@ #define CD_STAT_WAIT 0x8000 // waiting for command if set, else executed immediately #define CD_STAT_REJECT 0xff00 // ultra-fatal error. -int saturn_state::get_timing_command(void) +DEFINE_DEVICE_TYPE(STVCD, stvcd_device, "stvcd", "Sega Saturn/ST-V CD-ROM Block") + +stvcd_device::stvcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, STVCD, tag, owner, clock) + , m_cdrom_image(*this, "cdrom") + , m_sector_timer(*this, "sector_timer") + , m_sh1_timer(*this, "sh1_cmd") + , m_cdda(*this, "cdda") +{ +} + +MACHINE_CONFIG_START(stvcd_device::device_add_mconfig) + MCFG_CDROM_ADD("cdrom") + MCFG_CDROM_INTERFACE("sat_cdrom") + + MCFG_TIMER_DRIVER_ADD("sector_timer", stvcd_device, stv_sector_cb) + MCFG_TIMER_DRIVER_ADD("sh1_cmd", stvcd_device, stv_sh1_sim) + + MCFG_SOUND_ADD("cdda", CDDA, 0) + // FIXME: these outputs should not be hardcoded + MCFG_SOUND_ROUTE(0, ":lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, ":rspeaker", 1.0) +MACHINE_CONFIG_END + +void stvcd_device::device_start() +{ +} + +int stvcd_device::get_timing_command(void) { /* TODO: calculate timings based off command params */ return 16667; } /* FIXME: assume Saturn CD-ROMs to have a 2 secs pre-gap for now. */ -int saturn_state::get_track_index(uint32_t fad) +int stvcd_device::get_track_index(uint32_t fad) { uint32_t rel_fad; uint8_t track; @@ -98,12 +119,12 @@ int saturn_state::get_track_index(uint32_t fad) return 1; } -int saturn_state::sega_cdrom_get_adr_control(cdrom_file *file, int track) +int stvcd_device::sega_cdrom_get_adr_control(cdrom_file *file, int track) { return bitswap<8>(cdrom_get_adr_control(file, cur_track),3,2,1,0,7,6,5,4); } -void saturn_state::cr_standard_return(uint16_t cur_status) +void stvcd_device::cr_standard_return(uint16_t cur_status) { if ((cd_stat & 0x0f00) == CD_STAT_SEEK) { @@ -128,7 +149,7 @@ void saturn_state::cr_standard_return(uint16_t cur_status) } } -void saturn_state::mpeg_standard_return(uint16_t cur_status) +void stvcd_device::mpeg_standard_return(uint16_t cur_status) { cr1 = cur_status | 0x01; cr2 = 0; // V-Counter @@ -136,7 +157,7 @@ void saturn_state::mpeg_standard_return(uint16_t cur_status) cr4 = 0x1000; // video status } -void saturn_state::cd_exec_command( void ) +void stvcd_device::cd_exec_command() { uint32_t temp; @@ -145,12 +166,12 @@ void saturn_state::cd_exec_command( void ) ((cr1 & 0xff00) != 0x5200) && ((cr1 & 0xff00) != 0x5300) && 1) - logerror("CD: command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat); + logerror("Command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat); switch ((cr1 >> 8) & 0xff) { case 0x00: - //CDROM_LOG(("%s:CD: Get Status\n", machine().describe_context())) + //LOG("%s: Get Status\n", machine().describe_context(); hirqreg |= CMOK; if(status_type == 0) cr_standard_return(cd_stat); @@ -162,11 +183,11 @@ void saturn_state::cd_exec_command( void ) cr4 = prev_cr4; status_type = 0; /* Road Blaster and friends needs this otherwise they won't boot. */ } - //CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) + //LOG(" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4); break; case 0x01: - CDROM_LOG(("%s:CD: Get Hardware Info\n", machine().describe_context())) + LOG("%s: Get Hardware Info\n", machine().describe_context()); hirqreg |= CMOK; cr1 = cd_stat; cr2 = 0x0201; @@ -176,7 +197,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x02: // Get TOC - CDROM_LOG(("%s:CD: Get TOC\n", machine().describe_context())) + LOG("%s: Get TOC\n", machine().describe_context()); cd_readTOC(); cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE; cr1 = cd_stat; @@ -192,7 +213,7 @@ void saturn_state::cd_exec_command( void ) // bios is interested in returns in cr3 and cr4 // cr3 should be data track # // cr4 must be > 1 and < 100 or bios gets angry. - CDROM_LOG(("%s:CD: Get Session Info\n", machine().describe_context())) + LOG("%s: Get Session Info\n", machine().describe_context()); cd_readTOC(); switch (cr1 & 0xff) { @@ -233,7 +254,7 @@ void saturn_state::cd_exec_command( void ) // CR1 & 8 = retry reading mode 2 sectors // CR1 & 10 = force single-speed // CR1 & 80 = no change flag (done by Assault Suit Leynos 2) - CDROM_LOG(("%s:CD: Initialize CD system\n", machine().describe_context())) + LOG("%s: Initialize CD system\n", machine().describe_context()); //if((cr1 & 0x81) == 0x00) //guess TODO: nope, Choice Cuts doesn't like it, it crashes if you try to skip the FMV otherwise. { if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) @@ -278,7 +299,7 @@ void saturn_state::cd_exec_command( void ) case 0x06: // end data transfer (TODO: needs to be worked on!) // returns # of bytes transferred (24 bits) in // low byte of cr1 (MSB) and cr2 (middle byte, LSB) - CDROM_LOG(("%s:CD: End data transfer (%d bytes xfer'd)\n", machine().describe_context(), xferdnum)) + LOG("%s: End data transfer (%d bytes xfer'd)\n", machine().describe_context(), xferdnum); // clear the "transfer" flag cd_stat &= ~CD_STAT_TRANS; @@ -346,7 +367,7 @@ void saturn_state::cd_exec_command( void ) xferdnum = 0; hirqreg |= CMOK; - CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) + LOG(" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4); status_type = 1; break; @@ -354,7 +375,7 @@ void saturn_state::cd_exec_command( void ) uint32_t start_pos,end_pos; uint8_t play_mode; - CDROM_LOG(("%s:CD: Play Disc\n", machine().describe_context())) + LOG("%s: Play Disc\n", machine().describe_context()); cd_stat = CD_STAT_PLAY; play_mode = (cr3 >> 8) & 0x7f; @@ -380,7 +401,7 @@ void saturn_state::cd_exec_command( void ) cur_track = (start_pos)>>8; cd_fad_seek = cdrom_get_track_start(cdrom, cur_track-1); cd_stat = CD_STAT_SEEK; - machine().device("cdda")->pause_audio(0); + m_cdda->pause_audio(0); } else { @@ -441,7 +462,7 @@ void saturn_state::cd_exec_command( void ) } } - CDROM_LOG(("CD: Play Disc: start %x length %x\n", cd_curfad, fadstoplay)) + LOG("Play Disc: start %x length %x\n", cd_curfad, fadstoplay); cr_standard_return(cd_stat); hirqreg |= (CMOK); @@ -453,8 +474,8 @@ void saturn_state::cd_exec_command( void ) // cdda if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) == CD_TRACK_AUDIO) { - machine().device("cdda")->pause_audio(0); - //machine().device("cdda")->start_audio(cd_curfad, fadstoplay); + m_cdda->pause_audio(0); + //m_cdda->start_audio(cd_curfad, fadstoplay); //cdda_repeat_count = 0; } @@ -468,7 +489,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x11: // disc seek - CDROM_LOG(("%s:CD: Disc seek\n", machine().describe_context())) + LOG("%s: Disc seek\n", machine().describe_context()); //printf("%08x %08x %08x %08x\n",cr1,cr2,cr3,cr4); if (cr1 & 0x80) { @@ -480,7 +501,7 @@ void saturn_state::cd_exec_command( void ) if (temp == 0xffffff) { cd_stat = CD_STAT_PAUSE; - machine().device("cdda")->pause_audio(1); + m_cdda->pause_audio(1); } else { @@ -496,7 +517,7 @@ void saturn_state::cd_exec_command( void ) cd_stat = CD_STAT_PAUSE; cur_track = cr2>>8;; cd_curfad = cdrom_get_track_start(cdrom, cur_track-1); - machine().device("cdda")->pause_audio(1); + m_cdda->pause_audio(1); // (index is cr2 low byte) } else // error! @@ -504,7 +525,7 @@ void saturn_state::cd_exec_command( void ) cd_stat = CD_STAT_STANDBY; cd_curfad = 0xffffffff; cur_track = 0xff; - machine().device("cdda")->stop_audio(); //stop any pending CD-DA + m_cdda->stop_audio(); //stop any pending CD-DA } } @@ -598,7 +619,7 @@ void saturn_state::cd_exec_command( void ) // get operation parm = cr3>>8; - CDROM_LOG(("%s:CD: Set CD Device Connection filter # %x\n", machine().describe_context(), parm)) + LOG("%s: Set CD Device Connection filter # %x\n", machine().describe_context(), parm); cddevicenum = parm; @@ -641,7 +662,7 @@ void saturn_state::cd_exec_command( void ) { uint8_t fnum = (cr3>>8)&0xff; - CDROM_LOG(("%s:CD: Set Filter Range\n", machine().describe_context())) + LOG("%s: Set Filter Range\n", machine().describe_context()); filters[fnum].fad = ((cr1 & 0xff)<<16) | cr2; filters[fnum].range = ((cr3 & 0xff)<<16) | cr4; @@ -663,7 +684,7 @@ void saturn_state::cd_exec_command( void ) { uint8_t fnum = (cr3>>8)&0xff; - CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) + LOG("%s: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4); filters[fnum].chan = cr1 & 0xff; filters[fnum].smmask = (cr2>>8)&0xff; @@ -682,7 +703,7 @@ void saturn_state::cd_exec_command( void ) { uint8_t fnum = (cr3>>8)&0xff; - CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) + LOG("%s: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4); cr1 = cd_stat | (filters[fnum].chan & 0xff); cr2 = (filters[fnum].smmask << 8) | (filters[fnum].cimask & 0xff); @@ -709,7 +730,7 @@ void saturn_state::cd_exec_command( void ) filters[fnum].mode = mode; } - CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine().describe_context(), fnum, mode)) + LOG("%s: Set Filter Mode filt %x mode %x\n", machine().describe_context(), fnum, mode); hirqreg |= (CMOK|ESEL); cr_standard_return(cd_stat); status_type = 0; @@ -735,7 +756,7 @@ void saturn_state::cd_exec_command( void ) /* TODO: maybe condition false is cr3 low? */ uint8_t fnum = (cr3>>8)&0xff; - CDROM_LOG(("%s:CD: Set Filter Connection %x => mode %x parm %04x\n", machine().describe_context(), fnum, cr1 & 0xf, cr2)) + LOG("%s:CD: Set Filter Connection %x => mode %x parm %04x\n", machine().describe_context(), fnum, cr1 & 0xf, cr2); if (cr1 & 1) // set true condition filters[fnum].condtrue = (cr2>>8)&0xff; @@ -753,7 +774,7 @@ void saturn_state::cd_exec_command( void ) { int i,j; - CDROM_LOG(("%s:CD: Reset Selector\n", machine().describe_context())) + LOG("%s: Reset Selector\n", machine().describe_context()); if((cr1 & 0xff) == 0x00) { @@ -844,7 +865,7 @@ void saturn_state::cd_exec_command( void ) cr2 = (freeblocks > 200) ? 200 : freeblocks; cr3 = 0x1800; cr4 = 200; - CDROM_LOG(("CD: Get Buffer Size = %d\n", cr2)) + LOG("Get Buffer Size = %d\n", cr2); hirqreg |= (CMOK); status_type = 0; break; @@ -853,7 +874,7 @@ void saturn_state::cd_exec_command( void ) { uint32_t bufnum = cr3>>8; - CDROM_LOG(("%s:CD: Get Sector Number (bufno %d) = %d blocks\n", machine().describe_context(), bufnum, cr4)) + LOG("%s: Get Sector Number (bufno %d) = %d blocks\n", machine().describe_context(), bufnum, cr4); cr1 = cd_stat; cr2 = 0; cr3 = 0; @@ -886,7 +907,7 @@ void saturn_state::cd_exec_command( void ) uint32_t sectoffs = cr2; uint32_t numsect = cr4; - CDROM_LOG(("%s:CD: Calculate actual size: buf %x offs %x numsect %x\n", machine().describe_context(), bufnum, sectoffs, numsect)) + LOG("%s: Calculate actual size: buf %x offs %x numsect %x\n", machine().describe_context(), bufnum, sectoffs, numsect); calcsize = 0; if (partitions[bufnum].size != -1) @@ -909,7 +930,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x53: // get actual block size - CDROM_LOG(("%s:CD: Get actual block size\n", machine().describe_context())) + LOG("%s: Get actual block size\n", machine().describe_context()); cr1 = cd_stat | ((calcsize>>16)&0xff); cr2 = (calcsize & 0xffff); cr3 = 0; @@ -943,7 +964,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x60: // set sector length - CDROM_LOG(("%s:CD: Set sector length\n", machine().describe_context())) + LOG("%s: Set sector length\n", machine().describe_context()); switch (cr1 & 0xff) { @@ -987,11 +1008,11 @@ void saturn_state::cd_exec_command( void ) uint32_t sectofs = cr2; uint32_t bufnum = cr3>>8; - CDROM_LOG(("%s:CD: Get sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) + LOG("%s: Get sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum); if (bufnum >= MAX_FILTERS) { - printf("CD: invalid buffer number\n"); + osd_printf_error("CD: invalid buffer number\n"); /* TODO: why this is happening? */ cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); @@ -1000,7 +1021,7 @@ void saturn_state::cd_exec_command( void ) if (partitions[bufnum].numblks < sectnum) { - printf("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); + osd_printf_error("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); return; @@ -1030,11 +1051,11 @@ void saturn_state::cd_exec_command( void ) uint32_t bufnum = cr3>>8; int32_t i; - CDROM_LOG(("%s:CD: Delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) + LOG("%s: Delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum); if (bufnum >= MAX_FILTERS) { - printf("CD: invalid buffer number\n"); + osd_printf_error("CD: invalid buffer number\n"); /* TODO: why this is happening? */ cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); @@ -1044,7 +1065,7 @@ void saturn_state::cd_exec_command( void ) /* TODO: Phantasy Star 2 throws this one. */ if (partitions[bufnum].numblks == 0) { - printf("CD: buffer is already empty\n"); + osd_printf_error("CD: buffer is already empty\n"); cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); return; @@ -1082,11 +1103,11 @@ void saturn_state::cd_exec_command( void ) uint32_t sectofs = cr2; uint32_t bufnum = cr3>>8; - CDROM_LOG(("%s:CD: Get and delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) + LOG("%s: Get and delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum); if (bufnum >= MAX_FILTERS) { - printf("CD: invalid buffer number\n"); + osd_printf_error("CD: invalid buffer number\n"); /* TODO: why this is happening? */ cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); @@ -1096,7 +1117,7 @@ void saturn_state::cd_exec_command( void ) /* Yoshimoto Mahjong uses the REJECT status to verify when the data is ready. */ if (partitions[bufnum].numblks < sectnum) { - printf("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); + osd_printf_error("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); cr_standard_return(CD_STAT_REJECT); hirqreg |= (CMOK|EHST); return; @@ -1201,7 +1222,7 @@ void saturn_state::cd_exec_command( void ) case 0x67: // get copy error - CDROM_LOG(("%s:CD: Get copy error\n", machine().describe_context())) + LOG("%s: Get copy error\n", machine().describe_context()); logerror("Get copy error\n"); cr1 = cd_stat; cr2 = 0; @@ -1212,7 +1233,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x70: // change directory - CDROM_LOG(("%s:CD: Change Directory\n", machine().describe_context())) + LOG("%s: Change Directory\n", machine().describe_context()); hirqreg |= (CMOK|EFLS); temp = (cr3&0xff)<<16; @@ -1224,7 +1245,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x71: // Read directory entry - CDROM_LOG(("%s:CD: Read Directory Entry\n", machine().describe_context())) + LOG("%s: Read Directory Entry\n", machine().describe_context()); // uint32_t read_dir; // read_dir = ((cr3&0xff)<<16)|cr4; @@ -1243,7 +1264,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x72: // Get file system scope - CDROM_LOG(("CD: Get file system scope\n")) + LOG("%s: Get file system scope\n", machine().describe_context()); hirqreg |= (CMOK|EFLS); cr1 = cd_stat; cr2 = numfiles; // # of files in directory @@ -1254,7 +1275,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x73: // Get File Info - CDROM_LOG(("%s:CD: Get File Info\n", machine().describe_context())) + LOG("%s: Get File Info\n", machine().describe_context()); cd_stat |= CD_STAT_TRANS; cd_stat &= 0xff00; // clear top byte of return value playtype = 0; @@ -1308,12 +1329,12 @@ void saturn_state::cd_exec_command( void ) xfertype = XFERTYPE_FILEINFO_1; xfercount = 0; } - CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) + LOG(" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4); status_type = 0; break; case 0x74: // Read File - CDROM_LOG(("%s:CD: Read File\n", machine().describe_context())) + LOG("%s: Read File\n", machine().describe_context()); uint16_t file_offset,file_filter,file_id,file_size; file_offset = ((cr1 & 0xff)<<8)|(cr2 & 0xff); /* correct? */ @@ -1343,7 +1364,7 @@ void saturn_state::cd_exec_command( void ) break; case 0x75: - CDROM_LOG(("%s:CD: Abort File\n", machine().describe_context())) + LOG("%s: Abort File\n", machine().describe_context()); // bios expects "2bc" mask to work against this hirqreg |= (CMOK|EFLS); sectorstore = 0; @@ -1356,7 +1377,7 @@ void saturn_state::cd_exec_command( void ) break; case 0xe0: // appears to be copy protection check. needs only to return OK. - CDROM_LOG(("%s:CD: Verify copy protection\n", machine().describe_context())) + LOG("%s: Verify copy protection\n", machine().describe_context()); if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) cd_stat = CD_STAT_PAUSE; // cr1 = cd_stat; // necessary to pass @@ -1376,7 +1397,7 @@ void saturn_state::cd_exec_command( void ) break; case 0xe1: // get disc region - CDROM_LOG(("%s:CD: Get disc region\n", machine().describe_context())) + LOG("%s: Get disc region\n", machine().describe_context()); if(cd_stat != CD_STAT_NODISC && cd_stat != CD_STAT_OPEN) cd_stat = CD_STAT_PAUSE; cr1 = cd_stat; // necessary to pass @@ -1424,7 +1445,7 @@ void saturn_state::cd_exec_command( void ) break; default: - CDROM_LOG(("CD: Unknown command %04x\n", cr1>>8)) + LOG("Unknown command %04x\n", cr1>>8); popmessage("CD Block unknown command %02x, contact MAMEdev",cr1>>8); hirqreg |= (CMOK); @@ -1440,24 +1461,24 @@ void saturn_state::cd_exec_command( void ) } } -TIMER_DEVICE_CALLBACK_MEMBER( saturn_state::stv_sh1_sim ) +TIMER_DEVICE_CALLBACK_MEMBER( stvcd_device::stv_sh1_sim ) { if((cmd_pending == 0xf) && (!(hirqreg & CMOK))) cd_exec_command(); } -TIMER_DEVICE_CALLBACK_MEMBER( saturn_state::stv_sector_cb ) +TIMER_DEVICE_CALLBACK_MEMBER( stvcd_device::stv_sector_cb ) { - //sector_timer->reset(); + //m_sector_timer->reset(); //popmessage("%08x %08x %d %d",cd_curfad,fadstoplay,cmd_pending,cd_speed); cd_playdata(); if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) == CD_TRACK_AUDIO) - sector_timer->adjust(attotime::from_hz(75)); // 75 sectors / second = 150kBytes/second (cdda track ignores cd_speed setting) + m_sector_timer->adjust(attotime::from_hz(75)); // 75 sectors / second = 150kBytes/second (cdda track ignores cd_speed setting) else - sector_timer->adjust(attotime::from_hz(75*cd_speed)); // 75 / 150 sectors / second = 150 / 300kBytes/second + m_sector_timer->adjust(attotime::from_hz(75*cd_speed)); // 75 / 150 sectors / second = 150 / 300kBytes/second /* TODO: doesn't boot if a disk isn't in? */ /* TODO: Check out when this really happens. (Daytona USA original version definitely wants it to be on).*/ @@ -1471,7 +1492,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( saturn_state::stv_sector_cb ) } // global functions -void saturn_state::stvcd_reset( void ) +void stvcd_device::device_reset() { int32_t i, j; @@ -1520,29 +1541,13 @@ void saturn_state::stvcd_reset( void ) } // open device - //if (cdrom) - { - //cdrom_close(cdrom); - cdrom = (cdrom_file *)nullptr; - } + cdrom = m_cdrom_image->get_cdrom_file(); - cdrom_image_device *cddevice = machine().device("cdrom"); - if (cddevice!=nullptr) - { - // MESS case - cdrom = cddevice->get_cdrom_file(); - } - else - { - // MAME case - cdrom = cdrom_open(machine().rom_load().get_disk_handle(":cdrom")); - } - - machine().device("cdda")->set_cdrom(cdrom); + m_cdda->set_cdrom(cdrom); if (cdrom) { - CDROM_LOG(("Opened CD-ROM successfully, reading root directory\n")) + LOG("Opened CD-ROM successfully, reading root directory\n"); read_new_dir(0xffffff); // read root directory } else @@ -1554,12 +1559,10 @@ void saturn_state::stvcd_reset( void ) cdda_repeat_count = 0; tray_is_closed = 1; - sector_timer = machine().device("sector_timer"); - sector_timer->adjust(attotime::from_hz(150)); // 150 sectors / second = 300kBytes/second - sh1_timer = machine().device("sh1_cmd"); + m_sector_timer->adjust(attotime::from_hz(150)); // 150 sectors / second = 300kBytes/second } -saturn_state::blockT *saturn_state::cd_alloc_block(uint8_t *blknum) +stvcd_device::blockT *stvcd_device::cd_alloc_block(uint8_t *blknum) { int32_t i; @@ -1578,7 +1581,7 @@ saturn_state::blockT *saturn_state::cd_alloc_block(uint8_t *blknum) blocks[i].size = sectlenin; *blknum = i; - CDROM_LOG(("CD: allocating block %d, size %x\n", i, sectlenin)) + LOG("Allocating block %d, size %x\n", i, sectlenin); return &blocks[i]; } @@ -1588,11 +1591,11 @@ saturn_state::blockT *saturn_state::cd_alloc_block(uint8_t *blknum) return (blockT *)nullptr; } -void saturn_state::cd_free_block(blockT *blktofree) +void stvcd_device::cd_free_block(blockT *blktofree) { int32_t i; - CDROM_LOG(("cd_free_block: %x\n", (uint32_t)(uintptr_t)blktofree)) + LOG("cd_free_block: %x\n", (uint32_t)(uintptr_t)blktofree); if(blktofree == nullptr) { @@ -1603,7 +1606,7 @@ void saturn_state::cd_free_block(blockT *blktofree) { if (&blocks[i] == blktofree) { - CDROM_LOG(("CD: freeing block %d\n", i)) + LOG("Freeing block %d\n", i); } } @@ -1613,12 +1616,12 @@ void saturn_state::cd_free_block(blockT *blktofree) hirqreg &= ~BFUL; } -void saturn_state::cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, uint32_t *sectnum) +void stvcd_device::cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, uint32_t *sectnum) { if (*sectoffs == 0xffff) { // last sector - printf("CD: Don't know how to handle offset ffff\n"); + osd_printf_error("CD: Don't know how to handle offset ffff\n"); } else if (*sectnum == 0xffff) { @@ -1626,7 +1629,7 @@ void saturn_state::cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, ui } } -void saturn_state::cd_defragblocks(partitionT *part) +void stvcd_device::cd_defragblocks(partitionT *part) { uint32_t i, j; blockT *temp; @@ -1650,7 +1653,7 @@ void saturn_state::cd_defragblocks(partitionT *part) } } -uint16_t saturn_state::cd_readWord(uint32_t addr) +uint16_t stvcd_device::cd_readWord(uint32_t addr) { uint16_t rv; @@ -1669,7 +1672,7 @@ uint16_t saturn_state::cd_readWord(uint32_t addr) hirqreg = rv; -// CDROM_LOG(("RW HIRQ: %04x\n", rv)) +// LOG("RW HIRQ: %04x\n", rv); return rv; @@ -1677,7 +1680,7 @@ uint16_t saturn_state::cd_readWord(uint32_t addr) case 0x000e: case 0x800c: case 0x800e: -// CDROM_LOG(("RW HIRM: %04x\n", hirqmask)) +// LOG("RW HIRM: %04x\n", hirqmask); printf("RW HIRM: %04x\n", hirqmask); return hirqmask; @@ -1685,28 +1688,28 @@ uint16_t saturn_state::cd_readWord(uint32_t addr) case 0x001a: case 0x8018: case 0x801a: -// CDROM_LOG(("RW CR1: %04x\n", cr1)) +// LOG("RW CR1: %04x\n", cr1); return cr1; case 0x001c: case 0x001e: case 0x801c: case 0x801e: -// CDROM_LOG(("RW CR2: %04x\n", cr2)) +// LOG("RW CR2: %04x\n", cr2); return cr2; case 0x0020: case 0x0022: case 0x8020: case 0x8022: -// CDROM_LOG(("RW CR3: %04x\n", cr3)) +// LOG("RW CR3: %04x\n", cr3); return cr3; case 0x0024: case 0x0026: case 0x8024: case 0x8026: -// CDROM_LOG(("RW CR4: %04x\n", cr4)) +// LOG("RW CR4: %04x\n", cr4); //popmessage("%04x %04x %04x %04x",cr1,cr2,cr3,cr4); cmd_pending = 0; cd_stat |= CD_STAT_PERI; @@ -1802,7 +1805,7 @@ uint16_t saturn_state::cd_readWord(uint32_t addr) break; default: - printf("STVCD: Unhandled xfer type %d\n", (int)xfertype); + osd_printf_error("STVCD: Unhandled xfer type %d\n", (int)xfertype); rv = 0; break; } @@ -1810,13 +1813,13 @@ uint16_t saturn_state::cd_readWord(uint32_t addr) return rv; default: - CDROM_LOG(("CD: RW %08x\n", addr)) + LOG("CD: RW %08x\n", addr); return 0xffff; } } -uint32_t saturn_state::cd_readLong(uint32_t addr) +uint32_t stvcd_device::cd_readLong(uint32_t addr) { uint32_t rv = 0; @@ -1842,7 +1845,7 @@ uint32_t saturn_state::cd_readLong(uint32_t addr) // did we run out of sector? if (xferoffs >= transpart->blocks[xfersect]->size) { - CDROM_LOG(("CD: finished xfer of block %d of %d\n", xfersect+1, xfersectnum)) + LOG("Finished xfer of block %d of %d\n", xfersect+1, xfersectnum); xferoffs = 0; xfersect++; @@ -1854,7 +1857,7 @@ uint32_t saturn_state::cd_readLong(uint32_t addr) { int32_t i; - CDROM_LOG(("Killing sectors in done\n")) + LOG("Killing sectors in done\n"); // deallocate the blocks for (i = xfersectpos; i < xfersectpos+xfersectnum; i++) @@ -1878,19 +1881,19 @@ uint32_t saturn_state::cd_readLong(uint32_t addr) break; default: - printf("CD: unhandled 32-bit transfer type\n"); + osd_printf_error("CD: unhandled 32-bit transfer type\n"); break; } return rv; default: - CDROM_LOG(("CD: RL %08x\n", addr)) + LOG("RL %08x\n", addr); return 0xffff; } } -void saturn_state::cd_writeLong(uint32_t addr, uint32_t data) +void stvcd_device::cd_writeLong(uint32_t addr, uint32_t data) { switch (addr & 0xffff) { @@ -1913,7 +1916,7 @@ void saturn_state::cd_writeLong(uint32_t addr, uint32_t data) // did we run out of sector? if (xferoffs >= transpart->blocks[xfersectpos+xfersect]->size) { - CDROM_LOG(("CD: finished xfer of block %d of %d\n", xfersect+1, xfersectnum)) + LOG("Finished xfer of block %d of %d\n", xfersect+1, xfersectnum); xferoffs = 0; xfersect++; @@ -1927,7 +1930,7 @@ void saturn_state::cd_writeLong(uint32_t addr, uint32_t data) break; default: - printf("CD: unhandled 32-bit transfer type write\n"); + osd_printf_error("CD: unhandled 32-bit transfer type write\n"); break; } break; @@ -1937,7 +1940,7 @@ void saturn_state::cd_writeLong(uint32_t addr, uint32_t data) } } -void saturn_state::cd_writeWord(uint32_t addr, uint16_t data) +void stvcd_device::cd_writeWord(uint32_t addr, uint16_t data) { switch(addr & 0xffff) { @@ -1945,14 +1948,14 @@ void saturn_state::cd_writeWord(uint32_t addr, uint16_t data) case 0x000a: case 0x8008: case 0x800a: -// CDROM_LOG(("%s:WW HIRQ: %04x & %04x => %04x\n", machine().describe_context(), hirqreg, data, hirqreg & data)) +// LOG("%s:WW HIRQ: %04x & %04x => %04x\n", machine().describe_context(), hirqreg, data, hirqreg & data); hirqreg &= data; return; case 0x000c: case 0x000e: case 0x800c: case 0x800e: -// CDROM_LOG(("WW HIRM: %04x => %04x\n", hirqmask, data)) +// LOG("WW HIRM: %04x => %04x\n", hirqmask, data); printf("WW HIRM: %04x => %04x\n", hirqmask, data); hirqmask = data; return; @@ -1960,17 +1963,17 @@ void saturn_state::cd_writeWord(uint32_t addr, uint16_t data) case 0x001a: case 0x8018: case 0x801a: -// CDROM_LOG(("WW CR1: %04x\n", data)) +// LOG("WW CR1: %04x\n", data); cr1 = data; cd_stat &= ~CD_STAT_PERI; cmd_pending |= 1; - sh1_timer->adjust(attotime::never); + m_sh1_timer->adjust(attotime::never); break; case 0x001c: case 0x001e: case 0x801c: case 0x801e: -// CDROM_LOG(("WW CR2: %04x\n", data)) +// LOG("WW CR2: %04x\n", data); cr2 = data; cmd_pending |= 2; break; @@ -1978,7 +1981,7 @@ void saturn_state::cd_writeWord(uint32_t addr, uint16_t data) case 0x0022: case 0x8020: case 0x8022: -// CDROM_LOG(("WW CR3: %04x\n", data)) +// LOG("WW CR3: %04x\n", data); cr3 = data; cmd_pending |= 4; break; @@ -1986,18 +1989,18 @@ void saturn_state::cd_writeWord(uint32_t addr, uint16_t data) case 0x0026: case 0x8024: case 0x8026: -// CDROM_LOG(("WW CR4: %04x\n", data)) +// LOG("WW CR4: %04x\n", data); cr4 = data; cmd_pending |= 8; - sh1_timer->adjust(attotime::from_hz(get_timing_command())); + m_sh1_timer->adjust(attotime::from_hz(get_timing_command())); break; default: - CDROM_LOG(("CD: WW %08x %04x\n", addr, data)) + LOG("WW %08x %04x\n", addr, data); break; } } -READ32_MEMBER( saturn_state::stvcd_r ) +READ32_MEMBER( stvcd_device::stvcd_r ) { uint32_t rv = 0; @@ -2054,14 +2057,14 @@ READ32_MEMBER( saturn_state::stvcd_r ) break; default: - printf("Unknown CD read %x\n", offset); + osd_printf_error("Unknown CD read %x\n", offset); break; } return rv; } -WRITE32_MEMBER( saturn_state::stvcd_w ) +WRITE32_MEMBER( stvcd_device::stvcd_w ) { offset <<= 2; @@ -2071,7 +2074,7 @@ WRITE32_MEMBER( saturn_state::stvcd_w ) if (mem_mask == 0xffffffff) cd_writeLong(offset, data); else - printf("CD: Unknown data buffer write @ mask = %08x\n", mem_mask); + osd_printf_error("CD: Unknown data buffer write @ mask = %08x\n", mem_mask); break; case 0x88008: @@ -2102,14 +2105,14 @@ WRITE32_MEMBER( saturn_state::stvcd_w ) break; default: - printf("Unknown CD write %x @ %x\n", data, offset); + osd_printf_error("Unknown CD write %x @ %x\n", data, offset); //xferdnum = 0x8c00; break; } } // iso9660 parsing -void saturn_state::read_new_dir(uint32_t fileno) +void stvcd_device::read_new_dir(uint32_t fileno) { int foundpd, i; uint32_t cfad;//, dirfad; @@ -2190,7 +2193,7 @@ void saturn_state::read_new_dir(uint32_t fileno) } // makes the directory pointed to by FAD current -void saturn_state::make_dir_current(uint32_t fad) +void stvcd_device::make_dir_current(uint32_t fad) { uint32_t i; uint32_t nextent, numentries; @@ -2288,22 +2291,17 @@ void saturn_state::make_dir_current(uint32_t fad) } } -void saturn_state::stvcd_exit( void ) +void stvcd_device::device_stop() { curdir.clear(); if (cdrom) { - cdrom_image_device *cddevice = machine().device("cdrom"); - if (cddevice==nullptr) - { - cdrom_close(cdrom); - } cdrom = (cdrom_file *)nullptr; } } -void saturn_state::cd_readTOC(void) +void stvcd_device::cd_readTOC(void) { int i, ntrks, tocptr, fad; @@ -2395,12 +2393,12 @@ void saturn_state::cd_readTOC(void) tocbuf[tocptr+11] = fad&0xff; } -saturn_state::partitionT *saturn_state::cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok) +stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok) { int match, keepgoing; partitionT *filterprt; - CDROM_LOG(("cd_filterdata, trktype %d\n", trktype)) + LOG("cd_filterdata, trktype %d\n", trktype); match = 1; keepgoing = 2; lastbuf = flt->condtrue; @@ -2551,7 +2549,7 @@ saturn_state::partitionT *saturn_state::cd_filterdata(filterT *flt, int trktype, } // read a single sector off the CD, applying the current filter(s) as necessary -saturn_state::partitionT *saturn_state::cd_read_filtered_sector(int32_t fad, uint8_t *p_ok) +stvcd_device::partitionT *stvcd_device::cd_read_filtered_sector(int32_t fad, uint8_t *p_ok) { int trktype; @@ -2600,7 +2598,7 @@ saturn_state::partitionT *saturn_state::cd_read_filtered_sector(int32_t fad, uin } // loads in data set up by a CD-block PLAY command -void saturn_state::cd_playdata( void ) +void stvcd_device::cd_playdata() { if ((cd_stat & 0x0f00) == CD_STAT_SEEK) { @@ -2645,12 +2643,12 @@ void saturn_state::cd_playdata( void ) if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO) { cd_read_filtered_sector(cd_curfad,&p_ok); - machine().device("cdda")->stop_audio(); //stop any pending CD-DA + m_cdda->stop_audio(); //stop any pending CD-DA } else { p_ok = 1; // TODO - machine().device("cdda")->start_audio(cd_curfad, 1); + m_cdda->start_audio(cd_curfad, 1); } if(p_ok) @@ -2664,14 +2662,14 @@ void saturn_state::cd_playdata( void ) { if(cdda_repeat_count >= cdda_maxrepeat) { - CDROM_LOG(("cd_playdata: playback ended\n")) + LOG("cd_playdata: playback ended\n"); cd_stat = CD_STAT_PAUSE; hirqreg |= PEND; if (playtype == 1) { - CDROM_LOG(("cd_playdata: setting EFLS\n")) + LOG("cd_playdata: setting EFLS\n"); hirqreg |= EFLS; } } @@ -2691,7 +2689,7 @@ void saturn_state::cd_playdata( void ) } // loads a single sector off the CD, anywhere from FAD 150 on up -void saturn_state::cd_readblock(uint32_t fad, uint8_t *dat) +void stvcd_device::cd_readblock(uint32_t fad, uint8_t *dat) { if (cdrom) { @@ -2699,7 +2697,7 @@ void saturn_state::cd_readblock(uint32_t fad, uint8_t *dat) } } -void saturn_state::stvcd_set_tray_open( void ) +void stvcd_device::set_tray_open() { if(!tray_is_closed) return; @@ -2713,32 +2711,20 @@ void saturn_state::stvcd_set_tray_open( void ) popmessage("Tray Open"); } -void saturn_state::stvcd_set_tray_close( void ) +void stvcd_device::set_tray_close() { /* avoid user attempts to load a CD-ROM without opening the tray first (emulation asserts anyway with current framework) */ if(tray_is_closed) return; hirqreg |= DCHG; - cdrom = (cdrom_file *)nullptr; + cdrom = m_cdrom_image->get_cdrom_file(); - cdrom_image_device *cddevice = machine().device("cdrom"); - if (cddevice!=nullptr) - { - // MESS case - cdrom = cddevice->get_cdrom_file(); - } - else - { - // MAME case - cdrom = cdrom_open(machine().rom_load().get_disk_handle(":cdrom")); - } - - machine().device("cdda")->set_cdrom(cdrom); + m_cdda->set_cdrom(cdrom); if (cdrom) { - CDROM_LOG(("Opened CD-ROM successfully, reading root directory\n")) + LOG("Opened CD-ROM successfully, reading root directory\n"); //read_new_dir(0xffffff); // read root directory cd_stat = CD_STAT_PAUSE; } diff --git a/src/devices/machine/stvcd.h b/src/devices/machine/stvcd.h index 165407d736e..a20985fd394 100644 --- a/src/devices/machine/stvcd.h +++ b/src/devices/machine/stvcd.h @@ -1,2 +1,200 @@ // license:LGPL-2.1+ // copyright-holders:Angelo Salese, R. Belmont + +#ifndef MAME_MACHINE_STVCD_H +#define MAME_MACHINE_STVCD_H + +#pragma once + +#include "cdrom.h" +#include "imagedev/chd_cd.h" +#include "machine/timer.h" +#include "sound/cdda.h" + +class stvcd_device : public device_t +{ + static constexpr unsigned MAX_FILTERS = 24; + static constexpr unsigned MAX_BLOCKS = 200; + static constexpr uint32_t MAX_DIR_SIZE = 256*1024; + +public: + stvcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ32_MEMBER( stvcd_r ); + DECLARE_WRITE32_MEMBER( stvcd_w ); + + void set_tray_open(); + void set_tray_close(); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_stop() override; + +private: + TIMER_DEVICE_CALLBACK_MEMBER( stv_sector_cb ); + TIMER_DEVICE_CALLBACK_MEMBER( stv_sh1_sim ); + + struct direntryT + { + uint8_t record_size; + uint8_t xa_record_size; + uint32_t firstfad; // first sector of file + uint32_t length; // length of file + uint8_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t gmt_offset; + uint8_t flags; // iso9660 flags + uint8_t file_unit_size; + uint8_t interleave_gap_size; + uint16_t volume_sequencer_number; + uint8_t name[128]; + }; + + struct filterT + { + uint8_t mode; + uint8_t chan; + uint8_t smmask; + uint8_t cimask; + uint8_t fid; + uint8_t smval; + uint8_t cival; + uint8_t condtrue; + uint8_t condfalse; + uint32_t fad; + uint32_t range; + }; + + struct blockT + { + int32_t size; // size of block + int32_t FAD; // FAD on disc + uint8_t data[CD_MAX_SECTOR_DATA]; + uint8_t chan; // channel + uint8_t fnum; // file number + uint8_t subm; // subchannel mode + uint8_t cinf; // coding information + }; + + struct partitionT + { + int32_t size; + blockT *blocks[MAX_BLOCKS]; + uint8_t bnum[MAX_BLOCKS]; + uint8_t numblks; + }; + + // 16-bit transfer types + enum transT + { + XFERTYPE_INVALID, + XFERTYPE_TOC, + XFERTYPE_FILEINFO_1, + XFERTYPE_FILEINFO_254, + XFERTYPE_SUBQ, + XFERTYPE_SUBRW + }; + + // 32-bit transfer types + enum trans32T + { + XFERTYPE32_INVALID, + XFERTYPE32_GETSECTOR, + XFERTYPE32_GETDELETESECTOR, + XFERTYPE32_PUTSECTOR, + XFERTYPE32_MOVESECTOR + }; + + int get_track_index(uint32_t fad); + int sega_cdrom_get_adr_control(cdrom_file *file, int track); + void cr_standard_return(uint16_t cur_status); + void mpeg_standard_return(uint16_t cur_status); + void cd_free_block(blockT *blktofree); + void cd_defragblocks(partitionT *part); + void cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, uint32_t *sectnum); + + uint16_t cd_readWord(uint32_t addr); + void cd_writeWord(uint32_t addr, uint16_t data); + uint32_t cd_readLong(uint32_t addr); + void cd_writeLong(uint32_t addr, uint32_t data); + + void cd_readTOC(); + void cd_readblock(uint32_t fad, uint8_t *dat); + void cd_playdata(); + + void cd_exec_command( void ); + // iso9660 utilities + void make_dir_current(uint32_t fad); + void read_new_dir(uint32_t fileno); + + blockT *cd_alloc_block(uint8_t *blknum); + partitionT *cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok); + partitionT *cd_read_filtered_sector(int32_t fad, uint8_t *p_ok); + + cdrom_file *cdrom;// = (cdrom_file *)nullptr; + + // local variables + partitionT partitions[MAX_FILTERS]; + partitionT *transpart; + + blockT blocks[MAX_BLOCKS]; + blockT curblock; + + uint8_t tocbuf[102*4]; + uint8_t subqbuf[5*2]; + uint8_t subrwbuf[12*2]; + uint8_t finfbuf[256]; + + int32_t sectlenin, sectlenout; + + uint8_t lastbuf, playtype; + + transT xfertype; + trans32T xfertype32; + uint32_t xfercount, calcsize; + uint32_t xferoffs, xfersect, xfersectpos, xfersectnum, xferdnum; + + filterT filters[MAX_FILTERS]; + filterT *cddevice; + int cddevicenum; + + uint16_t cr1, cr2, cr3, cr4; + uint16_t prev_cr1, prev_cr2, prev_cr3, prev_cr4; + uint8_t status_type; + uint16_t hirqmask, hirqreg; + uint16_t cd_stat; + uint32_t cd_curfad;// = 0; + uint32_t cd_fad_seek; + uint32_t fadstoplay;// = 0; + uint32_t in_buffer;// = 0; // amount of data in the buffer + int oddframe;// = 0; + int buffull, sectorstore, freeblocks; + int cur_track; + uint8_t cmd_pending; + uint8_t cd_speed; + uint8_t cdda_maxrepeat; + uint8_t cdda_repeat_count; + uint8_t tray_is_closed; + int get_timing_command( void ); + + direntryT curroot; // root entry of current filesystem + std::vector curdir; // current directory + int numfiles; // # of entries in current directory + int firstfile; // first non-directory file + + required_device m_cdrom_image; + required_device m_sector_timer; + required_device m_sh1_timer; + required_device m_cdda; +}; + +// device type definition +DECLARE_DEVICE_TYPE(STVCD, stvcd_device) + +#endif // MAME_MACHINE_STVCD_H diff --git a/src/mame/drivers/saturn.cpp b/src/mame/drivers/saturn.cpp index fff30c623be..3e8f1efa3ab 100644 --- a/src/mame/drivers/saturn.cpp +++ b/src/mame/drivers/saturn.cpp @@ -428,12 +428,10 @@ test1f diagnostic hacks: #include "cpu/m68000/m68000.h" #include "cpu/scudsp/scudsp.h" #include "cpu/sh/sh2.h" -#include "imagedev/chd_cd.h" #include "machine/nvram.h" #include "machine/smpc.h" #include "machine/stvcd.h" #include "machine/saturn_cdb.h" -#include "sound/cdda.h" #include "sound/scsp.h" #include "video/stvvdp1.h" #include "video/stvvdp2.h" @@ -443,6 +441,8 @@ test1f diagnostic hacks: #include "bus/saturn/rom.h" #include "bus/saturn/sat_slot.h" +#include "bus/sat_ctrl/ctrl.h" + #include "screen.h" #include "softlist.h" #include "speaker.h" @@ -456,6 +456,7 @@ public: : saturn_state(mconfig, type, tag) , m_exp(*this, "exp") , m_nvram(*this, "nvram") + , m_stvcd(*this, "stvcd") , m_ctrl1(*this, "ctrl1") , m_ctrl2(*this, "ctrl2") { } @@ -489,6 +490,7 @@ public: required_device m_exp; required_device m_nvram; + required_device m_stvcd; required_device m_ctrl1; required_device m_ctrl2; @@ -529,7 +531,7 @@ ADDRESS_MAP_START(sat_console_state::saturn_mem) // AM_RANGE(0x04000000, 0x047fffff) AM_RAM // External Battery RAM area AM_RANGE(0x04fffffc, 0x04ffffff) AM_READ8(saturn_cart_type_r,0x000000ff) AM_RANGE(0x05000000, 0x057fffff) AM_READ(abus_dummy_r) - AM_RANGE(0x05800000, 0x0589ffff) AM_READWRITE(stvcd_r, stvcd_w) + AM_RANGE(0x05800000, 0x0589ffff) AM_DEVREADWRITE("stvcd", stvcd_device, stvcd_r, stvcd_w) /* Sound */ AM_RANGE(0x05a00000, 0x05a7ffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff) AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16("scsp", scsp_device, read, write, 0xffffffff) @@ -556,13 +558,13 @@ ADDRESS_MAP_END INPUT_CHANGED_MEMBER(sat_console_state::tray_open) { if(newval) - stvcd_set_tray_open(); + m_stvcd->set_tray_open(); } INPUT_CHANGED_MEMBER(sat_console_state::tray_close) { if(newval) - stvcd_set_tray_close(); + m_stvcd->set_tray_close(); } static INPUT_PORTS_START( saturn ) @@ -655,8 +657,6 @@ MACHINE_START_MEMBER(sat_console_state, saturn) save_item(NAME(m_scsp_last_line)); save_item(NAME(m_vdp2.odd)); - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&sat_console_state::stvcd_exit, this)); - // TODO: trampoline m_audiocpu->set_reset_callback(write_line_delegate(FUNC(saturn_state::m68k_reset_callback),this)); } @@ -687,8 +687,6 @@ MACHINE_RESET_MEMBER(sat_console_state,saturn) m_maincpu->set_unscaled_clock(MASTER_CLOCK_320/2); m_slave->set_unscaled_clock(MASTER_CLOCK_320/2); - stvcd_reset(); - m_vdp2.old_crmd = -1; m_vdp2.old_tvmd = -1; } @@ -826,9 +824,6 @@ MACHINE_CONFIG_START(sat_console_state::saturn) MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", sat_console_state, nvram_init) - MCFG_TIMER_DRIVER_ADD("sector_timer", sat_console_state, stv_sector_cb) - MCFG_TIMER_DRIVER_ADD("sh1_cmd", sat_console_state, stv_sh1_sim) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_320/8, 427, 0, 320, 263, 0, 224) @@ -847,9 +842,9 @@ MACHINE_CONFIG_START(sat_console_state::saturn) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) - MCFG_SOUND_ADD("cdda", CDDA, 0) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + MCFG_DEVICE_ADD("stvcd", STVCD, 0) + //MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + //MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_SATURN_CONTROL_PORT_ADD("ctrl1", saturn_controls, "joypad") MCFG_SATURN_CONTROL_PORT_ADD("ctrl2", saturn_controls, "joypad") @@ -868,8 +863,6 @@ SLOT_INTERFACE_END MACHINE_CONFIG_START(sat_console_state::saturnus) saturn(config); - MCFG_CDROM_ADD( "cdrom" ) - MCFG_CDROM_INTERFACE("sat_cdrom") MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000) MCFG_SOFTWARE_LIST_ADD("cd_list","saturn") @@ -885,8 +878,6 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(sat_console_state::saturneu) saturn(config); - MCFG_CDROM_ADD( "cdrom" ) - MCFG_CDROM_INTERFACE("sat_cdrom") MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000) MCFG_SOFTWARE_LIST_ADD("cd_list","saturn") @@ -901,8 +892,6 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(sat_console_state::saturnjp) saturn(config); - MCFG_CDROM_ADD( "cdrom" ) - MCFG_CDROM_INTERFACE("sat_cdrom") MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000) MCFG_SOFTWARE_LIST_ADD("cd_list","saturn") @@ -918,7 +907,6 @@ MACHINE_CONFIG_END void sat_console_state::saturn_init_driver(int rgn) { -// m_saturn_region = rgn; m_vdp2.pal = (rgn == 12) ? 1 : 0; // set compatible options diff --git a/src/mame/drivers/stv.cpp b/src/mame/drivers/stv.cpp index f2b83b22803..1d83e598a44 100644 --- a/src/mame/drivers/stv.cpp +++ b/src/mame/drivers/stv.cpp @@ -42,8 +42,8 @@ #include "cpu/scudsp/scudsp.h" #include "cpu/sh/sh2.h" #include "imagedev/chd_cd.h" -#include "machine/eepromser.h" #include "machine/smpc.h" +#include "machine/stvcd.h" #include "machine/stvprot.h" #include "sound/cdda.h" #include "sound/scsp.h" @@ -984,7 +984,6 @@ ADDRESS_MAP_START(stv_state::stv_mem) AM_RANGE(0x01000000, 0x017fffff) AM_WRITE(minit_w) AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE(sinit_w) AM_RANGE(0x02000000, 0x04ffffff) AM_ROM AM_MIRROR(0x20000000) AM_REGION("abus", 0) // cartridge - AM_RANGE(0x05800000, 0x0589ffff) AM_READWRITE(stvcd_r, stvcd_w) /* Sound */ AM_RANGE(0x05a00000, 0x05afffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff) AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16("scsp", scsp_device, read, write, 0xffffffff) @@ -1001,6 +1000,11 @@ ADDRESS_MAP_START(stv_state::stv_mem) AM_RANGE(0xc0000000, 0xc00007ff) AM_RAM // cache RAM ADDRESS_MAP_END +ADDRESS_MAP_START(stv_state::stvcd_mem) + AM_IMPORT_FROM(stv_mem) + AM_RANGE(0x05800000, 0x0589ffff) AM_DEVREADWRITE("stvcd", stvcd_device, stvcd_r, stvcd_w) +ADDRESS_MAP_END + ADDRESS_MAP_START(stv_state::sound_mem) AM_RANGE(0x000000, 0x0fffff) AM_RAM AM_SHARE("sound_ram") AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE("scsp", scsp_device, read, write) @@ -1097,9 +1101,6 @@ MACHINE_CONFIG_START(stv_state::stv) MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") /* Actually AK93C45F */ - MCFG_TIMER_DRIVER_ADD("sector_timer", stv_state, stv_sector_cb) - MCFG_TIMER_DRIVER_ADD("sh1_cmd", stv_state, stv_sh1_sim) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) @@ -1118,11 +1119,6 @@ MACHINE_CONFIG_START(stv_state::stv) MCFG_SCSP_MAIN_IRQ_CB(DEVWRITELINE("scu", sega_scu_device, sound_req_w)) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) - - MCFG_SOUND_ADD("cdda", CDDA, 0) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) - MACHINE_CONFIG_END MACHINE_CONFIG_START(stv_state::stv_5881) @@ -1131,6 +1127,17 @@ MACHINE_CONFIG_START(stv_state::stv_5881) MCFG_SET_READ_CALLBACK(stv_state, crypt_read_callback) MACHINE_CONFIG_END +MACHINE_CONFIG_START(stv_state::stvcd) + stv(config); + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(stvcd_mem) + MCFG_DEVICE_MODIFY("slave") + MCFG_CPU_PROGRAM_MAP(stvcd_mem) + MCFG_DEVICE_ADD("stvcd", STVCD, 0) + //MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + //MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +MACHINE_CONFIG_END + uint16_t stv_state::crypt_read_callback_ch1(uint32_t addr) { @@ -1229,8 +1236,6 @@ MACHINE_RESET_MEMBER(stv_state,stv) m_maincpu->set_unscaled_clock(MASTER_CLOCK_320/2); m_slave->set_unscaled_clock(MASTER_CLOCK_320/2); - stvcd_reset(); - m_prev_gamebank_select = 0xff; m_vdp2.old_crmd = -1; @@ -1285,8 +1290,6 @@ MACHINE_START_MEMBER(stv_state,stv) stv_register_protection_savestates(); // machine/stvprot.c - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&stv_state::stvcd_exit, this)); - m_audiocpu->set_reset_callback(write_line_delegate(FUNC(stv_state::m68k_reset_callback),this)); } @@ -2889,7 +2892,7 @@ ROM_START( sfish2 ) ROM_LOAD16_WORD_SWAP( "mpr-18274.ic3", 0x0800000, 0x0400000, CRC(a6d76d23) SHA1(eee8c824eff4485d1b3af93a4fd5b21262eec803) ) // good ROM_LOAD16_WORD_SWAP( "mpr-18275.ic4", 0x0c00000, 0x0200000, CRC(7691deca) SHA1(aabb6b098963caf51f66aefa0a97aed7eb86c308) ) // good - DISK_REGION( "cdrom" ) + DISK_REGION( "stvcd" ) DISK_IMAGE_READONLY( "cdp-00428", 0, SHA1(166cb5518fa5e0ab15d40dade70fa8913089dcd2) ) ROM_REGION32_BE( 0x3000000, "abus", ROMREGION_ERASE00 ) /* SH2 code */ @@ -2909,7 +2912,7 @@ ROM_START( sfish2j ) ROM_LOAD16_WORD_SWAP( "mpr-18273.ic2", 0x0400000, 0x0400000, CRC(6fec0193) SHA1(5bbda289a5ca58c5bf57307360b07f0bb98f7356) ) // good ROM_LOAD16_WORD_SWAP( "mpr-18274.ic3", 0x0800000, 0x0400000, CRC(a6d76d23) SHA1(eee8c824eff4485d1b3af93a4fd5b21262eec803) ) // good - DISK_REGION( "cdrom" ) + DISK_REGION( "stvcd" ) DISK_IMAGE_READONLY( "cdp-00386b", 0, SHA1(2cb357a930bb7fa668949717ec6daaad2669d137) ) ROM_REGION32_BE( 0x3000000, "abus", ROMREGION_ERASE00 ) /* SH2 code */ @@ -3719,8 +3722,8 @@ GAME( 1998, choroqhr, stvbios, stv, stv, stv_state, stv, ROT GAME( 2000, sackids, stvbios, stv, stv, stv_state, stv, ROT0, "Sega", "Soreyuke Anpanman Crayon Kids (J 001026 V1.000)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) /* CD games */ -GAME( 1995, sfish2, 0, stv, stv, stv_state, stv, ROT0, "Sega", "Sport Fishing 2 (UET 951106 V1.10e)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN ) -GAME( 1995, sfish2j, sfish2, stv, stv, stv_state, stv, ROT0, "Sega", "Sport Fishing 2 (J 951201 V1.100)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN ) +GAME( 1995, sfish2, 0, stvcd, stv, stv_state, stv, ROT0, "Sega", "Sport Fishing 2 (UET 951106 V1.10e)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN ) +GAME( 1995, sfish2j, sfish2, stvcd, stv, stv_state, stv, ROT0, "Sega", "Sport Fishing 2 (J 951201 V1.100)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN ) /* This is the known list of undumped ST-V games: diff --git a/src/mame/includes/saturn.h b/src/mame/includes/saturn.h index 5812c4599b9..50b8cc58686 100644 --- a/src/mame/includes/saturn.h +++ b/src/mame/includes/saturn.h @@ -1,16 +1,12 @@ // license:LGPL-2.1+ // copyright-holders:David Haywood, Angelo Salese, Olivier Galibert, Mariusz Wojcieszek, R. Belmont -#include "cdrom.h" #include "machine/timer.h" #include "cpu/m68000/m68000.h" -#include "cpu/adsp2100/adsp2100.h" #include "machine/sega_scu.h" #include "machine/smpc.h" #include "cpu/sh/sh2.h" -#include "bus/sat_ctrl/ctrl.h" - #include "bus/generic/slot.h" #include "bus/generic/carts.h" @@ -21,10 +17,6 @@ #include "debug/debugcmd.h" #include "debugger.h" -#define MAX_FILTERS (24) -#define MAX_BLOCKS (200) -#define MAX_DIR_SIZE (256*1024) - class saturn_state : public driver_device { public: @@ -104,11 +96,6 @@ public: int old_tvmd; }m_vdp2; - /* Saturn specific*/ - int m_saturn_region; - uint8_t m_cart_type; - uint32_t *m_cart_dram; - required_device m_maincpu; required_device m_slave; required_device m_audiocpu; @@ -422,173 +409,6 @@ public: } stv_rbg_cache_data; - /* stvcd */ - DECLARE_READ32_MEMBER( stvcd_r ); - DECLARE_WRITE32_MEMBER( stvcd_w ); - - TIMER_DEVICE_CALLBACK_MEMBER( stv_sector_cb ); - TIMER_DEVICE_CALLBACK_MEMBER( stv_sh1_sim ); - - struct direntryT - { - uint8_t record_size; - uint8_t xa_record_size; - uint32_t firstfad; // first sector of file - uint32_t length; // length of file - uint8_t year; - uint8_t month; - uint8_t day; - uint8_t hour; - uint8_t minute; - uint8_t second; - uint8_t gmt_offset; - uint8_t flags; // iso9660 flags - uint8_t file_unit_size; - uint8_t interleave_gap_size; - uint16_t volume_sequencer_number; - uint8_t name[128]; - }; - - struct filterT - { - uint8_t mode; - uint8_t chan; - uint8_t smmask; - uint8_t cimask; - uint8_t fid; - uint8_t smval; - uint8_t cival; - uint8_t condtrue; - uint8_t condfalse; - uint32_t fad; - uint32_t range; - }; - - struct blockT - { - int32_t size; // size of block - int32_t FAD; // FAD on disc - uint8_t data[CD_MAX_SECTOR_DATA]; - uint8_t chan; // channel - uint8_t fnum; // file number - uint8_t subm; // subchannel mode - uint8_t cinf; // coding information - }; - - struct partitionT - { - int32_t size; - blockT *blocks[MAX_BLOCKS]; - uint8_t bnum[MAX_BLOCKS]; - uint8_t numblks; - }; - - // 16-bit transfer types - enum transT - { - XFERTYPE_INVALID, - XFERTYPE_TOC, - XFERTYPE_FILEINFO_1, - XFERTYPE_FILEINFO_254, - XFERTYPE_SUBQ, - XFERTYPE_SUBRW - }; - - // 32-bit transfer types - enum trans32T - { - XFERTYPE32_INVALID, - XFERTYPE32_GETSECTOR, - XFERTYPE32_GETDELETESECTOR, - XFERTYPE32_PUTSECTOR, - XFERTYPE32_MOVESECTOR - }; - - - void stvcd_reset(void); - void stvcd_exit(void); - void stvcd_set_tray_open(void); - void stvcd_set_tray_close(void); - - int get_track_index(uint32_t fad); - int sega_cdrom_get_adr_control(cdrom_file *file, int track); - void cr_standard_return(uint16_t cur_status); - void mpeg_standard_return(uint16_t cur_status); - void cd_free_block(blockT *blktofree); - void cd_defragblocks(partitionT *part); - void cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, uint32_t *sectnum); - - uint16_t cd_readWord(uint32_t addr); - void cd_writeWord(uint32_t addr, uint16_t data); - uint32_t cd_readLong(uint32_t addr); - void cd_writeLong(uint32_t addr, uint32_t data); - - void cd_readTOC(void); - void cd_readblock(uint32_t fad, uint8_t *dat); - void cd_playdata(void); - - void cd_exec_command( void ); - // iso9660 utilities - void make_dir_current(uint32_t fad); - void read_new_dir(uint32_t fileno); - - blockT *cd_alloc_block(uint8_t *blknum); - partitionT *cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok); - partitionT *cd_read_filtered_sector(int32_t fad, uint8_t *p_ok); - - cdrom_file *cdrom;// = (cdrom_file *)nullptr; - - // local variables - timer_device *sector_timer; - timer_device *sh1_timer; - partitionT partitions[MAX_FILTERS]; - partitionT *transpart; - - blockT blocks[MAX_BLOCKS]; - blockT curblock; - - uint8_t tocbuf[102*4]; - uint8_t subqbuf[5*2]; - uint8_t subrwbuf[12*2]; - uint8_t finfbuf[256]; - - int32_t sectlenin, sectlenout; - - uint8_t lastbuf, playtype; - - transT xfertype; - trans32T xfertype32; - uint32_t xfercount, calcsize; - uint32_t xferoffs, xfersect, xfersectpos, xfersectnum, xferdnum; - - filterT filters[MAX_FILTERS]; - filterT *cddevice; - int cddevicenum; - - uint16_t cr1, cr2, cr3, cr4; - uint16_t prev_cr1, prev_cr2, prev_cr3, prev_cr4; - uint8_t status_type; - uint16_t hirqmask, hirqreg; - uint16_t cd_stat; - uint32_t cd_curfad;// = 0; - uint32_t cd_fad_seek; - uint32_t fadstoplay;// = 0; - uint32_t in_buffer;// = 0; // amount of data in the buffer - int oddframe;// = 0; - int buffull, sectorstore, freeblocks; - int cur_track; - uint8_t cmd_pending; - uint8_t cd_speed; - uint8_t cdda_maxrepeat; - uint8_t cdda_repeat_count; - uint8_t tray_is_closed; - int get_timing_command( void ); - - direntryT curroot; // root entry of current filesystem - std::vector curdir; // current directory - int numfiles; // # of entries in current directory - int firstfile; // first non-directory file - DECLARE_WRITE_LINE_MEMBER(m68k_reset_callback); // DECLARE_WRITE_LINE_MEMBER(scudsp_end_w); diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index fb771dd6270..2fd0ad3030e 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -147,8 +147,10 @@ public: void batmanfr(machine_config &config); void stv_5838(machine_config &config); void stv_5881(machine_config &config); + void stvcd(machine_config &config); void sound_mem(address_map &map); void stv_mem(address_map &map); + void stvcd_mem(address_map &map); }; class stvpc_state : public stv_state