Port from MESS, nw

This commit is contained in:
Angelo Salese 2011-06-16 01:52:09 +00:00
parent 6742160c25
commit b6012aaa60
2 changed files with 68 additions and 78 deletions

View File

@ -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) static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
UINT32 temp; UINT32 temp;
@ -597,17 +605,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x0000: case 0x0000:
//CDROM_LOG(("%s:CD: Get Status\n", machine.describe_context())) //CDROM_LOG(("%s:CD: Get Status\n", machine.describe_context()))
hirqreg |= CMOK; hirqreg |= CMOK;
cr1 = cd_stat; cr_standard_return(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;
//CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) //CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4))
break; break;
@ -620,10 +618,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
cr4 = 0x0400; cr4 = 0x0400;
break; break;
case 0x200: // Get TOC case 0x0200: // Get TOC
CDROM_LOG(("%s:CD: Get TOC\n", machine.describe_context())) CDROM_LOG(("%s:CD: Get TOC\n", machine.describe_context()))
cd_readTOC(); cd_readTOC();
cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE; cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE;
cr1 = cd_stat;
cr2 = 102*2; // TOC length in words (102 entries @ 2 words/4bytes each) cr2 = 102*2; // TOC length in words (102 entries @ 2 words/4bytes each)
cr3 = 0; cr3 = 0;
cr4 = 0; cr4 = 0;
@ -640,13 +639,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
switch (cr1 & 0xff) switch (cr1 & 0xff)
{ {
case 0: // get total session info / disc end case 0: // get total session info / disc end
cr2 = 0;
cr3 = 0x0100 | tocbuf[(101*4)+1]; cr3 = 0x0100 | tocbuf[(101*4)+1];
cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3]; cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3];
break; break;
case 1: // get total session info / disc start case 1: // get total session info / disc start
cr2 = 0;
cr3 = 0x0100; // sessions in high byte, session start in lower cr3 = 0x0100; // sessions in high byte, session start in lower
cr4 = 0; cr4 = 0;
break; break;
@ -668,14 +665,13 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
// CR1 & 8 = retry reading mode 2 sectors // CR1 & 8 = retry reading mode 2 sectors
// CR1 & 10 = force single-speed // CR1 & 10 = force single-speed
CDROM_LOG(("%s:CD: Initialize CD system\n", machine.describe_context())) 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_stat = CD_STAT_PAUSE;
cd_curfad = 150; cd_curfad = 150;
in_buffer = 0; in_buffer = 0;
buffull = 0; buffull = 0;
cr2 = 0x4101; cr_standard_return(cd_stat);
cr3 = 0x100 | ((cd_curfad>>16)&0xff);
cr4 = cd_curfad;
break; break;
case 0x0600: // end data transfer (TODO: needs to be worked on!) 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)) CDROM_LOG(("CD: Play Disc: start %x length %x\n", cd_curfad, fadstoplay))
cr2 = cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track; cr_standard_return(cd_stat);
cr3 = (0x100) | ((cd_curfad>>16)&0xff); // index of subcode in hi byte, frame address hirqreg |= (CMOK);
cr4 = cd_curfad & 0xffff;
hirqreg |= (CMOK|DRDY);
oddframe = 0; oddframe = 0;
in_buffer = 0; in_buffer = 0;
@ -832,9 +826,6 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
} }
else else
printf("disc seek with params %04x %04x\n",cr1,cr2); //Area 51 sets this up printf("disc seek with params %04x %04x\n",cr1,cr2); //Area 51 sets this up
cr3 = (temp>>16)&0xff;
cr4 = temp;
} }
else else
{ {
@ -854,16 +845,16 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
cur_track = 0xff; cur_track = 0xff;
cdda_stop_audio( machine.device( "cdda" ) ); //stop any pending CD-DA cdda_stop_audio( machine.device( "cdda" ) ); //stop any pending CD-DA
} }
cr3 = (cd_curfad>>16)&0xff;
cr4 = cd_curfad;
} }
hirqreg |= CMOK; hirqreg |= CMOK;
cr1 = cd_stat; cr_standard_return(cd_stat);
cr2 = cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track; break;
case 0x1200: // FFWD / REW
//cr1 bit 0 determines if this is a Fast Forward (0) or a Rewind (1) command
// ...
break; break;
case 0x2000: // Get SubCode Q / RW Channel 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); hirqreg |= (CMOK|ESEL);
cr_standard_return(cd_stat);
} }
break; break;
case 0x3200:
popmessage("Last Buffer Destination triggered, contact MAMEdev");
break;
case 0x4000: // Set Filter Range case 0x4000: // Set Filter Range
// cr1 low + cr2 = FAD0, cr3 low + cr4 = FAD1 // cr1 low + cr2 = FAD0, cr3 low + cr4 = FAD1
// cr3 hi = filter num. // 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].fad = ((cr1 & 0xff)<<16) | cr2;
filters[fnum].range = ((cr3 & 0xff)<<16) | cr4; filters[fnum].range = ((cr3 & 0xff)<<16) | cr4;
hirqreg |= (CMOK|ESEL|DRDY); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
} }
break; break;
@ -951,9 +945,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
filters[fnum].cival = cr4&0xff; filters[fnum].cival = cr4&0xff;
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
} }
break; 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)) CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine.describe_context(), fnum, mode))
hirqreg |= (CMOK|ESEL|DRDY); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
} }
break; break;
@ -999,9 +989,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
} }
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
} }
break; break;
@ -1031,34 +1019,32 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
if (freeblocks == 200) { onesectorstored = 0; } if (freeblocks == 200) { onesectorstored = 0; }
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
return; return;
} }
// ... // ...
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
cr2 = 0x4101; // ctrl/adr in hi byte, track # in low byte cr_standard_return(cd_stat);
cr3 = 0x0100|((cd_curfad>>16)&0xff);
cr4 = (cd_curfad & 0xffff);
break; break;
case 0x5000: // get Buffer Size case 0x5000: // get Buffer Size
cr1 = cd_stat; cr1 = cd_stat;
cr2 = freeblocks; cr2 = (freeblocks > 200) ? 200 : freeblocks;
if (cr2 > 200) cr2 = 200; // ???
cr3 = 0x1800; cr3 = 0x1800;
cr4 = 200; cr4 = 200;
CDROM_LOG(("CD: Get Buffer Size = %d\n", cr2)) CDROM_LOG(("CD: Get Buffer Size = %d\n", cr2))
hirqreg |= (CMOK|ESEL|DRDY); // DRDY is probably wrong hirqreg |= (CMOK);
break; break;
case 0x5100: // get # sectors used in a buffer case 0x5100: // get # sectors used in a buffer
{ {
UINT32 bufnum = cr3>>8; 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? */ /* TODO: Akumajou Dracula X reads 0 there, why? */
// is the partition empty? // is the partition empty?
if (partitions[bufnum].size == -1) if (partitions[bufnum].size == -1)
@ -1069,11 +1055,6 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
cr4 = partitions[bufnum].numblks; 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); hirqreg |= (CMOK|DRDY);
} }
break; break;
@ -1101,10 +1082,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
} }
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
cr1 = cd_stat; cr_standard_return(cd_stat);
cr2 = 0x4101; // CTRL/track
cr3 = (cd_curfad>>16)&0xff;
cr4 = (cd_curfad & 0xffff);
} }
break; break;
@ -1126,6 +1104,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
cr1 |= CD_STAT_REJECT & 0xff00; cr1 |= CD_STAT_REJECT & 0xff00;
hirqreg |= (CMOK|ESEL); hirqreg |= (CMOK|ESEL);
printf("Get sector info reject\n");
} }
else else
{ {
@ -1140,7 +1119,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x6000: // set sector length case 0x6000: // set sector length
CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context())) CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context()))
hirqreg |= (CMOK|ESEL|EFLS|SCDQ|DRDY); hirqreg |= (CMOK|ESEL);
switch (cr1 & 0xff) switch (cr1 & 0xff)
{ {
@ -1187,7 +1166,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: invalid buffer number\n"); printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = 0xff00; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1196,7 +1175,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: buffer is empty\n"); printf("CD: buffer is empty\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = 0xff00; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1212,6 +1191,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
transpart = &partitions[bufnum]; transpart = &partitions[bufnum];
cd_stat |= CD_STAT_TRANS; cd_stat |= CD_STAT_TRANS;
cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST|DRDY); hirqreg |= (CMOK|EHST|DRDY);
} }
break; break;
@ -1229,7 +1209,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: invalid buffer number\n"); printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = CD_STAT_REJECT; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1238,7 +1218,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: buffer is empty\n"); printf("CD: buffer is empty\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = CD_STAT_REJECT; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1259,6 +1239,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
partitions[bufnum].numblks -= sectnum; partitions[bufnum].numblks -= sectnum;
cd_stat &= ~CD_STAT_TRANS; cd_stat &= ~CD_STAT_TRANS;
cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
} }
break; break;
@ -1275,7 +1256,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: invalid buffer number\n"); printf("CD: invalid buffer number\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = 0xff00; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1284,7 +1265,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
{ {
printf("CD: buffer is empty\n"); printf("CD: buffer is empty\n");
/* TODO: why this is happening? */ /* TODO: why this is happening? */
//cd_stat = 0xff00; // ERROR cr_standard_return(CD_STAT_REJECT);
hirqreg |= (CMOK|EHST); hirqreg |= (CMOK|EHST);
return; return;
} }
@ -1300,6 +1281,7 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
transpart = &partitions[bufnum]; transpart = &partitions[bufnum];
cd_stat &= ~CD_STAT_TRANS; cd_stat &= ~CD_STAT_TRANS;
cr_standard_return(cd_stat);
hirqreg |= (CMOK|EHST|DRDY); hirqreg |= (CMOK|EHST|DRDY);
} }
break; break;
@ -1312,7 +1294,11 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
case 0x6700: // get copy error case 0x6700: // get copy error
CDROM_LOG(("%s:CD: Get copy error\n", machine.describe_context())) 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; break;
case 0x7000: // change directory case 0x7000: // change directory
@ -1326,26 +1312,30 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
temp = 0; temp = 0;
#endif #endif
read_new_dir(machine, temp); read_new_dir(machine, temp);
cr_standard_return(cd_stat);
break; break;
case 0x7100: // Read directory entry case 0x7100: // Read directory entry
CDROM_LOG(("%s:CD: Read Directory Entry\n", machine.describe_context())) CDROM_LOG(("%s:CD: Read Directory Entry\n", machine.describe_context()))
hirqreg |= (CMOK|EFLS); hirqreg |= (CMOK|EFLS);
temp = (cr3&0xff)<<16; // TODO!
temp |= cr4;
//temp = (cr3&0xff)<<16;
//temp |= cr4;
#if 0 #if 0
if(temp == 0xfffff8) /* TODO: Falcom Classics */ if(temp == 0xfffff8) /* TODO: Falcom Classics */
temp = 0; temp = 0;
#endif #endif
cr2 = 0x4101; // CTRL/track //cr2 = 0x4101; // CTRL/track
cr3 = (curdir[temp].firstfad>>16)&0xff; //cr3 = (curdir[temp].firstfad>>16)&0xff;
cr4 = (curdir[temp].firstfad&0xffff); //cr4 = (curdir[temp].firstfad&0xffff);
cr_standard_return(cd_stat);
break; break;
case 0x7200: // Get file system scope case 0x7200: // Get file system scope
CDROM_LOG(("CD: Get file system scope\n")) CDROM_LOG(("CD: Get file system scope\n"))
hirqreg |= (CMOK|DRDY); hirqreg |= (CMOK|EFLS);
cr2 = numfiles; // # of files in directory cr2 = numfiles; // # of files in directory
cr3 = 0x0100; // report directory held cr3 = 0x0100; // report directory held
cr4 = firstfile; // first file id cr4 = firstfile; // first file id

View File

@ -177,7 +177,7 @@ READ16_HANDLER( saturn_vdp1_regs_r )
case 0x12/2: case 0x12/2:
case 0x14/2: case 0x14/2:
case 0x16/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; break;
} }