Skip to content

Commit

Permalink
Add data exchange through a global shared state block
Browse files Browse the repository at this point in the history
This commits allows to share previously unshared data without overloading too much the API by adding a single data block for pulsed state, device state, modulated segments, video displays, multiple DMDs with raw DMD frames (for correct rendering and colorization).

This commit contains the skeleton and base implementation to set up the ground for more testing on client side  (VPX) when support will be more advanced there.
  • Loading branch information
vbousquet committed Feb 5, 2025
1 parent afa11cf commit daae5b7
Show file tree
Hide file tree
Showing 21 changed files with 953 additions and 47 deletions.
1 change: 1 addition & 0 deletions cmake/libpinmame/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,7 @@ set(PINMAME_SOURCES
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/pinmame/CMakeLists_win-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,7 @@ add_executable(pinmame WIN32
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/pinmame/CMakeLists_win-x86.txt
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,7 @@ add_executable(pinmame WIN32
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/pinmame32/CMakeLists_win-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,7 @@ add_executable(pinmame32 WIN32
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/pinmame32/CMakeLists_win-x86.txt
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ add_executable(pinmame32 WIN32
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/vpinmame/CMakeLists_win-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,7 @@ add_library(vpinmame SHARED
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/vpinmame/CMakeLists_win-x86.txt
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,7 @@ add_library(vpinmame SHARED
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/xpinmame/CMakeLists_linux-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,7 @@ add_executable(xpinmame
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
1 change: 1 addition & 0 deletions cmake/xpinmame/CMakeLists_osx-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,7 @@ add_executable(xpinmame
src/wpc/peyper.c
src/wpc/peyper.h
src/wpc/peypergames.c
src/wpc/pinmamedef.h
src/wpc/play.c
src/wpc/play.h
src/wpc/playgames.c
Expand Down
28 changes: 24 additions & 4 deletions src/libpinmame/libpinmame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,7 @@ int StartGame(const int gameNum)
* PinmameGetGame
******************************************************/

PINMAMEAPI PINMAME_STATUS PinmameGetGame(const char* const p_name, PinmameGameCallback callback, const void* p_userData)
PINMAMEAPI PINMAME_STATUS PinmameGetGame(const char* const p_name, PinmameGameCallback callback, void* const p_userData)
{
if (!_p_Config)
return PINMAME_STATUS_CONFIG_NOT_SET;
Expand Down Expand Up @@ -686,7 +686,7 @@ PINMAMEAPI PINMAME_STATUS PinmameGetGame(const char* const p_name, PinmameGameCa
* PinmameGetGames
******************************************************/

PINMAMEAPI PINMAME_STATUS PinmameGetGames(PinmameGameCallback callback, const void* p_userData)
PINMAMEAPI PINMAME_STATUS PinmameGetGames(PinmameGameCallback callback, void* const p_userData)
{
if (!_p_Config)
return PINMAME_STATUS_CONFIG_NOT_SET;
Expand Down Expand Up @@ -886,6 +886,8 @@ PINMAMEAPI PINMAME_STATUS PinmameRun(const char* const p_name)
if (gameNum < 0)
return PINMAME_STATUS_GAME_NOT_FOUND;

OnStateChange(2); // Starting state

vp_init();

_p_gameThread = new std::thread(StartGame, gameNum);
Expand Down Expand Up @@ -1407,7 +1409,25 @@ PINMAMEAPI int PinmameGetChangedNVRAM(PinmameNVRAMState* const p_nvramStates)
* PinmameSetUserData
******************************************************/

PINMAMEAPI void PinmameSetUserData(const void* p_userData)
PINMAMEAPI void PinmameSetUserData(void* const p_userData)
{
_p_userData = (void*)p_userData;
}
}

/******************************************************
* PinmameGetStateBlock
******************************************************/

PINMAMEAPI int PinmameGetStateBlock(const unsigned int updateMask, pinmame_tMachineOutputState** pp_outputState)
{
if (!_isRunning)
return -1;

pinmame_tMachineOutputState* p_outputState = (pinmame_tMachineOutputState*)core_getOutputState(updateMask);
if (!p_outputState)
return -1;

*pp_outputState = p_outputState;

return 0;
}
38 changes: 22 additions & 16 deletions src/libpinmame/libpinmame.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
#define PINMAME_MAX_MECHSW 20
#define PINMAME_ACCUMULATOR_SAMPLES 8192 // from mixer.c

#define UINT32 uint32_t
#define UINT8 uint8_t
#include "wpc/pinmamedef.h"

typedef enum {
PINMAME_LOG_LEVEL_DEBUG = 0,
PINMAME_LOG_LEVEL_INFO = 1,
Expand Down Expand Up @@ -394,19 +398,19 @@ typedef struct {
unsigned int standardcode;
} PinmameKeyboardInfo;

typedef void (PINMAMECALLBACK *PinmameGameCallback)(PinmameGame* p_game, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnStateUpdatedCallback)(int state, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnDisplayAvailableCallback)(int index, int displayCount, PinmameDisplayLayout* p_displayLayout, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnDisplayUpdatedCallback)(int index, void* p_displayData, PinmameDisplayLayout* p_displayLayout, const void* p_userData);
typedef int (PINMAMECALLBACK *PinmameOnAudioAvailableCallback)(PinmameAudioInfo* p_audioInfo, const void* p_userData);
typedef int (PINMAMECALLBACK *PinmameOnAudioUpdatedCallback)(void* p_buffer, int samples, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnMechAvailableCallback)(int mechNo, PinmameMechInfo* p_mechInfo, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnMechUpdatedCallback)(int mechNo, PinmameMechInfo* p_mechInfo, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnSolenoidUpdatedCallback)(PinmameSolenoidState* p_solenoidState, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnConsoleDataUpdatedCallback)(void* p_data, int size, const void* p_userData);
typedef int (PINMAMECALLBACK *PinmameIsKeyPressedFunction)(PINMAME_KEYCODE keycode, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnLogMessageCallback)(PINMAME_LOG_LEVEL logLevel, const char* format, va_list args, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameOnSoundCommandCallback)(int boardNo, int cmd, const void* p_userData);
typedef void (PINMAMECALLBACK *PinmameGameCallback)(PinmameGame* p_game, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnStateUpdatedCallback)(int state, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnDisplayAvailableCallback)(int index, int displayCount, PinmameDisplayLayout* p_displayLayout, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnDisplayUpdatedCallback)(int index, void* p_displayData, PinmameDisplayLayout* p_displayLayout, void* const p_userData);
typedef int (PINMAMECALLBACK *PinmameOnAudioAvailableCallback)(PinmameAudioInfo* p_audioInfo, void* const p_userData);
typedef int (PINMAMECALLBACK *PinmameOnAudioUpdatedCallback)(void* p_buffer, int samples, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnMechAvailableCallback)(int mechNo, PinmameMechInfo* p_mechInfo, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnMechUpdatedCallback)(int mechNo, PinmameMechInfo* p_mechInfo, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnSolenoidUpdatedCallback)(PinmameSolenoidState* p_solenoidState, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnConsoleDataUpdatedCallback)(void* p_data, int size, void* const p_userData);
typedef int (PINMAMECALLBACK *PinmameIsKeyPressedFunction)(PINMAME_KEYCODE keycode, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnLogMessageCallback)(PINMAME_LOG_LEVEL logLevel, const char* format, va_list args, void* const p_userData);
typedef void (PINMAMECALLBACK *PinmameOnSoundCommandCallback)(int boardNo, int cmd, void* const p_userData);

typedef struct {
const PINMAME_AUDIO_FORMAT audioFormat;
Expand All @@ -426,8 +430,8 @@ typedef struct {
PinmameOnSoundCommandCallback cb_OnSoundCommand;
} PinmameConfig;

PINMAMEAPI PINMAME_STATUS PinmameGetGame(const char* const p_name, PinmameGameCallback callback, const void* p_userData);
PINMAMEAPI PINMAME_STATUS PinmameGetGames(PinmameGameCallback callback, const void* p_userData);
PINMAMEAPI PINMAME_STATUS PinmameGetGame(const char* const p_name, PinmameGameCallback callback, void* const p_userData);
PINMAMEAPI PINMAME_STATUS PinmameGetGames(PinmameGameCallback callback, void* const p_userData);
PINMAMEAPI void PinmameSetConfig(const PinmameConfig* const p_config);
PINMAMEAPI void PinmameSetPath(const PINMAME_FILE_TYPE fileType, const char* const p_path);
PINMAMEAPI int PinmameGetCheat();
Expand Down Expand Up @@ -476,4 +480,6 @@ 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);
PINMAMEAPI void PinmameSetUserData(void* const p_userData);
PINMAMEAPI int PinmameGetStateBlock(const unsigned int updateMask, pinmame_tMachineOutputState** pp_outputState);

26 changes: 13 additions & 13 deletions src/libpinmame/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,13 @@ void DumpAlphanumeric(int index, UINT16* p_displayData, PinmameDisplayLayout* p_
printf("%s\n", output[row]);
}

void PINMAMECALLBACK Game(PinmameGame* game, const void* p_userData)
void PINMAMECALLBACK Game(PinmameGame* game, void* const p_userData)
{
printf("Game(): name=%s, description=%s, manufacturer=%s, year=%s, flags=%lu, found=%d\n",
game->name, game->description, game->manufacturer, game->year, (unsigned long)game->flags, game->found);
}

void PINMAMECALLBACK OnStateUpdated(int state, const void* p_userData)
void PINMAMECALLBACK OnStateUpdated(int state, void* const p_userData)
{
printf("OnStateUpdated(): state=%d\n", state);

Expand All @@ -161,7 +161,7 @@ void PINMAMECALLBACK OnStateUpdated(int state, const void* p_userData)
PinmameSetMech(1, &mechConfig);
}

void PINMAMECALLBACK OnDisplayAvailable(int index, int displayCount, PinmameDisplayLayout* p_displayLayout, const void* p_userData)
void PINMAMECALLBACK OnDisplayAvailable(int index, int displayCount, PinmameDisplayLayout* p_displayLayout, void* const p_userData)
{
printf("OnDisplayAvailable(): index=%d, displayCount=%d, type=%d, top=%d, left=%d, width=%d, height=%d, depth=%d, length=%d\n",
index,
Expand All @@ -175,7 +175,7 @@ void PINMAMECALLBACK OnDisplayAvailable(int index, int displayCount, PinmameDisp
p_displayLayout->length);
}

void PINMAMECALLBACK OnDisplayUpdated(int index, void* p_displayData, PinmameDisplayLayout* p_displayLayout, const void* p_userData)
void PINMAMECALLBACK OnDisplayUpdated(int index, void* p_displayData, PinmameDisplayLayout* p_displayLayout, void* const p_userData)
{
printf("OnDisplayUpdated(): index=%d, type=%d, top=%d, left=%d, width=%d, height=%d, depth=%d, length=%d\n",
index,
Expand All @@ -197,7 +197,7 @@ void PINMAMECALLBACK OnDisplayUpdated(int index, void* p_displayData, PinmameDis
}
}

int PINMAMECALLBACK OnAudioAvailable(PinmameAudioInfo* p_audioInfo, const void* p_userData)
int PINMAMECALLBACK OnAudioAvailable(PinmameAudioInfo* p_audioInfo, void* const p_userData)
{
printf("OnAudioAvailable(): format=%d, channels=%d, sampleRate=%.2f, framesPerSecond=%.2f, samplesPerFrame=%d, bufferSize=%d\n",
p_audioInfo->format,
Expand All @@ -209,17 +209,17 @@ int PINMAMECALLBACK OnAudioAvailable(PinmameAudioInfo* p_audioInfo, const void*
return p_audioInfo->samplesPerFrame;
}

int PINMAMECALLBACK OnAudioUpdated(void* p_buffer, int samples, const void* p_userData)
int PINMAMECALLBACK OnAudioUpdated(void* p_buffer, int samples, void* const p_userData)
{
return samples;
}

void PINMAMECALLBACK OnSolenoidUpdated(PinmameSolenoidState* p_solenoidState, const void* p_userData)
void PINMAMECALLBACK OnSolenoidUpdated(PinmameSolenoidState* p_solenoidState, void* const p_userData)
{
printf("OnSolenoidUpdated: solenoid=%d, state=%d\n", p_solenoidState->solNo, p_solenoidState->state);
}

void PINMAMECALLBACK OnMechAvailable(int mechNo, PinmameMechInfo* p_mechInfo, const void* p_userData)
void PINMAMECALLBACK OnMechAvailable(int mechNo, PinmameMechInfo* p_mechInfo, void* const p_userData)
{
printf("OnMechAvailable: mechNo=%d, type=%d, length=%d, steps=%d, pos=%d, speed=%d\n",
mechNo,
Expand All @@ -230,7 +230,7 @@ void PINMAMECALLBACK OnMechAvailable(int mechNo, PinmameMechInfo* p_mechInfo, co
p_mechInfo->speed);
}

void PINMAMECALLBACK OnMechUpdated(int mechNo, PinmameMechInfo* p_mechInfo, const void* p_userData)
void PINMAMECALLBACK OnMechUpdated(int mechNo, PinmameMechInfo* p_mechInfo, void* const p_userData)
{
printf("OnMechUpdated: mechNo=%d, type=%d, length=%d, steps=%d, pos=%d, speed=%d\n",
mechNo,
Expand All @@ -241,17 +241,17 @@ void PINMAMECALLBACK OnMechUpdated(int mechNo, PinmameMechInfo* p_mechInfo, cons
p_mechInfo->speed);
}

void PINMAMECALLBACK OnConsoleDataUpdated(void* p_data, int size, const void* p_userData)
void PINMAMECALLBACK OnConsoleDataUpdated(void* p_data, int size, void* const p_userData)
{
printf("OnConsoleDataUpdated: size=%d\n", size);
}

int PINMAMECALLBACK IsKeyPressed(PINMAME_KEYCODE keycode, const void* p_userData)
int PINMAMECALLBACK IsKeyPressed(PINMAME_KEYCODE keycode, void* const p_userData)
{
return 0;
}

void PINMAMECALLBACK OnLogMessage(PINMAME_LOG_LEVEL logLevel, const char* format, va_list args, const void* p_userData)
void PINMAMECALLBACK OnLogMessage(PINMAME_LOG_LEVEL logLevel, const char* format, va_list args, void* const p_userData)
{
char buffer[1024];
vsnprintf(buffer, sizeof(buffer), format, args);
Expand All @@ -262,7 +262,7 @@ void PINMAMECALLBACK OnLogMessage(PINMAME_LOG_LEVEL logLevel, const char* format
printf("ERROR: %s\n", buffer);
}

void PINMAMECALLBACK OnSoundCommand(int boardNo, int cmd, const void* p_userData)
void PINMAMECALLBACK OnSoundCommand(int boardNo, int cmd, void* const p_userData)
{
printf("OnSoundCommand: boardNo=%d, cmd=%d\n", boardNo, cmd);
}
Expand Down
30 changes: 30 additions & 0 deletions src/win32com/Controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1734,6 +1734,36 @@ STDMETHODIMP CController::put_TimeFence(double timeInS)
return S_OK;
}

/****************************************************************************
* IController.get_StateBlock: returns a shared memory block name which holds
* a global state block prepended by the memory block size as an unsigned int
****************************************************************************/
STDMETHODIMP CController::get_StateBlock(/*[out, retval]*/ BSTR* pVal)
{
if (!pVal)
return E_POINTER;
if (!Machine)
return E_FAIL;
if (core_getOutputState(PINMAME_STATE_REQMASK_ALL) == NULL)
return E_FAIL;
CComBSTR bsStateSharedMemName(TEXT("Local\\VPinMameStateBlock"));
*pVal = bsStateSharedMemName.Detach();
return S_OK;
}

/****************************************************************************
* IController.UpdateStateBlock: Update requested outputs of the global state
* block
****************************************************************************/
STDMETHODIMP CController::UpdateStateBlock(/*[in, defaultvalue(0x3F)]*/ unsigned int updateMask)
{
if (!Machine)
return E_FAIL;
if (core_getOutputState(updateMask) == NULL)
return E_FAIL;
return S_OK;
}

/****************************************************************************
* IController.Version (read-only): gets the program version of VPM
****************************************************************************/
Expand Down
3 changes: 3 additions & 0 deletions src/win32com/Controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ DECLARE_PROTECT_FINAL_CONSTRUCT()
STDMETHOD(put_ModOutputType)(/*[in]*/ int output, /*[in]*/ int no, /*[in]*/ int newVal);

STDMETHOD(put_TimeFence)(/*[in]*/ double fenceIns);

STDMETHOD(get_StateBlock)(/*[out, retval]*/ BSTR* pVal);
STDMETHOD(UpdateStateBlock)(/*[in, defaultvalue(0x1F)]*/ unsigned int updateMask);
};

#endif // !defined(AFX_Controller_H__D2811491_40D6_4656_9AA7_8FF85FD63543__INCLUDED_)
6 changes: 3 additions & 3 deletions src/win32com/ControllerDmdDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ typedef void(*DmdDev_Render_16_Shades_t)(UINT16 width, UINT16 height, UINT8* fra
typedef void(*DmdDev_Render_4_Shades_t)(UINT16 width, UINT16 height, UINT8* frame);
typedef void(*DmdDev_Render_16_Shades_with_Raw_t)(UINT16 width, UINT16 height, UINT8* frame, UINT32 noOfRawFrames, UINT8* rawbuffer);
typedef void(*DmdDev_Render_4_Shades_with_Raw_t)(UINT16 width, UINT16 height, UINT8* frame, UINT32 noOfRawFrames, UINT8* rawbuffer);
typedef void(*DmdDev_Render_PM_Alphanumeric_Frame_t)(core_segOverallLayout_t layout, const UINT16* const seg_data, const UINT16* const seg_data2);
typedef void(*DmdDev_Render_PM_Alphanumeric_Dim_Frame_t)(core_segOverallLayout_t layout, const UINT16* const seg_data, const char* const seg_dim, const UINT16* const seg_data2);
typedef void(*DmdDev_Render_PM_Alphanumeric_Frame_t)(core_tSegOverallLayout layout, const UINT16* const seg_data, const UINT16* const seg_data2);
typedef void(*DmdDev_Render_PM_Alphanumeric_Dim_Frame_t)(core_tSegOverallLayout layout, const UINT16* const seg_data, const char* const seg_dim, const UINT16* const seg_data2);
typedef void(*DmdDev_Render_Lum_And_Raw_t)(UINT16 width, UINT16 height, UINT8* lumFrame, UINT8* rawFrame, UINT32 noOfRawFrames, UINT8* rawbuffer);

typedef struct {
Expand Down Expand Up @@ -239,7 +239,7 @@ extern "C" void dmddeviceRenderDMDFrame(const int width, const int height, UINT8
}
}

extern "C" void dmddeviceRenderAlphanumericFrame(core_segOverallLayout_t layout, UINT16* seg_data, UINT16* seg_data2, char* seg_dim) {
extern "C" void dmddeviceRenderAlphanumericFrame(core_tSegOverallLayout layout, UINT16* seg_data, UINT16* seg_data2, char* seg_dim) {
for (int i = 0; i < 2; i++)
{
if (dmdDevices[i].Render_PM_Alphanumeric_Dim_Frame)
Expand Down
2 changes: 2 additions & 0 deletions src/win32com/VPinMAME.idl
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ import "ocidl.idl";
[propget, id(88), helpstring("property ModOutputType")] HRESULT ModOutputType([in] int output, [in] int no, [out, retval] int *pVal);
[propput, id(88), helpstring("property ModOutputType")] HRESULT ModOutputType([in] int output, [in] int no, [in] int newVal);
[propput, id(89), helpstring("property TimeFence")] HRESULT TimeFence([in] double timeInS);
[propget, id(90), helpstring("property StateBlock")] HRESULT StateBlock([out, retval] BSTR* pVal);
[id(91), helpstring("method UpdateStateBlock")] HRESULT UpdateStateBlock([in, defaultvalue(0x3F)] unsigned int updateMask);
};

// WSHDlg and related interfaces
Expand Down
6 changes: 6 additions & 0 deletions src/wpc/byvidpin.c
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,12 @@ static VIDEO_STOP(byVP) {

static PINMAME_VIDEO_UPDATE(byVP_update) {
TMS9928A_refresh((core_gameData->hw.display ? 2 : 1), bitmap, 1);
struct rectangle bounds;
bounds.min_x = 0;
bounds.min_y = 0;
bounds.max_x = 192;
bounds.max_y = 256;
core_display_video_update(bitmap, &bounds, layout, 1);
return 0;
}

Expand Down
Loading

0 comments on commit daae5b7

Please sign in to comment.