src/mame/drivers/megadriv.c
| r9434 | r9435 | |
| 405 | 405 | UINT32 current_frame; |
| 406 | 406 | UINT32 end_frame; |
| 407 | 407 | UINT32 last_frame; |
| 408 | UINT8 first_track; |
| 409 | UINT8 last_track; |
| 408 | 410 | |
| 409 | 411 | cdrom_file *cd; |
| 410 | 412 | const cdrom_toc* toc; |
| r9434 | r9435 | |
| 5329 | 5331 | "Status", |
| 5330 | 5332 | "Stop All", |
| 5331 | 5333 | "Get TOC Info", |
| 5332 | | "Read", |
| 5334 | "Play", |
| 5333 | 5335 | "Seek", |
| 5334 | 5336 | "Pause/Stop", |
| 5335 | 5337 | "Resume", |
| r9434 | r9435 | |
| 5401 | 5403 | |
| 5402 | 5404 | if ( ! segacd.cd ) // no cd is present |
| 5403 | 5405 | { |
| 5404 | | segacd_cdd.buffer[0] = (0) | (segacd_cdd.buffer[0] & 0xf0); |
| 5406 | segacd_cdd.scd_status = 0x00; |
| 5407 | segacd_cdd.buffer[0] = (0) | (segacd_cdd.scd_status & 0xf0); |
| 5405 | 5408 | segacd_cdd.buffer[1] = 0; |
| 5406 | 5409 | segacd_cdd.buffer[2] = 0; |
| 5407 | 5410 | segacd_cdd.buffer[3] = 0; |
| r9434 | r9435 | |
| 5447 | 5450 | return; |
| 5448 | 5451 | |
| 5449 | 5452 | } |
| 5450 | | case 0x4: //Get First and Last Track Number |
| 5453 | case 0x4: //Get First and Last Track Number |
| 5451 | 5454 | { |
| 5452 | 5455 | segacd_cdd.scd_status = 0x40; |
| 5453 | 5456 | segacd_cdd.buffer[0] = (0x4 & 0xf) | (segacd_cdd.scd_status & 0xf0); |
| 5454 | | segacd_cdd.buffer[1] = dec_2_bcd(1); |
| 5455 | | segacd_cdd.buffer[2] = dec_2_bcd(segacd.toc->numtrks - 1); // TODO: check me |
| 5457 | segacd.first_track = dec_2_bcd(1); |
| 5458 | segacd.last_track = dec_2_bcd(segacd.toc->numtrks - 1); |
| 5459 | segacd_cdd.buffer[1] = segacd.first_track; |
| 5460 | segacd_cdd.buffer[2] = segacd.last_track; |
| 5456 | 5461 | segacd_cdd.buffer[3] = 0; |
| 5457 | 5462 | segacd_cdd.buffer[4] = 0; |
| 5458 | 5463 | |
| r9434 | r9435 | |
| 5461 | 5466 | cdd_hock_irq(machine,1); |
| 5462 | 5467 | } |
| 5463 | 5468 | return; |
| 5469 | case 0x5: //Get Track Addresses |
| 5470 | { |
| 5471 | UINT8 track_num; |
| 5472 | UINT32 start_frame,end_frame,frame,msf; |
| 5473 | |
| 5474 | track_num = ((segacd_cdd_tx[4] & 0xf) * 10) | (segacd_cdd_tx[5] & 0x0f); |
| 5475 | |
| 5476 | if(track_num > segacd.last_track) |
| 5477 | track_num = segacd.last_track; |
| 5478 | if(track_num < segacd.first_track) |
| 5479 | track_num = segacd.first_track; |
| 5480 | start_frame = segacd.toc->tracks[ bcd_2_dec( track_num - 1 ) ].physframeofs; |
| 5481 | end_frame = segacd.toc->tracks[ bcd_2_dec( track_num ) ].physframeofs; |
| 5482 | frame = end_frame - start_frame; |
| 5483 | msf = lba_to_msf( frame ); |
| 5484 | |
| 5485 | segacd_cdd.buffer[0] = (0x5 & 0xf) | (segacd_cdd.scd_status & 0xf0); |
| 5486 | segacd_cdd.buffer[1] = ((msf >> 16) & 0xff); |
| 5487 | segacd_cdd.buffer[2] = ((msf >> 8) & 0xff); |
| 5488 | segacd_cdd.buffer[3] = ((msf >> 0) & 0xff); |
| 5489 | segacd_cdd.buffer[4] = (track_num % 10) | (( segacd.toc->tracks[track_num-1].trktype == CD_TRACK_AUDIO ) ? 0x80 : 0x00); |
| 5490 | |
| 5491 | printf("%02x %02x %02x %02x %02x\n",segacd_cdd.buffer[0],segacd_cdd.buffer[1],segacd_cdd.buffer[2],segacd_cdd.buffer[3],segacd_cdd.buffer[4]); |
| 5492 | |
| 5493 | cdd_hock_irq(machine,1); |
| 5494 | } |
| 5464 | 5495 | //default: logerror("CDD: unhandled TOC command %s issued\n",segacd_cdd_get_toc_cmd[segacd_cdd_tx[3] & 0xf]); |
| 5465 | 5496 | } |
| 5466 | 5497 | } |
| r9434 | r9435 | |
| 5470 | 5501 | |
| 5471 | 5502 | #endif |
| 5472 | 5503 | |
| 5504 | static void segacd_cdd_seek(running_machine *machine) |
| 5505 | { |
| 5506 | UINT8 m,s,f; |
| 5507 | UINT8 track_num; |
| 5508 | UINT32 frame; |
| 5509 | |
| 5510 | // TODO: check if tray is open or CD isn't there |
| 5511 | |
| 5512 | segacd_cdd.scd_status = 0x20; //READY flag |
| 5513 | |
| 5514 | m = ((segacd_cdd_tx[2] & 0xf) * 10) | (segacd_cdd_tx[3] & 0x0f); |
| 5515 | s = ((segacd_cdd_tx[4] & 0xf) * 10) | (segacd_cdd_tx[5] & 0x0f); |
| 5516 | f = ((segacd_cdd_tx[6] & 0xf) * 10) | (segacd_cdd_tx[7] & 0x0f); |
| 5517 | |
| 5518 | frame = (m << 16) | (s << 8) | (f); |
| 5519 | |
| 5520 | track_num = cdrom_get_track(segacd.cd, frame); |
| 5521 | // printf("%02x %02x %02x %02x\n",m,s,f,track_num); |
| 5522 | |
| 5523 | segacd_cdd.ctrl &= 0xfeff; |
| 5524 | segacd_cdd.ctrl |= (( segacd.toc->tracks[track_num-1].trktype == CD_TRACK_AUDIO ) ? 0x000 : 0x100); |
| 5525 | |
| 5526 | segacd_cdd.buffer[0] = segacd_cdd.scd_status & 0x20; // set READY |
| 5527 | segacd_cdd.buffer[1] = 0; |
| 5528 | segacd_cdd.buffer[2] = 0; |
| 5529 | segacd_cdd.buffer[3] = 0; |
| 5530 | segacd_cdd.buffer[4] = 0; |
| 5531 | |
| 5532 | cdd_hock_irq(machine,1); |
| 5533 | } |
| 5534 | |
| 5473 | 5535 | static WRITE8_HANDLER( segacd_cdd_tx_w ) |
| 5474 | 5536 | { |
| 5475 | 5537 | //printf("CDD Communication write %02x -> [%02x]\n",data,offset); |
| r9434 | r9435 | |
| 5488 | 5550 | case 0x0: segacd_cdd_get_status(space->machine); break; |
| 5489 | 5551 | case 0x1: segacd_cdd_stop_all(space->machine); break; |
| 5490 | 5552 | case 0x2: segacd_cdd_get_toc_info(space->machine); break; |
| 5553 | //case 0x3: segacd_cdd_play(space->machine); break; |
| 5554 | case 0x4: segacd_cdd_seek(space->machine); break; |
| 5491 | 5555 | //default: logerror("CDD: unhandled command %s issued\n",segacd_cdd_cmd[segacd_cdd_tx[0] & 0xf]); |
| 5492 | 5556 | } |
| 5493 | 5557 | } |