summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/stvcd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/stvcd.cpp')
-rw-r--r--src/devices/machine/stvcd.cpp326
1 files changed, 156 insertions, 170 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_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_device>("cdda")->pause_audio(0);
- //machine().device<cdda_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_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_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_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_image_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_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<timer_device>("sector_timer");
- sector_timer->adjust(attotime::from_hz(150)); // 150 sectors / second = 300kBytes/second
- sh1_timer = machine().device<timer_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_image_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_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_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_image_device *cddevice = machine().device<cdrom_image_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"));
- }
+ cdrom = m_cdrom_image->get_cdrom_file();
- machine().device<cdda_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;
}