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)
{
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

View File

@ -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;
}