[Project64] Use standard types in Eeprom.cpp

This commit is contained in:
zilmar 2015-11-15 13:20:18 +11:00
parent 64e0dae30f
commit d740aaf350
2 changed files with 175 additions and 167 deletions

View File

@ -9,190 +9,193 @@
* * * *
****************************************************************************/ ****************************************************************************/
#include "stdafx.h" #include "stdafx.h"
#include "Eeprom.h"
#include <Project64\N64 System\System Globals.h>
#include <Project64\N64 System\N64 Class.h>
#include <time.h> #include <time.h>
CEeprom::CEeprom(bool ReadOnly): CEeprom::CEeprom(bool ReadOnly) :
m_ReadOnly(ReadOnly), m_ReadOnly(ReadOnly),
m_hFile(NULL) m_hFile(NULL)
{ {
memset(m_EEPROM,0xFF,sizeof(m_EEPROM)); memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
} }
CEeprom::~CEeprom() CEeprom::~CEeprom()
{ {
if (m_hFile) if (m_hFile)
{ {
CloseHandle(m_hFile); CloseHandle(m_hFile);
m_hFile = NULL; m_hFile = NULL;
} }
} }
unsigned char byte2bcd(int n) uint8_t byte2bcd(int32_t n)
{ {
n %= 100; n %= 100;
return (unsigned char)(((n / 10) << 4) | (n % 10)); return (uint8_t)(((n / 10) << 4) | (n % 10));
} }
void CEeprom::EepromCommand ( BYTE * Command) void CEeprom::EepromCommand(uint8_t * Command)
{ {
time_t curtime_time; time_t curtime_time;
struct tm curtime; struct tm curtime;
if (g_System->m_SaveUsing == SaveChip_Auto) if (g_System->m_SaveUsing == SaveChip_Auto)
{ {
g_System->m_SaveUsing = SaveChip_Eeprom_4K; g_System->m_SaveUsing = SaveChip_Eeprom_4K;
} }
switch (Command[2]) switch (Command[2])
{ {
case 0: // check case 0: // check
if (g_System->m_SaveUsing != SaveChip_Eeprom_4K && g_System->m_SaveUsing != SaveChip_Eeprom_16K) if (g_System->m_SaveUsing != SaveChip_Eeprom_4K && g_System->m_SaveUsing != SaveChip_Eeprom_16K)
{ {
Command[1] |= 0x80; Command[1] |= 0x80;
break; break;
} }
if (Command[1] != 3) if (Command[1] != 3)
{ {
Command[1] |= 0x40; Command[1] |= 0x40;
if ((Command[1] & 3) > 0) if ((Command[1] & 3) > 0)
Command[3] = 0x00; Command[3] = 0x00;
if ((Command[1] & 3) > 1) if ((Command[1] & 3) > 1)
Command[4] = (g_System->m_SaveUsing == SaveChip_Eeprom_4K) ? 0x80 : 0xC0; Command[4] = (g_System->m_SaveUsing == SaveChip_Eeprom_4K) ? 0x80 : 0xC0;
if ((Command[1] & 3) > 2) if ((Command[1] & 3) > 2)
Command[5] = 0x00; Command[5] = 0x00;
} }
else else
{ {
Command[3] = 0x00; Command[3] = 0x00;
Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K?0x80:0xC0; Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K ? 0x80 : 0xC0;
Command[5] = 0x00; Command[5] = 0x00;
} }
break; break;
case 4: // Read from Eeprom case 4: // Read from Eeprom
if (Command[0] != 2 && bHaveDebugger()) if (Command[0] != 2 && bHaveDebugger())
{ {
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command"); g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
} }
if (Command[1] != 8 && bHaveDebugger()) if (Command[1] != 8 && bHaveDebugger())
{ {
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command"); g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
} }
ReadFrom(&Command[4],Command[3]); ReadFrom(&Command[4], Command[3]);
break; break;
case 5: //Write to Eeprom case 5: //Write to Eeprom
if (Command[0] != 10 && bHaveDebugger()) if (Command[0] != 10 && bHaveDebugger())
{ {
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command"); g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
} }
if (Command[1] != 1 && bHaveDebugger()) if (Command[1] != 1 && bHaveDebugger())
{ {
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command"); g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
} }
WriteTo(&Command[4],Command[3]); WriteTo(&Command[4], Command[3]);
break; break;
case 6: //RTC Status query case 6: //RTC Status query
Command[3] = 0x00; Command[3] = 0x00;
Command[4] = 0x10; Command[4] = 0x10;
Command[5] = 0x00; Command[5] = 0x00;
break; break;
case 7: //Read RTC block case 7: //Read RTC block
switch (Command[3]) switch (Command[3])
{ {
case 0: //Block number case 0: //Block number
Command[4] = 0x00; Command[4] = 0x00;
Command[5] = 0x02; Command[5] = 0x02;
Command[12] = 0x00; Command[12] = 0x00;
break; break;
case 1: case 1:
//read block, Command[2], Unimplemented //read block, Command[2], Unimplemented
break; break;
case 2: //Set RTC Time case 2: //Set RTC Time
time(&curtime_time); time(&curtime_time);
memcpy(&curtime, localtime(&curtime_time), sizeof(curtime)); // fd's fix memcpy(&curtime, localtime(&curtime_time), sizeof(curtime)); // fd's fix
Command[4] = byte2bcd(curtime.tm_sec); Command[4] = byte2bcd(curtime.tm_sec);
Command[5] = byte2bcd(curtime.tm_min); Command[5] = byte2bcd(curtime.tm_min);
Command[6] = 0x80 + byte2bcd(curtime.tm_hour); Command[6] = 0x80 + byte2bcd(curtime.tm_hour);
Command[7] = byte2bcd(curtime.tm_mday); Command[7] = byte2bcd(curtime.tm_mday);
Command[8] = byte2bcd(curtime.tm_wday); Command[8] = byte2bcd(curtime.tm_wday);
Command[9] = byte2bcd(curtime.tm_mon + 1); Command[9] = byte2bcd(curtime.tm_mon + 1);
Command[10] = byte2bcd(curtime.tm_year); Command[10] = byte2bcd(curtime.tm_year);
Command[11] = byte2bcd(curtime.tm_year / 100); Command[11] = byte2bcd(curtime.tm_year / 100);
Command[12] = 0x00; // status Command[12] = 0x00; // status
break; break;
} }
break; break;
case 8: case 8:
//Write RTC, unimplemented //Write RTC, unimplemented
if (g_Settings->LoadDword(Debugger_ShowPifErrors)) if (g_Settings->LoadDword(Debugger_ShowPifErrors))
{ {
g_Notify->DisplayError(L"Write RTC, unimplemented"); g_Notify->DisplayError(L"Write RTC, unimplemented");
} }
break; break;
default: default:
if (g_Settings->LoadDword(Debugger_ShowPifErrors)) if (g_Settings->LoadDword(Debugger_ShowPifErrors))
{ {
g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d",Command[2]).ToUTF16().c_str()); g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d", Command[2]).ToUTF16().c_str());
} }
} }
} }
void CEeprom::LoadEeprom() void CEeprom::LoadEeprom()
{ {
CPath FileName; CPath FileName;
DWORD dwRead; DWORD dwRead;
memset(m_EEPROM,0xFF,sizeof(m_EEPROM)); memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
FileName.SetDriveDirectory( g_Settings->LoadStringVal(Directory_NativeSave).c_str()); FileName.SetDriveDirectory(g_Settings->LoadStringVal(Directory_NativeSave).c_str());
FileName.SetName(g_Settings->LoadStringVal(Game_GameName).c_str()); FileName.SetName(g_Settings->LoadStringVal(Game_GameName).c_str());
FileName.SetExtension("eep"); FileName.SetExtension("eep");
if (!FileName.DirectoryExists()) if (!FileName.DirectoryExists())
{ {
FileName.DirectoryCreate(); FileName.DirectoryCreate();
} }
m_hFile = CreateFile(FileName,m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS, m_hFile = CreateFile(FileName, m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
if (m_hFile == INVALID_HANDLE_VALUE) if (m_hFile == INVALID_HANDLE_VALUE)
{ {
WriteTraceF(TraceError,__FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X",(LPCTSTR)FileName, m_ReadOnly, GetLastError()); WriteTraceF(TraceError, __FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X", (LPCTSTR)FileName, m_ReadOnly, GetLastError());
g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM)); g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM));
return; return;
} }
SetFilePointer(m_hFile,0,NULL,FILE_BEGIN); SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
ReadFile(m_hFile,m_EEPROM,sizeof(m_EEPROM),&dwRead,NULL); ReadFile(m_hFile, m_EEPROM, sizeof(m_EEPROM), &dwRead, NULL);
} }
void CEeprom::ReadFrom(BYTE * Buffer, int line) void CEeprom::ReadFrom(uint8_t * Buffer, int32_t line)
{ {
int i; int32_t i;
if (m_hFile == NULL) if (m_hFile == NULL)
{ {
LoadEeprom(); LoadEeprom();
} }
for (i=0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
Buffer[i] = m_EEPROM[line*8+i]; Buffer[i] = m_EEPROM[line * 8 + i];
} }
} }
void CEeprom::WriteTo(BYTE * Buffer, int line) void CEeprom::WriteTo(uint8_t * Buffer, int32_t line)
{ {
DWORD dwWritten; DWORD dwWritten;
int i; int32_t i;
if (m_hFile == NULL) if (m_hFile == NULL)
{ {
LoadEeprom(); LoadEeprom();
} }
for (i=0;i<8;i++) for (i = 0; i < 8; i++)
{ {
m_EEPROM[line*8+i]=Buffer[i]; m_EEPROM[line * 8 + i] = Buffer[i];
} }
SetFilePointer(m_hFile,line*8,NULL,FILE_BEGIN); SetFilePointer(m_hFile, line * 8, NULL, FILE_BEGIN);
WriteFile( m_hFile,Buffer,8,&dwWritten,NULL ); WriteFile(m_hFile, Buffer, 8, &dwWritten, NULL);
FlushFileBuffers(m_hFile); FlushFileBuffers(m_hFile);
} }

View File

@ -9,22 +9,27 @@
* * * *
****************************************************************************/ ****************************************************************************/
#pragma once #pragma once
#include <Project64-core/Settings/Debug Settings.h>
class CEeprom : class CEeprom :
private CDebugSettings private CDebugSettings
{ {
public: public:
CEeprom ( bool ReadOnly ); CEeprom ( bool ReadOnly );
~CEeprom(); ~CEeprom();
void EepromCommand ( BYTE * Command ); void EepromCommand ( uint8_t * Command );
private: private:
void LoadEeprom (); CEeprom(void); // Disable default constructor
void ReadFrom ( BYTE * Buffer, int line ); CEeprom(const CEeprom&); // Disable copy constructor
void WriteTo ( BYTE * Buffer, int line ); CEeprom& operator=(const CEeprom&); // Disable assignment
BYTE m_EEPROM[0x800]; void LoadEeprom ();
bool m_ReadOnly; void ReadFrom ( uint8_t * Buffer, int32_t line );
HANDLE m_hFile; void WriteTo ( uint8_t * Buffer, int32_t line );
uint8_t m_EEPROM[0x800];
bool m_ReadOnly;
void * m_hFile;
}; };