PICO_INTERNAL int Play_CDD_c3(void) { _msf MSF; int delay, new_lba; CHECK_TRAY_OPEN CHECK_CD_PRESENT // MSF of the track to play in TC buffer MSF.M = (Pico_mcd->s68k_regs[0x38+10+2] & 0xF) * 10 + (Pico_mcd->s68k_regs[0x38+10+3] & 0xF); MSF.S = (Pico_mcd->s68k_regs[0x38+10+4] & 0xF) * 10 + (Pico_mcd->s68k_regs[0x38+10+5] & 0xF); MSF.F = (Pico_mcd->s68k_regs[0x38+10+6] & 0xF) * 10 + (Pico_mcd->s68k_regs[0x38+10+7] & 0xF); Pico_mcd->scd.Cur_Track = MSF_to_Track(&MSF); new_lba = MSF_to_LBA(&MSF); delay = new_lba - Pico_mcd->scd.Cur_LBA; if (delay < 0) delay = -delay; delay >>= 12; if (Pico_mcd->scd.Cur_LBA > 0 && delay < 13) // based on genplus GX delay = 13; Pico_mcd->scd.Cur_LBA = new_lba; CDC_Update_Header(); cdprintf("Read : Cur LBA = %d, M=%d, S=%d, F=%d", Pico_mcd->scd.Cur_LBA, MSF.M, MSF.S, MSF.F); if (Pico_mcd->scd.Status_CDD != PLAYING) delay += 20; Pico_mcd->scd.Status_CDD = PLAYING; Pico_mcd->cdd.Status = 0x0102; // Pico_mcd->cdd.Status = COMM_OK; if (Pico_mcd->scd.File_Add_Delay == 0) Pico_mcd->scd.File_Add_Delay = delay; if (Pico_mcd->scd.Cur_Track == 1) { Pico_mcd->s68k_regs[0x36] |= 0x01; // DATA } else { Pico_mcd->s68k_regs[0x36] &= ~0x01; // AUDIO cdda_start_play(); } if (Pico_mcd->scd.Cur_Track == 100) Pico_mcd->cdd.Minute = 0x0A02; else Pico_mcd->cdd.Minute = INT_TO_BCDW(Pico_mcd->scd.Cur_Track); Pico_mcd->cdd.Seconde = 0; Pico_mcd->cdd.Frame = 0; Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.Status_CDC |= 1; // Read data with CDC Pico_mcd->scd.CDD_Complete = 1; return 0; }
/* FIXME: use cdd_read_audio() instead */ static void cdd_change_track(int index, int lba) { int i, base, lba_offset, lb_len; for (i = index; i > 0; i--) if (cdd.toc.tracks[i].fd != NULL) break; Pico_mcd->cdda_stream = cdd.toc.tracks[i].fd; base = cdd.toc.tracks[index].offset; lba_offset = lba - cdd.toc.tracks[index].start; lb_len = cdd.toc.tracks[index].end - cdd.toc.tracks[index].start; elprintf(EL_CD, "play #%d lba %d base %d", index, lba, base); cdda_start_play(base, lba_offset, lb_len); }
PICO_INTERNAL int Resume_CDD_c7(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT Pico_mcd->scd.Cur_Track = LBA_to_Track(Pico_mcd->scd.Cur_LBA); #ifdef DEBUG_CD { _msf MSF; LBA_to_MSF(Pico_mcd->scd.Cur_LBA, &MSF); cdprintf("Resume read : Cur LBA = %d, M=%d, S=%d, F=%d", Pico_mcd->scd.Cur_LBA, MSF.M, MSF.S, MSF.F); } #endif Pico_mcd->scd.Status_CDD = PLAYING; Pico_mcd->cdd.Status = 0x0102; if (Pico_mcd->scd.Cur_Track == 1) { Pico_mcd->s68k_regs[0x36] |= 0x01; // DATA } else { Pico_mcd->s68k_regs[0x36] &= ~0x01; // AUDIO cdda_start_play(); } if (Pico_mcd->scd.Cur_Track == 100) Pico_mcd->cdd.Minute = 0x0A02; else Pico_mcd->cdd.Minute = INT_TO_BCDW(Pico_mcd->scd.Cur_Track); Pico_mcd->cdd.Seconde = 0; Pico_mcd->cdd.Frame = 0; Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.Status_CDC |= 1; // Read data with CDC Pico_mcd->scd.CDD_Complete = 1; return 0; }