trunk/src/mame/machine/stvcd.c
| r20469 | r20470 | |
| 225 | 225 | |
| 226 | 226 | static void cr_standard_return(UINT16 cur_status) |
| 227 | 227 | { |
| 228 | cd_stat |= CD_STAT_PERI; |
| 228 | 229 | cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf |
| 229 | 230 | cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track); // TODO: fix current track |
| 230 | 231 | cr3 = (get_track_index()<<8) | (cd_curfad>>16); //index & 0xff00 |
| r20469 | r20470 | |
| 281 | 282 | switch (cr1 & 0xff) |
| 282 | 283 | { |
| 283 | 284 | case 0: // get total session info / disc end |
| 284 | | cr3 = 0x0100 | tocbuf[(101*4)+1]; |
| 285 | | cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3]; |
| 286 | 285 | cd_stat = CD_STAT_PAUSE; |
| 287 | 286 | cr1 = cd_stat; |
| 288 | 287 | cr2 = 0; |
| 288 | cr3 = 0x0100 | tocbuf[(101*4)+1]; |
| 289 | cr4 = tocbuf[(101*4)+2]<<8 | tocbuf[(101*4)+3]; |
| 289 | 290 | break; |
| 290 | 291 | |
| 291 | 292 | case 1: // get total session info / disc start |
| 292 | | cr3 = 0x0100; // sessions in high byte, session start in lower |
| 293 | | cr4 = 0; |
| 294 | 293 | cd_stat = CD_STAT_PAUSE; |
| 295 | 294 | cr1 = cd_stat; |
| 296 | 295 | cr2 = 0; |
| 296 | cr3 = 0x0100; // sessions in high byte, session start in lower |
| 297 | cr4 = 0; |
| 297 | 298 | break; |
| 298 | 299 | |
| 299 | 300 | default: |
| r20469 | r20470 | |
| 999 | 1000 | |
| 1000 | 1001 | case 0x6000: // set sector length |
| 1001 | 1002 | CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context())) |
| 1002 | | hirqreg |= (CMOK|ESEL); |
| 1003 | 1003 | |
| 1004 | 1004 | switch (cr1 & 0xff) |
| 1005 | 1005 | { |
| r20469 | r20470 | |
| 1032 | 1032 | sectlenout = 2352; |
| 1033 | 1033 | break; |
| 1034 | 1034 | } |
| 1035 | hirqreg |= (CMOK|ESEL); |
| 1036 | cr_standard_return(cd_stat); |
| 1035 | 1037 | break; |
| 1036 | 1038 | |
| 1037 | 1039 | case 0x6100: // get sector data |
| r20469 | r20470 | |
| 1354 | 1356 | CDROM_LOG(("%s:CD: Verify copy protection\n", machine.describe_context())) |
| 1355 | 1357 | if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) |
| 1356 | 1358 | cd_stat = CD_STAT_PAUSE; |
| 1357 | | cr1 = cd_stat; // necessary to pass |
| 1358 | | cr2 = 0x4; |
| 1359 | // cr1 = cd_stat; // necessary to pass |
| 1360 | // cr2 = 0x4; |
| 1359 | 1361 | // hirqreg |= (CMOK|EFLS|CSCT); |
| 1360 | 1362 | sectorstore = 1; |
| 1361 | 1363 | hirqreg = 0xfc5; |
| 1364 | cr_standard_return(cd_stat); |
| 1362 | 1365 | break; |
| 1363 | 1366 | |
| 1364 | 1367 | case 0xe100: // get disc region |
| r20469 | r20470 | |
| 1367 | 1370 | cd_stat = CD_STAT_PAUSE; |
| 1368 | 1371 | cr1 = cd_stat; // necessary to pass |
| 1369 | 1372 | cr2 = 0x4; // (must return this value to pass bios checks) |
| 1373 | cr3 = 0; |
| 1374 | cr4 = 0; |
| 1370 | 1375 | hirqreg |= (CMOK); |
| 1376 | // cr_standard_return(cd_stat); |
| 1371 | 1377 | break; |
| 1372 | 1378 | |
| 1373 | 1379 | default: |
| r20469 | r20470 | |
| 1387 | 1393 | return; |
| 1388 | 1394 | } |
| 1389 | 1395 | |
| 1390 | | cd_stat |= CD_STAT_PERI; |
| 1396 | if(cd_stat & CD_STAT_PERI) |
| 1397 | { |
| 1398 | /* TODO: doesn't boot if a disk isn't in? */ |
| 1399 | //if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) |
| 1400 | hirqreg |= SCDQ; |
| 1391 | 1401 | |
| 1392 | | /* TODO: doesn't boot if a disk isn't in? */ |
| 1393 | | //if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) |
| 1394 | | hirqreg |= SCDQ; |
| 1395 | | |
| 1396 | | cr_standard_return(cd_stat); |
| 1402 | cr_standard_return(cd_stat); |
| 1403 | } |
| 1397 | 1404 | } |
| 1398 | 1405 | |
| 1399 | 1406 | TIMER_DEVICE_CALLBACK( stv_sector_cb ) |
| r20469 | r20470 | |
| 1422 | 1429 | cr3 = ('L'<<8) | 'O'; |
| 1423 | 1430 | cr4 = ('C'<<8) | 'K'; |
| 1424 | 1431 | cd_stat = CD_STAT_PAUSE; |
| 1432 | cd_stat |= CD_STAT_PERI; |
| 1425 | 1433 | cur_track = 0xff; |
| 1426 | 1434 | |
| 1427 | 1435 | if (curdir != (direntryT *)NULL) |
| r20469 | r20470 | |
| 1637 | 1645 | // CDROM_LOG(("RW CR4: %04x\n", cr4)) |
| 1638 | 1646 | //popmessage("%04x %04x %04x %04x",cr1,cr2,cr3,cr4); |
| 1639 | 1647 | cmd_pending = 0; |
| 1648 | cd_stat |= CD_STAT_PERI; |
| 1640 | 1649 | return cr4; |
| 1641 | 1650 | |
| 1642 | 1651 | case 0x8000: |