TSC: add backwards-compatibility

This commit is contained in:
Arisotura 2019-08-04 14:34:33 +02:00
parent f897d8c0d7
commit a9f36929e0
4 changed files with 77 additions and 30 deletions

View File

@ -19,6 +19,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "DSi.h" #include "DSi.h"
#include "SPI.h"
#include "DSi_SPI_TSC.h" #include "DSi_SPI_TSC.h"
@ -27,10 +28,11 @@ namespace DSi_SPI_TSC
u32 DataPos; u32 DataPos;
u8 Index; u8 Index;
u8 Mode; u8 Bank;
u8 Data; u8 Data;
u8 Mode3Regs[0x80]; u8 Bank3Regs[0x80];
u8 TSCMode;
u16 TouchX, TouchY; u16 TouchX, TouchY;
@ -48,21 +50,23 @@ void Reset()
{ {
DataPos = 0; DataPos = 0;
Mode = 0; Bank = 0;
Index = 0; Index = 0;
Data = 0; Data = 0;
memset(Mode3Regs, 0, 0x80); memset(Bank3Regs, 0, 0x80);
Mode3Regs[0x02] = 0x18; Bank3Regs[0x02] = 0x18;
Mode3Regs[0x03] = 0x87; Bank3Regs[0x03] = 0x87;
Mode3Regs[0x04] = 0x22; Bank3Regs[0x04] = 0x22;
Mode3Regs[0x05] = 0x04; Bank3Regs[0x05] = 0x04;
Mode3Regs[0x06] = 0x20; Bank3Regs[0x06] = 0x20;
Mode3Regs[0x09] = 0x40; Bank3Regs[0x09] = 0x40;
Mode3Regs[0x0E] = 0xAD; Bank3Regs[0x0E] = 0xAD;
Mode3Regs[0x0F] = 0xA0; Bank3Regs[0x0F] = 0xA0;
Mode3Regs[0x10] = 0x88; Bank3Regs[0x10] = 0x88;
Mode3Regs[0x11] = 0x81; Bank3Regs[0x11] = 0x81;
TSCMode = 0x01; // DSi mode
} }
void DoSavestate(Savestate* file) void DoSavestate(Savestate* file)
@ -79,10 +83,17 @@ void DoSavestate(Savestate* file)
void SetTouchCoords(u16 x, u16 y) void SetTouchCoords(u16 x, u16 y)
{ {
if (TSCMode == 0x00)
{
if (y == 0xFFF) NDS::KeyInput |= (1 << (16+6));
else NDS::KeyInput &= ~(1 << (16+6));
return SPI_TSC::SetTouchCoords(x, y);
}
TouchX = x; TouchX = x;
TouchY = y; TouchY = y;
printf("touching: %d/%d\n", x, y);
u8 oldpress = Mode3Regs[0x0E] & 0x01; u8 oldpress = Bank3Regs[0x0E] & 0x01;
if (y == 0xFFF) if (y == 0xFFF)
{ {
@ -92,8 +103,9 @@ printf("touching: %d/%d\n", x, y);
TouchX = 0x7000; TouchX = 0x7000;
TouchY = 0x7000; TouchY = 0x7000;
Mode3Regs[0x09] = 0x40; Bank3Regs[0x09] = 0x40;
Mode3Regs[0x0E] |= 0x01; //Bank3Regs[0x09] &= ~0x80;
Bank3Regs[0x0E] |= 0x01;
} }
else else
{ {
@ -102,11 +114,12 @@ printf("touching: %d/%d\n", x, y);
TouchX <<= 4; TouchX <<= 4;
TouchY <<= 4; TouchY <<= 4;
Mode3Regs[0x09] = 0x80; Bank3Regs[0x09] = 0x80;
Mode3Regs[0x0E] &= ~0x01; //Bank3Regs[0x09] |= 0x80;
Bank3Regs[0x0E] &= ~0x01;
} }
if (oldpress ^ (Mode3Regs[0x0E] & 0x01)) if (oldpress ^ (Bank3Regs[0x0E] & 0x01))
{ {
TouchX |= 0x8000; TouchX |= 0x8000;
TouchY |= 0x8000; TouchY |= 0x8000;
@ -115,16 +128,23 @@ printf("touching: %d/%d\n", x, y);
void MicInputFrame(s16* data, int samples) void MicInputFrame(s16* data, int samples)
{ {
// TODO: forward to DS-mode TSC if needed if (TSCMode == 0x00) return SPI_TSC::MicInputFrame(data, samples);
// otherwise we don't handle mic input
// TODO: handle it where it needs to be
} }
u8 Read() u8 Read()
{ {
if (TSCMode == 0x00) return SPI_TSC::Read();
return Data; return Data;
} }
void Write(u8 val, u32 hold) void Write(u8 val, u32 hold)
{ {
if (TSCMode == 0x00) return SPI_TSC::Write(val, hold);
#define READWRITE(var) { if (Index & 0x01) Data = var; else var = val; } #define READWRITE(var) { if (Index & 0x01) Data = var; else var = val; }
if (DataPos == 0) if (DataPos == 0)
@ -137,18 +157,18 @@ void Write(u8 val, u32 hold)
if (id == 0) if (id == 0)
{ {
READWRITE(Mode); READWRITE(Bank);
} }
else if (Mode == 0x03) else if (Bank == 0x03)
{ {
if (Index & 0x01) Data = Mode3Regs[id]; if (Index & 0x01) Data = Bank3Regs[id];
else else
{ {
if (id == 0x0D || id == 0x0E) if (id == 0x0D || id == 0x0E)
Mode3Regs[id] = (Mode3Regs[id] & 0x03) | (val & 0xFC); Bank3Regs[id] = (Bank3Regs[id] & 0x03) | (val & 0xFC);
} }
} }
else if ((Mode == 0xFC) && (Index & 0x01)) else if ((Bank == 0xFC) && (Index & 0x01))
{ {
if (id < 0x0B) if (id < 0x0B)
{ {
@ -174,9 +194,31 @@ void Write(u8 val, u32 hold)
Data = 0; Data = 0;
} }
} }
else if (Bank == 0xFF)
{
if (id == 0x05)
{
// TSC mode register
// 01: normal (DSi) mode
// 00: compatibility (DS) mode
if (Index & 0x01) Data = TSCMode;
else
{
TSCMode = val;
if (TSCMode == 0x00)
{
printf("DSi_SPI_TSC: DS-compatibility mode\n");
DataPos = 0;
NDS::KeyInput |= (1 << (16+6));
return;
}
}
}
}
else else
{ {
printf("DSi_SPI_TSC: unknown IO, mode=%02X, index=%02X (%02X %s)\n", Mode, Index, Index>>1, (Index&1)?"read":"write"); printf("DSi_SPI_TSC: unknown IO, bank=%02X, index=%02X (%02X %s)\n", Bank, Index, Index>>1, (Index&1)?"read":"write");
} }
Index += (1<<1); // increment index Index += (1<<1); // increment index

View File

@ -580,7 +580,7 @@ bool DoSavestate_Scheduler(Savestate* file)
} }
if (funcid == -1) if (funcid == -1)
{ {
printf("savestate: VERY BAD!!!!! FUNCTION POINTER FOR EVENT %d NOT IN HACKY LIST. CANNOT SAVE. SMACK STAPLEBUTTER.\n", i); printf("savestate: VERY BAD!!!!! FUNCTION POINTER FOR EVENT %d NOT IN HACKY LIST. CANNOT SAVE. SMACK ARISOTURA.\n", i);
return false; return false;
} }
} }
@ -694,7 +694,7 @@ bool DoSavestate(Savestate* file)
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
DMAs[i]->DoSavestate(file); DMAs[i]->DoSavestate(file);
file->Var8(&WRAMCnt); file->Var8(&WRAMCnt); // FIXME!!!!!
if (!file->Saving) if (!file->Saving)
{ {

View File

@ -163,6 +163,8 @@ extern u8 ARM7BIOS[0x10000];
extern u8 MainRAM[MAIN_RAM_SIZE]; extern u8 MainRAM[MAIN_RAM_SIZE];
extern u32 KeyInput;
bool Init(); bool Init();
void DeInit(); void DeInit();
void Reset(); void Reset();

View File

@ -39,6 +39,9 @@ namespace SPI_TSC
void SetTouchCoords(u16 x, u16 y); void SetTouchCoords(u16 x, u16 y);
void MicInputFrame(s16* data, int samples); void MicInputFrame(s16* data, int samples);
u8 Read();
void Write(u8 val, u32 hold);
} }
namespace SPI namespace SPI