Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
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;
}
Пример #6
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;
}
Пример #7
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;
}
Пример #8
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;
}
Пример #9
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;
}
Пример #10
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;
}
Пример #11
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;
}
Пример #12
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;
}
Пример #13
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;
}
Пример #14
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;
}
Пример #15
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;
}
Пример #16
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;
}
Пример #17
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;
}