summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2011-06-16 01:52:09 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2011-06-16 01:52:09 +0000
commitb6012aaa603334edc988f23ab0c87f3c09a47d75 (patch)
treeb1a58d088bd75fb766e94e0f2ef5db4914b1a0a0 /src
parent6742160c254bece83f595360f2bce0a20c43b74e (diff)
Port from MESS, nw
Diffstat (limited to 'src')
-rw-r--r--src/mame/machine/stvcd.c144
-rw-r--r--src/mame/video/stvvdp1.c2
2 files changed, 68 insertions, 78 deletions
diff --git a/src/mame/machine/stvcd.c b/src/mame/machine/stvcd.c
index 908e0be15a0..777571b191d 100644
--- a/src/mame/machine/stvcd.c
+++ b/src/mame/machine/stvcd.c
@@ -543,6 +543,14 @@ static UINT32 cd_readLong(UINT32 addr)
}
}
+static void cr_standard_return(UINT16 cur_status)
+{
+ cr1 = cur_status | 0x00; //options << 4 | repeat & 0xf
+ cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track);
+ cr3 = (0x01<<8) | (cd_curfad>>16); //index & 0xff00
+ cr4 = cd_curfad;
+}
+
static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
UINT32 temp;
@@ -597,17 +605,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x0000:
//CDROM_LOG(("%s:CD: Get Status\n", machine.describe_context()))
hirqreg |= CMOK;
- cr1 = cd_stat;
- if (cur_track == 0xff)
- {
- cr2 = 0xffff;
- }
- else
- {
- cr2 = cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track;
- }
- cr3 = 0x100 | (cd_curfad>>16);
- cr4 = cd_curfad;
+ cr_standard_return(cd_stat);
//CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4))
break;
@@ -620,10 +618,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
cr4 = 0x0400;
break;
- case 0x200: // Get TOC
+ case 0x0200: // Get TOC
CDROM_LOG(("%s:CD: Get TOC\n", machine.describe_context()))
cd_readTOC();
cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE;
+ cr1 = cd_stat;
cr2 = 102*2; // TOC length in words (102 entries @ 2 words/4bytes each)
cr3 = 0;
cr4 = 0;
@@ -640,13 +639,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
switch (cr1 & 0xff)
{
case 0: // get total session info / disc end
- cr2 = 0;
cr3 = 0x0100 | tocbuf[(101*4)+1];
cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3];
break;
case 1: // get total session info / disc start
- cr2 = 0;
cr3 = 0x0100; // sessions in high byte, session start in lower
cr4 = 0;
break;
@@ -668,14 +665,13 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
// CR1 & 8 = retry reading mode 2 sectors
// CR1 & 10 = force single-speed
CDROM_LOG(("%s:CD: Initialize CD system\n", machine.describe_context()))
- hirqreg |= (CMOK|DRDY|ESEL);
+ hirqreg &= 0xffe5;
+ hirqreg |= (CMOK|ESEL);
cd_stat = CD_STAT_PAUSE;
cd_curfad = 150;
in_buffer = 0;
buffull = 0;
- cr2 = 0x4101;
- cr3 = 0x100 | ((cd_curfad>>16)&0xff);
- cr4 = cd_curfad;
+ cr_standard_return(cd_stat);
break;
case 0x0600: // end data transfer (TODO: needs to be worked on!)
@@ -792,10 +788,8 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
CDROM_LOG(("CD: Play Disc: start %x length %x\n", cd_curfad, fadstoplay))
- cr2 = cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track;
- cr3 = (0x100) | ((cd_curfad>>16)&0xff); // index of subcode in hi byte, frame address
- cr4 = cd_curfad & 0xffff;
- hirqreg |= (CMOK|DRDY);
+ cr_standard_return(cd_stat);
+ hirqreg |= (CMOK);
oddframe = 0;
in_buffer = 0;
@@ -832,9 +826,6 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
}
else
printf("disc seek with params %04x %04x\n",cr1,cr2); //Area 51 sets this up
-
- cr3 = (temp>>16)&0xff;
- cr4 = temp;
}
else
{
@@ -854,16 +845,16 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
cur_track = 0xff;
cdda_stop_audio( machine.device( "cdda" ) ); //stop any pending CD-DA
}
-
- cr3 = (cd_curfad>>16)&0xff;
- cr4 = cd_curfad;
}
hirqreg |= CMOK;
- cr1 = cd_stat;
- cr2 = cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track;
+ cr_standard_return(cd_stat);
+ break;
+ case 0x1200: // FFWD / REW
+ //cr1 bit 0 determines if this is a Fast Forward (0) or a Rewind (1) command
+ // ...
break;
case 0x2000: // Get SubCode Q / RW Channel
@@ -915,9 +906,14 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
}
hirqreg |= (CMOK|ESEL);
+ cr_standard_return(cd_stat);
}
break;
+ case 0x3200:
+ popmessage("Last Buffer Destination triggered, contact MAMEdev");
+ break;
+
case 0x4000: // Set Filter Range
// cr1 low + cr2 = FAD0, cr3 low + cr4 = FAD1
// cr3 hi = filter num.
@@ -929,10 +925,8 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
filters[fnum].fad = ((cr1 & 0xff)<<16) | cr2;
filters[fnum].range = ((cr3 & 0xff)<<16) | cr4;
- hirqreg |= (CMOK|ESEL|DRDY);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ hirqreg |= (CMOK|ESEL);
+ cr_standard_return(cd_stat);
}
break;
@@ -951,9 +945,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
filters[fnum].cival = cr4&0xff;
hirqreg |= (CMOK|ESEL);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ cr_standard_return(cd_stat);
}
break;
@@ -975,10 +967,8 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
}
CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine.describe_context(), fnum, mode))
- hirqreg |= (CMOK|ESEL|DRDY);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ hirqreg |= (CMOK|ESEL);
+ cr_standard_return(cd_stat);
}
break;
@@ -999,9 +989,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
}
hirqreg |= (CMOK|ESEL);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ cr_standard_return(cd_stat);
}
break;
@@ -1031,34 +1019,32 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
if (freeblocks == 200) { onesectorstored = 0; }
hirqreg |= (CMOK|ESEL);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ cr_standard_return(cd_stat);
return;
}
// ...
hirqreg |= (CMOK|ESEL);
- cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte
- cr3 = 0x0100|((cd_curfad>>16)&0xff);
- cr4 = (cd_curfad & 0xffff);
+ cr_standard_return(cd_stat);
break;
case 0x5000: // get Buffer Size
cr1 = cd_stat;
- cr2 = freeblocks;
- if (cr2 > 200) cr2 = 200; // ???
-
+ cr2 = (freeblocks > 200) ? 200 : freeblocks;
cr3 = 0x1800;
cr4 = 200;
CDROM_LOG(("CD: Get Buffer Size = %d\n", cr2))
- hirqreg |= (CMOK|ESEL|DRDY); // DRDY is probably wrong
+ hirqreg |= (CMOK);
break;
case 0x5100: // get # sectors used in a buffer
{
UINT32 bufnum = cr3>>8;
+ CDROM_LOG(("%s:CD: Get Sector Number (bufno %d) = %d blocks\n", machine.describe_context(), bufnum, cr4))
+ cr1 = cd_stat;
+ cr2 = 0;
+ cr3 = 0;
/* TODO: Akumajou Dracula X reads 0 there, why? */
// is the partition empty?
if (partitions[bufnum].size == -1)
@@ -1069,11 +1055,6 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
cr4 = partitions[bufnum].numblks;
}
-
- CDROM_LOG(("%s:CD: Get Sector Number (bufno %d) = %d blocks\n", machine.describe_context(), bufnum, cr4))
-
- cr2 = 0;
- cr3 = 0;
hirqreg |= (CMOK|DRDY);
}
break;
@@ -1101,10 +1082,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
}
hirqreg |= (CMOK|ESEL);
- cr1 = cd_stat;
- cr2 = 0x4101; // CTRL/track
- cr3 = (cd_curfad>>16)&0xff;
- cr4 = (cd_curfad & 0xffff);
+ cr_standard_return(cd_stat);
}
break;
@@ -1126,6 +1104,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
cr1 |= CD_STAT_REJECT & 0xff00;
hirqreg |= (CMOK|ESEL);
+ printf("Get sector info reject\n");
}
else
{
@@ -1140,7 +1119,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x6000: // set sector length
CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context()))
- hirqreg |= (CMOK|ESEL|EFLS|SCDQ|DRDY);
+ hirqreg |= (CMOK|ESEL);
switch (cr1 & 0xff)
{
@@ -1187,7 +1166,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */
- //cd_stat = 0xff00; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1196,7 +1175,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: buffer is empty\n");
/* TODO: why this is happening? */
- //cd_stat = 0xff00; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1212,6 +1191,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
transpart = &partitions[bufnum];
cd_stat |= CD_STAT_TRANS;
+ cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST|DRDY);
}
break;
@@ -1229,7 +1209,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */
- //cd_stat = CD_STAT_REJECT; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1238,7 +1218,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: buffer is empty\n");
/* TODO: why this is happening? */
- //cd_stat = CD_STAT_REJECT; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1259,6 +1239,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
partitions[bufnum].numblks -= sectnum;
cd_stat &= ~CD_STAT_TRANS;
+ cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST);
}
break;
@@ -1275,7 +1256,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */
- //cd_stat = 0xff00; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1284,7 +1265,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{
printf("CD: buffer is empty\n");
/* TODO: why this is happening? */
- //cd_stat = 0xff00; // ERROR
+ cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST);
return;
}
@@ -1300,6 +1281,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
transpart = &partitions[bufnum];
cd_stat &= ~CD_STAT_TRANS;
+ cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST|DRDY);
}
break;
@@ -1312,7 +1294,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x6700: // get copy error
CDROM_LOG(("%s:CD: Get copy error\n", machine.describe_context()))
- hirqreg |= (CMOK|ESEL|EFLS|SCDQ|DRDY);
+ cr1 = cd_stat;
+ cr2 = 0;
+ cr3 = 0;
+ cr4 = 0;
+ hirqreg |= (CMOK);
break;
case 0x7000: // change directory
@@ -1326,26 +1312,30 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
temp = 0;
#endif
read_new_dir(machine, temp);
+ cr_standard_return(cd_stat);
break;
case 0x7100: // Read directory entry
CDROM_LOG(("%s:CD: Read Directory Entry\n", machine.describe_context()))
hirqreg |= (CMOK|EFLS);
- temp = (cr3&0xff)<<16;
- temp |= cr4;
+ // TODO!
+
+ //temp = (cr3&0xff)<<16;
+ //temp |= cr4;
#if 0
if(temp == 0xfffff8) /* TODO: Falcom Classics */
temp = 0;
#endif
- cr2 = 0x4101; // CTRL/track
- cr3 = (curdir[temp].firstfad>>16)&0xff;
- cr4 = (curdir[temp].firstfad&0xffff);
+ //cr2 = 0x4101; // CTRL/track
+ //cr3 = (curdir[temp].firstfad>>16)&0xff;
+ //cr4 = (curdir[temp].firstfad&0xffff);
+ cr_standard_return(cd_stat);
break;
case 0x7200: // Get file system scope
CDROM_LOG(("CD: Get file system scope\n"))
- hirqreg |= (CMOK|DRDY);
+ hirqreg |= (CMOK|EFLS);
cr2 = numfiles; // # of files in directory
cr3 = 0x0100; // report directory held
cr4 = firstfile; // first file id
diff --git a/src/mame/video/stvvdp1.c b/src/mame/video/stvvdp1.c
index 87961aacd1a..1ef94c43f58 100644
--- a/src/mame/video/stvvdp1.c
+++ b/src/mame/video/stvvdp1.c
@@ -177,7 +177,7 @@ READ16_HANDLER( saturn_vdp1_regs_r )
case 0x12/2:
case 0x14/2:
case 0x16/2:
- printf ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space->device().tag(), cpu_get_pc(&space->device()), offset);
+ printf ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space->device().tag(), cpu_get_pc(&space->device()), offset*2);
break;
}