more neocd / segacd reduction (nw)

This commit is contained in:
David Haywood 2012-12-04 07:38:53 +00:00
parent ebc6b1857c
commit 5873b8e80b
2 changed files with 52 additions and 79 deletions

View File

@ -322,7 +322,7 @@ void lc89510_temp_device::CDD_Play(running_machine &machine)
SCD_CURLBA = msf_to_lba(msf)-150; SCD_CURLBA = msf_to_lba(msf)-150;
UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs; UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs;
SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1; SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1;
CDC_UpdateHEAD(); LC8951UpdateHeader();
SCD_STATUS = CDD_PLAYINGCDDA; SCD_STATUS = CDD_PLAYINGCDDA;
CDD_STATUS = 0x0102; CDD_STATUS = 0x0102;
set_data_audio_mode(); set_data_audio_mode();
@ -340,7 +340,7 @@ void lc89510_temp_device::CDD_Seek(void)
UINT32 msf = getmsf_from_regs(); UINT32 msf = getmsf_from_regs();
SCD_CURLBA = msf_to_lba(msf)-150; SCD_CURLBA = msf_to_lba(msf)-150;
SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1; SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1;
CDC_UpdateHEAD(); LC8951UpdateHeader();
STOP_CDC_READ STOP_CDC_READ
SCD_STATUS = CDD_READY; SCD_STATUS = CDD_READY;
CDD_STATUS = 0x0200; CDD_STATUS = 0x0200;
@ -437,15 +437,15 @@ void lc89510_temp_device::CDD_Reset(void)
void lc89510_temp_device::CDC_Reset(void) void lc89510_temp_device::CDC_Reset(void)
{ {
memset(CDC_BUFFER, 0x00, ((16 * 1024 * 2) + SECTOR_SIZE)); memset(CDC_BUFFER, 0x00, ((16 * 1024 * 2) + SECTOR_SIZE));
CDC_UpdateHEAD(); LC8951UpdateHeader();
CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = CDC_SBOUT = CDC_IFCTRL = CDC_CTRLB0 = CDC_CTRLB1 = CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = LC8951RegistersW[REG_W_SBOUT] = LC8951RegistersW[REG_W_IFCTRL] = LC8951RegistersW[REG_W_CTRL0] = LC8951RegistersW[REG_W_CTRL1] =
CDC_CTRLB2 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = CDC_STATB0 = CDC_STATB1 = CDC_STATB2 = CDC_DECODE = 0; LC8951RegistersW[REG_W_CTRL2] = LC8951RegistersR[REG_R_HEAD1] = LC8951RegistersR[REG_R_HEAD2] = LC8951RegistersR[REG_R_HEAD3] = LC8951RegistersR[REG_R_STAT0] = LC8951RegistersR[REG_R_STAT1] = LC8951RegistersR[REG_R_STAT2] = CDC_DECODE = 0;
CDC_IFSTAT = 0xFF; LC8951RegistersR[REG_R_IFSTAT] = 0xFF;
CDC_WA = SECTOR_SIZE * 2; CDC_WA = SECTOR_SIZE * 2;
CDC_HEADB0 = 0x01; LC8951RegistersR[REG_R_HEAD0] = 0x01;
CDC_STATB3 = 0x80; LC8951RegistersR[REG_R_STAT3] = 0x80;
} }
@ -462,11 +462,11 @@ void lc89510_temp_device::CDC_End_Transfer(running_machine& machine)
STOP_CDC_DMA STOP_CDC_DMA
CDC_REG0 |= 0x8000; CDC_REG0 |= 0x8000;
CDC_REG0 &= ~0x4000; CDC_REG0 &= ~0x4000;
CDC_IFSTAT |= 0x08; LC8951RegistersR[REG_R_IFSTAT] |= 0x08;
if (CDC_IFCTRL & 0x40) if (LC8951RegistersW[REG_W_IFCTRL] & 0x40)
{ {
CDC_IFSTAT &= ~0x40; LC8951RegistersR[REG_R_IFSTAT] &= ~0x40;
CHECK_SCD_LV5_INTERRUPT CHECK_SCD_LV5_INTERRUPT
} }
} }
@ -557,29 +557,29 @@ UINT8 lc89510_temp_device::CDC_Reg_r(void)
switch (reg) switch (reg)
{ {
case REG_R_COMIN: ret = 0/*COMIN*/; break; case REG_R_COMIN: ret = 0/*COMIN*/; break;
case REG_R_IFSTAT: ret = CDC_IFSTAT; break; case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT]; break;
case REG_R_DBCL: ret = CDC_DMACNT & 0xff; break; case REG_R_DBCL: ret = CDC_DMACNT & 0xff; break;
case REG_R_DBCH: ret = (CDC_DMACNT >>8) & 0xff; break; case REG_R_DBCH: ret = (CDC_DMACNT >>8) & 0xff; break;
case REG_R_HEAD0: ret = CDC_HEADB0; break; case REG_R_HEAD0: ret = LC8951RegistersR[REG_R_HEAD0]; break;
case REG_R_HEAD1: ret = CDC_HEADB1; break; case REG_R_HEAD1: ret = LC8951RegistersR[REG_R_HEAD1]; break;
case REG_R_HEAD2: ret = CDC_HEADB2; break; case REG_R_HEAD2: ret = LC8951RegistersR[REG_R_HEAD2]; break;
case REG_R_HEAD3: ret = CDC_HEADB3; break; case REG_R_HEAD3: ret = LC8951RegistersR[REG_R_HEAD3]; break;
case REG_R_PTL: ret = CDC_PT & 0xff; break; case REG_R_PTL: ret = CDC_PT & 0xff; break;
case REG_R_PTH: ret = (CDC_PT >>8) & 0xff; break; case REG_R_PTH: ret = (CDC_PT >>8) & 0xff; break;
case REG_R_WAL: ret = CDC_WA & 0xff; break; case REG_R_WAL: ret = CDC_WA & 0xff; break;
case REG_R_WAH: ret = (CDC_WA >>8) & 0xff; break; case REG_R_WAH: ret = (CDC_WA >>8) & 0xff; break;
case REG_R_STAT0: ret = CDC_STATB0; break; case REG_R_STAT0: ret = LC8951RegistersR[REG_R_STAT0]; break;
case REG_R_STAT1: ret = CDC_STATB1; break; case REG_R_STAT1: ret = LC8951RegistersR[REG_R_STAT1]; break;
case REG_R_STAT2: ret = CDC_STATB2; break; case REG_R_STAT2: ret = LC8951RegistersR[REG_R_STAT2]; break;
case REG_R_STAT3: ret = CDC_STATB3; case REG_R_STAT3: ret = LC8951RegistersR[REG_R_STAT3];
CDC_IFSTAT |= 0x20; LC8951RegistersR[REG_R_IFSTAT] |= 0x20;
// ?? // ??
if ((CDC_CTRLB0 & 0x80) && (CDC_IFCTRL & 0x20)) if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20))
{ {
if ((CDC_DECODE & decoderegs) == decoderegs) if ((CDC_DECODE & decoderegs) == decoderegs)
CDC_STATB3 = 0x80; LC8951RegistersR[REG_R_STAT3] = 0x80;
} }
break; break;
} }
@ -599,17 +599,17 @@ void lc89510_temp_device::CDC_Reg_w(UINT8 data)
switch (reg) switch (reg)
{ {
case REG_W_SBOUT: case REG_W_SBOUT:
CDC_SBOUT = data; LC8951RegistersW[REG_W_SBOUT] = data;
break; break;
case REG_W_IFCTRL: case REG_W_IFCTRL:
CDC_IFCTRL = data; LC8951RegistersW[REG_W_IFCTRL] = data;
if (!(CDC_IFCTRL & 0x02)) if (!(LC8951RegistersW[REG_W_IFCTRL] & 0x02))
{ {
CDC_DMACNT = 0; CDC_DMACNT = 0;
STOP_CDC_DMA; STOP_CDC_DMA;
CDC_IFSTAT |= 0x08; LC8951RegistersR[REG_R_IFSTAT] |= 0x08;
} }
break; break;
@ -619,22 +619,22 @@ void lc89510_temp_device::CDC_Reg_w(UINT8 data)
case REG_W_DACH: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0xff00) | (data & 0x00ff) << 8; break; case REG_W_DACH: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0xff00) | (data & 0x00ff) << 8; break;
case REG_W_DTTRG: case REG_W_DTTRG:
if (CDC_IFCTRL & 0x02) if (LC8951RegistersW[REG_W_IFCTRL] & 0x02)
{ {
CDC_IFSTAT &= ~0x08; LC8951RegistersR[REG_R_IFSTAT] &= ~0x08;
SET_CDC_DMA; SET_CDC_DMA;
CDC_REG0 &= ~0x8000; CDC_REG0 &= ~0x8000;
} }
break; break;
case REG_W_DTACK: CDC_IFSTAT |= 0x40; break; case REG_W_DTACK: LC8951RegistersR[REG_R_IFSTAT] |= 0x40; break;
case REG_W_WAL: CDC_WA = (CDC_WA &~ 0x00ff) | (data & 0x00ff) << 0; break; case REG_W_WAL: CDC_WA = (CDC_WA &~ 0x00ff) | (data & 0x00ff) << 0; break;
case REG_W_WAH: CDC_WA = (CDC_WA &~ 0xff00) | (data & 0x00ff) << 8; break; case REG_W_WAH: CDC_WA = (CDC_WA &~ 0xff00) | (data & 0x00ff) << 8; break;
case REG_W_CTRL0: CDC_CTRLB0 = data; break; case REG_W_CTRL0: LC8951RegistersW[REG_W_CTRL0] = data; break;
case REG_W_CTRL1: CDC_CTRLB1 = data; break; case REG_W_CTRL1: LC8951RegistersW[REG_W_CTRL1] = data; break;
case REG_W_PTL: CDC_PT = (CDC_PT &~ 0x00ff) | (data & 0x00ff) << 0; break; case REG_W_PTL: CDC_PT = (CDC_PT &~ 0x00ff) | (data & 0x00ff) << 0; break;
case REG_W_PTH: CDC_PT = (CDC_PT &~ 0xff00) | (data & 0x00ff) << 8; break; case REG_W_PTH: CDC_PT = (CDC_PT &~ 0xff00) | (data & 0x00ff) << 8; break;
case REG_W_CTRL2: CDC_CTRLB2 = data; break; case REG_W_CTRL2: LC8951RegistersW[REG_W_CTRL2] = data; break;
case REG_W_RESET: CDC_Reset(); break; case REG_W_RESET: CDC_Reset(); break;
} }
} }
@ -1465,22 +1465,6 @@ void lc89510_temp_device::NeoCDCommsControl(UINT8 clock, UINT8 send)
} }
void lc89510_temp_device::CDC_UpdateHEAD(void) // segacd
{
if (CDC_CTRLB1 & 0x01)
{
CDC_HEADB0 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = 0x00;
}
else
{
UINT32 msf = lba_to_msf_alt(SCD_CURLBA+150);
CDC_HEADB0 = to_bcd (((msf & 0x00ff0000)>>16), true);
CDC_HEADB1 = to_bcd (((msf & 0x0000ff00)>>8), true);
CDC_HEADB2 = to_bcd (((msf & 0x000000ff)>>0), true);
CDC_HEADB3 = 0x01;
}
}
void lc89510_temp_device::LC8951UpdateHeader() // neocd void lc89510_temp_device::LC8951UpdateHeader() // neocd
{ {
@ -1706,15 +1690,15 @@ void lc89510_temp_device::Read_LBA_To_Buffer_NeoCD()
void lc89510_temp_device::scd_ctrl_checks(running_machine& machine) void lc89510_temp_device::scd_ctrl_checks(running_machine& machine)
{ {
CDC_STATB0 = 0x80; LC8951RegistersR[REG_R_STAT0] = 0x80;
(CDC_CTRLB0 & 0x10) ? (CDC_STATB2 = CDC_CTRLB1 & 0x08) : (CDC_STATB2 = CDC_CTRLB1 & 0x0C); (LC8951RegistersW[REG_W_CTRL0] & 0x10) ? (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x08) : (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x0C);
(CDC_CTRLB0 & 0x02) ? (CDC_STATB3 = 0x20) : (CDC_STATB3 = 0x00); (LC8951RegistersW[REG_W_CTRL0] & 0x02) ? (LC8951RegistersR[REG_R_STAT3] = 0x20) : (LC8951RegistersR[REG_R_STAT3] = 0x00);
if (CDC_IFCTRL & 0x20) if (LC8951RegistersW[REG_W_IFCTRL] & 0x20)
{ {
CHECK_SCD_LV5_INTERRUPT CHECK_SCD_LV5_INTERRUPT
CDC_IFSTAT &= ~0x20; LC8951RegistersR[REG_R_IFSTAT] &= ~0x20;
CDC_DECODE = 0; CDC_DECODE = 0;
} }
} }
@ -1738,26 +1722,26 @@ int lc89510_temp_device::Read_LBA_To_Buffer(running_machine& machine)
if (data_track) if (data_track)
cdrom_read_data(segacd.cd, SCD_CURLBA, SCD_BUFFER, CD_TRACK_MODE1); cdrom_read_data(segacd.cd, SCD_CURLBA, SCD_BUFFER, CD_TRACK_MODE1);
CDC_UpdateHEAD(); LC8951UpdateHeader();
if (!data_track) if (!data_track)
{ {
scd_advance_current_readpos(); scd_advance_current_readpos();
} }
if (CDC_CTRLB0 & 0x80) if (LC8951RegistersW[REG_W_CTRL0] & 0x80)
{ {
if (CDC_CTRLB0 & 0x04) if (LC8951RegistersW[REG_W_CTRL0] & 0x04)
{ {
if (data_track) if (data_track)
{ {
scd_advance_current_readpos(); scd_advance_current_readpos();
memcpy(&CDC_BUFFER[CDC_PT + 4], SCD_BUFFER, 2048); memcpy(&CDC_BUFFER[CDC_PT + 4], SCD_BUFFER, 2048);
CDC_BUFFER[CDC_PT+0] = CDC_HEADB0; CDC_BUFFER[CDC_PT+0] = LC8951RegistersR[REG_R_HEAD0];
CDC_BUFFER[CDC_PT+1] = CDC_HEADB1; CDC_BUFFER[CDC_PT+1] = LC8951RegistersR[REG_R_HEAD1];
CDC_BUFFER[CDC_PT+2] = CDC_HEADB2; CDC_BUFFER[CDC_PT+2] = LC8951RegistersR[REG_R_HEAD2];
CDC_BUFFER[CDC_PT+3] = CDC_HEADB3; CDC_BUFFER[CDC_PT+3] = LC8951RegistersR[REG_R_HEAD3];
} }
else else
{ {

View File

@ -187,38 +187,27 @@ public:
UINT16 CDC_REG0; UINT16 CDC_REG0;
UINT16 CDC_REG1; UINT16 CDC_REG1;
UINT16 CDC_DMA_ADDR; UINT16 CDC_DMA_ADDR;
UINT16 CDC_IFSTAT;
UINT8 CDC_HEADB0;
UINT8 CDC_HEADB1;
UINT8 CDC_HEADB2;
UINT8 CDC_HEADB3;
UINT8 CDC_STATB0;
UINT8 CDC_STATB1;
UINT8 CDC_STATB2;
UINT8 CDC_STATB3;
UINT16 CDC_SBOUT;
UINT16 CDC_IFCTRL;
UINT8 CDC_CTRLB0;
UINT8 CDC_CTRLB1;
UINT8 CDC_CTRLB2;
UINT8 CDC_BUFFER[(32 * 1024 * 2) + SECTOR_SIZE]; UINT8 CDC_BUFFER[(32 * 1024 * 2) + SECTOR_SIZE];
UINT8 CDD_RX[10];
UINT8 CDD_TX[10];
UINT32 CDD_STATUS; UINT32 CDD_STATUS;
UINT32 CDD_MIN; UINT32 CDD_MIN;
UINT32 CDD_SEC; UINT32 CDD_SEC;
UINT8 CDD_RX[10];
UINT8 CDD_TX[10];
UINT32 CDD_FRAME; UINT32 CDD_FRAME;
UINT32 CDD_EXT; UINT32 CDD_EXT;
UINT16 CDD_CONTROL; UINT16 CDD_CONTROL;
INT16 CDD_DONE; INT16 CDD_DONE;
inline int to_bcd(int val, bool byte); inline int to_bcd(int val, bool byte);
void set_data_audio_mode(void); void set_data_audio_mode(void);
void CDD_DoChecksum(void); void CDD_DoChecksum(void);
void CDD_Export(void); void CDD_Export(void);
void CDC_UpdateHEAD(void);
void scd_ctrl_checks(running_machine& machine); void scd_ctrl_checks(running_machine& machine);
void scd_advance_current_readpos(void); void scd_advance_current_readpos(void);
int Read_LBA_To_Buffer(running_machine& machine); int Read_LBA_To_Buffer(running_machine& machine);