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; }
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; }
int main(int argc, char const *argv[]) { double _Complex *in, *out; double real,imag; unsigned short N; printf("Please input sequence lenth: "); scanf("%hu",&N); unsigned listlenth = pow(2,N); in = (double _Complex *)malloc(sizeof(double _Complex)*pow(2,N)); for(int i=0;i<pow(2,N);i++){ scanf("%lf %lf",&real,&imag); in[i]=real+imag*I; } out = (double _Complex *)malloc(sizeof(double _Complex)*pow(2,N)); printf("\nFORWARD fft"); fft(in, out, N,FORWARD); cdprintf(out,listlenth); printf("\nBACKWARD fft"); fft(out,in,N,BACKWARD); cdprintf(in,listlenth); putchar('\n'); free(out); free(in); 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; }
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 void Check_CD_Command(void) { cdprintf("CHECK CD COMMAND"); // Check CDC if (Pico_mcd->scd.Status_CDC & 1) // CDC is reading data ... { cdprintf("Got a read command"); // DATA ? if (Pico_mcd->scd.Cur_Track == 1) Pico_mcd->s68k_regs[0x36] |= 0x01; else Pico_mcd->s68k_regs[0x36] &= ~0x01; // AUDIO if (Pico_mcd->scd.File_Add_Delay == 0) { FILE_Read_One_LBA_CDC(); } else Pico_mcd->scd.File_Add_Delay--; } // Check CDD if (Pico_mcd->scd.CDD_Complete) { Pico_mcd->scd.CDD_Complete = 0; CDD_Export_Status(); } if (Pico_mcd->scd.Status_CDD == FAST_FOW) { Pico_mcd->scd.Cur_LBA += 10; CDC_Update_Header(); } else if (Pico_mcd->scd.Status_CDD == FAST_REV) { Pico_mcd->scd.Cur_LBA -= 10; if (Pico_mcd->scd.Cur_LBA < -150) Pico_mcd->scd.Cur_LBA = -150; CDC_Update_Header(); } }
PICO_INTERNAL int Get_Status_CDD_c0(void) { cdprintf("Status command : Cur LBA = %d", Pico_mcd->scd.Cur_LBA); // Clear immediat status if ((Pico_mcd->cdd.Status & 0x0F00) == 0x0200) Pico_mcd->cdd.Status = (Pico_mcd->scd.Status_CDD & 0xFF00) | (Pico_mcd->cdd.Status & 0x00FF); else if ((Pico_mcd->cdd.Status & 0x0F00) == 0x0700) Pico_mcd->cdd.Status = (Pico_mcd->scd.Status_CDD & 0xFF00) | (Pico_mcd->cdd.Status & 0x00FF); else if ((Pico_mcd->cdd.Status & 0x0F00) == 0x0E00) Pico_mcd->cdd.Status = (Pico_mcd->scd.Status_CDD & 0xFF00) | (Pico_mcd->cdd.Status & 0x00FF); 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; }