trunk/src/mame/machine/megacdcd.c
| r19321 | r19322 | |
| 33 | 33 | nNeoCDIRQVector = 0; |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | enum CDEmuStatusValue { idle = 0, reading, playing, paused, seeking, fastforward, fastreverse }; |
| 37 | CDEmuStatusValue CDEmuStatus; |
| 36 | 38 | |
| 39 | static inline CDEmuStatusValue CDEmuGetStatus() |
| 40 | { |
| 41 | // printf("CDEmuGetStatus\n"); |
| 42 | return CDEmuStatus; |
| 43 | } |
| 44 | |
| 45 | |
| 37 | 46 | void lc89510_temp_device::set_CDC_Do_DMA(device_t &device,segacd_dma_delegate new_segacd_dma_callback) |
| 38 | 47 | { |
| 39 | 48 | lc89510_temp_device &dev = downcast<lc89510_temp_device &>(device); |
| r19321 | r19322 | |
| 164 | 173 | CDD_STATUS = 0x0000; |
| 165 | 174 | SET_CDD_DATA_MODE |
| 166 | 175 | cdda_stop_audio( m_cdda ); //stop any pending CD-DA |
| 176 | |
| 177 | //neocd |
| 178 | NeoCDAssyStatus = 0x0E; |
| 179 | bNeoCDLoadSector = false; |
| 180 | |
| 181 | |
| 167 | 182 | } |
| 168 | 183 | |
| 169 | 184 | |
| r19321 | r19322 | |
| 325 | 340 | if(!(CURRENT_TRACK_IS_DATA)) |
| 326 | 341 | cdda_start_audio( m_cdda, SCD_CURLBA, end_msf - SCD_CURLBA ); |
| 327 | 342 | SET_CDC_READ |
| 343 | |
| 344 | // neocd |
| 345 | CDEmuStatus = seeking; |
| 346 | NeoCDAssyStatus = 1; |
| 347 | bNeoCDLoadSector = true; |
| 348 | |
| 328 | 349 | } |
| 329 | 350 | |
| 330 | 351 | |
| r19321 | r19322 | |
| 353 | 374 | //segacd.current_frame = cdda_get_audio_lba( machine.device( "cdda" ) ); |
| 354 | 375 | //if(!(CURRENT_TRACK_IS_DATA)) |
| 355 | 376 | cdda_pause_audio( m_cdda, 1 ); |
| 377 | |
| 378 | |
| 379 | NeoCDAssyStatus = 4; |
| 380 | bNeoCDLoadSector = false; |
| 381 | |
| 382 | |
| 356 | 383 | } |
| 357 | 384 | |
| 358 | 385 | void lc89510_temp_device::CDD_Resume(running_machine &machine) |
| r19321 | r19322 | |
| 367 | 394 | SET_CDC_READ |
| 368 | 395 | //if(!(CURRENT_TRACK_IS_DATA)) |
| 369 | 396 | cdda_pause_audio( m_cdda, 0 ); |
| 397 | |
| 398 | NeoCDAssyStatus = 1; |
| 399 | bNeoCDLoadSector = true; |
| 370 | 400 | } |
| 371 | 401 | |
| 372 | 402 | |
| r19321 | r19322 | |
| 411 | 441 | { |
| 412 | 442 | CLEAR_CDD_RESULT |
| 413 | 443 | CDD_STATUS = SCD_STATUS; |
| 444 | |
| 445 | |
| 446 | NeoCDAssyStatus = 9; |
| 447 | bNeoCDLoadSector = false; |
| 414 | 448 | } |
| 415 | 449 | |
| 416 | 450 | |
| r19321 | r19322 | |
| 454 | 488 | CDC_REG0 = CDC_REG1 = SCD_STATUS_CDC = CDD_DONE = 0; |
| 455 | 489 | } |
| 456 | 490 | |
| 457 | | void lc89510_temp_device::CDC_End_Transfer(running_machine& machine) |
| 458 | | { |
| 459 | | STOP_CDC_DMA |
| 460 | | CDC_REG0 |= 0x8000; |
| 461 | | CDC_REG0 &= ~0x4000; |
| 462 | | LC8951RegistersR[REG_R_IFSTAT] |= 0x08; |
| 463 | 491 | |
| 464 | | if (LC8951RegistersW[REG_W_IFCTRL] & 0x40) |
| 465 | | { |
| 466 | | LC8951RegistersR[REG_R_IFSTAT] &= ~0x40; |
| 467 | | CHECK_SCD_LV5_INTERRUPT |
| 468 | | } |
| 469 | | } |
| 470 | | |
| 471 | | |
| 472 | 492 | void lc89510_temp_device::CDC_Do_DMA(running_machine& machine, int rate) |
| 473 | 493 | { |
| 474 | 494 | UINT32 length; |
| r19321 | r19322 | |
| 717 | 737 | "Handle TOC", // 2 |
| 718 | 738 | "Play", // 3 |
| 719 | 739 | "Seek", // 4 |
| 720 | | "<undefined>", // 5 |
| 740 | "<undefined> (5)", // 5 |
| 721 | 741 | "Pause", // 6 |
| 722 | 742 | "Resume", // 7 |
| 723 | 743 | "FF", // 8 |
| 724 | 744 | "RWD", // 9 |
| 725 | 745 | "INIT", // A |
| 726 | | "<undefined>", // B |
| 746 | "<undefined> (b)", // B |
| 727 | 747 | "Close Tray", // C |
| 728 | 748 | "Open Tray", // D |
| 729 | | "<undefined>", // E |
| 730 | | "<undefined>" // F |
| 749 | "<undefined> (e)", // E |
| 750 | "<undefined> (f)" // F |
| 731 | 751 | }; |
| 732 | 752 | |
| 733 | 753 | void lc89510_temp_device::CDD_Import(running_machine& machine) |
| r19321 | r19322 | |
| 1015 | 1035 | /* Neo CD */ |
| 1016 | 1036 | |
| 1017 | 1037 | |
| 1018 | | enum CDEmuStatusValue { idle = 0, reading, playing, paused, seeking, fastforward, fastreverse }; |
| 1019 | | CDEmuStatusValue CDEmuStatus; |
| 1020 | 1038 | |
| 1021 | | static inline CDEmuStatusValue CDEmuGetStatus() |
| 1022 | | { |
| 1023 | | // printf("CDEmuGetStatus\n"); |
| 1024 | | return CDEmuStatus; |
| 1025 | | } |
| 1026 | 1039 | |
| 1027 | 1040 | |
| 1028 | | static void CDEmuStartRead() |
| 1029 | | { |
| 1030 | | printf("CDEmuStartRead\n"); |
| 1031 | | CDEmuStatus = seeking; |
| 1032 | | } |
| 1033 | 1041 | |
| 1034 | | static void CDEmuPause() |
| 1035 | | { |
| 1036 | | printf("CDEmuPause\n"); |
| 1037 | | CDEmuStatus = paused; |
| 1038 | | } |
| 1039 | 1042 | |
| 1040 | | static INT32 CDEmuStop() |
| 1041 | | { |
| 1042 | | printf("CDEmuStop\n"); |
| 1043 | | return 1; |
| 1044 | | } |
| 1045 | | |
| 1046 | | static INT32 CDEmuPlay(UINT8 M, UINT8 S, UINT8 F) |
| 1047 | | { |
| 1048 | | printf("CDEmuPlay\n"); |
| 1049 | | return 1; |
| 1050 | | } |
| 1051 | | |
| 1052 | 1043 | INT32 lc89510_temp_device::CDEmuLoadSector(INT32 LBA, char* pBuffer) |
| 1053 | 1044 | { |
| 1054 | 1045 | // printf("CDEmuLoadSector %d\n", LBA); |
| r19321 | r19322 | |
| 1085 | 1076 | |
| 1086 | 1077 | void lc89510_temp_device::NeoCDProcessCommand() |
| 1087 | 1078 | { |
| 1088 | | memset(CDD_RX, 0, sizeof(CDD_RX)); |
| 1089 | | |
| 1090 | | if (CDD_TX[0]) { |
| 1091 | | CDD_RX[1] = 15; |
| 1092 | | } |
| 1093 | | |
| 1094 | | switch (CDD_TX[0]) { |
| 1095 | | case CMD_STATUS: // CDD_GetStatus(); |
| 1096 | | break; |
| 1097 | | case CMD_STOPALL: // CDD_Stop(machine); |
| 1098 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1099 | | CDEmuStop(); |
| 1100 | | |
| 1101 | | NeoCDAssyStatus = 0x0E; |
| 1102 | | bNeoCDLoadSector = false; |
| 1103 | | break; |
| 1104 | | case CMD_GETTOC: // CDD_Handle_TOC_Commands(); |
| 1105 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1106 | | |
| 1107 | | CDD_Handle_TOC_Commands(); |
| 1108 | | CDD_Export(); |
| 1109 | | break; |
| 1110 | | |
| 1111 | | |
| 1112 | | case CMD_READ: { // CDD_Play(machine); |
| 1113 | | |
| 1114 | | if (LC8951RegistersW[REG_W_CTRL0] & 4) { |
| 1115 | | |
| 1116 | | if (CDEmuGetStatus() == playing) { |
| 1117 | | //bprintf(PRINT_ERROR, _T("*** Switching CD mode to CD-ROM while in audio mode!(PC: 0x%06X)\n"), SekGetPC(-1)); |
| 1118 | | } |
| 1119 | | |
| 1120 | | SCD_CURLBA = CDD_TX[2] * (10 * CD_FRAMES_MINUTE); |
| 1121 | | SCD_CURLBA += CDD_TX[3] * ( 1 * CD_FRAMES_MINUTE); |
| 1122 | | SCD_CURLBA += CDD_TX[4] * (10 * CD_FRAMES_SECOND); |
| 1123 | | SCD_CURLBA += CDD_TX[5] * ( 1 * CD_FRAMES_SECOND); |
| 1124 | | SCD_CURLBA += CDD_TX[6] * (10 ); |
| 1125 | | SCD_CURLBA += CDD_TX[7] * ( 1 ); |
| 1126 | | |
| 1127 | | SCD_CURLBA -= CD_FRAMES_PREGAP; |
| 1128 | | |
| 1129 | | CDEmuStartRead(); |
| 1130 | | // LC8951RegistersR[REG_R_IFSTAT] |= 0x20; |
| 1131 | | } else { |
| 1132 | | |
| 1133 | | if (CDEmuGetStatus() == reading) { |
| 1134 | | //bprintf(PRINT_ERROR, _T("*** Switching CD mode to audio while in CD-ROM mode!(PC: 0x%06X)\n"), SekGetPC(-1)); |
| 1135 | | } |
| 1136 | | |
| 1137 | | CDEmuPlay((CDD_TX[2] * 10) + CDD_TX[3], (CDD_TX[4] * 10) + CDD_TX[5], (CDD_TX[6] * 10) + CDD_TX[7]); |
| 1138 | | } |
| 1139 | | |
| 1140 | | NeoCDAssyStatus = 1; |
| 1141 | | bNeoCDLoadSector = true; |
| 1142 | | |
| 1143 | | break; |
| 1144 | | } |
| 1145 | | case CMD_SEEK: // CDD_Seek(); |
| 1146 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1147 | | CDEmuPause(); |
| 1148 | | break; |
| 1149 | | case 5: |
| 1150 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1151 | | // NeoCDAssyStatus = 9; |
| 1152 | | // bNeoCDLoadSector = false; |
| 1153 | | break; |
| 1154 | | |
| 1155 | | case CMD_STOP: // CDD_Pause(machine); |
| 1156 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1157 | | NeoCDAssyStatus = 4; |
| 1158 | | bNeoCDLoadSector = false; |
| 1159 | | break; |
| 1160 | | case CMD_RESUME: // CDD_Resume(machine); |
| 1161 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1162 | | NeoCDAssyStatus = 1; |
| 1163 | | bNeoCDLoadSector = true; |
| 1164 | | break; |
| 1165 | | |
| 1166 | | case CMD_FF: // CDD_FF(machine); |
| 1167 | | case CMD_RW: // CDD_RW(machine); |
| 1168 | | case CMD_INIT: // CDD_Init(); |
| 1169 | | case 11: |
| 1170 | | case CMD_CLOSE: // CDD_Close(); |
| 1171 | | case CMD_OPEN: // CDD_Open(); |
| 1172 | | case 14: |
| 1173 | | case 15: |
| 1174 | | // //bprintf(PRINT_ERROR, _T(" CD comms received command %i\n"), CDD_TX[0]); |
| 1175 | | NeoCDAssyStatus = 9; |
| 1176 | | bNeoCDLoadSector = false; |
| 1177 | | break; |
| 1178 | | } |
| 1079 | CDD_Import(machine()); |
| 1080 | CDD_Export(); |
| 1179 | 1081 | } |
| 1180 | 1082 | |
| 1181 | 1083 | void lc89510_temp_device::NeoCDCommsControl(UINT8 clock, UINT8 send) |
| r19321 | r19322 | |
| 1316 | 1218 | } |
| 1317 | 1219 | |
| 1318 | 1220 | |
| 1221 | void lc89510_temp_device::CDC_End_Transfer(running_machine& machine) |
| 1222 | { |
| 1223 | STOP_CDC_DMA |
| 1224 | CDC_REG0 |= 0x8000; |
| 1225 | CDC_REG0 &= ~0x4000; |
| 1226 | LC8951RegistersR[REG_R_IFSTAT] |= 0x08; |
| 1319 | 1227 | |
| 1228 | if (LC8951RegistersW[REG_W_IFCTRL] & 0x40) |
| 1229 | { |
| 1230 | LC8951RegistersR[REG_R_IFSTAT] &= ~0x40; |
| 1231 | CHECK_SCD_LV5_INTERRUPT |
| 1232 | } |
| 1233 | } |
| 1320 | 1234 | |
| 1321 | 1235 | |
| 1322 | 1236 | |
| 1237 | |
| 1238 | |
| 1323 | 1239 | /* |
| 1324 | 1240 | * CD-ROM / DMA control |
| 1325 | 1241 | * |