touchscreen input, somewhat

it's off, need to patch the calibration data
This commit is contained in:
Arisotura 2019-08-04 12:13:01 +02:00
parent a6a9f74acc
commit f897d8c0d7
1 changed files with 81 additions and 5 deletions

View File

@ -30,6 +30,8 @@ u8 Index;
u8 Mode;
u8 Data;
u8 Mode3Regs[0x80];
u16 TouchX, TouchY;
@ -49,6 +51,18 @@ void Reset()
Mode = 0;
Index = 0;
Data = 0;
memset(Mode3Regs, 0, 0x80);
Mode3Regs[0x02] = 0x18;
Mode3Regs[0x03] = 0x87;
Mode3Regs[0x04] = 0x22;
Mode3Regs[0x05] = 0x04;
Mode3Regs[0x06] = 0x20;
Mode3Regs[0x09] = 0x40;
Mode3Regs[0x0E] = 0xAD;
Mode3Regs[0x0F] = 0xA0;
Mode3Regs[0x10] = 0x88;
Mode3Regs[0x11] = 0x81;
}
void DoSavestate(Savestate* file)
@ -67,11 +81,36 @@ void SetTouchCoords(u16 x, u16 y)
{
TouchX = x;
TouchY = y;
printf("touching: %d/%d\n", x, y);
u8 oldpress = Mode3Regs[0x0E] & 0x01;
if (y == 0xFFF) return;
if (y == 0xFFF)
{
// released
TouchX <<= 4;
TouchY <<= 4;
// TODO: GBAtek says it can also be 1000 or 3000??
TouchX = 0x7000;
TouchY = 0x7000;
Mode3Regs[0x09] = 0x40;
Mode3Regs[0x0E] |= 0x01;
}
else
{
// pressed
TouchX <<= 4;
TouchY <<= 4;
Mode3Regs[0x09] = 0x80;
Mode3Regs[0x0E] &= ~0x01;
}
if (oldpress ^ (Mode3Regs[0x0E] & 0x01))
{
TouchX |= 0x8000;
TouchY |= 0x8000;
}
}
void MicInputFrame(s16* data, int samples)
@ -87,17 +126,54 @@ u8 Read()
void Write(u8 val, u32 hold)
{
#define READWRITE(var) { if (Index & 0x01) Data = var; else var = val; }
printf("TSC: %02X %d\n", val, hold?1:0);
if (DataPos == 0)
{
Index = val;
}
else
{
if ((Index & 0xFE) == 0)
u8 id = Index >> 1;
if (id == 0)
{
READWRITE(Mode);
}
else if (Mode == 0x03)
{
if (Index & 0x01) Data = Mode3Regs[id];
else
{
if (id == 0x0D || id == 0x0E)
Mode3Regs[id] = (Mode3Regs[id] & 0x03) | (val & 0xFC);
}
}
else if ((Mode == 0xFC) && (Index & 0x01))
{
if (id < 0x0B)
{
// X coordinates
if (id & 0x01) Data = TouchX >> 8;
else Data = TouchX & 0xFF;
TouchX &= 0x7FFF;
}
else if (id < 0x15)
{
// Y coordinates
if (id & 0x01) Data = TouchY >> 8;
else Data = TouchY & 0xFF;
TouchY &= 0x7FFF; // checkme
}
else
{
// whatever (TODO)
Data = 0;
}
}
else
{
printf("DSi_SPI_TSC: unknown IO, mode=%02X, index=%02X (%02X %s)\n", Mode, Index, Index>>1, (Index&1)?"read":"write");