2016-01-20 00:14:18 +00:00
|
|
|
#pragma once
|
2019-01-25 07:11:40 +00:00
|
|
|
|
|
|
|
#include <Project64-core/N64System/N64Types.h>
|
2021-04-12 06:34:26 +00:00
|
|
|
#include <stdint.h>
|
2016-01-20 00:14:18 +00:00
|
|
|
|
|
|
|
class CN64Disk
|
|
|
|
{
|
|
|
|
public:
|
2016-01-20 13:31:29 +00:00
|
|
|
CN64Disk();
|
|
|
|
~CN64Disk();
|
2016-01-20 00:14:18 +00:00
|
|
|
|
2016-01-20 13:31:29 +00:00
|
|
|
bool LoadDiskImage(const char * FileLoc);
|
2016-05-24 19:26:05 +00:00
|
|
|
bool SaveDiskImage();
|
2016-05-29 23:09:52 +00:00
|
|
|
void SwapDiskImage(const char * FileLoc);
|
2019-08-12 15:50:04 +00:00
|
|
|
static bool IsValidDiskImage(uint8_t Test[0x20]);
|
2019-01-25 20:32:26 +00:00
|
|
|
void SaveDiskSettingID(bool temp);
|
|
|
|
void ClearDiskSettingID();
|
2016-01-20 13:31:29 +00:00
|
|
|
uint8_t * GetDiskAddress() { return m_DiskImage; }
|
2016-01-20 16:43:23 +00:00
|
|
|
uint8_t * GetDiskAddressBuffer() { return m_DiskImage + m_DiskBufAddress; }
|
2019-08-11 16:13:52 +00:00
|
|
|
uint8_t * GetDiskAddressSys() { return m_DiskImage + m_DiskSysAddress; }
|
|
|
|
uint8_t * GetDiskAddressID() { return m_DiskImage + m_DiskIDAddress; }
|
2019-08-12 15:50:04 +00:00
|
|
|
uint8_t * GetDiskAddressRom() { return m_DiskImage + m_DiskRomAddress; }
|
2019-08-12 21:07:33 +00:00
|
|
|
uint8_t * GetDiskAddressRam() { return m_DiskImage + m_DiskRamAddress; }
|
2019-01-26 15:58:41 +00:00
|
|
|
uint8_t * GetDiskHeader() { return m_DiskHeader; }
|
2016-01-20 16:43:23 +00:00
|
|
|
void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; }
|
2019-08-11 09:45:05 +00:00
|
|
|
uint32_t GetDiskAddressBlock(uint16_t head, uint16_t track, uint16_t block, uint16_t sector, uint16_t sectorsize);
|
2019-08-12 15:50:04 +00:00
|
|
|
uint32_t CalculateCrc();
|
2019-01-25 20:32:26 +00:00
|
|
|
stdstr GetRomName() const { return m_RomName; }
|
|
|
|
stdstr GetFileName() const { return m_FileName; }
|
|
|
|
stdstr GetDiskIdent() const { return m_DiskIdent; }
|
|
|
|
Country GetCountry() const { return m_Country; }
|
2016-01-20 13:31:29 +00:00
|
|
|
void UnallocateDiskImage();
|
2016-01-20 00:14:18 +00:00
|
|
|
|
2016-01-20 16:43:23 +00:00
|
|
|
LanguageStringID GetError() const { return m_ErrorMsg; }
|
|
|
|
|
2016-01-20 00:14:18 +00:00
|
|
|
private:
|
2016-01-20 13:31:29 +00:00
|
|
|
bool AllocateDiskImage(uint32_t DiskFileSize);
|
2019-01-26 15:58:41 +00:00
|
|
|
bool AllocateDiskHeader();
|
2016-01-20 13:31:29 +00:00
|
|
|
bool AllocateAndLoadDiskImage(const char * FileLoc);
|
2019-08-12 21:07:33 +00:00
|
|
|
bool LoadDiskRAMImage();
|
2016-01-20 13:31:29 +00:00
|
|
|
void ByteSwapDisk();
|
2016-05-24 19:26:05 +00:00
|
|
|
void ForceByteSwapDisk();
|
2016-01-20 13:31:29 +00:00
|
|
|
void SetError(LanguageStringID ErrorMsg);
|
2019-08-12 09:40:44 +00:00
|
|
|
|
|
|
|
void DetectSystemArea();
|
|
|
|
bool IsSysSectorGood(uint32_t block, uint32_t sectorsize);
|
|
|
|
Country GetDiskCountryCode();
|
2019-08-11 16:13:52 +00:00
|
|
|
void InitSysDataD64();
|
|
|
|
void DeinitSysDataD64();
|
2019-08-10 19:18:17 +00:00
|
|
|
void GenerateLBAToPhysTable();
|
2019-08-12 21:07:33 +00:00
|
|
|
void DetectRamAddress();
|
2019-08-10 19:18:17 +00:00
|
|
|
uint32_t LBAToVZone(uint32_t lba);
|
|
|
|
uint32_t LBAToByte(uint32_t lba, uint32_t nlbas);
|
|
|
|
uint16_t LBAToPhys(uint32_t lba);
|
|
|
|
uint16_t PhysToLBA(uint16_t head, uint16_t track, uint16_t block);
|
2016-01-20 00:14:18 +00:00
|
|
|
|
2021-05-18 11:51:36 +00:00
|
|
|
// Constant values
|
2016-05-24 19:26:05 +00:00
|
|
|
enum { ReadFromRomSection = 0x400000, MameFormatSize = 0x0435B0C0, SDKFormatSize = 0x03DEC800,
|
2019-08-10 19:18:17 +00:00
|
|
|
DiskFormatMAME = 0x0, DiskFormatSDK = 0x1, DiskFormatD64 = 0x2 };
|
2016-01-20 00:14:18 +00:00
|
|
|
|
2021-05-18 11:51:36 +00:00
|
|
|
// Class variables
|
2016-01-20 13:31:29 +00:00
|
|
|
CFile m_DiskFile;
|
|
|
|
uint8_t * m_DiskImage;
|
|
|
|
uint8_t * m_DiskImageBase;
|
2019-01-26 15:58:41 +00:00
|
|
|
uint8_t * m_DiskHeader;
|
|
|
|
uint8_t * m_DiskHeaderBase;
|
2016-01-20 13:31:29 +00:00
|
|
|
uint32_t m_DiskFileSize;
|
2016-01-20 16:43:23 +00:00
|
|
|
uint32_t m_DiskBufAddress;
|
2019-08-11 16:13:52 +00:00
|
|
|
uint32_t m_DiskSysAddress;
|
|
|
|
uint32_t m_DiskIDAddress;
|
2019-08-12 15:50:04 +00:00
|
|
|
uint32_t m_DiskRomAddress;
|
2019-08-12 21:07:33 +00:00
|
|
|
uint32_t m_DiskRamAddress;
|
2016-01-20 13:31:29 +00:00
|
|
|
LanguageStringID m_ErrorMsg;
|
2019-01-25 20:32:26 +00:00
|
|
|
Country m_Country;
|
2019-01-25 07:11:40 +00:00
|
|
|
stdstr m_RomName, m_FileName, m_DiskIdent;
|
2021-05-18 11:51:36 +00:00
|
|
|
uint8_t m_DiskFormat; // 0 = MAME, 1 = SDK, 2 = D64
|
2019-08-10 19:18:17 +00:00
|
|
|
uint8_t m_DiskType;
|
2019-08-12 21:07:33 +00:00
|
|
|
bool m_isShadowDisk;
|
2016-01-26 14:31:24 +00:00
|
|
|
|
2021-05-18 11:51:36 +00:00
|
|
|
// Disk defines
|
2019-08-10 19:18:17 +00:00
|
|
|
#define MAX_LBA 0x10DB
|
|
|
|
#define SIZE_LBA MAX_LBA+1
|
|
|
|
#define SYSTEM_LBAS 24
|
2019-08-11 16:13:52 +00:00
|
|
|
#define DISKID_LBA 14
|
2019-08-12 09:40:44 +00:00
|
|
|
|
|
|
|
#define DISK_COUNTRY_JPN 0xE848D316
|
|
|
|
#define DISK_COUNTRY_USA 0x2263EE56
|
|
|
|
#define DISK_COUNTRY_DEV 0x00000000
|
|
|
|
|
2016-01-26 14:31:24 +00:00
|
|
|
#define SECTORS_PER_BLOCK 85
|
|
|
|
#define BLOCKS_PER_TRACK 2
|
|
|
|
|
2019-08-10 19:18:17 +00:00
|
|
|
const uint32_t SECTORSIZE[16] = { 232, 216, 208, 192, 176, 160, 144, 128,
|
|
|
|
216, 208, 192, 176, 160, 144, 128, 112 };
|
|
|
|
const uint32_t SECTORSIZE_P[9] = { 232, 216, 208, 192, 176, 160, 144, 128, 112 };
|
|
|
|
const uint32_t ZoneTracks[16] = { 158, 158, 149, 149, 149, 149, 149, 114,
|
|
|
|
158, 158, 149, 149, 149, 149, 149, 114 };
|
|
|
|
|
|
|
|
const uint16_t VZONE_LBA_TBL[7][16] = {
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x047E, 0x05A2, 0x06B4, 0x07C6, 0x08D8, 0x09EA, 0x0AB6, 0x0B82, 0x0C94, 0x0DA6, 0x0EB8, 0x0FCA, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x06A2, 0x07C6, 0x08D8, 0x09EA, 0x0AFC, 0x0BC8, 0x0C94, 0x0DA6, 0x0EB8, 0x0FCA, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x0690, 0x07A2, 0x08C6, 0x09EA, 0x0AFC, 0x0C0E, 0x0CDA, 0x0DA6, 0x0EB8, 0x0FCA, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x0690, 0x07A2, 0x08B4, 0x09C6, 0x0AEA, 0x0C0E, 0x0D20, 0x0DEC, 0x0EB8, 0x0FCA, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x0690, 0x07A2, 0x08B4, 0x09C6, 0x0AD8, 0x0BEA, 0x0D0E, 0x0E32, 0x0EFE, 0x0FCA, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x0690, 0x07A2, 0x086E, 0x0980, 0x0A92, 0x0BA4, 0x0CB6, 0x0DC8, 0x0EEC, 0x1010, 0x10DC},
|
|
|
|
{0x0124, 0x0248, 0x035A, 0x046C, 0x057E, 0x0690, 0x07A2, 0x086E, 0x093A, 0x0A4C, 0x0B5E, 0x0C70, 0x0D82, 0x0E94, 0x0FB8, 0x10DC}
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint8_t VZONE_PZONE_TBL[7][16] = {
|
|
|
|
{0x0, 0x1, 0x2, 0x9, 0x8, 0x3, 0x4, 0x5, 0x6, 0x7, 0xF, 0xE, 0xD, 0xC, 0xB, 0xA},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0xA, 0x9, 0x8, 0x4, 0x5, 0x6, 0x7, 0xF, 0xE, 0xD, 0xC, 0xB},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0x4, 0xB, 0xA, 0x9, 0x8, 0x5, 0x6, 0x7, 0xF, 0xE, 0xD, 0xC},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0xC, 0xB, 0xA, 0x9, 0x8, 0x6, 0x7, 0xF, 0xE, 0xD},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, 0x7, 0xF, 0xE},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, 0xF},
|
|
|
|
{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xF, 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8}
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint16_t SCYL_ZONE_TBL[2][8] = {
|
|
|
|
{0x000, 0x09E, 0x13C, 0x1D1, 0x266, 0x2FB, 0x390, 0x425},
|
|
|
|
{0x091, 0x12F, 0x1C4, 0x259, 0x2EE, 0x383, 0x418, 0x48A}
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint16_t OUTERCYL_TBL[8] = { 0x000, 0x09E, 0x13C, 0x1D1, 0x266, 0x2FB, 0x390, 0x425 };
|
|
|
|
|
|
|
|
const uint16_t RAM_START_LBA[7] = { 0x5A2, 0x7C6, 0x9EA, 0xC0E, 0xE32, 0x1010, 0x10DC };
|
|
|
|
|
2019-08-13 22:04:20 +00:00
|
|
|
const uint32_t RAM_SIZES[7] = { 0x24A9DC0, 0x1C226C0, 0x1450F00, 0xD35680, 0x6CFD40, 0x1DA240, 0x0 };
|
|
|
|
|
2019-08-10 19:18:17 +00:00
|
|
|
#define BLOCKSIZE(_zone) SECTORSIZE[_zone] * SECTORS_PER_BLOCK
|
2016-01-26 14:31:24 +00:00
|
|
|
#define TRACKSIZE(_zone) BLOCKSIZE(_zone) * BLOCKS_PER_TRACK
|
|
|
|
#define ZONESIZE(_zone) TRACKSIZE(_zone) * ZoneTracks[_zone]
|
|
|
|
#define VZONESIZE(_zone) TRACKSIZE(_zone) * (ZoneTracks[_zone] - 0xC)
|
2019-08-10 19:18:17 +00:00
|
|
|
|
|
|
|
#define VZoneToPZone(x, y) VZONE_PZONE_TBL[y][x]
|
|
|
|
|
2021-05-18 11:51:36 +00:00
|
|
|
// Used for MAME format
|
2019-08-10 19:18:17 +00:00
|
|
|
const uint32_t MAMEStartOffset[16] =
|
|
|
|
{ 0x0, 0x5F15E0, 0xB79D00, 0x10801A0, 0x1523720, 0x1963D80, 0x1D414C0, 0x20BBCE0,
|
|
|
|
0x23196E0, 0x28A1E00, 0x2DF5DC0, 0x3299340, 0x36D99A0, 0x3AB70E0, 0x3E31900, 0x4149200 };
|
|
|
|
|
2021-05-18 11:51:36 +00:00
|
|
|
// Used for SDK and D64 format
|
2019-08-10 19:18:17 +00:00
|
|
|
uint16_t LBAToPhysTable[SIZE_LBA];
|
2016-01-20 00:14:18 +00:00
|
|
|
};
|