PICO_INTERNAL int Get_Track_Pos_CDD_c21(void) { int elapsed_time; _msf MSF; cdprintf("command 201 : Cur LBA = %d", Pico_mcd->scd.Cur_LBA); CHECK_TRAY_OPEN Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; elapsed_time = Pico_mcd->scd.Cur_LBA - Track_to_LBA(LBA_to_Track(Pico_mcd->scd.Cur_LBA)); LBA_to_MSF(elapsed_time - 150, &MSF); cdprintf(" elapsed = %d", elapsed_time); Pico_mcd->cdd.Minute = INT_TO_BCDW(MSF.M); Pico_mcd->cdd.Seconde = INT_TO_BCDW(MSF.S); Pico_mcd->cdd.Frame = INT_TO_BCDW(MSF.F); Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.CDD_Complete = 1; return 0; }
int Get_Pos_CDD_c20 (void) { _msf MSF; #ifdef DEBUG_CD fprintf (debug_SCD_file, "command 200 : Cur LBA = %d\n", SCD.Cur_LBA); #endif CHECK_TRAY_OPEN CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } //else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; //aggiunta CDD.Status |= SCD.Status_CDD; #ifdef DEBUG_CD fprintf (debug_SCD_file, "Status CDD = %.4X Status = %.4X\n", SCD.Status_CDD, CDD.Status); #endif LBA_to_MSF (SCD.Cur_LBA, &MSF); CDD.Minute = INT_TO_BCDW (MSF.M); CDD.Seconde = INT_TO_BCDW (MSF.S); CDD.Frame = INT_TO_BCDW (MSF.F); CDD.Ext = 0; CDD_Complete = 1; return 0; }
PICO_INTERNAL int Get_Pos_CDD_c20(void) { _msf MSF; cdprintf("command 200 : Cur LBA = %d", Pico_mcd->scd.Cur_LBA); CHECK_TRAY_OPEN Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; cdprintf("Status CDD = %.4X Status = %.4X", Pico_mcd->scd.Status_CDD, Pico_mcd->cdd.Status); LBA_to_MSF(Pico_mcd->scd.Cur_LBA, &MSF); Pico_mcd->cdd.Minute = INT_TO_BCDW(MSF.M); Pico_mcd->cdd.Seconde = INT_TO_BCDW(MSF.S); Pico_mcd->cdd.Frame = INT_TO_BCDW(MSF.F); Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.CDD_Complete = 1; return 0; }
PICO_INTERNAL int Get_Track_Adr_CDD_c25(void) { int track_number; CHECK_TRAY_OPEN // track number in TC4 & TC5 track_number = (Pico_mcd->s68k_regs[0x38+10+4] & 0xF) * 10 + (Pico_mcd->s68k_regs[0x38+10+5] & 0xF); Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; if (track_number > Pico_mcd->TOC.Last_Track) track_number = Pico_mcd->TOC.Last_Track; else if (track_number < 1) track_number = 1; Pico_mcd->cdd.Minute = INT_TO_BCDW(Pico_mcd->TOC.Tracks[track_number - 1].MSF.M); Pico_mcd->cdd.Seconde = INT_TO_BCDW(Pico_mcd->TOC.Tracks[track_number - 1].MSF.S); Pico_mcd->cdd.Frame = INT_TO_BCDW(Pico_mcd->TOC.Tracks[track_number - 1].MSF.F); Pico_mcd->cdd.Ext = track_number % 10; if (track_number == 1) Pico_mcd->cdd.Frame |= 0x0800; // data track Pico_mcd->scd.CDD_Complete = 1; return 0; }
int Get_Track_Pos_CDD_c21 (void) { int elapsed_time; _msf MSF; #ifdef DEBUG_CD fprintf (debug_SCD_file, "command 201 : Cur LBA = %d", SCD.Cur_LBA); #endif CHECK_TRAY_OPEN CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; CDD.Status |= SCD.Status_CDD; elapsed_time = SCD.Cur_LBA - Track_to_LBA (LBA_to_Track (SCD.Cur_LBA)); LBA_to_MSF (elapsed_time - 150, &MSF); #ifdef DEBUG_CD fprintf (debug_SCD_file, " elapsed = %d\n", elapsed_time); #endif CDD.Minute = INT_TO_BCDW (MSF.M); CDD.Seconde = INT_TO_BCDW (MSF.S); CDD.Frame = INT_TO_BCDW (MSF.F); CDD.Ext = 0; CDD_Complete = 1; return 0; }
int Get_Track_Adr_CDD_c25 (void) { CHECK_TRAY_OPEN // track number in TC4 & TC5 track_number = (CDD.Trans_Comm[4] & 0xF) + (CDD.Trans_Comm[5] & 0xF) * 10; CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; CDD.Status |= SCD.Status_CDD; if (track_number > SCD.TOC.Last_Track) track_number = SCD.TOC.Last_Track; else if (track_number < SCD.TOC.First_Track) track_number = SCD.TOC.First_Track; CDD.Minute = INT_TO_BCDW (SCD.TOC.Tracks[track_number - SCD.TOC.First_Track].MSF.M); CDD.Seconde = INT_TO_BCDW (SCD.TOC.Tracks[track_number - SCD.TOC.First_Track].MSF.S); CDD.Frame = INT_TO_BCDW (SCD.TOC.Tracks[track_number - SCD.TOC.First_Track].MSF.F); CDD.Ext = track_number % 10; if (SCD.TOC.Tracks[track_number - SCD.TOC.First_Track].Type) CDD.Frame |= 0x0800; CDD_Complete = 1; return 0; }
int Get_Total_Lenght_CDD_c23 (void) { CHECK_TRAY_OPEN CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; CDD.Status |= SCD.Status_CDD; CDD.Minute = INT_TO_BCDW (SCD.TOC.Tracks[SCD.TOC.Last_Track - SCD.TOC.First_Track + 1]. MSF.M); CDD.Seconde = INT_TO_BCDW (SCD.TOC.Tracks[SCD.TOC.Last_Track - SCD.TOC.First_Track + 1]. MSF.S); CDD.Frame = INT_TO_BCDW (SCD.TOC.Tracks[SCD.TOC.Last_Track - SCD.TOC.First_Track + 1]. MSF.F); CDD.Ext = 0; CDD_Complete = 1; return 0; }
PICO_INTERNAL int Get_Current_Track_CDD_c22(void) { cdprintf("Status CDD = %.4X Status = %.4X", Pico_mcd->scd.Status_CDD, Pico_mcd->cdd.Status); CHECK_TRAY_OPEN Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->scd.Cur_Track = LBA_to_Track(Pico_mcd->scd.Cur_LBA); 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.CDD_Complete = 1; return 0; }
int Get_Current_Track_CDD_c22 (void) { #ifdef DEBUG_CD fprintf (debug_SCD_file, "Status CDD = %.4X Status = %.4X\n", SCD.Status_CDD, CDD.Status); #endif CHECK_TRAY_OPEN CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; CDD.Status |= SCD.Status_CDD; SCD.Cur_Track = LBA_to_Track (SCD.Cur_LBA); if (SCD.Cur_Track == 100) CDD.Minute = 0x0A02; else CDD.Minute = INT_TO_BCDW (SCD.Cur_Track); CDD.Seconde = 0; CDD.Frame = 0; CDD.Ext = 0; CDD_Complete = 1; return 0; }
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; }
PICO_INTERNAL int CDD_cA(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT Pico_mcd->scd.Status_CDC &= ~1; Pico_mcd->scd.Status_CDD = READY; Pico_mcd->cdd.Status = Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Minute = 0; Pico_mcd->cdd.Seconde = INT_TO_BCDW(1); Pico_mcd->cdd.Frame = INT_TO_BCDW(1); Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.CDD_Complete = 1; return 0; }
PICO_INTERNAL int Get_First_Last_Track_CDD_c24(void) { CHECK_TRAY_OPEN Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Minute = INT_TO_BCDW(1); Pico_mcd->cdd.Seconde = INT_TO_BCDW(Pico_mcd->TOC.Last_Track); Pico_mcd->cdd.Frame = 0; Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.CDD_Complete = 1; return 0; }
int Get_First_Last_Track_CDD_c24 (void) { CHECK_TRAY_OPEN CDD.Status &= 0xFF; if (!CD_Present) { SCD.Status_CDD = NOCD; CDD.Status |= SCD.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) CDD.Status |= SCD.Status_CDD; CDD.Status |= SCD.Status_CDD; CDD.Minute = INT_TO_BCDW (SCD.TOC.First_Track); CDD.Seconde = INT_TO_BCDW (SCD.TOC.Last_Track); CDD.Frame = 0; CDD.Ext = 0; CDD_Complete = 1; return 0; }
PICO_INTERNAL int Get_Total_Lenght_CDD_c23(void) { CHECK_TRAY_OPEN Pico_mcd->cdd.Status &= 0xFF; if (!CD_Present) { Pico_mcd->scd.Status_CDD = NOCD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; } // else if (!(CDC.CTRL.B.B0 & 0x80)) Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Status |= Pico_mcd->scd.Status_CDD; Pico_mcd->cdd.Minute = INT_TO_BCDW(Pico_mcd->TOC.Tracks[Pico_mcd->TOC.Last_Track].MSF.M); Pico_mcd->cdd.Seconde = INT_TO_BCDW(Pico_mcd->TOC.Tracks[Pico_mcd->TOC.Last_Track].MSF.S); Pico_mcd->cdd.Frame = INT_TO_BCDW(Pico_mcd->TOC.Tracks[Pico_mcd->TOC.Last_Track].MSF.F); Pico_mcd->cdd.Ext = 0; Pico_mcd->scd.CDD_Complete = 1; return 0; }
PICO_INTERNAL int Fast_Rewind_CDD_c9(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT Pico_mcd->scd.Status_CDC &= ~1; // Stop CDC read Pico_mcd->scd.Status_CDD = FAST_REV; Pico_mcd->cdd.Status = Pico_mcd->scd.Status_CDD | 2; 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.CDD_Complete = 1; return 0; }
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; }
int Play_CDD_c3 (void) { _msf MSF; int delay, new_lba; CHECK_TRAY_OPEN CHECK_CD_PRESENT if (CD_Load_System == CDROM_) //aggiunta { SCD.Status_CDC &= ~1; // Stop read data with CDC Wait_Read_Complete (); } // MSF of the track to play in TC buffer MSF.M = (CDD.Trans_Comm[2] & 0xF) + (CDD.Trans_Comm[3] & 0xF) * 10; MSF.S = (CDD.Trans_Comm[4] & 0xF) + (CDD.Trans_Comm[5] & 0xF) * 10; MSF.F = (CDD.Trans_Comm[6] & 0xF) + (CDD.Trans_Comm[7] & 0xF) * 10; SCD.Cur_Track = MSF_to_Track (&MSF); new_lba = MSF_to_LBA (&MSF); delay = new_lba - SCD.Cur_LBA; if (delay < 0) delay = -delay; delay >>= 12; SCD.Cur_LBA = new_lba; CDC_Update_Header (); #ifdef DEBUG_CD fprintf (debug_SCD_file, "Read : Cur LBA = %d, M=%d, S=%d, F=%d\n", SCD.Cur_LBA, MSF.M, MSF.S, MSF.F); #endif if (CD_Load_System == CDROM_) { delay += 20; //delay >>= 2; //ASPI_Seek (SCD.Cur_LBA, 1, ASPI_Fast_Seek_COMP); //aggiunta } else if (SCD.Status_CDD != PLAYING) delay += 20; SCD.Status_CDD = PLAYING; CDD.Status = 0x0102; // CDD.Status = COMM_OK; if (File_Add_Delay == 0) File_Add_Delay = delay; if (SCD.TOC.Tracks[SCD.Cur_Track - SCD.TOC.First_Track].Type) { CDD.Control |= 0x0100; // DATA } else { CDD.Control &= ~0x0100; // AUDIO CD_Audio_Starting = 1; if (CD_Load_System == FILE_ISO) FILE_Play_CD_LBA (); } if (SCD.Cur_Track == 100) CDD.Minute = 0x0A02; else CDD.Minute = INT_TO_BCDW (SCD.Cur_Track); CDD.Seconde = 0; CDD.Frame = 0; CDD.Ext = 0; SCD.Status_CDC |= 1; // Read data with CDC CDD_Complete = 1; return 0; }