trunk/src/mame/machine/megacdcd.c
| r19305 | r19306 | |
| 322 | 322 | SCD_CURLBA = msf_to_lba(msf)-150; |
| 323 | 323 | UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs; |
| 324 | 324 | SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1; |
| 325 | | CDC_UpdateHEAD(); |
| 325 | LC8951UpdateHeader(); |
| 326 | 326 | SCD_STATUS = CDD_PLAYINGCDDA; |
| 327 | 327 | CDD_STATUS = 0x0102; |
| 328 | 328 | set_data_audio_mode(); |
| r19305 | r19306 | |
| 340 | 340 | UINT32 msf = getmsf_from_regs(); |
| 341 | 341 | SCD_CURLBA = msf_to_lba(msf)-150; |
| 342 | 342 | SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1; |
| 343 | | CDC_UpdateHEAD(); |
| 343 | LC8951UpdateHeader(); |
| 344 | 344 | STOP_CDC_READ |
| 345 | 345 | SCD_STATUS = CDD_READY; |
| 346 | 346 | CDD_STATUS = 0x0200; |
| r19305 | r19306 | |
| 437 | 437 | void lc89510_temp_device::CDC_Reset(void) |
| 438 | 438 | { |
| 439 | 439 | memset(CDC_BUFFER, 0x00, ((16 * 1024 * 2) + SECTOR_SIZE)); |
| 440 | | CDC_UpdateHEAD(); |
| 440 | LC8951UpdateHeader(); |
| 441 | 441 | |
| 442 | | CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = CDC_SBOUT = CDC_IFCTRL = CDC_CTRLB0 = CDC_CTRLB1 = |
| 443 | | CDC_CTRLB2 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = CDC_STATB0 = CDC_STATB1 = CDC_STATB2 = CDC_DECODE = 0; |
| 442 | CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = LC8951RegistersW[REG_W_SBOUT] = LC8951RegistersW[REG_W_IFCTRL] = LC8951RegistersW[REG_W_CTRL0] = LC8951RegistersW[REG_W_CTRL1] = |
| 443 | LC8951RegistersW[REG_W_CTRL2] = LC8951RegistersR[REG_R_HEAD1] = LC8951RegistersR[REG_R_HEAD2] = LC8951RegistersR[REG_R_HEAD3] = LC8951RegistersR[REG_R_STAT0] = LC8951RegistersR[REG_R_STAT1] = LC8951RegistersR[REG_R_STAT2] = CDC_DECODE = 0; |
| 444 | 444 | |
| 445 | | CDC_IFSTAT = 0xFF; |
| 445 | LC8951RegistersR[REG_R_IFSTAT] = 0xFF; |
| 446 | 446 | CDC_WA = SECTOR_SIZE * 2; |
| 447 | | CDC_HEADB0 = 0x01; |
| 448 | | CDC_STATB3 = 0x80; |
| 447 | LC8951RegistersR[REG_R_HEAD0] = 0x01; |
| 448 | LC8951RegistersR[REG_R_STAT3] = 0x80; |
| 449 | 449 | } |
| 450 | 450 | |
| 451 | 451 | |
| r19305 | r19306 | |
| 462 | 462 | STOP_CDC_DMA |
| 463 | 463 | CDC_REG0 |= 0x8000; |
| 464 | 464 | CDC_REG0 &= ~0x4000; |
| 465 | | CDC_IFSTAT |= 0x08; |
| 465 | LC8951RegistersR[REG_R_IFSTAT] |= 0x08; |
| 466 | 466 | |
| 467 | | if (CDC_IFCTRL & 0x40) |
| 467 | if (LC8951RegistersW[REG_W_IFCTRL] & 0x40) |
| 468 | 468 | { |
| 469 | | CDC_IFSTAT &= ~0x40; |
| 469 | LC8951RegistersR[REG_R_IFSTAT] &= ~0x40; |
| 470 | 470 | CHECK_SCD_LV5_INTERRUPT |
| 471 | 471 | } |
| 472 | 472 | } |
| r19305 | r19306 | |
| 557 | 557 | switch (reg) |
| 558 | 558 | { |
| 559 | 559 | case REG_R_COMIN: ret = 0/*COMIN*/; break; |
| 560 | | case REG_R_IFSTAT: ret = CDC_IFSTAT; break; |
| 560 | case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT]; break; |
| 561 | 561 | case REG_R_DBCL: ret = CDC_DMACNT & 0xff; break; |
| 562 | 562 | case REG_R_DBCH: ret = (CDC_DMACNT >>8) & 0xff; break; |
| 563 | | case REG_R_HEAD0: ret = CDC_HEADB0; break; |
| 564 | | case REG_R_HEAD1: ret = CDC_HEADB1; break; |
| 565 | | case REG_R_HEAD2: ret = CDC_HEADB2; break; |
| 566 | | case REG_R_HEAD3: ret = CDC_HEADB3; break; |
| 563 | case REG_R_HEAD0: ret = LC8951RegistersR[REG_R_HEAD0]; break; |
| 564 | case REG_R_HEAD1: ret = LC8951RegistersR[REG_R_HEAD1]; break; |
| 565 | case REG_R_HEAD2: ret = LC8951RegistersR[REG_R_HEAD2]; break; |
| 566 | case REG_R_HEAD3: ret = LC8951RegistersR[REG_R_HEAD3]; break; |
| 567 | 567 | case REG_R_PTL: ret = CDC_PT & 0xff; break; |
| 568 | 568 | case REG_R_PTH: ret = (CDC_PT >>8) & 0xff; break; |
| 569 | 569 | case REG_R_WAL: ret = CDC_WA & 0xff; break; |
| 570 | 570 | case REG_R_WAH: ret = (CDC_WA >>8) & 0xff; break; |
| 571 | | case REG_R_STAT0: ret = CDC_STATB0; break; |
| 572 | | case REG_R_STAT1: ret = CDC_STATB1; break; |
| 573 | | case REG_R_STAT2: ret = CDC_STATB2; break; |
| 574 | | case REG_R_STAT3: ret = CDC_STATB3; |
| 571 | case REG_R_STAT0: ret = LC8951RegistersR[REG_R_STAT0]; break; |
| 572 | case REG_R_STAT1: ret = LC8951RegistersR[REG_R_STAT1]; break; |
| 573 | case REG_R_STAT2: ret = LC8951RegistersR[REG_R_STAT2]; break; |
| 574 | case REG_R_STAT3: ret = LC8951RegistersR[REG_R_STAT3]; |
| 575 | 575 | |
| 576 | | CDC_IFSTAT |= 0x20; |
| 576 | LC8951RegistersR[REG_R_IFSTAT] |= 0x20; |
| 577 | 577 | |
| 578 | 578 | // ?? |
| 579 | | if ((CDC_CTRLB0 & 0x80) && (CDC_IFCTRL & 0x20)) |
| 579 | if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20)) |
| 580 | 580 | { |
| 581 | 581 | if ((CDC_DECODE & decoderegs) == decoderegs) |
| 582 | | CDC_STATB3 = 0x80; |
| 582 | LC8951RegistersR[REG_R_STAT3] = 0x80; |
| 583 | 583 | } |
| 584 | 584 | break; |
| 585 | 585 | } |
| r19305 | r19306 | |
| 599 | 599 | switch (reg) |
| 600 | 600 | { |
| 601 | 601 | case REG_W_SBOUT: |
| 602 | | CDC_SBOUT = data; |
| 602 | LC8951RegistersW[REG_W_SBOUT] = data; |
| 603 | 603 | break; |
| 604 | 604 | |
| 605 | 605 | case REG_W_IFCTRL: |
| 606 | | CDC_IFCTRL = data; |
| 606 | LC8951RegistersW[REG_W_IFCTRL] = data; |
| 607 | 607 | |
| 608 | | if (!(CDC_IFCTRL & 0x02)) |
| 608 | if (!(LC8951RegistersW[REG_W_IFCTRL] & 0x02)) |
| 609 | 609 | { |
| 610 | 610 | CDC_DMACNT = 0; |
| 611 | 611 | STOP_CDC_DMA; |
| 612 | | CDC_IFSTAT |= 0x08; |
| 612 | LC8951RegistersR[REG_R_IFSTAT] |= 0x08; |
| 613 | 613 | } |
| 614 | 614 | break; |
| 615 | 615 | |
| r19305 | r19306 | |
| 619 | 619 | case REG_W_DACH: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0xff00) | (data & 0x00ff) << 8; break; |
| 620 | 620 | |
| 621 | 621 | case REG_W_DTTRG: |
| 622 | | if (CDC_IFCTRL & 0x02) |
| 622 | if (LC8951RegistersW[REG_W_IFCTRL] & 0x02) |
| 623 | 623 | { |
| 624 | | CDC_IFSTAT &= ~0x08; |
| 624 | LC8951RegistersR[REG_R_IFSTAT] &= ~0x08; |
| 625 | 625 | SET_CDC_DMA; |
| 626 | 626 | CDC_REG0 &= ~0x8000; |
| 627 | 627 | } |
| 628 | 628 | break; |
| 629 | 629 | |
| 630 | | case REG_W_DTACK: CDC_IFSTAT |= 0x40; break; |
| 630 | case REG_W_DTACK: LC8951RegistersR[REG_R_IFSTAT] |= 0x40; break; |
| 631 | 631 | case REG_W_WAL: CDC_WA = (CDC_WA &~ 0x00ff) | (data & 0x00ff) << 0; break; |
| 632 | 632 | case REG_W_WAH: CDC_WA = (CDC_WA &~ 0xff00) | (data & 0x00ff) << 8; break; |
| 633 | | case REG_W_CTRL0: CDC_CTRLB0 = data; break; |
| 634 | | case REG_W_CTRL1: CDC_CTRLB1 = data; break; |
| 633 | case REG_W_CTRL0: LC8951RegistersW[REG_W_CTRL0] = data; break; |
| 634 | case REG_W_CTRL1: LC8951RegistersW[REG_W_CTRL1] = data; break; |
| 635 | 635 | case REG_W_PTL: CDC_PT = (CDC_PT &~ 0x00ff) | (data & 0x00ff) << 0; break; |
| 636 | 636 | case REG_W_PTH: CDC_PT = (CDC_PT &~ 0xff00) | (data & 0x00ff) << 8; break; |
| 637 | | case REG_W_CTRL2: CDC_CTRLB2 = data; break; |
| 637 | case REG_W_CTRL2: LC8951RegistersW[REG_W_CTRL2] = data; break; |
| 638 | 638 | case REG_W_RESET: CDC_Reset(); break; |
| 639 | 639 | } |
| 640 | 640 | } |
| r19305 | r19306 | |
| 1465 | 1465 | } |
| 1466 | 1466 | |
| 1467 | 1467 | |
| 1468 | | void lc89510_temp_device::CDC_UpdateHEAD(void) // segacd |
| 1469 | | { |
| 1470 | | if (CDC_CTRLB1 & 0x01) |
| 1471 | | { |
| 1472 | | CDC_HEADB0 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = 0x00; |
| 1473 | | } |
| 1474 | | else |
| 1475 | | { |
| 1476 | | UINT32 msf = lba_to_msf_alt(SCD_CURLBA+150); |
| 1477 | | CDC_HEADB0 = to_bcd (((msf & 0x00ff0000)>>16), true); |
| 1478 | | CDC_HEADB1 = to_bcd (((msf & 0x0000ff00)>>8), true); |
| 1479 | | CDC_HEADB2 = to_bcd (((msf & 0x000000ff)>>0), true); |
| 1480 | | CDC_HEADB3 = 0x01; |
| 1481 | | } |
| 1482 | | } |
| 1483 | | |
| 1484 | 1468 | void lc89510_temp_device::LC8951UpdateHeader() // neocd |
| 1485 | 1469 | { |
| 1486 | 1470 | |
| r19305 | r19306 | |
| 1706 | 1690 | |
| 1707 | 1691 | void lc89510_temp_device::scd_ctrl_checks(running_machine& machine) |
| 1708 | 1692 | { |
| 1709 | | CDC_STATB0 = 0x80; |
| 1693 | LC8951RegistersR[REG_R_STAT0] = 0x80; |
| 1710 | 1694 | |
| 1711 | | (CDC_CTRLB0 & 0x10) ? (CDC_STATB2 = CDC_CTRLB1 & 0x08) : (CDC_STATB2 = CDC_CTRLB1 & 0x0C); |
| 1712 | | (CDC_CTRLB0 & 0x02) ? (CDC_STATB3 = 0x20) : (CDC_STATB3 = 0x00); |
| 1695 | (LC8951RegistersW[REG_W_CTRL0] & 0x10) ? (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x08) : (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x0C); |
| 1696 | (LC8951RegistersW[REG_W_CTRL0] & 0x02) ? (LC8951RegistersR[REG_R_STAT3] = 0x20) : (LC8951RegistersR[REG_R_STAT3] = 0x00); |
| 1713 | 1697 | |
| 1714 | | if (CDC_IFCTRL & 0x20) |
| 1698 | if (LC8951RegistersW[REG_W_IFCTRL] & 0x20) |
| 1715 | 1699 | { |
| 1716 | 1700 | CHECK_SCD_LV5_INTERRUPT |
| 1717 | | CDC_IFSTAT &= ~0x20; |
| 1701 | LC8951RegistersR[REG_R_IFSTAT] &= ~0x20; |
| 1718 | 1702 | CDC_DECODE = 0; |
| 1719 | 1703 | } |
| 1720 | 1704 | } |
| r19305 | r19306 | |
| 1738 | 1722 | if (data_track) |
| 1739 | 1723 | cdrom_read_data(segacd.cd, SCD_CURLBA, SCD_BUFFER, CD_TRACK_MODE1); |
| 1740 | 1724 | |
| 1741 | | CDC_UpdateHEAD(); |
| 1725 | LC8951UpdateHeader(); |
| 1742 | 1726 | |
| 1743 | 1727 | if (!data_track) |
| 1744 | 1728 | { |
| 1745 | 1729 | scd_advance_current_readpos(); |
| 1746 | 1730 | } |
| 1747 | 1731 | |
| 1748 | | if (CDC_CTRLB0 & 0x80) |
| 1732 | if (LC8951RegistersW[REG_W_CTRL0] & 0x80) |
| 1749 | 1733 | { |
| 1750 | | if (CDC_CTRLB0 & 0x04) |
| 1734 | if (LC8951RegistersW[REG_W_CTRL0] & 0x04) |
| 1751 | 1735 | { |
| 1752 | 1736 | if (data_track) |
| 1753 | 1737 | { |
| 1754 | 1738 | scd_advance_current_readpos(); |
| 1755 | 1739 | |
| 1756 | 1740 | memcpy(&CDC_BUFFER[CDC_PT + 4], SCD_BUFFER, 2048); |
| 1757 | | CDC_BUFFER[CDC_PT+0] = CDC_HEADB0; |
| 1758 | | CDC_BUFFER[CDC_PT+1] = CDC_HEADB1; |
| 1759 | | CDC_BUFFER[CDC_PT+2] = CDC_HEADB2; |
| 1760 | | CDC_BUFFER[CDC_PT+3] = CDC_HEADB3; |
| 1741 | CDC_BUFFER[CDC_PT+0] = LC8951RegistersR[REG_R_HEAD0]; |
| 1742 | CDC_BUFFER[CDC_PT+1] = LC8951RegistersR[REG_R_HEAD1]; |
| 1743 | CDC_BUFFER[CDC_PT+2] = LC8951RegistersR[REG_R_HEAD2]; |
| 1744 | CDC_BUFFER[CDC_PT+3] = LC8951RegistersR[REG_R_HEAD3]; |
| 1761 | 1745 | } |
| 1762 | 1746 | else |
| 1763 | 1747 | { |