trunk/src/mame/machine/megacdcd.c
| r19317 | r19318 | |
| 553 | 553 | } |
| 554 | 554 | |
| 555 | 555 | |
| 556 | |
| 557 | |
| 556 | 558 | UINT8 lc89510_temp_device::CDC_Reg_r(void) |
| 557 | 559 | { |
| 558 | 560 | int reg = CDC_REG0 & 0xF; |
| 559 | 561 | UINT8 ret = 0; |
| 562 | |
| 563 | |
| 560 | 564 | UINT16 decoderegs = 0x73F2; |
| 561 | 565 | |
| 562 | 566 | if ((decoderegs>>reg)&1) |
| 563 | 567 | CDC_DECODE |= (1 << reg); |
| 564 | 568 | |
| 565 | | //if (reg!=REG_R_STAT3) |
| 566 | | CDC_REG0 = (CDC_REG0 & 0xFFF0) | ((reg+1)&0xf); |
| 567 | 569 | |
| 570 | CDC_REG0 = (CDC_REG0 & 0xFFF0) | ((reg+1)&0xf); |
| 568 | 571 | |
| 569 | 572 | switch (reg) |
| 570 | 573 | { |
| 571 | 574 | case REG_R_COMIN: ret = 0/*COMIN*/; break; |
| 572 | 575 | case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT]; break; |
| 573 | 576 | case REG_R_DBCL: ret = LC8951RegistersW[REG_W_DBCL]; break; |
| 574 | | case REG_R_DBCH: ret = LC8951RegistersW[REG_W_DBCH]; break; |
| 577 | case REG_R_DBCH: |
| 578 | // LC8951RegistersR[REG_R_DBCH] &= 0x0F; // NeoCD? |
| 579 | // LC8951RegistersR[REG_R_DBCH] |= (LC8951RegistersR[REG_R_IFSTAT] & 0x40) ? 0x00 : 0xF0; // NeoCD? |
| 580 | ret = LC8951RegistersW[REG_W_DBCH]; break; |
| 575 | 581 | case REG_R_HEAD0: ret = LC8951RegistersR[REG_R_HEAD0]; break; |
| 576 | 582 | case REG_R_HEAD1: ret = LC8951RegistersR[REG_R_HEAD1]; break; |
| 577 | 583 | case REG_R_HEAD2: ret = LC8951RegistersR[REG_R_HEAD2]; break; |
| r19317 | r19318 | |
| 581 | 587 | case REG_R_WAL: ret = LC8951RegistersW[REG_W_WAL]; break; |
| 582 | 588 | case REG_R_WAH: ret = LC8951RegistersW[REG_W_WAH]; break; |
| 583 | 589 | case REG_R_STAT0: ret = LC8951RegistersR[REG_R_STAT0]; break; |
| 584 | | case REG_R_STAT1: ret = LC8951RegistersR[REG_R_STAT1]; break; |
| 590 | case REG_R_STAT1: ret = LC8951RegistersR[REG_R_STAT1]; |
| 591 | // LC8951RegistersR[REG_R_IFSTAT] |= 0x20; // NeoCD? // reset DECI |
| 592 | break; |
| 585 | 593 | case REG_R_STAT2: ret = LC8951RegistersR[REG_R_STAT2]; break; |
| 586 | 594 | case REG_R_STAT3: ret = LC8951RegistersR[REG_R_STAT3]; |
| 587 | 595 | |
| 588 | | LC8951RegistersR[REG_R_IFSTAT] |= 0x20; |
| 589 | | |
| 590 | | if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20)) |
| 596 | LC8951RegistersR[REG_R_IFSTAT] |= 0x20; // SegaCD? // reset DECI |
| 597 | if (!is_neoCD) |
| 591 | 598 | { |
| 592 | | if ((CDC_DECODE & decoderegs) == decoderegs) |
| 593 | | LC8951RegistersR[REG_R_STAT3] = 0x80; |
| 599 | if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20)) |
| 600 | { |
| 601 | if ((CDC_DECODE & decoderegs) == decoderegs) |
| 602 | LC8951RegistersR[REG_R_STAT3] = 0x80; |
| 603 | } |
| 594 | 604 | } |
| 595 | 605 | break; |
| 606 | |
| 596 | 607 | } |
| 597 | 608 | |
| 609 | |
| 598 | 610 | return ret; |
| 599 | 611 | } |
| 600 | 612 | |
| r19317 | r19318 | |
| 1157 | 1169 | if (CDD_TX[0]) { |
| 1158 | 1170 | INT32 sum = 0; |
| 1159 | 1171 | |
| 1160 | | printf("has command %02x\n", CDD_TX[0]); |
| 1172 | // printf("has command %02x\n", CDD_TX[0]); |
| 1161 | 1173 | |
| 1162 | 1174 | // bprintf(PRINT_NORMAL, _T(" - CD mechanism command receive completed : 0x")); |
| 1163 | 1175 | for (INT32 i = 0; i < 9; i++) { |
| r19317 | r19318 | |
| 1168 | 1180 | // bprintf(PRINT_NORMAL, _T(" (CS 0x%X, %s)\n"), CDD_TX[9], (sum == CDD_TX[9]) ? _T("OK") : _T("NG")); |
| 1169 | 1181 | if (sum == CDD_TX[9]) { |
| 1170 | 1182 | |
| 1171 | | printf("request to process command %02x\n", CDD_TX[0]); |
| 1183 | // printf("request to process command %02x\n", CDD_TX[0]); |
| 1172 | 1184 | |
| 1173 | 1185 | NeoCDProcessCommand(); |
| 1174 | 1186 | |
| r19317 | r19318 | |
| 1522 | 1534 | |
| 1523 | 1535 | UINT16 lc89510_temp_device::nff0016_r(void) { return nff0016; } |
| 1524 | 1536 | |
| 1525 | | UINT16 lc89510_temp_device::nLC8951_r(void) |
| 1526 | | { |
| 1527 | | int regno = CDC_REG0 & 0xf; |
| 1528 | | INT32 reg = LC8951RegistersR[regno]; |
| 1529 | 1537 | |
| 1530 | | switch (regno) { |
| 1531 | | case 0x03: // DBCH |
| 1532 | | LC8951RegistersR[REG_R_DBCH] &= 0x0F; |
| 1533 | | LC8951RegistersR[REG_R_DBCH] |= (LC8951RegistersR[REG_R_IFSTAT] & 0x40) ? 0x00 : 0xF0; |
| 1534 | | break; |
| 1535 | | case 0x0D: // STAT3 |
| 1536 | | LC8951RegistersR[REG_R_IFSTAT] |= 0x20; // reset DECI |
| 1537 | | // bprintf(PRINT_ERROR, _T(" - DECI (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 1538 | | break; |
| 1539 | | } |
| 1540 | | |
| 1541 | | CDC_REG0 = (regno + 1) & 0x0F; |
| 1542 | | return reg; |
| 1543 | | } |
| 1544 | | |
| 1545 | 1538 | void lc89510_temp_device::nLC8951_w(UINT16 byteValue) |
| 1546 | 1539 | { |
| 1547 | 1540 | int regno = CDC_REG0 & 0xf; |