src/mess/drivers/fmtowns.c
| r6482 | r6483 | |
| 1410 | 1410 | towns_cd.cmd_status_ptr = 0; |
| 1411 | 1411 | towns_cd.extra_status = 0; |
| 1412 | 1412 | towns_cd.cmd_status[0] = 0x00; |
| 1413 | | towns_cd.cmd_status[1] = 0x00; |
| 1413 | towns_cd.cmd_status[1] = 0x01; // CD-ROM/CD-DA status? bit 1 = error type(HE or CDR) |
| 1414 | 1414 | towns_cd.cmd_status[2] = 0x00; |
| 1415 | 1415 | towns_cd.cmd_status[3] = 0x00; |
| 1416 | 1416 | towns_cdrom_set_irq(device->machine,TOWNS_CD_IRQ_MPU,1); |
| r6482 | r6483 | |
| 1431 | 1431 | } |
| 1432 | 1432 | logerror("CD: Command 0x81: set state (CDDASET)\n"); |
| 1433 | 1433 | break; |
| 1434 | case 0x84: // Stop audio track (?) |
| 1435 | if(towns_cd.command & 0x20) |
| 1436 | { |
| 1437 | towns_cd.status |= 0x02; // status read request |
| 1438 | towns_cd.cmd_status_ptr = 0; |
| 1439 | towns_cd.extra_status = 0; |
| 1440 | towns_cd.cmd_status[0] = 0x00; |
| 1441 | towns_cd.cmd_status[1] = 0x00; |
| 1442 | towns_cd.cmd_status[2] = 0x00; |
| 1443 | towns_cd.cmd_status[3] = 0x00; |
| 1444 | towns_cdrom_set_irq(device->machine,TOWNS_CD_IRQ_MPU,1); |
| 1445 | } |
| 1446 | logerror("CD: Command 0x84: Stop audio track(?)\n"); |
| 1447 | break; |
| 1434 | 1448 | default: |
| 1435 | 1449 | towns_cd.status |= 0x02; // status read request |
| 1436 | 1450 | towns_cd.cmd_status_ptr = 0; |
| r6482 | r6483 | |
| 1455 | 1469 | static READ8_HANDLER(towns_cdrom_r) |
| 1456 | 1470 | { |
| 1457 | 1471 | UINT32 addr = 0; |
| 1458 | | |
| 1472 | UINT8 ret = 0; |
| 1459 | 1473 | switch(offset) |
| 1460 | 1474 | { |
| 1461 | 1475 | case 0x00: // status |
| 1462 | 1476 | //logerror("CD: status read, returning %02x\n",towns_cd.status); |
| 1463 | 1477 | return towns_cd.status; |
| 1464 | 1478 | case 0x01: // command status |
| 1465 | | if(towns_cd.cmd_status_ptr > 3) |
| 1479 | if(towns_cd.cmd_status_ptr >= 3) |
| 1466 | 1480 | { |
| 1467 | | towns_cd.cmd_status_ptr = 0; |
| 1468 | 1481 | towns_cd.status &= ~0x02; |
| 1469 | 1482 | // check for more status bytes |
| 1470 | 1483 | if(towns_cd.extra_status != 0) |
| r6482 | r6483 | |
| 1525 | 1538 | break; |
| 1526 | 1539 | case 6: // st1/2/3 = address of track 0xaa? (BCD) |
| 1527 | 1540 | addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),0xaa); |
| 1528 | | addr = dword_to_bcd(addr); |
| 1541 | addr = lba_to_msf(addr); |
| 1529 | 1542 | towns_cd.cmd_status[0] = 0x17; |
| 1530 | 1543 | towns_cd.cmd_status[1] = (addr & 0xff0000) >> 16; |
| 1531 | 1544 | towns_cd.cmd_status[2] = (addr & 0x00ff00) >> 8; |
| r6482 | r6483 | |
| 1536 | 1549 | if(towns_cd.extra_status & 0x01) |
| 1537 | 1550 | { |
| 1538 | 1551 | towns_cd.cmd_status[0] = 0x16; |
| 1539 | | towns_cd.cmd_status[1] = cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-2); |
| 1540 | | towns_cd.cmd_status[2] = (towns_cd.extra_status/2)-2; |
| 1552 | towns_cd.cmd_status[1] = (cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3) & 0x0f) << 4; |
| 1553 | towns_cd.cmd_status[1] |= (cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3) & 0xf0) >> 4; |
| 1554 | towns_cd.cmd_status[2] = (towns_cd.extra_status/2)-3; |
| 1541 | 1555 | towns_cd.cmd_status[3] = 0x00; |
| 1542 | 1556 | towns_cd.extra_status++; |
| 1543 | 1557 | } |
| 1544 | 1558 | else |
| 1545 | 1559 | { |
| 1546 | | addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3); |
| 1547 | | addr = dword_to_bcd(addr); |
| 1560 | addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-4); |
| 1561 | addr = lba_to_msf(addr); |
| 1548 | 1562 | towns_cd.cmd_status[0] = 0x17; |
| 1549 | 1563 | towns_cd.cmd_status[1] = (addr & 0xff0000) >> 16; |
| 1550 | 1564 | towns_cd.cmd_status[2] = (addr & 0x00ff00) >> 8; |
| r6482 | r6483 | |
| 1552 | 1566 | if(((towns_cd.extra_status/2)-3) >= cdrom_get_last_track(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")))) |
| 1553 | 1567 | { |
| 1554 | 1568 | towns_cd.extra_status = 0; |
| 1555 | | towns_cd.status &= ~0x02; |
| 1556 | 1569 | } |
| 1557 | 1570 | else |
| 1558 | 1571 | towns_cd.extra_status++; |
| r6482 | r6483 | |
| 1560 | 1573 | break; |
| 1561 | 1574 | } |
| 1562 | 1575 | break; |
| 1576 | case 0x84: |
| 1577 | towns_cd.cmd_status[0] = 0x07; |
| 1578 | towns_cd.cmd_status[1] = 0x00; |
| 1579 | towns_cd.cmd_status[2] = 0x00; |
| 1580 | towns_cd.cmd_status[3] = 0x00; |
| 1581 | towns_cd.extra_status = 0; |
| 1582 | break; |
| 1563 | 1583 | } |
| 1564 | 1584 | } |
| 1565 | 1585 | } |
| 1566 | 1586 | logerror("CD: reading command status port, returning %02x\n",towns_cd.cmd_status[towns_cd.cmd_status_ptr]); |
| 1567 | | return towns_cd.cmd_status[towns_cd.cmd_status_ptr++]; |
| 1587 | ret = towns_cd.cmd_status[towns_cd.cmd_status_ptr++]; |
| 1588 | if(towns_cd.cmd_status_ptr > 3) |
| 1589 | towns_cd.cmd_status_ptr = 0; |
| 1590 | return ret; |
| 1568 | 1591 | default: |
| 1569 | 1592 | return 0x00; |
| 1570 | 1593 | } |