diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-03-19 18:43:01 +0100 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-03-19 18:43:01 +0100 |
commit | 5a061bc63830e85858264ff684a8008fa17e18b4 (patch) | |
tree | 78f36c4e7ad140cd49aa566b8b4ce2cefb98b47d | |
parent | 8a4ed8f41ca54164fdb335343461ab5f9c3bd87f (diff) |
begin work on wxWidgets+SDL interface
Windows crapo ditched
-rw-r--r-- | melonDS.cbp | 25 | ||||
-rw-r--r-- | src/main.cpp | 272 | ||||
-rw-r--r-- | src/version.h | 27 | ||||
-rw-r--r-- | src/wx/main.cpp | 167 | ||||
-rw-r--r-- | src/wx/main.h | 84 |
5 files changed, 302 insertions, 273 deletions
diff --git a/melonDS.cbp b/melonDS.cbp index 677d023..c838beb 100644 --- a/melonDS.cbp +++ b/melonDS.cbp @@ -7,6 +7,7 @@ <Option compiler="gcc" /> <Build> <Target title="Debug"> + <Option platforms="Windows;" /> <Option output="bin/Debug/melonDS" prefix_auto="1" extension_auto="1" /> <Option object_output="obj/Debug/" /> <Option type="1" /> @@ -20,6 +21,7 @@ </Linker> </Target> <Target title="Release"> + <Option platforms="Windows;" /> <Option output="bin/Release/melonDS" prefix_auto="1" extension_auto="1" /> <Option object_output="obj/Release/" /> <Option type="1" /> @@ -38,6 +40,8 @@ <Add option="-Wall" /> <Add option="-m64" /> <Add option="-fexceptions" /> + <Add option="-I$(TARGET_COMPILER_DIR)/lib/wx/include/msw-unicode-static-3.0 -I$(TARGET_COMPILER_DIR)/include/wx-3.0" /> + <Add option="-D_FILE_OFFSET_BITS=64 -D__WXMSW__ -pipe" /> </Compiler> <Linker> <Add option="-m64" /> @@ -45,6 +49,23 @@ <Add library="wx_baseu-3.0" /> <Add library="wx_mswu_core-3.0" /> <Add library="SDL2" /> + <Add library="png" /> + <Add library="jpeg" /> + <Add library="tiff" /> + <Add library="wxregexu-3.0" /> + <Add library="z" /> + <Add library="rpcrt4" /> + <Add library="oleaut32" /> + <Add library="ole32" /> + <Add library="uuid" /> + <Add library="winspool" /> + <Add library="winmm" /> + <Add library="shell32" /> + <Add library="comctl32" /> + <Add library="comdlg32" /> + <Add library="advapi32" /> + <Add library="wsock32" /> + <Add library="oleacc" /> </Linker> <Unit filename="src/ARM.cpp" /> <Unit filename="src/ARM.h" /> @@ -79,8 +100,10 @@ <Unit filename="src/SPI.h" /> <Unit filename="src/Wifi.cpp" /> <Unit filename="src/Wifi.h" /> - <Unit filename="src/main.cpp" /> <Unit filename="src/types.h" /> + <Unit filename="src/version.h" /> + <Unit filename="src/wx/main.cpp" /> + <Unit filename="src/wx/main.h" /> <Extensions> <code_completion /> <envvars /> diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 3e713da..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* - Copyright 2016-2017 StapleButter - - This file is part of melonDS. - - melonDS is free software: you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation, either version 3 of the License, or (at your option) - any later version. - - melonDS is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with melonDS. If not, see http://www.gnu.org/licenses/. -*/ - -#include <stdio.h> -#include <windows.h> -#include "NDS.h" -#include "GPU.h" - - -#define VERSION "0.1" - - -HINSTANCE instance; -HWND melon; -BITMAPV4HEADER bmp; -bool quit; - -bool touching; - - -LRESULT CALLBACK derpo(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) -{ - switch (msg) - { - case WM_CLOSE: - printf("close\n"); - { - FILE* f = fopen("debug/wram.bin", "wb"); - if (f) - { - for (u32 i = 0x37F8000; i < 0x3808000; i+=4) - { - u32 blarg = NDS::ARM7Read32(i); - fwrite(&blarg, 4, 1, f); - } - fclose(f); - } - f = fopen("debug/arm7vram.bin", "wb"); - if (f) - { - for (u32 i = 0x6000000; i < 0x6040000; i+=4) - { - u32 blarg = NDS::ARM7Read32(i); - fwrite(&blarg, 4, 1, f); - } - fclose(f); - } - f = fopen("debug/mainram.bin", "wb"); - if (f) - { - for (u32 i = 0x2000000; i < 0x2400000; i+=4) - { - u32 blarg = NDS::ARM9Read32(i); - fwrite(&blarg, 4, 1, f); - } - fclose(f); - } - } - PostQuitMessage(0); - return 0; - - case WM_KEYDOWN: - switch (wparam) - { - case VK_RETURN: NDS::PressKey(3); break; - case VK_SPACE: NDS::PressKey(2); break; - case VK_UP: NDS::PressKey(6); break; - case VK_DOWN: NDS::PressKey(7); break; - case VK_LEFT: NDS::PressKey(5); break; - case VK_RIGHT: NDS::PressKey(4); break; - case 'A': NDS::PressKey(0); break; - case 'B': NDS::PressKey(1); break; - case 'X': NDS::PressKey(16); break; - case 'Y': NDS::PressKey(17); break; - case 'L': NDS::PressKey(9); break; - case 'R': NDS::PressKey(8); break; - case 'D': NDS::debug(0); break; - } - return 0; - - case WM_KEYUP: - switch (wparam) - { - case VK_RETURN: NDS::ReleaseKey(3); break; - case VK_SPACE: NDS::ReleaseKey(2); break; - case VK_UP: NDS::ReleaseKey(6); break; - case VK_DOWN: NDS::ReleaseKey(7); break; - case VK_LEFT: NDS::ReleaseKey(5); break; - case VK_RIGHT: NDS::ReleaseKey(4); break; - case 'A': NDS::ReleaseKey(0); break; - case 'B': NDS::ReleaseKey(1); break; - case 'X': NDS::ReleaseKey(16); break; - case 'Y': NDS::ReleaseKey(17); break; - case 'L': NDS::ReleaseKey(9); break; - case 'R': NDS::ReleaseKey(8); break; - } - return 0; - - case WM_LBUTTONDOWN: - if (!touching) - { - s16 x = (s16)(lparam & 0xFFFF); - s16 y = (s16)(lparam >> 16); - - y -= 192; - if (x >= 0 && x < 256 && y >= 0 && y < 192) - { - NDS::TouchScreen(x, y); - NDS::PressKey(16+6); - touching = true; - } - } - return 0; - - case WM_LBUTTONUP: - case WM_NCLBUTTONUP: - if (touching) - { - NDS::ReleaseScreen(); - NDS::ReleaseKey(16+6); - touching = false; - } - return 0; - - case WM_MOUSEMOVE: - if (touching) - { - s16 x = (s16)(lparam & 0xFFFF); - s16 y = (s16)(lparam >> 16); - - y -= 192; - if (x >= 0 && x < 256 && y >= 0 && y < 192) - NDS::TouchScreen(x, y); - } - return 0; - - case WM_PAINT: - { - PAINTSTRUCT partisocialiste; - HDC dc = BeginPaint(window, &partisocialiste); - - SetDIBitsToDevice(dc, 0, 0, 256, 384, 0, 0, 0, 384, GPU::Framebuffer, (BITMAPINFO*)&bmp, DIB_RGB_COLORS); - - EndPaint(window, &partisocialiste); - } - return 0; - } - - return DefWindowProc(window, msg, wparam, lparam); -} - - -int main() -{ - printf("melonDS version uh... 0.1??\n"); - printf("it's a DS emulator!!!\n"); - printf("http://melonds.kuribo64.net/\n"); - quit = false; - touching = false; - - instance = GetModuleHandle(NULL); - - //SetThreadAffinityMask(GetCurrentThread(), 0x8); - - // god this shit sucks - WNDCLASSEX shit; - shit.cbSize = sizeof(shit); - shit.style = CS_HREDRAW | CS_VREDRAW; - shit.lpfnWndProc = derpo; - shit.cbClsExtra = 0; - shit.cbWndExtra = 0; - shit.hInstance = instance; - shit.hIcon = NULL; - shit.hIconSm = NULL; - shit.hCursor = NULL; - shit.hbrBackground = (HBRUSH)(COLOR_WINDOWFRAME+1); - shit.lpszMenuName = NULL; - shit.lpszClassName = "v0ltmeters"; - RegisterClassEx(&shit); - - RECT rekt; - rekt.left = 0; rekt.top = 0; - rekt.right = 256; rekt.bottom = 384; - AdjustWindowRect(&rekt, WS_OVERLAPPEDWINDOW, FALSE); - - melon = CreateWindow("v0ltmeters", - "melonDS " VERSION, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, - rekt.right-rekt.left, rekt.bottom-rekt.top, - NULL, - NULL, - instance, - NULL); - - ShowWindow(melon, SW_SHOW); - - // more sucky shit! - memset(&bmp, 0, sizeof(bmp)); - bmp.bV4Size = sizeof(bmp); - bmp.bV4Width = 256; - bmp.bV4Height = -384; - bmp.bV4Planes = 1; - bmp.bV4BitCount = 32; - bmp.bV4V4Compression = BI_RGB|BI_BITFIELDS; - bmp.bV4RedMask = 0x000000FF; - bmp.bV4GreenMask = 0x0000FF00; - bmp.bV4BlueMask = 0x00FF0000; - - NDS::Init(); - - u32 nframes = 0; - u32 lasttick = GetTickCount(); - - for (;;) - { - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - { - quit = true; - break; - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } - if (quit) break; - - NDS::RunFrame(); - - //HDC dc = GetDC(melon); - //SetDIBitsToDevice(dc, 0, 0, 256, 384, 0, 0, 0, 384, GPU::Framebuffer, (BITMAPINFO*)&bmp, DIB_RGB_COLORS); - InvalidateRect(melon, NULL, false); - UpdateWindow(melon); - - nframes++; - if (nframes >= 30) - { - u32 tick = GetTickCount(); - u32 diff = tick - lasttick; - lasttick = tick; - - u32 fps = (nframes * 1000) / diff; - nframes = 0; - - char melontitle[100]; - sprintf(melontitle, "melonDS " VERSION " | %d FPS", fps); - SetWindowText(melon, melontitle); - } - } - printf("deinit\n"); - NDS::DeInit(); - - return 0; -} diff --git a/src/version.h b/src/version.h new file mode 100644 index 0000000..aa80b51 --- /dev/null +++ b/src/version.h @@ -0,0 +1,27 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef VERSION_H +#define VERSION_H + +#define MELONDS_VERSION "0.1" + +#define MELONDS_URL "http://melonds.kuribo64.net/" + +#endif // VERSION_H + diff --git a/src/wx/main.cpp b/src/wx/main.cpp new file mode 100644 index 0000000..b31af1d --- /dev/null +++ b/src/wx/main.cpp @@ -0,0 +1,167 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include "../types.h" +#include "main.h" +#include "../version.h" +#include "../NDS.h" +#include "../GPU.h" + + +wxIMPLEMENT_APP(wxApp_melonDS); + + +bool wxApp_melonDS::OnInit() +{ + if (SDL_Init(SDL_INIT_EVERYTHING) < 0) + { + printf("SDL shat itself :(\n"); + return 1; + } + + printf("melonDS " MELONDS_VERSION "\n" MELONDS_URL "\n"); + + MainFrame* melon = new MainFrame(); + melon->Show(true); + + return true; +} + + +wxBEGIN_EVENT_TABLE(MainFrame, wxFrame) + EVT_MENU(ID_OPENROM, MainFrame::OnOpenROM) + EVT_PAINT(MainFrame::OnPaint) +wxEND_EVENT_TABLE() + + +MainFrame::MainFrame() + : wxFrame(NULL, wxID_ANY, "melonDS") +{ + wxMenu* filemenu = new wxMenu(); + filemenu->Append(ID_OPENROM, "Open ROM..."); + filemenu->AppendSeparator(); + filemenu->Append(ID_EXIT, "Quit"); + + wxMenu* systemmenu = new wxMenu(); + systemmenu->Append(ID_RUN, "Run"); + systemmenu->Append(ID_PAUSE, "Pause"); + systemmenu->AppendSeparator(); + systemmenu->Append(ID_RESET, "Reset"); + + wxMenuBar* melonbar = new wxMenuBar(); + melonbar->Append(filemenu, "File"); + melonbar->Append(systemmenu, "System"); + + SetMenuBar(melonbar); + + SetClientSize(256, 384); + + emumutex = new wxMutex(); + emucond = new wxCondition(*emumutex); + + emuthread = new EmuThread(this, emumutex, emucond); + if (emuthread->Run() != wxTHREAD_NO_ERROR) + { + printf("thread shat itself :( giving up now\n"); + delete emuthread; + return; + } + + sdlwin = SDL_CreateWindowFrom(GetHandle()); + + sdlrend = SDL_CreateRenderer(sdlwin, -1, SDL_RENDERER_ACCELERATED); // SDL_RENDERER_PRESENTVSYNC + sdltex = SDL_CreateTexture(sdlrend, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STREAMING, 256, 384); +} + +void MainFrame::OnOpenROM(wxCommandEvent& event) +{ + NDS::Init(); + + emuthread->EmuStatus = 1; + emumutex->Lock(); + emucond->Signal(); + emumutex->Unlock(); +} + +void MainFrame::OnPaint(wxPaintEvent& event) +{ + /*wxPaintDC dc(this); + wxGraphicsContext* gc = wxGraphicsContext::Create(dc); + if (!gc) return; + + // + + delete gc;*/ +} + + +EmuThread::EmuThread(MainFrame* parent, wxMutex* mutex, wxCondition* cond) + : wxThread(wxTHREAD_JOINABLE) +{ + this->parent = parent; + this->mutex = mutex; + this->cond = cond; + + EmuStatus = 2; +} + +EmuThread::~EmuThread() +{ +} + +wxThread::ExitCode EmuThread::Entry() +{ + mutex->Lock(); + + for (;;) + { + cond->Wait(); + + if (EmuStatus == 0) + break; + + while (EmuStatus == 1) + { + NDS::RunFrame(); + + SDL_Event evt; + while (SDL_PollEvent(&evt)) + { + if (evt.type == SDL_KEYDOWN) + printf("key down %d %d\n", evt.key.keysym.scancode, evt.key.keysym.sym); + + if (evt.type == SDL_MOUSEBUTTONDOWN) + printf("mouse down\n"); + if (evt.type == SDL_MOUSEBUTTONUP) + printf("mouse up\n"); + } + + void* pixels; int zorp; + SDL_LockTexture(parent->sdltex, NULL, &pixels, &zorp); + memcpy(pixels, GPU::Framebuffer, 256*384*4); + SDL_UnlockTexture(parent->sdltex); + + SDL_SetRenderTarget(parent->sdlrend, parent->sdltex); + SDL_RenderClear(parent->sdlrend); + SDL_RenderCopy(parent->sdlrend, parent->sdltex, NULL, NULL); + SDL_RenderPresent(parent->sdlrend); + } + } + + return (wxThread::ExitCode)0; +} diff --git a/src/wx/main.h b/src/wx/main.h new file mode 100644 index 0000000..0ee41be --- /dev/null +++ b/src/wx/main.h @@ -0,0 +1,84 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef WX_MAIN_H +#define WX_MAIN_H + +#include <wx/wxprec.h> +#ifndef WX_PRECOMP +#include <wx/wx.h> +#endif + +#include <SDL2/SDL.h> + +enum +{ + ID_OPENROM = 1, + ID_EXIT, + + ID_RUN, + ID_PAUSE, + ID_RESET, +}; + +class EmuThread; + +class wxApp_melonDS : public wxApp +{ +public: + virtual bool OnInit(); +}; + +class MainFrame : public wxFrame +{ +public: + MainFrame(); + + SDL_Window* sdlwin; + SDL_Renderer* sdlrend; + SDL_Texture* sdltex; + +private: + wxDECLARE_EVENT_TABLE(); + + void OnOpenROM(wxCommandEvent& event); + + void OnPaint(wxPaintEvent& event); + + EmuThread* emuthread; + wxMutex* emumutex; + wxCondition* emucond; +}; + +class EmuThread : public wxThread +{ +public: + EmuThread(MainFrame* parent, wxMutex* mutex, wxCondition* cond); + ~EmuThread(); + + u32 EmuStatus; + +protected: + virtual ExitCode Entry(); + + MainFrame* parent; + wxMutex* mutex; + wxCondition* cond; +}; + +#endif // WX_MAIN_H |