From 0a1739534466eab9f575e9adfcf6d3d543e25438 Mon Sep 17 00:00:00 2001 From: Logan B Date: Sat, 28 May 2016 22:42:31 +1200 Subject: [PATCH 01/19] Rearrange shaderc arguments (nw) Gets past a shaderc error on linux --- src/osd/modules/render/bgfx/shaders/shader.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/modules/render/bgfx/shaders/shader.mk b/src/osd/modules/render/bgfx/shaders/shader.mk index 6e6730b5c29..222730c824b 100644 --- a/src/osd/modules/render/bgfx/shaders/shader.mk +++ b/src/osd/modules/render/bgfx/shaders/shader.mk @@ -109,17 +109,17 @@ endif $(BUILD_INTERMEDIATE_DIR)/vs_%.bin : $(SHADERS_DIR)vs_%.sc @echo [$(<)] - $(SILENT) $(SHADERC) $(VS_FLAGS) --type vertex --depends -o $(@) -f $(<) --disasm + $(SILENT) $(SHADERC) -f $(<) -o $(@) --type vertex $(VS_FLAGS) --depends --disasm $(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F) $(BUILD_INTERMEDIATE_DIR)/fs_%.bin : $(SHADERS_DIR)fs_%.sc @echo [$(<)] - $(SILENT) $(SHADERC) $(FS_FLAGS) --type fragment --depends -o $(@) -f $(<) --disasm + $(SILENT) $(SHADERC) -f $(<) -o $(@) --type fragment $(FS_FLAGS) --depends --disasm $(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F) $(BUILD_INTERMEDIATE_DIR)/cs_%.bin : $(SHADERS_DIR)cs_%.sc @echo [$(<)] - $(SILENT) $(SHADERC) $(CS_FLAGS) --type compute --depends -o $(@) -f $(<) --disasm + $(SILENT) $(SHADERC) -f $(<) -o $(@) --type compute $(CS_FLAGS) --depends --disasm $(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F) .PHONY: all From ea1b66f146e4c6663e06b124f8665f878c43ce0c Mon Sep 17 00:00:00 2001 From: Giuseppe Gorgoglione Date: Tue, 24 May 2016 20:00:57 +0200 Subject: [PATCH 02/19] Fix debugging code in font_dwrite.cpp Debugging code was disabled by default so compilation errors were overlooked. --- src/osd/modules/font/font_dwrite.cpp | 46 +++++++++++++++------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp index 670986f0cfc..f119be4523d 100644 --- a/src/osd/modules/font/font_dwrite.cpp +++ b/src/osd/modules/font/font_dwrite.cpp @@ -88,7 +88,7 @@ typedef lazy_loaded_function_p3 stream; @@ -98,11 +98,11 @@ void SaveBitmap(IWICBitmap* bitmap, GUID pixelFormat, const WCHAR *filename) d2d_create_factory_fn pfn_D2D1CreateFactory("D2D1CreateFactory", L"D2d1.dll"); dwrite_create_factory_fn pfn_DWriteCreateFactory("DWriteCreateFactory", L"Dwrite.dll"); - HR_RET(pfn_D2D1CreateFactory.initialize()); - HR_RET(pfn_DWriteCreateFactory.initialize()); + HR_RETHR(pfn_D2D1CreateFactory.initialize()); + HR_RETHR(pfn_DWriteCreateFactory.initialize()); // Create a Direct2D factory - HR_RET(pfn_D2D1CreateFactory( + HR_RETHR(pfn_D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory1), nullptr, @@ -112,41 +112,43 @@ void SaveBitmap(IWICBitmap* bitmap, GUID pixelFormat, const WCHAR *filename) CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); // Create a DirectWrite factory. - HR_RET(pfn_DWriteCreateFactory( + HR_RETHR(pfn_DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast(dwriteFactory.GetAddressOf()))); - HR_RET(CoCreateInstance( + HR_RETHR(CoCreateInstance( CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), (void**)&wicFactory)); - HR_RET(wicFactory->CreateStream(&stream)); - HR_RET(stream->InitializeFromFilename(filename, GENERIC_WRITE)); + HR_RETHR(wicFactory->CreateStream(&stream)); + HR_RETHR(stream->InitializeFromFilename(filename, GENERIC_WRITE)); ComPtr encoder; - HR_RET(wicFactory->CreateEncoder(GUID_ContainerFormatBmp, nullptr, &encoder)); - HR_RET(encoder->Initialize(stream.Get(), WICBitmapEncoderNoCache)); + HR_RETHR(wicFactory->CreateEncoder(GUID_ContainerFormatBmp, nullptr, &encoder)); + HR_RETHR(encoder->Initialize(stream.Get(), WICBitmapEncoderNoCache)); ComPtr frameEncode; - HR_RET(encoder->CreateNewFrame(&frameEncode, nullptr)); - HR_RET(frameEncode->Initialize(nullptr)); + HR_RETHR(encoder->CreateNewFrame(&frameEncode, nullptr)); + HR_RETHR(frameEncode->Initialize(nullptr)); UINT width, height; - HR_RET(bitmap->GetSize(&width, &height)); - HR_RET(frameEncode->SetSize(width, height)); - HR_RET(frameEncode->SetPixelFormat(&pixelFormat)); + HR_RETHR(bitmap->GetSize(&width, &height)); + HR_RETHR(frameEncode->SetSize(width, height)); + HR_RETHR(frameEncode->SetPixelFormat(&pixelFormat)); - HR_RET(frameEncode->WriteSource(bitmap, nullptr)); + HR_RETHR(frameEncode->WriteSource(bitmap, nullptr)); - HR_RET(frameEncode->Commit()); - HR_RET(encoder->Commit()); + HR_RETHR(frameEncode->Commit()); + HR_RETHR(encoder->Commit()); + + return S_OK; } -void SaveBitmap2(bitmap_argb32 &bitmap, const WCHAR *filename) +HRESULT SaveBitmap2(bitmap_argb32 &bitmap, const WCHAR *filename) { HRESULT result; @@ -158,12 +160,12 @@ void SaveBitmap2(bitmap_argb32 &bitmap, const WCHAR *filename) for (int x = 0; x < bitmap.width(); x++) { UINT32 pixel = bitmap.pix32(y, x); - pRow[x] = (pixel == 0xFFFFFFFF) ? rgb_t(0xFF, 0x00, 0x00, 0x00) : pRow[x] = rgb_t(0xFF, 0xFF, 0xFF, 0xFF); + pRow[x] = (pixel == 0xFFFFFFFF) ? rgb_t(0xFF, 0x00, 0x00, 0x00) : rgb_t(0xFF, 0xFF, 0xFF, 0xFF); } } ComPtr wicFactory; - HR_RET(CoCreateInstance( + HR_RETHR(CoCreateInstance( CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, @@ -182,6 +184,8 @@ void SaveBitmap2(bitmap_argb32 &bitmap, const WCHAR *filename) &bmp2); SaveBitmap(bmp2.Get(), GUID_WICPixelFormat32bppRGBA, filename); + + return S_OK; } #endif From 58dc78b6eba373d88fe7ef68f9ce3c2c43e635d6 Mon Sep 17 00:00:00 2001 From: Giuseppe Gorgoglione Date: Sat, 28 May 2016 04:14:15 +0200 Subject: [PATCH 03/19] Introduce dynamic_module This is a central cross-platform facility to dynamically bind functions from shared libraries. Updated all OSD modules to use it. --- scripts/src/osd/windows.lua | 2 - .../modules/diagnostics/diagnostics_win32.cpp | 86 +-- src/osd/modules/font/font_dwrite.cpp | 53 +- src/osd/modules/input/input_dinput.cpp | 18 +- src/osd/modules/input/input_dinput.h | 10 +- src/osd/modules/input/input_rawinput.cpp | 88 ++- src/osd/modules/input/input_winhybrid.cpp | 2 +- src/osd/modules/input/input_xinput.cpp | 46 +- src/osd/modules/input/input_xinput.h | 40 +- src/osd/modules/lib/osdlib.h | 46 +- src/osd/modules/lib/osdlib_macosx.cpp | 74 +++ src/osd/modules/lib/osdlib_unix.cpp | 75 +++ src/osd/modules/lib/osdlib_win32.cpp | 84 +++ src/osd/modules/netdev/pcap.cpp | 181 +++--- src/osd/modules/render/d3d/d3d9intf.cpp | 77 +-- src/osd/modules/render/d3d/d3dcomm.h | 29 +- src/osd/modules/render/d3d/d3dhlsl.cpp | 208 +++---- src/osd/modules/render/d3d/d3dhlsl.h | 58 +- src/osd/modules/render/drawd3d.cpp | 574 +++++++++--------- src/osd/modules/render/drawd3d.h | 38 +- src/osd/modules/render/drawogl.cpp | 8 +- src/osd/modules/render/winglcontext.h | 94 +-- src/osd/modules/sound/xaudio2_sound.cpp | 62 +- src/osd/windows/winutil.cpp | 64 -- src/osd/windows/winutil.h | 156 ----- 25 files changed, 1068 insertions(+), 1105 deletions(-) mode change 100644 => 100755 src/osd/modules/sound/xaudio2_sound.cpp diff --git a/scripts/src/osd/windows.lua b/scripts/src/osd/windows.lua index 8b48b8f0771..9307c6dec71 100644 --- a/scripts/src/osd/windows.lua +++ b/scripts/src/osd/windows.lua @@ -154,8 +154,6 @@ project ("osd_" .. _OPTIONS["osd"]) } files { - MAME_DIR .. "src/osd/modules/render/d3d/d3d9intf.cpp", - MAME_DIR .. "src/osd/modules/render/d3d/d3dintf.h", MAME_DIR .. "src/osd/modules/render/d3d/d3dhlsl.cpp", MAME_DIR .. "src/osd/modules/render/d3d/d3dcomm.h", MAME_DIR .. "src/osd/modules/render/d3d/d3dhlsl.h", diff --git a/src/osd/modules/diagnostics/diagnostics_win32.cpp b/src/osd/modules/diagnostics/diagnostics_win32.cpp index d24bffe75a7..437b2b3ddb5 100644 --- a/src/osd/modules/diagnostics/diagnostics_win32.cpp +++ b/src/osd/modules/diagnostics/diagnostics_win32.cpp @@ -22,30 +22,21 @@ #include #include + +#include "modules/lib/osdlib.h" + #include -template -class dynamic_bind -{ -public: - // constructor which looks up the function - dynamic_bind(const TCHAR *dll, const char *symbol) - : m_function(nullptr) - { - HMODULE module = LoadLibrary(dll); - if (module != nullptr) - m_function = reinterpret_cast<_FunctionPtr>(GetProcAddress(module, symbol)); - } - - // bool to test if the function is nullptr or not - operator bool() const { return (m_function != nullptr); } - - // dereference to get the underlying pointer - _FunctionPtr operator *() const { return m_function; } - -private: - _FunctionPtr m_function; -}; +// Typedefs for dynamically loaded functions +typedef BOOL WINAPI (*StackWalk64_fn)(DWORD, HANDLE, HANDLE, LPSTACKFRAME64, PVOID, PREAD_PROCESS_MEMORY_ROUTINE64, PFUNCTION_TABLE_ACCESS_ROUTINE64, PGET_MODULE_BASE_ROUTINE64, PTRANSLATE_ADDRESS_ROUTINE64); +typedef BOOL WINAPI (*SymInitialize_fn)(HANDLE, LPCTSTR, BOOL); +typedef PVOID WINAPI (*SymFunctionTableAccess64_fn)(HANDLE, DWORD64); +typedef DWORD64 WINAPI (*SymGetModuleBase64_fn)(HANDLE, DWORD64); +typedef BOOL WINAPI (*SymFromAddr_fn)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); +typedef BOOL WINAPI (*SymGetLineFromAddr64_fn)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); +typedef PIMAGE_SECTION_HEADER WINAPI (*ImageRvaToSection_fn)(PIMAGE_NT_HEADERS, PVOID, ULONG); +typedef PIMAGE_NT_HEADERS WINAPI (*ImageNtHeader_fn)(PVOID); +typedef VOID WINAPI (*RtlCaptureContext_fn)(PCONTEXT); class stack_walker { @@ -67,12 +58,14 @@ private: CONTEXT m_context; bool m_first; - dynamic_bind - m_stack_walk_64; - dynamic_bind m_sym_initialize; - dynamic_bind m_sym_function_table_access_64; - dynamic_bind m_sym_get_module_base_64; - dynamic_bind m_rtl_capture_context; + osd::dynamic_module::ptr m_dbghelp_dll; + osd::dynamic_module::ptr m_kernel32_dll; + + StackWalk64_fn m_stack_walk_64; + SymInitialize_fn m_sym_initialize; + SymFunctionTableAccess64_fn m_sym_function_table_access_64; + SymGetModuleBase64_fn m_sym_get_module_base_64; + RtlCaptureContext_fn m_rtl_capture_context; static bool s_initialized; }; @@ -126,8 +119,10 @@ private: FPTR m_last_base; FPTR m_text_base; - dynamic_bind m_sym_from_addr; - dynamic_bind m_sym_get_line_from_addr_64; + osd::dynamic_module::ptr m_dbghelp_dll; + + SymFromAddr_fn m_sym_from_addr; + SymGetLineFromAddr64_fn m_sym_get_line_from_addr_64; }; class sampling_profiler @@ -176,17 +171,21 @@ bool stack_walker::s_initialized = false; stack_walker::stack_walker() : m_process(GetCurrentProcess()), m_thread(GetCurrentThread()), - m_first(true), - m_stack_walk_64(TEXT("dbghelp.dll"), "StackWalk64"), - m_sym_initialize(TEXT("dbghelp.dll"), "SymInitialize"), - m_sym_function_table_access_64(TEXT("dbghelp.dll"), "SymFunctionTableAccess64"), - m_sym_get_module_base_64(TEXT("dbghelp.dll"), "SymGetModuleBase64"), - m_rtl_capture_context(TEXT("kernel32.dll"), "RtlCaptureContext") + m_first(true) { // zap the structs memset(&m_stackframe, 0, sizeof(m_stackframe)); memset(&m_context, 0, sizeof(m_context)); + m_dbghelp_dll = osd::dynamic_module::open({ "dbghelp.dll" }); + m_kernel32_dll = osd::dynamic_module::open({ "kernel32.dll" }); + + m_stack_walk_64 = m_dbghelp_dll->bind("StackWalk64"); + m_sym_initialize = m_dbghelp_dll->bind("SymInitialize"); + m_sym_function_table_access_64 = m_dbghelp_dll->bind("SymFunctionTableAccess64"); + m_sym_get_module_base_64 = m_dbghelp_dll->bind("SymGetModuleBase64"); + m_rtl_capture_context = m_kernel32_dll->bind("RtlCaptureContext"); + // initialize the symbols if (!s_initialized && m_sym_initialize && m_stack_walk_64 && m_sym_function_table_access_64 && m_sym_get_module_base_64) { @@ -294,9 +293,7 @@ symbol_manager::symbol_manager(const char *argv0) m_symfile(argv0), m_process(GetCurrentProcess()), m_last_base(0), - m_text_base(0), - m_sym_from_addr(TEXT("dbghelp.dll"), "SymFromAddr"), - m_sym_get_line_from_addr_64(TEXT("dbghelp.dll"), "SymGetLineFromAddr64") + m_text_base(0) { #ifdef __GNUC__ // compute the name of the mapfile @@ -317,6 +314,11 @@ symbol_manager::symbol_manager(const char *argv0) // expand the buffer to be decently large up front m_buffer = string_format("%500s", ""); + + m_dbghelp_dll = osd::dynamic_module::open({ "dbghelp.dll" }); + + m_sym_from_addr = m_dbghelp_dll->bind("SymFromAddr"); + m_sym_get_line_from_addr_64 = m_dbghelp_dll->bind("SymGetLineFromAddr64"); } @@ -603,8 +605,10 @@ void symbol_manager::format_symbol(const char *name, UINT32 displacement, const FPTR symbol_manager::get_text_section_base() { - dynamic_bind image_rva_to_section(TEXT("dbghelp.dll"), "ImageRvaToSection"); - dynamic_bind image_nt_header(TEXT("dbghelp.dll"), "ImageNtHeader"); + osd::dynamic_module::ptr m_dbghelp_dll = osd::dynamic_module::open({ "dbghelp.dll" }); + + ImageRvaToSection_fn image_rva_to_section = m_dbghelp_dll->bind("ImageRvaToSection"); + ImageNtHeader_fn image_nt_header = m_dbghelp_dll->bind("ImageNtHeader"); // start with the image base PVOID base = reinterpret_cast(GetModuleHandleUni()); diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp index f119be4523d..e816f296294 100644 --- a/src/osd/modules/font/font_dwrite.cpp +++ b/src/osd/modules/font/font_dwrite.cpp @@ -7,6 +7,7 @@ #include "font_module.h" #include "modules/osdmodule.h" +#include "modules/lib/osdlib.h" // We take dependencies on WRL client headers and // we can only build with a high enough version @@ -78,8 +79,8 @@ struct osd_deleter typedef std::unique_ptr osd_utf8_ptr; // Typedefs for dynamically loaded functions -typedef lazy_loaded_function_p4 d2d_create_factory_fn; -typedef lazy_loaded_function_p3 dwrite_create_factory_fn; +typedef HRESULT WINAPI (*d2d_create_factory_fn)(D2D1_FACTORY_TYPE, REFIID, const D2D1_FACTORY_OPTIONS *, void **); +typedef HRESULT (*dwrite_create_factory_fn)(DWRITE_FACTORY_TYPE, REFIID, IUnknown **); // Debugging functions #ifdef DWRITE_DEBUGGING @@ -96,13 +97,17 @@ HRESULT SaveBitmap(IWICBitmap* bitmap, GUID pixelFormat, const WCHAR *filename) ComPtr dwriteFactory; ComPtr wicFactory; - d2d_create_factory_fn pfn_D2D1CreateFactory("D2D1CreateFactory", L"D2d1.dll"); - dwrite_create_factory_fn pfn_DWriteCreateFactory("DWriteCreateFactory", L"Dwrite.dll"); - HR_RETHR(pfn_D2D1CreateFactory.initialize()); - HR_RETHR(pfn_DWriteCreateFactory.initialize()); + osd::dynamic_module::ptr d2d1_dll = osd::dynamic_module::open({ "d2d1.dll" }); + osd::dynamic_module::ptr dwrite_dll = osd::dynamic_module::open({ "dwrite.dll" }); + + d2d_create_factory_fn pfn_D2D1CreateFactory = d2d1_dll->bind("D2D1CreateFactory"); + dwrite_create_factory_fn pfn_DWriteCreateFactory = dwrite_dll->bind("DWriteCreateFactory"); + + if (!pfn_D2D1CreateFactory || !pfn_DWriteCreateFactory) + return ERROR_DLL_NOT_FOUND; // Create a Direct2D factory - HR_RETHR(pfn_D2D1CreateFactory( + HR_RETHR((*pfn_D2D1CreateFactory)( D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory1), nullptr, @@ -112,7 +117,7 @@ HRESULT SaveBitmap(IWICBitmap* bitmap, GUID pixelFormat, const WCHAR *filename) CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); // Create a DirectWrite factory. - HR_RETHR(pfn_DWriteCreateFactory( + HR_RETHR((*pfn_DWriteCreateFactory)( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast(dwriteFactory.GetAddressOf()))); @@ -652,18 +657,18 @@ private: class font_dwrite : public osd_module, public font_module { private: - d2d_create_factory_fn m_pfnD2D1CreateFactory; - dwrite_create_factory_fn m_pfnDWriteCreateFactory; - ComPtr m_d2dfactory; - ComPtr m_dwriteFactory; - ComPtr m_wicFactory; + osd::dynamic_module::ptr m_d2d1_dll; + osd::dynamic_module::ptr m_dwrite_dll; + d2d_create_factory_fn m_pfnD2D1CreateFactory; + dwrite_create_factory_fn m_pfnDWriteCreateFactory; + ComPtr m_d2dfactory; + ComPtr m_dwriteFactory; + ComPtr m_wicFactory; public: font_dwrite() : osd_module(OSD_FONT_PROVIDER, "dwrite"), font_module(), - m_pfnD2D1CreateFactory("D2D1CreateFactory", L"D2d1.dll"), - m_pfnDWriteCreateFactory("DWriteCreateFactory", L"Dwrite.dll"), m_d2dfactory(nullptr), m_dwriteFactory(nullptr), m_wicFactory(nullptr) @@ -672,12 +677,15 @@ public: virtual bool probe() override { + m_d2d1_dll = osd::dynamic_module::open({ "d2d1.dll" }); + m_dwrite_dll = osd::dynamic_module::open({ "dwrite.dll" }); + + m_pfnD2D1CreateFactory = m_d2d1_dll->bind("D2D1CreateFactory"); + m_pfnDWriteCreateFactory = m_dwrite_dll->bind("DWriteCreateFactory"); + // This module is available if it can load the expected API Functions - if (m_pfnD2D1CreateFactory.initialize() != 0 - || m_pfnDWriteCreateFactory.initialize() != 0) - { + if (!m_pfnD2D1CreateFactory || !m_pfnDWriteCreateFactory) return false; - } return true; } @@ -689,15 +697,14 @@ public: osd_printf_verbose("FontProvider: Initializing DirectWrite\n"); // Make sure we can initialize our api functions - if (m_pfnD2D1CreateFactory.initialize() - || m_pfnDWriteCreateFactory.initialize()) + if (!m_pfnD2D1CreateFactory || !m_pfnDWriteCreateFactory) { osd_printf_error("ERROR: FontProvider: Failed to load DirectWrite functions.\n"); return -1; } // Create a Direct2D factory. - HR_RET1(m_pfnD2D1CreateFactory( + HR_RET1((*m_pfnD2D1CreateFactory)( D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory), nullptr, @@ -707,7 +714,7 @@ public: CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); // Create a DirectWrite factory. - HR_RET1(m_pfnDWriteCreateFactory( + HR_RET1((*m_pfnDWriteCreateFactory)( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast(m_dwriteFactory.GetAddressOf()))); diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp index 5ce00b93a06..21874cbbe95 100644 --- a/src/osd/modules/input/input_dinput.cpp +++ b/src/osd/modules/input/input_dinput.cpp @@ -136,8 +136,7 @@ void dinput_keyboard_device::reset() dinput_api_helper::dinput_api_helper(int version) : m_dinput(nullptr), - m_dinput_version(version), - m_pfn_DirectInputCreate("DirectInputCreateW", L"dinput.dll") + m_dinput_version(version) { } @@ -163,18 +162,23 @@ int dinput_api_helper::initialize() else #endif { - result = m_pfn_DirectInputCreate.initialize(); - if (result != DI_OK) - return result; + m_dinput_dll = osd::dynamic_module::open({ "dinput.dll" }); + + m_dinput_create_prt = m_dinput_dll->bind("DirectInputCreateW"); + if (m_dinput_create_prt == nullptr) + { + osd_printf_verbose("Legacy DirectInput library dinput.dll is not available\n"); + return ERROR_DLL_NOT_FOUND; + } // first attempt to initialize DirectInput at v7 m_dinput_version = 0x0700; - result = m_pfn_DirectInputCreate(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr); + result = (*m_dinput_create_prt)(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr); if (result != DI_OK) { // if that fails, try version 5 m_dinput_version = 0x0500; - result = m_pfn_DirectInputCreate(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr); + result = (*m_dinput_create_prt)(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr); if (result != DI_OK) { m_dinput_version = 0; diff --git a/src/osd/modules/input/input_dinput.h b/src/osd/modules/input/input_dinput.h index 6a8eba3e24a..7005ed0a305 100644 --- a/src/osd/modules/input/input_dinput.h +++ b/src/osd/modules/input/input_dinput.h @@ -2,7 +2,7 @@ #define INPUT_DINPUT_H_ #include "input_common.h" -#include "winutil.h" +#include "modules/lib/osdlib.h" //============================================================ // dinput_device - base directinput device @@ -43,10 +43,11 @@ public: virtual BOOL device_enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) = 0; }; +// Typedef for dynamically loaded function #if DIRECTINPUT_VERSION >= 0x0800 -typedef lazy_loaded_function_p4 pfn_dinput_create; +typedef HRESULT WINAPI (*dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT8 *, LPUNKNOWN); #else -typedef lazy_loaded_function_p4 pfn_dinput_create; +typedef HRESULT WINAPI (*dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); #endif class dinput_api_helper @@ -58,7 +59,8 @@ private: Microsoft::WRL::ComPtr m_dinput; #endif int m_dinput_version; - pfn_dinput_create m_pfn_DirectInputCreate; + osd::dynamic_module::ptr m_dinput_dll; + dinput_create_fn m_dinput_create_prt; public: dinput_api_helper(int version); diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index ecfae316d41..cfab7dcdb5a 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -26,7 +26,7 @@ #include "strconv.h" // MAMEOS headers -#include "winutil.h" +#include "modules/lib/osdlib.h" #include "winmain.h" #include "window.h" @@ -37,17 +37,11 @@ // MACROS //============================================================ -#ifdef UNICODE -#define UNICODE_SUFFIX "W" -#else -#define UNICODE_SUFFIX "A" -#endif - -// RawInput APIs -typedef lazy_loaded_function_p3 get_rawinput_device_list_ptr; -typedef lazy_loaded_function_p5 get_rawinput_data_ptr; -typedef lazy_loaded_function_p4 get_rawinput_device_info_ptr; -typedef lazy_loaded_function_p3 register_rawinput_devices_ptr; +// Typedefs for dynamically loaded functions +typedef UINT WINAPI (*get_rawinput_device_list_ptr)(PRAWINPUTDEVICELIST, PUINT, UINT); +typedef UINT WINAPI (*get_rawinput_data_ptr)( HRAWINPUT, UINT, LPVOID, PUINT, UINT); +typedef UINT WINAPI (*get_rawinput_device_info_ptr)(HANDLE, UINT, LPVOID, PUINT); +typedef BOOL WINAPI (*register_rawinput_devices_ptr)(PCRAWINPUTDEVICE, UINT, UINT); class safe_regkey { @@ -395,13 +389,6 @@ public: } }; -/* -register_rawinput_devices = (register_rawinput_devices_ptr)GetProcAddress(user32, "RegisterRawInputDevices"); -get_rawinput_device_list = (get_rawinput_device_list_ptr)GetProcAddress(user32, "GetRawInputDeviceList"); -get_rawinput_device_info = (get_rawinput_device_info_ptr)GetProcAddress(user32, "GetRawInputDeviceInfo" UNICODE_SUFFIX); -get_rawinput_data = (get_rawinput_data_ptr)GetProcAddress(user32, "GetRawInputData"); -*/ - //============================================================ // rawinput_module - base class for rawinput modules //============================================================ @@ -409,32 +396,33 @@ get_rawinput_data = (get_rawinput_data_ptr)GetProcAddress(user32, "GetRawInputDa class rawinput_module : public wininput_module { private: - // RawInput variables - get_rawinput_device_list_ptr get_rawinput_device_list; - get_rawinput_data_ptr get_rawinput_data; - get_rawinput_device_info_ptr get_rawinput_device_info; - register_rawinput_devices_ptr register_rawinput_devices; - std::mutex m_module_lock; + osd::dynamic_module::ptr m_user32_dll; + get_rawinput_device_list_ptr get_rawinput_device_list; + get_rawinput_data_ptr get_rawinput_data; + get_rawinput_device_info_ptr get_rawinput_device_info; + register_rawinput_devices_ptr register_rawinput_devices; + std::mutex m_module_lock; public: rawinput_module(const char *type, const char* name) - : wininput_module(type, name), - get_rawinput_device_list("GetRawInputDeviceList", L"user32.dll"), - get_rawinput_data("GetRawInputData", L"user32.dll"), - get_rawinput_device_info("GetRawInputDeviceInfoW", L"user32.dll"), - register_rawinput_devices("RegisterRawInputDevices", L"user32.dll") + : wininput_module(type, name) { } bool probe() override { - int status = get_rawinput_device_list.initialize(); - status |= get_rawinput_data.initialize(); - status |= get_rawinput_device_info.initialize(); - status |= register_rawinput_devices.initialize(); + m_user32_dll = osd::dynamic_module::open({ "user32.dll" }); - if (status != 0) + get_rawinput_device_list = m_user32_dll->bind("GetRawInputDeviceList"); + get_rawinput_data = m_user32_dll->bind("GetRawInputData"); + get_rawinput_device_info = m_user32_dll->bind("GetRawInputDeviceInfoW"); + register_rawinput_devices = m_user32_dll->bind("RegisterRawInputDevices"); + + if (!get_rawinput_device_list || !get_rawinput_data || + !get_rawinput_device_info || !register_rawinput_devices ) + { return false; + } return true; } @@ -442,15 +430,15 @@ public: void input_init(running_machine &machine) override { // get the number of devices, allocate a device list, and fetch it - int device_count = 0; - if (get_rawinput_device_list(nullptr, &device_count, sizeof(RAWINPUTDEVICELIST)) != 0) + UINT device_count = 0; + if ((*get_rawinput_device_list)(nullptr, &device_count, sizeof(RAWINPUTDEVICELIST)) != 0) return; if (device_count == 0) return; auto rawinput_devices = std::make_unique(device_count); - if (get_rawinput_device_list(rawinput_devices.get(), &device_count, sizeof(RAWINPUTDEVICELIST)) == -1) + if ((*get_rawinput_device_list)(rawinput_devices.get(), &device_count, sizeof(RAWINPUTDEVICELIST)) == -1) return; // iterate backwards through devices; new devices are added at the head @@ -478,7 +466,7 @@ public: registration.hwndTarget = osd_common_t::s_window_list.front()->platform_window(); // register the device - register_rawinput_devices(®istration, 1, sizeof(registration)); + (*register_rawinput_devices)(®istration, 1, sizeof(registration)); } protected: @@ -488,13 +476,11 @@ protected: int init_internal() override { - // look up the entry points - int status = get_rawinput_device_list.initialize(); - status |= get_rawinput_data.initialize(); - status |= get_rawinput_device_info.initialize(); - status |= register_rawinput_devices.initialize(); - if (status != 0) + if (!get_rawinput_device_list || !get_rawinput_data || + !get_rawinput_device_info || !register_rawinput_devices ) + { return 1; + } osd_printf_verbose("RawInput: APIs detected\n"); return 0; @@ -504,13 +490,13 @@ protected: TDevice* create_rawinput_device(running_machine &machine, PRAWINPUTDEVICELIST rawinputdevice) { TDevice* devinfo; - INT name_length = 0; + UINT name_length = 0; // determine the length of the device name, allocate it, and fetch it if not nameless - if (get_rawinput_device_info(rawinputdevice->hDevice, RIDI_DEVICENAME, nullptr, &name_length) != 0) + if ((*get_rawinput_device_info)(rawinputdevice->hDevice, RIDI_DEVICENAME, nullptr, &name_length) != 0) return nullptr; std::unique_ptr tname = std::make_unique(name_length + 1); - if (name_length > 1 && get_rawinput_device_info(rawinputdevice->hDevice, RIDI_DEVICENAME, tname.get(), &name_length) == -1) + if (name_length > 1 && (*get_rawinput_device_info)(rawinputdevice->hDevice, RIDI_DEVICENAME, tname.get(), &name_length) == -1) return nullptr; // if this is an RDP name, skip it @@ -544,14 +530,14 @@ protected: std::unique_ptr larger_buffer; LPBYTE data = small_buffer; BOOL result; - int size; + UINT size; // ignore if not enabled if (!input_enabled()) return FALSE; // determine the size of databuffer we need - if (get_rawinput_data(rawinputdevice, RID_INPUT, nullptr, &size, sizeof(RAWINPUTHEADER)) != 0) + if ((*get_rawinput_data)(rawinputdevice, RID_INPUT, nullptr, &size, sizeof(RAWINPUTHEADER)) != 0) return FALSE; // if necessary, allocate a temporary buffer and fetch the data @@ -564,7 +550,7 @@ protected: } // fetch the data and process the appropriate message types - result = get_rawinput_data(static_cast(rawinputdevice), RID_INPUT, data, &size, sizeof(RAWINPUTHEADER)); + result = (*get_rawinput_data)(static_cast(rawinputdevice), RID_INPUT, data, &size, sizeof(RAWINPUTHEADER)); if (result) { std::lock_guard scope_lock(m_module_lock); diff --git a/src/osd/modules/input/input_winhybrid.cpp b/src/osd/modules/input/input_winhybrid.cpp index 968edbf1624..a7453d59cf8 100644 --- a/src/osd/modules/input/input_winhybrid.cpp +++ b/src/osd/modules/input/input_winhybrid.cpp @@ -218,7 +218,7 @@ protected: { XINPUT_STATE state = { 0 }; - if (m_xinput_helper->XInputGetState(i, &state) == ERROR_SUCCESS) + if (m_xinput_helper->xinput_get_state(i, &state) == ERROR_SUCCESS) { // allocate and link in a new device devinfo = m_xinput_helper->create_xinput_device(machine, i, *this); diff --git a/src/osd/modules/input/input_xinput.cpp b/src/osd/modules/input/input_xinput.cpp index 593cf16fc28..2d01b702bd8 100644 --- a/src/osd/modules/input/input_xinput.cpp +++ b/src/osd/modules/input/input_xinput.cpp @@ -32,50 +32,28 @@ #include "input_windows.h" #include "input_xinput.h" - -xinput_api_helper::xinput_api_helper() #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - : XInputGetState("XInputGetState", xinput_dll_names, ARRAY_LENGTH(xinput_dll_names)) - , XInputGetCapabilities("XInputGetCapabilities", xinput_dll_names, ARRAY_LENGTH(xinput_dll_names)) +#define XINPUT_LIBRARIES { "xinput1_4.dll", "xinput9_1_0.dll" } +#else +#define XINPUT_LIBRARIES { "xinput1_4.dll" } #endif -{ -} int xinput_api_helper::initialize() { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - int status; - status = XInputGetState.initialize(); - if (status != 0) - { - osd_printf_verbose("Failed to initialize function pointer for %s. Error: %d\n", XInputGetState.name(), status); - return -1; - } + m_xinput_dll = osd::dynamic_module::open(XINPUT_LIBRARIES); - status = XInputGetCapabilities.initialize(); - if (status != 0) + XInputGetState = m_xinput_dll->bind("XInputGetState"); + XInputGetCapabilities = m_xinput_dll->bind("XInputGetCapabilities"); + + if (!XInputGetState || !XInputGetCapabilities) { - osd_printf_verbose("Failed to initialize function pointer for %s. Error: %d\n", XInputGetCapabilities.name(), status); + osd_printf_verbose("Could not find XInput. Please try to reinstall DirectX runtime package.\n"); return -1; } -#endif return 0; } -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -// Pass-through functions for Universal Windows -inline DWORD xinput_api_helper::XInputGetState(DWORD dwUserindex, XINPUT_STATE *pState) -{ - return ::XInputGetState(dwUserindex, pState); -} - -inline DWORD xinput_api_helper::XInputGetCapabilities(DWORD dwUserindex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities) -{ - return ::XInputGetCapabilities(dwUserindex, dwFlags, pCapabilities); -} -#endif - //============================================================ // create_xinput_device //============================================================ @@ -85,7 +63,7 @@ xinput_joystick_device * xinput_api_helper::create_xinput_device(running_machine xinput_joystick_device *devinfo; XINPUT_CAPABILITIES caps = { 0 }; - if (FAILED(XInputGetCapabilities(index, 0, &caps))) + if (FAILED(xinput_get_capabilities(index, 0, &caps))) { // If we can't get the capabilities skip this device return nullptr; @@ -125,7 +103,7 @@ void xinput_joystick_device::poll() return; // poll the device first - HRESULT result = m_xinput_helper->XInputGetState(xinput_state.player_index, &xinput_state.xstate); + HRESULT result = m_xinput_helper->xinput_get_state(xinput_state.player_index, &xinput_state.xstate); // If we can't poll the device, skip if (FAILED(result)) @@ -262,7 +240,7 @@ protected: { XINPUT_STATE state = {0}; - if (m_xinput_helper->XInputGetState(i, &state) == ERROR_SUCCESS) + if (m_xinput_helper->xinput_get_state(i, &state) == ERROR_SUCCESS) { // allocate and link in a new device devinfo = m_xinput_helper->create_xinput_device(machine, i, *this); diff --git a/src/osd/modules/input/input_xinput.h b/src/osd/modules/input/input_xinput.h index 791fc36f310..575f6d3fe34 100644 --- a/src/osd/modules/input/input_xinput.h +++ b/src/osd/modules/input/input_xinput.h @@ -3,6 +3,8 @@ #include +#include "modules/lib/osdlib.h" + #define XINPUT_MAX_POV 4 #define XINPUT_MAX_BUTTONS 10 #define XINPUT_MAX_AXIS 4 @@ -88,34 +90,30 @@ struct xinput_api_state XINPUT_CAPABILITIES caps; }; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -// Typedef for pointers to XInput Functions -typedef lazy_loaded_function_p2 xinput_get_state_fn; -typedef lazy_loaded_function_p3 xinput_get_caps_fn; -#endif +// Typedefs for dynamically loaded functions +typedef DWORD (*xinput_get_state_fn)(DWORD, XINPUT_STATE *); +typedef DWORD (*xinput_get_caps_fn)(DWORD, DWORD, XINPUT_CAPABILITIES *); class xinput_api_helper : public std::enable_shared_from_this { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -private: - const wchar_t* xinput_dll_names[2] = { L"xinput1_4.dll", L"xinput9_1_0.dll" }; - public: - xinput_get_state_fn XInputGetState; - xinput_get_caps_fn XInputGetCapabilities; -#endif - -public: - xinput_api_helper(); - int initialize(); xinput_joystick_device * create_xinput_device(running_machine &machine, UINT index, wininput_module &module); -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - // Pass-through functions for Universal Windows - inline DWORD XInputGetState(DWORD dwUserindex, XINPUT_STATE *pState); - inline DWORD XInputGetCapabilities(DWORD dwUserindex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities); -#endif + inline DWORD xinput_get_state(DWORD dwUserindex, XINPUT_STATE *pState) + { + return (*XInputGetState)(dwUserindex, pState); + } + + inline DWORD xinput_get_capabilities(DWORD dwUserindex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities) + { + return (*XInputGetCapabilities)(dwUserindex, dwFlags, pCapabilities); + } + +private: + osd::dynamic_module::ptr m_xinput_dll; + xinput_get_state_fn XInputGetState; + xinput_get_caps_fn XInputGetCapabilities; }; class xinput_joystick_device : public device_info diff --git a/src/osd/modules/lib/osdlib.h b/src/osd/modules/lib/osdlib.h index f4a632dbbd1..64bd556cd3c 100644 --- a/src/osd/modules/lib/osdlib.h +++ b/src/osd/modules/lib/osdlib.h @@ -19,6 +19,10 @@ #ifndef __OSDLIB__ #define __OSDLIB__ +#include +#include +#include + /*----------------------------------------------------------------------------- osd_process_kill: kill the current process @@ -30,8 +34,10 @@ None. -----------------------------------------------------------------------------*/ + void osd_process_kill(void); + /*----------------------------------------------------------------------------- osd_setenv: set environment variable @@ -48,14 +54,52 @@ void osd_process_kill(void); int osd_setenv(const char *name, const char *value, int overwrite); + /*----------------------------------------------------------------------------- osd_get_clipboard_text: retrieves text from the clipboard Return value: the returned string needs to be osd_free()-ed! - -----------------------------------------------------------------------------*/ + char *osd_get_clipboard_text(void); + +/*----------------------------------------------------------------------------- + dynamic_module: load functions from optional shared libraries + + Notes: + + - Supports Mac OS X, Unix and Windows (both desktop and Windows + Store universal applications) + - A symbol can be searched in a list of libraries (e.g. more + revisions of a same library) +-----------------------------------------------------------------------------*/ + +namespace osd { + +class dynamic_module +{ +public: + typedef std::unique_ptr ptr; + + static ptr open(std::vector &&libraries); + + virtual ~dynamic_module() { }; + + template + typename std::enable_if::value, T>::type bind(char const *symbol) + { + return reinterpret_cast(get_symbol_address(symbol)); + } + +protected: + typedef void (*generic_fptr_t)(); + + virtual generic_fptr_t get_symbol_address(char const *symbol) = 0; +}; + +} // namespace osd + #endif /* __OSDLIB__ */ diff --git a/src/osd/modules/lib/osdlib_macosx.cpp b/src/osd/modules/lib/osdlib_macosx.cpp index 07cfa05226a..b3a7ed642e3 100644 --- a/src/osd/modules/lib/osdlib_macosx.cpp +++ b/src/osd/modules/lib/osdlib_macosx.cpp @@ -13,6 +13,12 @@ #include #include #include +#include + +#include +#include +#include + #include #include @@ -215,3 +221,71 @@ char *osd_get_clipboard_text(void) return result; } + +//============================================================ +// dynamic_module_posix_impl +//============================================================ + +namespace osd { + +class dynamic_module_posix_impl : public dynamic_module +{ +public: + dynamic_module_posix_impl(std::vector &libraries) + : m_module(nullptr) + { + m_libraries = libraries; + } + + virtual ~dynamic_module_posix_impl() override + { + if (m_module != nullptr) + dlclose(m_module); + }; + +protected: + virtual generic_fptr_t get_symbol_address(char const *symbol) override + { + /* + * given a list of libraries, if a first symbol is successfully loaded from + * one of them, all additional symbols will be loaded from the same library + */ + if (m_module) + { + return reinterpret_cast(dlsym(m_module, symbol)); + } + + for (auto const &library : m_libraries) + { + void *module = dlopen(library.c_str(), RTLD_LAZY); + + if (module != nullptr) + { + generic_fptr_t function = reinterpret_cast(dlsym(module, symbol)); + + if (function != nullptr) + { + m_module = module; + return function; + } + else + { + dlclose(module); + } + } + } + + return nullptr; + } + +private: + std::vector m_libraries; + void * m_module; +}; + +dynamic_module::ptr dynamic_module::open(std::vector &&names) +{ + return std::make_unique(names); +} + +} // namespace osd diff --git a/src/osd/modules/lib/osdlib_unix.cpp b/src/osd/modules/lib/osdlib_unix.cpp index 52999835a1c..81d9967ff64 100644 --- a/src/osd/modules/lib/osdlib_unix.cpp +++ b/src/osd/modules/lib/osdlib_unix.cpp @@ -13,12 +13,19 @@ #include #include #include +#include + +#include +#include +#include + // MAME headers #include "osdcore.h" #include "osdlib.h" #include + //============================================================ // osd_getenv //============================================================ @@ -159,3 +166,71 @@ char *osd_get_clipboard_text(void) } #endif + +//============================================================ +// dynamic_module_posix_impl +//============================================================ + +namespace osd { + +class dynamic_module_posix_impl : public dynamic_module +{ +public: + dynamic_module_posix_impl(std::vector &libraries) + : m_module(nullptr) + { + m_libraries = libraries; + } + + virtual ~dynamic_module_posix_impl() override + { + if (m_module != nullptr) + dlclose(m_module); + }; + +protected: + virtual generic_fptr_t get_symbol_address(char const *symbol) override + { + /* + * given a list of libraries, if a first symbol is successfully loaded from + * one of them, all additional symbols will be loaded from the same library + */ + if (m_module) + { + return reinterpret_cast(dlsym(m_module, symbol)); + } + + for (auto const &library : m_libraries) + { + void *module = dlopen(library.c_str(), RTLD_LAZY); + + if (module != nullptr) + { + generic_fptr_t function = reinterpret_cast(dlsym(module, symbol)); + + if (function != nullptr) + { + m_module = module; + return function; + } + else + { + dlclose(module); + } + } + } + + return nullptr; + } + +private: + std::vector m_libraries; + void * m_module; +}; + +dynamic_module::ptr dynamic_module::open(std::vector &&names) +{ + return std::make_unique(names); +} + +} // namespace osd diff --git a/src/osd/modules/lib/osdlib_win32.cpp b/src/osd/modules/lib/osdlib_win32.cpp index f778977614a..e65509cc436 100644 --- a/src/osd/modules/lib/osdlib_win32.cpp +++ b/src/osd/modules/lib/osdlib_win32.cpp @@ -17,6 +17,8 @@ #include #endif +#include + // MAME headers #include "osdlib.h" #include "osdcomm.h" @@ -314,3 +316,85 @@ char *osd_get_clipboard_text(void) return result; } + +//============================================================ +// osd_dynamic_bind +//============================================================ + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +// for classic desktop applications +#define load_library(filename) LoadLibrary(filename) +#else +// for Windows Store universal applications +#define load_library(filename) LoadPackagedLibrary(filename, 0) +#endif + +namespace osd { + +class dynamic_module_win32_impl : public dynamic_module +{ +public: + dynamic_module_win32_impl(std::vector &libraries) + : m_module(nullptr) + { + m_libraries = libraries; + } + + virtual ~dynamic_module_win32_impl() override + { + if (m_module != nullptr) + FreeLibrary(m_module); + }; + +protected: + virtual generic_fptr_t get_symbol_address(char const *symbol) override + { + /* + * given a list of libraries, if a first symbol is successfully loaded from + * one of them, all additional symbols will be loaded from the same library + */ + if (m_module) + { + return reinterpret_cast(GetProcAddress(m_module, symbol)); + } + + for (auto const &library : m_libraries) + { + TCHAR *tempstr = tstring_from_utf8(library.c_str()); + if (!tempstr) + return nullptr; + + HMODULE module = load_library(tempstr); + + osd_free(tempstr); + + if (module != nullptr) + { + generic_fptr_t function = reinterpret_cast(GetProcAddress(module, symbol)); + + if (function != nullptr) + { + m_module = module; + return function; + } + else + { + FreeLibrary(module); + } + } + } + + return nullptr; + } + +private: + std::vector m_libraries; + HMODULE m_module; +}; + +dynamic_module::ptr dynamic_module::open(std::vector &&names) +{ + return std::make_unique(names); +} + +} // namespace osd diff --git a/src/osd/modules/netdev/pcap.cpp b/src/osd/modules/netdev/pcap.cpp index 541ed422d8a..1cd7ae3bfa8 100644 --- a/src/osd/modules/netdev/pcap.cpp +++ b/src/osd/modules/netdev/pcap.cpp @@ -1,61 +1,47 @@ // license:BSD-3-Clause // copyright-holders:Carl + #if defined(OSD_NET_USE_PCAP) -#if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) -#ifdef UNICODE -#define LIB_NAME L"wpcap.dll" -#define LoadDynamicLibrary LoadLibraryW -#else -#define LIB_NAME "wpcap.dll" -#define LoadDynamicLibrary LoadLibraryA -#endif -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include - #include "emu.h" #include "osdnet.h" #include "netdev_module.h" #include "modules/osdmodule.h" +#include "modules/lib/osdlib.h" #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) +#define WIN32_LEAN_AND_MEAN +#include +#undef interface +#define LIB_NAME "wpcap.dll" -#define LIB_ERROR_STR "Unable to load winpcap: %lx\n" -typedef DWORD except_type; - -#else - -#include -#ifdef SDLMAME_MACOSX +#elif defined(SDLMAME_MACOSX) #include #include -#endif - -#ifdef SDLMAME_MACOSX #define LIB_NAME "libpcap.dylib" + #else #define LIB_NAME "libpcap.so" #endif -#define LIB_ERROR_STR "Unable to load pcap: %s\n" -typedef void *HMODULE; -typedef const char *except_type; -#define FreeLibrary(x) dlclose(x) -#define GetLastError() dlerror() -#define GetProcAddress(x, y) dlsym(x, y) -#define LoadDynamicLibrary(x) dlopen(x, RTLD_LAZY) +#include -#endif +// Typedefs for dynamically loaded functions +typedef int (*pcap_findalldevs_fn)(pcap_if_t **, char *); +typedef pcap_t *(*pcap_open_live_fn)(const char *, int, int, int, char *); +typedef int (*pcap_next_ex_fn)(pcap_t *, struct pcap_pkthdr **, const u_char **); +typedef int (*pcap_compile_fn)(pcap_t *, struct bpf_program *, const char *, int, bpf_u_int32); +typedef void (*pcap_close_fn)(pcap_t *); +typedef int (*pcap_setfilter_fn)(pcap_t *, struct bpf_program *); +typedef int (*pcap_sendpacket_fn)(pcap_t *, const u_char *, int); +typedef int (*pcap_set_datalink_fn)(pcap_t *, int); +typedef int (*pcap_dispatch_fn)(pcap_t *, int, pcap_handler, u_char *); class pcap_module : public osd_module, public netdev_module { public: - pcap_module() - : osd_module(OSD_NETDEV_PROVIDER, "pcap"), netdev_module(), handle(nullptr) + : osd_module(OSD_NETDEV_PROVIDER, "pcap"), netdev_module() { } virtual ~pcap_module() { } @@ -63,32 +49,46 @@ public: virtual int init(const osd_options &options) override; virtual void exit() override; - virtual bool probe() override; + virtual bool probe() override + { + pcap_dll = osd::dynamic_module::open({ LIB_NAME }); - HMODULE handle; + pcap_findalldevs_dl = pcap_dll->bind("pcap_findalldevs"); + pcap_open_live_dl = pcap_dll->bind("pcap_open_live"); + pcap_next_ex_dl = pcap_dll->bind("pcap_next_ex"); + pcap_compile_dl = pcap_dll->bind("pcap_compile"); + pcap_close_dl = pcap_dll->bind("pcap_close"); + pcap_setfilter_dl = pcap_dll->bind("pcap_setfilter"); + pcap_sendpacket_dl = pcap_dll->bind("pcap_sendpacket"); + pcap_set_datalink_dl = pcap_dll->bind("pcap_set_datalink"); + pcap_dispatch_dl = pcap_dll->bind("pcap_dispatch"); + + if (!pcap_findalldevs_dl || !pcap_open_live_dl || !pcap_next_ex_dl || + !pcap_compile_dl || !pcap_close_dl || !pcap_setfilter_dl || + !pcap_sendpacket_dl || !pcap_set_datalink_dl || !pcap_dispatch_dl) + { + osd_printf_error("Unable to load the PCAP library\n"); + return false; + } + + return true; + } + + osd::dynamic_module::ptr pcap_dll; + + pcap_findalldevs_fn pcap_findalldevs_dl; + pcap_open_live_fn pcap_open_live_dl; + pcap_next_ex_fn pcap_next_ex_dl; + pcap_compile_fn pcap_compile_dl; + pcap_close_fn pcap_close_dl; + pcap_setfilter_fn pcap_setfilter_dl; + pcap_sendpacket_fn pcap_sendpacket_dl; + pcap_set_datalink_fn pcap_set_datalink_dl; + pcap_dispatch_fn pcap_dispatch_dl; }; -static int (*pcap_compile_dl)(pcap_t *, struct bpf_program *, char *, int, bpf_u_int32) = nullptr; -static int (*pcap_findalldevs_dl)(pcap_if_t **, char *) = nullptr; -static pcap_t *(*pcap_open_live_dl)(const char *name, int, int, int, char *) = nullptr; -static int (*pcap_next_ex_dl)(pcap_t *, struct pcap_pkthdr **, const u_char **) = nullptr; -static void (*pcap_close_dl)(pcap_t *) = nullptr; -static int (*pcap_setfilter_dl)(pcap_t *, struct bpf_program *) = nullptr; -static int (*pcap_sendpacket_dl)(pcap_t *, u_char *, int) = nullptr; -static int (*pcap_set_datalink_dl)(pcap_t *, int) = nullptr; -static int (*pcap_dispatch_dl)(pcap_t *, int, pcap_handler callback, u_char *) = nullptr; - - -#if 0 -#define pcap_compile_dl pcap_compile -#define pcap_findalldevs_dl pcap_findalldevs -#define pcap_open_live_dl pcap_open_live -#define pcap_next_ex_dl pcap_next_ex -#define pcap_close_dl pcap_close -#define pcap_setfilter_dl pcap_setfilter -#define pcap_sendpacket_dl pcap_sendpacket -#define pcap_set_datalink_dl pcap_set_datalink -#endif +// FIXME: bridge between pcap_module and netdev_pcap +static pcap_module *module = nullptr; #ifdef SDLMAME_MACOSX struct netdev_pcap_context { @@ -140,7 +140,7 @@ static void *netdev_pcap_blocker(void *arg) { struct netdev_pcap_context *ctx = (struct netdev_pcap_context*)arg; while(ctx && ctx->p) { - pcap_dispatch_dl(ctx->p, 1, netdev_pcap_handler, (u_char*)ctx); + (*module->pcap_dispatch_dl)(ctx->p, 1, netdev_pcap_handler, (u_char*)ctx); } return 0; @@ -152,19 +152,19 @@ netdev_pcap::netdev_pcap(const char *name, class device_network_interface *ifdev { char errbuf[PCAP_ERRBUF_SIZE]; #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) - m_p = pcap_open_live_dl(name, 65535, 1, -1, errbuf); + m_p = (*module->pcap_open_live_dl)(name, 65535, 1, -1, errbuf); #else - m_p = pcap_open_live_dl(name, 65535, 1, 1, errbuf); + m_p = (*module->pcap_open_live_dl)(name, 65535, 1, 1, errbuf); #endif if(!m_p) { osd_printf_error("Unable to open %s: %s\n", name, errbuf); return; } - if(pcap_set_datalink_dl(m_p, DLT_EN10MB) == -1) + if ((*module->pcap_set_datalink_dl)(m_p, DLT_EN10MB) == -1) { osd_printf_error("Unable to set %s to ethernet", name); - pcap_close_dl(m_p); + (*module->pcap_close_dl)(m_p); m_p = nullptr; return; } @@ -188,10 +188,10 @@ void netdev_pcap::set_mac(const char *mac) #else sprintf(filter, "ether dst %.2X:%.2X:%.2X:%.2X:%.2X:%.2X or ether multicast or ether broadcast", (unsigned char)mac[0], (unsigned char)mac[1], (unsigned char)mac[2],(unsigned char)mac[3], (unsigned char)mac[4], (unsigned char)mac[5]); #endif - if(pcap_compile_dl(m_p, &fp, filter, 1, 0) == -1) { + if ((*module->pcap_compile_dl)(m_p, &fp, filter, 1, 0) == -1) { osd_printf_error("Error with pcap_compile\n"); } - if(pcap_setfilter_dl(m_p, &fp) == -1) { + if ((*module->pcap_setfilter_dl)(m_p, &fp) == -1) { osd_printf_error("Error with pcap_setfilter\n"); } } @@ -203,7 +203,7 @@ int netdev_pcap::send(UINT8 *buf, int len) printf("send invoked, but no pcap context\n"); return 0; } - ret = pcap_sendpacket_dl(m_p, buf, len); + ret = (*module->pcap_sendpacket_dl)(m_p, buf, len); printf("sent packet length %d, returned %d\n", len, ret); return ret ? len : 0; //return (!pcap_sendpacket_dl(m_p, buf, len))?len:0; @@ -228,7 +228,7 @@ int netdev_pcap::recv_dev(UINT8 **buf) #else struct pcap_pkthdr *header; if(!m_p) return 0; - return (pcap_next_ex_dl(m_p, &header, (const u_char **)buf) == 1)?header->len:0; + return ((*module->pcap_next_ex_dl)(m_p, &header, (const u_char **)buf) == 1)?header->len:0; #endif } @@ -239,7 +239,7 @@ netdev_pcap::~netdev_pcap() pthread_cancel(m_thread); pthread_join(m_thread, nullptr); #endif - if(m_p) pcap_close_dl(m_p); + if(m_p) (*module->pcap_close_dl)(m_p); m_p = nullptr; } @@ -249,52 +249,16 @@ static CREATE_NETDEV(create_pcap) return dynamic_cast(dev); } -bool pcap_module::probe() -{ - if (handle == nullptr) - { - handle = LoadDynamicLibrary(LIB_NAME); - return (handle != nullptr); - } - return true; -} - - int pcap_module::init(const osd_options &options) { pcap_if_t *devs; char errbuf[PCAP_ERRBUF_SIZE]; - try + // FIXME: bridge between pcap_module and netdev_pcap + module = this; + + if ((*pcap_findalldevs_dl)(&devs, errbuf) == -1) { - if(!(pcap_findalldevs_dl = (int (*)(pcap_if_t **, char *))GetProcAddress(handle, "pcap_findalldevs"))) - throw GetLastError(); - if(!(pcap_open_live_dl = (pcap_t* (*)(const char *, int, int, int, char *))GetProcAddress(handle, "pcap_open_live"))) - throw GetLastError(); - if(!(pcap_next_ex_dl = (int (*)(pcap_t *, struct pcap_pkthdr **, const u_char **))GetProcAddress(handle, "pcap_next_ex"))) - throw GetLastError(); - if(!(pcap_compile_dl = (int (*)(pcap_t *, struct bpf_program *, char *, int, bpf_u_int32))GetProcAddress(handle, "pcap_compile"))) - throw GetLastError(); - if(!(pcap_close_dl = (void (*)(pcap_t *))GetProcAddress(handle, "pcap_close"))) - throw GetLastError(); - if(!(pcap_setfilter_dl = (int (*)(pcap_t *, struct bpf_program *))GetProcAddress(handle, "pcap_setfilter"))) - throw GetLastError(); - if(!(pcap_sendpacket_dl = (int (*)(pcap_t *, u_char *, int))GetProcAddress(handle, "pcap_sendpacket"))) - throw GetLastError(); - if(!(pcap_set_datalink_dl = (int (*)(pcap_t *, int))GetProcAddress(handle, "pcap_set_datalink"))) - throw GetLastError(); - if(!(pcap_dispatch_dl = (int (*)(pcap_t *, int, pcap_handler callback, u_char *))GetProcAddress(handle, "pcap_dispatch"))) - throw GetLastError(); - } - catch (except_type e) - { - FreeLibrary(handle); - osd_printf_error(LIB_ERROR_STR, e); - return 1; - } - if(pcap_findalldevs_dl(&devs, errbuf) == -1) - { - FreeLibrary(handle); osd_printf_error("Unable to get network devices: %s\n", errbuf); return 1; } @@ -314,9 +278,8 @@ int pcap_module::init(const osd_options &options) void pcap_module::exit() { clear_netdev(); - //FreeLibrary(handle); - //handle = nullptr; } + #else #include "modules/osdmodule.h" #include "netdev_module.h" diff --git a/src/osd/modules/render/d3d/d3d9intf.cpp b/src/osd/modules/render/d3d/d3d9intf.cpp index 435ec7ef64c..08eaaff0c7b 100644 --- a/src/osd/modules/render/d3d/d3d9intf.cpp +++ b/src/osd/modules/render/d3d/d3d9intf.cpp @@ -64,65 +64,27 @@ static inline void convert_present_params(const present_parameters *params, D3DP d3d_base *drawd3d9_init(void) { - bool post_available = true; - - // dynamically grab the create function from d3d9.dll - HINSTANCE dllhandle = LoadLibrary(TEXT("d3d9.dll")); - if (dllhandle == nullptr) - { - osd_printf_verbose("Direct3D: Unable to access d3d9.dll\n"); - return nullptr; - } - - // import the create function - direct3dcreate9_ptr direct3dcreate9 = (direct3dcreate9_ptr)GetProcAddress(dllhandle, "Direct3DCreate9"); - if (direct3dcreate9 == nullptr) - { - osd_printf_verbose("Direct3D: Unable to find Direct3DCreate9\n"); - FreeLibrary(dllhandle); - return nullptr; - } - - // create our core direct 3d object - IDirect3D9 *d3d9 = (*direct3dcreate9)(D3D_SDK_VERSION); - if (d3d9 == nullptr) - { - osd_printf_verbose("Direct3D: Error attempting to initialize Direct3D9\n"); - FreeLibrary(dllhandle); - return nullptr; - } - - // dynamically grab the shader load function from d3dx9.dll - HINSTANCE fxhandle = nullptr; - for (int idx = 99; idx >= 0; idx--) // a shameful moogle - { - #ifdef UNICODE - wchar_t dllbuf[13]; - wsprintf(dllbuf, TEXT("d3dx9_%d.dll"), idx); - fxhandle = LoadLibrary(dllbuf); - #else - char dllbuf[13]; - sprintf(dllbuf, "d3dx9_%d.dll", idx); - fxhandle = LoadLibraryA(dllbuf); - #endif - if (fxhandle != nullptr) - { - break; - } - } - if (fxhandle == nullptr) - { - osd_printf_verbose("Direct3D: Warning - Unable find any D3D9 DLLs; disabling post-effect rendering\n"); - post_available = false; - } - // allocate an object to hold our data - auto d3dptr = global_alloc(d3d_base); + d3d_base *d3dptr = global_alloc(d3d_base); + + d3dptr->d3d9_dll = osd::dynamic_module::open({ "d3d9.dll" }); + + d3d9_create_fn d3d9_create_ptr = d3dptr->d3d9_dll->bind("Direct3DCreate9"); + if (d3d9_create_ptr == nullptr) + { + osd_printf_verbose("Direct3D: Unable to find Direct3D 9 runtime library\n"); + return true; + } + + d3dptr->d3dobj = (*d3d9_create_ptr)(D3D_SDK_VERSION); + if (d3dptr->d3dobj == nullptr) + { + osd_printf_verbose("Direct3D: Unable to initialize Direct3D 9\n"); + return true; + } + d3dptr->version = 9; - d3dptr->d3dobj = d3d9; - d3dptr->dllhandle = dllhandle; - d3dptr->post_fx_available = post_available; - d3dptr->libhandle = fxhandle; + d3dptr->post_fx_available = true; set_interfaces(d3dptr); osd_printf_verbose("Direct3D: Using Direct3D 9\n"); @@ -239,7 +201,6 @@ static ULONG release(d3d_base *d3dptr) { IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; ULONG result = IDirect3D9_Release(d3d9); - FreeLibrary(d3dptr->dllhandle); global_free(d3dptr); return result; } diff --git a/src/osd/modules/render/d3d/d3dcomm.h b/src/osd/modules/render/d3d/d3dcomm.h index 89a7f33a8e8..ebd2294a203 100644 --- a/src/osd/modules/render/d3d/d3dcomm.h +++ b/src/osd/modules/render/d3d/d3dcomm.h @@ -64,7 +64,6 @@ public: { } d3d_texture_manager(renderer_d3d9 *d3d); - ~d3d_texture_manager(); void update_textures(); @@ -142,9 +141,9 @@ public: int get_cur_frame() const { return m_cur_frame; } int get_prev_frame() const { return m_prev_frame; } - texture * get_tex() const { return m_d3dtex; } - surface * get_surface() const { return m_d3dsurface; } - texture * get_finaltex() const { return m_d3dfinaltex; } + IDirect3DTexture9 * get_tex() const { return m_d3dtex; } + IDirect3DSurface9 * get_surface() const { return m_d3dsurface; } + IDirect3DTexture9 * get_finaltex() const { return m_d3dfinaltex; } vec2f & get_uvstart() { return m_start; } vec2f & get_uvstop() { return m_stop; } @@ -173,9 +172,9 @@ private: int m_xprescale, m_yprescale; // X/Y prescale factor int m_cur_frame; // what is our current frame? int m_prev_frame; // what was our last frame? (used to determine pause state) - texture * m_d3dtex; // Direct3D texture pointer - surface * m_d3dsurface; // Direct3D offscreen plain surface pointer - texture * m_d3dfinaltex; // Direct3D final (post-scaled) texture + IDirect3DTexture9 * m_d3dtex; // Direct3D texture pointer + IDirect3DSurface9 * m_d3dsurface; // Direct3D offscreen plain surface pointer + IDirect3DTexture9 * m_d3dfinaltex; // Direct3D final (post-scaled) texture }; /* poly_info holds information about a single polygon/d3d primitive */ @@ -254,8 +253,8 @@ public: bool init(renderer_d3d9 *d3d, d3d_base *d3dintf, int source_width, int source_height, int target_width, int target_height); - surface *last_target; - texture *last_texture; + IDirect3DSurface9 *last_target; + IDirect3DTexture9 *last_texture; int target_width; int target_height; @@ -293,16 +292,16 @@ public: int screen_index; int page_index; - surface *target_surface[2]; - texture *target_texture[2]; - surface *source_surface[2]; - texture *source_texture[2]; + IDirect3DSurface9 *target_surface[2]; + IDirect3DTexture9 *target_texture[2]; + IDirect3DSurface9 *source_surface[2]; + IDirect3DTexture9 *source_texture[2]; d3d_render_target *next; d3d_render_target *prev; - surface *bloom_surface[MAX_BLOOM_COUNT]; - texture *bloom_texture[MAX_BLOOM_COUNT]; + IDirect3DSurface9 *bloom_surface[MAX_BLOOM_COUNT]; + IDirect3DTexture9 *bloom_texture[MAX_BLOOM_COUNT]; float bloom_dims[MAX_BLOOM_COUNT][2]; diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 5c1bef296cf..9c06e99bcbd 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -2,18 +2,10 @@ // copyright-holders:Aaron Giles //============================================================ // -// d3dhlsl.c - Win32 Direct3D HLSL implementation +// d3dhlsl.cpp - Win32 Direct3D HLSL implementation // //============================================================ -// Useful info: -// Windows XP/2003 shipped with DirectX 8.1 -// Windows 2000 shipped with DirectX 7a -// Windows 98SE shipped with DirectX 6.1a -// Windows 98 shipped with DirectX 5 -// Windows NT shipped with DirectX 3.0a -// Windows 95 shipped with DirectX 2 - // MAME headers #include "emu.h" #include "drivenum.h" @@ -46,14 +38,6 @@ static void get_vector(const char *data, int count, float *out, bool report_error); -//============================================================ -// TYPE DEFINITIONS -//============================================================ - -typedef HRESULT (WINAPI *direct3dx9_loadeffect_ptr)(LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, const D3DXMACRO *pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT *ppEffect, LPD3DXBUFFER *ppCompilationErrors); -static direct3dx9_loadeffect_ptr g_load_effect = nullptr; - - //============================================================ // shader manager constructor //============================================================ @@ -119,21 +103,21 @@ void shaders::window_save() return; } - HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->CreateTexture(snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture, nullptr); + if (FAILED(result)) { osd_printf_verbose("Direct3D: Unable to init system-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result); return; } - (*d3dintf->texture.get_surface_level)(snap_copy_texture, 0, &snap_copy_target); + snap_copy_texture->GetSurfaceLevel(0, &snap_copy_target); - result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture); - if (result != D3D_OK) + result = d3d->get_device()->CreateTexture(snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture, nullptr); + if (FAILED(result)) { osd_printf_verbose("Direct3D: Unable to init video-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result); return; } - (*d3dintf->texture.get_surface_level)(snap_texture, 0, &snap_target); + snap_texture->GetSurfaceLevel(0, &snap_target); render_snap = true; snap_rendered = false; @@ -169,7 +153,7 @@ void shaders::window_record() // shaders::avi_update_snap //============================================================ -void shaders::avi_update_snap(surface *surface) +void shaders::avi_update_snap(IDirect3DSurface9 *surface) { if (!master_enable || !d3dintf->post_fx_available) { @@ -185,15 +169,15 @@ void shaders::avi_update_snap(surface *surface) } // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, avi_copy_surface); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->GetRenderTargetData(surface, avi_copy_surface); + if (FAILED(result)) { return; } // lock the texture - result = (*d3dintf->surface.lock_rect)(avi_copy_surface, &rect, nullptr, D3DLOCK_DISCARD); - if (result != D3D_OK) + result = avi_copy_surface->LockRect(&rect, nullptr, D3DLOCK_DISCARD); + if (FAILED(result)) { return; } @@ -211,11 +195,9 @@ void shaders::avi_update_snap(surface *surface) } // unlock - result = (*d3dintf->surface.unlock_rect)(avi_copy_surface); - if (result != D3D_OK) - { - osd_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); - } + result = avi_copy_surface->UnlockRect(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during texture UnlockRect call\n", result); } @@ -224,7 +206,7 @@ void shaders::avi_update_snap(surface *surface) // hlsl_render_snapshot //============================================================ -void shaders::render_snapshot(surface *surface) +void shaders::render_snapshot(IDirect3DSurface9 *surface) { if (!master_enable || !d3dintf->post_fx_available) { @@ -242,15 +224,15 @@ void shaders::render_snapshot(surface *surface) } // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, snap_copy_target); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->GetRenderTargetData(surface, snap_copy_target); + if (FAILED(result)) { return; } // lock the texture - result = (*d3dintf->surface.lock_rect)(snap_copy_target, &rect, nullptr, D3DLOCK_DISCARD); - if (result != D3D_OK) + result = snap_copy_target->LockRect(&rect, nullptr, D3DLOCK_DISCARD); + if (FAILED(result)) { return; } @@ -292,30 +274,31 @@ void shaders::render_snapshot(surface *surface) png_free(&pnginfo); // unlock - result = (*d3dintf->surface.unlock_rect)(snap_copy_target); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); + result = snap_copy_target->UnlockRect(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during texture UnlockRect call\n", result); if (snap_texture != nullptr) { - (*d3dintf->texture.release)(snap_texture); + snap_texture->Release(); snap_texture = nullptr; } if (snap_target != nullptr) { - (*d3dintf->surface.release)(snap_target); + snap_target->Release(); snap_target = nullptr; } if (snap_copy_texture != nullptr) { - (*d3dintf->texture.release)(snap_copy_texture); + snap_copy_texture->Release(); snap_copy_texture = nullptr; } if (snap_copy_target != nullptr) { - (*d3dintf->surface.release)(snap_copy_target); + snap_copy_target->Release(); snap_copy_target = nullptr; } } @@ -332,7 +315,7 @@ void shaders::record_texture() return; } - surface *surface = avi_final_target; + IDirect3DSurface9 *surface = avi_final_target; // ignore if nothing to do if (avi_output_file == nullptr || surface == nullptr) @@ -621,20 +604,17 @@ void shaders::set_texture(texture_info *texture) void shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *renderer) { - if (!d3dintf->post_fx_available) - { - return; - } + d3dx9_dll = osd::dynamic_module::open({ "d3dx9_43.dll" }); - g_load_effect = (direct3dx9_loadeffect_ptr)GetProcAddress(d3dintf->libhandle, "D3DXCreateEffectFromFileW"); - if (g_load_effect == nullptr) + d3dx_create_effect_from_file_ptr = d3dx9_dll->bind("D3DXCreateEffectFromFileW"); + if (!d3dx_create_effect_from_file_ptr) { printf("Direct3D: Unable to find D3DXCreateEffectFromFileW\n"); d3dintf->post_fx_available = false; - return; } + d3dintf->post_fx_available = true; this->d3dintf = d3dintf; this->machine = machine; this->d3d = renderer; @@ -837,41 +817,44 @@ int shaders::create_resources(bool reset, std::vector& sliders) options = &last_options; } - HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->GetRenderTarget(0, &backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device GetRenderTarget call\n", result); } - result = (*d3dintf->device.create_texture)(d3d->get_device(), 4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture); - if (result != D3D_OK) + result = d3d->get_device()->CreateTexture(4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture, nullptr); + if (FAILED(result)) { osd_printf_verbose("Direct3D: Unable to init video-memory target for black texture (%08x)\n", (UINT32)result); return 1; } - (*d3dintf->texture.get_surface_level)(black_texture, 0, &black_surface); - result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, black_surface); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->get_device(), 0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + black_texture->GetSurfaceLevel(0, &black_surface); + result = d3d->get_device()->SetRenderTarget(0, black_surface); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); + result = d3d->get_device()->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device clear call\n", result); + result = d3d->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); - result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture); - if (result != D3D_OK) + result = d3d->get_device()->CreateTexture((int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture, nullptr); + if (FAILED(result)) { osd_printf_verbose("Direct3D: Unable to init system-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result); return 1; } - (*d3dintf->texture.get_surface_level)(avi_copy_texture, 0, &avi_copy_surface); + avi_copy_texture->GetSurfaceLevel(0, &avi_copy_surface); - result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture); - if (result != D3D_OK) + result = d3d->get_device()->CreateTexture((int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture, nullptr); + if (FAILED(result)) { osd_printf_verbose("Direct3D: Unable to init video-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result); return 1; } - (*d3dintf->texture.get_surface_level)(avi_final_texture, 0, &avi_final_target); + avi_final_texture->GetSurfaceLevel(0, &avi_final_target); emu_file file(machine->options().art_path(), OPEN_FLAG_READ); render_load_png(shadow_bitmap, file, nullptr, options->shadow_mask_texture); @@ -890,7 +873,7 @@ int shaders::create_resources(bool reset, std::vector& sliders) texture.seqid = 0; // now create it (no prescale, no wrap) - shadow_texture = new texture_info(d3d->get_texture_manager(), &texture, 1, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + shadow_texture = global_alloc(texture_info(d3d->get_texture_manager(), &texture, 1, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32))); } const char *fx_dir = downcast(machine->options()).screen_post_fx_dir(); @@ -1035,10 +1018,10 @@ void shaders::begin_draw() downsample_effect->set_technique("DefaultTechnique"); vector_effect->set_technique("DefaultTechnique"); - HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->GetRenderTarget(0, &backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device GetRenderTarget call\n", result); } } @@ -1058,7 +1041,7 @@ void shaders::begin_frame() //============================================================ void shaders::blit( - surface *dst, + IDirect3DSurface9 *dst, bool clear_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, @@ -1068,18 +1051,18 @@ void shaders::blit( if (dst != nullptr) { - result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst); - if (result != D3D_OK) + result = d3d->get_device()->SetRenderTarget(0, dst); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); } if (clear_dst) { - result = (*d3dintf->device.clear)(d3d->get_device(), 0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0); - if (result != D3D_OK) + result = d3d->get_device()->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device clear call\n", result); } } } @@ -1092,10 +1075,10 @@ void shaders::blit( curr_effect->begin_pass(pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count); - if (result != D3D_OK) + result = d3d->get_device()->DrawPrimitive(prim_type, prim_index, prim_count); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device DrawPrimitive call\n", result); } curr_effect->end_pass(); @@ -1565,10 +1548,10 @@ int shaders::screen_pass(d3d_render_target *rt, int source_index, poly_info *pol { blit(avi_final_target, false, poly->get_type(), vertnum, poly->get_count()); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); } } @@ -1576,10 +1559,10 @@ int shaders::screen_pass(d3d_render_target *rt, int source_index, poly_info *pol { blit(snap_target, false, poly->get_type(), vertnum, poly->get_count()); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); } snap_rendered = true; @@ -1684,10 +1667,10 @@ void shaders::render_quad(poly_info *poly, int vertnum) next_index = vector_pass(rt, next_index, poly, vertnum); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); } } else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) @@ -1736,10 +1719,10 @@ void shaders::render_quad(poly_info *poly, int vertnum) next_index = screen_pass(rt, next_index, poly, vertnum); d3d->set_wrap(PRIMFLAG_GET_TEXWRAP(curr_texture->get_flags()) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); - if (result != D3D_OK) + HRESULT result = d3d->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) { - osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result); } lines_pending = false; @@ -1770,13 +1753,14 @@ void shaders::end_draw() return; } - (*d3dintf->surface.release)(backbuffer); + backbuffer->Release(); } //============================================================ // shaders::add_cache_target - register a cache target //============================================================ + bool shaders::add_cache_target(renderer_d3d9* d3d, texture_info* texture, int source_width, int source_height, int target_width, int target_height, int screen_index) { cache_target* target = (cache_target*)global_alloc_clear(); @@ -1803,6 +1787,7 @@ bool shaders::add_cache_target(renderer_d3d9* d3d, texture_info* texture, int so //============================================================ // shaders::get_texture_target(render_primitive::prim, texture_info::texture) //============================================================ + d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_info *texture) { auto win = d3d->assert_window(); @@ -2108,42 +2093,42 @@ void shaders::delete_resources(bool reset) if (backbuffer != nullptr) { - (*d3dintf->surface.release)(backbuffer); + backbuffer->Release(); backbuffer = nullptr; } if (black_surface != nullptr) { - (*d3dintf->surface.release)(black_surface); + black_surface->Release(); black_surface = nullptr; } if (black_texture != nullptr) { - (*d3dintf->texture.release)(black_texture); + black_texture->Release(); black_texture = nullptr; } if (avi_copy_texture != nullptr) { - (*d3dintf->texture.release)(avi_copy_texture); + avi_copy_texture->Release(); avi_copy_texture = nullptr; } if (avi_copy_surface != nullptr) { - (*d3dintf->surface.release)(avi_copy_surface); + avi_copy_surface->Release(); avi_copy_surface = nullptr; } if (avi_final_texture != nullptr) { - (*d3dintf->texture.release)(avi_final_texture); + avi_final_texture->Release(); avi_final_texture = nullptr; } if (avi_final_target != nullptr) { - (*d3dintf->surface.release)(avi_final_target); + avi_final_target->Release(); avi_final_target = nullptr; } @@ -2909,12 +2894,12 @@ void uniform::set(bool x) m_bval = x; } -void uniform::set(matrix *mat) +void uniform::set(D3DMATRIX *mat) { m_mval = mat; } -void uniform::set(texture *tex) +void uniform::set(IDirect3DTexture9 *tex) { m_texture = tex; } @@ -2951,9 +2936,8 @@ void uniform::upload() // effect functions //============================================================ -effect::effect(shaders *shadersys, device *dev, const char *name, const char *path) +effect::effect(shaders *shadersys, IDirect3DDevice9 *dev, const char *name, const char *path) { - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; LPD3DXBUFFER buffer_errors = nullptr; m_shaders = shadersys; @@ -2966,7 +2950,7 @@ effect::effect(shaders *shadersys, device *dev, const char *name, const char *pa sprintf(name_cstr, "%s\\%s", path, name); TCHAR *effect_name = tstring_from_utf8(name_cstr); - HRESULT hr = (*g_load_effect)(device, effect_name, nullptr, nullptr, 0, nullptr, &m_effect, &buffer_errors); + HRESULT hr = (*shadersys->d3dx_create_effect_from_file_ptr)(dev, effect_name, nullptr, nullptr, 0, nullptr, &m_effect, &buffer_errors); if (FAILED(hr)) { if (buffer_errors != nullptr) @@ -3093,14 +3077,14 @@ void effect::set_bool(D3DXHANDLE param, bool value) m_effect->SetBool(param, value); } -void effect::set_matrix(D3DXHANDLE param, matrix *matrix) +void effect::set_matrix(D3DXHANDLE param, D3DMATRIX *matrix) { m_effect->SetMatrix(param, (D3DXMATRIX*)matrix); } -void effect::set_texture(D3DXHANDLE param, texture *tex) +void effect::set_texture(D3DXHANDLE param, IDirect3DTexture9 *tex) { - m_effect->SetTexture(param, (IDirect3DTexture9*)tex); + m_effect->SetTexture(param, tex); } D3DXHANDLE effect::get_parameter(D3DXHANDLE param, const char *name) diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index 6f6e31f1933..858e486e3d3 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -13,16 +13,15 @@ #include "aviio.h" #include "../frontend/mame/ui/menuitem.h" #include "../frontend/mame/ui/slider.h" - -//============================================================ -// CONSTANTS -//============================================================ - +#include "modules/lib/osdlib.h" //============================================================ // TYPE DEFINITIONS //============================================================ +// Typedefs for dynamically loaded functions +typedef HRESULT (*d3dx_create_effect_from_file_fn)(LPDIRECT3DDEVICE9, LPCTSTR, const D3DXMACRO *, LPD3DXINCLUDE, DWORD, LPD3DXEFFECTPOOL, LPD3DXEFFECT *, LPD3DXBUFFER *); + class effect; class shaders; @@ -115,8 +114,8 @@ public: void set(float x); void set(int x); void set(bool x); - void set(matrix *mat); - void set(texture *tex); + void set(D3DMATRIX *mat); + void set(IDirect3DTexture9 *tex); void upload(); void update(); @@ -127,10 +126,10 @@ protected: float m_vec[4]; int m_ival; bool m_bval; - matrix *m_mval; - texture *m_texture; + D3DMATRIX *m_mval; + IDirect3DTexture9 *m_texture; int m_count; - uniform_type m_type; + uniform_type m_type; int m_id; effect *m_shader; @@ -142,7 +141,7 @@ class effect friend class uniform; public: - effect(shaders *shadersys, device *dev, const char *name, const char *path); + effect(shaders *shadersys, IDirect3DDevice9 *dev, const char *name, const char *path); ~effect(); void begin(UINT *passes, DWORD flags); @@ -157,8 +156,8 @@ public: void set_float(D3DXHANDLE param, float value); void set_int(D3DXHANDLE param, int value); void set_bool(D3DXHANDLE param, bool value); - void set_matrix(D3DXHANDLE param, matrix *matrix); - void set_texture(D3DXHANDLE param, texture *tex); + void set_matrix(D3DXHANDLE param, D3DMATRIX *matrix); + void set_texture(D3DXHANDLE param, IDirect3DTexture9 *tex); void add_uniform(const char *name, uniform::uniform_type type, int id); void update_uniforms(); @@ -329,8 +328,8 @@ public: void window_record(); bool recording() const { return avi_output_file != nullptr; } - void avi_update_snap(surface *surface); - void render_snapshot(surface *surface); + void avi_update_snap(IDirect3DSurface9 *surface); + void render_snapshot(IDirect3DSurface9 *surface); void record_texture(); void init_fsfx_quad(void *vertbuf); @@ -350,7 +349,7 @@ public: void *get_slider_option(int id, int index = 0); private: - void blit(surface *dst, bool clear_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count); + void blit(IDirect3DSurface9 *dst, bool clear_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count); void enumerate_screens(); void end_avi_recording(); @@ -399,28 +398,28 @@ private: int avi_frame; // AVI frame attotime avi_frame_period; // AVI frame period attotime avi_next_frame_time; // AVI next frame time - surface * avi_copy_surface; // AVI destination surface in system memory - texture * avi_copy_texture; // AVI destination texture in system memory - surface * avi_final_target; // AVI upscaled surface - texture * avi_final_texture; // AVI upscaled texture + IDirect3DSurface9 * avi_copy_surface; // AVI destination surface in system memory + IDirect3DTexture9 * avi_copy_texture; // AVI destination texture in system memory + IDirect3DSurface9 * avi_final_target; // AVI upscaled surface + IDirect3DTexture9 * avi_final_texture; // AVI upscaled texture - surface * black_surface; // black dummy surface - texture * black_texture; // black dummy texture + IDirect3DSurface9 * black_surface; // black dummy surface + IDirect3DTexture9 * black_texture; // black dummy texture bool render_snap; // whether or not to take HLSL post-render snapshot bool snap_rendered; // whether we just rendered our HLSL post-render shot or not - surface * snap_copy_target; // snapshot destination surface in system memory - texture * snap_copy_texture; // snapshot destination surface in system memory - surface * snap_target; // snapshot upscaled surface - texture * snap_texture; // snapshot upscaled texture + IDirect3DSurface9 * snap_copy_target; // snapshot destination surface in system memory + IDirect3DTexture9 * snap_copy_texture; // snapshot destination surface in system memory + IDirect3DSurface9 * snap_target; // snapshot upscaled surface + IDirect3DTexture9 * snap_texture; // snapshot upscaled texture int snap_width; // snapshot width int snap_height; // snapshot height bool lines_pending; // whether or not we have lines to flush on the next quad - bool initialized; // whether or not we're initialize + bool initialized; // whether or not we're initialized // HLSL effects - surface * backbuffer; // pointer to our device's backbuffer + IDirect3DSurface9 * backbuffer; // pointer to our device's backbuffer effect * curr_effect; // pointer to the currently active effect object effect * default_effect; // pointer to the primary-effect object effect * prescale_effect; // pointer to the prescale-effect object @@ -447,6 +446,9 @@ private: static slider_desc s_sliders[]; static hlsl_options last_options; // last used options static char last_system_name[16]; // last used system + + osd::dynamic_module::ptr d3dx9_dll; + d3dx_create_effect_from_file_fn d3dx_create_effect_from_file_ptr; }; #endif diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index 44dd1b10600..0a6f4e50f1b 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -2,18 +2,10 @@ // copyright-holders:Aaron Giles //============================================================ // -// drawd3d.c - Win32 Direct3D implementation +// drawd3d.cpp - Win32 Direct3D implementation // //============================================================ -// Useful info: -// Windows XP/2003 shipped with DirectX 8.1 -// Windows 2000 shipped with DirectX 7a -// Windows 98SE shipped with DirectX 6.1a -// Windows 98 shipped with DirectX 5 -// Windows NT shipped with DirectX 3.0a -// Windows 95 shipped with DirectX 2 - // MAME headers #include "emu.h" #include "render.h" @@ -29,6 +21,13 @@ #include "modules/render/d3d/d3dhlsl.h" +//============================================================ +// TYPE DEFINITIONS +//============================================================ + +typedef IDirect3D9* (*d3d9_create_fn)(UINT); + + //============================================================ // CONSTANTS //============================================================ @@ -121,10 +120,6 @@ static inline UINT32 ycc_to_rgb(UINT8 y, UINT8 cb, UINT8 cr) static d3d_base * d3dintf; // FIX ME -//============================================================ -// PROTOTYPES -//============================================================ - //============================================================ // drawd3d_window_init //============================================================ @@ -133,7 +128,7 @@ int renderer_d3d9::create() { if (!initialize()) { - osd_printf_error("Unable to initialize Direct3D.\n"); + osd_printf_error("Unable to initialize Direct3D 9\n"); return 1; } @@ -183,21 +178,31 @@ render_primitive_list *renderer_d3d9::get_primitives() //============================================================ -// drawnone_create +// renderer_d3d9::init //============================================================ bool renderer_d3d9::init(running_machine &machine) { - // Use Direct3D9 - d3dintf = drawd3d9_init(); + d3dintf = global_alloc(d3d_base); + + d3dintf->d3d9_dll = osd::dynamic_module::open({ "d3d9.dll" }); - // if we failed, note the error - if (d3dintf == nullptr) + d3d9_create_fn d3d9_create_ptr = d3dintf->d3d9_dll->bind("Direct3DCreate9"); + if (d3d9_create_ptr == nullptr) { - osd_printf_error("Unable to initialize Direct3D.\n"); + osd_printf_verbose("Direct3D: Unable to find Direct3D 9 runtime library\n"); + return true; + } + + d3dintf->d3dobj = (*d3d9_create_ptr)(D3D_SDK_VERSION); + if (d3dintf->d3dobj == nullptr) + { + osd_printf_verbose("Direct3D: Unable to initialize Direct3D 9\n"); return true; } + osd_printf_verbose("Direct3D: Using Direct3D 9\n"); + return false; } @@ -225,9 +230,10 @@ void renderer_d3d9::set_texture(texture_info *texture) { m_last_texture = texture; m_last_texture_flags = (texture == nullptr ? 0 : texture->get_flags()); - HRESULT result = (*d3dintf->device.set_texture)(m_device, 0, (texture == nullptr) ? get_default_texture()->get_finaltex() : texture->get_finaltex()); + HRESULT result = m_device->SetTexture(0, (texture == nullptr) ? get_default_texture()->get_finaltex() : texture->get_finaltex()); m_shaders->set_texture(texture); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device set_texture call\n", result); } } @@ -236,14 +242,18 @@ void renderer_d3d9::set_filter(int filter) if (filter != m_last_filter) { m_last_filter = filter; - HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); + HRESULT result = m_device->SetSamplerState(0, D3DSAMP_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(0, D3DSAMP_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(1, D3DSAMP_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(1, D3DSAMP_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); } } @@ -252,14 +262,18 @@ void renderer_d3d9::set_wrap(unsigned int wrap) if (wrap != m_last_wrap) { m_last_wrap = wrap; - HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); + HRESULT result = m_device->SetSamplerState(0, D3DSAMP_ADDRESSU, wrap); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(0, D3DSAMP_ADDRESSV, wrap); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(1, D3DSAMP_ADDRESSU, wrap); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); + result = m_device->SetSamplerState(1, D3DSAMP_ADDRESSV, wrap); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetSamplerState call\n", result); } } @@ -268,10 +282,12 @@ void renderer_d3d9::set_modmode(int modmode) if (modmode != m_last_modmode) { m_last_modmode = modmode; - HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_COLOROP, modmode); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_COLOROP, modmode); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result); + HRESULT result = m_device->SetTextureStageState(0, D3DTSS_COLOROP, modmode); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetTextureStageState call\n", result); + result = m_device->SetTextureStageState(1, D3DTSS_COLOROP, modmode); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetTextureStageState call\n", result); } } @@ -296,29 +312,33 @@ void renderer_d3d9::set_blendmode(int blendmode) if (blendenable != m_last_blendenable) { m_last_blendenable = blendenable; - HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHABLENDENABLE, blendenable); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result); + HRESULT result = m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, blendenable); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderState call\n", result); } if (blendop != m_last_blendop) { m_last_blendop = blendop; - HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_BLENDOP, blendop); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result); + HRESULT result = m_device->SetRenderState(D3DRS_BLENDOP, blendop); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderState call\n", result); } if (blendsrc != m_last_blendsrc) { m_last_blendsrc = blendsrc; - HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SRCBLEND, blendsrc); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result); + HRESULT result = m_device->SetRenderState(D3DRS_SRCBLEND, blendsrc); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderState call\n", result); } if (blenddst != m_last_blenddst) { m_last_blenddst = blenddst; - HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_DESTBLEND, blenddst); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result); + HRESULT result = m_device->SetRenderState(D3DRS_DESTBLEND, blenddst); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderState call\n", result); } } @@ -341,37 +361,35 @@ d3d_texture_manager::d3d_texture_manager(renderer_d3d9 *d3d) m_texlist = nullptr; m_default_texture = nullptr; + D3DCAPS9 caps; + HRESULT result = d3dintf->d3dobj->GetDeviceCaps(d3d->get_adapter(), D3DDEVTYPE_HAL, &caps); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during GetDeviceCaps call\n", result); + // check for dynamic texture support - DWORD tempcaps; - HRESULT result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_CAPS2, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - m_dynamic_supported = ((tempcaps & D3DCAPS2_DYNAMICTEXTURES) != 0); - if (m_dynamic_supported) osd_printf_verbose("Direct3D: Using dynamic textures\n"); + m_dynamic_supported = ((caps.Caps2 & D3DCAPS2_DYNAMICTEXTURES) != 0); + if (m_dynamic_supported) + osd_printf_verbose("Direct3D: Using dynamic textures\n"); // check for stretchrect support - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_STRETCH_RECT_FILTER, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - m_stretch_supported = ((tempcaps & D3DPTFILTERCAPS_MAGFPOINT) != 0); - if (m_stretch_supported && video_config.prescale > 1) osd_printf_verbose("Direct3D: Using StretchRect for prescaling\n"); + m_stretch_supported = ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFPOINT) != 0); + if (m_stretch_supported && video_config.prescale > 1) + osd_printf_verbose("Direct3D: Using StretchRect for prescaling\n"); // get texture caps - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_TEXTURE_CAPS, &m_texture_caps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_ASPECT, &m_texture_max_aspect); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_WIDTH, &m_texture_max_width); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_HEIGHT, &m_texture_max_height); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); + m_texture_caps = caps.TextureCaps; + m_texture_max_aspect = caps.MaxTextureAspectRatio; + m_texture_max_width = caps.MaxTextureWidth; + m_texture_max_height = caps.MaxTextureHeight; // pick a YUV texture format m_yuv_format = D3DFMT_UYVY; - result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_UYVY); - if (result != D3D_OK) + result = d3dintf->d3dobj->CheckDeviceFormat(d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_UYVY); + if (FAILED(result)) { m_yuv_format = D3DFMT_YUY2; - result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_YUY2); - if (result != D3D_OK) + result = d3dintf->d3dobj->CheckDeviceFormat(d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_YUY2); + if (FAILED(result)) m_yuv_format = D3DFMT_A8R8G8B8; } osd_printf_verbose("Direct3D: YUV format = %s\n", (m_yuv_format == D3DFMT_YUY2) ? "YUY2" : (m_yuv_format == D3DFMT_UYVY) ? "UYVY" : "RGB"); @@ -383,10 +401,6 @@ d3d_texture_manager::d3d_texture_manager(renderer_d3d9 *d3d) osd_printf_verbose("Direct3D: Max texture size = %dx%d\n", (int)m_texture_max_width, (int)m_texture_max_height); } -d3d_texture_manager::~d3d_texture_manager() -{ -} - void d3d_texture_manager::create_resources() { auto win = m_renderer->assert_window(); @@ -631,8 +645,9 @@ void renderer_d3d9::begin_frame() { auto win = assert_window(); - HRESULT result = (*d3dintf->device.clear)(m_device, 0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); + HRESULT result = m_device->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device clear call\n", result); m_shaders->begin_frame(); @@ -642,8 +657,9 @@ void renderer_d3d9::begin_frame() m_texture_manager->update_textures(); // begin the scene - result = (*d3dintf->device.begin_scene)(m_device); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result); + result = m_device->BeginScene(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device BeginScene call\n", result); m_lockedbuf = nullptr; @@ -710,12 +726,14 @@ void renderer_d3d9::end_frame() m_shaders->end_frame(); // finish the scene - HRESULT result = (*d3dintf->device.end_scene)(m_device); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device end_scene call\n", (int)result); + HRESULT result = m_device->EndScene(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device end_scene call\n", result); // present the current buffers - result = (*d3dintf->device.present)(m_device, nullptr, nullptr, nullptr, nullptr, 0); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device present call\n", (int)result); + result = m_device->Present(nullptr, nullptr, nullptr, nullptr); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device present call\n", result); } //============================================================ @@ -743,8 +761,8 @@ int renderer_d3d9::device_create(HWND device_hwnd) } // verify texture formats - HRESULT result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8); - if (result != D3D_OK) + HRESULT result = d3dintf->d3dobj->CheckDeviceFormat(m_adapter, D3DDEVTYPE_HAL, m_pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8); + if (FAILED(result)) { osd_printf_error("Error: A8R8G8B8 format textures not supported\n"); return 1; @@ -755,18 +773,18 @@ int renderer_d3d9::device_create(HWND device_hwnd) try_again: // try for XRGB first m_screen_format = D3DFMT_X8R8G8B8; - result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format); - if (result != D3D_OK) + result = d3dintf->d3dobj->CheckDeviceFormat(m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format); + if (FAILED(result)) { // if not, try for ARGB m_screen_format = D3DFMT_A8R8G8B8; - result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format); - if (result != D3D_OK && m_texture_manager->is_dynamic_supported()) + result = d3dintf->d3dobj->CheckDeviceFormat(m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format); + if (FAILED(result) && m_texture_manager->is_dynamic_supported()) { m_texture_manager->set_dynamic_supported(FALSE); goto try_again; } - if (result != D3D_OK) + if (FAILED(result)) { osd_printf_error("Error: unable to configure a screen texture format\n"); return 1; @@ -794,9 +812,9 @@ try_again: D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; // create the D3D device - result = (*d3dintf->d3d.create_device)(d3dintf, m_adapter, D3DDEVTYPE_HAL, device_hwnd, + result = d3dintf->d3dobj->CreateDevice(m_adapter, D3DDEVTYPE_HAL, device_hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &m_presentation, &m_device); - if (result != D3D_OK) + if (FAILED(result)) { // if we got a "DEVICELOST" error, it may be transitory; count it and only fail if // we exceed a threshold @@ -839,7 +857,7 @@ try_again: { ramp.red[i] = ramp.green[i] = ramp.blue[i] = apply_brightness_contrast_gamma(i, brightness, contrast, gamma) << 8; } - (*d3dintf->device.set_gamma_ramp)(m_device, 0, &ramp); + m_device->SetGammaRamp(0, 0, &ramp); } } } @@ -874,57 +892,56 @@ try_again: int renderer_d3d9::device_create_resources() { // allocate a vertex buffer to use - HRESULT result = (*d3dintf->device.create_vertex_buffer)(m_device, - sizeof(vertex) * VERTEX_BUFFER_SIZE, + HRESULT result = m_device->CreateVertexBuffer(sizeof(vertex) * VERTEX_BUFFER_SIZE, D3DUSAGE_DYNAMIC | D3DUSAGE_SOFTWAREPROCESSING | D3DUSAGE_WRITEONLY, VERTEX_BASE_FORMAT | ((m_shaders->enabled() && d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW), - D3DPOOL_DEFAULT, &m_vertexbuf); - if (result != D3D_OK) + D3DPOOL_DEFAULT, &m_vertexbuf, nullptr); + if (FAILED(result)) { osd_printf_error("Error creating vertex buffer (%08X)\n", (UINT32)result); return 1; } // set the vertex format - result = (*d3dintf->device.set_vertex_format)(m_device, (D3DFORMAT)(VERTEX_BASE_FORMAT | ((m_shaders->enabled() && + result = m_device->SetFVF((D3DFORMAT)(VERTEX_BASE_FORMAT | ((m_shaders->enabled() && d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW))); - if (result != D3D_OK) + if (FAILED(result)) { osd_printf_error("Error setting vertex format (%08X)\n", (UINT32)result); return 1; } // set the fixed render state - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZENABLE, D3DZB_FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_FILLMODE, D3DFILL_SOLID); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SHADEMODE, D3DSHADE_FLAT); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZWRITEENABLE, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHATESTENABLE, TRUE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_LASTPIXEL, TRUE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_CULLMODE, D3DCULL_NONE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZFUNC, D3DCMP_LESS); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHAREF, 0); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHAFUNC, D3DCMP_GREATER); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_DITHERENABLE, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_FOGENABLE, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SPECULARENABLE, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_STENCILENABLE, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_WRAP0, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_CLIPPING, TRUE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_LIGHTING, FALSE); - result = (*d3dintf->device.set_render_state)(m_device, D3DRS_COLORVERTEX, TRUE); + result = m_device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + result = m_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + result = m_device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); + result = m_device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + result = m_device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + result = m_device->SetRenderState(D3DRS_LASTPIXEL, TRUE); + result = m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + result = m_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); + result = m_device->SetRenderState(D3DRS_ALPHAREF, 0); + result = m_device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); + result = m_device->SetRenderState(D3DRS_DITHERENABLE, FALSE); + result = m_device->SetRenderState(D3DRS_FOGENABLE, FALSE); + result = m_device->SetRenderState(D3DRS_SPECULARENABLE, FALSE); + result = m_device->SetRenderState(D3DRS_STENCILENABLE, FALSE); + result = m_device->SetRenderState(D3DRS_WRAP0, FALSE); + result = m_device->SetRenderState(D3DRS_CLIPPING, TRUE); + result = m_device->SetRenderState(D3DRS_LIGHTING, FALSE); + result = m_device->SetRenderState(D3DRS_COLORVERTEX, TRUE); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_COLOROP, D3DTOP_MODULATE); - result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + result = m_device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + result = m_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + result = m_device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); + result = m_device->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE); // reset the local states to force updates reset_render_states(); // clear the buffer - result = (*d3dintf->device.clear)(m_device, 0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); - result = (*d3dintf->device.present)(m_device, nullptr, nullptr, nullptr, nullptr, 0); + result = m_device->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = m_device->Present(nullptr, nullptr, nullptr, nullptr); m_texture_manager->create_resources(); @@ -953,7 +970,10 @@ renderer_d3d9::~renderer_d3d9() void renderer_d3d9::exit() { if (d3dintf != nullptr) - (*d3dintf->d3d.release)(d3dintf); + { + d3dintf->d3dobj->Release(); + global_free(d3dintf); + } } void renderer_d3d9::device_delete() @@ -980,7 +1000,7 @@ void renderer_d3d9::device_delete() // free the device itself if (m_device != nullptr) { - (*d3dintf->device.release)(m_device); + m_device->Release(); m_device = nullptr; } } @@ -1000,7 +1020,7 @@ void renderer_d3d9::device_delete_resources() // free the vertex buffer if (m_vertexbuf != nullptr) { - (*d3dintf->vertexbuf.release)(m_vertexbuf); + m_vertexbuf->Release(); m_vertexbuf = nullptr; } } @@ -1014,59 +1034,53 @@ int renderer_d3d9::device_verify_caps() { int retval = 0; - DWORD tempcaps; - HRESULT result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_MAX_PS30_INSN_SLOTS, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D Error %08X during get_caps_dword call\n", (int)result); - if (tempcaps < 512) + D3DCAPS9 caps; + HRESULT result = d3dintf->d3dobj->GetDeviceCaps(m_adapter, D3DDEVTYPE_HAL, &caps); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during GetDeviceCaps call\n", result); + + if (caps.MaxPixelShader30InstructionSlots < 512) { osd_printf_verbose("Direct3D: Warning - Device does not support Pixel Shader 3.0, falling back to non-PS rendering\n"); d3dintf->post_fx_available = false; } // verify presentation capabilities - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_PRESENTATION_INTERVALS, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - if (!(tempcaps & D3DPRESENT_INTERVAL_IMMEDIATE)) + if (!(caps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE)) { osd_printf_verbose("Direct3D: Error - Device does not support immediate presentations\n"); retval = 2; } - if (!(tempcaps & D3DPRESENT_INTERVAL_ONE)) + if (!(caps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE)) { osd_printf_verbose("Direct3D: Error - Device does not support per-refresh presentations\n"); retval = 2; } // verify device capabilities - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_DEV_CAPS, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - if (!(tempcaps & D3DDEVCAPS_CANRENDERAFTERFLIP)) + if (!(caps.DevCaps & D3DDEVCAPS_CANRENDERAFTERFLIP)) { osd_printf_verbose("Direct3D: Warning - Device does not support queued rendering after a page flip\n"); retval = 1; } - if (!(tempcaps & D3DDEVCAPS_HWRASTERIZATION)) + if (!(caps.DevCaps & D3DDEVCAPS_HWRASTERIZATION)) { osd_printf_verbose("Direct3D: Warning - Device does not support hardware rasterization\n"); retval = 1; } // verify texture operation capabilities - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_OP_CAPS, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - if (!(tempcaps & D3DTEXOPCAPS_MODULATE)) + if (!(caps.TextureOpCaps & D3DTEXOPCAPS_MODULATE)) { osd_printf_verbose("Direct3D: Warning - Device does not support texture modulation\n"); retval = 1; } // set a simpler flag to indicate mod2x and mod4x texture modes - m_mod2x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE2X) != 0); - m_mod4x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE4X) != 0); + m_mod2x_supported = ((caps.TextureOpCaps & D3DTEXOPCAPS_MODULATE2X) != 0); + m_mod4x_supported = ((caps.TextureOpCaps & D3DTEXOPCAPS_MODULATE4X) != 0); - result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_CAPS2, &tempcaps); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result); - m_gamma_supported = ((tempcaps & D3DCAPS2_FULLSCREENGAMMA) != 0); + m_gamma_supported = ((caps.Caps2 & D3DCAPS2_FULLSCREENGAMMA) != 0); return retval; } @@ -1079,7 +1093,7 @@ int renderer_d3d9::device_verify_caps() int renderer_d3d9::device_test_cooperative() { // check our current status; if we lost the device, punt to GDI - HRESULT result = (*d3dintf->device.test_cooperative_level)(m_device); + HRESULT result = m_device->TestCooperativeLevel(); if (result == D3DERR_DEVICELOST) return 1; @@ -1092,12 +1106,12 @@ int renderer_d3d9::device_test_cooperative() m_sliders.clear(); m_shaders->delete_resources(true); device_delete_resources(); - result = (*d3dintf->device.reset)(m_device, &m_presentation); + result = m_device->Reset(&m_presentation); // if it didn't work, punt to GDI - if (result != D3D_OK) + if (FAILED(result)) { - osd_printf_error("Unable to reset, result %08x\n", (UINT32)result); + osd_printf_error("Unable to reset, result %08lX\n", result); return 1; } @@ -1127,23 +1141,23 @@ int renderer_d3d9::device_test_cooperative() int renderer_d3d9::config_adapter_mode() { - adapter_identifier identifier; - // choose the monitor number m_adapter = get_adapter_for_monitor(); // get the identifier - HRESULT result = (*d3dintf->d3d.get_adapter_identifier)(d3dintf, m_adapter, 0, &identifier); - if (result != D3D_OK) + D3DADAPTER_IDENTIFIER9 id; + HRESULT result = d3dintf->d3dobj->GetAdapterIdentifier(m_adapter, 0, &id); + if (FAILED(result)) { osd_printf_error("Error getting identifier for adapter #%d\n", m_adapter); return 1; } - osd_printf_verbose("Direct3D: Configuring adapter #%d = %s\n", m_adapter, identifier.Description); + + osd_printf_verbose("Direct3D: Configuring adapter #%d = %s\n", m_adapter, id.Description); // get the current display mode - result = (*d3dintf->d3d.get_adapter_display_mode)(d3dintf, m_adapter, &m_origmode); - if (result != D3D_OK) + result = d3dintf->d3dobj->GetAdapterDisplayMode(m_adapter, &m_origmode); + if (FAILED(result)) { osd_printf_error("Error getting mode for adapter #%d\n", m_adapter); return 1; @@ -1188,8 +1202,8 @@ int renderer_d3d9::config_adapter_mode() } // see if we can handle the device type - result = (*d3dintf->d3d.check_device_type)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_pixformat, !win->fullscreen()); - if (result != D3D_OK) + result = d3dintf->d3dobj->CheckDeviceType(m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_pixformat, !win->fullscreen()); + if (FAILED(result)) { osd_printf_error("Proposed video mode not supported on device %s\n", win->monitor()->devicename()); return 1; @@ -1204,7 +1218,7 @@ int renderer_d3d9::config_adapter_mode() int renderer_d3d9::get_adapter_for_monitor() { - int maxadapter = (*d3dintf->d3d.get_adapter_count)(d3dintf); + int maxadapter = d3dintf->d3dobj->GetAdapterCount(); auto win = assert_window(); @@ -1212,7 +1226,7 @@ int renderer_d3d9::get_adapter_for_monitor() for (int adapternum = 0; adapternum < maxadapter; adapternum++) { // get the monitor for this adapter - HMONITOR curmonitor = (*d3dintf->d3d.get_adapter_monitor)(d3dintf, adapternum); + HMONITOR curmonitor = d3dintf->d3dobj->GetAdapterMonitor(adapternum); // if we match the proposed monitor, this is it if (curmonitor == *((HMONITOR *)win->monitor()->oshandle())) @@ -1256,7 +1270,7 @@ void renderer_d3d9::pick_best_mode() INT32 target_height = minheight; // determine the maximum number of modes - int maxmodes = (*d3dintf->d3d.get_adapter_mode_count)(d3dintf, m_adapter, D3DFMT_X8R8G8B8); + int maxmodes = d3dintf->d3dobj->GetAdapterModeCount(m_adapter, D3DFMT_X8R8G8B8); // enumerate all the video modes and find the best match osd_printf_verbose("Direct3D: Selecting video mode...\n"); @@ -1264,8 +1278,8 @@ void renderer_d3d9::pick_best_mode() { // check this mode D3DDISPLAYMODE mode; - HRESULT result = (*d3dintf->d3d.enum_adapter_modes)(d3dintf, m_adapter, D3DFMT_X8R8G8B8, modenum, &mode); - if (result != D3D_OK) + HRESULT result = d3dintf->d3dobj->EnumAdapterModes(m_adapter, D3DFMT_X8R8G8B8, modenum, &mode); + if (FAILED(result)) break; // skip non-32 bit modes @@ -1753,8 +1767,8 @@ vertex *renderer_d3d9::mesh_alloc(int numverts) // if we don't have a lock, grab it now if (m_lockedbuf == nullptr) { - result = (*d3dintf->vertexbuf.lock)(m_vertexbuf, 0, 0, (VOID **)&m_lockedbuf, D3DLOCK_DISCARD); - if (result != D3D_OK) + result = m_vertexbuf->Lock(0, 0, (VOID **)&m_lockedbuf, D3DLOCK_DISCARD); + if (FAILED(result)) return nullptr; } @@ -1777,18 +1791,19 @@ void renderer_d3d9::primitive_flush_pending() { // ignore if we're not locked if (m_lockedbuf == nullptr) - { return; - } // unlock the buffer - HRESULT result = (*d3dintf->vertexbuf.unlock)(m_vertexbuf); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during vertex buffer unlock call\n", (int)result); + HRESULT result = m_vertexbuf->Unlock(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during vertex buffer unlock call\n", result); + m_lockedbuf = nullptr; // set the stream - result = (*d3dintf->device.set_stream_source)(m_device, 0, m_vertexbuf, sizeof(vertex)); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_stream_source call\n", (int)result); + result = m_device->SetStreamSource(0, m_vertexbuf, 0, sizeof(vertex)); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetStreamSource call\n", result); m_shaders->begin_draw(); @@ -1839,9 +1854,9 @@ void renderer_d3d9::primitive_flush_pending() else { // add the primitives - result = (*d3dintf->device.draw_primitive)(m_device, m_poly[polynum].get_type(), vertnum, - m_poly[polynum].get_count()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + result = m_device->DrawPrimitive(m_poly[polynum].get_type(), vertnum, m_poly[polynum].get_count()); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device draw_primitive call\n", result); } vertnum += m_poly[polynum].get_vertcount(); @@ -1864,22 +1879,16 @@ texture_info::~texture_info() if (m_d3dfinaltex != nullptr) { if (m_d3dtex == m_d3dfinaltex) - { m_d3dtex = nullptr; - } - (*d3dintf->texture.release)(m_d3dfinaltex); - m_d3dfinaltex = nullptr; + + m_d3dfinaltex->Release(); } + if (m_d3dtex != nullptr) - { - (*d3dintf->texture.release)(m_d3dtex); - m_d3dtex = nullptr; - } + m_d3dtex->Release(); + if (m_d3dsurface != nullptr) - { - (*d3dintf->surface.release)(m_d3dsurface); - m_d3dsurface = nullptr; - } + m_d3dsurface->Release(); } @@ -1935,8 +1944,8 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t if (!PRIMFLAG_GET_SCREENTEX(flags)) { assert(PRIMFLAG_TEXFORMAT(flags) != TEXFORMAT_YUY16); - result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_d3dtex); - if (result != D3D_OK) + result = m_renderer->get_device()->CreateTexture(m_rawdims.c.x, m_rawdims.c.y, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_d3dtex, nullptr); + if (FAILED(result)) goto error; m_d3dfinaltex = m_d3dtex; } @@ -2001,7 +2010,7 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t // screen textures with no prescaling are pretty easy if (m_xprescale == 1 && m_yprescale == 1) { - result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex); + result = m_renderer->get_device()->CreateTexture(m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex, nullptr); if (result == D3D_OK) { m_d3dfinaltex = m_d3dtex; @@ -2015,8 +2024,8 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t // (won't work for YUY textures) if (m_texture_manager->is_stretch_supported() && PRIMFLAG_GET_TEXFORMAT(flags) != TEXFORMAT_YUY16) { - result = (*d3dintf->device.create_offscreen_plain_surface)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, format, D3DPOOL_DEFAULT, &m_d3dsurface); - if (result != D3D_OK) + result = m_renderer->get_device()->CreateOffscreenPlainSurface(m_rawdims.c.x, m_rawdims.c.y, format, D3DPOOL_DEFAULT, &m_d3dsurface, nullptr); + if (FAILED(result)) { continue; } @@ -2024,8 +2033,8 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t // otherwise, we allocate a dynamic texture for the source else { - result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex); - if (result != D3D_OK) + result = m_renderer->get_device()->CreateTexture(m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex, nullptr); + if (FAILED(result)) { continue; } @@ -2038,13 +2047,13 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t // target surfaces typically cannot be YCbCr, so we always pick RGB in that case D3DFORMAT finalfmt = (format != m_texture_manager->get_yuv_format()) ? format : D3DFMT_A8R8G8B8; - result = (*d3dintf->device.create_texture)(m_renderer->get_device(), scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &m_d3dfinaltex); + result = m_renderer->get_device()->CreateTexture(scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &m_d3dfinaltex, nullptr); if (result == D3D_OK) { break; } - (*d3dintf->texture.release)(m_d3dtex); + m_d3dtex->Release(); m_d3dtex = nullptr; } } @@ -2065,9 +2074,9 @@ error: d3dintf->post_fx_available = false; osd_printf_error("Direct3D: Critical warning: A texture failed to allocate. Expect things to get bad quickly.\n"); if (m_d3dsurface != nullptr) - (*d3dintf->surface.release)(m_d3dsurface); + m_d3dsurface->Release(); if (m_d3dtex != nullptr) - (*d3dintf->texture.release)(m_d3dtex); + m_d3dtex->Release(); } @@ -2536,11 +2545,11 @@ void texture_info::set_data(const render_texinfo *texsource, UINT32 flags) switch (m_type) { default: - case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, nullptr, 0); break; - case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, nullptr, D3DLOCK_DISCARD); break; - case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.lock_rect)(m_d3dsurface, &rect, nullptr, D3DLOCK_DISCARD); break; + case TEXTURE_TYPE_PLAIN: result = m_d3dtex->LockRect(0, &rect, nullptr, 0); break; + case TEXTURE_TYPE_DYNAMIC: result = m_d3dtex->LockRect(0, &rect, nullptr, D3DLOCK_DISCARD); break; + case TEXTURE_TYPE_SURFACE: result = m_d3dsurface->LockRect(&rect, nullptr, D3DLOCK_DISCARD); break; } - if (result != D3D_OK) + if (FAILED(result)) { return; } @@ -2591,14 +2600,12 @@ void texture_info::set_data(const render_texinfo *texsource, UINT32 flags) switch (m_type) { default: - case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break; - case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break; - case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.unlock_rect)(m_d3dsurface); break; - } - if (result != D3D_OK) - { - osd_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); + case TEXTURE_TYPE_PLAIN: result = m_d3dtex->UnlockRect(0); break; + case TEXTURE_TYPE_DYNAMIC: result = m_d3dtex->UnlockRect(0); break; + case TEXTURE_TYPE_SURFACE: result = m_d3dsurface->UnlockRect(); break; } + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during texture UnlockRect call\n", result); // prescale prescale(); @@ -2611,7 +2618,7 @@ void texture_info::set_data(const render_texinfo *texsource, UINT32 flags) void texture_info::prescale() { - surface *scale_surface; + IDirect3DSurface9 *scale_surface; HRESULT result; int i; @@ -2620,8 +2627,9 @@ void texture_info::prescale() return; // for all cases, we need to get the surface of the render target - result = (*d3dintf->texture.get_surface_level)(m_d3dfinaltex, 0, &scale_surface); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during texture get_surface_level call\n", (int)result); + result = m_d3dfinaltex->GetSurfaceLevel(0, &scale_surface); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during texture GetSurfaceLevel call\n", result); // if we have an offscreen plain surface, we can just StretchRect to it if (m_type == TEXTURE_TYPE_SURFACE) @@ -2641,37 +2649,43 @@ void texture_info::prescale() dest.bottom *= m_yprescale; // do the stretchrect - result = (*d3dintf->device.stretch_rect)(m_renderer->get_device(), m_d3dsurface, &source, scale_surface, &dest, D3DTEXF_POINT); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device stretct_rect call\n", (int)result); + result = m_renderer->get_device()->StretchRect(m_d3dsurface, &source, scale_surface, &dest, D3DTEXF_POINT); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device stretct_rect call\n", result); } // if we are using a texture render target, we need to do more preparations else { - surface *backbuffer; + IDirect3DSurface9 *backbuffer; assert(m_d3dtex != nullptr); // first remember the original render target and set the new one - result = (*d3dintf->device.get_render_target)(m_renderer->get_device(), 0, &backbuffer); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); - result = (*d3dintf->device.set_render_target)(m_renderer->get_device(), 0, scale_surface); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call 1\n", (int)result); + result = m_renderer->get_device()->GetRenderTarget(0, &backbuffer); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device GetRenderTarget call\n", result); + result = m_renderer->get_device()->SetRenderTarget(0, scale_surface); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call 1\n", result); m_renderer->reset_render_states(); // start the scene - result = (*d3dintf->device.begin_scene)(m_renderer->get_device()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result); + result = m_renderer->get_device()->BeginScene(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device BeginScene call\n", result); // configure the rendering pipeline m_renderer->set_filter(FALSE); m_renderer->set_blendmode(BLENDMODE_NONE); - result = (*d3dintf->device.set_texture)(m_renderer->get_device(), 0, m_d3dtex); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result); + result = m_renderer->get_device()->SetTexture(0, m_d3dtex); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetTexture call\n", result); // lock the vertex buffer - result = (*d3dintf->vertexbuf.lock)(m_renderer->get_vertex_buffer(), 0, 0, m_renderer->get_locked_buffer_ptr(), D3DLOCK_DISCARD); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during vertex buffer lock call\n", (int)result); + result = m_renderer->get_vertex_buffer()->Lock(0, 0, m_renderer->get_locked_buffer_ptr(), D3DLOCK_DISCARD); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during vertex buffer lock call\n", result); // configure the X/Y coordinates on the target surface vertex *lockedbuf = m_renderer->get_locked_buffer(); @@ -2703,29 +2717,34 @@ void texture_info::prescale() } // unlock the vertex buffer - result = (*d3dintf->vertexbuf.unlock)(m_renderer->get_vertex_buffer()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during vertex buffer unlock call\n", (int)result); + result = m_renderer->get_vertex_buffer()->Unlock(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during vertex buffer unlock call\n", result); m_renderer->set_locked_buffer(nullptr); // set the stream and draw the triangle strip - result = (*d3dintf->device.set_stream_source)(m_renderer->get_device(), 0, m_renderer->get_vertex_buffer(), sizeof(vertex)); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_stream_source call\n", (int)result); - result = (*d3dintf->device.draw_primitive)(m_renderer->get_device(), D3DPT_TRIANGLESTRIP, 0, 2); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + result = m_renderer->get_device()->SetStreamSource(0, m_renderer->get_vertex_buffer(), 0, sizeof(vertex)); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetStreamSource call\n", result); + result = m_renderer->get_device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device DrawPrimitive call\n", result); // end the scene - result = (*d3dintf->device.end_scene)(m_renderer->get_device()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device end_scene call\n", (int)result); + result = m_renderer->get_device()->EndScene(); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device end_scene call\n", result); // reset the render target and release our reference to the backbuffer - result = (*d3dintf->device.set_render_target)(m_renderer->get_device(), 0, backbuffer); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call 2\n", (int)result); - (*d3dintf->surface.release)(backbuffer); + result = m_renderer->get_device()->SetRenderTarget(0, backbuffer); + if (FAILED(result)) + osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call 2\n", result); + backbuffer->Release(); m_renderer->reset_render_states(); } // release our reference to the target surface - (*d3dintf->surface.release)(scale_surface); + scale_surface->Release(); } @@ -2736,15 +2755,10 @@ void texture_info::prescale() cache_target::~cache_target() { if (last_texture != nullptr) - { - (*d3dintf->texture.release)(last_texture); - last_texture = nullptr; - } + last_texture->Release(); + if (last_target != nullptr) - { - (*d3dintf->surface.release)(last_target); - last_target = nullptr; - } + last_target->Release(); } @@ -2759,12 +2773,11 @@ bool cache_target::init(renderer_d3d9 *d3d, d3d_base *d3dintf, int source_width, this->target_width = target_width; this->target_height = target_height; - HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), target_width, target_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture); - if (result != D3D_OK) - { + HRESULT result = d3d->get_device()->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture, nullptr); + if (FAILED(result)) return false; - } - (*d3dintf->texture.get_surface_level)(last_texture, 0, &last_target); + + last_texture->GetSurfaceLevel(0, &last_target); return true; } @@ -2779,39 +2792,25 @@ d3d_render_target::~d3d_render_target() for (int index = 0; index < MAX_BLOOM_COUNT; index++) { if (bloom_texture[index] != nullptr) - { - (*d3dintf->texture.release)(bloom_texture[index]); - bloom_texture[index] = nullptr; - } + bloom_texture[index]->Release(); + if (bloom_surface[index] != nullptr) - { - (*d3dintf->surface.release)(bloom_surface[index]); - bloom_surface[index] = nullptr; - } + bloom_surface[index]->Release(); } for (int index = 0; index < 2; index++) { if (source_texture[index] != nullptr) - { - (*d3dintf->texture.release)(source_texture[index]); - source_texture[index] = nullptr; - } + source_texture[index]->Release(); + if (source_surface[index] != nullptr) - { - (*d3dintf->surface.release)(source_surface[index]); - source_surface[index] = nullptr; - } + source_surface[index]->Release(); + if (target_texture[index] != nullptr) - { - (*d3dintf->texture.release)(target_texture[index]); - target_texture[index] = nullptr; - } + target_texture[index]->Release(); + if (target_surface[index] != nullptr) - { - (*d3dintf->surface.release)(target_surface[index]); - target_surface[index] = nullptr; - } + target_surface[index]->Release(); } } @@ -2832,19 +2831,17 @@ bool d3d_render_target::init(renderer_d3d9 *d3d, d3d_base *d3dintf, int source_w for (int index = 0; index < 2; index++) { - result = (*d3dintf->device.create_texture)(d3d->get_device(), source_width, source_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &source_texture[index]); - if (result != D3D_OK) - { + result = d3d->get_device()->CreateTexture(source_width, source_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &source_texture[index], nullptr); + if (FAILED(result)) return false; - } - (*d3dintf->texture.get_surface_level)(source_texture[index], 0, &source_surface[index]); - result = (*d3dintf->device.create_texture)(d3d->get_device(), target_width, target_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &target_texture[index]); - if (result != D3D_OK) - { + source_texture[index]->GetSurfaceLevel(0, &source_surface[index]); + + result = d3d->get_device()->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &target_texture[index], nullptr); + if (FAILED(result)) return false; - } - (*d3dintf->texture.get_surface_level)(target_texture[index], 0, &target_surface[index]); + + target_texture[index]->GetSurfaceLevel(0, &target_surface[index]); } auto win = d3d->assert_window(); @@ -2865,12 +2862,11 @@ bool d3d_render_target::init(renderer_d3d9 *d3d, d3d_base *d3dintf, int source_w this->bloom_dims[bloom_index][0] = (int)bloom_width; this->bloom_dims[bloom_index][1] = (int)bloom_height; - result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)bloom_width, (int)bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index]); - if (result != D3D_OK) - { + result = d3d->get_device()->CreateTexture((int)bloom_width, (int)bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index], nullptr); + if (FAILED(result)) return false; - } - (*d3dintf->texture.get_surface_level)(bloom_texture[bloom_index], 0, &bloom_surface[bloom_index]); + + bloom_texture[bloom_index]->GetSurfaceLevel(0, &bloom_surface[bloom_index]); bloom_width *= scale_factor; bloom_height *= scale_factor; diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index 59d32a46ce7..1c044299b36 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -13,8 +13,17 @@ #ifdef OSD_WINDOWS -#include "d3d/d3dintf.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#undef interface + #include "d3d/d3dcomm.h" +#include "modules/lib/osdlib.h" //============================================================ // CONSTANTS @@ -27,14 +36,17 @@ // TYPE DEFINITIONS //============================================================ -struct vertex; -class texture_info; -class texture_manager; -struct device; -struct vertex_buffer; +struct d3d_base +{ + // internal objects + IDirect3D9 *d3dobj; + bool post_fx_available; + + osd::dynamic_module::ptr d3d9_dll; +}; + class shaders; struct hlsl_options; -class poly_info; /* renderer is the information about Direct3D for the current screen */ class renderer_d3d9 : public osd_renderer @@ -97,10 +109,10 @@ public: int get_height() const { return m_height; } int get_refresh() const { return m_refresh; } - device * get_device() const { return m_device; } - present_parameters * get_presentation() { return &m_presentation; } + IDirect3DDevice9 * get_device() const { return m_device; } + D3DPRESENT_PARAMETERS * get_presentation() { return &m_presentation; } - vertex_buffer * get_vertex_buffer() const { return m_vertexbuf; } + IDirect3DVertexBuffer9 *get_vertex_buffer() const { return m_vertexbuf; } vertex * get_locked_buffer() const { return m_lockedbuf; } VOID ** get_locked_buffer_ptr()const { return (VOID **)&m_lockedbuf; } void set_locked_buffer(vertex *lockedbuf) { m_lockedbuf = lockedbuf; } @@ -128,13 +140,13 @@ private: int m_refresh; // current refresh rate int m_create_error_count; // number of consecutive create errors - device * m_device; // pointer to the Direct3DDevice object + IDirect3DDevice9 * m_device; // pointer to the Direct3DDevice object int m_gamma_supported; // is full screen gamma supported? - present_parameters m_presentation; // set of presentation parameters + D3DPRESENT_PARAMETERS m_presentation; // set of presentation parameters D3DDISPLAYMODE m_origmode; // original display mode for the adapter D3DFORMAT m_pixformat; // pixel format we are using - vertex_buffer * m_vertexbuf; // pointer to the vertex buffer object + IDirect3DVertexBuffer9 *m_vertexbuf; // pointer to the vertex buffer object vertex * m_lockedbuf; // pointer to the locked vertex buffer int m_numverts; // number of accumulated vertices diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp index 77acf017790..83a48e67b51 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp @@ -360,17 +360,11 @@ static void loadgl_functions(osd_gl_context *context) osd_gl_dispatch *gl_dispatch; #endif -#ifdef OSD_WINDOWS -HMODULE win_gl_context::m_module; -#endif - void renderer_ogl::load_gl_lib(running_machine &machine) { if (!s_dll_loaded) { -#ifdef OSD_WINDOWS - win_gl_context::load_library(); -#else +#ifndef OSD_WINDOWS #ifdef USE_DISPATCH_GL /* * directfb and and x11 use this env var diff --git a/src/osd/modules/render/winglcontext.h b/src/osd/modules/render/winglcontext.h index 843532fe33f..54e9a0ebae0 100644 --- a/src/osd/modules/render/winglcontext.h +++ b/src/osd/modules/render/winglcontext.h @@ -14,6 +14,17 @@ #define __WIN_GL_CONTEXT__ #include "modules/opengl/osd_opengl.h" +#include "modules/lib/osdlib.h" + +// Typedefs for dynamically loaded functions +typedef PROC WINAPI (*wglGetProcAddress_fn)(LPCSTR); +typedef HGLRC WINAPI (*wglCreateContext_fn)(HDC); +typedef BOOL WINAPI (*wglDeleteContext_fn)(HGLRC); +typedef BOOL WINAPI (*wglMakeCurrent_fn)(HDC, HGLRC); + +typedef const char * WINAPI (*wglGetExtensionsStringEXT_fn)(void); +typedef BOOL WINAPI (*wglSwapIntervalEXT_fn)(int); +typedef int WINAPI (*wglGetSwapIntervalEXT_fn)(void); class win_gl_context : public osd_gl_context { @@ -22,17 +33,25 @@ public: { m_error[0] = 0; - this->pfn_wglGetProcAddress = (PROC (WINAPI *)(LPCSTR lpszProc)) GetProcAddress(m_module, "wglGetProcAddress"); - this->pfn_wglCreateContext = (HGLRC (WINAPI *)(HDC hdc)) GetProcAddress(m_module, "wglCreateContext"); - this->pfn_wglDeleteContext = (BOOL (WINAPI *)(HGLRC hglrc)) GetProcAddress(m_module, "wglDeleteContext"); - this->pfn_wglMakeCurrent = (BOOL (WINAPI *)(HDC hdc, HGLRC hglrc)) GetProcAddress(m_module, "wglMakeCurrent"); + opengl32_dll = osd::dynamic_module::open({ "opengl32.dll" }); - this->pfn_wglGetExtensionsStringEXT = (const char *(WINAPI *) (void)) pfn_wglGetProcAddress("wglGetExtensionsStringEXT"); + pfn_wglGetProcAddress = opengl32_dll->bind("wglGetProcAddress"); + pfn_wglCreateContext = opengl32_dll->bind("wglCreateContext"); + pfn_wglDeleteContext = opengl32_dll->bind("wglDeleteContext"); + pfn_wglMakeCurrent = opengl32_dll->bind("wglMakeCurrent"); + + if (pfn_wglGetProcAddress == nullptr || pfn_wglCreateContext == nullptr || + pfn_wglDeleteContext == nullptr || pfn_wglMakeCurrent == nullptr) + { + return; + } + + pfn_wglGetExtensionsStringEXT = (wglGetExtensionsStringEXT_fn)(*pfn_wglGetProcAddress)("wglGetExtensionsStringEXT"); if (WGLExtensionSupported("WGL_EXT_swap_control")) { - this->pfn_wglSwapIntervalEXT = (BOOL (WINAPI *) (int)) getProcAddress("wglSwapIntervalEXT"); - this->pfn_wglGetSwapIntervalEXT = (int (WINAPI *) (void)) getProcAddress("wglGetSwapIntervalEXT"); + pfn_wglSwapIntervalEXT = (BOOL (WINAPI *) (int)) getProcAddress("wglSwapIntervalEXT"); + pfn_wglGetSwapIntervalEXT = (int (WINAPI *) (void)) getProcAddress("wglGetSwapIntervalEXT"); } else { @@ -43,25 +62,25 @@ public: m_hdc = GetDC(window); if (!setupPixelFormat(m_hdc)) { - m_context = this->pfn_wglCreateContext(m_hdc); - if (!m_context) + m_context = (*pfn_wglCreateContext)(m_hdc); + if (!m_context) { FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, GetLastError(), 0, m_error, 255, nullptr); return; } - this->pfn_wglMakeCurrent(m_hdc, m_context); + (*pfn_wglMakeCurrent)(m_hdc, m_context); } } virtual ~win_gl_context() { - this->pfn_wglDeleteContext(m_context); + (*pfn_wglDeleteContext)(m_context); ReleaseDC(m_window, m_hdc); } virtual void MakeCurrent() override { - this->pfn_wglMakeCurrent(m_hdc, m_context); + (*pfn_wglMakeCurrent)(m_hdc, m_context); } virtual const char *LastErrorMsg() override @@ -74,17 +93,14 @@ public: virtual void *getProcAddress(const char *proc) override { - void *ret = (void *) GetProcAddress(m_module, proc); - if (ret == nullptr) - ret = (void *) this->pfn_wglGetProcAddress(proc); - return ret; + return (void *)(*pfn_wglGetProcAddress)(proc); } virtual int SetSwapInterval(const int swap) override { - if (this->pfn_wglSwapIntervalEXT != nullptr) + if (pfn_wglSwapIntervalEXT != nullptr) { - this->pfn_wglSwapIntervalEXT(swap ? 1 : 0); + pfn_wglSwapIntervalEXT(swap ? 1 : 0); } return 0; } @@ -95,11 +111,6 @@ public: //wglSwapLayerBuffers(GetDC(window().m_hwnd), WGL_SWAP_MAIN_PLANE); } - static void load_library() - { - m_module = LoadLibraryA("opengl32.dll"); - } - private: int setupPixelFormat(HDC hDC) @@ -124,15 +135,17 @@ private: 0, /* reserved */ 0, 0, 0, /* no layer, visible, damage masks */ }; - int pixelFormat; - pixelFormat = ChoosePixelFormat(hDC, &pfd); - if (pixelFormat == 0) { - strcpy(m_error, "ChoosePixelFormat failed"); + int pixelFormat = ChoosePixelFormat(hDC, &pfd); + + if (pixelFormat == 0) + { + strcpy(m_error, "ChoosePixelFormat failed."); return 1; } - if (SetPixelFormat(hDC, pixelFormat, &pfd) != TRUE) { + if (SetPixelFormat(hDC, pixelFormat, &pfd) != TRUE) + { strcpy(m_error, "SetPixelFormat failed."); return 1; } @@ -141,10 +154,12 @@ private: bool WGLExtensionSupported(const char *extension_name) { - //if (pfn_wglGetExtensionsStringEXT != nullptr) - // printf("%s\n", this->pfn_wglGetExtensionsStringEXT()); + if (pfn_wglGetExtensionsStringEXT == nullptr) + return false; + + // printf("%s\n", pfn_wglGetExtensionsStringEXT()); - if (pfn_wglGetExtensionsStringEXT != nullptr && strstr(pfn_wglGetExtensionsStringEXT(), extension_name) != nullptr) + if (strstr(pfn_wglGetExtensionsStringEXT(), extension_name) != nullptr) return true; else return false; @@ -155,16 +170,15 @@ private: HDC m_hdc; char m_error[256]; - PROC (WINAPI *pfn_wglGetProcAddress)(LPCSTR lpszProc); - HGLRC (WINAPI *pfn_wglCreateContext)(HDC hdc); - BOOL (WINAPI *pfn_wglDeleteContext)(HGLRC hglrc); - BOOL (WINAPI *pfn_wglMakeCurrent)(HDC hdc, HGLRC hglrc); + osd::dynamic_module::ptr opengl32_dll; + wglGetProcAddress_fn pfn_wglGetProcAddress; + wglCreateContext_fn pfn_wglCreateContext; + wglDeleteContext_fn pfn_wglDeleteContext; + wglMakeCurrent_fn pfn_wglMakeCurrent; - const char *(WINAPI *pfn_wglGetExtensionsStringEXT) (void); - BOOL (WINAPI *pfn_wglSwapIntervalEXT) (int interval); - int (WINAPI * pfn_wglGetSwapIntervalEXT) (void); - - static HMODULE m_module; + wglGetExtensionsStringEXT_fn pfn_wglGetExtensionsStringEXT; + wglSwapIntervalEXT_fn pfn_wglSwapIntervalEXT; + wglGetSwapIntervalEXT_fn pfn_wglGetSwapIntervalEXT; }; #endif // __WIN_GL_CONTEXT__ diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp old mode 100644 new mode 100755 index f4da54db2ec..66fdb1ba009 --- a/src/osd/modules/sound/xaudio2_sound.cpp +++ b/src/osd/modules/sound/xaudio2_sound.cpp @@ -33,6 +33,8 @@ #include "winutil.h" +#include "modules/lib/osdlib.h" + //============================================================ // Constants //============================================================ @@ -118,7 +120,7 @@ typedef std::unique_ptr masterin typedef std::unique_ptr src_voice_ptr; // Typedef for pointer to XAudio2Create -typedef lazy_loaded_function_p3 xaudio2_create_ptr; +typedef HRESULT (*xaudio2_create_ptr)(IXAudio2 **, UINT32, XAUDIO2_PROCESSOR); //============================================================ // Helper classes @@ -181,28 +183,27 @@ public: class sound_xaudio2 : public osd_module, public sound_module, public IXAudio2VoiceCallback { private: - const wchar_t* XAUDIO_DLLS[2] = { L"XAudio2_9.dll", L"XAudio2_8.dll" }; - - Microsoft::WRL::ComPtr m_xAudio2; - mastering_voice_ptr m_masterVoice; - src_voice_ptr m_sourceVoice; - DWORD m_sample_bytes; - std::unique_ptr m_buffer; - DWORD m_buffer_size; - DWORD m_buffer_count; - DWORD m_writepos; - std::mutex m_buffer_lock; - HANDLE m_hEventBufferCompleted; - HANDLE m_hEventDataAvailable; - HANDLE m_hEventExiting; - std::thread m_audioThread; - std::queue m_queue; - std::unique_ptr m_buffer_pool; - UINT32 m_overflows; - UINT32 m_underflows; - BOOL m_in_underflow; - xaudio2_create_ptr XAudio2Create; - BOOL m_initialized; + Microsoft::WRL::ComPtr m_xAudio2; + mastering_voice_ptr m_masterVoice; + src_voice_ptr m_sourceVoice; + DWORD m_sample_bytes; + std::unique_ptr m_buffer; + DWORD m_buffer_size; + DWORD m_buffer_count; + DWORD m_writepos; + std::mutex m_buffer_lock; + HANDLE m_hEventBufferCompleted; + HANDLE m_hEventDataAvailable; + HANDLE m_hEventExiting; + std::thread m_audioThread; + std::queue m_queue; + std::unique_ptr m_buffer_pool; + UINT32 m_overflows; + UINT32 m_underflows; + BOOL m_in_underflow; + osd::dynamic_module::ptr m_xaudio_dll; + xaudio2_create_ptr XAudio2Create; + BOOL m_initialized; public: sound_xaudio2() : @@ -223,7 +224,6 @@ public: m_overflows(0), m_underflows(0), m_in_underflow(FALSE), - XAudio2Create("XAudio2Create", XAUDIO_DLLS, ARRAY_LENGTH(XAUDIO_DLLS)), m_initialized(FALSE) { } @@ -261,8 +261,13 @@ private: bool sound_xaudio2::probe() { - int status = XAudio2Create.initialize(); - return status == 0; + m_xaudio_dll = osd::dynamic_module::open({ "XAudio2_9.dll", "XAudio2_8.dll" }); + if (m_xaudio_dll == nullptr) + return false; + + XAudio2Create = m_xaudio_dll->bind("XAudio2Create"); + + return (XAudio2Create ? true : false); } //============================================================ @@ -276,10 +281,9 @@ int sound_xaudio2::init(osd_options const &options) CoInitializeEx(nullptr, COINIT_MULTITHREADED); // Make sure our XAudio2Create entrypoint is bound - int status = XAudio2Create.initialize(); - if (status != 0) + if (!XAudio2Create) { - osd_printf_error("Could not find XAudio2 library\n"); + osd_printf_error("Could not find XAudio2. Please try to reinstall DirectX runtime package.\n"); return 1; } diff --git a/src/osd/windows/winutil.cpp b/src/osd/windows/winutil.cpp index 3574f00f398..880e9aa7a06 100644 --- a/src/osd/windows/winutil.cpp +++ b/src/osd/windows/winutil.cpp @@ -111,67 +111,3 @@ HMODULE WINAPI GetModuleHandleUni() VirtualQuery((LPCVOID)GetModuleHandleUni, &mbi, sizeof(mbi)); return (HMODULE)mbi.AllocationBase; } - -//----------------------------------------------------------- -// Lazy loaded function using LoadLibrary / GetProcAddress -//----------------------------------------------------------- - -lazy_loaded_function::lazy_loaded_function(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) -{ -} - -lazy_loaded_function::lazy_loaded_function(const char * name, const wchar_t** dll_names, int dll_count) - : m_name(name), m_module(nullptr), m_initialized(false), m_pfn(nullptr) -{ - for (int i = 0; i < dll_count; i++) - m_dll_names.push_back(std::wstring(dll_names[i])); -} - -lazy_loaded_function::~lazy_loaded_function() -{ - if (m_module != nullptr) - { - FreeLibrary(m_module); - m_module = nullptr; - } -} - -int lazy_loaded_function::initialize() -{ - if (m_module == nullptr) - { - for (int i = 0; i < m_dll_names.size(); i++) - { - m_module = LoadLibraryW(m_dll_names[i].c_str()); - if (m_module != nullptr) - break; - } - - if (m_module == nullptr) - { - osd_printf_verbose("Could not find DLL to dynamically link function %s.\n", m_name.c_str()); - return ERROR_DLL_NOT_FOUND; - } - } - - if (m_pfn == nullptr) - { - m_pfn = GetProcAddress(m_module, m_name.c_str()); - if (m_pfn == nullptr) - { - osd_printf_verbose("Could not find function address to dynamically link function %s.\n", m_name.c_str()); - return ERROR_NOT_FOUND; - } - } - - m_initialized = true; - - return 0; -} - -void lazy_loaded_function::check_init() const -{ - if (!m_initialized) - fatalerror("Attempt to use function pointer for function %s prior to init!", name()); -} diff --git a/src/osd/windows/winutil.h b/src/osd/windows/winutil.h index d122679438e..2598a920864 100644 --- a/src/osd/windows/winutil.h +++ b/src/osd/windows/winutil.h @@ -18,160 +18,4 @@ osd_dir_entry_type win_attributes_to_entry_type(DWORD attributes); BOOL win_is_gui_application(void); HMODULE WINAPI GetModuleHandleUni(); -//----------------------------------------------------------- -// Lazy loaded function using LoadLibrary / GetProcAddress -//----------------------------------------------------------- - -class lazy_loaded_function -{ -private: - std::string m_name; - std::vector m_dll_names; - HMODULE m_module; - bool m_initialized; - -protected: - void check_init() const; - FARPROC m_pfn; - -public: - lazy_loaded_function(const char * name, const wchar_t* dll_name); - lazy_loaded_function(const char * name, const wchar_t** dll_names, int dll_count); - ~lazy_loaded_function(); - int initialize(); - const char * name() const { return m_name.c_str(); } -}; - -// No parameters -template -class lazy_loaded_function_ret : public lazy_loaded_function -{ -public: - lazy_loaded_function_ret(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_ret(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()() - { - check_init(); - return ((TRet(__stdcall *) ())m_pfn)(); - } -}; - -// One parameter -template -class lazy_loaded_function_p1 : public lazy_loaded_function -{ -public: - lazy_loaded_function_p1(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_p1(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()(P1 p1) - { - check_init(); - return ((TRet(__stdcall *) (P1))m_pfn)(p1); - } -}; - -// Two parameters -template -class lazy_loaded_function_p2 : public lazy_loaded_function -{ -public: - lazy_loaded_function_p2(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_p2(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()(P1 p1, P2 p2) - { - check_init(); - return ((TRet(__stdcall *) (P1, P2))m_pfn)(p1, p2); - } -}; - -// Three parameters -template -class lazy_loaded_function_p3 : public lazy_loaded_function -{ -public: - lazy_loaded_function_p3(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_p3(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()(P1 p1, P2 p2, P3 p3) - { - check_init(); - return ((TRet(__stdcall *) (P1, P2, P3))m_pfn)(p1, p2, p3); - } -}; - -// Four parameters -template -class lazy_loaded_function_p4 : public lazy_loaded_function -{ -public: - lazy_loaded_function_p4(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_p4(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()(P1 p1, P2 p2, P3 p3, P4 p4) - { - check_init(); - return ((TRet(__stdcall *) (P1, P2, P3, P4))m_pfn)(p1, p2, p3, p4); - } -}; - -// Five parameters -template -class lazy_loaded_function_p5 : public lazy_loaded_function -{ -public: - lazy_loaded_function_p5(const char * name, const wchar_t* dll_name) - : lazy_loaded_function(name, &dll_name, 1) - { - } - - lazy_loaded_function_p5(const char * name, const wchar_t** dll_names, int dll_count) - : lazy_loaded_function(name, dll_names, dll_count) - { - } - - TRet operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) - { - check_init(); - return ((TRet(__stdcall *) (P1, P2, P3, P4, P5))m_pfn)(p1, p2, p3, p4, p5); - } -}; - #endif // __WINUTIL__ From 852bd80d455c46a066fa4f1e6267f679b0096231 Mon Sep 17 00:00:00 2001 From: Giuseppe Gorgoglione Date: Sat, 28 May 2016 04:20:02 +0200 Subject: [PATCH 04/19] Remove Direct3D abstraction layer It was introduced to support Direct3D 8 and 9 with the same code base. They had a very similar programming model and the abstraction layer was taking advantage of that. Now, Direct3D 8 support in MAME was removed long time ago, an Direct3D 11 and 12 have very different programming models, so the layer is not useful anymore and can be safely removed to simplify the code. --- src/osd/modules/render/d3d/d3d9intf.cpp | 580 ------------------------ src/osd/modules/render/d3d/d3dintf.h | 239 ---------- 2 files changed, 819 deletions(-) delete mode 100644 src/osd/modules/render/d3d/d3d9intf.cpp delete mode 100644 src/osd/modules/render/d3d/d3dintf.h diff --git a/src/osd/modules/render/d3d/d3d9intf.cpp b/src/osd/modules/render/d3d/d3d9intf.cpp deleted file mode 100644 index 08eaaff0c7b..00000000000 --- a/src/osd/modules/render/d3d/d3d9intf.cpp +++ /dev/null @@ -1,580 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Aaron Giles -//============================================================ -// -// d3d9intf.c - Direct3D 9 abstraction layer -// -//============================================================ - -// standard windows headers -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#undef interface - -// MAME headers -#include "emu.h" - -// MAMEOS headers -#include "d3dintf.h" - - - -//============================================================ -// TYPE DEFINITIONS -//============================================================ - -typedef IDirect3D9 *(WINAPI *direct3dcreate9_ptr)(UINT SDKVersion); - -//============================================================ -// PROTOTYPES -//============================================================ - -static void set_interfaces(d3d_base *d3dptr); - -//============================================================ -// INLINES -//============================================================ - -static inline void convert_present_params(const present_parameters *params, D3DPRESENT_PARAMETERS *d3d9params) -{ - memset(d3d9params, 0, sizeof(*d3d9params)); - d3d9params->BackBufferWidth = params->BackBufferWidth; - d3d9params->BackBufferHeight = params->BackBufferHeight; - d3d9params->BackBufferFormat = params->BackBufferFormat; - d3d9params->BackBufferCount = params->BackBufferCount; - d3d9params->MultiSampleType = params->MultiSampleType; - d3d9params->MultiSampleQuality = params->MultiSampleQuality; - d3d9params->SwapEffect = params->SwapEffect; - d3d9params->hDeviceWindow = params->hDeviceWindow; - d3d9params->Windowed = params->Windowed; - d3d9params->EnableAutoDepthStencil = params->EnableAutoDepthStencil; - d3d9params->AutoDepthStencilFormat = params->AutoDepthStencilFormat; - d3d9params->Flags = params->Flags; - d3d9params->FullScreen_RefreshRateInHz = params->FullScreen_RefreshRateInHz; - d3d9params->PresentationInterval = params->PresentationInterval; -} - - - -//============================================================ -// drawd3d9_init -//============================================================ - -d3d_base *drawd3d9_init(void) -{ - // allocate an object to hold our data - d3d_base *d3dptr = global_alloc(d3d_base); - - d3dptr->d3d9_dll = osd::dynamic_module::open({ "d3d9.dll" }); - - d3d9_create_fn d3d9_create_ptr = d3dptr->d3d9_dll->bind("Direct3DCreate9"); - if (d3d9_create_ptr == nullptr) - { - osd_printf_verbose("Direct3D: Unable to find Direct3D 9 runtime library\n"); - return true; - } - - d3dptr->d3dobj = (*d3d9_create_ptr)(D3D_SDK_VERSION); - if (d3dptr->d3dobj == nullptr) - { - osd_printf_verbose("Direct3D: Unable to initialize Direct3D 9\n"); - return true; - } - - d3dptr->version = 9; - d3dptr->post_fx_available = true; - set_interfaces(d3dptr); - - osd_printf_verbose("Direct3D: Using Direct3D 9\n"); - return d3dptr; -} - - - -//============================================================ -// Direct3D interfaces -//============================================================ - -static HRESULT check_device_format(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_CheckDeviceFormat(d3d9, adapter, devtype, adapterformat, usage, restype, format); -} - - -static HRESULT check_device_type(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_CheckDeviceType(d3d9, adapter, devtype, format, backformat, windowed); -} - -static HRESULT create_device(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, present_parameters *params, device **dev) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - D3DPRESENT_PARAMETERS d3d9params; - convert_present_params(params, &d3d9params); - return IDirect3D9_CreateDevice(d3d9, adapter, devtype, focus, behavior, &d3d9params, (IDirect3DDevice9 **)dev); -} - -static HRESULT enum_adapter_modes(d3d_base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_EnumAdapterModes(d3d9, adapter, format, index, mode); -} - - -static UINT get_adapter_count(d3d_base *d3dptr) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_GetAdapterCount(d3d9); -} - - -static HRESULT get_adapter_display_mode(d3d_base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_GetAdapterDisplayMode(d3d9, adapter, mode); -} - - -static HRESULT get_adapter_identifier(d3d_base *d3dptr, UINT adapter, DWORD flags, adapter_identifier *identifier) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - D3DADAPTER_IDENTIFIER9 id; - HRESULT result = IDirect3D9_GetAdapterIdentifier(d3d9, adapter, flags, &id); - memcpy(identifier->Driver, id.Driver, sizeof(identifier->Driver)); - memcpy(identifier->Description, id.Description, sizeof(identifier->Description)); - identifier->DriverVersion = id.DriverVersion; - identifier->VendorId = id.VendorId; - identifier->DeviceId = id.DeviceId; - identifier->SubSysId = id.SubSysId; - identifier->Revision = id.Revision; - identifier->DeviceIdentifier = id.DeviceIdentifier; - identifier->WHQLLevel = id.WHQLLevel; - return result; -} - - -static UINT get_adapter_mode_count(d3d_base *d3dptr, UINT adapter, D3DFORMAT format) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_GetAdapterModeCount(d3d9, adapter, format); -} - - -static HMONITOR get_adapter_monitor(d3d_base *d3dptr, UINT adapter) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - return IDirect3D9_GetAdapterMonitor(d3d9, adapter); -} - - -static HRESULT get_caps_dword(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, caps_index which, DWORD *value) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - D3DCAPS9 caps; - HRESULT result = IDirect3D9_GetDeviceCaps(d3d9, adapter, devtype, &caps); - switch (which) - { - case CAPS_PRESENTATION_INTERVALS: *value = caps.PresentationIntervals; break; - case CAPS_CAPS2: *value = caps.Caps2; break; - case CAPS_DEV_CAPS: *value = caps.DevCaps; break; - case CAPS_SRCBLEND_CAPS: *value = caps.SrcBlendCaps; break; - case CAPS_DSTBLEND_CAPS: *value = caps.DestBlendCaps; break; - case CAPS_TEXTURE_CAPS: *value = caps.TextureCaps; break; - case CAPS_TEXTURE_FILTER_CAPS: *value = caps.TextureFilterCaps; break; - case CAPS_TEXTURE_ADDRESS_CAPS: *value = caps.TextureAddressCaps; break; - case CAPS_TEXTURE_OP_CAPS: *value = caps.TextureOpCaps; break; - case CAPS_MAX_TEXTURE_ASPECT: *value = caps.MaxTextureAspectRatio; break; - case CAPS_MAX_TEXTURE_WIDTH: *value = caps.MaxTextureWidth; break; - case CAPS_MAX_TEXTURE_HEIGHT: *value = caps.MaxTextureHeight; break; - case CAPS_STRETCH_RECT_FILTER: *value = caps.StretchRectFilterCaps; break; - case CAPS_MAX_PS30_INSN_SLOTS: *value = caps.MaxPixelShader30InstructionSlots; break; - } - return result; -} - - -static ULONG release(d3d_base *d3dptr) -{ - IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; - ULONG result = IDirect3D9_Release(d3d9); - global_free(d3dptr); - return result; -} - - -static const interface d3d9_interface = -{ - check_device_format, - check_device_type, - create_device, - enum_adapter_modes, - get_adapter_count, - get_adapter_display_mode, - get_adapter_identifier, - get_adapter_mode_count, - get_adapter_monitor, - get_caps_dword, - release -}; - - - -//============================================================ -// Direct3DDevice interfaces -//============================================================ - -static HRESULT device_begin_scene(device *dev) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_BeginScene(device); -} - -static HRESULT device_clear(device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_Clear(device, count, rects, flags, color, z, stencil); -} - - -static HRESULT device_create_offscreen_plain_surface(device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, surface **surface) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_CreateOffscreenPlainSurface(device, width, height, format, pool, (IDirect3DSurface9 **)surface, nullptr); -} - -static HRESULT device_create_texture(device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, texture **texture) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_CreateTexture(device, width, height, levels, usage, format, pool, (IDirect3DTexture9 **)texture, nullptr); -} - - -static HRESULT device_create_vertex_buffer(device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, vertex_buffer **buf) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_CreateVertexBuffer(device, length, usage, fvf, pool, (IDirect3DVertexBuffer9 **)buf, nullptr); -} - - -static HRESULT device_draw_primitive(device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_DrawPrimitive(device, type, start, count); -} - - -static HRESULT device_end_scene(device *dev) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_EndScene(device); -} - - -static HRESULT device_get_raster_status(device *dev, D3DRASTER_STATUS *status) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_GetRasterStatus(device, 0, status); -} - - -static HRESULT device_get_render_target(device *dev, DWORD index, surface **surface) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_GetRenderTarget(device, index, (IDirect3DSurface9 **)surface); -} - - -static HRESULT device_get_render_target_data(device *dev, surface *rendertarget, surface *destsurface) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_GetRenderTargetData(device, (IDirect3DSurface9 *)rendertarget, (IDirect3DSurface9 *)destsurface); -} - - -static HRESULT device_present(device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - if (flags != 0) - { - IDirect3DSwapChain9 *chain; - HRESULT result = IDirect3DDevice9_GetSwapChain(device, 0, &chain); - if (result == D3D_OK) - { - result = IDirect3DSwapChain9_Present(chain, source, dest, override, dirty, flags); - IDirect3DSwapChain9_Release(chain); - return result; - } - } - return IDirect3DDevice9_Present(device, source, dest, override, dirty); -} - - -static ULONG device_release(device *dev) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_Release(device); -} - - -static HRESULT device_reset(device *dev, present_parameters *params) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - D3DPRESENT_PARAMETERS d3d9params; - convert_present_params(params, &d3d9params); - return IDirect3DDevice9_Reset(device, &d3d9params); -} - - -static void device_set_gamma_ramp(device *dev, DWORD flags, const D3DGAMMARAMP *ramp) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - IDirect3DDevice9_SetGammaRamp(device, 0, flags, ramp); -} - - -static HRESULT device_set_render_state(device *dev, D3DRENDERSTATETYPE state, DWORD value) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_SetRenderState(device, state, value); -} - - -static HRESULT device_set_render_target(device *dev, DWORD index, surface *surf) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf; - return IDirect3DDevice9_SetRenderTarget(device, index, surface); -} - - -static HRESULT device_create_render_target(device *dev, UINT width, UINT height, D3DFORMAT format, surface **surface) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_CreateRenderTarget(device, width, height, format, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)surface, nullptr); -} - - -static HRESULT device_set_stream_source(device *dev, UINT number, vertex_buffer *vbuf, UINT stride) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf; - return IDirect3DDevice9_SetStreamSource(device, number, vertexbuf, 0, stride); -} - - -static HRESULT device_set_texture(device *dev, DWORD stage, texture *tex) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - IDirect3DBaseTexture9 *texture = (IDirect3DBaseTexture9 *)tex; - return IDirect3DDevice9_SetTexture(device, stage, texture); -} - - -static HRESULT device_set_texture_stage_state(device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - - // some state which was here got pushed into sampler state in D3D9 - switch ((DWORD)state) - { - case D3DTSS_ADDRESSU: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_ADDRESSU, value); - case D3DTSS_ADDRESSV: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_ADDRESSV, value); - case D3DTSS_BORDERCOLOR: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_BORDERCOLOR, value); - case D3DTSS_MAGFILTER: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MAGFILTER, value); - case D3DTSS_MINFILTER: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MINFILTER, value); - case D3DTSS_MIPFILTER: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MIPFILTER, value); - case D3DTSS_MIPMAPLODBIAS: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MIPMAPLODBIAS, value); - case D3DTSS_MAXMIPLEVEL: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MAXMIPLEVEL, value); - case D3DTSS_MAXANISOTROPY: - return IDirect3DDevice9_SetSamplerState(device, stage, D3DSAMP_MAXANISOTROPY, value); - default: - return IDirect3DDevice9_SetTextureStageState(device, stage, state, value); - } -} - - -static HRESULT device_set_vertex_format(device *dev, D3DFORMAT format) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_SetFVF(device, format); -} - - -static HRESULT device_stretch_rect(device *dev, surface *source, const RECT *srcrect, surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - IDirect3DSurface9 *ssurface = (IDirect3DSurface9 *)source; - IDirect3DSurface9 *dsurface = (IDirect3DSurface9 *)dest; - return IDirect3DDevice9_StretchRect(device, ssurface, srcrect, dsurface, dstrect, filter); -} - - -static HRESULT device_test_cooperative_level(device *dev) -{ - IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; - return IDirect3DDevice9_TestCooperativeLevel(device); -} - - -static const d3d_device_interface d3d9_device_interface = -{ - device_begin_scene, - device_clear, - device_create_offscreen_plain_surface, - device_create_texture, - device_create_vertex_buffer, - device_create_render_target, - device_draw_primitive, - device_end_scene, - device_get_raster_status, - device_get_render_target, - device_get_render_target_data, - device_present, - device_release, - device_reset, - device_set_gamma_ramp, - device_set_render_state, - device_set_render_target, - device_set_stream_source, - device_set_texture, - device_set_texture_stage_state, - device_set_vertex_format, - device_stretch_rect, - device_test_cooperative_level -}; - - - -//============================================================ -// Direct3DSurface interfaces -//============================================================ - -static HRESULT surface_lock_rect(surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags) -{ - IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf; - return IDirect3DSurface9_LockRect(surface, locked, rect, flags); -} - - -static ULONG surface_release(surface *surf) -{ - IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf; - return IDirect3DSurface9_Release(surface); -} - - -static HRESULT surface_unlock_rect(surface *surf) -{ - IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf; - return IDirect3DSurface9_UnlockRect(surface); -} - - -static const surface_interface d3d9_surface_interface = -{ - surface_lock_rect, - surface_release, - surface_unlock_rect -}; - - - -//============================================================ -// Direct3DTexture interfaces -//============================================================ - -static HRESULT texture_get_surface_level(texture *tex, UINT level, surface **surface) -{ - IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex; - return IDirect3DTexture9_GetSurfaceLevel(texture, level, (IDirect3DSurface9 **)surface); -} - - -static HRESULT texture_lock_rect(texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags) -{ - IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex; - return IDirect3DTexture9_LockRect(texture, level, locked, rect, flags); -} - - -static ULONG texture_release(texture *tex) -{ - IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex; - return IDirect3DTexture9_Release(texture); -} - - -static HRESULT texture_unlock_rect(texture *tex, UINT level) -{ - IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex; - return IDirect3DTexture9_UnlockRect(texture, level); -} - - -static const texture_interface d3d9_texture_interface = -{ - texture_get_surface_level, - texture_lock_rect, - texture_release, - texture_unlock_rect -}; - - - -//============================================================ -// Direct3DVertexBuffer interfaces -//============================================================ - -static HRESULT vertex_buffer_lock(vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags) -{ - IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf; - return IDirect3DVertexBuffer9_Lock(vertexbuf, offset, size, data, flags); -} - - -static ULONG vertex_buffer_release(vertex_buffer *vbuf) -{ - IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf; - return IDirect3DVertexBuffer9_Release(vertexbuf); -} - - -static HRESULT vertex_buffer_unlock(vertex_buffer *vbuf) -{ - IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf; - return IDirect3DVertexBuffer9_Unlock(vertexbuf); -} - - -static const vertex_buffer_interface d3d9_vertex_buffer_interface = -{ - vertex_buffer_lock, - vertex_buffer_release, - vertex_buffer_unlock -}; - - -//============================================================ -// set_interfaces -//============================================================ - -static void set_interfaces(d3d_base *d3dptr) -{ - d3dptr->d3d = d3d9_interface; - d3dptr->device = d3d9_device_interface; - d3dptr->surface = d3d9_surface_interface; - d3dptr->texture = d3d9_texture_interface; - d3dptr->vertexbuf = d3d9_vertex_buffer_interface; -} diff --git a/src/osd/modules/render/d3d/d3dintf.h b/src/osd/modules/render/d3d/d3dintf.h deleted file mode 100644 index 3e0a90a46f5..00000000000 --- a/src/osd/modules/render/d3d/d3dintf.h +++ /dev/null @@ -1,239 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Aaron Giles -//============================================================ -// -// d3dintf.h - Direct3D 8/9 interface abstractions -// -//============================================================ - -#ifndef __WIN_D3DINTF__ -#define __WIN_D3DINTF__ - -// standard windows headers -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#undef interface - -//============================================================ -// CONSTANTS -//============================================================ - -#ifndef D3DCAPS2_DYNAMICTEXTURES -#define D3DCAPS2_DYNAMICTEXTURES 0x20000000L -#endif - -#ifndef D3DPRESENT_DONOTWAIT -#define D3DPRESENT_DONOTWAIT 0x00000001L -#endif - - -#define D3DTSS_ADDRESSU 13 -#define D3DTSS_ADDRESSV 14 -#define D3DTSS_BORDERCOLOR 15 -#define D3DTSS_MAGFILTER 16 -#define D3DTSS_MINFILTER 17 -#define D3DTSS_MIPFILTER 18 -#define D3DTSS_MIPMAPLODBIAS 19 -#define D3DTSS_MAXMIPLEVEL 20 -#define D3DTSS_MAXANISOTROPY 21 - -//============================================================ -// TYPE DEFINITIONS -//============================================================ - -struct d3d_base; -struct device; -struct surface; -struct texture; -struct vertex_buffer; -class effect; -typedef D3DXVECTOR4 vector; -typedef D3DMATRIX matrix; - -//============================================================ -// Abstracted presentation parameters -//============================================================ - -struct present_parameters -{ - UINT BackBufferWidth; - UINT BackBufferHeight; - D3DFORMAT BackBufferFormat; - UINT BackBufferCount; - D3DMULTISAMPLE_TYPE MultiSampleType; - DWORD MultiSampleQuality; - D3DSWAPEFFECT SwapEffect; - HWND hDeviceWindow; - BOOL Windowed; - BOOL EnableAutoDepthStencil; - D3DFORMAT AutoDepthStencilFormat; - DWORD Flags; - UINT FullScreen_RefreshRateInHz; - UINT PresentationInterval; -}; - - -//============================================================ -// Abstracted device identifier -//============================================================ - -struct adapter_identifier -{ - char Driver[512]; - char Description[512]; - LARGE_INTEGER DriverVersion; - DWORD VendorId; - DWORD DeviceId; - DWORD SubSysId; - DWORD Revision; - GUID DeviceIdentifier; - DWORD WHQLLevel; -}; - - -//============================================================ -// Caps enumeration -//============================================================ - -enum caps_index -{ - CAPS_PRESENTATION_INTERVALS, - CAPS_CAPS2, - CAPS_DEV_CAPS, - CAPS_SRCBLEND_CAPS, - CAPS_DSTBLEND_CAPS, - CAPS_TEXTURE_CAPS, - CAPS_TEXTURE_FILTER_CAPS, - CAPS_TEXTURE_ADDRESS_CAPS, - CAPS_TEXTURE_OP_CAPS, - CAPS_MAX_TEXTURE_ASPECT, - CAPS_MAX_TEXTURE_WIDTH, - CAPS_MAX_TEXTURE_HEIGHT, - CAPS_STRETCH_RECT_FILTER, - CAPS_MAX_PS30_INSN_SLOTS -}; - - -//============================================================ -// Direct3D interfaces -//============================================================ - -struct interface -{ - HRESULT (*check_device_format)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format); - HRESULT (*check_device_type)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed); - HRESULT (*create_device)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, present_parameters *params, device **dev); - HRESULT (*enum_adapter_modes)(d3d_base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode); - UINT (*get_adapter_count)(d3d_base *d3dptr); - HRESULT (*get_adapter_display_mode)(d3d_base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode); - HRESULT (*get_adapter_identifier)(d3d_base *d3dptr, UINT adapter, DWORD flags, adapter_identifier *identifier); - UINT (*get_adapter_mode_count)(d3d_base *d3dptr, UINT adapter, D3DFORMAT format); - HMONITOR (*get_adapter_monitor)(d3d_base *d3dptr, UINT adapter); - HRESULT (*get_caps_dword)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, caps_index which, DWORD *value); - ULONG (*release)(d3d_base *d3dptr); -}; - - -//============================================================ -// Direct3DDevice interfaces -//============================================================ - -struct d3d_device_interface -{ - HRESULT (*begin_scene)(device *dev); - HRESULT (*clear)(device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil); - HRESULT (*create_offscreen_plain_surface)(device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, surface **surface); - HRESULT (*create_texture)(device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, texture **texture); - HRESULT (*create_vertex_buffer)(device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, vertex_buffer **buf); - HRESULT (*create_render_target)(device *dev, UINT width, UINT height, D3DFORMAT format, surface **surface); - HRESULT (*draw_primitive)(device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count); - HRESULT (*end_scene)(device *dev); - HRESULT (*get_raster_status)(device *dev, D3DRASTER_STATUS *status); - HRESULT (*get_render_target)(device *dev, DWORD index, surface **surface); - HRESULT (*get_render_target_data)(device *dev, surface *rendertarget, surface *destsurface); - HRESULT (*present)(device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags); - ULONG (*release)(device *dev); - HRESULT (*reset)(device *dev, present_parameters *params); - void (*set_gamma_ramp)(device *dev, DWORD flags, const D3DGAMMARAMP *ramp); - HRESULT (*set_render_state)(device *dev, D3DRENDERSTATETYPE state, DWORD value); - HRESULT (*set_render_target)(device *dev, DWORD index, surface *surf); - HRESULT (*set_stream_source)(device *dev, UINT number, vertex_buffer *vbuf, UINT stride); - HRESULT (*set_texture)(device *dev, DWORD stage, texture *tex); - HRESULT (*set_texture_stage_state)(device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value); - HRESULT (*set_vertex_format)(device *dev, D3DFORMAT format); - HRESULT (*stretch_rect)(device *dev, surface *source, const RECT *srcrect, surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter); - HRESULT (*test_cooperative_level)(device *dev); -}; - - -//============================================================ -// Direct3DSurface interfaces -//============================================================ - -struct surface_interface -{ - HRESULT (*lock_rect)(surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags); - ULONG (*release)(surface *tex); - HRESULT (*unlock_rect)(surface *surf); -}; - - -//============================================================ -// Direct3DTexture interfaces -//============================================================ - -struct texture_interface -{ - HRESULT (*get_surface_level)(texture *tex, UINT level, surface **surface); - HRESULT (*lock_rect)(texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags); - ULONG (*release)(texture *tex); - HRESULT (*unlock_rect)(texture *tex, UINT level); -}; - - -//============================================================ -// Direct3DVertexBuffer interfaces -//============================================================ - -struct vertex_buffer_interface -{ - HRESULT (*lock)(vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags); - ULONG (*release)(vertex_buffer *vbuf); - HRESULT (*unlock)(vertex_buffer *vbuf); -}; - - -//============================================================ -// Core D3D object -//============================================================ - -struct d3d_base -{ - // internal objects - int version; - void * d3dobj; - HINSTANCE dllhandle; - bool post_fx_available; - HINSTANCE libhandle; - - // interface pointers - interface d3d; - d3d_device_interface device; - surface_interface surface; - texture_interface texture; - vertex_buffer_interface vertexbuf; -}; - - -//============================================================ -// PROTOTYPES -//============================================================ - -d3d_base *drawd3d9_init(void); - -#endif From 6dd5a5fe05e6e2a931f9485876c737f47f56c9e5 Mon Sep 17 00:00:00 2001 From: Julian Sikorski Date: Tue, 14 Jun 2016 23:25:32 +0200 Subject: [PATCH 05/19] Fixed double hyphen in -pipe --- scripts/genie.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/genie.lua b/scripts/genie.lua index 85dbe6d295e..5eebe355e2c 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -705,7 +705,7 @@ end -- this speeds it up a bit by piping between the preprocessor/compiler/assembler if not ("pnacl" == _OPTIONS["gcc"]) then buildoptions { - "--pipe", + "-pipe", } end -- add -g if we need symbols, and ensure we have frame pointers From 6df371a0f10fb57820e7d1ee08a3344372a27246 Mon Sep 17 00:00:00 2001 From: angelosa Date: Wed, 15 Jun 2016 03:51:52 +0200 Subject: [PATCH 06/19] romload.cpp: added ROMX_FILL, passing a ROM_SKIP(param_value) will fill and skip just like a ROM_LOAD16_BYTE macro [Angelo Salese] Added line blinking and overlay opacity selectors for esh.cpp [Angelo Salese] Some minor improvements for LDP-1000 (nw) --- src/devices/machine/ldp1000.cpp | 51 ++++++++++---- src/devices/machine/ldp1000.h | 8 ++- src/emu/romload.cpp | 11 ++- src/emu/romload.h | 1 + src/mame/drivers/esh.cpp | 114 ++++++++++++++++++++++---------- 5 files changed, 131 insertions(+), 54 deletions(-) diff --git a/src/devices/machine/ldp1000.cpp b/src/devices/machine/ldp1000.cpp index 415a4581097..abfa23913b0 100644 --- a/src/devices/machine/ldp1000.cpp +++ b/src/devices/machine/ldp1000.cpp @@ -15,6 +15,7 @@ #include "machine/ldp1000.h" #define DUMP_BCD 1 +#define FIFO_MAX 0x10 ROM_START( ldp1000 ) ROM_REGION( 0x2000, "ldp1000", 0 ) @@ -70,6 +71,9 @@ void sony_ldp1000_device::device_start() void sony_ldp1000_device::device_reset() { laserdisc_device::device_reset(); + + for(int i=0;i<0x10;i++) + m_internal_bcd[i] = 0; } @@ -119,11 +123,10 @@ READ8_MEMBER( sony_ldp1000_device::status_r ) return res; } -void sony_ldp1000_device::set_new_player_state(ldp1000_player_state which, UINT8 fifo_size) +void sony_ldp1000_device::set_new_player_state(ldp1000_player_state which) { m_player_state = which; m_index_state = 0; - m_index_size = fifo_size; printf("set new player state\n"); } @@ -132,18 +135,36 @@ void sony_ldp1000_device::set_new_player_bcd(UINT8 data) { m_internal_bcd[m_index_state] = data; m_index_state ++; - if(m_index_state >= m_index_size) + if(m_index_state >= FIFO_MAX) + throw emu_fatalerror("FIFO MAX reached"); + + m_status = stat_ack; +} + +UINT32 sony_ldp1000_device::bcd_to_raw() +{ + UINT32 res = 0; + for(int i=0;i<6;i++) + res |= (m_internal_bcd[i] & 0xf) << i*4; + return res; +} + +void sony_ldp1000_device::exec_enter_cmd() +{ + //const UINT32 saved_frame = bcd_to_raw(); + + switch(m_player_state) { - #if DUMP_BCD - for(int i=0;ibase() + ROM_GETOFFSET(romp); /* make sure we fill within the region space */ @@ -811,8 +812,16 @@ void rom_load_manager::fill_rom_data(const rom_entry *romp) if (numbytes == 0) fatalerror("Error in RomModule definition: FILL has an invalid length\n"); + printf("base %08x %02x\n",numbytes,skip); + /* fill the data (filling value is stored in place of the hashdata) */ - memset(base, (FPTR)ROM_GETHASHDATA(romp) & 0xff, numbytes); + if(skip != 0) + { + for (int i = 0; i < numbytes; i+= skip + 1) + base[i] = (FPTR)ROM_GETHASHDATA(romp) & 0xff; + } + else + memset(base, (FPTR)ROM_GETHASHDATA(romp) & 0xff, numbytes); } diff --git a/src/emu/romload.h b/src/emu/romload.h index f0553949d96..860f50cbe95 100644 --- a/src/emu/romload.h +++ b/src/emu/romload.h @@ -236,6 +236,7 @@ struct rom_entry #define ROM_CONTINUE(offset,length) { nullptr, nullptr, offset, length, ROMENTRYTYPE_CONTINUE | ROM_INHERITFLAGS }, #define ROM_IGNORE(length) { nullptr, nullptr, 0, length, ROMENTRYTYPE_IGNORE | ROM_INHERITFLAGS }, #define ROM_FILL(offset,length,value) { nullptr, (const char *)value, offset, length, ROMENTRYTYPE_FILL }, +#define ROMX_FILL(offset,length,value,flags) { nullptr, (const char *)value, offset, length, ROMENTRYTYPE_FILL | flags }, #define ROM_COPY(srctag,srcoffs,offset,length) { srctag, (const char *)srcoffs, offset, length, ROMENTRYTYPE_COPY }, diff --git a/src/mame/drivers/esh.cpp b/src/mame/drivers/esh.cpp index 72dcb78dfcb..f9ce2dfcbf2 100644 --- a/src/mame/drivers/esh.cpp +++ b/src/mame/drivers/esh.cpp @@ -14,7 +14,8 @@ Notes: Eshb has some junk in the IO TEST screen. Maybe a bad dump? Todo: - - LD TROUBLE message pops up after each cycle in attract. NMI-related? + - LD TROUBLE message pops up after each cycle in attract. NMI-related + - Wrong overlay colors; - Convert to tilemaps (see next ToDo for feasibility). - Apparently some tiles blink (in at least two different ways). - 0xfe and 0xff are pretty obviously not NMI enables. They're likely LED's. Do the NMI right (somehow). @@ -40,27 +41,31 @@ public: esh_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_laserdisc(*this, "laserdisc") , - m_tile_ram(*this, "tile_ram"), - m_tile_control_ram(*this, "tile_ctrl_ram"), - m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_laserdisc(*this, "laserdisc"), + m_screen(*this, "screen"), + m_tile_ram(*this, "tile_ram"), + m_tile_control_ram(*this, "tile_ctrl_ram"), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette") { } required_device m_laserdisc; + required_device m_screen; required_shared_ptr m_tile_ram; required_shared_ptr m_tile_control_ram; - UINT8 m_ld_video_visible; + bool m_ld_video_visible; DECLARE_READ8_MEMBER(ldp_read); DECLARE_WRITE8_MEMBER(ldp_write); DECLARE_WRITE8_MEMBER(misc_write); DECLARE_WRITE8_MEMBER(led_writes); DECLARE_WRITE8_MEMBER(nmi_line_w); DECLARE_DRIVER_INIT(esh); + bool m_nmi_enable; virtual void machine_start() override; DECLARE_PALETTE_INIT(esh); UINT32 screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(vblank_callback_esh); + INTERRUPT_GEN_MEMBER(ld_unk_callback); required_device m_maincpu; required_device m_gfxdecode; required_device m_palette; @@ -78,10 +83,14 @@ protected: UINT32 esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int charx, chary; + const UINT8 pal_bank = m_ld_video_visible == true ? 0x10 : 0x00; + const UINT32 trans_mask = m_ld_video_visible == true ? 0 : -1; + gfx_element *gfx;// = m_gfxdecode->gfx(0); /* clear */ bitmap.fill(0, cliprect); + /* Draw tiles */ for (charx = 0; charx < 32; charx++) { @@ -91,13 +100,20 @@ UINT32 esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, int palIndex = (m_tile_control_ram[current_screen_character] & 0x0f); int tileOffs = (m_tile_control_ram[current_screen_character] & 0x10) >> 4; - //int blinkLine = (m_tile_control_ram[current_screen_character] & 0x40) >> 6; + bool blinkLine = bool((m_tile_control_ram[current_screen_character] & 0x40) >> 6); //int blinkChar = (m_tile_control_ram[current_screen_character] & 0x80) >> 7; - m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, - m_tile_ram[current_screen_character] + (0x100 * tileOffs), - palIndex, - 0, 0, charx*8, chary*8, 0); + // TODO: blink timing + if(blinkLine == true && m_screen->frame_number() & 0x10) + gfx = m_gfxdecode->gfx(1); + else + gfx = m_gfxdecode->gfx(0); + + gfx->transpen(bitmap,cliprect, + m_tile_ram[current_screen_character] + (0x100 * tileOffs), + palIndex + pal_bank, + 0, 0, charx*8, chary*8, trans_mask); + } } @@ -126,7 +142,7 @@ WRITE8_MEMBER(esh_state::misc_write) logerror("BEEP!\n"); /* Bit 2 unknown */ - m_ld_video_visible = !((data & 0x08) >> 3); + m_ld_video_visible = bool(!((data & 0x08) >> 3)); /* Bits 4-7 unknown */ /* They cycle through a repeating pattern though */ @@ -165,13 +181,15 @@ WRITE8_MEMBER(esh_state::led_writes) WRITE8_MEMBER(esh_state::nmi_line_w) { - if (data == 0x00) - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - if (data == 0x01) - m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + // 0 -> 1 transition enables this, else disabled? + m_nmi_enable = (data & 1) == 1; + //if (data == 0x00) + // m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + //if (data == 0x01) + // m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - if (data != 0x00 && data != 0x01) - logerror("NMI line got a weird value!\n"); + if (data & 0xfe) + logerror("NMI line unknown bit set %02x\n",data); } @@ -206,7 +224,7 @@ static INPUT_PORTS_START( esh ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "TEST" ) PORT_CODE( KEYCODE_T ) + PORT_SERVICE( 0x10, IP_ACTIVE_LOW ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -259,25 +277,28 @@ PALETTE_INIT_MEMBER(esh_state, esh) bit0 = (color_prom[i+0x100] >> 0) & 0x01; bit1 = (color_prom[i+0x100] >> 1) & 0x01; bit2 = (color_prom[i+0x100] >> 2) & 0x01; - r = (0x97 * bit2) + (0x47 * bit1) + (0x21 * bit0); + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* green component */ - bit0 = 0; + bit0 = 0; //(color_prom[i+0x100] >> 0) & 0x01; bit1 = (color_prom[i+0x100] >> 3) & 0x01; bit2 = (color_prom[i+0x100] >> 4) & 0x01; - g = (0x97 * bit2) + (0x47 * bit1) + (0x21 * bit0); + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* blue component */ - bit0 = 0; - bit1 = (color_prom[i+0x100] >> 5) & 0x01; - bit2 = (color_prom[i+0x100] >> 6) & 0x01; - b = (0x97 * bit2) + (0x47 * bit1) + (0x21 * bit0); - + if((color_prom[i+0x100] >> 7) & 1) + b = 0xff; + else + { + bit0 = 0; //(color_prom[i+0x100] >> 5) & 0x01; + bit1 = (color_prom[i+0x100] >> 5) & 0x01; + bit2 = (color_prom[i+0x100] >> 6) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + } + palette.set_pen_color(i,rgb_t(r,g,b)); } - /* make color 0 transparent */ - palette.set_pen_color(0, rgb_t(0,0,0,0)); } static const gfx_layout esh_gfx_layout = @@ -285,7 +306,7 @@ static const gfx_layout esh_gfx_layout = 8,8, RGN_FRAC(1,3), 3, - { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, + { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) }, { 0,1,2,3,4,5,6,7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 @@ -293,6 +314,7 @@ static const gfx_layout esh_gfx_layout = static GFXDECODE_START( esh ) GFXDECODE_ENTRY("gfx1", 0, esh_gfx_layout, 0x0, 0x20) + GFXDECODE_ENTRY("gfx2", 0, esh_gfx_layout, 0x0, 0x20) GFXDECODE_END void esh_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -314,6 +336,13 @@ INTERRUPT_GEN_MEMBER(esh_state::vblank_callback_esh) timer_set(attotime::from_usec(50), TIMER_IRQ_STOP); } +// TODO: 0xfe NMI enabled after writing to LD command port, NMI reads LD port. LDV needs command strobe callback? +INTERRUPT_GEN_MEMBER(esh_state::ld_unk_callback) +{ + if(m_nmi_enable) + m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); +} + void esh_state::machine_start() { } @@ -327,7 +356,9 @@ static MACHINE_CONFIG_START( esh, esh_state ) MCFG_CPU_PROGRAM_MAP(z80_0_mem) MCFG_CPU_IO_MAP(z80_0_io) MCFG_CPU_VBLANK_INT_DRIVER("screen", esh_state, vblank_callback_esh) + MCFG_CPU_PERIODIC_INT_DRIVER(esh_state, ld_unk_callback, 90) + MCFG_NVRAM_ADD_0FILL("nvram") @@ -351,6 +382,11 @@ static MACHINE_CONFIG_START( esh, esh_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END +// we just disable even lines so we can simulate line blinking +#define ROM_INTERLACED_GFX \ + ROM_REGION( 0x3000, "gfx2", 0 ) \ + ROM_COPY( "gfx1", 0, 0, 0x3000 ) \ + ROMX_FILL( 0, 0x3000, 0x00, ROM_SKIP(1) ) \ ROM_START( esh ) /* Main program CPU */ @@ -364,6 +400,8 @@ ROM_START( esh ) ROM_LOAD( "b.l3", 0x1000, 0x1000, CRC(9366dde7) SHA1(891db65384d47d13355b2eea37f57c34bc775c8f) ) ROM_LOAD( "c.k3", 0x2000, 0x1000, CRC(a936ef01) SHA1(bcacb281ccb72ceb57fb6a79380cc3a9688743c4) ) + ROM_INTERLACED_GFX + /* Color (+other) PROMs */ ROM_REGION( 0x400, "proms", 0 ) ROM_LOAD( "rgb.j1", 0x000, 0x200, CRC(1e9f795f) SHA1(61a58694929fa39b2412bc9244e5681d65a0eacb) ) @@ -371,7 +409,7 @@ ROM_START( esh ) ROM_LOAD( "v.c6", 0x300, 0x100, CRC(7157ba22) SHA1(07355f30efe46196d216356eda48a59fc622e43f) ) DISK_REGION( "laserdisc" ) - DISK_IMAGE_READONLY( "esh", 0, NO_DUMP ) + DISK_IMAGE_READONLY( "esh_ver2_en", 0, SHA1(c04709d95fd92259f013ec1cd28e3e36a163abe1) ) ROM_END ROM_START( esha ) @@ -386,6 +424,8 @@ ROM_START( esha ) ROM_LOAD( "b.l3", 0x1000, 0x1000, CRC(9366dde7) SHA1(891db65384d47d13355b2eea37f57c34bc775c8f) ) ROM_LOAD( "c.k3", 0x2000, 0x1000, CRC(a936ef01) SHA1(bcacb281ccb72ceb57fb6a79380cc3a9688743c4) ) + ROM_INTERLACED_GFX + /* Color (+other) PROMs */ ROM_REGION( 0x400, "proms", 0 ) ROM_LOAD( "rgb.j1", 0x000, 0x200, CRC(1e9f795f) SHA1(61a58694929fa39b2412bc9244e5681d65a0eacb) ) @@ -408,6 +448,8 @@ ROM_START( eshb ) ROM_LOAD( "b.l3", 0x1000, 0x1000, CRC(9366dde7) SHA1(891db65384d47d13355b2eea37f57c34bc775c8f) ) ROM_LOAD( "c.k3", 0x2000, 0x1000, CRC(a936ef01) SHA1(bcacb281ccb72ceb57fb6a79380cc3a9688743c4) ) + ROM_INTERLACED_GFX + /* Color (+other) PROMs */ ROM_REGION( 0x400, "proms", 0 ) ROM_LOAD( "rgb.j1", 0x000, 0x200, CRC(1e9f795f) SHA1(61a58694929fa39b2412bc9244e5681d65a0eacb) ) @@ -424,6 +466,6 @@ DRIVER_INIT_MEMBER(esh_state,esh) } /* YEAR NAME PARENT MACHINE INPUT INIT MONITOR COMPANY FULLNAME FLAGS */ -GAME( 1983, esh, 0, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 1)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME( 1983, esha, esh, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 2)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME( 1983, eshb, esh, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 3)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME( 1983, esh, 0, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 1)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_COLORS) +GAME( 1983, esha, esh, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 2)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_COLORS) +GAME( 1983, eshb, esh, esh, esh, esh_state, esh, ROT0, "Funai/Gakken", "Esh's Aurunmilla (set 3)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_COLORS) From 800877282cd8647d876cd62e44924190efe377c3 Mon Sep 17 00:00:00 2001 From: RobertoFresca Date: Wed, 15 Jun 2016 02:24:30 -0300 Subject: [PATCH 07/19] Added support for Cyberdyne System's Flaming 7's (custom hardware). Splitted a new machine driver from the W4 hardware version, and decoded the custom graphics. Need proper bipolar PROMs dumps. [Roberto Fresca] New machines marked as NOT_WORKING ---------------------------------- Flaming 7 (Custom Hardware, Main, 50) [Roberto Fresca, Ioannis Bampoulas] Flaming 7 (Custom Hardware, Main, 500) [Roberto Fresca, Ioannis Bampoulas] Flaming 7 (Custom Hardware, Main, 2000) [Roberto Fresca, Ioannis Bampoulas] --- src/mame/drivers/goldstar.cpp | 181 +++++++++++++++++++++++++++++++++- src/mame/mame.lst | 3 + 2 files changed, 180 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp index e9438de3650..2aa81b78222 100644 --- a/src/mame/drivers/goldstar.cpp +++ b/src/mame/drivers/goldstar.cpp @@ -7367,6 +7367,30 @@ static const gfx_layout super9_tilelayout = // Green is OK. Red needs normal go 128*8 /* every char takes 128 consecutive bytes */ }; +static const gfx_layout flaming7_charlayout = +{ + 8,8, /* 8*8 characters */ + 4096, /* 4096 characters */ + 3, /* 3 bits per pixel */ + { 2, 4, 6 }, /* the bitplanes are packed in one byte */ + { 2*8+1, 2*8+0, 3*8+1, 3*8+0, 0*8+1, 0*8+0, 1*8+1, 1*8+0 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 /* every char takes 32 consecutive bytes */ +}; + +static const gfx_layout flaming7_tilelayout = +{ + 8,32, /* 8*32 characters */ + 256, /* 256 tiles */ + 4, /* 4 bits per pixel */ + { 0, 2, 4, 6 }, + { 2*8+0, 2*8+1, 3*8+0, 3*8+1, 0, 1, 1*8+0, 1*8+1 }, + { 0*8, 4*8, 8*8, 12*8, 16*8, 20*8, 24*8, 28*8, + 32*8, 36*8, 40*8, 44*8, 48*8, 52*8, 56*8, 60*8, + 64*8, 68*8, 72*8, 76*8, 80*8, 84*8, 88*8, 92*8, + 96*8, 100*8, 104*8, 108*8, 112*8, 116*8, 120*8, 124*8 }, + 128*8 /* every char takes 128 consecutive bytes */ +}; static GFXDECODE_START( goldstar ) @@ -7472,6 +7496,11 @@ static GFXDECODE_START( super9 ) GFXDECODE_ENTRY( "gfx2", 0, super9_tilelayout, 128, 8 ) GFXDECODE_END +static GFXDECODE_START( flaming7 ) + GFXDECODE_ENTRY( "gfx1", 0, flaming7_charlayout, 0, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, flaming7_tilelayout, 128, 8 ) +GFXDECODE_END + static const gfx_layout tiles8x32_4bpp_layout = { @@ -7638,6 +7667,7 @@ WRITE8_MEMBER(goldstar_state::ay8910_outputb_w) //popmessage("ay8910_outputb_w %02x",data); } + static MACHINE_CONFIG_START( goldstar, goldstar_state ) /* basic machine hardware */ @@ -7796,7 +7826,7 @@ static MACHINE_CONFIG_START( super9, goldstar_state ) MACHINE_CONFIG_END -PALETTE_INIT_MEMBER(goldstar_state,cm) +PALETTE_INIT_MEMBER(goldstar_state, cm) { /* BBGGGRRR */ @@ -7813,7 +7843,7 @@ PALETTE_INIT_MEMBER(goldstar_state,cm) } } -PALETTE_INIT_MEMBER(goldstar_state,cmast91) +PALETTE_INIT_MEMBER(goldstar_state, cmast91) { int i; for (i = 0; i < 0x100; i++) @@ -8186,7 +8216,7 @@ static MACHINE_CONFIG_DERIVED( bingownga, bingowng ) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( flaming7, lucky8 ) +static MACHINE_CONFIG_DERIVED( flam7_w4, lucky8 ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(flaming7_map) @@ -8198,6 +8228,22 @@ static MACHINE_CONFIG_DERIVED( flaming7, lucky8 ) MCFG_DS2401_ADD("fl7w4_id") MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( flaming7, lucky8 ) + /* basic machine hardware */ + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(flaming7_map) + + MCFG_GFXDECODE_MODIFY("gfxdecode", flaming7) +// MCFG_GFXDECODE_MODIFY("gfxdecode", goldstar) + + // to do serial protection & gfxdecode + MCFG_DEVICE_MODIFY("ppi8255_0") + MCFG_I8255_OUT_PORTC_CB(WRITE8(wingco_state, fl7w4_outc802_w)) + + MCFG_DS2401_ADD("fl7w4_id") +MACHINE_CONFIG_END + + PALETTE_INIT_MEMBER(wingco_state, magodds) { @@ -14194,6 +14240,130 @@ ROM_START( fl7_3121 ) // Red, White & Blue 7's + Hollywood Nights. Serial 7D063 ROM_END +/* + Flaming 7's + Cyberdyne Systems. + + Main - 50. + Custom Hardware. + +*/ +ROM_START( fl7_50 ) // Serial 69 A1 C9. + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "50-main.u22", 0x0000, 0x8000, CRC(e097e317) SHA1(a903144cc2290b7e22045490784b592adbf9ba97) ) + +// ROM_REGION( 0x18000, "gfx1", 0 ) +// ROM_LOAD( "5.7h", 0x00000, 0x8000, CRC(e2a2bf3e) SHA1(545ccd46f1fb65573778c3d14e73abb7d5f0ceda) ) +// ROM_LOAD( "6.8h", 0x08000, 0x8000, CRC(46038515) SHA1(630b8fe920b9eded66705c39fbb8f2a49cae05a7) ) +// ROM_LOAD( "7.10h", 0x10000, 0x8000, CRC(56c5c6e0) SHA1(9b64466899df17b5198249c12a2bdcd08383bb07) ) + +// ROM_REGION( 0x8000, "gfx2", 0 ) +// ROM_LOAD( "1.1h", 0x00000, 0x2000, CRC(22e23ce1) SHA1(5d1314cb259f6ab6d25abc8c019a74696d5ebc44) ) +// ROM_LOAD( "2.3h", 0x02000, 0x2000, CRC(d3a097a5) SHA1(7100fb3570fc30aa7df4558a61cd165a67ae916d) ) +// ROM_LOAD( "3.4h", 0x04000, 0x2000, CRC(c3207316) SHA1(3caeb0342aa23e6f3b5f1bf72957dce890ac6bc6) ) +// ROM_LOAD( "4.5h", 0x06000, 0x2000, CRC(8d4a9198) SHA1(44fad32da4b018c1293320dc584e93d17ca71b2b) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "27c1001.u6", 0x00000, 0x20000, CRC(00eac3c1) SHA1(1a955f8bc044e17f0885b4b126a66d7ad191e410) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.u3", 0x00000, 0x8000, CRC(cfc8f3e2) SHA1(7dd72e3ffb0904776f3c07635b953e72f4c63068) ) + + /* Bipolar PROMs from the W4 hardware version */ + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.g13", 0x0000, 0x0100, CRC(3ed8a612) SHA1(4189f1abb0033aeb64b56f63bdbc29d980c43909) ) + ROM_LOAD( "82s129.g14", 0x0100, 0x0100, CRC(aa068a22) SHA1(42c6d77e5aa360c529f8aca6b925010c15eedcd7) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "82s123.d13", 0x0000, 0x0020, CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "82s129.f3", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "82s123.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) + + ROM_REGION(0x8, "fl7w4_id", 0) /* Electronic Serial DS2401 */ + ROM_LOAD( "ds2401.bin", 0x0000, 0x0008, NO_DUMP ) // Hand built to match our ROM set + +ROM_END + + +/* + Flaming 7's + Cyberdyne Systems. + + Main - 500. + Custom Hardware. + +*/ +ROM_START( fl7_500 ) // Serial 69 A1 C9. + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "500-main.u22", 0x0000, 0x8000, CRC(e2c82c67) SHA1(951b0044de9b6104f51aa5a3176d0ea475415f7c) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "27c1001.u6", 0x00000, 0x20000, CRC(00eac3c1) SHA1(1a955f8bc044e17f0885b4b126a66d7ad191e410) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.u3", 0x00000, 0x8000, CRC(4e3bd980) SHA1(202d3135da7ab435f487943079d88b170dc10955) ) + + /* Bipolar PROMs from the W4 hardware version */ + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.g13", 0x0000, 0x0100, CRC(3ed8a612) SHA1(4189f1abb0033aeb64b56f63bdbc29d980c43909) ) + ROM_LOAD( "82s129.g14", 0x0100, 0x0100, CRC(aa068a22) SHA1(42c6d77e5aa360c529f8aca6b925010c15eedcd7) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "82s123.d13", 0x0000, 0x0020, CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "82s129.f3", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "82s123.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) + + ROM_REGION(0x8, "fl7w4_id", 0) /* Electronic Serial DS2401 */ + ROM_LOAD( "ds2401.bin", 0x0000, 0x0008, NO_DUMP ) // Hand built to match our ROM set + +ROM_END + + +/* + Flaming 7's + Cyberdyne Systems. + + Main - 2000. + Custom Hardware. + +*/ +ROM_START( fl7_2000 ) // Serial 69 A1 C9. + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "2000_main_27c256.u22", 0x0000, 0x8000, CRC(9659b045) SHA1(801b6733b70b35de65cd8faba6814fa013c05ad0) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "m27c1001.u6", 0x00000, 0x20000, CRC(5a2157bb) SHA1(2b170102caf1224df7a6d33bb84d19114f453d89) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.u3", 0x00000, 0x8000, CRC(cfc8f3e2) SHA1(7dd72e3ffb0904776f3c07635b953e72f4c63068) ) + + /* Bipolar PROMs from the W4 hardware version */ + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.g13", 0x0000, 0x0100, CRC(3ed8a612) SHA1(4189f1abb0033aeb64b56f63bdbc29d980c43909) ) + ROM_LOAD( "82s129.g14", 0x0100, 0x0100, CRC(aa068a22) SHA1(42c6d77e5aa360c529f8aca6b925010c15eedcd7) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "82s123.d13", 0x0000, 0x0020, CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "82s129.f3", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "82s123.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) + + ROM_REGION(0x8, "fl7w4_id", 0) /* Electronic Serial DS2401 */ + ROM_LOAD( "ds2401.bin", 0x0000, 0x0008, NO_DUMP ) // Hand built to match our ROM set + +ROM_END + /*********************************************************************************************************************/ @@ -14939,7 +15109,10 @@ GAMEL( 1993, bingownga, bingowng, bingownga,bingownga,driver_device, 0, // --- Flaming 7's hardware (W-4 derivative) --- -GAME( 199?, fl7_3121, 0, flaming7, flaming7, driver_device, 0, ROT0, "Cyberdyne Systems", "Flaming 7 (Red, White & Blue 7's + Hollywood Nights)", 0 ) +GAME( 199?, fl7_3121, 0, flam7_w4, flaming7, driver_device, 0, ROT0, "Cyberdyne Systems", "Flaming 7 (W4 Hardware, Red, White & Blue 7's + Hollywood Nights)", 0 ) +GAME( 199?, fl7_50, fl7_3121, flaming7, flaming7, driver_device, 0, ROT0, "Cyberdyne Systems", "Flaming 7 (Custom Hardware, Main, 50)", MACHINE_NOT_WORKING ) +GAME( 199?, fl7_500, fl7_3121, flaming7, flaming7, driver_device, 0, ROT0, "Cyberdyne Systems", "Flaming 7 (Custom Hardware, Main, 500)", MACHINE_NOT_WORKING ) +GAME( 199?, fl7_2000, fl7_3121, flaming7, flaming7, driver_device, 0, ROT0, "Cyberdyne Systems", "Flaming 7 (Custom Hardware, Main, 2000)", MACHINE_NOT_WORKING ) // --- Wing W-8 hardware --- diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 670ed745e1f..b63b884f57e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -13453,6 +13453,9 @@ cmwm // (c) 199? Dyna Electronics crazybon // (c) 199? Sang Ho fb2010 // (c) 2009 Amcoe fl7_3121 // (c) 199? Cyberdyne Systems, Inc. +fl7_50 // (c) 199? Cyberdyne Systems, Inc. +fl7_500 // (c) 199? Cyberdyne Systems, Inc. +fl7_2000 // (c) 199? Cyberdyne Systems, Inc. goldfrui // bootleg goldstar // (c) 198? IGS goldstbl // (c) 198? IGS From 3cb694eb6763e6d9e31ae8d38f6fc57d5e7fa10a Mon Sep 17 00:00:00 2001 From: RobertoFresca Date: Wed, 15 Jun 2016 02:27:36 -0300 Subject: [PATCH 08/19] Flaming 7: Removed leftover... --- src/mame/drivers/goldstar.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp index 2aa81b78222..cbf791186cf 100644 --- a/src/mame/drivers/goldstar.cpp +++ b/src/mame/drivers/goldstar.cpp @@ -8220,7 +8220,6 @@ static MACHINE_CONFIG_DERIVED( flam7_w4, lucky8 ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(flaming7_map) -// MCFG_CPU_IO_MAP(flaming7_readport) MCFG_DEVICE_MODIFY("ppi8255_0") MCFG_I8255_OUT_PORTC_CB(WRITE8(wingco_state, fl7w4_outc802_w)) @@ -8234,9 +8233,8 @@ static MACHINE_CONFIG_DERIVED( flaming7, lucky8 ) MCFG_CPU_PROGRAM_MAP(flaming7_map) MCFG_GFXDECODE_MODIFY("gfxdecode", flaming7) -// MCFG_GFXDECODE_MODIFY("gfxdecode", goldstar) - // to do serial protection & gfxdecode + // to do serial protection. MCFG_DEVICE_MODIFY("ppi8255_0") MCFG_I8255_OUT_PORTC_CB(WRITE8(wingco_state, fl7w4_outc802_w)) From fe22041be85002d01260d4db6a127629f7dea320 Mon Sep 17 00:00:00 2001 From: RobertoFresca Date: Wed, 15 Jun 2016 02:31:29 -0300 Subject: [PATCH 09/19] Flaming 7: Removed more leftover + notes... --- src/mame/drivers/goldstar.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp index cbf791186cf..fa72dac0286 100644 --- a/src/mame/drivers/goldstar.cpp +++ b/src/mame/drivers/goldstar.cpp @@ -14193,6 +14193,8 @@ ROM_END Flaming 7 Cyberdyne Systems, Inc. + W4 hardware. + GFX sets: 1) Red, White & Blue 7's 2) Hollywood Nights. @@ -14250,17 +14252,6 @@ ROM_START( fl7_50 ) // Serial 69 A1 C9. ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "50-main.u22", 0x0000, 0x8000, CRC(e097e317) SHA1(a903144cc2290b7e22045490784b592adbf9ba97) ) -// ROM_REGION( 0x18000, "gfx1", 0 ) -// ROM_LOAD( "5.7h", 0x00000, 0x8000, CRC(e2a2bf3e) SHA1(545ccd46f1fb65573778c3d14e73abb7d5f0ceda) ) -// ROM_LOAD( "6.8h", 0x08000, 0x8000, CRC(46038515) SHA1(630b8fe920b9eded66705c39fbb8f2a49cae05a7) ) -// ROM_LOAD( "7.10h", 0x10000, 0x8000, CRC(56c5c6e0) SHA1(9b64466899df17b5198249c12a2bdcd08383bb07) ) - -// ROM_REGION( 0x8000, "gfx2", 0 ) -// ROM_LOAD( "1.1h", 0x00000, 0x2000, CRC(22e23ce1) SHA1(5d1314cb259f6ab6d25abc8c019a74696d5ebc44) ) -// ROM_LOAD( "2.3h", 0x02000, 0x2000, CRC(d3a097a5) SHA1(7100fb3570fc30aa7df4558a61cd165a67ae916d) ) -// ROM_LOAD( "3.4h", 0x04000, 0x2000, CRC(c3207316) SHA1(3caeb0342aa23e6f3b5f1bf72957dce890ac6bc6) ) -// ROM_LOAD( "4.5h", 0x06000, 0x2000, CRC(8d4a9198) SHA1(44fad32da4b018c1293320dc584e93d17ca71b2b) ) - ROM_REGION( 0x20000, "gfx1", 0 ) ROM_LOAD( "27c1001.u6", 0x00000, 0x20000, CRC(00eac3c1) SHA1(1a955f8bc044e17f0885b4b126a66d7ad191e410) ) From 3316070a98f16e1f84ebf8559388c93dcd7d8a79 Mon Sep 17 00:00:00 2001 From: RobertoFresca Date: Wed, 15 Jun 2016 02:57:25 -0300 Subject: [PATCH 10/19] Flaming 7: Added serial numbers... Waiting for the iButton Lord. ;) --- src/mame/drivers/goldstar.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp index fa72dac0286..49dc2ea0b06 100644 --- a/src/mame/drivers/goldstar.cpp +++ b/src/mame/drivers/goldstar.cpp @@ -14248,7 +14248,7 @@ ROM_END Custom Hardware. */ -ROM_START( fl7_50 ) // Serial 69 A1 C9. +ROM_START( fl7_50 ) // Serial 00000069A1C9. ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "50-main.u22", 0x0000, 0x8000, CRC(e097e317) SHA1(a903144cc2290b7e22045490784b592adbf9ba97) ) @@ -14286,7 +14286,7 @@ ROM_END Custom Hardware. */ -ROM_START( fl7_500 ) // Serial 69 A1 C9. +ROM_START( fl7_500 ) // Serial 000000125873. ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "500-main.u22", 0x0000, 0x8000, CRC(e2c82c67) SHA1(951b0044de9b6104f51aa5a3176d0ea475415f7c) ) @@ -14324,7 +14324,7 @@ ROM_END Custom Hardware. */ -ROM_START( fl7_2000 ) // Serial 69 A1 C9. +ROM_START( fl7_2000 ) // Serial 00000063A47F. ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "2000_main_27c256.u22", 0x0000, 0x8000, CRC(9659b045) SHA1(801b6733b70b35de65cd8faba6814fa013c05ad0) ) From f945016811743c6ebf694fd399d342e1f4144d22 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 15 Jun 2016 10:55:10 +0300 Subject: [PATCH 11/19] pofo: Expansion port slot interface WIP. (nw) --- hash/pofo.xml | 53 +++ scripts/src/bus.lua | 17 + scripts/target/mame/mess.lua | 4 +- src/devices/bus/pofo/exp.cpp | 98 ++++++ src/devices/bus/pofo/exp.h | 165 ++++++++++ src/devices/bus/pofo/hpc101.cpp | 101 ++++++ src/devices/bus/pofo/hpc101.h | 54 ++++ src/devices/bus/pofo/hpc102.cpp | 93 ++++++ src/devices/bus/pofo/hpc102.h | 58 ++++ src/mame/drivers/{portfoli.cpp => pofo.cpp} | 339 +++++++------------- src/mame/includes/portfoli.h | 123 ------- 11 files changed, 764 insertions(+), 341 deletions(-) create mode 100644 hash/pofo.xml create mode 100644 src/devices/bus/pofo/exp.cpp create mode 100644 src/devices/bus/pofo/exp.h create mode 100644 src/devices/bus/pofo/hpc101.cpp create mode 100644 src/devices/bus/pofo/hpc101.h create mode 100644 src/devices/bus/pofo/hpc102.cpp create mode 100644 src/devices/bus/pofo/hpc102.h rename src/mame/drivers/{portfoli.cpp => pofo.cpp} (75%) delete mode 100644 src/mame/includes/portfoli.h diff --git a/hash/pofo.xml b/hash/pofo.xml new file mode 100644 index 00000000000..3255a1aaaba --- /dev/null +++ b/hash/pofo.xml @@ -0,0 +1,53 @@ + + + + + diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 5b6cd19f659..571c75fd48b 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1090,6 +1090,23 @@ if (BUSES["PLUS4"]~=null) then end +--------------------------------------------------- +-- +--@src/devices/bus/pofo/exp.h,BUSES["POFO"] = true +--------------------------------------------------- + +if (BUSES["POFO"]~=null) then + files { + MAME_DIR .. "src/devices/bus/pofo/exp.cpp", + MAME_DIR .. "src/devices/bus/pofo/exp.h", + MAME_DIR .. "src/devices/bus/pofo/hpc101.cpp", + MAME_DIR .. "src/devices/bus/pofo/hpc101.h", + MAME_DIR .. "src/devices/bus/pofo/hpc102.cpp", + MAME_DIR .. "src/devices/bus/pofo/hpc102.h", + } +end + + --------------------------------------------------- -- --@src/devices/bus/s100/s100.h,BUSES["S100"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index bb954c55886..7d1201cbc92 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -655,6 +655,7 @@ BUSES["PC_JOY"] = true BUSES["PC_KBD"] = true BUSES["PET"] = true BUSES["PLUS4"] = true +BUSES["POFO"] = true BUSES["PSX_CONTROLLER"] = true BUSES["QL"] = true BUSES["RS232"] = true @@ -1306,8 +1307,7 @@ files { MAME_DIR .. "src/mame/audio/lynx.cpp", MAME_DIR .. "src/mame/audio/lynx.h", MAME_DIR .. "src/mame/machine/lynx.cpp", - MAME_DIR .. "src/mame/drivers/portfoli.cpp", - MAME_DIR .. "src/mame/includes/portfoli.h", + MAME_DIR .. "src/mame/drivers/pofo.cpp", } createMESSProjects(_target, _subtarget, "att") diff --git a/src/devices/bus/pofo/exp.cpp b/src/devices/bus/pofo/exp.cpp new file mode 100644 index 00000000000..663f1860193 --- /dev/null +++ b/src/devices/bus/pofo/exp.cpp @@ -0,0 +1,98 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio Expansion Port emulation + +**********************************************************************/ + +#include "exp.h" + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type PORTFOLIO_EXPANSION_SLOT = &device_creator; + + + +//************************************************************************** +// CARD INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_portfolio_expansion_slot_interface - constructor +//------------------------------------------------- + +device_portfolio_expansion_slot_interface::device_portfolio_expansion_slot_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig,device) +{ + m_slot = dynamic_cast(device.owner()); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// portfolio_expansion_slot_t - constructor +//------------------------------------------------- + +portfolio_expansion_slot_t::portfolio_expansion_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, PORTFOLIO_EXPANSION_SLOT, "Atari Portfolio expansion port", tag, owner, clock, "portfolio_expansion_slot", __FILE__), + device_slot_interface(mconfig, *this), + m_write_iint(*this), + m_write_eint(*this), + m_write_nmio(*this), + m_write_wake(*this), + m_card(nullptr) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void portfolio_expansion_slot_t::device_start() +{ + m_card = dynamic_cast(get_card_device()); + + // resolve callbacks + m_write_iint.resolve_safe(); + m_write_eint.resolve_safe(); + m_write_nmio.resolve_safe(); + m_write_wake.resolve_safe(); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void portfolio_expansion_slot_t::device_reset() +{ + if (m_card != nullptr) + { + m_card->device().reset(); + } +} + + + +//------------------------------------------------- +// SLOT_INTERFACE( portfolio_expansion_cards ) +//------------------------------------------------- + +// slot devices +#include "hpc101.h" +#include "hpc102.h" + +SLOT_INTERFACE_START( portfolio_expansion_cards ) + SLOT_INTERFACE("lpt", HPC101) + SLOT_INTERFACE("uart", HPC102) +SLOT_INTERFACE_END diff --git a/src/devices/bus/pofo/exp.h b/src/devices/bus/pofo/exp.h new file mode 100644 index 00000000000..129269ed1cb --- /dev/null +++ b/src/devices/bus/pofo/exp.h @@ -0,0 +1,165 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio Expansion Port emulation + +********************************************************************** + + ABUF 1 2 5VS + REDY 3 4 VCC + BCOM 5 6 NCC1 + NMD1 7 8 WAKE + DTR 9 10 DEN + PDET 11 12 IINT + CCLK 13 14 MRST + HLDA 15 16 HLDO + IACK 17 18 CDET + IOM 19 20 A19 + A18 21 22 A17 + A16 23 24 A15 + A14 25 26 A13 + A12 27 28 A11 + A10 29 30 A9 + A8 31 32 VRAM + HLDI 33 34 ALE + GND 35 36 NMIO + OA7 37 38 OA6 + OA5 39 40 OA4 + OA3 41 42 OA2 + OA1 43 44 OA0 + AD0 45 46 AD1 + AD2 47 48 AD3 + AD4 49 50 AD5 + AD6 51 52 AD7 + EINT 53 54 NRDI + VEXT 55 56 EACK + BATD 57 58 NWRI + 5VS 59 60 BBUF + +**********************************************************************/ + +#pragma once + +#ifndef __PORTFOLIO_EXPANSION_SLOT__ +#define __PORTFOLIO_EXPANSION_SLOT__ + +#include "emu.h" + + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +#define PORTFOLIO_EXPANSION_SLOT_TAG "exp" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD(_tag, PORTFOLIO_EXPANSION_SLOT, _clock) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) + +#define MCFG_PORTFOLIO_EXPANSION_SLOT_IINT_CALLBACK(_write) \ + devcb = &portfolio_expansion_slot_t::set_iint_wr_callback(*device, DEVCB_##_write); + +#define MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(_write) \ + devcb = &portfolio_expansion_slot_t::set_eint_wr_callback(*device, DEVCB_##_write); + +#define MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(_write) \ + devcb = &portfolio_expansion_slot_t::set_nmio_wr_callback(*device, DEVCB_##_write); + +#define MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK(_write) \ + devcb = &portfolio_expansion_slot_t::set_wake_wr_callback(*device, DEVCB_##_write); + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> device_portfolio_expansion_slot_interface + +class portfolio_expansion_slot_t; + +class device_portfolio_expansion_slot_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_portfolio_expansion_slot_interface(const machine_config &mconfig, device_t &device); + virtual ~device_portfolio_expansion_slot_interface() { } + + bool nmd1() { return 1; } + bool pdet() { return 0; } + bool cdet() { return 1; } + + UINT8 iack_r() { return 0xff; } + UINT8 eack_r() { return 0xff; } + + UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { return data; }; + void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { }; + +protected: + portfolio_expansion_slot_t *m_slot; +}; + + +// ======================> portfolio_expansion_slot_t + +class portfolio_expansion_slot_t : public device_t, + public device_slot_interface +{ +public: + // construction/destruction + portfolio_expansion_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~portfolio_expansion_slot_t() { } + + template static devcb_base &set_iint_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_iint.set_callback(object); } + template static devcb_base &set_eint_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_eint.set_callback(object); } + template static devcb_base &set_nmio_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_nmio.set_callback(object); } + template static devcb_base &set_wake_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_wake.set_callback(object); } + + // computer interface + bool nmd1_r() { return (m_card != nullptr) ? m_card->nmd1() : 1; } + bool pdet_r() { return (m_card != nullptr) ? m_card->pdet() : 0; } + bool cdet_r() { return (m_card != nullptr) ? m_card->cdet() : 1; } + + UINT8 iack_r() { return (m_card != nullptr) ? m_card->iack_r() : 0xff; }; + UINT8 eack_r() { return (m_card != nullptr) ? m_card->eack_r() : 0xff; }; + + UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { return (m_card != nullptr) ? m_card->nrdi_r(space, offset, data, iom, bcom, ncc1) : data; } + void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { if (m_card != nullptr) m_card->nwri_w(space, offset, data, iom, bcom, ncc1); } + + // peripheral interface + WRITE_LINE_MEMBER( iint_w ) { m_write_iint(state); } + WRITE_LINE_MEMBER( eint_w ) { m_write_eint(state); } + WRITE_LINE_MEMBER( nmio_w ) { m_write_nmio(state); } + WRITE_LINE_MEMBER( wake_w ) { m_write_wake(state); } + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + devcb_write_line m_write_iint; + devcb_write_line m_write_eint; + devcb_write_line m_write_nmio; + devcb_write_line m_write_wake; + + device_portfolio_expansion_slot_interface *m_card; +}; + + +// device type definition +extern const device_type PORTFOLIO_EXPANSION_SLOT; + + +SLOT_INTERFACE_EXTERN( portfolio_expansion_cards ); + + + +#endif diff --git a/src/devices/bus/pofo/hpc101.cpp b/src/devices/bus/pofo/hpc101.cpp new file mode 100644 index 00000000000..8ea93ac4989 --- /dev/null +++ b/src/devices/bus/pofo/hpc101.cpp @@ -0,0 +1,101 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio HPC-101 parallel interface emulation + +**********************************************************************/ + +#include "hpc101.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define LOG 0 + +#define M82C55A_TAG "u1" +#define CENTRONICS_TAG "centronics" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type HPC101 = &device_creator; + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( hpc101 ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( hpc101 ) + MCFG_DEVICE_ADD(M82C55A_TAG, I8255A, 0) + MCFG_I8255_OUT_PORTA_CB(DEVWRITE8("cent_data_out", output_latch_device, write)) + MCFG_I8255_OUT_PORTB_CB(DEVWRITE8("cent_ctrl_out", output_latch_device, write)) + MCFG_I8255_IN_PORTC_CB(DEVREAD8("cent_status_in", input_buffer_device, read)) + + MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer") + MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit5)) + MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit4)) + MCFG_CENTRONICS_FAULT_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit3)) + MCFG_CENTRONICS_SELECT_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit1)) + MCFG_CENTRONICS_PERROR_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit0)) + + MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG) + MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0) + + MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0) + MCFG_OUTPUT_LATCH_BIT0_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_strobe)) + MCFG_OUTPUT_LATCH_BIT1_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_autofd)) + MCFG_OUTPUT_LATCH_BIT2_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_init)) + MCFG_OUTPUT_LATCH_BIT3_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_select_in)) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor hpc101_t::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( hpc101 ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// hpc101_t - constructor +//------------------------------------------------- + +hpc101_t::hpc101_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, HPC101, "Atari Portfolio HPC-101", tag, owner, clock, "hpc101", __FILE__), + device_portfolio_expansion_slot_interface(mconfig, *this), + m_ppi(*this, M82C55A_TAG) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void hpc101_t::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void hpc101_t::device_reset() +{ +} diff --git a/src/devices/bus/pofo/hpc101.h b/src/devices/bus/pofo/hpc101.h new file mode 100644 index 00000000000..dc578e3769b --- /dev/null +++ b/src/devices/bus/pofo/hpc101.h @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio HPC-101 parallel interface emulation + +**********************************************************************/ + +#pragma once + +#ifndef __HPC101__ +#define __HPC101__ + +#include "emu.h" +#include "exp.h" +#include "bus/centronics/ctronics.h" +#include "machine/i8255.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> hpc101_t + +class hpc101_t : public device_t, + public device_portfolio_expansion_slot_interface +{ +public: + // construction/destruction + hpc101_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_portfolio_expansion_slot_interface overrides + +private: + required_device m_ppi; +}; + + +// device type definition +extern const device_type HPC101; + + + +#endif diff --git a/src/devices/bus/pofo/hpc102.cpp b/src/devices/bus/pofo/hpc102.cpp new file mode 100644 index 00000000000..8d40470a2eb --- /dev/null +++ b/src/devices/bus/pofo/hpc102.cpp @@ -0,0 +1,93 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio HPC-102 serial interface emulation + +**********************************************************************/ + +#include "hpc102.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define LOG 0 + +#define M82C50A_TAG "u1" +#define RS232_TAG "rs232" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type HPC102 = &device_creator; + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( hpc102 ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( hpc102 ) + MCFG_DEVICE_ADD(M82C50A_TAG, INS8250, XTAL_1_8432MHz) // should be INS8250A + MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd)) + MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_dtr)) + MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_rts)) + //MCFG_INS8250_OUT_INT_CB(WRITELINE(portfolio_state, i8250_intrpt_w)) + + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, rx_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, dcd_w)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, dsr_w)) + MCFG_RS232_RI_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, ri_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, cts_w)) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor hpc102_t::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( hpc102 ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// hpc102_t - constructor +//------------------------------------------------- + +hpc102_t::hpc102_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, HPC102, "Atari Portfolio HPC-102", tag, owner, clock, "hpc102", __FILE__), + device_portfolio_expansion_slot_interface(mconfig, *this), + m_uart(*this, M82C50A_TAG) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void hpc102_t::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void hpc102_t::device_reset() +{ +} diff --git a/src/devices/bus/pofo/hpc102.h b/src/devices/bus/pofo/hpc102.h new file mode 100644 index 00000000000..0ef1d978e90 --- /dev/null +++ b/src/devices/bus/pofo/hpc102.h @@ -0,0 +1,58 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Atari Portfolio HPC-102 serial interface emulation + +**********************************************************************/ + +#pragma once + +#ifndef __HPC102__ +#define __HPC102__ + +#include "emu.h" +#include "exp.h" +#include "bus/rs232/rs232.h" +#include "machine/ins8250.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> hpc102_t + +class hpc102_t : public device_t, + public device_portfolio_expansion_slot_interface +{ +public: + // construction/destruction + hpc102_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_portfolio_expansion_slot_interface overrides + +private: + required_device m_uart; +}; + + +// device type definition +extern const device_type HPC102; + + + +#endif +/* + + +*/ \ No newline at end of file diff --git a/src/mame/drivers/portfoli.cpp b/src/mame/drivers/pofo.cpp similarity index 75% rename from src/mame/drivers/portfoli.cpp rename to src/mame/drivers/pofo.cpp index ba6d02805d7..4b55589d01e 100644 --- a/src/mame/drivers/portfoli.cpp +++ b/src/mame/drivers/pofo.cpp @@ -9,62 +9,12 @@ http://www.best-electronics-ca.com/portfoli.htm http://www.atari-portfolio.co.uk/pfnews/pf9.txt - - Undumped Atari cartridges: - - Utility-Card HPC-701 - Finance-Card HPC-702 - Science-Card HPC-703 - File Manager / Tutorial HPC-704 - PowerBASIC HPC-705 - Instant Spell HPC-709 - Hyperlist HPC-713 - Bridge Baron HPC-724 - Wine Companion HPC-725 - Diet / Cholesterol Counter HPC-726 - Astrologer HPC-728 - Stock Tracker HPC-729 - Chess HPC-750 - - - Undumped 3rd party cartridges: - - Adcalc AAC-1000 - Alpha Paging Interface SAMpage - Business Contacts and Information Manager BCIM - Checkwriter - Colossal Cave Adventure - Drug Interactions - Dynapulse 200M-A - Form Letters - FORTH programming system UTIL - FX-3 DUAT Flight Software - FX-4 Flight Planner - Graphics Screens - Marine Device Interface CM380 UMPIRE - Message Mover (Mac) MSG-PKG6 - Message Mover (PC) MSG-PKG5 - Micro Hedge - Micro-Roentgen Radiation Monitor RM-60 - Patient Management - PBase - PDD2 Utilities - Pharmaceuticals - Physician's Reference I - PIPELINE Fuel Management - REACT - Stocks Games - Terminal+ - Timekeeper - TIMEPAC-5 - */ /* TODO: - - expansion port slot interface - clock is running too fast - create chargen ROM from tech manual - memory error interrupt vector @@ -73,38 +23,128 @@ - system tick frequency selection (1 or 128 Hz) - speaker - credit card memory (A:/B:) - - software list */ -#include "includes/portfoli.h" -#include "bus/rs232/rs232.h" +#include "emu.h" #include "rendlay.h" #include "softlist.h" +#include "cpu/i86/i86.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" +#include "bus/pofo/exp.h" +#include "machine/nvram.h" +#include "machine/ram.h" +#include "sound/speaker.h" +#include "video/hd61830.h" + +#define M80C88A_TAG "u1" +#define HD61830_TAG "hd61830" +#define TIMER_TICK_TAG "tick" +#define SCREEN_TAG "screen" + +class portfolio_state : public driver_device +{ +public: + portfolio_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, M80C88A_TAG), + m_lcdc(*this, HD61830_TAG), + m_speaker(*this, "speaker"), + m_exp(*this, PORTFOLIO_EXPANSION_SLOT_TAG), + m_timer_tick(*this, TIMER_TICK_TAG), + m_rom(*this, M80C88A_TAG), + m_char_rom(*this, HD61830_TAG), + m_y0(*this, "Y0"), + m_y1(*this, "Y1"), + m_y2(*this, "Y2"), + m_y3(*this, "Y3"), + m_y4(*this, "Y4"), + m_y5(*this, "Y5"), + m_y6(*this, "Y6"), + m_y7(*this, "Y7"), + m_battery(*this, "BATTERY"), + m_contrast(*this, "contrast"), + m_ram(*this, RAM_TAG) + { } + + required_device m_maincpu; + required_device m_lcdc; + required_device m_speaker; + required_device m_exp; + required_device m_timer_tick; + required_region_ptr m_rom; + required_region_ptr m_char_rom; + required_ioport m_y0; + required_ioport m_y1; + required_ioport m_y2; + required_ioport m_y3; + required_ioport m_y4; + required_ioport m_y5; + required_ioport m_y6; + required_ioport m_y7; + required_ioport m_battery; + + virtual void machine_start() override; + virtual void machine_reset() override; + + void check_interrupt(); + void trigger_interrupt(int level); + void scan_keyboard(); + + enum + { + INT_TICK = 0, + INT_KEYBOARD, + INT_ERROR, + INT_EXTERNAL + }; + + DECLARE_READ8_MEMBER( irq_status_r ); + DECLARE_READ8_MEMBER( keyboard_r ); + DECLARE_READ8_MEMBER( battery_r ); + DECLARE_READ8_MEMBER( counter_r ); + + DECLARE_WRITE8_MEMBER( irq_mask_w ); + DECLARE_WRITE8_MEMBER( speaker_w ); + DECLARE_WRITE8_MEMBER( power_w ); + DECLARE_WRITE8_MEMBER( unknown_w ); + DECLARE_WRITE8_MEMBER( counter_w ); + + DECLARE_WRITE_LINE_MEMBER( iint_w ); + DECLARE_WRITE_LINE_MEMBER( eint_w ); + + /* interrupt state */ + UINT8 m_ip; /* interrupt pending */ + UINT8 m_ie; /* interrupt enable */ + UINT8 m_sivr; /* serial interrupt vector register */ + + /* counter state */ + UINT16 m_counter; + + /* keyboard state */ + UINT8 m_keylatch; + + /* video state */ + required_shared_ptr m_contrast; + + /* peripheral state */ + DECLARE_PALETTE_INIT(portfolio); + TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick); + TIMER_DEVICE_CALLBACK_MEMBER(system_tick); + TIMER_DEVICE_CALLBACK_MEMBER(counter_tick); + DECLARE_READ8_MEMBER(hd61830_rd_r); + IRQ_CALLBACK_MEMBER(portfolio_int_ack); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( portfolio_cart ); + required_device m_ram; +}; + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -enum -{ - INT_TICK = 0, - INT_KEYBOARD, - INT_ERROR, - INT_EXTERNAL -}; - -enum -{ - PID_COMMCARD = 0x00, - PID_SERIAL, - PID_PARALLEL, - PID_PRINTER, - PID_MODEM, - PID_NONE = 0xff -}; - static const UINT8 INTERRUPT_VECTOR[] = { 0x08, 0x09, 0x00 }; @@ -161,17 +201,6 @@ WRITE8_MEMBER( portfolio_state::irq_mask_w ) } -//------------------------------------------------- -// sivr_w - serial interrupt vector register -//------------------------------------------------- - -WRITE8_MEMBER( portfolio_state::sivr_w ) -{ - m_sivr = data; - //logerror("SIVR %02x\n", data); -} - - //------------------------------------------------- // IRQ_CALLBACK_MEMBER( portfolio_int_ack ) //------------------------------------------------- @@ -363,7 +392,7 @@ READ8_MEMBER( portfolio_state::battery_r ) UINT8 data = 0; /* peripheral detect */ - data |= (m_pid != PID_NONE) << 5; + data |= m_exp->pdet_r() << 5; /* battery status */ data |= BIT(m_battery->read(), 0) << 6; @@ -450,60 +479,6 @@ WRITE8_MEMBER( portfolio_state::counter_w ) -//************************************************************************** -// EXPANSION -//************************************************************************** - -//------------------------------------------------- -// ncc1_w - credit card memory select -//------------------------------------------------- - -WRITE8_MEMBER( portfolio_state::ncc1_w ) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - if (BIT(data, 0)) - { - // system ROM - program.install_rom(0xc0000, 0xdffff, m_rom); - } - else - { - // credit card memory - program.unmap_readwrite(0xc0000, 0xdffff); - } - - //logerror("NCC %02x\n", data); -} - - -//------------------------------------------------- -// pid_r - peripheral identification -//------------------------------------------------- - -READ8_MEMBER( portfolio_state::pid_r ) -{ - /* - - PID peripheral - - 00 communication card - 01 serial port - 02 parallel port - 03 printer peripheral - 04 modem - 05-3f reserved - 40-7f user peripherals - 80 file-transfer interface - 81-ff reserved - - */ - - return m_pid; -} - - - //************************************************************************** // ADDRESS MAPS //************************************************************************** @@ -535,10 +510,6 @@ static ADDRESS_MAP_START( portfolio_io, AS_IO, 8, portfolio_state ) AM_RANGE(0x8050, 0x8050) AM_READWRITE(irq_status_r, irq_mask_w) AM_RANGE(0x8051, 0x8051) AM_READWRITE(battery_r, unknown_w) AM_RANGE(0x8060, 0x8060) AM_RAM AM_SHARE("contrast") -// AM_RANGE(0x8070, 0x8077) AM_DEVREADWRITE(M82C50A_TAG, ins8250_device, ins8250_r, ins8250_w) // Serial Interface -// AM_RANGE(0x8078, 0x807b) AM_DEVREADWRITE(M82C55A_TAG, i8255_device, read, write) // Parallel Interface - AM_RANGE(0x807c, 0x807c) AM_WRITE(ncc1_w) - AM_RANGE(0x807f, 0x807f) AM_READWRITE(pid_r, sivr_w) ADDRESS_MAP_END @@ -636,12 +607,6 @@ static INPUT_PORTS_START( portfolio ) PORT_CONFNAME( 0x01, 0x01, "Battery Status" ) PORT_CONFSETTING( 0x01, DEF_STR( Normal ) ) PORT_CONFSETTING( 0x00, "Low Battery" ) - - PORT_START("PERIPHERAL") - PORT_CONFNAME( 0xff, PID_NONE, "Peripheral" ) - PORT_CONFSETTING( PID_NONE, DEF_STR( None ) ) - PORT_CONFSETTING( PID_PARALLEL, "Intelligent Parallel Interface (HPC-101)" ) - PORT_CONFSETTING( PID_SERIAL, "Serial Interface (HPC-102)" ) INPUT_PORTS_END @@ -700,11 +665,11 @@ GFXDECODE_END // DEVICE CONFIGURATION //************************************************************************** -//------------------------------------------------- -// ins8250_interface i8250_intf -//------------------------------------------------- +WRITE_LINE_MEMBER( portfolio_state::iint_w ) +{ +} -WRITE_LINE_MEMBER( portfolio_state::i8250_intrpt_w ) +WRITE_LINE_MEMBER( portfolio_state::eint_w ) { if (state) trigger_interrupt(INT_EXTERNAL); @@ -752,7 +717,6 @@ void portfolio_state::machine_start() /* set initial values */ m_keylatch = 0xff; m_sivr = 0x2a; - m_pid = 0xff; /* register for state saving */ save_item(NAME(m_ip)); @@ -761,7 +725,6 @@ void portfolio_state::machine_start() save_item(NAME(m_counter)); save_item(NAME(m_keylatch)); save_pointer(NAME(m_contrast.target()), m_contrast.bytes()); - save_item(NAME(m_pid)); } @@ -771,24 +734,6 @@ void portfolio_state::machine_start() void portfolio_state::machine_reset() { - address_space &io = m_maincpu->space(AS_IO); - - // peripherals - m_pid = ioport("PERIPHERAL")->read(); - - io.unmap_readwrite(0x8070, 0x807b); - io.unmap_readwrite(0x807d, 0x807e); - - switch (m_pid) - { - case PID_SERIAL: - io.install_readwrite_handler(0x8070, 0x8077, READ8_DEVICE_DELEGATE(m_uart, ins8250_device, ins8250_r), WRITE8_DEVICE_DELEGATE(m_uart, ins8250_device, ins8250_w)); - break; - - case PID_PARALLEL: - io.install_readwrite_handler(0x8078, 0x807b, READ8_DEVICE_DELEGATE(m_ppi, i8255_device, read), WRITE8_DEVICE_DELEGATE(m_ppi, i8255_device, write)); - break; - } } @@ -832,43 +777,16 @@ static MACHINE_CONFIG_START( portfolio, portfolio_state ) MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) - /* devices */ - MCFG_DEVICE_ADD(M82C55A_TAG, I8255A, 0) - MCFG_I8255_OUT_PORTA_CB(DEVWRITE8("cent_data_out", output_latch_device, write)) - MCFG_I8255_OUT_PORTB_CB(DEVWRITE8("cent_ctrl_out", output_latch_device, write)) - MCFG_I8255_IN_PORTC_CB(DEVREAD8("cent_status_in", input_buffer_device, read)) + // devices + MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(PORTFOLIO_EXPANSION_SLOT_TAG, XTAL_4_9152MHz, portfolio_expansion_cards, nullptr) + MCFG_PORTFOLIO_EXPANSION_SLOT_IINT_CALLBACK(WRITELINE(portfolio_state, iint_w)) + MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(WRITELINE(portfolio_state, eint_w)) + MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(INPUTLINE(M80C88A_TAG, INPUT_LINE_NMI)) + //MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK() - MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit5)) - MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit4)) - MCFG_CENTRONICS_FAULT_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit3)) - MCFG_CENTRONICS_SELECT_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit1)) - MCFG_CENTRONICS_PERROR_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit0)) - - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG) - MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0) - - MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0) - MCFG_OUTPUT_LATCH_BIT0_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_strobe)) - MCFG_OUTPUT_LATCH_BIT1_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_autofd)) - MCFG_OUTPUT_LATCH_BIT2_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_init)) - MCFG_OUTPUT_LATCH_BIT3_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_select_in)) - - MCFG_DEVICE_ADD(M82C50A_TAG, INS8250, XTAL_1_8432MHz) // should be INS8250A - MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd)) - MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_dtr)) - MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_rts)) - MCFG_INS8250_OUT_INT_CB(WRITELINE(portfolio_state, i8250_intrpt_w)) MCFG_TIMER_DRIVER_ADD_PERIODIC("counter", portfolio_state, counter_tick, attotime::from_hz(XTAL_32_768kHz/16384)) MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_TICK_TAG, portfolio_state, system_tick, attotime::from_hz(XTAL_32_768kHz/32768)) - MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, rx_w)) - MCFG_RS232_DCD_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, dcd_w)) - MCFG_RS232_DSR_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, dsr_w)) - MCFG_RS232_RI_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, ri_w)) - MCFG_RS232_CTS_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, cts_w)) - /* fake keyboard */ MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", portfolio_state, keyboard_tick, attotime::from_usec(2500)) @@ -876,19 +794,8 @@ static MACHINE_CONFIG_START( portfolio, portfolio_state ) MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "portfolio_cart") MCFG_GENERIC_LOAD(portfolio_state, portfolio_cart) - /* memory card */ -/* MCFG_MEMCARD_ADD("memcard_a") - MCFG_MEMCARD_EXTENSION_LIST("bin") - MCFG_MEMCARD_LOAD(portfolio_memcard) - MCFG_MEMCARD_SIZE_OPTIONS("32K,64K,128K") - - MCFG_MEMCARD_ADD("memcard_b") - MCFG_MEMCARD_EXTENSION_LIST("bin") - MCFG_MEMCARD_LOAD(portfolio_memcard) - MCFG_MEMCARD_SIZE_OPTIONS("32K,64K,128K")*/ - /* software lists */ -// MCFG_SOFTWARE_LIST_ADD("cart_list", "pofo") + MCFG_SOFTWARE_LIST_ADD("cart_list", "pofo") /* internal ram */ MCFG_RAM_ADD(RAM_TAG) diff --git a/src/mame/includes/portfoli.h b/src/mame/includes/portfoli.h deleted file mode 100644 index 7070f734e42..00000000000 --- a/src/mame/includes/portfoli.h +++ /dev/null @@ -1,123 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Curt Coder -#pragma once - -#ifndef __PORTFOLIO__ -#define __PORTFOLIO__ - -#include "emu.h" -#include "cpu/i86/i86.h" -#include "bus/centronics/ctronics.h" -#include "machine/i8255.h" -#include "machine/ins8250.h" -#include "machine/nvram.h" -#include "machine/ram.h" -#include "sound/speaker.h" -#include "video/hd61830.h" - -#include "bus/generic/slot.h" -#include "bus/generic/carts.h" - -#define M80C88A_TAG "u1" -#define M82C55A_TAG "hpc101_u1" -#define M82C50A_TAG "hpc102_u1" -#define HD61830_TAG "hd61830" -#define CENTRONICS_TAG "centronics" -#define TIMER_TICK_TAG "tick" -#define SCREEN_TAG "screen" -#define RS232_TAG "rs232" - -class portfolio_state : public driver_device -{ -public: - portfolio_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, M80C88A_TAG), - m_lcdc(*this, HD61830_TAG), - m_ppi(*this, M82C55A_TAG), - m_uart(*this, M82C50A_TAG), - m_speaker(*this, "speaker"), - m_timer_tick(*this, TIMER_TICK_TAG), - m_rom(*this, M80C88A_TAG), - m_char_rom(*this, HD61830_TAG), - m_y0(*this, "Y0"), - m_y1(*this, "Y1"), - m_y2(*this, "Y2"), - m_y3(*this, "Y3"), - m_y4(*this, "Y4"), - m_y5(*this, "Y5"), - m_y6(*this, "Y6"), - m_y7(*this, "Y7"), - m_battery(*this, "BATTERY"), - m_contrast(*this, "contrast"), - m_ram(*this, RAM_TAG) - { } - - required_device m_maincpu; - required_device m_lcdc; - required_device m_ppi; - required_device m_uart; - required_device m_speaker; - required_device m_timer_tick; - required_region_ptr m_rom; - required_region_ptr m_char_rom; - required_ioport m_y0; - required_ioport m_y1; - required_ioport m_y2; - required_ioport m_y3; - required_ioport m_y4; - required_ioport m_y5; - required_ioport m_y6; - required_ioport m_y7; - required_ioport m_battery; - - virtual void machine_start() override; - virtual void machine_reset() override; - - void check_interrupt(); - void trigger_interrupt(int level); - void scan_keyboard(); - - DECLARE_READ8_MEMBER( irq_status_r ); - DECLARE_READ8_MEMBER( keyboard_r ); - DECLARE_READ8_MEMBER( battery_r ); - DECLARE_READ8_MEMBER( counter_r ); - DECLARE_READ8_MEMBER( pid_r ); - - DECLARE_WRITE8_MEMBER( irq_mask_w ); - DECLARE_WRITE8_MEMBER( sivr_w ); - DECLARE_WRITE8_MEMBER( speaker_w ); - DECLARE_WRITE8_MEMBER( power_w ); - DECLARE_WRITE8_MEMBER( unknown_w ); - DECLARE_WRITE8_MEMBER( counter_w ); - DECLARE_WRITE8_MEMBER( ncc1_w ); - - DECLARE_WRITE_LINE_MEMBER( i8250_intrpt_w ); - - /* interrupt state */ - UINT8 m_ip; /* interrupt pending */ - UINT8 m_ie; /* interrupt enable */ - UINT8 m_sivr; /* serial interrupt vector register */ - - /* counter state */ - UINT16 m_counter; - - /* keyboard state */ - UINT8 m_keylatch; - - /* video state */ - required_shared_ptr m_contrast; - - /* peripheral state */ - UINT8 m_pid; /* peripheral identification */ - DECLARE_PALETTE_INIT(portfolio); - TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick); - TIMER_DEVICE_CALLBACK_MEMBER(system_tick); - TIMER_DEVICE_CALLBACK_MEMBER(counter_tick); - DECLARE_READ8_MEMBER(hd61830_rd_r); - IRQ_CALLBACK_MEMBER(portfolio_int_ack); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER( portfolio_cart ); - required_device m_ram; -}; - -#endif From 241c32eae44675677eef6e121f66878cf5144842 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 15 Jun 2016 18:29:26 +1000 Subject: [PATCH 12/19] clean up (nw) --- src/mame/machine/atarixga.cpp | 329 +++++++++++++++++----------------- 1 file changed, 160 insertions(+), 169 deletions(-) diff --git a/src/mame/machine/atarixga.cpp b/src/mame/machine/atarixga.cpp index f2a03af5073..7680a09005a 100644 --- a/src/mame/machine/atarixga.cpp +++ b/src/mame/machine/atarixga.cpp @@ -3,7 +3,7 @@ /************************************************************************* atarixga.cpp - + Atari XGA encryption FPGA ************************************************************************** @@ -15,7 +15,7 @@ ? Road Riot's Revenge 136094-0004A Primal Rage ? T-Mek - + *************************************************************************/ #include "emu.h" @@ -26,9 +26,9 @@ extern const device_type ATARI_XGA = &device_creator; atari_xga_device::atari_xga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, ATARI_XGA, "Atari XGA", tag, owner, clock, "xga", __FILE__), - m_mode(FPGA_RESET), - m_address(0), - m_ciphertext(0) + m_mode(FPGA_RESET), + m_address(0), + m_ciphertext(0) { } @@ -42,19 +42,19 @@ atari_xga_device::atari_xga_device(const machine_config &mconfig, const char *ta void atari_xga_device::device_start() { - m_ram = std::make_unique(RAM_WORDS); - - save_pointer(NAME(m_ram.get()), RAM_WORDS * sizeof(UINT16)); - save_item(NAME(m_address)); - save_item(NAME(m_ciphertext)); + m_ram = std::make_unique(RAM_WORDS); + + save_pointer(NAME(m_ram.get()), RAM_WORDS * sizeof(UINT16)); + save_item(NAME(m_address)); + save_item(NAME(m_ciphertext)); } void atari_xga_device::device_reset() { - memset(m_ram.get(), 0, RAM_WORDS * sizeof(UINT16)); - m_mode = FPGA_RESET; - m_address = 0; - m_ciphertext = 0; + memset(m_ram.get(), 0, RAM_WORDS * sizeof(UINT16)); + m_mode = FPGA_RESET; + m_address = 0; + m_ciphertext = 0; } @@ -71,22 +71,22 @@ void atari_xga_device::device_reset() /* key 0x10 is special, it has 15 "identical twins". */ static const UINT8 kmap[128] = { - 0x6B,0x11,0x1B,0x19,0x4B,0x50,0x17,0x09, - 0x5D,0x69,0x43,0x33,0x0F,0x0C,0x28,0x3F, - 0x00,0x20,0x15,0x3C,0x57,0x38,0x00,0x07, - 0x49,0x25,0x61,0x2F,0x2B,0x4E,0x64,0x00, - 0x45,0x41,0x6D,0x52,0x31,0x66,0x22,0x59, - 0x00,0x70,0x6F,0x5B,0x46,0x6E,0x67,0x5A, - 0x26,0x30,0x2C,0x65,0x21,0x3D,0x58,0x00, - 0x5E,0x44,0x0D,0x40,0x6C,0x1C,0x51,0x0A, - 0x35,0x2A,0x13,0x4D,0x63,0x00,0x00,0x3A, - 0x00,0x48,0x54,0x24,0x60,0x1E,0x2E,0x01, - 0x56,0x03,0x37,0x00,0x04,0x00,0x05,0x06, - 0x00,0x55,0x1F,0x02,0x36,0x14,0x00,0x3B, - 0x5F,0x0E,0x1D,0x0B,0x27,0x2D,0x3E,0x00, - 0x00,0x5C,0x47,0x68,0x42,0x53,0x32,0x23, - 0x4A,0x62,0x4F,0x00,0x00,0x16,0x39,0x08, - 0x6A,0x34,0x10,0x29,0x12,0x1A,0x4C,0x18 + 0x6B,0x11,0x1B,0x19,0x4B,0x50,0x17,0x09, + 0x5D,0x69,0x43,0x33,0x0F,0x0C,0x28,0x3F, + 0x00,0x20,0x15,0x3C,0x57,0x38,0x00,0x07, + 0x49,0x25,0x61,0x2F,0x2B,0x4E,0x64,0x00, + 0x45,0x41,0x6D,0x52,0x31,0x66,0x22,0x59, + 0x00,0x70,0x6F,0x5B,0x46,0x6E,0x67,0x5A, + 0x26,0x30,0x2C,0x65,0x21,0x3D,0x58,0x00, + 0x5E,0x44,0x0D,0x40,0x6C,0x1C,0x51,0x0A, + 0x35,0x2A,0x13,0x4D,0x63,0x00,0x00,0x3A, + 0x00,0x48,0x54,0x24,0x60,0x1E,0x2E,0x01, + 0x56,0x03,0x37,0x00,0x04,0x00,0x05,0x06, + 0x00,0x55,0x1F,0x02,0x36,0x14,0x00,0x3B, + 0x5F,0x0E,0x1D,0x0B,0x27,0x2D,0x3E,0x00, + 0x00,0x5C,0x47,0x68,0x42,0x53,0x32,0x23, + 0x4A,0x62,0x4F,0x00,0x00,0x16,0x39,0x08, + 0x6A,0x34,0x10,0x29,0x12,0x1A,0x4C,0x18 }; @@ -99,106 +99,101 @@ static const UINT8 kmap[128] = UINT16 atari_xga_device::ctz(UINT16 x) { - UINT16 n = 0; - if (x == 0) return 16; - if (!(x & 0x00FF)) n += 8, x >>= 8; - if (!(x & 0x000F)) n += 4, x >>= 4; - if (!(x & 0x0003)) n += 2, x >>= 2; - if (!(x & 0x0001)) n += 1, x >>= 1; - return n; + UINT16 n = 0; + if (x == 0) return 16; + if (!(x & 0x00FF)) n += 8, x >>= 8; + if (!(x & 0x000F)) n += 4, x >>= 4; + if (!(x & 0x0003)) n += 2, x >>= 2; + if (!(x & 0x0001)) n += 1, x >>= 1; + return n; } size_t atari_xga_device::popcount(UINT16 x) { - size_t count = 0; - while (x != 0) - { - count += 1; - x &= x - 1; - } - return count; + size_t count = 0; + while (x != 0) + { + count += 1; + x &= x - 1; + } + return count; } UINT16 atari_xga_device::parity(UINT16 x) { - return popcount(x) & 1; + return popcount(x) & 1; } UINT16 atari_xga_device::lfsr1(UINT16 x) { - UINT16 bit = parity(x & 0x8016); - return (x << 1) | bit; + const UINT16 bit = parity(x & 0x8016); + return (x << 1) | bit; } UINT16 atari_xga_device::lfsr2(UINT16 x) { - UINT16 bit = parity(x & 0x002D); - return (x >> 1) | (bit << 15); + UINT16 bit = parity(x & 0x002D); + return (x >> 1) | (bit << 15); } UINT16 atari_xga_device::powers2(UINT8 k, UINT16 x) { - static const UINT16 L[16] = - { - 0x5E85,0xBD0B,0x2493,0x17A3, - 0x2F47,0x0005,0x000B,0x0017, - 0x002F,0x005E,0x00BD,0x017A, - 0x02F4,0x05E8,0x0BD0,0x17A1 - }; + static const UINT16 L[16] = { + 0x5E85,0xBD0B,0x2493,0x17A3, + 0x2F47,0x0005,0x000B,0x0017, + 0x002F,0x005E,0x00BD,0x017A, + 0x02F4,0x05E8,0x0BD0,0x17A1 + }; - UINT16 t = (x == 16) ? (L[4] ^ L[5]) : L[x]; + UINT16 t = (x == 16) ? (L[4] ^ L[5]) : L[x]; - for (size_t i = 0; i < k; ++i) - { - t = lfsr1(t); - } - - return t; + for (size_t i = 0; i < k; ++i) + t = lfsr1(t); + + return t; } UINT16 atari_xga_device::decipher(UINT8 k, UINT16 c) { - UINT16 bit, i, p = 0; + UINT16 p = 0; - /* Only 128 keys internally, if high bit set, - then find the 7-bit "twin" by xor 0xA8. */ - if (k & 0x80) - k ^= 0xA8; + /* Only 128 keys internally, if high bit set, + then find the 7-bit "twin" by xor 0xA8. */ + if (k & 0x80) + k ^= 0xA8; - k = kmap[k]; + k = kmap[k]; - if ((c & (c - 1)) == 0) - { - return powers2(k, ctz(c)); - } + if ((c & (c - 1)) == 0) + return powers2(k, ctz(c)); - for (bit = 0; bit < 5; ++bit) - { - if ((c >> bit) & 1) - { - p ^= powers2(k, bit); - } - } + for (UINT16 bit = 0; bit < 5; ++bit) + { + if ((c >> bit) & 1) + { + p ^= powers2(k, bit); + } + } - for (bit = 5; bit < 16; ++bit) - { - if ((c >> bit) & 1) - { - p ^= powers2(k, bit + 1); - } - } + for (UINT16 bit = 5; bit < 16; ++bit) + { + if ((c >> bit) & 1) + { + p ^= powers2(k, bit + 1); + } + } - UINT16 x = 0x8010; - for (i = 0; i < k + 3; ++i) - { - if (x == c) - { - return (p == 1) ? 0 : lfsr2(p); - } - x = lfsr2(x); - } + UINT16 x = 0x8010; + for (UINT16 i = 0; i < k + 3; ++i) + { + if (x == c) + { + return (p == 1) ? 0 : lfsr2(p); + } + x = lfsr2(x); + } - return p; + return p; } @@ -211,90 +206,86 @@ UINT16 atari_xga_device::decipher(UINT8 k, UINT16 c) WRITE32_MEMBER(atari_xga_device::write) { - switch (m_mode) - { - case FPGA_RESET: - return; + switch (m_mode) + { + case FPGA_RESET: + return; - case FPGA_SETKEY: - /* Write table to FPGA SRAM. */ - if (ACCESSING_BITS_16_31) - m_ram[offset << 1] = UINT16 (data >> 16); - if (ACCESSING_BITS_0_15) - m_ram[(offset << 1) + 1] = UINT16(data & 0xFFFF); - - break; + case FPGA_SETKEY: + /* Write table to FPGA SRAM. */ + if (ACCESSING_BITS_16_31) + m_ram[offset << 1] = UINT16 (data >> 16); + if (ACCESSING_BITS_0_15) + m_ram[(offset << 1) + 1] = UINT16(data & 0xFFFF); + break; - case FPGA_DECIPHER: - /* Send Ciphertext to FPGA for decryption. */ - if (ACCESSING_BITS_16_31) - { - m_address = offset << 2; - m_ciphertext = UINT16(data >> 16); - } - if (ACCESSING_BITS_0_15) - { - m_address = (offset << 2) + 2; - m_ciphertext = UINT16(data & 0xFFFF); - } - break; - } + case FPGA_DECIPHER: + /* Send Ciphertext to FPGA for decryption. */ + if (ACCESSING_BITS_16_31) + { + m_address = offset << 2; + m_ciphertext = UINT16(data >> 16); + } + if (ACCESSING_BITS_0_15) + { + m_address = (offset << 2) + 2; + m_ciphertext = UINT16(data & 0xFFFF); + } + break; + } } READ32_MEMBER(atari_xga_device::read) { - UINT32 plaintext = 0; + switch (offset << 2) + { + case 0x0FC0: + m_mode = FPGA_RESET; + break; + case 0x0010: + m_mode = FPGA_SETKEY; + break; + case 0x0020: + m_mode = FPGA_DECIPHER; + break; + } - switch (offset << 2) - { - case 0x0FC0: - m_mode = FPGA_RESET; - break; - case 0x0010: - m_mode = FPGA_SETKEY; - break; - case 0x0020: - m_mode = FPGA_DECIPHER; - break; - } + if (m_mode == FPGA_RESET) + return 0; - if (m_mode == FPGA_RESET) - { - return 0; - } + UINT32 plaintext = 0; + if (m_mode == FPGA_DECIPHER) + { + UINT16 address = (offset << 2) - 0x400; - if (m_mode == FPGA_DECIPHER) - { - UINT16 address = (offset << 2) - 0x400; + if (ACCESSING_BITS_0_15) + address += 2; - if (ACCESSING_BITS_0_15) - address += 2; + /* Reply with decrypted plaintext */ + if (address == m_address) + { + UINT16 key_offset, key_byte; - /* Reply with decrypted plaintext */ - if (address == m_address) - { - UINT16 key_offset, key_byte; + /* Algorithm to select key byte based on offset. */ + key_offset = ((((address >> 4) & 1) ^ 1) << 0) + ^ ((((address >> 2) & 1) ^ 0) << 1) + ^ ((((address >> 8) & 1) ^ 0) << 2) + ^ ((((address >> 3) & 1) ^ 1) << 3) + ^ ((((address >> 1) & 1) ^ 1) << 4) + ^ ((((address >> 6) & 1) ^ 0) << 5) + ^ ((((address >> 7) & 1) ^ 0) << 6) + ^ ((((address >> 5) & 1) ^ 1) << 7) + ^ ((((address >> 9) & 1) ^ 0) << 8) + ^ ((((address >> 10) & 1) ^ 0) << 9); + key_byte = m_ram[key_offset]; - /* Algorithm to select key byte based on offset. */ - key_offset = ((((address >> 4) & 1) ^ 1) << 0) - ^ ((((address >> 2) & 1) ^ 0) << 1) - ^ ((((address >> 8) & 1) ^ 0) << 2) - ^ ((((address >> 3) & 1) ^ 1) << 3) - ^ ((((address >> 1) & 1) ^ 1) << 4) - ^ ((((address >> 6) & 1) ^ 0) << 5) - ^ ((((address >> 7) & 1) ^ 0) << 6) - ^ ((((address >> 5) & 1) ^ 1) << 7) - ^ ((((address >> 9) & 1) ^ 0) << 8) - ^ ((((address >> 10) & 1) ^ 0) << 9); - key_byte = m_ram[key_offset]; + /* And now for the full magic. */ + plaintext = decipher(key_byte, m_ciphertext); - /* And now for the full magic. */ - plaintext = decipher(key_byte, m_ciphertext); + if (ACCESSING_BITS_16_31) + plaintext <<= 16; + } + } - if (ACCESSING_BITS_16_31) - plaintext <<= 16; - } - } - - return plaintext; + return plaintext; } From 666c5237004e7ca25ed24a528943b83d90ce354e Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 15 Jun 2016 12:05:56 +0300 Subject: [PATCH 13/19] pofo: Expansion port slot interface WIP. (nw) --- src/devices/bus/pofo/exp.cpp | 5 +++ src/devices/bus/pofo/exp.h | 19 +++++++---- src/devices/bus/pofo/hpc101.cpp | 40 +++++++++++++++++++++++ src/devices/bus/pofo/hpc101.h | 4 +++ src/devices/bus/pofo/hpc102.cpp | 57 ++++++++++++++++++++++++++++++++- src/devices/bus/pofo/hpc102.h | 8 +++++ src/mame/drivers/pofo.cpp | 7 ++-- 7 files changed, 127 insertions(+), 13 deletions(-) diff --git a/src/devices/bus/pofo/exp.cpp b/src/devices/bus/pofo/exp.cpp index 663f1860193..98b411990bf 100644 --- a/src/devices/bus/pofo/exp.cpp +++ b/src/devices/bus/pofo/exp.cpp @@ -32,6 +32,11 @@ device_portfolio_expansion_slot_interface::device_portfolio_expansion_slot_inter m_slot = dynamic_cast(device.owner()); } +WRITE_LINE_MEMBER( device_portfolio_expansion_slot_interface::iint_w ) { m_slot->iint_w(state); } +WRITE_LINE_MEMBER( device_portfolio_expansion_slot_interface::eint_w ) { m_slot->eint_w(state); } +WRITE_LINE_MEMBER( device_portfolio_expansion_slot_interface::nmio_w ) { m_slot->nmio_w(state); } +WRITE_LINE_MEMBER( device_portfolio_expansion_slot_interface::wake_w ) { m_slot->wake_w(state); } + //************************************************************************** diff --git a/src/devices/bus/pofo/exp.h b/src/devices/bus/pofo/exp.h index 129269ed1cb..3b1e936dca5 100644 --- a/src/devices/bus/pofo/exp.h +++ b/src/devices/bus/pofo/exp.h @@ -93,15 +93,20 @@ public: device_portfolio_expansion_slot_interface(const machine_config &mconfig, device_t &device); virtual ~device_portfolio_expansion_slot_interface() { } - bool nmd1() { return 1; } - bool pdet() { return 0; } - bool cdet() { return 1; } + virtual bool nmd1() { return 1; } + virtual bool pdet() { return 0; } + virtual bool cdet() { return 1; } - UINT8 iack_r() { return 0xff; } - UINT8 eack_r() { return 0xff; } + virtual UINT8 iack_r() { return 0xff; } + virtual UINT8 eack_r() { return 0xff; } - UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { return data; }; - void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { }; + virtual UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { return data; }; + virtual void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) { }; + + DECLARE_WRITE_LINE_MEMBER( iint_w ); + DECLARE_WRITE_LINE_MEMBER( eint_w ); + DECLARE_WRITE_LINE_MEMBER( nmio_w ); + DECLARE_WRITE_LINE_MEMBER( wake_w ); protected: portfolio_expansion_slot_t *m_slot; diff --git a/src/devices/bus/pofo/hpc101.cpp b/src/devices/bus/pofo/hpc101.cpp index 8ea93ac4989..b3286d2b0ef 100644 --- a/src/devices/bus/pofo/hpc101.cpp +++ b/src/devices/bus/pofo/hpc101.cpp @@ -98,4 +98,44 @@ void hpc101_t::device_start() void hpc101_t::device_reset() { + m_ppi->reset(); +} + + +//------------------------------------------------- +// nrdi_r - read +//------------------------------------------------- + +UINT8 hpc101_t::nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) +{ + if (!bcom) + { + if ((offset & 0x0f) == 0x0f) + { + data = 0x02; + } + + if ((offset & 0x0c) == 0x08) + { + data = m_ppi->read(space, offset & 0x03); + } + } + + return data; +} + + +//------------------------------------------------- +// nwri_w - write +//------------------------------------------------- + +void hpc101_t::nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) +{ + if (!bcom) + { + if ((offset & 0x0c) == 0x08) + { + m_ppi->write(space, offset & 0x03, data); + } + } } diff --git a/src/devices/bus/pofo/hpc101.h b/src/devices/bus/pofo/hpc101.h index dc578e3769b..36b4129049b 100644 --- a/src/devices/bus/pofo/hpc101.h +++ b/src/devices/bus/pofo/hpc101.h @@ -40,6 +40,10 @@ protected: virtual void device_reset() override; // device_portfolio_expansion_slot_interface overrides + bool pdet() override { return 1; } + + virtual UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) override; + virtual void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) override; private: required_device m_ppi; diff --git a/src/devices/bus/pofo/hpc102.cpp b/src/devices/bus/pofo/hpc102.cpp index 8d40470a2eb..4ad13bd2308 100644 --- a/src/devices/bus/pofo/hpc102.cpp +++ b/src/devices/bus/pofo/hpc102.cpp @@ -37,7 +37,7 @@ static MACHINE_CONFIG_FRAGMENT( hpc102 ) MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd)) MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_dtr)) MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_rts)) - //MCFG_INS8250_OUT_INT_CB(WRITELINE(portfolio_state, i8250_intrpt_w)) + MCFG_INS8250_OUT_INT_CB(WRITELINE(device_portfolio_expansion_slot_interface, eint_w)) MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(M82C50A_TAG, ins8250_uart_device, rx_w)) @@ -90,4 +90,59 @@ void hpc102_t::device_start() void hpc102_t::device_reset() { + m_uart->reset(); +} + + +//------------------------------------------------- +// eack_r - external interrupt acknowledge +//------------------------------------------------- + +UINT8 hpc102_t::eack_r() +{ + return m_vector; +} + + +//------------------------------------------------- +// nrdi_r - read +//------------------------------------------------- + +UINT8 hpc102_t::nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) +{ + if (!bcom) + { + if ((offset & 0x0f) == 0x0f) + { + data = 0x01; + } + + if (!(offset & 0x08)) + { + data = m_uart->ins8250_r(space, offset & 0x07); + } + } + + return data; +} + + +//------------------------------------------------- +// nwri_w - write +//------------------------------------------------- + +void hpc102_t::nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) +{ + if (!bcom) + { + if ((offset & 0x0f) == 0x0f) + { + m_vector = data; + } + + if (!(offset & 0x08)) + { + m_uart->ins8250_w(space, offset & 0x07, data); + } + } } diff --git a/src/devices/bus/pofo/hpc102.h b/src/devices/bus/pofo/hpc102.h index 0ef1d978e90..c1fb91305af 100644 --- a/src/devices/bus/pofo/hpc102.h +++ b/src/devices/bus/pofo/hpc102.h @@ -40,9 +40,17 @@ protected: virtual void device_reset() override; // device_portfolio_expansion_slot_interface overrides + bool pdet() override { return 1; } + + virtual UINT8 eack_r() override; + + virtual UINT8 nrdi_r(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) override; + virtual void nwri_w(address_space &space, offs_t offset, UINT8 data, bool iom, bool bcom, bool ncc1) override; private: required_device m_uart; + + UINT8 m_vector; }; diff --git a/src/mame/drivers/pofo.cpp b/src/mame/drivers/pofo.cpp index 4b55589d01e..5476eb3e4af 100644 --- a/src/mame/drivers/pofo.cpp +++ b/src/mame/drivers/pofo.cpp @@ -117,7 +117,6 @@ public: /* interrupt state */ UINT8 m_ip; /* interrupt pending */ UINT8 m_ie; /* interrupt enable */ - UINT8 m_sivr; /* serial interrupt vector register */ /* counter state */ UINT16 m_counter; @@ -207,7 +206,7 @@ WRITE8_MEMBER( portfolio_state::irq_mask_w ) IRQ_CALLBACK_MEMBER(portfolio_state::portfolio_int_ack) { - UINT8 vector = m_sivr; + UINT8 vector = 0; for (int i = 0; i < 4; i++) { @@ -217,7 +216,7 @@ IRQ_CALLBACK_MEMBER(portfolio_state::portfolio_int_ack) m_ip &= ~(1 << i); if (i == 3) - vector = m_sivr; + vector = m_exp->eack_r(); else vector = INTERRUPT_VECTOR[i]; @@ -716,12 +715,10 @@ void portfolio_state::machine_start() /* set initial values */ m_keylatch = 0xff; - m_sivr = 0x2a; /* register for state saving */ save_item(NAME(m_ip)); save_item(NAME(m_ie)); - save_item(NAME(m_sivr)); save_item(NAME(m_counter)); save_item(NAME(m_keylatch)); save_pointer(NAME(m_contrast.target()), m_contrast.bytes()); From 073848e1c3e11b4dd77c355ed815c59796ae3c0c Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 15 Jun 2016 15:49:08 +0300 Subject: [PATCH 14/19] abc80x: Fixed ROM loading. (nw) --- src/devices/bus/abcbus/lux21046.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/bus/abcbus/lux21046.cpp b/src/devices/bus/abcbus/lux21046.cpp index 7b303156cb0..1931cbad35a 100644 --- a/src/devices/bus/abcbus/lux21046.cpp +++ b/src/devices/bus/abcbus/lux21046.cpp @@ -109,7 +109,7 @@ ROM_START( luxor_55_21046 ) ROM_REGION( 0x4000, Z80_TAG, 0 ) ROM_DEFAULT_BIOS( "v107" ) ROM_SYSTEM_BIOS( 0, "v105", "Luxor v1.05 (1984-10-04)" ) - ROMX_LOAD( "cntr 105.6cd", 0x0000, 0x4000, CRC(44043025) SHA1(17487ca35b399bb49d4015bbeede0809db8e772f), ROM_BIOS(1) ) + ROMX_LOAD( "cntr 105.6cd", 0x2000, 0x2000, CRC(44043025) SHA1(17487ca35b399bb49d4015bbeede0809db8e772f), ROM_BIOS(1) ) ROM_SYSTEM_BIOS( 1, "v107", "Luxor v1.07 (1985-07-03)" ) ROMX_LOAD( "cntr 1.07 6490318-07.6cd", 0x0000, 0x4000, CRC(db8c1c0e) SHA1(8bccd5bc72124984de529ee058df779f06d2c1d5), ROM_BIOS(2) ) ROM_SYSTEM_BIOS( 2, "v108", "Luxor v1.08 (1986-03-12)" ) From 13526f680b58d04cb5351be2a8e7c3db2673666d Mon Sep 17 00:00:00 2001 From: Robbbert Date: Wed, 15 Jun 2016 23:27:01 +1000 Subject: [PATCH 15/19] MT 06236 [Robbbert] --- src/lib/formats/sol_cas.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/formats/sol_cas.cpp b/src/lib/formats/sol_cas.cpp index 88ec0361539..ef808842ec6 100644 --- a/src/lib/formats/sol_cas.cpp +++ b/src/lib/formats/sol_cas.cpp @@ -249,11 +249,14 @@ static int sol20_handle_cassette(INT16 *buffer, const UINT8 *bytes) } sol20_byte_num+=2; // bump to file name - sol20_header[0] = bytes[sol20_byte_num++]; - sol20_header[1] = bytes[sol20_byte_num++]; - sol20_header[2] = bytes[sol20_byte_num++]; - sol20_header[3] = bytes[sol20_byte_num++]; - sol20_header[4] = bytes[sol20_byte_num++]; + for (i = 0; i < 5; i++) + sol20_header[i] = 0x20; + for (i = 0; i < 5; i++) + { + sol20_header[i] = bytes[sol20_byte_num++]; + if (sol20_header[i] == 0x20) + break; + } sol20_header[5] = 0; sol20_scan_to_hex(bytes); // bump to file type sol20_header[6] = sol20_read_hex(bytes, 2); From 2e51110ebf134da7dda12f375d00d7cbb7aa154b Mon Sep 17 00:00:00 2001 From: smf- Date: Wed, 15 Jun 2016 15:10:54 +0100 Subject: [PATCH 16/19] The calling convention goes inside the brackets of pointers to functions. Allows compiling with MSVC (nw) Revision: 58dc78b6eba373d88fe7ef68f9ce3c2c43e635d6 Author: Giuseppe Gorgoglione Date: 28/05/2016 03:14:15 Message: Introduce dynamic_module This is a central cross-platform facility to dynamically bind functions from shared libraries. Updated all OSD modules to use it. --- .../modules/diagnostics/diagnostics_win32.cpp | 18 +++++++++--------- src/osd/modules/font/font_dwrite.cpp | 2 +- src/osd/modules/input/input_dinput.h | 4 ++-- src/osd/modules/input/input_rawinput.cpp | 8 ++++---- src/osd/modules/render/winglcontext.h | 14 +++++++------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/osd/modules/diagnostics/diagnostics_win32.cpp b/src/osd/modules/diagnostics/diagnostics_win32.cpp index 437b2b3ddb5..70e290240c2 100644 --- a/src/osd/modules/diagnostics/diagnostics_win32.cpp +++ b/src/osd/modules/diagnostics/diagnostics_win32.cpp @@ -28,15 +28,15 @@ #include // Typedefs for dynamically loaded functions -typedef BOOL WINAPI (*StackWalk64_fn)(DWORD, HANDLE, HANDLE, LPSTACKFRAME64, PVOID, PREAD_PROCESS_MEMORY_ROUTINE64, PFUNCTION_TABLE_ACCESS_ROUTINE64, PGET_MODULE_BASE_ROUTINE64, PTRANSLATE_ADDRESS_ROUTINE64); -typedef BOOL WINAPI (*SymInitialize_fn)(HANDLE, LPCTSTR, BOOL); -typedef PVOID WINAPI (*SymFunctionTableAccess64_fn)(HANDLE, DWORD64); -typedef DWORD64 WINAPI (*SymGetModuleBase64_fn)(HANDLE, DWORD64); -typedef BOOL WINAPI (*SymFromAddr_fn)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); -typedef BOOL WINAPI (*SymGetLineFromAddr64_fn)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); -typedef PIMAGE_SECTION_HEADER WINAPI (*ImageRvaToSection_fn)(PIMAGE_NT_HEADERS, PVOID, ULONG); -typedef PIMAGE_NT_HEADERS WINAPI (*ImageNtHeader_fn)(PVOID); -typedef VOID WINAPI (*RtlCaptureContext_fn)(PCONTEXT); +typedef BOOL (WINAPI *StackWalk64_fn)(DWORD, HANDLE, HANDLE, LPSTACKFRAME64, PVOID, PREAD_PROCESS_MEMORY_ROUTINE64, PFUNCTION_TABLE_ACCESS_ROUTINE64, PGET_MODULE_BASE_ROUTINE64, PTRANSLATE_ADDRESS_ROUTINE64); +typedef BOOL (WINAPI *SymInitialize_fn)(HANDLE, LPCTSTR, BOOL); +typedef PVOID (WINAPI *SymFunctionTableAccess64_fn)(HANDLE, DWORD64); +typedef DWORD64 (WINAPI *SymGetModuleBase64_fn)(HANDLE, DWORD64); +typedef BOOL (WINAPI *SymFromAddr_fn)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); +typedef BOOL (WINAPI *SymGetLineFromAddr64_fn)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); +typedef PIMAGE_SECTION_HEADER (WINAPI *ImageRvaToSection_fn)(PIMAGE_NT_HEADERS, PVOID, ULONG); +typedef PIMAGE_NT_HEADERS (WINAPI *ImageNtHeader_fn)(PVOID); +typedef VOID (WINAPI *RtlCaptureContext_fn)(PCONTEXT); class stack_walker { diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp index e816f296294..9c0bee36220 100644 --- a/src/osd/modules/font/font_dwrite.cpp +++ b/src/osd/modules/font/font_dwrite.cpp @@ -79,7 +79,7 @@ struct osd_deleter typedef std::unique_ptr osd_utf8_ptr; // Typedefs for dynamically loaded functions -typedef HRESULT WINAPI (*d2d_create_factory_fn)(D2D1_FACTORY_TYPE, REFIID, const D2D1_FACTORY_OPTIONS *, void **); +typedef HRESULT (WINAPI *d2d_create_factory_fn)(D2D1_FACTORY_TYPE, REFIID, const D2D1_FACTORY_OPTIONS *, void **); typedef HRESULT (*dwrite_create_factory_fn)(DWRITE_FACTORY_TYPE, REFIID, IUnknown **); // Debugging functions diff --git a/src/osd/modules/input/input_dinput.h b/src/osd/modules/input/input_dinput.h index 7005ed0a305..5fc3dec30f6 100644 --- a/src/osd/modules/input/input_dinput.h +++ b/src/osd/modules/input/input_dinput.h @@ -45,9 +45,9 @@ public: // Typedef for dynamically loaded function #if DIRECTINPUT_VERSION >= 0x0800 -typedef HRESULT WINAPI (*dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT8 *, LPUNKNOWN); +typedef HRESULT (WINAPI *dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT8 *, LPUNKNOWN); #else -typedef HRESULT WINAPI (*dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); +typedef HRESULT (WINAPI *dinput_create_fn)(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); #endif class dinput_api_helper diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index cfab7dcdb5a..c4f84642b2f 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -38,10 +38,10 @@ //============================================================ // Typedefs for dynamically loaded functions -typedef UINT WINAPI (*get_rawinput_device_list_ptr)(PRAWINPUTDEVICELIST, PUINT, UINT); -typedef UINT WINAPI (*get_rawinput_data_ptr)( HRAWINPUT, UINT, LPVOID, PUINT, UINT); -typedef UINT WINAPI (*get_rawinput_device_info_ptr)(HANDLE, UINT, LPVOID, PUINT); -typedef BOOL WINAPI (*register_rawinput_devices_ptr)(PCRAWINPUTDEVICE, UINT, UINT); +typedef UINT (WINAPI *get_rawinput_device_list_ptr)(PRAWINPUTDEVICELIST, PUINT, UINT); +typedef UINT (WINAPI *get_rawinput_data_ptr)( HRAWINPUT, UINT, LPVOID, PUINT, UINT); +typedef UINT (WINAPI *get_rawinput_device_info_ptr)(HANDLE, UINT, LPVOID, PUINT); +typedef BOOL (WINAPI *register_rawinput_devices_ptr)(PCRAWINPUTDEVICE, UINT, UINT); class safe_regkey { diff --git a/src/osd/modules/render/winglcontext.h b/src/osd/modules/render/winglcontext.h index 54e9a0ebae0..ec63b11ff72 100644 --- a/src/osd/modules/render/winglcontext.h +++ b/src/osd/modules/render/winglcontext.h @@ -17,14 +17,14 @@ #include "modules/lib/osdlib.h" // Typedefs for dynamically loaded functions -typedef PROC WINAPI (*wglGetProcAddress_fn)(LPCSTR); -typedef HGLRC WINAPI (*wglCreateContext_fn)(HDC); -typedef BOOL WINAPI (*wglDeleteContext_fn)(HGLRC); -typedef BOOL WINAPI (*wglMakeCurrent_fn)(HDC, HGLRC); +typedef PROC (WINAPI *wglGetProcAddress_fn)(LPCSTR); +typedef HGLRC (WINAPI *wglCreateContext_fn)(HDC); +typedef BOOL (WINAPI *wglDeleteContext_fn)(HGLRC); +typedef BOOL (WINAPI *wglMakeCurrent_fn)(HDC, HGLRC); -typedef const char * WINAPI (*wglGetExtensionsStringEXT_fn)(void); -typedef BOOL WINAPI (*wglSwapIntervalEXT_fn)(int); -typedef int WINAPI (*wglGetSwapIntervalEXT_fn)(void); +typedef const char * (WINAPI *wglGetExtensionsStringEXT_fn)(void); +typedef BOOL (WINAPI *wglSwapIntervalEXT_fn)(int); +typedef int (WINAPI *wglGetSwapIntervalEXT_fn)(void); class win_gl_context : public osd_gl_context { From 1dd74e3eb7986e87f287a74d1ec348e7234cee0c Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 15 Jun 2016 18:11:17 +0300 Subject: [PATCH 17/19] abc802,abc806: Added LUXNET BIOSes. [Anders Sandahl] --- src/mame/drivers/abc80x.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mame/drivers/abc80x.cpp b/src/mame/drivers/abc80x.cpp index 2d777083290..8a16cc7f4a1 100644 --- a/src/mame/drivers/abc80x.cpp +++ b/src/mame/drivers/abc80x.cpp @@ -1413,6 +1413,10 @@ ROM_START( abc802 ) ROMX_LOAD( "abc 32-31.14f", 0x6000, 0x2000, CRC(fc8be7a8) SHA1(a1d4cb45cf5ae21e636dddfa70c99bfd2050ad60), ROM_BIOS(3) ) ROM_SYSTEM_BIOS( 3, "mica620", "MICA DOS v.20 (1984-03-02)" ) ROMX_LOAD( "mica820.14f", 0x6000, 0x2000, CRC(edf998af) SHA1(daae7e1ff6ef3e0ddb83e932f324c56f4a98f79b), ROM_BIOS(4) ) + ROM_SYSTEM_BIOS( 4, "luxnet01", "LUXNET 01" ) + ROMX_LOAD( "322n01.14f", 0x6000, 0x2000, CRC(0911bc92) SHA1(bf58b3be40ce07638eb265aa2dd97c5562a0c41b), ROM_BIOS(5) ) + ROM_SYSTEM_BIOS( 5, "luxnet02", "LUXNET 02" ) + ROMX_LOAD( "322n02.14f", 0x6000, 0x2000, CRC(2384baec) SHA1(8ae0371242c201913b2d33a75f670d2bccf29582), ROM_BIOS(6) ) ROM_REGION( 0x1000, MC6845_TAG, 0 ) ROM_LOAD( "abc t02-1.3g", 0x0000, 0x1000, CRC(4d54eed8) SHA1(04cb5fc5f3d7ba9b9a5ae0ec94241d1fe83647f7) ) // 64 90191-01 @@ -1443,6 +1447,8 @@ ROM_START( abc806 ) ROMX_LOAD( "mica2006.2k", 0x6000, 0x1000, CRC(58bc2aa8) SHA1(0604bd2396f7d15fcf3d65888b4b673f554037c0), ROM_BIOS(3) ) ROM_SYSTEM_BIOS( 3, "catnet", "CAT-NET" ) ROMX_LOAD( "cmd8_5.2k", 0x6000, 0x1000, CRC(25430ef7) SHA1(03a36874c23c215a19b0be14ad2f6b3b5fb2c839), ROM_BIOS(4) ) + ROM_SYSTEM_BIOS( 4, "luxnet", "LUXNET" ) + ROMX_LOAD( "ln806.2k", 0x6000, 0x1000, CRC(034b5991) SHA1(ba7f8653f4e516687a4399abef450e361f2bfd20), ROM_BIOS(5) ) ROM_LOAD_OPTIONAL( "abc 76-11.2j", 0x7000, 0x1000, CRC(3eb5f6a1) SHA1(02d4e38009c71b84952eb3b8432ad32a98a7fe16) ) // Options-PROM ABC 76-11 "64 90238-02" ROM_LOAD( "abc 76-xx.2j", 0x7000, 0x1000, CRC(b364cc49) SHA1(9a2c373778856a31902cdbd2ae3362c200a38e24) ) // Enhanced Options-PROM From b49b23b7dfa48377bf5e7abfdd45630248cadc01 Mon Sep 17 00:00:00 2001 From: angelosa Date: Wed, 15 Jun 2016 19:38:04 +0200 Subject: [PATCH 18/19] Added command strobe callback interface for LDV1000, and hooked it up to esh.cpp driver. [Angelo Salese] (out of whatsnew: also fixed irq 0 hookup, using device_timer to ack an irq for MAME is never a good idea) --- src/devices/machine/ldv1000.cpp | 10 ++++++++-- src/devices/machine/ldv1000.h | 8 ++++++++ src/emu/romload.cpp | 2 -- src/mame/drivers/esh.cpp | 27 ++++++++++++--------------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/devices/machine/ldv1000.cpp b/src/devices/machine/ldv1000.cpp index 36dae481853..27c874eadf7 100644 --- a/src/devices/machine/ldv1000.cpp +++ b/src/devices/machine/ldv1000.cpp @@ -63,8 +63,8 @@ const device_type PIONEER_LDV1000 = &device_creator; static ADDRESS_MAP_START( ldv1000_map, AS_PROGRAM, 8, pioneer_ldv1000_device ) AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_MIRROR(0x3800) AM_RAM - AM_RANGE(0xc000, 0xc003) AM_MIRROR(0x9ff0) AM_DEVREADWRITE("ldvppi0", i8255_device, read, write) - AM_RANGE(0xc004, 0xc007) AM_MIRROR(0x9ff0) AM_DEVREADWRITE("ldvppi1", i8255_device, read, write) + AM_RANGE(0xc000, 0xc003) AM_MIRROR(0x1ff0) AM_DEVREADWRITE("ldvppi0", i8255_device, read, write) + AM_RANGE(0xc004, 0xc007) AM_MIRROR(0x1ff0) AM_DEVREADWRITE("ldvppi1", i8255_device, read, write) ADDRESS_MAP_END @@ -126,6 +126,7 @@ pioneer_ldv1000_device::pioneer_ldv1000_device(const machine_config &mconfig, co m_z80_cpu(*this, "ldv1000"), m_z80_ctc(*this, "ldvctc"), m_multitimer(nullptr), + m_command_strobe_cb(*this), m_command(0), m_status(0), m_vsync(false), @@ -175,6 +176,8 @@ void pioneer_ldv1000_device::device_start() // allocate timers m_multitimer = timer_alloc(TID_MULTIJUMP); + + m_command_strobe_cb.resolve_safe(); } @@ -648,6 +651,9 @@ WRITE8_MEMBER( pioneer_ldv1000_device::ppi1_portc_w ) printf("\n"); } + // bit 4 sends a command strobe signal to Host CPU + m_command_strobe_cb(bool(data & 0x10)); + // video squelch is controlled by bit 3 set_video_squelch((data & 0x08) == 0); diff --git a/src/devices/machine/ldv1000.h b/src/devices/machine/ldv1000.h index c2f9ead67a6..c7d798d89df 100644 --- a/src/devices/machine/ldv1000.h +++ b/src/devices/machine/ldv1000.h @@ -26,6 +26,10 @@ #define MCFG_LASERDISC_LDV1000_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, PIONEER_LDV1000, 0) +#define MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(_cb) \ + downcast(device)->set_command_strobe_callback(DEVCB_##_cb); + + //************************************************************************** // GLOBAL VARIABLES @@ -49,6 +53,8 @@ public: // construction/destruction pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + template void set_command_strobe_callback(_cmd_strobe_cb latch) { m_command_strobe_cb.set_callback(latch); } + // input and output void data_w(UINT8 data); void enter_w(UINT8 data); @@ -102,6 +108,7 @@ protected: required_device m_z80_cpu; /* CPU index of the Z80 */ required_device m_z80_ctc; /* CTC device */ emu_timer * m_multitimer; /* multi-jump timer device */ + devcb_write_line m_command_strobe_cb; /* communication status */ UINT8 m_command; /* command byte to the player */ @@ -122,6 +129,7 @@ protected: UINT8 m_vbi[7*3]; /* VBI data */ bool m_vbiready; /* VBI ready flag */ UINT8 m_vbiindex; /* index within the VBI data */ + }; diff --git a/src/emu/romload.cpp b/src/emu/romload.cpp index 1f56418cad9..e158f7ea304 100644 --- a/src/emu/romload.cpp +++ b/src/emu/romload.cpp @@ -811,8 +811,6 @@ void rom_load_manager::fill_rom_data(const rom_entry *romp) /* make sure the length was valid */ if (numbytes == 0) fatalerror("Error in RomModule definition: FILL has an invalid length\n"); - - printf("base %08x %02x\n",numbytes,skip); /* fill the data (filling value is stored in place of the hashdata) */ if(skip != 0) diff --git a/src/mame/drivers/esh.cpp b/src/mame/drivers/esh.cpp index f9ce2dfcbf2..b8e99db0e16 100644 --- a/src/mame/drivers/esh.cpp +++ b/src/mame/drivers/esh.cpp @@ -14,11 +14,9 @@ Notes: Eshb has some junk in the IO TEST screen. Maybe a bad dump? Todo: - - LD TROUBLE message pops up after each cycle in attract. NMI-related + - LD TROUBLE appears at POST. Sync/timing issue? - Wrong overlay colors; - Convert to tilemaps (see next ToDo for feasibility). - - Apparently some tiles blink (in at least two different ways). - - 0xfe and 0xff are pretty obviously not NMI enables. They're likely LED's. Do the NMI right (somehow). - Rumor has it there's an analog beep hanging off 0xf5? Implement it and finish off 0xf5 bits. - NVRAM range 0xe000-0xe800 might be too large. It doesn't seem to write past 0xe600... - Maybe some of the IPT_UNKNOWNs do something? @@ -65,13 +63,13 @@ public: DECLARE_PALETTE_INIT(esh); UINT32 screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(vblank_callback_esh); - INTERRUPT_GEN_MEMBER(ld_unk_callback); + DECLARE_WRITE_LINE_MEMBER(ld_command_strobe_cb); required_device m_maincpu; required_device m_gfxdecode; required_device m_palette; protected: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + //virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; @@ -104,7 +102,7 @@ UINT32 esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, //int blinkChar = (m_tile_control_ram[current_screen_character] & 0x80) >> 7; // TODO: blink timing - if(blinkLine == true && m_screen->frame_number() & 0x10) + if(blinkLine == true && m_screen->frame_number() & 8) gfx = m_gfxdecode->gfx(1); else gfx = m_gfxdecode->gfx(0); @@ -317,6 +315,7 @@ static GFXDECODE_START( esh ) GFXDECODE_ENTRY("gfx2", 0, esh_gfx_layout, 0x0, 0x20) GFXDECODE_END +#if 0 void esh_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch (id) @@ -328,19 +327,20 @@ void esh_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo assert_always(FALSE, "Unknown id in esh_state::device_timer"); } } +#endif INTERRUPT_GEN_MEMBER(esh_state::vblank_callback_esh) { // IRQ - device.execute().set_input_line(0, ASSERT_LINE); - timer_set(attotime::from_usec(50), TIMER_IRQ_STOP); + device.execute().set_input_line(0, HOLD_LINE); + //timer_set(attotime::from_usec(50), TIMER_IRQ_STOP); } -// TODO: 0xfe NMI enabled after writing to LD command port, NMI reads LD port. LDV needs command strobe callback? -INTERRUPT_GEN_MEMBER(esh_state::ld_unk_callback) +// TODO: 0xfe NMI enabled after writing to LD command port, NMI reads LD port. +WRITE_LINE_MEMBER(esh_state::ld_command_strobe_cb) { if(m_nmi_enable) - m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); } void esh_state::machine_start() @@ -350,19 +350,16 @@ void esh_state::machine_start() /* DRIVER */ static MACHINE_CONFIG_START( esh, esh_state ) - /* main cpu */ MCFG_CPU_ADD("maincpu", Z80, PCB_CLOCK/6) /* The denominator is a Daphne guess based on PacMan's hardware */ MCFG_CPU_PROGRAM_MAP(z80_0_mem) MCFG_CPU_IO_MAP(z80_0_io) MCFG_CPU_VBLANK_INT_DRIVER("screen", esh_state, vblank_callback_esh) - MCFG_CPU_PERIODIC_INT_DRIVER(esh_state, ld_unk_callback, 90) - MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(WRITELINE(esh_state, ld_command_strobe_cb)) MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, esh_state, screen_update_esh) MCFG_LASERDISC_OVERLAY_PALETTE("palette") From fb358febe10d9045810dc0282a969b53a4c40839 Mon Sep 17 00:00:00 2001 From: dankan1890 Date: Wed, 15 Jun 2016 19:52:53 +0200 Subject: [PATCH 19/19] cleanup. (nw) --- src/frontend/mame/ui/auditmenu.cpp | 8 +- src/frontend/mame/ui/custui.cpp | 6 +- src/frontend/mame/ui/custui.h | 7 +- src/frontend/mame/ui/datfile.cpp | 44 +++-- src/frontend/mame/ui/datfile.h | 2 +- src/frontend/mame/ui/menu.cpp | 233 ++++++++++--------------- src/frontend/mame/ui/menu.h | 6 +- src/frontend/mame/ui/miscmenu.cpp | 1 - src/frontend/mame/ui/selgame.cpp | 110 ++++++------ src/frontend/mame/ui/selgame.h | 2 +- src/frontend/mame/ui/selsoft.cpp | 112 ++++++------ src/frontend/mame/ui/selsoft.h | 2 +- src/frontend/mame/ui/simpleselgame.cpp | 4 +- src/frontend/mame/ui/simpleselgame.h | 2 +- 14 files changed, 247 insertions(+), 292 deletions(-) diff --git a/src/frontend/mame/ui/auditmenu.cpp b/src/frontend/mame/ui/auditmenu.cpp index 8c148c09c00..9a6a47c8fc8 100644 --- a/src/frontend/mame/ui/auditmenu.cpp +++ b/src/frontend/mame/ui/auditmenu.cpp @@ -27,8 +27,8 @@ inline int cs_stricmp(const char *s1, const char *s2) { for (;;) { - int c1 = tolower((UINT8)*s1++); - int c2 = tolower((UINT8)*s2++); + int c1 = tolower(*s1++); + int c2 = tolower(*s2++); if (c1 == 0 || c1 != c2) return c1 - c2; } @@ -36,8 +36,8 @@ inline int cs_stricmp(const char *s1, const char *s2) bool sorted_game_list(const game_driver *x, const game_driver *y) { - bool clonex = strcmp(x->parent, "0"); - bool cloney = strcmp(y->parent, "0"); + bool clonex = (x->parent[0] != '0'); + bool cloney = (y->parent[0] != '0'); if (!clonex && !cloney) return (cs_stricmp(x->description, y->description) < 0); diff --git a/src/frontend/mame/ui/custui.cpp b/src/frontend/mame/ui/custui.cpp index b54f6b024e1..e033f022356 100644 --- a/src/frontend/mame/ui/custui.cpp +++ b/src/frontend/mame/ui/custui.cpp @@ -1002,7 +1002,7 @@ void menu_rgb_ui::inkey_special(const event *menu_event) } } -menu_palette_sel::palcolor menu_palette_sel::m_palette[] = { +std::vector> menu_palette_sel::m_palette = { { __("White"), "FFFFFFFF" }, { __("Silver"), "FFC0C0C0" }, { __("Gray"), "FF808080" }, @@ -1057,8 +1057,8 @@ void menu_palette_sel::handle() void menu_palette_sel::populate() { - for (int x = 0; x < ARRAY_LENGTH(m_palette); ++x) - item_append(_(m_palette[x].name), m_palette[x].argb, FLAG_UI_PALETTE, (void *)(FPTR)(x + 1)); + for (int x = 0; x < m_palette.size(); ++x) + item_append(_(m_palette[x].first), m_palette[x].second, FLAG_UI_PALETTE, (void *)(FPTR)(x + 1)); item_append(menu_item_type::SEPARATOR); } diff --git a/src/frontend/mame/ui/custui.h b/src/frontend/mame/ui/custui.h index 217bc4e6ac4..7cf10d44a45 100644 --- a/src/frontend/mame/ui/custui.h +++ b/src/frontend/mame/ui/custui.h @@ -169,13 +169,8 @@ public: virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; private: - struct palcolor - { - const char *name; - const char *argb; - }; - static palcolor m_palette[]; + static std::vector> m_palette; rgb_t &m_original; }; diff --git a/src/frontend/mame/ui/datfile.cpp b/src/frontend/mame/ui/datfile.cpp index d70ec38fb9e..ea391a9eadf 100644 --- a/src/frontend/mame/ui/datfile.cpp +++ b/src/frontend/mame/ui/datfile.cpp @@ -83,7 +83,7 @@ datfile_manager::datfile_manager(running_machine &machine, ui_options &moptions) void datfile_manager::init_sysinfo() { int swcount = 0; - auto count = index_datafile(m_sysidx, swcount); + auto count = index_datafile(m_sysidx, swcount, TAG_SYSINFO_R, m_sysinfo_rev, '.'); osd_printf_verbose("Sysinfo.dat games found = %i\n", count); osd_printf_verbose("Rev = %s\n", m_sysinfo_rev.c_str()); } @@ -94,7 +94,7 @@ void datfile_manager::init_sysinfo() void datfile_manager::init_story() { int swcount = 0; - auto count = index_datafile(m_storyidx, swcount); + auto count = index_datafile(m_storyidx, swcount, TAG_STORY_R, m_story_rev, 's'); osd_printf_verbose("Story.dat games found = %i\n", count); } @@ -104,7 +104,7 @@ void datfile_manager::init_story() void datfile_manager::init_history() { int swcount = 0; - auto count = index_datafile(m_histidx, swcount); + auto count = index_datafile(m_histidx, swcount, TAG_HISTORY_R, m_history_rev, ' '); osd_printf_verbose("History.dat systems found = %i\n", count); osd_printf_verbose("History.dat software packages found = %i\n", swcount); osd_printf_verbose("Rev = %s\n", m_history_rev.c_str()); @@ -152,7 +152,8 @@ void datfile_manager::init_messinfo() void datfile_manager::init_command() { int swcount = 0; - auto count = index_datafile(m_cmdidx, swcount); + std::string tmp, tmp2; + auto count = index_datafile(m_cmdidx, swcount, tmp, tmp2, 'c'); osd_printf_verbose("Command.dat games found = %i\n", count); } @@ -398,12 +399,10 @@ int datfile_manager::index_mame_mess_info(dataindex &index, drvindex &index_drv, // load a game name and offset into an // indexed array //------------------------------------------------- -int datfile_manager::index_datafile(dataindex &index, int &swcount) +int datfile_manager::index_datafile(dataindex &index, int &swcount, std::string &tag, std::string &str, char sep) { std::string readbuf; - auto t_hist = TAG_HISTORY_R.size(); - auto t_story = TAG_STORY_R.size(); - auto t_sysinfo = TAG_SYSINFO_R.size(); + auto tag_size = tag.size(); auto t_info = TAG_INFO.size(); auto t_bio = TAG_BIO.size(); char rbuf[64 * 1024]; @@ -411,21 +410,19 @@ int datfile_manager::index_datafile(dataindex &index, int &swcount) { readbuf = chartrimcarriage(rbuf); - if (m_history_rev.empty() && readbuf.compare(0, t_hist, TAG_HISTORY_R) == 0) - { - auto found = readbuf.find(" ", t_hist + 1); - m_history_rev = readbuf.substr(t_hist + 1, found - t_hist); - } - else if (m_sysinfo_rev.empty() && readbuf.compare(0, t_sysinfo, TAG_SYSINFO_R) == 0) - { - auto found = readbuf.find(".", t_sysinfo + 1); - m_sysinfo_rev = readbuf.substr(t_sysinfo + 1, found - t_sysinfo); - } - else if (m_story_rev.empty() && readbuf.compare(0, t_story, TAG_STORY_R) == 0) - { - m_story_rev = readbuf.substr(t_story + 1); - } - else if (readbuf.compare(0, t_info, TAG_INFO) == 0) + if (!tag.empty()) + if (str.empty() && readbuf.compare(0, tag_size, tag) == 0) + { + if (sep != 's') + { + auto found = readbuf.find(sep, tag_size + 1); + str = readbuf.substr(tag_size + 1, found - tag_size); + } + else + str = readbuf.substr(tag_size + 1); + } + + if (readbuf.compare(0, t_info, TAG_INFO) == 0) { // search for game info auto rd = readbuf.substr(t_info + 1); @@ -452,6 +449,7 @@ int datfile_manager::index_datafile(dataindex &index, int &swcount) for (auto & li : token_list) for (auto & ro : token_roms) m_swindex[li].emplace(ro, ftell(fp)); + swcount++; } } } diff --git a/src/frontend/mame/ui/datfile.h b/src/frontend/mame/ui/datfile.h index 9e77c2383fe..260b23a40ce 100644 --- a/src/frontend/mame/ui/datfile.h +++ b/src/frontend/mame/ui/datfile.h @@ -79,7 +79,7 @@ private: void parseclose() { if (fp != nullptr) fclose(fp); } int index_mame_mess_info(dataindex &index, drvindex &index_drv, int &drvcount); - int index_datafile(dataindex &index, int &swcount); + int index_datafile(dataindex &index, int &swcount, std::string &tag, std::string &str, char sep); void index_menuidx(const game_driver *drv, dataindex &idx, drvindex &index); drvindex::const_iterator m_itemsiter; diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index d6c53638a44..e88a5578279 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -180,7 +180,7 @@ void menu::exit(running_machine &machine) for (auto & elem : icons_texture) mre.texture_free(elem); - for (int i = 0; i < UI_TOOLBAR_BUTTONS; i++) + for (int i = 0; i < UI_TOOLBAR_BUTTONS; ++i) { mre.texture_free(sw_toolbar_texture[i]); mre.texture_free(toolbar_texture[i]); @@ -390,7 +390,7 @@ const menu::event *menu::process(UINT32 flags, float x0, float y0) { // read events if ((item[0].flags & FLAG_UI ) != 0 || (item[0].flags & FLAG_UI_SWLIST ) != 0) - handle_main_events(flags); + handle_main_events(); else handle_events(flags); @@ -521,9 +521,8 @@ void menu::draw(UINT32 flags, float origx0, float origy0) // compute the width and height of the full menu float visible_width = 0; float visible_main_menu_height = 0; - for (itemnum = 0; itemnum < item.size(); itemnum++) + for (auto & pitem : item) { - const menu_item &pitem = item[itemnum]; float total_width; // compute width of left hand side @@ -564,38 +563,6 @@ void menu::draw(UINT32 flags, float origx0, float origy0) float visible_left = (1.0f - visible_width) * 0.5f; float visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; -/* float visible_left; - float visible_top; - if (origx0 == 0.0f && origy0 == 0.0f) - { - visible_left = (1.0f - visible_width) * 0.5f; - visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; - } - else - { - INT32 mouse_target_x, mouse_target_y; - float m_x, m_y; - render_target *mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button); - if (mouse_target != nullptr) - { - if (mouse_target->map_point_container(origx0, origy0, *container, m_x, m_y)) - { - visible_left = m_x; - visible_top = m_y; - } - else - { - visible_left = (1.0f - visible_width) * 0.5f; - visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; - } - } - else - { - visible_left = (1.0f - visible_width) * 0.5f; - visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; - } - } -*/ // if the menu is at the bottom of the extra, adjust visible_top += customtop; @@ -669,19 +636,15 @@ void menu::draw(UINT32 flags, float origx0, float origy0) // if we're selected, draw with a different background if (itemnum == selected) { - fgcolor = UI_SELECTED_COLOR; + fgcolor = fgcolor2 = fgcolor3 = UI_SELECTED_COLOR; bgcolor = UI_SELECTED_BG_COLOR; - fgcolor2 = UI_SELECTED_COLOR; - fgcolor3 = UI_SELECTED_COLOR; } // else if the mouse is over this item, draw with a different background else if (itemnum == hover) { - fgcolor = UI_MOUSEOVER_COLOR; + fgcolor = fgcolor2 = fgcolor3 = UI_MOUSEOVER_COLOR; bgcolor = UI_MOUSEOVER_BG_COLOR; - fgcolor2 = UI_MOUSEOVER_COLOR; - fgcolor3 = UI_MOUSEOVER_COLOR; } // if we have some background hilighting to do, add a quad behind everything else @@ -692,12 +655,12 @@ void menu::draw(UINT32 flags, float origx0, float origy0) if (linenum == 0 && show_top_arrow) { draw_arrow(container, - 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, - line_y + 0.25f * line_height, - 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, - line_y + 0.75f * line_height, - fgcolor, - ROT0); + 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, + line_y + 0.25f * line_height, + 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, + line_y + 0.75f * line_height, + fgcolor, + ROT0); if (hover == itemnum) hover = HOVER_ARROW_UP; } @@ -706,12 +669,12 @@ void menu::draw(UINT32 flags, float origx0, float origy0) else if (linenum == visible_lines - 1 && show_bottom_arrow) { draw_arrow(container, - 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, - line_y + 0.25f * line_height, - 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, - line_y + 0.75f * line_height, - fgcolor, - ROT0 ^ ORIENTATION_FLIP_Y); + 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, + line_y + 0.25f * line_height, + 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, + line_y + 0.75f * line_height, + fgcolor, + ROT0 ^ ORIENTATION_FLIP_Y); if (hover == itemnum) hover = HOVER_ARROW_DOWN; } @@ -742,7 +705,7 @@ void menu::draw(UINT32 flags, float origx0, float origy0) // draw the left-side text ui().draw_text_full(container, itemtext, effective_left, line_y, effective_width, - JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, &item_width, nullptr); + JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, &item_width, nullptr); // give 2 spaces worth of padding item_width += 2.0f * gutter_width; @@ -757,38 +720,38 @@ void menu::draw(UINT32 flags, float origx0, float origy0) // customize subitem text color if (!core_stricmp(subitem_text, _("On"))) - fgcolor2 = rgb_t(0xff,0x00,0xff,0x00); + fgcolor2 = rgb_t(0x00,0xff,0x00); if (!core_stricmp(subitem_text, _("Off"))) - fgcolor2 = rgb_t(0xff,0xff,0x00,0x00); + fgcolor2 = rgb_t(0xff,0x00,0x00); if (!core_stricmp(subitem_text, _("Auto"))) - fgcolor2 = rgb_t(0xff,0xff,0xff,0x00); + fgcolor2 = rgb_t(0xff,0xff,0x00); // draw the subitem right-justified ui().draw_text_full(container, subitem_text, effective_left + item_width, line_y, effective_width - item_width, - JUSTIFY_RIGHT, WRAP_TRUNCATE, DRAW_NORMAL, subitem_invert ? fgcolor3 : fgcolor2, bgcolor, &subitem_width, nullptr); + JUSTIFY_RIGHT, WRAP_TRUNCATE, DRAW_NORMAL, subitem_invert ? fgcolor3 : fgcolor2, bgcolor, &subitem_width, nullptr); // apply arrows if (itemnum == selected && (pitem.flags & FLAG_LEFT_ARROW)) { draw_arrow(container, - effective_left + effective_width - subitem_width - gutter_width, - line_y + 0.1f * line_height, - effective_left + effective_width - subitem_width - gutter_width + lr_arrow_width, - line_y + 0.9f * line_height, - fgcolor, - ROT90 ^ ORIENTATION_FLIP_X); + effective_left + effective_width - subitem_width - gutter_width, + line_y + 0.1f * line_height, + effective_left + effective_width - subitem_width - gutter_width + lr_arrow_width, + line_y + 0.9f * line_height, + fgcolor, + ROT90 ^ ORIENTATION_FLIP_X); } if (itemnum == selected && (pitem.flags & FLAG_RIGHT_ARROW)) { draw_arrow(container, - effective_left + effective_width + gutter_width - lr_arrow_width, - line_y + 0.1f * line_height, - effective_left + effective_width + gutter_width, - line_y + 0.9f * line_height, - fgcolor, - ROT90); + effective_left + effective_width + gutter_width - lr_arrow_width, + line_y + 0.1f * line_height, + effective_left + effective_width + gutter_width, + line_y + 0.9f * line_height, + fgcolor, + ROT90); } } } @@ -806,7 +769,7 @@ void menu::draw(UINT32 flags, float origx0, float origy0) // compute the multi-line target width/height ui().draw_text_full(container, pitem.subtext, 0, 0, visible_width * 0.75f, - JUSTIFY_RIGHT, WRAP_WORD, DRAW_NONE, rgb_t::white, rgb_t::black, &target_width, &target_height); + JUSTIFY_RIGHT, WRAP_WORD, DRAW_NONE, rgb_t::white, rgb_t::black, &target_width, &target_height); // determine the target location target_x = visible_left + visible_width - target_width - UI_BOX_LR_BORDER; @@ -821,7 +784,7 @@ void menu::draw(UINT32 flags, float origx0, float origy0) target_y + target_height + UI_BOX_TB_BORDER, subitem_invert ? UI_SELECTED_BG_COLOR : UI_BACKGROUND_COLOR); ui().draw_text_full(container, pitem.subtext, target_x, target_y, target_width, - JUSTIFY_RIGHT, WRAP_WORD, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, nullptr, nullptr); + JUSTIFY_RIGHT, WRAP_WORD, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, nullptr, nullptr); } // if there is something special to add, do it by calling the virtual method @@ -850,7 +813,7 @@ void menu::draw_text_box() // compute the multi-line target width/height ui().draw_text_full(container, text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER - 2.0f * gutter_width, - JUSTIFY_LEFT, WRAP_WORD, DRAW_NONE, rgb_t::white, rgb_t::black, &target_width, &target_height); + JUSTIFY_LEFT, WRAP_WORD, DRAW_NONE, rgb_t::white, rgb_t::black, &target_width, &target_height); target_height += 2.0f * line_height; if (target_height > 1.0f - 2.0f * UI_BOX_TB_BORDER) target_height = floorf((1.0f - 2.0f * UI_BOX_TB_BORDER) / line_height) * line_height; @@ -875,12 +838,12 @@ void menu::draw_text_box() // add a box around that ui().draw_outlined_box(container, target_x - UI_BOX_LR_BORDER - gutter_width, - target_y - UI_BOX_TB_BORDER, - target_x + target_width + gutter_width + UI_BOX_LR_BORDER, - target_y + target_height + UI_BOX_TB_BORDER, - (item[0].flags & FLAG_REDTEXT) ? UI_RED_COLOR : UI_BACKGROUND_COLOR); + target_y - UI_BOX_TB_BORDER, + target_x + target_width + gutter_width + UI_BOX_LR_BORDER, + target_y + target_height + UI_BOX_TB_BORDER, + (item[0].flags & FLAG_REDTEXT) ? UI_RED_COLOR : UI_BACKGROUND_COLOR); ui().draw_text_full(container, text, target_x, target_y, target_width, - JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr); + JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr); // draw the "return to prior menu" text with a hilight behind it highlight(container, @@ -890,7 +853,7 @@ void menu::draw_text_box() target_y + target_height, UI_SELECTED_BG_COLOR); ui().draw_text_full(container, backtext, target_x, target_y + target_height - line_height, target_width, - JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, nullptr, nullptr); + JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, nullptr, nullptr); // artificially set the hover to the last item so a double-click exits hover = item.size() - 1; @@ -950,7 +913,7 @@ void menu::handle_events(UINT32 flags) // if we are hovering over a valid item, fake a UI_SELECT with a double-click case UI_EVENT_MOUSE_DOUBLE_CLICK: - if ((flags & PROCESS_ONLYCHAR) == 0 && hover >= 0 && hover < item.size()) + if (!(flags & PROCESS_ONLYCHAR) && hover >= 0 && hover < item.size()) { selected = hover; m_event.iptkey = IPT_UI_SELECT; @@ -965,7 +928,7 @@ void menu::handle_events(UINT32 flags) // caught scroll event case UI_EVENT_MOUSE_WHEEL: - if ((flags & PROCESS_ONLYCHAR) == 0) + if (!(flags & PROCESS_ONLYCHAR)) { if (local_menu_event.zdelta > 0) { @@ -982,7 +945,7 @@ void menu::handle_events(UINT32 flags) } else { - if ((flags & FLAG_UI_DATS) != 0) + if ((flags & FLAG_UI_DATS)) { top_line += local_menu_event.num_lines; return; @@ -1037,7 +1000,7 @@ void menu::handle_keys(UINT32 flags) } // bail out - if ((flags & PROCESS_ONLYCHAR) != 0) + if ((flags & PROCESS_ONLYCHAR)) return; // hitting cancel also pops the stack @@ -1055,7 +1018,7 @@ void menu::handle_keys(UINT32 flags) bool ignoreleft = ((item[selected].flags & FLAG_LEFT_ARROW) == 0); bool ignoreright = ((item[selected].flags & FLAG_RIGHT_ARROW) == 0); - if ((item[0].flags & FLAG_UI_DATS) != 0) + if ((item[0].flags & FLAG_UI_DATS)) ignoreleft = ignoreright = false; // accept left/right keys as-is with repeat @@ -1067,7 +1030,7 @@ void menu::handle_keys(UINT32 flags) // up backs up by one item if (exclusive_input_pressed(IPT_UI_UP, 6)) { - if ((item[0].flags & FLAG_UI_DATS) != 0) + if ((item[0].flags & FLAG_UI_DATS)) { top_line--; return; @@ -1082,7 +1045,7 @@ void menu::handle_keys(UINT32 flags) // down advances by one item if (exclusive_input_pressed(IPT_UI_DOWN, 6)) { - if ((item[0].flags & FLAG_UI_DATS) != 0) + if ((item[0].flags & FLAG_UI_DATS)) { top_line++; return; @@ -1371,15 +1334,15 @@ void menu::init_ui(running_machine &machine, ui_options &mopt) { render_manager &mrender = machine.render(); // create a texture for hilighting items in main menu - hilight_main_bitmap = std::make_unique(1, 26); + hilight_main_bitmap = std::make_unique(1, 128); int r1 = 0, g1 = 169, b1 = 255; //Any start color int r2 = 0, g2 = 39, b2 = 130; //Any stop color - for (int y = 0; y < 26; y++) + for (int y = 0; y < 128; y++) { - int r = r1 + (y * (r2 - r1) / 26); - int g = g1 + (y * (g2 - g1) / 26); - int b = b1 + (y * (b2 - b1) / 26); - hilight_main_bitmap->pix32(y, 0) = rgb_t(0xff, r, g, b); + int r = r1 + (y * (r2 - r1) / 128); + int g = g1 + (y * (g2 - g1) / 128); + int b = b1 + (y * (b2 - b1) / 128); + hilight_main_bitmap->pix32(y, 0) = rgb_t(r, g, b); } hilight_main_texture = mrender.texture_alloc(); @@ -1402,10 +1365,10 @@ void menu::init_ui(running_machine &machine, ui_options &mopt) star_texture->set_bitmap(*star_bitmap, star_bitmap->cliprect(), TEXFORMAT_ARGB32); // allocate icons - for (int i = 0; i < MAX_ICONS_RENDER; i++) + for (auto & icons : icons_texture) { icons_bitmap.emplace_back(std::make_unique()); - icons_texture[i] = mrender.texture_alloc(); + icons = mrender.texture_alloc(); } // create a texture for main menu background @@ -1473,8 +1436,8 @@ void menu::draw_select_game(UINT32 flags) float visible_width = 1.0f - 4.0f * UI_BOX_LR_BORDER; float primary_left = (1.0f - visible_width) * 0.5f; float primary_width = visible_width; - bool is_swlist = ((item[0].flags & FLAG_UI_SWLIST) != 0); - bool is_favorites = ((item[0].flags & FLAG_UI_FAVORITE) != 0); + bool is_swlist = (item[0].flags & FLAG_UI_SWLIST); + bool is_favorites = (item[0].flags & FLAG_UI_FAVORITE); // draw background image if available if (ui().options().use_background_image() && bgrnd_bitmap->valid()) @@ -1491,7 +1454,7 @@ void menu::draw_select_game(UINT32 flags) if (!noinput) { mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button); - if (mouse_target != nullptr) + if (mouse_target) if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y)) mouse_hit = true; } @@ -1549,7 +1512,6 @@ void menu::draw_select_game(UINT32 flags) float line_y = visible_top + (float)linenum * line_height; int itemnum = top_line + linenum; const menu_item &pitem = item[itemnum]; - const char *itemtext = pitem.text; rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; rgb_t fgcolor3 = UI_CLONE_COLOR; @@ -1565,10 +1527,10 @@ void menu::draw_select_game(UINT32 flags) // if we're selected, draw with a different background if (itemnum == selected && m_focus == focused_menu::main) { - fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); - bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); - fgcolor3 = rgb_t(0xff, 0xcc, 0xcc, 0x00); - ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(255, 43, 43, 43), + fgcolor = rgb_t(0xff, 0xff, 0x00); + bgcolor = rgb_t(0xff, 0xff, 0xff); + fgcolor3 = rgb_t(0xcc, 0xcc, 0x00); + ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); } // else if the mouse is over this item, draw with a different background @@ -1582,7 +1544,7 @@ void menu::draw_select_game(UINT32 flags) { fgcolor = fgcolor3 = UI_MOUSEOVER_COLOR; bgcolor = UI_MOUSEOVER_BG_COLOR; - ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(255, 43, 43, 43), + ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); } @@ -1628,26 +1590,25 @@ void menu::draw_select_game(UINT32 flags) space = ud_arrow_width * 1.5f; } - ui().draw_text_full(container, itemtext, effective_left + space, line_y, effective_width - space, JUSTIFY_LEFT, WRAP_TRUNCATE, + ui().draw_text_full(container, pitem.text, effective_left + space, line_y, effective_width - space, JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, nullptr, nullptr); } else { int item_invert = pitem.flags & FLAG_INVERT; - const char *subitem_text = pitem.subtext; float item_width, subitem_width; // compute right space for subitem - ui().draw_text_full(container, subitem_text, effective_left, line_y, ui().get_string_width(pitem.subtext), + ui().draw_text_full(container, pitem.subtext, effective_left, line_y, ui().get_string_width(pitem.subtext), JUSTIFY_RIGHT, WRAP_NEVER, DRAW_NONE, item_invert ? fgcolor3 : fgcolor, bgcolor, &subitem_width, nullptr); subitem_width += gutter_width; // draw the item left-justified - ui().draw_text_full(container, itemtext, effective_left, line_y, effective_width - subitem_width, + ui().draw_text_full(container, pitem.text, effective_left, line_y, effective_width - subitem_width, JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, &item_width, nullptr); // draw the subitem right-justified - ui().draw_text_full(container, subitem_text, effective_left + item_width, line_y, effective_width - item_width, + ui().draw_text_full(container, pitem.subtext, effective_left + item_width, line_y, effective_width - item_width, JUSTIFY_RIGHT, WRAP_NEVER, DRAW_NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, nullptr, nullptr); } } @@ -1655,7 +1616,6 @@ void menu::draw_select_game(UINT32 flags) for (size_t count = visible_items; count < item.size(); count++) { const menu_item &pitem = item[count]; - const char *itemtext = pitem.text; float line_x0 = x1 + 0.5f * UI_LINE_WIDTH; float line_y0 = line; float line_x1 = x2 - 0.5f * UI_LINE_WIDTH; @@ -1669,9 +1629,9 @@ void menu::draw_select_game(UINT32 flags) // if we're selected, draw with a different background if (count == selected && m_focus == focused_menu::main) { - fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); - bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); - ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(255, 43, 43, 43), + fgcolor = rgb_t(0xff, 0xff, 0x00); + bgcolor = rgb_t(0xff, 0xff, 0xff); + ui().draw_textured_box(container, line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); } // else if the mouse is over this item, draw with a different background @@ -1686,7 +1646,7 @@ void menu::draw_select_game(UINT32 flags) container->add_line(visible_left, line + 0.5f * line_height, visible_left + visible_width, line + 0.5f * line_height, UI_LINE_WIDTH, UI_TEXT_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); else - ui().draw_text_full(container, itemtext, effective_left, line, effective_width, JUSTIFY_CENTER, WRAP_TRUNCATE, + ui().draw_text_full(container, pitem.text, effective_left, line, effective_width, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, nullptr, nullptr); line += line_height; } @@ -1706,8 +1666,7 @@ void menu::draw_select_game(UINT32 flags) visitems = visible_lines - (top_line != 0) - (top_line + visible_lines != visible_items); // reset redraw icon stage - if (!is_swlist) - ui_globals::redraw_icon = false; + if (!is_swlist) ui_globals::redraw_icon = false; // noinput if (noinput) @@ -1764,7 +1723,7 @@ void menu::get_title_search(std::string &snaptext, std::string &searchstr) void menu::handle_main_keys(UINT32 flags) { - bool ignorepause = menu::stack_has_special_main_menu(); + auto ignorepause = menu::stack_has_special_main_menu(); // bail if no items if (item.size() == 0) @@ -1975,9 +1934,9 @@ void menu::handle_main_keys(UINT32 flags) // handle input events for main menu //------------------------------------------------- -void menu::handle_main_events(UINT32 flags) +void menu::handle_main_events() { - bool stop = false; + auto stop = false; ui_event local_menu_event; if (m_pressed) @@ -1985,8 +1944,8 @@ void menu::handle_main_events(UINT32 flags) bool pressed = mouse_pressed(); INT32 m_target_x, m_target_y; bool m_button; - render_target *mouse_target = machine().ui_input().find_mouse(&m_target_x, &m_target_y, &m_button); - if (mouse_target != nullptr && m_button && (hover == HOVER_ARROW_DOWN || hover == HOVER_ARROW_UP)) + auto mouse_target = machine().ui_input().find_mouse(&m_target_x, &m_target_y, &m_button); + if (mouse_target && m_button && (hover == HOVER_ARROW_DOWN || hover == HOVER_ARROW_UP)) { if (pressed) machine().ui_input().push_mouse_down_event(mouse_target, m_target_x, m_target_y); @@ -2181,7 +2140,7 @@ void menu::handle_main_events(UINT32 flags) float menu::draw_right_box_title(float x1, float y1, float x2, float y2) { - float line_height = ui().get_line_height(); + auto line_height = ui().get_line_height(); float midl = (x2 - x1) * 0.5f; // add outlined box for options @@ -2198,7 +2157,7 @@ float menu::draw_right_box_title(float x1, float y1, float x2, float y2) float text_size = 1.0f; for (auto & elem : buffer) { - float textlen = ui().get_string_width(elem.c_str()) + 0.01f; + auto textlen = ui().get_string_width(elem.c_str()) + 0.01f; float tmp_size = (textlen > midl) ? (midl / textlen) : 1.0f; text_size = MIN(text_size, tmp_size); } @@ -2228,10 +2187,10 @@ float menu::draw_right_box_title(float x1, float y1, float x2, float y2) if (m_focus == focused_menu::righttop && ui_globals::rpanel == cells) { - fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); - bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); + fgcolor = rgb_t(0xff, 0xff, 0x00); + bgcolor = rgb_t(0xff, 0xff, 0xff); ui().draw_textured_box(container, x1 + UI_LINE_WIDTH, y1 + UI_LINE_WIDTH, x1 + midl - UI_LINE_WIDTH, y1 + line_height, - bgcolor, rgb_t(255, 43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); + bgcolor, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); } else if (bgcolor == UI_MOUSEOVER_BG_COLOR) container->add_rect(x1 + UI_LINE_WIDTH, y1 + UI_LINE_WIDTH, x1 + midl - UI_LINE_WIDTH, y1 + line_height, @@ -2251,11 +2210,11 @@ float menu::draw_right_box_title(float x1, float y1, float x2, float y2) std::string menu::arts_render_common(float origx1, float origy1, float origx2, float origy2) { - float line_height = ui().get_line_height(); + auto line_height = ui().get_line_height(); std::string snaptext, searchstr; - float title_size = 0.0f; - float txt_lenght = 0.0f; - float gutter_width = 0.4f * line_height * machine().render().ui_aspect() * 1.3f; + auto title_size = 0.0f; + auto txt_lenght = 0.0f; + auto gutter_width = 0.4f * line_height * machine().render().ui_aspect() * 1.3f; get_title_search(snaptext, searchstr); @@ -2268,8 +2227,8 @@ std::string menu::arts_render_common(float origx1, float origy1, float origx2, f title_size = MAX(txt_lenght, title_size); } - rgb_t fgcolor = (m_focus == focused_menu::rightbottom) ? rgb_t(0xff, 0xff, 0xff, 0x00) : UI_TEXT_COLOR; - rgb_t bgcolor = (m_focus == focused_menu::rightbottom) ? rgb_t(0xff, 0xff, 0xff, 0xff) : UI_TEXT_BG_COLOR; + rgb_t fgcolor = (m_focus == focused_menu::rightbottom) ? rgb_t(0xff, 0xff, 0x00) : UI_TEXT_COLOR; + rgb_t bgcolor = (m_focus == focused_menu::rightbottom) ? rgb_t(0xff, 0xff, 0xff) : UI_TEXT_BG_COLOR; float middle = origx2 - origx1; // check size @@ -2279,7 +2238,7 @@ std::string menu::arts_render_common(float origx1, float origy1, float origx2, f if (bgcolor != UI_TEXT_BG_COLOR) ui().draw_textured_box(container, origx1 + ((middle - title_size) * 0.5f), origy1, origx1 + ((middle + title_size) * 0.5f), - origy1 + line_height, bgcolor, rgb_t(255, 43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); + origy1 + line_height, bgcolor, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); ui().draw_text_full(container, snaptext.c_str(), origx1, origy1, origx2 - origx1, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, nullptr, nullptr, tmp_size); @@ -2350,7 +2309,7 @@ void menu::draw_toolbar(float x1, float y1, float x2, float y2, bool software) // perform rendering of image //------------------------------------------------- -void menu::arts_render_images(bitmap_argb32 *tmp_bitmap, float origx1, float origy1, float origx2, float origy2, bool software) +void menu::arts_render_images(bitmap_argb32 *tmp_bitmap, float origx1, float origy1, float origx2, float origy2) { bool no_available = false; float line_height = ui().get_line_height(); @@ -2461,14 +2420,14 @@ void menu::draw_common_arrow(float origx1, float origy1, float origx2, float ori // set hover if (mouse_hit && ar_x0 <= mouse_x && ar_x1 > mouse_x && ar_y0 <= mouse_y && ar_y1 > mouse_y && current != dmax) { - ui().draw_textured_box(container, ar_x0 + 0.01f, ar_y0, ar_x1 - 0.01f, ar_y1, UI_MOUSEOVER_BG_COLOR, rgb_t(255, 43, 43, 43), + ui().draw_textured_box(container, ar_x0 + 0.01f, ar_y0, ar_x1 - 0.01f, ar_y1, UI_MOUSEOVER_BG_COLOR, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); hover = HOVER_UI_RIGHT; fgcolor_right = UI_MOUSEOVER_COLOR; } else if (mouse_hit && al_x0 <= mouse_x && al_x1 > mouse_x && al_y0 <= mouse_y && al_y1 > mouse_y && current != dmin) { - ui().draw_textured_box(container, al_x0 + 0.01f, al_y0, al_x1 - 0.01f, al_y1, UI_MOUSEOVER_BG_COLOR, rgb_t(255, 43, 43, 43), + ui().draw_textured_box(container, al_x0 + 0.01f, al_y0, al_x1 - 0.01f, al_y1, UI_MOUSEOVER_BG_COLOR, rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); hover = HOVER_UI_LEFT; fgcolor_left = UI_MOUSEOVER_COLOR; @@ -2603,7 +2562,7 @@ void menu::info_arrow(int ub, float origx1, float origx2, float oy1, float line_ if (mouse_hit && origx1 <= mouse_x && origx2 > mouse_x && oy1 <= mouse_y && oy1 + (line_height * text_size) > mouse_y) { ui().draw_textured_box(container, origx1 + 0.01f, oy1, origx2 - 0.01f, oy1 + (line_height * text_size), UI_MOUSEOVER_BG_COLOR, - rgb_t(255, 43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); + rgb_t(43, 43, 43), hilight_main_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); hover = (!ub) ? HOVER_DAT_UP : HOVER_DAT_DOWN; fgcolor = UI_MOUSEOVER_COLOR; } diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index cf68cbcea75..e053409114f 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -268,7 +268,7 @@ protected: const event *process(UINT32 flags, float x0 = 0.0f, float y0 = 0.0f); void process_parent() { m_parent->process(PROCESS_NOINPUT); } - bool is_focus(focused_menu focus) const { return m_focus == focus; } + focused_menu get_focus() const { return m_focus; } void set_focus(focused_menu focus) { m_focus = focus; } // draw right box @@ -280,7 +280,7 @@ protected: // images render std::string arts_render_common(float origx1, float origy1, float origx2, float origy2); - void arts_render_images(bitmap_argb32 *bitmap, float origx1, float origy1, float origx2, float origy2, bool software); + void arts_render_images(bitmap_argb32 *bitmap, float origx1, float origy1, float origx2, float origy2); // draw header and footer text void extra_text_render(float top, float bottom, float origx1, float origy1, float origx2, float origy2, const char *header, const char *footer); @@ -345,7 +345,7 @@ private: void handle_main_keys(UINT32 flags); // handle mouse - void handle_main_events(UINT32 flags); + void handle_main_events(); void draw_icon(int linenum, void *selectedref, float x1, float y1); void extra_text_draw_box(float origx1, float origx2, float origy, float yspan, const char *text, int direction); diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index a5da1ec9d6b..02be6a20614 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -821,7 +821,6 @@ void menu_machine_configure::custom_render(void *selectedref, float top, float b // compute our bounds float x1 = 0.5f - 0.5f * maxwidth; -// float x1 = origx1; float x2 = x1 + maxwidth; float y1 = origy1 - top; float y2 = origy1 - UI_BOX_TB_BORDER; diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index 0d59c9e20d3..e53164433ed 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -217,14 +217,14 @@ void menu_select_game::handle() else if (menu_event->iptkey == IPT_UI_SELECT) { // handle selections - if (is_focus(focused_menu::main)) + if (get_focus() == focused_menu::main) { if (isfavorite()) inkey_select_favorite(menu_event); else inkey_select(menu_event); } - else if (is_focus(focused_menu::left)) + else if (get_focus() == focused_menu::left) { l_hover = highlight; check_filter = true; @@ -422,7 +422,7 @@ void menu_select_game::handle() inkey_special(menu_event); } else if (menu_event->iptkey == IPT_UI_CONFIGURE) - inkey_configure(menu_event); + inkey_navigation(); else if (menu_event->iptkey == IPT_OTHER) { @@ -440,7 +440,7 @@ void menu_select_game::handle() } else if (menu_event->iptkey == IPT_UI_CONFIGURE) { - inkey_configure(menu_event); + inkey_navigation(); } else if (menu_event->iptkey == IPT_OTHER) { @@ -1241,40 +1241,59 @@ void menu_select_game::inkey_special(const event *menu_event) } -void menu_select_game::inkey_configure(const event *menu_event) +void menu_select_game::inkey_navigation() { - if (is_focus(focused_menu::main)) + switch (get_focus()) { - if (selected <= visible_items) - { - m_prev_selected = item[selected].ref; - selected = visible_items + 1; - } - else - { - if (ui_globals::panels_status != HIDE_LEFT_PANEL) - set_focus(focused_menu::left); - - else if (ui_globals::panels_status == HIDE_BOTH) + case focused_menu::main: + if (selected <= visible_items) { + m_prev_selected = item[selected].ref; + selected = visible_items + 1; + } + else + { + if (ui_globals::panels_status != HIDE_LEFT_PANEL) + set_focus(focused_menu::left); + + else if (ui_globals::panels_status == HIDE_BOTH) + { + for (int x = 0; x < item.size(); ++x) + if (item[x].ref == m_prev_selected) + selected = x; + } + else + { + set_focus(focused_menu::righttop); + } + } + break; + + case focused_menu::left: + if (ui_globals::panels_status != HIDE_RIGHT_PANEL) + { + set_focus(focused_menu::righttop); + } + else + { + set_focus(focused_menu::main); + if (m_prev_selected == nullptr) + { + selected = 0; + return; + } + for (int x = 0; x < item.size(); ++x) if (item[x].ref == m_prev_selected) selected = x; } - else - { - set_focus(focused_menu::righttop); - } - } - } - else if (is_focus(focused_menu::left)) - { - if (ui_globals::panels_status != HIDE_RIGHT_PANEL) - { - set_focus(focused_menu::righttop); - } - else - { + break; + + case focused_menu::righttop: + set_focus(focused_menu::rightbottom); + break; + + case focused_menu::rightbottom: set_focus(focused_menu::main); if (m_prev_selected == nullptr) { @@ -1285,24 +1304,7 @@ void menu_select_game::inkey_configure(const event *menu_event) for (int x = 0; x < item.size(); ++x) if (item[x].ref == m_prev_selected) selected = x; - } - } - else if (is_focus(focused_menu::righttop)) - { - set_focus(focused_menu::rightbottom); - } - else if (is_focus(focused_menu::rightbottom)) - { - set_focus(focused_menu::main); - if (m_prev_selected == nullptr) - { - selected = 0; - return; - } - - for (int x = 0; x < item.size(); ++x) - if (item[x].ref == m_prev_selected) - selected = x; + break; } } @@ -1865,7 +1867,7 @@ float menu_select_game::draw_left_panel(float x1, float y1, float x2, float y2) menu::highlight(container, x1, y1, x2, y1+ line_height_max, bgcolor); } - if (highlight == filter && is_focus(focused_menu::left)) + if (highlight == filter && get_focus() == focused_menu::left) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -2020,7 +2022,7 @@ void menu_select_game::infos_render(void *selectedref, float origx1, float origy rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; - if (is_focus(focused_menu::rightbottom)) + if (get_focus() == focused_menu::rightbottom) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -2199,7 +2201,7 @@ void menu_select_game::infos_render(void *selectedref, float origx1, float origy rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; - if (is_focus(focused_menu::rightbottom)) + if (get_focus() == focused_menu::rightbottom) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -2407,7 +2409,7 @@ void menu_select_game::arts_render(void *selectedref, float origx1, float origy1 olddriver = driver; ui_globals::switch_image = false; - arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2, false); + arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2); auto_free(machine(), tmp_bitmap); } @@ -2496,7 +2498,7 @@ void menu_select_game::arts_render(void *selectedref, float origx1, float origy1 oldsoft = soft; ui_globals::switch_image = false; - arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2, true); + arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2); auto_free(machine(), tmp_bitmap); } diff --git a/src/frontend/mame/ui/selgame.h b/src/frontend/mame/ui/selgame.h index fc4281d9117..074db944b4c 100644 --- a/src/frontend/mame/ui/selgame.h +++ b/src/frontend/mame/ui/selgame.h @@ -81,7 +81,7 @@ private: void inkey_select_favorite(const event *menu_event); void inkey_special(const event *menu_event); void inkey_export(); - void inkey_configure(const event *menu_event); + void inkey_navigation(); }; } // namespace ui diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index 2c648ee1edf..3f2b17a54d7 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -184,11 +184,11 @@ void menu_select_software::handle() else if (menu_event->iptkey == IPT_UI_SELECT) { // handle selections - if (is_focus(focused_menu::main)) + if (get_focus() == focused_menu::main) { inkey_select(menu_event); } - else if (is_focus(focused_menu::left)) + else if (get_focus() == focused_menu::left) { l_sw_hover = highlight; check_filter = true; @@ -300,14 +300,14 @@ void menu_select_software::handle() } else if (menu_event->iptkey == IPT_UI_CONFIGURE) - inkey_configure(menu_event); + inkey_navigation(); } if (menu_event && !menu_event->itemref) { if (menu_event->iptkey == IPT_UI_CONFIGURE) { - inkey_configure(menu_event); + inkey_navigation(); } else if (menu_event->iptkey == IPT_UI_LEFT) { @@ -363,7 +363,7 @@ void menu_select_software::handle() // handle UI_DOWN_FILTER highlight++; } - else if (menu_event->iptkey == IPT_OTHER && is_focus(focused_menu::left)) + else if (menu_event->iptkey == IPT_OTHER && get_focus() == focused_menu::left) { l_sw_hover = highlight; check_filter = true; @@ -987,40 +987,59 @@ void menu_select_software::inkey_special(const event *menu_event) } -void menu_select_software::inkey_configure(const event *menu_event) +void menu_select_software::inkey_navigation() { - if (is_focus(focused_menu::main)) + switch (get_focus()) { - if (selected <= visible_items) - { - m_prev_selected = item[selected].ref; - selected = visible_items + 1; - } - else - { - if (ui_globals::panels_status != HIDE_LEFT_PANEL) - set_focus(focused_menu::left); - - else if (ui_globals::panels_status == HIDE_BOTH) + case focused_menu::main: + if (selected <= visible_items) { + m_prev_selected = item[selected].ref; + selected = visible_items + 1; + } + else + { + if (ui_globals::panels_status != HIDE_LEFT_PANEL) + set_focus(focused_menu::left); + + else if (ui_globals::panels_status == HIDE_BOTH) + { + for (int x = 0; x < item.size(); ++x) + if (item[x].ref == m_prev_selected) + selected = x; + } + else + { + set_focus(focused_menu::righttop); + } + } + break; + + case focused_menu::left: + if (ui_globals::panels_status != HIDE_RIGHT_PANEL) + { + set_focus(focused_menu::righttop); + } + else + { + set_focus(focused_menu::main); + if (m_prev_selected == nullptr) + { + selected = 0; + return; + } + for (int x = 0; x < item.size(); ++x) if (item[x].ref == m_prev_selected) selected = x; } - else - { - set_focus(focused_menu::righttop); - } - } - } - else if (is_focus(focused_menu::left)) - { - if (ui_globals::panels_status != HIDE_RIGHT_PANEL) - { - set_focus(focused_menu::righttop); - } - else - { + break; + + case focused_menu::righttop: + set_focus(focused_menu::rightbottom); + break; + + case focused_menu::rightbottom: set_focus(focused_menu::main); if (m_prev_selected == nullptr) { @@ -1031,24 +1050,7 @@ void menu_select_software::inkey_configure(const event *menu_event) for (int x = 0; x < item.size(); ++x) if (item[x].ref == m_prev_selected) selected = x; - } - } - else if (is_focus(focused_menu::righttop)) - { - set_focus(focused_menu::rightbottom); - } - else if (is_focus(focused_menu::rightbottom)) - { - set_focus(focused_menu::main); - if (m_prev_selected == nullptr) - { - selected = 0; - return; - } - - for (int x = 0; x < item.size(); ++x) - if (item[x].ref == m_prev_selected) - selected = x; + break; } } @@ -1446,7 +1448,7 @@ float menu_select_software::draw_left_panel(float x1, float y1, float x2, float hover = phover + filter; } - if (highlight == filter && is_focus(focused_menu::left)) + if (highlight == filter && get_focus() == focused_menu::left) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -1571,7 +1573,7 @@ void menu_select_software::infos_render(void *selectedref, float origx1, float o rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; - if (is_focus(focused_menu::rightbottom)) + if (get_focus() == focused_menu::rightbottom) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -1605,7 +1607,7 @@ void menu_select_software::infos_render(void *selectedref, float origx1, float o rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; - if (is_focus(focused_menu::rightbottom)) + if (get_focus() == focused_menu::rightbottom) { fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); @@ -1767,7 +1769,7 @@ void menu_select_software::arts_render(void *selectedref, float origx1, float or olddriver = driver; ui_globals::switch_image = false; - arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2, false); + arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2); auto_free(machine(), tmp_bitmap); } @@ -1856,7 +1858,7 @@ void menu_select_software::arts_render(void *selectedref, float origx1, float or oldsoft = soft; ui_globals::switch_image = false; - arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2, true); + arts_render_images(tmp_bitmap, origx1, origy1, origx2, origy2); auto_free(machine(), tmp_bitmap); } diff --git a/src/frontend/mame/ui/selsoft.h b/src/frontend/mame/ui/selsoft.h index f5cca6a2ac5..478f7add19d 100644 --- a/src/frontend/mame/ui/selsoft.h +++ b/src/frontend/mame/ui/selsoft.h @@ -61,7 +61,7 @@ private: // handlers void inkey_select(const event *menu_event); void inkey_special(const event *menu_event); - void inkey_configure(const event *menu_event); + void inkey_navigation(); }; class software_parts : public menu diff --git a/src/frontend/mame/ui/simpleselgame.cpp b/src/frontend/mame/ui/simpleselgame.cpp index a29cf56e385..19cbbe5941f 100644 --- a/src/frontend/mame/ui/simpleselgame.cpp +++ b/src/frontend/mame/ui/simpleselgame.cpp @@ -122,7 +122,7 @@ void simple_menu_select_game::handle() inkey_select(menu_event); break; case IPT_UI_CANCEL: - inkey_cancel(menu_event); + inkey_cancel(); break; case IPT_SPECIAL: inkey_special(menu_event); @@ -182,7 +182,7 @@ void simple_menu_select_game::inkey_select(const event *menu_event) // inkey_cancel //------------------------------------------------- -void simple_menu_select_game::inkey_cancel(const event *menu_event) +void simple_menu_select_game::inkey_cancel() { // escape pressed with non-empty text clears the text if (m_search[0] != 0) diff --git a/src/frontend/mame/ui/simpleselgame.h b/src/frontend/mame/ui/simpleselgame.h index 707777937b4..ee185d5b4a6 100644 --- a/src/frontend/mame/ui/simpleselgame.h +++ b/src/frontend/mame/ui/simpleselgame.h @@ -44,7 +44,7 @@ private: // internal methods void build_driver_list(); void inkey_select(const event *menu_event); - void inkey_cancel(const event *menu_event); + void inkey_cancel(); void inkey_special(const event *menu_event); };