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.cpp374
1 files changed, 188 insertions, 186 deletions
diff --git a/src/devices/machine/stvcd.cpp b/src/devices/machine/stvcd.cpp
index 9e62335f448..0cb67d62cc8 100644
--- a/src/devices/machine/stvcd.cpp
+++ b/src/devices/machine/stvcd.cpp
@@ -41,14 +41,28 @@ DASM notes:
***************************************************************************/
#include "emu.h"
-#include "machine/stvcd.h"
+#include "stvcd.h"
#include "coreutil.h"
+#include "multibyte.h"
+
+#define LOG_WARN (1U << 1)
+#define LOG_CMD (1U << 2)
+#define LOG_SEEK (1U << 3)
+#define LOG_XFER (1U << 4)
+
+#define VERBOSE (LOG_CMD | LOG_WARN)
+//#define LOG_OUTPUT_FUNC osd_printf_info
-// super-verbose
-//#define VERBOSE 1
#include "logmacro.h"
+#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
+#define LOGCMD(...) LOGMASKED(LOG_CMD, __VA_ARGS__)
+#define LOGSEEK(...) LOGMASKED(LOG_SEEK, __VA_ARGS__)
+#define LOGXFER(...) LOGMASKED(LOG_XFER, __VA_ARGS__)
+
+#define LIVE_CD_VIEW 0
+
// HIRQ definitions
#define CMOK 0x0001 // command dispatch possible
#define DRDY 0x0002 // data transfer preparations complete
@@ -108,6 +122,7 @@ void stvcd_device::device_add_mconfig(machine_config &config)
CDDA(config, m_cdda);
m_cdda->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
m_cdda->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
+ m_cdda->set_cdrom_tag("cdrom");
}
void stvcd_device::device_start()
@@ -159,7 +174,7 @@ u32 stvcd_device::datatrns_r(offs_t offset, uint32_t mem_mask)
}
else
{
- printf("CD: Unknown data buffer read with mask = %08x\n", mem_mask);
+ LOGWARN("CD: Unknown data buffer read with mask = %08x\n", mem_mask);
rv = 0;
}
return rv;
@@ -170,7 +185,7 @@ void stvcd_device::datatrns_w(offs_t offset, uint32_t data, uint32_t mem_mask)
if (mem_mask == 0xffffffff)
dataxfer_long_w(data);
else
- printf("CD: Unknown data buffer write with mask = %08x\n", mem_mask);
+ LOGWARN("CD: Unknown data buffer write with mask = %08x\n", mem_mask);
}
inline u32 stvcd_device::dataxfer_long_r()
@@ -185,10 +200,7 @@ inline u32 stvcd_device::dataxfer_long_r()
if (xfersect < xfersectnum)
{
// get next longword
- rv = (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0]<<24) |
- (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1]<<16) |
- (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 2]<<8) |
- (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 3]<<0);
+ rv = get_u32be(&transpart->blocks[xfersectpos+xfersect]->data[xferoffs]);
xferdnum += 4;
xferoffs += 4;
@@ -232,7 +244,7 @@ inline u32 stvcd_device::dataxfer_long_r()
break;
default:
- osd_printf_error("CD: unhandled 32-bit transfer type %d\n", (int)xfertype32);
+ LOGWARN("CD: unhandled 32-bit transfer type %d\n", (int)xfertype32);
break;
}
@@ -248,10 +260,7 @@ inline void stvcd_device::dataxfer_long_w(u32 data)
if (xfersect < xfersectnum)
{
// get next longword
- transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0] = (data >> 24) & 0xff;
- transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1] = (data >> 16) & 0xff;
- transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 2] = (data >> 8) & 0xff;
- transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 3] = (data >> 0) & 0xff;
+ put_u32be(&transpart->blocks[xfersectpos+xfersect]->data[xferoffs], data);
xferdnum += 4;
xferoffs += 4;
@@ -273,7 +282,7 @@ inline void stvcd_device::dataxfer_long_w(u32 data)
break;
default:
- printf("CD: unhandled 32-bit transfer type write %d\n", (int)xfertype32);
+ LOGWARN("CD: unhandled 32-bit transfer type write %d\n", (int)xfertype32);
break;
}
}
@@ -286,7 +295,7 @@ inline u16 stvcd_device::dataxfer_word_r()
switch (xfertype)
{
case XFERTYPE_TOC:
- rv = tocbuf[xfercount]<<8 | tocbuf[xfercount+1];
+ rv = get_u16be(&tocbuf[xfercount]);
xfercount += 2;
xferdnum += 2;
@@ -299,7 +308,7 @@ inline u16 stvcd_device::dataxfer_word_r()
break;
case XFERTYPE_FILEINFO_1:
- rv = finfbuf[xfercount]<<8 | finfbuf[xfercount+1];
+ rv = get_u16be(&finfbuf[xfercount]);
xfercount += 2;
xferdnum += 2;
@@ -316,22 +325,16 @@ inline u16 stvcd_device::dataxfer_word_r()
uint32_t temp = 2 + (xfercount / (0x6 * 2));
// first 4 bytes = FAD
- finfbuf[0] = (curdir[temp].firstfad>>24)&0xff;
- finfbuf[1] = (curdir[temp].firstfad>>16)&0xff;
- finfbuf[2] = (curdir[temp].firstfad>>8)&0xff;
- finfbuf[3] = (curdir[temp].firstfad&0xff);
+ put_u32be(&finfbuf[0], curdir[temp].firstfad);
// second 4 bytes = length of file
- finfbuf[4] = (curdir[temp].length>>24)&0xff;
- finfbuf[5] = (curdir[temp].length>>16)&0xff;
- finfbuf[6] = (curdir[temp].length>>8)&0xff;
- finfbuf[7] = (curdir[temp].length&0xff);
+ put_u32be(&finfbuf[4], curdir[temp].length);
finfbuf[8] = curdir[temp].interleave_gap_size;
finfbuf[9] = curdir[temp].file_unit_size;
finfbuf[10] = temp;
finfbuf[11] = curdir[temp].flags;
}
- rv = finfbuf[xfercount % (6 * 2)]<<8 | finfbuf[(xfercount % (6 * 2)) +1];
+ rv = get_u16be(&finfbuf[xfercount % (6 * 2)]);
xfercount += 2;
xferdnum += 2;
@@ -344,7 +347,7 @@ inline u16 stvcd_device::dataxfer_word_r()
break;
case XFERTYPE_SUBQ:
- rv = subqbuf[xfercount]<<8 | subqbuf[xfercount+1];
+ rv = get_u16be(&subqbuf[xfercount]);
xfercount += 2;
xferdnum += 2;
@@ -358,7 +361,7 @@ inline u16 stvcd_device::dataxfer_word_r()
case XFERTYPE_SUBRW:
- rv = subrwbuf[xfercount]<<8 | subrwbuf[xfercount+1];
+ rv = get_u16be(&subrwbuf[xfercount]);
xfercount += 2;
xferdnum += 2;
@@ -371,7 +374,7 @@ inline u16 stvcd_device::dataxfer_word_r()
break;
default:
- osd_printf_error("STVCD: Unhandled xfer type %d\n", (int)xfertype);
+ LOGWARN("STVCD: Unhandled xfer type %d\n", (int)xfertype);
rv = 0;
break;
}
@@ -403,13 +406,13 @@ void stvcd_device::hirq_w(uint16_t data) { hirqreg &= data; }
// TODO: these two are actually never read or written to by host?
uint16_t stvcd_device::hirqmask_r()
{
- printf("RW HIRM: %04x\n", hirqmask);
+ LOGWARN("RW HIRM: %04x\n", hirqmask);
return hirqmask;
}
void stvcd_device::hirqmask_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- printf("WW HIRM: %04x => %04x\n", hirqmask, data);
+ LOGWARN("WW HIRM: %04x => %04x\n", hirqmask, data);
COMBINE_DATA(&hirqmask);
}
@@ -478,12 +481,12 @@ int stvcd_device::get_track_index(uint32_t fad)
uint32_t rel_fad;
uint8_t track;
- if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, fad)) != CD_TRACK_AUDIO)
+ if(m_cdrom_image->get_track_type(m_cdrom_image->get_track(fad)) != cdrom_file::CD_TRACK_AUDIO)
return 1;
- track = cdrom_get_track( cdrom, fad );
+ track = m_cdrom_image->get_track( fad );
- rel_fad = fad - cdrom_get_track_start( cdrom, track );
+ rel_fad = fad - m_cdrom_image->get_track_start( track );
if(rel_fad < 150)
return 0;
@@ -491,27 +494,34 @@ int stvcd_device::get_track_index(uint32_t fad)
return 1;
}
-int stvcd_device::sega_cdrom_get_adr_control(cdrom_file *file, int track)
+int stvcd_device::sega_cdrom_get_adr_control(int track)
{
- return bitswap<8>(cdrom_get_adr_control(file, cur_track),3,2,1,0,7,6,5,4);
+ return bitswap<8>(m_cdrom_image->get_adr_control(cur_track),3,2,1,0,7,6,5,4);
}
void stvcd_device::cr_standard_return(uint16_t cur_status)
{
- if ((cd_stat & 0x0f00) == CD_STAT_SEEK)
+ if (!m_cdrom_image->exists())
+ {
+ cr1 = cur_status;
+ cr2 = 0;
+ cr3 = 0;
+ cr4 = 0;
+ }
+ else if ((cd_stat & 0x0f00) == CD_STAT_SEEK)
{
/* During seek state, values returned are from the target position */
- uint8_t seek_track = cdrom_get_track(cdrom, cd_fad_seek-150);
+ uint8_t seek_track = m_cdrom_image->get_track(cd_fad_seek-150);
cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf);
- cr2 = (seek_track == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(cdrom, seek_track)<<8) | seek_track);
+ cr2 = (seek_track == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(seek_track)<<8) | seek_track);
cr3 = (get_track_index(cd_fad_seek)<<8) | (cd_fad_seek>>16); //index & 0xff00
cr4 = cd_fad_seek;
}
else
{
cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf
- cr2 = (cur_track == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(cdrom, cur_track)<<8) | (cdrom_get_track(cdrom, cd_curfad-150)+1));
+ cr2 = (cur_track == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(cur_track)<<8) | (m_cdrom_image->get_track(cd_curfad-150)+1));
cr3 = (get_track_index(cd_curfad)<<8) | (cd_curfad>>16); //index & 0xff00
cr4 = cd_curfad;
}
@@ -531,7 +541,7 @@ void stvcd_device::mpeg_standard_return(uint16_t cur_status)
void stvcd_device::cmd_get_status()
{
- //LOG("%s: Get Status\n", machine().describe_context();
+ //LOGCMD("%s: Get Status\n", machine().describe_context();
hirqreg |= CMOK;
if(status_type == 0)
cr_standard_return(cd_stat);
@@ -548,7 +558,7 @@ void stvcd_device::cmd_get_status()
void stvcd_device::cmd_get_hw_info()
{
- LOG("%s: Get Hardware Info\n", machine().describe_context());
+ LOGCMD("%s: Get Hardware Info\n", machine().describe_context());
hirqreg |= CMOK;
cr1 = cd_stat;
cr2 = 0x0201;
@@ -559,7 +569,7 @@ void stvcd_device::cmd_get_hw_info()
void stvcd_device::cmd_get_toc()
{
- LOG("%s: Get TOC\n", machine().describe_context());
+ LOGCMD("%s: Get TOC\n", machine().describe_context());
cd_readTOC();
cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE;
cr1 = cd_stat;
@@ -577,7 +587,8 @@ void stvcd_device::cmd_get_session_info()
// bios is interested in returns in cr3 and cr4
// cr3 should be data track #
// cr4 must be > 1 and < 100 or bios gets angry.
- LOG("%s: Get Session Info\n", machine().describe_context());
+ LOGCMD("%s: Get Session Info\n", machine().describe_context());
+ // TODO: shouldn't really read from TOC
cd_readTOC();
switch (cr1 & 0xff)
{
@@ -586,7 +597,7 @@ void stvcd_device::cmd_get_session_info()
cr1 = cd_stat;
cr2 = 0;
cr3 = 0x0100 | tocbuf[(101*4)+1];
- cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3];
+ cr4 = get_u16be(&tocbuf[(101*4)+2]);
break;
case 1: // get total session info / disc start
@@ -598,7 +609,7 @@ void stvcd_device::cmd_get_session_info()
break;
default:
- osd_printf_error("CD: Unknown request to Get Session Info %x\n", cr1 & 0xff);
+ LOGWARN("CD: Unknown request to Get Session Info %x\n", cr1 & 0xff);
cr1 = cd_stat;
cr2 = 0;
cr3 = 0;
@@ -620,7 +631,7 @@ void stvcd_device::cmd_init_cdsystem()
// CR1 & 8 = retry reading mode 2 sectors
// CR1 & 10 = force single-speed
// CR1 & 80 = no change flag (done by Assault Suit Leynos 2)
- LOG("%s: Initialize CD system\n", machine().describe_context());
+ LOGCMD("%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))
@@ -667,7 +678,7 @@ void stvcd_device::cmd_end_data_transfer()
// 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)
- LOG("%s: End data transfer (%d bytes xfer'd)\n", machine().describe_context(), xferdnum);
+ LOGXFER("%s: End data transfer (%d bytes xfer'd)\n", machine().describe_context(), xferdnum);
// clear the "transfer" flag
cd_stat &= ~CD_STAT_TRANS;
@@ -681,7 +692,7 @@ void stvcd_device::cmd_end_data_transfer()
}
else
{
- logerror("No xferdnum error\n");
+ LOGWARN("No xferdnum error\n");
cr1 = (cd_stat) | (0xff); // is this right?
cr2 = 0xffff;
cr3 = 0;
@@ -735,17 +746,17 @@ void stvcd_device::cmd_end_data_transfer()
xferdnum = 0;
hirqreg |= CMOK;
- LOG(" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4);
+ LOGXFER("\t%04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4);
status_type = 1;
}
void stvcd_device::cmd_play_disc()
{
- // Play Disc. FAD is in lowest 7 bits of cr1 and all of cr2.
+ // Play Disc. FAD is in lowest 7 bits of cr1 and all of cr2.
uint32_t start_pos, end_pos;
uint8_t play_mode;
- LOG("%s: Play Disc\n", machine().describe_context());
+ LOGCMD("%s: Play Disc\n", machine().describe_context());
cd_stat = CD_STAT_PLAY;
play_mode = (cr3 >> 8) & 0x7f;
@@ -760,8 +771,8 @@ void stvcd_device::cmd_play_disc()
if (start_pos != 0xffffff)
cd_curfad = start_pos & 0xfffff;
- logerror("fad mode\n");
- cur_track = cdrom_get_track(cdrom, cd_curfad-150);
+ LOGCMD("\tFAD mode\n");
+ cur_track = m_cdrom_image->get_track(cd_curfad-150);
}
else
{
@@ -769,7 +780,7 @@ void stvcd_device::cmd_play_disc()
if(((start_pos)>>8) != 0)
{
cur_track = (start_pos)>>8;
- cd_fad_seek = cdrom_get_track_start(cdrom, cur_track-1);
+ cd_fad_seek = m_cdrom_image->get_track_start(cur_track-1);
cd_stat = CD_STAT_SEEK;
m_cdda->pause_audio(0);
}
@@ -782,7 +793,7 @@ void stvcd_device::cmd_play_disc()
return;
}
- printf("track mode %d\n",cur_track);
+ LOGCMD("\ttrack mode %d\n",cur_track);
}
if (end_pos & 0x800000)
@@ -795,7 +806,7 @@ void stvcd_device::cmd_play_disc()
uint8_t end_track;
end_track = (end_pos)>>8;
- fadstoplay = cdrom_get_track_start(cdrom, end_track) - cd_fad_seek;
+ fadstoplay = m_cdrom_image->get_track_start(end_track) - cd_fad_seek;
}
}
else // play until the end of the disc
@@ -811,11 +822,11 @@ void stvcd_device::cmd_play_disc()
else
{
if(end_pos == 0)
- fadstoplay = (cdrom_get_track_start(cdrom, 0xaa)) - cd_curfad;
+ fadstoplay = (m_cdrom_image->get_track_start(0xaa)) - cd_curfad;
else
- fadstoplay = (cdrom_get_track_start(cdrom, (end_pos & 0xff00) >> 8)) - cd_curfad;
+ fadstoplay = (m_cdrom_image->get_track_start((end_pos & 0xff00) >> 8)) - cd_curfad;
}
- logerror("track mode %08x %08x\n",cd_curfad,fadstoplay);
+ LOGCMD("\ttrack mode %08x %08x\n", cd_curfad, fadstoplay);
}
else
{
@@ -828,14 +839,14 @@ void stvcd_device::cmd_play_disc()
// be countless possible combinations ...
if(fadstoplay == 0)
{
- cd_curfad = cdrom_get_track_start(cdrom, cur_track-1);
- fadstoplay = cdrom_get_track_start(cdrom, cur_track) - cd_curfad;
+ cd_curfad = m_cdrom_image->get_track_start(cur_track-1);
+ fadstoplay = m_cdrom_image->get_track_start(cur_track) - cd_curfad;
}
- logerror("track resume %08x %08x\n",cd_curfad,fadstoplay);
+ LOGCMD("\ttrack resume %08x %08x\n",cd_curfad,fadstoplay);
}
}
- LOG("Play Disc: start %x length %x\n", cd_curfad, fadstoplay);
+ LOGCMD("\tPlay Disc: start %x length %x\n", cd_curfad, fadstoplay);
cr_standard_return(cd_stat);
hirqreg |= (CMOK);
@@ -845,7 +856,7 @@ void stvcd_device::cmd_play_disc()
playtype = 0;
// cdda
- if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) == CD_TRACK_AUDIO)
+ if(m_cdrom_image->get_track_type(m_cdrom_image->get_track(cd_curfad)) == cdrom_file::CD_TRACK_AUDIO)
{
m_cdda->pause_audio(0);
//m_cdda->start_audio(cd_curfad, fadstoplay);
@@ -865,8 +876,8 @@ void stvcd_device::cmd_seek_disc()
{
uint32_t temp;
- LOG("%s: Disc seek\n", machine().describe_context());
- //printf("%08x %08x %08x %08x\n",cr1,cr2,cr3,cr4);
+ LOGCMD("%s: Disc seek\n", machine().describe_context());
+ LOGCMD("\t%08x %08x %08x %08x\n",cr1,cr2,cr3,cr4);
if (cr1 & 0x80)
{
temp = (cr1&0xff)<<16; // get FAD to seek to
@@ -882,7 +893,7 @@ void stvcd_device::cmd_seek_disc()
else
{
cd_curfad = ((cr1&0x7f)<<16) | cr2;
- printf("disc seek with params %04x %04x\n",cr1,cr2); //Area 51 sets this up
+ LOGCMD("\tdisc seek with params %04x %04x\n",cr1,cr2); //Area 51 sets this up
}
}
else
@@ -892,7 +903,7 @@ void stvcd_device::cmd_seek_disc()
{
cd_stat = CD_STAT_PAUSE;
cur_track = cr2>>8;
- cd_curfad = cdrom_get_track_start(cdrom, cur_track-1);
+ cd_curfad = m_cdrom_image->get_track_start(cur_track-1);
m_cdda->pause_audio(1);
// (index is cr2 low byte)
}
@@ -952,13 +963,13 @@ void stvcd_device::cmd_get_subcode_q_rw_channel()
xxxx xxxx [11] CRCC
*/
- msf_abs = lba_to_msf_alt( cd_curfad - 150 );
- track = cdrom_get_track( cdrom, cd_curfad );
- msf_rel = lba_to_msf_alt( cd_curfad - 150 - cdrom_get_track_start( cdrom, track ) );
+ msf_abs = cdrom_file::lba_to_msf_alt( cd_curfad - 150 );
+ track = m_cdrom_image->get_track( cd_curfad );
+ msf_rel = cdrom_file::lba_to_msf_alt( cd_curfad - 150 - m_cdrom_image->get_track_start( track ) );
xfertype = XFERTYPE_SUBQ;
xfercount = 0;
- subqbuf[0] = 0x01 | ((cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, track+1)) == CD_TRACK_AUDIO) ? 0x00 : 0x40);
+ subqbuf[0] = 0x01 | ((m_cdrom_image->get_track_type(m_cdrom_image->get_track(track+1)) == cdrom_file::CD_TRACK_AUDIO) ? 0x00 : 0x40);
subqbuf[1] = dec_2_bcd(track+1);
subqbuf[2] = dec_2_bcd(get_track_index(cd_curfad));
subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff);
@@ -1001,7 +1012,7 @@ void stvcd_device::cmd_set_cddevice_connection()
// get operation
parm = cr3>>8;
- LOG("%s: Set CD Device Connection filter # %x\n", machine().describe_context(), parm);
+ LOGCMD("%s: Set CD Device Connection filter # %x\n", machine().describe_context(), parm);
cddevicenum = parm;
@@ -1046,12 +1057,12 @@ void stvcd_device::cmd_set_filter_range()
// cr3 hi = filter num.
uint8_t fnum = (cr3>>8)&0xff;
- LOG("%s: Set Filter Range\n", machine().describe_context());
+ LOGCMD("%s: Set Filter Range\n", machine().describe_context());
filters[fnum].fad = ((cr1 & 0xff)<<16) | cr2;
filters[fnum].range = ((cr3 & 0xff)<<16) | cr4;
- printf("%08x %08x %d\n",filters[fnum].fad,filters[fnum].range,fnum);
+ LOGCMD("\t%08x %08x %d\n",filters[fnum].fad,filters[fnum].range,fnum);
hirqreg |= (CMOK|ESEL);
cr_standard_return(cd_stat);
@@ -1069,7 +1080,7 @@ void stvcd_device::cmd_set_filter_subheader_conditions()
// Set Filter Subheader conditions
uint8_t fnum = (cr3>>8)&0xff;
- 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);
+ LOGCMD("%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;
@@ -1089,7 +1100,7 @@ void stvcd_device::cmd_get_filter_subheader_conditions()
// Get Filter Subheader conditions
uint8_t fnum = (cr3>>8)&0xff;
- 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);
+ LOGCMD("%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);
@@ -1116,7 +1127,7 @@ void stvcd_device::cmd_set_filter_mode()
filters[fnum].mode = mode;
}
- LOG("%s: Set Filter Mode filt %x mode %x\n", machine().describe_context(), fnum, mode);
+ LOGCMD("%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;
@@ -1143,7 +1154,7 @@ void stvcd_device::cmd_set_filter_connection()
// (false condition?)
uint8_t fnum = (cr3>>8)&0xff;
- LOG("%s:CD: Set Filter Connection %x => mode %x parm %04x\n", machine().describe_context(), fnum, cr1 & 0xf, cr2);
+ LOGCMD("%s: 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;
@@ -1161,7 +1172,7 @@ void stvcd_device::cmd_reset_selector()
int i,j;
// Reset Selector
- LOG("%s: Reset Selector\n", machine().describe_context());
+ LOGCMD("%s: Reset Selector\n", machine().describe_context());
if((cr1 & 0xff) == 0x00)
{
@@ -1264,12 +1275,12 @@ void stvcd_device::cmd_get_buffer_partition_sector_number()
uint32_t bufnum = cr3>>8;
- LOG("%s: Get Sector Number (bufno %d) = %d blocks\n", machine().describe_context(), bufnum, cr4);
+ LOGCMD("%s: Get Sector Number (bufno %d) = %d blocks\n", machine().describe_context(), bufnum, cr4);
cr1 = cd_stat;
cr2 = 0;
cr3 = 0;
if(cr1 & 0xff || cr2 || cr3 & 0xff || cr4)
- printf("Get # sectors used with params %04x %04x %04x %04x\n",cr1,cr2,cr3,cr4);
+ LOGWARN("Get # sectors used with params %04x %04x %04x %04x\n",cr1,cr2,cr3,cr4);
// is the partition empty?
if (partitions[bufnum].size == -1)
@@ -1279,10 +1290,10 @@ void stvcd_device::cmd_get_buffer_partition_sector_number()
else
{
cr4 = partitions[bufnum].numblks;
- //printf("Partition %08x %04x\n",bufnum,cr4);
+ //LOGWARN("Partition %08x %04x\n",bufnum,cr4);
}
- //printf("%04x\n",cr4);
+ //LOGWARN("%04x\n",cr4);
if(cr4 == 0)
hirqreg |= (CMOK);
else
@@ -1297,7 +1308,7 @@ void stvcd_device::cmd_calculate_actual_data_size()
uint32_t sectoffs = cr2;
uint32_t numsect = cr4;
- LOG("%s: Calculate actual size: buf %x offs %x numsect %x\n", machine().describe_context(), bufnum, sectoffs, numsect);
+ LOGCMD("%s: Calculate actual size: buf %x offs %x numsect %x\n", machine().describe_context(), bufnum, sectoffs, numsect);
calcsize = 0;
if (partitions[bufnum].size != -1)
@@ -1321,7 +1332,7 @@ void stvcd_device::cmd_calculate_actual_data_size()
void stvcd_device::cmd_get_actual_data_size()
{
// get actual block size
- LOG("%s: Get actual block size\n", machine().describe_context());
+ LOGCMD("%s: Get actual block size\n", machine().describe_context());
cr1 = cd_stat | ((calcsize>>16)&0xff);
cr2 = (calcsize & 0xffff);
cr3 = 0;
@@ -1340,7 +1351,7 @@ void stvcd_device::cmd_get_sector_information()
{
cr1 |= CD_STAT_REJECT & 0xff00;
hirqreg |= (CMOK|ESEL);
- printf("Get sector info reject\n");
+ LOGWARN("Get sector info reject\n");
}
else
{
@@ -1357,7 +1368,7 @@ void stvcd_device::cmd_get_sector_information()
void stvcd_device::cmd_set_sector_length()
{
// set sector length
- LOG("%s: Set sector length\n", machine().describe_context());
+ LOGCMD("%s: Set sector length\n", machine().describe_context());
switch (cr1 & 0xff)
{
@@ -1402,13 +1413,13 @@ void stvcd_device::cmd_get_sector_data()
uint32_t sectofs = cr2;
uint32_t bufnum = cr3>>8;
- LOG("%s: Get sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
+ LOGCMD("%s: Get sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
if (bufnum >= MAX_FILTERS)
{
// TODO: find actual SW that does this
// (may conceal a bigger issue)
- osd_printf_error("CD: invalid buffer number\n");
+ LOGWARN("CD: invalid buffer number\n");
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1416,7 +1427,7 @@ void stvcd_device::cmd_get_sector_data()
if (partitions[bufnum].numblks < sectnum)
{
- osd_printf_error("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum);
+ LOGWARN("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum);
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1446,12 +1457,12 @@ void stvcd_device::cmd_delete_sector_data()
uint32_t bufnum = cr3>>8;
int32_t i;
- LOG("%s: Delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
+ LOGCMD("%s: Delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
if (bufnum >= MAX_FILTERS)
{
// TODO: mustn't happen
- osd_printf_error("CD: invalid buffer number\n");
+ LOGWARN("CD: invalid buffer number\n");
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1461,7 +1472,7 @@ void stvcd_device::cmd_delete_sector_data()
// TODO: verify if implementation is correct
if (partitions[bufnum].numblks == 0)
{
- osd_printf_error("CD: buffer is already empty\n");
+ LOGWARN("CD: buffer is already empty\n");
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1505,12 +1516,12 @@ void stvcd_device::cmd_get_and_delete_sector_data()
uint32_t sectofs = cr2;
uint32_t bufnum = cr3>>8;
- LOG("%s: Get and delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
+ LOGCMD("%s: Get and delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum);
if (bufnum >= MAX_FILTERS)
{
// TODO: mustn't happen
- osd_printf_error("CD: invalid buffer number\n");
+ LOGWARN("CD: invalid buffer number\n");
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1520,7 +1531,7 @@ void stvcd_device::cmd_get_and_delete_sector_data()
// TODO: verify again if it's really REJECT or something else
if (partitions[bufnum].numblks < sectnum)
{
- osd_printf_error("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum);
+ LOGWARN("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum);
cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
@@ -1627,7 +1638,7 @@ void stvcd_device::cmd_copy_sector_data()
void stvcd_device::cmd_get_sector_data_copy_or_move_error()
{
// get copy error
- LOG("%s: Get copy error\n", machine().describe_context());
+ LOGCMD("%s: Get copy error\n", machine().describe_context());
logerror("Get copy error\n");
cr1 = cd_stat;
cr2 = 0;
@@ -1641,7 +1652,7 @@ void stvcd_device::cmd_change_directory()
{
uint32_t temp;
// change directory
- LOG("%s: Change Directory\n", machine().describe_context());
+ LOGCMD("%s: Change Directory\n", machine().describe_context());
hirqreg |= (CMOK|EFLS);
temp = (cr3&0xff)<<16;
@@ -1655,7 +1666,7 @@ void stvcd_device::cmd_change_directory()
void stvcd_device::cmd_read_directory()
{
// Read directory entry
- LOG("%s: Read Directory Entry\n", machine().describe_context());
+ LOGCMD("%s: Read Directory Entry\n", machine().describe_context());
// uint32_t read_dir;
// read_dir = ((cr3&0xff)<<16)|cr4;
@@ -1676,13 +1687,13 @@ void stvcd_device::cmd_read_directory()
void stvcd_device::cmd_get_file_scope()
{
// Get file system scope
- LOG("%s: Get file system scope\n", machine().describe_context());
+ LOGCMD("%s: Get file system scope\n", machine().describe_context());
hirqreg |= (CMOK|EFLS);
cr1 = cd_stat;
cr2 = numfiles; // # of files in directory
cr3 = 0x0100; // report directory held
cr4 = firstfile; // first file id
- printf("%04x %04x %04x %04x\n",cr1,cr2,cr3,cr4);
+ LOGWARN("%04x %04x %04x %04x\n",cr1,cr2,cr3,cr4);
status_type = 0;
}
@@ -1691,7 +1702,7 @@ void stvcd_device::cmd_get_target_file_info()
uint32_t temp;
// Get File Info
- LOG("%s: Get File Info\n", machine().describe_context());
+ LOGCMD("%s: Get File Info\n", machine().describe_context());
cd_stat |= CD_STAT_TRANS;
cd_stat &= 0xff00; // clear top byte of return value
playtype = 0;
@@ -1730,17 +1741,11 @@ void stvcd_device::cmd_get_target_file_info()
// (iso9660 parsing doesn't read beyond the first sector)
if (curdir[temp].firstfad == 0 || curdir[temp].length == 0)
throw emu_fatalerror("File ID not found in XFERTYPE_FILEINFO_1");
-// printf("%08x %08x\n",curdir[temp].firstfad,curdir[temp].length);
+// LOGWARN("%08x %08x\n",curdir[temp].firstfad,curdir[temp].length);
// first 4 bytes = FAD
- finfbuf[0] = (curdir[temp].firstfad>>24)&0xff;
- finfbuf[1] = (curdir[temp].firstfad>>16)&0xff;
- finfbuf[2] = (curdir[temp].firstfad>>8)&0xff;
- finfbuf[3] = (curdir[temp].firstfad&0xff);
+ put_u32be(&finfbuf[0], curdir[temp].firstfad);
// second 4 bytes = length of file
- finfbuf[4] = (curdir[temp].length>>24)&0xff;
- finfbuf[5] = (curdir[temp].length>>16)&0xff;
- finfbuf[6] = (curdir[temp].length>>8)&0xff;
- finfbuf[7] = (curdir[temp].length&0xff);
+ put_u32be(&finfbuf[4], curdir[temp].length);
finfbuf[8] = curdir[temp].interleave_gap_size;
finfbuf[9] = curdir[temp].file_unit_size;
finfbuf[10] = temp;
@@ -1757,7 +1762,7 @@ void stvcd_device::cmd_get_target_file_info()
void stvcd_device::cmd_read_file()
{
// Read File
- LOG("%s: Read File\n", machine().describe_context());
+ LOGCMD("%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? */
@@ -1773,7 +1778,7 @@ void stvcd_device::cmd_read_file()
else
cddevice = (filterT *)nullptr;
- printf("Read file %08x (%08x %08x) %02x %d\n",curdir[file_id].firstfad,cd_curfad,fadstoplay,file_filter,sectlenin);
+ LOGWARN("Read file %08x (%08x %08x) %02x %d\n",curdir[file_id].firstfad,cd_curfad,fadstoplay,file_filter,sectlenin);
cr_standard_return(cd_stat);
@@ -1788,7 +1793,7 @@ void stvcd_device::cmd_read_file()
void stvcd_device::cmd_abort_file()
{
- LOG("%s: Abort File\n", machine().describe_context());
+ LOGCMD("%s: Abort File\n", machine().describe_context());
// bios expects "2bc" mask to work against this
hirqreg |= (CMOK|EFLS);
sectorstore = 0;
@@ -1803,7 +1808,7 @@ void stvcd_device::cmd_abort_file()
void stvcd_device::cmd_check_copy_protection()
{
// appears to be copy protection check. needs only to return OK.
- LOG("%s: Verify copy protection\n", machine().describe_context());
+ LOGCMD("%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;
@@ -1826,7 +1831,7 @@ void stvcd_device::cmd_check_copy_protection()
void stvcd_device::cmd_get_disc_region()
{
// get disc region
- LOG("%s: Get disc region\n", machine().describe_context());
+ LOGCMD("%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
@@ -1912,6 +1917,11 @@ void stvcd_device::cd_exec_command()
1)
logerror("Command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat);
+ if(!m_cdrom_image->exists() && ((cr1 >> 8) & 0xff) != 0x00) {
+ hirqreg |= (CMOK);
+ return;
+ }
+
switch ((cr1 >> 8) & 0xff)
{
case 0x00: cmd_get_status(); break;
@@ -2000,13 +2010,16 @@ TIMER_DEVICE_CALLBACK_MEMBER( stvcd_device::stv_sh1_sim )
TIMER_DEVICE_CALLBACK_MEMBER( stvcd_device::stv_sector_cb )
{
+ if(!m_cdrom_image->exists())
+ return;
+
//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)
+ if(m_cdrom_image->get_track_type(m_cdrom_image->get_track(cd_curfad)) == cdrom_file::CD_TRACK_AUDIO)
m_sector_timer->adjust(attotime::from_hz(75)); // 75 sectors / second = 150kBytes/second (cdda track ignores cd_speed setting)
else
m_sector_timer->adjust(attotime::from_hz(75*cd_speed)); // 75 / 150 sectors / second = 150 / 300kBytes/second
@@ -2069,15 +2082,11 @@ void stvcd_device::device_reset()
for (i = 0; i < MAX_BLOCKS; i++)
{
blocks[i].size = -1;
- memset(&blocks[i].data, 0, CD_MAX_SECTOR_DATA);
+ memset(&blocks[i].data, 0, cdrom_file::MAX_SECTOR_DATA);
}
// open device
- cdrom = m_cdrom_image->get_cdrom_file();
-
- m_cdda->set_cdrom(cdrom);
-
- if (cdrom)
+ if (m_cdrom_image->exists())
{
LOG("Opened CD-ROM successfully, reading root directory\n");
read_new_dir(0xffffff); // read root directory
@@ -2107,7 +2116,7 @@ stvcd_device::blockT *stvcd_device::cd_alloc_block(uint8_t *blknum)
if (freeblocks <= 0)
{
buffull = 1;
- printf("buffull in cd_alloc_block\n");
+ LOGWARN("buffull in cd_alloc_block\n");
}
blocks[i].size = sectlenin;
@@ -2153,7 +2162,7 @@ void stvcd_device::cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, ui
if (*sectoffs == 0xffff)
{
// last sector
- osd_printf_error("CD: Don't know how to handle offset ffff\n");
+ LOGWARN("CD: Don't know how to handle offset ffff\n");
}
else if (*sectnum == 0xffff)
{
@@ -2232,13 +2241,13 @@ void stvcd_device::read_new_dir(uint32_t fileno)
// got primary vol. desc.
if (foundpd)
{
- //dirfad = sect[140] | (sect[141]<<8) | (sect[142]<<16) | (sect[143]<<24);
+ //dirfad = get_u32le(&sect[140]);
//dirfad += 150;
// parse root entry
- curroot.firstfad = sect[158] | (sect[159]<<8) | (sect[160]<<16) | (sect[161]<<24);
+ curroot.firstfad = get_u32le(&sect[158]);
curroot.firstfad += 150;
- curroot.length = sect[166] | (sect[167]<<8) | (sect[168]<<16) | (sect[169]<<24);
+ curroot.length = get_u32le(&sect[166]);
curroot.flags = sect[181];
for (i = 0; i < sect[188]; i++)
{
@@ -2249,7 +2258,7 @@ void stvcd_device::read_new_dir(uint32_t fileno)
// easy to fix, but make sure we *need* to first
if (curroot.length > MAX_DIR_SIZE)
{
- osd_printf_error("ERROR: root directory too big (%d)\n", curroot.length);
+ LOGWARN("ERROR: root directory too big (%d)\n", curroot.length);
}
// done with all that, read the root directory now
@@ -2260,7 +2269,7 @@ void stvcd_device::read_new_dir(uint32_t fileno)
{
if (curdir[fileno].length > MAX_DIR_SIZE)
{
- osd_printf_error("ERROR: new directory too big (%d)!\n", curdir[fileno].length);
+ LOGWARN("ERROR: new directory too big (%d)!\n", curdir[fileno].length);
}
make_dir_current(curdir[fileno].firstfad);
}
@@ -2328,9 +2337,9 @@ void stvcd_device::make_dir_current(uint32_t fad)
curentry->record_size = sect[nextent+0];
curentry->xa_record_size = sect[nextent+1];
- curentry->firstfad = sect[nextent+2] | (sect[nextent+3]<<8) | (sect[nextent+4]<<16) | (sect[nextent+5]<<24);
+ curentry->firstfad = get_u32le(&sect[nextent+2]);
curentry->firstfad += 150;
- curentry->length = sect[nextent+10] | (sect[nextent+11]<<8) | (sect[nextent+12]<<16) | (sect[nextent+13]<<24);
+ curentry->length = get_u32le(&sect[nextent+10]);
curentry->year = sect[nextent+18];
curentry->month = sect[nextent+19];
curentry->day = sect[nextent+20];
@@ -2341,14 +2350,14 @@ void stvcd_device::make_dir_current(uint32_t fad)
curentry->flags = sect[nextent+25];
curentry->file_unit_size = sect[nextent+26];
curentry->interleave_gap_size = sect[nextent+27];
- curentry->volume_sequencer_number = sect[nextent+28] | (sect[nextent+29] << 8);
+ curentry->volume_sequencer_number = get_u16le(&sect[nextent+28]);
for (i = 0; i < sect[nextent+32]; i++)
{
curentry->name[i] = sect[nextent+33+i];
}
curentry->name[i] = '\0'; // terminate
- //printf("%08x %08x %s %d/%d/%d\n",curentry->firstfad,curentry->length,curentry->name,curentry->year,curentry->month,curentry->day);
+ //LOGWARN("%08x %08x %s %d/%d/%d\n",curentry->firstfad,curentry->length,curentry->name,curentry->year,curentry->month,curentry->day);
nextent += sect[nextent];
curentry++;
@@ -2368,11 +2377,6 @@ void stvcd_device::make_dir_current(uint32_t fad)
void stvcd_device::device_stop()
{
curdir.clear();
-
- if (cdrom)
- {
- cdrom = (cdrom_file *)nullptr;
- }
}
void stvcd_device::cd_readTOC(void)
@@ -2382,9 +2386,9 @@ void stvcd_device::cd_readTOC(void)
xfertype = XFERTYPE_TOC;
xfercount = 0;
- if (cdrom)
+ if (m_cdrom_image->exists())
{
- ntrks = cdrom_get_last_track(cdrom);
+ ntrks = m_cdrom_image->get_last_track();
}
else
{
@@ -2405,24 +2409,22 @@ void stvcd_device::cd_readTOC(void)
for (i = 0; i < ntrks; i++)
{
- if (cdrom)
+ if (m_cdrom_image->exists())
{
//tocbuf[tocptr] = sega_cdrom_get_adr_control(cdrom, i);
//HACK: ddsom does not enter ingame with the line above!
- tocbuf[tocptr] = cdrom_get_adr_control(cdrom, i)<<4 | 0x01;
+ tocbuf[tocptr] = m_cdrom_image->get_adr_control(i)<<4 | 0x01;
}
else
{
tocbuf[tocptr] = 0xff;
}
- if (cdrom)
+ if (m_cdrom_image->exists())
{
- fad = cdrom_get_track_start(cdrom, i) + 150;
+ fad = m_cdrom_image->get_track_start(i) + 150;
- tocbuf[tocptr+1] = (fad>>16)&0xff;
- tocbuf[tocptr+2] = (fad>>8)&0xff;
- tocbuf[tocptr+3] = fad&0xff;
+ put_u24be(&tocbuf[tocptr+1], fad);
}
else
{
@@ -2459,12 +2461,10 @@ void stvcd_device::cd_readTOC(void)
tocbuf[tocptr+7] = 0;
// get total disc length (start of lead-out)
- fad = cdrom_get_track_start(cdrom, 0xaa) + 150;
+ fad = m_cdrom_image->get_track_start(0xaa) + 150;
tocbuf[tocptr+8] = tocbuf[0];
- tocbuf[tocptr+9] = (fad>>16)&0xff;
- tocbuf[tocptr+10] = (fad>>8)&0xff;
- tocbuf[tocptr+11] = fad&0xff;
+ put_u24be(&tocbuf[tocptr+9], fad);
}
stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok)
@@ -2486,20 +2486,20 @@ stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype,
{
if ((cd_curfad < flt->fad) || (cd_curfad > (flt->fad + flt->range)))
{
- printf("curfad reject %08x %08x %08x %08x\n",cd_curfad,fadstoplay,flt->fad,flt->fad+flt->range);
+ LOGWARN("curfad reject %08x %08x %08x %08x\n",cd_curfad,fadstoplay,flt->fad,flt->fad+flt->range);
match = 0;
//lastbuf = flt->condfalse;
//flt = &filters[lastbuf];
}
}
- if ((trktype != CD_TRACK_AUDIO) && (curblock.data[15] == 2))
+ if ((trktype != cdrom_file::CD_TRACK_AUDIO) && (curblock.data[15] == 2))
{
if (flt->mode & 1) // file number
{
if (curblock.fnum != flt->fid)
{
- printf("fnum reject\n");
+ LOGWARN("fnum reject\n");
match = 0;
}
}
@@ -2508,7 +2508,7 @@ stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype,
{
if (curblock.chan != flt->chan)
{
- printf("channel number reject\n");
+ LOGWARN("channel number reject\n");
match = 0;
}
}
@@ -2517,7 +2517,7 @@ stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype,
{
if((curblock.subm & flt->smmask) != flt->smval)
{
- printf("sub mode reject\n");
+ LOGWARN("sub mode reject\n");
match = 0;
}
}
@@ -2526,7 +2526,7 @@ stvcd_device::partitionT *stvcd_device::cd_filterdata(filterT *flt, int trktype,
{
if((curblock.cinf & flt->cimask) != flt->cival)
{
- printf("coding information reject\n");
+ LOGWARN("coding information reject\n");
match = 0;
}
}
@@ -2630,27 +2630,27 @@ stvcd_device::partitionT *stvcd_device::cd_read_filtered_sector(int32_t fad, uin
if ((cddevice != nullptr) && (!buffull))
{
// find out the track's type
- trktype = cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, fad-150));
+ trktype = m_cdrom_image->get_track_type(m_cdrom_image->get_track(fad-150));
// now get a raw 2352 byte sector - if it's mode 1, get mode1_raw
- if ((trktype == CD_TRACK_MODE1) || (trktype == CD_TRACK_MODE1_RAW))
+ if ((trktype == cdrom_file::CD_TRACK_MODE1) || (trktype == cdrom_file::CD_TRACK_MODE1_RAW))
{
- cdrom_read_data(cdrom, fad-150, curblock.data, CD_TRACK_MODE1_RAW);
+ m_cdrom_image->read_data(fad-150, curblock.data, cdrom_file::CD_TRACK_MODE1_RAW);
}
- else if (trktype != CD_TRACK_AUDIO) // if not audio it must be mode 2 so get mode2_raw
+ else if (trktype != cdrom_file::CD_TRACK_AUDIO) // if not audio it must be mode 2 so get mode2_raw
{
- cdrom_read_data(cdrom, fad-150, curblock.data, CD_TRACK_MODE2_RAW);
+ m_cdrom_image->read_data(fad-150, curblock.data, cdrom_file::CD_TRACK_MODE2_RAW);
}
else
{
- cdrom_read_data(cdrom, fad-150, curblock.data, CD_TRACK_AUDIO);
+ m_cdrom_image->read_data(fad-150, curblock.data, cdrom_file::CD_TRACK_AUDIO);
}
curblock.size = sectlenin;
curblock.FAD = fad;
// if track is Mode 2, get the subheader values
- if ((trktype != CD_TRACK_AUDIO) && (curblock.data[15] == 2))
+ if ((trktype != cdrom_file::CD_TRACK_AUDIO) && (curblock.data[15] == 2))
{
curblock.chan = curblock.data[17];
curblock.fnum = curblock.data[16];
@@ -2677,26 +2677,26 @@ void stvcd_device::cd_playdata()
if ((cd_stat & 0x0f00) == CD_STAT_SEEK)
{
int32_t fad_diff;
- //printf("PRE %08x %08x %08x %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad);
+ LOGSEEK("PRE %08x %08x %08x %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad);
fad_diff = (cd_fad_seek - cd_curfad);
/* Zero Divide wants this TODO: timings. */
if(fad_diff > (750*cd_speed))
{
- //printf("PRE FFWD %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad,750*cd_speed);
+ LOGSEEK("PRE FFWD %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad,750*cd_speed);
cd_curfad += (750*cd_speed);
- //printf("POST FFWD %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, 750*cd_speed);
+ LOGSEEK("POST FFWD %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, 750*cd_speed);
}
else if(fad_diff < (-750*cd_speed))
{
- //printf("PRE REW %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, -750*cd_speed);
+ LOGSEEK("PRE REW %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, -750*cd_speed);
cd_curfad -= (750*cd_speed);
- //printf("POST REW %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, -750*cd_speed);
+ LOGSEEK("POST REW %08x %08x %08x %d %d\n",cd_curfad,cd_fad_seek,cd_stat,cd_fad_seek - cd_curfad, -750*cd_speed);
}
else
{
- //printf("Ready\n");
+ LOGSEEK("Ready\n");
cd_curfad = cd_fad_seek;
cd_stat = CD_STAT_PLAY;
}
@@ -2704,24 +2704,29 @@ void stvcd_device::cd_playdata()
return;
}
+ if (LIVE_CD_VIEW)
+ popmessage("%04x %d %d", cd_stat, cd_curfad, fadstoplay);
+
if ((cd_stat & 0x0f00) == CD_STAT_PLAY)
{
if (fadstoplay)
{
- logerror("STVCD: Reading FAD %d\n", cd_curfad);
+ LOGXFER("STVCD: Reading FAD %d\n", cd_curfad);
- if (cdrom)
+ if (m_cdrom_image->exists())
{
uint8_t p_ok;
- if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO)
+ if(m_cdrom_image->get_track_type(m_cdrom_image->get_track(cd_curfad)) != cdrom_file::CD_TRACK_AUDIO)
{
cd_read_filtered_sector(cd_curfad,&p_ok);
m_cdda->stop_audio(); //stop any pending CD-DA
}
else
{
- p_ok = 1; // TODO
+ // TODO: pinpoint cases when this isn't okay
+ // (out of bounds disc for example)
+ p_ok = 1;
m_cdda->start_audio(cd_curfad, 1);
}
@@ -2752,8 +2757,8 @@ void stvcd_device::cd_playdata()
if(cdda_repeat_count < 0xe)
cdda_repeat_count++;
- cd_curfad = cdrom_get_track_start(cdrom, cur_track-1) + 150;
- fadstoplay = cdrom_get_track_start(cdrom, cur_track) - cd_curfad;
+ cd_curfad = m_cdrom_image->get_track_start(cur_track-1) + 150;
+ fadstoplay = m_cdrom_image->get_track_start(cur_track) - cd_curfad;
}
}
}
@@ -2765,9 +2770,9 @@ void stvcd_device::cd_playdata()
// loads a single sector off the CD, anywhere from FAD 150 on up
void stvcd_device::cd_readblock(uint32_t fad, uint8_t *dat)
{
- if (cdrom)
+ if (m_cdrom_image->exists())
{
- cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1);
+ m_cdrom_image->read_data(fad-150, dat, cdrom_file::CD_TRACK_MODE1);
}
}
@@ -2779,7 +2784,7 @@ void stvcd_device::set_tray_open()
hirqreg |= DCHG;
cd_stat = CD_STAT_OPEN;
- cdrom = (cdrom_file *)nullptr;
+ // TODO: unmount image
tray_is_closed = 0;
popmessage("Tray Open");
@@ -2792,11 +2797,8 @@ void stvcd_device::set_tray_close()
return;
hirqreg |= DCHG;
- cdrom = m_cdrom_image->get_cdrom_file();
-
- m_cdda->set_cdrom(cdrom);
- if (cdrom)
+ if (m_cdrom_image->exists())
{
LOG("Opened CD-ROM successfully, reading root directory\n");
//read_new_dir(0xffffff); // read root directory