src/mess/drivers/cdi.c
| r6128 | r6129 | |
| 914 | 914 | emu_timer *interrupt_timer; |
| 915 | 915 | cdrom_file *cd; |
| 916 | 916 | |
| 917 | | emu_timer *audio_stream_timer; |
| 918 | | INT16 audio_stream_samples[18*28*16*CDIC_BUFFERED_SECTORS]; |
| 919 | | INT32 audio_stream_queued; |
| 920 | | INT32 audio_stream_index; |
| 921 | | INT32 audio_stream_end; |
| 922 | | INT32 audio_stream_playing; |
| 917 | emu_timer *audio_sample_timer; |
| 918 | INT32 audio_sample_freq; |
| 919 | INT32 audio_sample_size; |
| 923 | 920 | |
| 924 | 921 | } cdic_regs_t; |
| 925 | 922 | |
| r6128 | r6129 | |
| 1169 | 1166 | // Get XA format from sector header |
| 1170 | 1167 | |
| 1171 | 1168 | const unsigned char *hdr = xa + 4; |
| 1172 | | double freq; |
| 1173 | 1169 | int channels; |
| 1174 | 1170 | int bits = 4; |
| 1175 | 1171 | int index = 0; |
| 1176 | | int size = 2; |
| 1177 | 1172 | INT16 samples[18*28*16+16]; |
| 1178 | 1173 | FILE* temp_adpcm = fopen("temp_adpcm.bin","ab"); |
| 1179 | 1174 | |
| r6128 | r6129 | |
| 1183 | 1178 | { |
| 1184 | 1179 | case 0: |
| 1185 | 1180 | channels=1; |
| 1186 | | freq=37800.0f; //18900.0f; |
| 1181 | cdic_regs.audio_sample_freq=37800.0f; //18900.0f; |
| 1187 | 1182 | bits=4; |
| 1188 | | size=4; |
| 1183 | cdic_regs.audio_sample_size=4; |
| 1189 | 1184 | break; |
| 1190 | 1185 | |
| 1191 | 1186 | case 1: |
| 1192 | 1187 | channels=2; |
| 1193 | | freq=37800.0f; |
| 1188 | cdic_regs.audio_sample_freq=37800.0f; |
| 1194 | 1189 | bits=4; |
| 1195 | | size=2; |
| 1190 | cdic_regs.audio_sample_size=2; |
| 1196 | 1191 | break; |
| 1197 | 1192 | |
| 1198 | 1193 | case 4: |
| 1199 | 1194 | channels=1; |
| 1200 | | freq=18900.0f; ///2.0f; |
| 1195 | cdic_regs.audio_sample_freq=18900.0f; ///2.0f; |
| 1201 | 1196 | bits=4; |
| 1202 | | size=4; |
| 1197 | cdic_regs.audio_sample_size=4; |
| 1203 | 1198 | break; |
| 1204 | 1199 | |
| 1205 | 1200 | case 5: |
| 1206 | 1201 | channels=2; |
| 1207 | | freq=18900.0f; //37800.0f/2.0f; |
| 1202 | cdic_regs.audio_sample_freq=18900.0f; //37800.0f/2.0f; |
| 1208 | 1203 | bits=4; |
| 1209 | | size=2; |
| 1204 | cdic_regs.audio_sample_size=2; |
| 1210 | 1205 | break; |
| 1211 | 1206 | |
| 1212 | 1207 | case 16: |
| 1213 | 1208 | channels=1; |
| 1214 | | freq=37800.0f; |
| 1209 | cdic_regs.audio_sample_freq=37800.0f; |
| 1215 | 1210 | bits=8; |
| 1216 | | size=2; |
| 1211 | cdic_regs.audio_sample_size=2; |
| 1217 | 1212 | break; |
| 1218 | 1213 | |
| 1219 | 1214 | case 17: |
| 1220 | 1215 | channels=2; |
| 1221 | | freq=37800.0f; |
| 1216 | cdic_regs.audio_sample_freq=37800.0f; |
| 1222 | 1217 | bits=8; |
| 1223 | | size=1; |
| 1218 | cdic_regs.audio_sample_size=1; |
| 1224 | 1219 | break; |
| 1225 | 1220 | |
| 1226 | 1221 | default: |
| r6128 | r6129 | |
| 1228 | 1223 | return; |
| 1229 | 1224 | } |
| 1230 | 1225 | |
| 1231 | | dmadac_set_frequency(&dmadac[0], 2, freq); |
| 1232 | 1226 | dmadac_enable(&dmadac[0], 2, 1); |
| 1227 | dmadac_set_frequency(&dmadac[0], 2, cdic_regs.audio_sample_freq); |
| 1233 | 1228 | |
| 1234 | 1229 | switch(channels) |
| 1235 | 1230 | { |
| r6128 | r6129 | |
| 1276 | 1271 | break; |
| 1277 | 1272 | } |
| 1278 | 1273 | |
| 1279 | | dmadac_transfer(&dmadac[0], 2, 2, 2, 18*28*2*size, samples); |
| 1274 | dmadac_transfer(&dmadac[0], 2, 2, 2, 18*28*2*cdic_regs.audio_sample_size, samples); |
| 1280 | 1275 | |
| 1281 | 1276 | fclose(temp_adpcm); |
| 1282 | 1277 | } |
| 1283 | 1278 | |
| 1279 | static TIMER_CALLBACK( audio_sample_trigger ) |
| 1280 | { |
| 1281 | cdic_regs.z_buffer += 0xa00; |
| 1282 | cdic_decode_audio_sector(machine, ((UINT8*)cdram) + cdic_regs.z_buffer + 4); |
| 1283 | timer_adjust_oneshot(cdic_regs.audio_sample_timer, attotime_never, 0); |
| 1284 | //dmadac_enable(&dmadac[0], 2, 0); |
| 1285 | } |
| 1286 | |
| 1284 | 1287 | static TIMER_CALLBACK( cdic_trigger_readback_int ) |
| 1285 | 1288 | { |
| 1286 | 1289 | switch(cdic_regs.command) |
| r6128 | r6129 | |
| 1393 | 1396 | } |
| 1394 | 1397 | else if((buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_DATA | CDIC_SUBMODE_AUDIO | CDIC_SUBMODE_VIDEO)) == 0x00) |
| 1395 | 1398 | { |
| 1399 | cdic_regs.data_buffer &= ~0x0004; |
| 1396 | 1400 | cdic_regs.data_buffer ^= 0x0001; |
| 1397 | 1401 | for(index = 6; index < 2352/2; index++) |
| 1398 | 1402 | { |
| 1399 | 1403 | cdram[(cdic_regs.data_buffer & 5) * (0xa00/2) + (index - 6)] = (buffer[index*2] << 8) | buffer[index*2 + 1]; |
| 1400 | 1404 | } |
| 1401 | 1405 | |
| 1402 | | if(buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_EOF || CDIC_SUBMODE_TRIG || CDIC_SUBMODE_EOR)) |
| 1406 | if((buffer[CDIC_SECTOR_SUBMODE2] & CDIC_SUBMODE_TRIG) == CDIC_SUBMODE_TRIG || (buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_EOR | CDIC_SUBMODE_FORM)) == (CDIC_SUBMODE_EOR | CDIC_SUBMODE_FORM)) |
| 1403 | 1407 | { |
| 1404 | 1408 | cdic_regs.x_buffer |= 0x8000; |
| 1405 | 1409 | |
| r6128 | r6129 | |
| 1451 | 1455 | case 0x24: // Mode 2 Reset |
| 1452 | 1456 | case 0x2e: // Abort |
| 1453 | 1457 | timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed |
| 1454 | | cdic_regs.data_buffer &= 0x3ffe; |
| 1458 | cdic_regs.data_buffer &= 0x3fff; |
| 1455 | 1459 | break; |
| 1456 | 1460 | } |
| 1457 | 1461 | } |
| r6128 | r6129 | |
| 1544 | 1548 | UINT32 start = scc68070_regs.dma.channel[0].memory_address_counter; |
| 1545 | 1549 | UINT32 count = scc68070_regs.dma.channel[0].transfer_counter; |
| 1546 | 1550 | UINT32 index = 0; |
| 1547 | | UINT32 device_index = (data & 0x7fff) >> 1; |
| 1551 | UINT32 device_index = (data & 0x3fff) >> 1; |
| 1548 | 1552 | UINT16 *memory = planea; |
| 1549 | 1553 | verboselog(space->machine, 0, "memory address counter: %08x\n", scc68070_regs.dma.channel[0].memory_address_counter); |
| 1550 | 1554 | verboselog(space->machine, 0, "cdic_w: DMA Control Register = %04x & %04x\n", data, mem_mask); |
| r6128 | r6129 | |
| 1564 | 1568 | else |
| 1565 | 1569 | { |
| 1566 | 1570 | cdram[device_index++] = memory[index]; |
| 1567 | | //printf( "%04x ", memory[index] ); |
| 1568 | 1571 | } |
| 1569 | 1572 | } |
| 1570 | | /* |
| 1571 | | if(!(scc68070_regs.dma.channel[0].operation_control & OCR_D)) |
| 1572 | | { |
| 1573 | | printf( "\n" ); |
| 1574 | | } |
| 1575 | | */ |
| 1576 | 1573 | scc68070_regs.dma.channel[0].memory_address_counter += scc68070_regs.dma.channel[0].transfer_counter * 2; |
| 1577 | 1574 | break; |
| 1578 | 1575 | } |
| 1579 | 1576 | case 0x3ffa/2: |
| 1580 | 1577 | verboselog(space->machine, 0, "cdic_w: Z-Buffer Register = %04x & %04x\n", data, mem_mask); |
| 1581 | 1578 | COMBINE_DATA(&cdic_regs.z_buffer); |
| 1579 | if(cdic_regs.z_buffer & 0x2000) |
| 1580 | { |
| 1581 | // Broken. |
| 1582 | //attotime period = attotime_mul(ATTOTIME_IN_HZ(cdic_regs.audio_sample_freq), 18*28*4*cdic_regs.audio_sample_size); |
| 1583 | //timer_adjust_oneshot(cdic_regs.audio_sample_timer, period, 0); |
| 1584 | //cdic_decode_audio_sector(space->machine, ((UINT8*)cdram) + cdic_regs.z_buffer + 4); |
| 1585 | } |
| 1582 | 1586 | break; |
| 1583 | 1587 | case 0x3ffc/2: |
| 1584 | 1588 | verboselog(space->machine, 0, "cdic_w: Interrupt Vector Register = %04x & %04x\n", data, mem_mask); |
| r6128 | r6129 | |
| 1596 | 1600 | case 0x23: // Reset Mode 1 |
| 1597 | 1601 | case 0x24: // Reset Mode 2 |
| 1598 | 1602 | case 0x2e: // Abort |
| 1599 | | timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed |
| 1600 | | //timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0); |
| 1603 | //timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed |
| 1604 | timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0); |
| 1605 | cdic_regs.data_buffer &= 0x3fff; |
| 1601 | 1606 | dmadac_enable(&dmadac[0], 2, 0); |
| 1602 | 1607 | break; |
| 1603 | 1608 | case 0x29: // Read Mode 1 |
| r6128 | r6129 | |
| 1887 | 1892 | slave_regs.in_index++; |
| 1888 | 1893 | switch(data & 0x00ff) |
| 1889 | 1894 | { |
| 1895 | case 0x82: // Mute audio |
| 1896 | verboselog(space->machine, 0, "slave_w: Channel %d: Mute Audio (0x82)\n", offset ); |
| 1897 | dmadac_enable(&dmadac[0], 2, 0); |
| 1898 | slave_regs.in_index = 0; |
| 1899 | slave_regs.in_count = 0; |
| 1900 | break; |
| 1901 | case 0x83: // Unmute audio |
| 1902 | verboselog(space->machine, 0, "slave_w: Channel %d: Unmute Audio (0x83)\n", offset ); |
| 1903 | dmadac_enable(&dmadac[0], 2, 1); |
| 1904 | slave_regs.in_index = 0; |
| 1905 | slave_regs.in_count = 0; |
| 1906 | break; |
| 1890 | 1907 | case 0xf0: // Set Front Panel LCD |
| 1891 | 1908 | verboselog(space->machine, 0, "slave_w: Channel %d: Set Front Panel LCD (0xf0)\n", offset ); |
| 1892 | 1909 | slave_regs.in_count = 17; |
| r6128 | r6129 | |
| 3635 | 3652 | cdic_regs.interrupt_timer = timer_alloc(machine, cdic_trigger_readback_int, 0); |
| 3636 | 3653 | timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0); |
| 3637 | 3654 | |
| 3638 | | cdic_regs.audio_stream_timer = timer_alloc(machine, cdic_trigger_readback_int, 0); |
| 3639 | | timer_adjust_oneshot(cdic_regs.audio_stream_timer, attotime_never, 0); |
| 3655 | cdic_regs.audio_sample_timer = timer_alloc(machine, audio_sample_trigger, 0); |
| 3656 | timer_adjust_oneshot(cdic_regs.audio_sample_timer, attotime_never, 0); |
| 3640 | 3657 | |
| 3658 | /* |
| 3641 | 3659 | memset(cdic_regs.audio_stream_samples, 0, 18*28*16*CDIC_BUFFERED_SECTORS * sizeof(INT16)); |
| 3642 | 3660 | cdic_regs.audio_stream_queued = 0; |
| 3643 | 3661 | cdic_regs.audio_stream_index = 0; |
| 3644 | 3662 | cdic_regs.audio_stream_end = 0; |
| 3645 | 3663 | cdic_regs.audio_stream_playing = 0; |
| 3664 | */ |
| 3646 | 3665 | |
| 3647 | 3666 | if( cdrom_dev ) |
| 3648 | 3667 | { |