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