From ea6a61b4fbc4f3b8acbf4f0a3371ecc269636abb Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 15 Oct 2014 04:58:27 +0000 Subject: [PATCH] lynx: automatically rotate the 7 games that used it, yay --- .../Consoles/Atari/lynx/LibLynx.cs | 3 + .../Consoles/Atari/lynx/Lynx.cs | 21 ++++- lynx/cinterface.cpp | 5 ++ lynx/mikie.cpp | 16 +--- lynx/mikie.h | 1 - lynx/system.cpp | 85 +++++++++++++++++- lynx/system.h | 8 +- output/dll/bizlynx.dll | Bin 80384 -> 80896 bytes output/gamedb/gamedb_lynx.txt | 36 ++++---- 9 files changed, 138 insertions(+), 37 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs index ca901f3b89..042ccd8acf 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs @@ -25,6 +25,9 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx [DllImport(dllname, CallingConvention = cc)] public static extern bool Advance(IntPtr s, Buttons buttons, int[] vbuff, short[] sbuff, ref int sbuffsize); + [DllImport(dllname, CallingConvention = cc)] + public static extern void SetRotation(IntPtr s, int value); + [DllImport(dllname, CallingConvention = cc)] public static extern bool GetSaveRamPtr(IntPtr s, out int size, out IntPtr data); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs index 3a9f0b96a4..962aea6f78 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs @@ -99,6 +99,19 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx savebuff = new byte[LibLynx.BinStateSize(Core)]; savebuff2 = new byte[savebuff.Length + 13]; + + int rot = game.OptionPresent("rotate") ? int.Parse(game.OptionValue("rotate")) : 0; + LibLynx.SetRotation(Core, rot); + if ((rot & 1) != 0) + { + BufferWidth = HEIGHT; + BufferHeight = WIDTH; + } + else + { + BufferWidth = WIDTH; + BufferHeight = HEIGHT; + } } catch { @@ -333,10 +346,10 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx public IVideoProvider VideoProvider { get { return this; } } public int[] GetVideoBuffer() { return videobuff; } - public int VirtualWidth { get { return WIDTH; } } - public int VirtualHeight { get { return HEIGHT; } } - public int BufferWidth { get { return WIDTH; } } - public int BufferHeight { get { return HEIGHT; } } + public int VirtualWidth { get { return BufferWidth; } } + public int VirtualHeight { get { return BufferHeight; } } + public int BufferWidth { get; private set; } + public int BufferHeight { get; private set; } public int BackgroundColor { get { return unchecked((int)0xff000000); } } #endregion diff --git a/lynx/cinterface.cpp b/lynx/cinterface.cpp index cf589a73aa..9a303d7e07 100644 --- a/lynx/cinterface.cpp +++ b/lynx/cinterface.cpp @@ -32,6 +32,11 @@ EXPORT void Reset(CSystem *s) s->Reset(); } +EXPORT void SetRotation(CSystem *s, int value) +{ + s->rotate = value; +} + EXPORT int Advance(CSystem *s, int buttons, uint32 *vbuff, int16 *sbuff, int *sbuffsize) { return s->Advance(buttons, vbuff, sbuff, *sbuffsize); diff --git a/lynx/mikie.cpp b/lynx/mikie.cpp index 933b1fa606..75b10da104 100644 --- a/lynx/mikie.cpp +++ b/lynx/mikie.cpp @@ -371,14 +371,14 @@ void CMikie::DisplaySetAttributes() void CMikie::BlankLineSurface() { - uint32* bitmap_tmp = /*mpDisplayCurrent*/ framebuffer + mpDisplayCurrentLine * SCREEN_WIDTH; + uint32* bitmap_tmp = framebuffer + mpDisplayCurrentLine * SCREEN_WIDTH; for (int i = 0; i < SCREEN_WIDTH; i++) bitmap_tmp[i] = 0xff000000; } void CMikie::CopyLineSurface() { - uint32* bitmap_tmp = /*mpDisplayCurrent*/ framebuffer + mpDisplayCurrentLine * SCREEN_WIDTH; + uint32* bitmap_tmp = framebuffer + mpDisplayCurrentLine * SCREEN_WIDTH; for (int loop = 0; loop < SCREEN_WIDTH / 2; loop++) { @@ -487,17 +487,9 @@ uint32 CMikie::DisplayEndOfFrame() BlankLineSurface(); mpDisplayCurrentLine++; } - if (mpDisplayCurrent) - { - std::memcpy(mpDisplayCurrent, framebuffer, sizeof(framebuffer)); - } - else - { - // a game shouldn't be able to get two frames in in the length of time we traverse in a single - // call to advance. what is going on here? - } - mpDisplayCurrent = nullptr; + mSystem.Blit(framebuffer); + mpDisplayCurrentLine = 0; return 0; } diff --git a/lynx/mikie.h b/lynx/mikie.h index fa991e4e74..543a9fd2b4 100644 --- a/lynx/mikie.h +++ b/lynx/mikie.h @@ -217,7 +217,6 @@ public: void Update(); void CheckWrap(); - uint32* mpDisplayCurrent; uint32 mpDisplayCurrentLine; uint32 framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT]; diff --git a/lynx/system.cpp b/lynx/system.cpp index 2635c957fe..be858c507f 100644 --- a/lynx/system.cpp +++ b/lynx/system.cpp @@ -171,7 +171,7 @@ bool CSystem::Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize) // audio start frame mMikie->startTS = start; - mMikie->mpDisplayCurrent = vbuff; + videobuffer = vbuff; while (gSystemCycleCount < target) //while (mMikie->mpDisplayCurrent && gSystemCycleCount - start < 800000) @@ -188,6 +188,89 @@ bool CSystem::Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize) return mSusie->lagged; } +void CSystem::Blit(const uint32 *src) +{ + if (!videobuffer) + { + // a game shouldn't be able to get two frames in in the length of time we traverse in a single + // call to advance. what is going on here? + return; + } + + const int W = 160; + const int H = 102; + + switch (rotate) + { + case 0: + std::memcpy(videobuffer, src, sizeof(uint32) * W * H); + break; + case 1: + { + uint32 *dest = videobuffer + H * (W - 1); + for (int j = 0; j < H; j++) + { + for (int i = 0; i < W; i++) + { + *dest = *src++; + dest -= H; + } + dest += H * W + 1; + } + } + break; + case 2: + { + uint32 *dest = videobuffer + H * W - 1; + for (int i = 0; i < W * H; i++) + { + *dest-- = *src++; + } + } + break; + case 3: + { + uint32 *dest = videobuffer + H - 1; + for (int j = 0; j < H; j++) + { + for (int i = 0; i < W; i++) + { + *dest = *src++; + dest += H; + } + dest -= H * W + 1; + } + } + break; + } + + videobuffer = nullptr; +} + +void CSystem::SetButtonData(uint32 data) +{ + // bit: 7654 + // input DURL + // rot=1 RLUD + // rot=2 UDLR + // rot=3 LRDU + + uint32 newdata; + switch (rotate) + { + case 0: + newdata = data; break; + case 1: + newdata = data & 0xff0f | data >> 3 & 0x0010 | data >> 1 & 0x0020 | data << 2 & 0x00c0; break; + case 2: + newdata = data & 0xff0f | data >> 1 & 0x0050 | data << 1 & 0x00a0; break; + case 3: + newdata = data & 0xff0f | data >> 2 & 0x0030 | data << 1 & 0x0040 | data << 3 & 0x0080; break; + } + + mSusie->SetButtonData(newdata); +} + SYNCFUNC(CSystem) { // mMemMap regenerates the mMemoryHandlers directly on load diff --git a/lynx/system.h b/lynx/system.h index 9502baa5ad..3fa74f7b2a 100644 --- a/lynx/system.h +++ b/lynx/system.h @@ -139,6 +139,8 @@ public: } } + void Blit(const uint32 *src); + bool Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize); bool GetSaveRamPtr(int &size, uint8 *&data) { return mCart->GetSaveRamPtr(size, data); } @@ -191,7 +193,7 @@ public: uint32 PaintSprites() {return mSusie->PaintSprites();}; // Miscellaneous - void SetButtonData(uint32 data) {mSusie->SetButtonData(data);}; + void SetButtonData(uint32 data); // uint32 GetButtonData() {return mSusie->GetButtonData();}; uint8* GetRamPointer() {return mRam->GetRamPointer();}; @@ -216,6 +218,10 @@ public: // frame overflow detection int frameoverflow; + // rotation of the device + int rotate; + // video dest + uint32 *videobuffer; templatevoid SyncState(NewState *ns); }; diff --git a/output/dll/bizlynx.dll b/output/dll/bizlynx.dll index 323854a077430aaa5d5ab3cee3c62a6046560c2f..83c1ac20a87f8b588981d5640cb840f4ac7e1131 100644 GIT binary patch delta 27770 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 CeZJ!W delta 27364 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