mirror of https://github.com/PCSX2/pcsx2.git
184 lines
3.9 KiB
C
184 lines
3.9 KiB
C
/* PCSX2 - PS2 Emulator for PCs
|
|
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
|
*
|
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "IopCommon.h"
|
|
#include "CDVDaccess.h"
|
|
|
|
#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */
|
|
#define itob(i) ((i) / 10 * 16 + (i) % 10) /* u_char to BCD */
|
|
|
|
static __fi s32 msf_to_lsn(u8* Time)
|
|
{
|
|
u32 lsn;
|
|
|
|
lsn = Time[2];
|
|
lsn += (Time[1] - 2) * 75;
|
|
lsn += Time[0] * 75 * 60;
|
|
return lsn;
|
|
}
|
|
|
|
static __fi s32 msf_to_lba(u8 m, u8 s, u8 f)
|
|
{
|
|
u32 lsn;
|
|
lsn = f;
|
|
lsn += (s - 2) * 75;
|
|
lsn += m * 75 * 60;
|
|
return lsn;
|
|
}
|
|
|
|
static __fi void lsn_to_msf(u8* Time, s32 lsn)
|
|
{
|
|
u8 m, s, f;
|
|
|
|
lsn += 150;
|
|
m = lsn / 4500; // minuten
|
|
lsn = lsn - m * 4500; // minuten rest
|
|
s = lsn / 75; // sekunden
|
|
f = lsn - (s * 75); // sekunden rest
|
|
Time[0] = itob(m);
|
|
Time[1] = itob(s);
|
|
Time[2] = itob(f);
|
|
}
|
|
|
|
static __fi void lba_to_msf(s32 lba, u8* m, u8* s, u8* f)
|
|
{
|
|
lba += 150;
|
|
*m = lba / (60 * 75);
|
|
*s = (lba / 75) % 60;
|
|
*f = lba % 75;
|
|
}
|
|
|
|
struct cdvdRTC
|
|
{
|
|
u8 status;
|
|
u8 second;
|
|
u8 minute;
|
|
u8 hour;
|
|
u8 pad;
|
|
u8 day;
|
|
u8 month;
|
|
u8 year;
|
|
};
|
|
|
|
enum TrayStates
|
|
{
|
|
CDVD_DISC_ENGAGED,
|
|
CDVD_DISC_DETECTING,
|
|
CDVD_DISC_SEEKING,
|
|
CDVD_DISC_EJECT
|
|
};
|
|
|
|
struct cdvdTrayTimer
|
|
{
|
|
u32 cdvdActionSeconds;
|
|
TrayStates trayState;
|
|
};
|
|
|
|
struct cdvdStruct
|
|
{
|
|
u8 nCommand;
|
|
u8 Ready;
|
|
u8 Error;
|
|
u8 IntrStat;
|
|
u8 Status;
|
|
u8 StatusSticky;
|
|
u8 Type;
|
|
u8 sCommand;
|
|
u8 sDataIn;
|
|
u8 sDataOut;
|
|
u8 HowTo;
|
|
|
|
u8 NCMDParam[16];
|
|
u8 SCMDParam[16];
|
|
u8 SCMDResult[16];
|
|
|
|
u8 NCMDParamC;
|
|
u8 NCMDParamP;
|
|
u8 SCMDParamC;
|
|
u8 SCMDParamP;
|
|
u8 SCMDResultC;
|
|
u8 SCMDResultP;
|
|
|
|
u8 CBlockIndex;
|
|
u8 COffset;
|
|
u8 CReadWrite;
|
|
u8 CNumBlocks;
|
|
|
|
// Calculates the number of Vsyncs and once it reaches a total number of Vsyncs worth a second with respect to
|
|
// the videomode's vertical frequency, it updates the real time clock.
|
|
int RTCcount;
|
|
cdvdRTC RTC;
|
|
|
|
u32 Sector;
|
|
int nSectors;
|
|
int Readed; // change to bool. --arcum42
|
|
int Reading; // same here.
|
|
int WaitingDMA;
|
|
int ReadMode;
|
|
int BlockSize; // Total bytes transfered at 1x speed
|
|
int Speed;
|
|
int RetryCnt;
|
|
int RetryCntP;
|
|
int RErr;
|
|
int SpindlCtrl;
|
|
|
|
u8 Key[16];
|
|
u8 KeyXor;
|
|
u8 decSet;
|
|
|
|
u8 mg_buffer[65536];
|
|
int mg_size;
|
|
int mg_maxsize;
|
|
int mg_datatype; //0-data(encrypted); 1-header
|
|
u8 mg_kbit[16]; //last BIT key 'seen'
|
|
u8 mg_kcon[16]; //last content key 'seen'
|
|
|
|
u8 TrayTimeout;
|
|
u8 Action; // the currently scheduled emulated action
|
|
u32 SeekToSector; // Holds the destination sector during seek operations.
|
|
u32 MaxSector; // Current disc max sector.
|
|
u32 ReadTime; // Avg. time to read one block of data (in Iop cycles)
|
|
bool Spinning; // indicates if the Cdvd is spinning or needs a spinup delay
|
|
cdvdTrayTimer Tray;
|
|
u8 nextSectorsBuffered;
|
|
bool AbortRequested;
|
|
};
|
|
|
|
extern cdvdStruct cdvd;
|
|
|
|
extern void cdvdReadLanguageParams(u8* config);
|
|
|
|
extern void cdvdReset();
|
|
extern void cdvdVsync();
|
|
extern void cdvdActionInterrupt();
|
|
extern void cdvdSectorReady();
|
|
extern void cdvdReadInterrupt();
|
|
extern void cdvdDMAInterrupt();
|
|
|
|
// We really should not have a function with the exact same name as a callback except for case!
|
|
extern void cdvdNewDiskCB();
|
|
extern u8 cdvdRead(u8 key);
|
|
extern void cdvdWrite(u8 key, u8 rt);
|
|
|
|
extern void cdvdReloadElfInfo(wxString elfoverride = wxEmptyString);
|
|
extern s32 cdvdCtrlTrayOpen();
|
|
extern s32 cdvdCtrlTrayClose();
|
|
|
|
extern wxString DiscSerial;
|