mirror of
https://github.com/holub/mame
synced 2025-05-06 14:25:54 +03:00
Port from MESS, nw
This commit is contained in:
parent
6742160c25
commit
b6012aaa60
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user