Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/vpinball/pinmame
Browse files Browse the repository at this point in the history
  • Loading branch information
toxieainc committed Mar 19, 2024
2 parents 57a895f + e5dcb4e commit 4b805bd
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 1 deletion.
93 changes: 93 additions & 0 deletions src/libpinmame/libpinmame.cpp
Expand Up @@ -6,6 +6,7 @@

#include <thread>
#include <vector>
#include <algorithm>

#if defined(_WIN32) || defined(_WIN64)
#define strcasecmp _stricmp
Expand Down Expand Up @@ -47,6 +48,10 @@ PinmameMechInfo _mechInfo[MECH_MAXMECH];
PinmameAudioInfo _audioInfo;
float _audioData[PINMAME_ACCUMULATOR_SAMPLES * 2];

int _nvramInit = 0;
uint8_t _nvram[CORE_MAXNVRAM];
PinmameNVRAMState _nvramState[CORE_MAXNVRAM];

typedef struct {
PinmameDisplayLayout layout;
void* pData;
Expand Down Expand Up @@ -1300,6 +1305,94 @@ PINMAMEAPI void PinmameSetDIP(const int dipBank, const int value)
vp_setDIP(dipBank, value);
}

/******************************************************
* PinmameGetMaxNVRAM
******************************************************/

PINMAMEAPI int PinmameGetMaxNVRAM()
{
return CORE_MAXNVRAM;
}

/******************************************************
* PinmameGetNVRAM
******************************************************/

PINMAMEAPI int PinmameGetNVRAM(PinmameNVRAMState* const p_nvramStates)
{
if (!_isRunning)
return -1;

if (!(Machine && Machine->drv && Machine->drv->nvram_handler))
return -1;

mame_file* nvram_file = (mame_file*)malloc(sizeof(mame_file));
memset(nvram_file, 0, sizeof(mame_file));
nvram_file->type = RAM_FILE;
(*Machine->drv->nvram_handler)(nvram_file, 1);

if (nvram_file->offset == 0) {
mame_fclose(nvram_file);
return -1;
}

int size = std::min((int)nvram_file->offset, (int)CORE_MAXNVRAM);
for (int i = 0; i < size; ++i) {
p_nvramStates[i].nvramNo = i;
p_nvramStates[i].currStat = nvram_file->data[i];
p_nvramStates[i].oldStat = 0;
}

return size;
}

/******************************************************
* PinmameGetChangedNVRAM
******************************************************/

PINMAMEAPI int PinmameGetChangedNVRAM(PinmameNVRAMState* const p_nvramStates)
{
if (!_isRunning)
return -1;

if (!(Machine && Machine->drv && Machine->drv->nvram_handler))
return -1;

mame_file* nvram_file = (mame_file*)malloc(sizeof(mame_file));
memset(nvram_file, 0, sizeof(mame_file));
nvram_file->type = RAM_FILE;
(*Machine->drv->nvram_handler)(nvram_file, 1);

if (nvram_file->offset == 0) {
mame_fclose(nvram_file);
return -1;
}

int count = 0;
int size = std::min((int)nvram_file->offset, (int)CORE_MAXNVRAM);

if (_nvramInit == 0) {
memcpy(_nvram, nvram_file->data, size);
_nvramInit = 1;
}
else {
for (int i = 0; i < size; ++i) {
if (_nvram[i] != nvram_file->data[i]) {
p_nvramStates[count].nvramNo = i;
p_nvramStates[count].currStat = nvram_file->data[i];
p_nvramStates[count].oldStat = _nvram[i];
count++;

_nvram[i] = nvram_file->data[i];
}
}
}

mame_fclose(nvram_file);

return count;
}

/******************************************************
* PinmameSetUserData
******************************************************/
Expand Down
11 changes: 10 additions & 1 deletion src/libpinmame/libpinmame.h
Expand Up @@ -381,7 +381,13 @@ typedef struct {
typedef struct {
int sndNo;
} PinmameSoundCommand;


typedef struct {
int nvramNo;
uint8_t oldStat;
uint8_t currStat;
} PinmameNVRAMState;

typedef struct {
const char* name;
PINMAME_KEYCODE code;
Expand Down Expand Up @@ -466,4 +472,7 @@ PINMAMEAPI int PinmameGetMaxSoundCommands();
PINMAMEAPI int PinmameGetNewSoundCommands(PinmameSoundCommand* const p_newCommands);
PINMAMEAPI int PinmameGetDIP(const int dipBank);
PINMAMEAPI void PinmameSetDIP(const int dipBank, const int value);
PINMAMEAPI int PinmameGetMaxNVRAM();
PINMAMEAPI int PinmameGetNVRAM(PinmameNVRAMState* const p_nvramStates);
PINMAMEAPI int PinmameGetChangedNVRAM(PinmameNVRAMState* const p_nvramStates);
PINMAMEAPI void PinmameSetUserData(const void* p_userData);

0 comments on commit 4b805bd

Please sign in to comment.