mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 13:27:41 -07:00
Merge 47b4df3d63
into 7c1d2a64f4
This commit is contained in:
commit
e30e68e6cf
@ -88,6 +88,8 @@ void DSi_TSC::SetTouchCoords(u16 x, u16 y)
|
||||
TouchX = x;
|
||||
TouchY = y;
|
||||
|
||||
DeltaX = DeltaY = 0;
|
||||
|
||||
u8 oldpress = Bank3Regs[0x0E] & 0x01;
|
||||
|
||||
if (y == 0xFFF)
|
||||
@ -121,6 +123,22 @@ void DSi_TSC::SetTouchCoords(u16 x, u16 y)
|
||||
}
|
||||
}
|
||||
|
||||
void DSi_TSC::MoveTouchCoords(u16 x, u16 y)
|
||||
{
|
||||
if (TSCMode == 0x00) return TSC::MoveTouchCoords(x, y);
|
||||
|
||||
if (Bank3Regs[0x0E] & 0x01)
|
||||
{
|
||||
return SetTouchCoords(x, y);
|
||||
}
|
||||
|
||||
DeltaX = (x << 4) - (TouchX & ~0x8000);
|
||||
DeltaY = (y << 4) - (TouchY & ~0x8000);
|
||||
|
||||
Bank3Regs[0x09] = 0x80;
|
||||
Bank3Regs[0x0E] &= ~0x01;
|
||||
}
|
||||
|
||||
void DSi_TSC::MicInputFrame(const s16* data, int samples)
|
||||
{
|
||||
if (TSCMode == 0x00) return TSC::MicInputFrame(data, samples);
|
||||
@ -162,8 +180,9 @@ void DSi_TSC::Write(u8 val)
|
||||
{
|
||||
// X coordinates
|
||||
|
||||
if (id & 0x01) Data = TouchX >> 8;
|
||||
else Data = TouchX & 0xFF;
|
||||
u16 touchX = TouchX + CreateTouchOffset(DeltaX);
|
||||
if (id & 0x01) Data = touchX >> 8;
|
||||
else Data = touchX & 0xFF;
|
||||
|
||||
TouchX &= 0x7FFF;
|
||||
}
|
||||
@ -171,8 +190,9 @@ void DSi_TSC::Write(u8 val)
|
||||
{
|
||||
// Y coordinates
|
||||
|
||||
if (id & 0x01) Data = TouchY >> 8;
|
||||
else Data = TouchY & 0xFF;
|
||||
u16 touchY = TouchY + CreateTouchOffset(DeltaY);
|
||||
if (id & 0x01) Data = touchY >> 8;
|
||||
else Data = touchY & 0xFF;
|
||||
|
||||
TouchY &= 0x7FFF; // checkme
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ public:
|
||||
void SetMode(u8 mode);
|
||||
|
||||
void SetTouchCoords(u16 x, u16 y) override;
|
||||
void MoveTouchCoords(u16 x, u16 y) override;
|
||||
void MicInputFrame(const s16* data, int samples) override;
|
||||
|
||||
void Write(u8 val) override;
|
||||
|
@ -1122,6 +1122,11 @@ void NDS::TouchScreen(u16 x, u16 y)
|
||||
SPI.GetTSC()->SetTouchCoords(x, y);
|
||||
}
|
||||
|
||||
void NDS::MoveTouch(u16 x, u16 y)
|
||||
{
|
||||
SPI.GetTSC()->MoveTouchCoords(x, y);
|
||||
}
|
||||
|
||||
void NDS::ReleaseScreen()
|
||||
{
|
||||
SPI.GetTSC()->SetTouchCoords(0x000, 0xFFF);
|
||||
|
@ -392,6 +392,7 @@ public: // TODO: Encapsulate the rest of these members
|
||||
bool IsRunning() const noexcept { return Running; }
|
||||
|
||||
void TouchScreen(u16 x, u16 y);
|
||||
void MoveTouch(u16 x, u16 y);
|
||||
void ReleaseScreen();
|
||||
|
||||
void SetKeyMask(u32 mask);
|
||||
|
23
src/SPI.cpp
23
src/SPI.cpp
@ -352,6 +352,12 @@ void PowerMan::Write(u8 val)
|
||||
}
|
||||
|
||||
|
||||
s16 TSC::CreateTouchOffset(s16 delta) const
|
||||
{
|
||||
// 560190 cycles per frame
|
||||
s64 cyclepos = (s64)NDS.GetSysClockCycles(2);
|
||||
return (cyclepos * delta) / 560190;
|
||||
}
|
||||
|
||||
TSC::TSC(melonDS::NDS& nds) : SPIDevice(nds)
|
||||
{
|
||||
@ -392,6 +398,8 @@ void TSC::SetTouchCoords(u16 x, u16 y)
|
||||
TouchX = x;
|
||||
TouchY = y;
|
||||
|
||||
DeltaX = DeltaY = 0;
|
||||
|
||||
if (y == 0xFFF)
|
||||
{
|
||||
// released
|
||||
@ -404,6 +412,17 @@ void TSC::SetTouchCoords(u16 x, u16 y)
|
||||
NDS.KeyInput &= ~(1 << (16+6));
|
||||
}
|
||||
|
||||
void TSC::MoveTouchCoords(u16 x, u16 y)
|
||||
{
|
||||
if (NDS.KeyInput & (1 << (16+6)))
|
||||
{
|
||||
return SetTouchCoords(x, y);
|
||||
}
|
||||
|
||||
DeltaX = (x << 4) - TouchX;
|
||||
DeltaY = (y << 4) - TouchY;
|
||||
}
|
||||
|
||||
void TSC::MicInputFrame(const s16* data, int samples)
|
||||
{
|
||||
if (!data)
|
||||
@ -433,8 +452,8 @@ void TSC::Write(u8 val)
|
||||
|
||||
switch (ControlByte & 0x70)
|
||||
{
|
||||
case 0x10: ConvResult = TouchY; break;
|
||||
case 0x50: ConvResult = TouchX; break;
|
||||
case 0x10: ConvResult = TouchY + CreateTouchOffset(DeltaY); break;
|
||||
case 0x50: ConvResult = TouchX + CreateTouchOffset(DeltaX); break;
|
||||
|
||||
case 0x60:
|
||||
{
|
||||
|
@ -121,6 +121,7 @@ public:
|
||||
virtual void DoSavestate(Savestate* file) override;
|
||||
|
||||
virtual void SetTouchCoords(u16 x, u16 y);
|
||||
virtual void MoveTouchCoords(u16 x, u16 y);
|
||||
virtual void MicInputFrame(const s16* data, int samples);
|
||||
|
||||
virtual void Write(u8 val) override;
|
||||
@ -131,9 +132,12 @@ protected:
|
||||
u16 ConvResult;
|
||||
|
||||
u16 TouchX, TouchY;
|
||||
s16 DeltaX, DeltaY;
|
||||
|
||||
s16 MicBuffer[1024];
|
||||
int MicBufferLen;
|
||||
|
||||
s16 CreateTouchOffset(s16 delta) const;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user