From a6a9f74acc2fe1c0645dae7b06816d7fc6a67f81 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 4 Aug 2019 11:44:36 +0200 Subject: lay base for DSi-mode TSC --- src/DSi_SPI_TSC.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/DSi_SPI_TSC.cpp (limited to 'src/DSi_SPI_TSC.cpp') diff --git a/src/DSi_SPI_TSC.cpp b/src/DSi_SPI_TSC.cpp new file mode 100644 index 0000000..253cef8 --- /dev/null +++ b/src/DSi_SPI_TSC.cpp @@ -0,0 +1,113 @@ +/* + Copyright 2016-2019 Arisotura + + 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 +#include +#include "DSi.h" +#include "DSi_SPI_TSC.h" + + +namespace DSi_SPI_TSC +{ + +u32 DataPos; +u8 Index; +u8 Mode; +u8 Data; + +u16 TouchX, TouchY; + + +bool Init() +{ + return true; +} + +void DeInit() +{ +} + +void Reset() +{ + DataPos = 0; + + Mode = 0; + Index = 0; + Data = 0; +} + +void DoSavestate(Savestate* file) +{ + /*file->Section("SPTi"); + + file->Var32(&DataPos); + file->Var8(&ControlByte); + file->Var8(&Data); + + file->Var16(&ConvResult);*/ + // TODO!! +} + +void SetTouchCoords(u16 x, u16 y) +{ + TouchX = x; + TouchY = y; + + if (y == 0xFFF) return; + + TouchX <<= 4; + TouchY <<= 4; +} + +void MicInputFrame(s16* data, int samples) +{ + // TODO: forward to DS-mode TSC if needed +} + +u8 Read() +{ + return Data; +} + +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) + { + READWRITE(Mode); + } + else + { + printf("DSi_SPI_TSC: unknown IO, mode=%02X, index=%02X (%02X %s)\n", Mode, Index, Index>>1, (Index&1)?"read":"write"); + } + + Index += (1<<1); // increment index + } + + if (hold) DataPos++; + else DataPos = 0; +} + +} -- cgit v1.2.3 From f897d8c0d760e0e9583910b296901568abce6b90 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 4 Aug 2019 12:13:01 +0200 Subject: touchscreen input, somewhat it's off, need to patch the calibration data --- src/DSi_SPI_TSC.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 5 deletions(-) (limited to 'src/DSi_SPI_TSC.cpp') diff --git a/src/DSi_SPI_TSC.cpp b/src/DSi_SPI_TSC.cpp index 253cef8..2ec9858 100644 --- a/src/DSi_SPI_TSC.cpp +++ b/src/DSi_SPI_TSC.cpp @@ -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) + { + // released + + // TODO: GBAtek says it can also be 1000 or 3000?? + TouchX = 0x7000; + TouchY = 0x7000; - if (y == 0xFFF) return; + Mode3Regs[0x09] = 0x40; + Mode3Regs[0x0E] |= 0x01; + } + else + { + // pressed - TouchX <<= 4; - TouchY <<= 4; + 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"); -- cgit v1.2.3 From a9f36929e05e40abc9e91567443199b07530638f Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 4 Aug 2019 14:34:33 +0200 Subject: TSC: add backwards-compatibility --- src/DSi_SPI_TSC.cpp | 98 ++++++++++++++++++++++++++++++++++++++--------------- src/NDS.cpp | 4 +-- src/NDS.h | 2 ++ src/SPI.h | 3 ++ 4 files changed, 77 insertions(+), 30 deletions(-) (limited to 'src/DSi_SPI_TSC.cpp') diff --git a/src/DSi_SPI_TSC.cpp b/src/DSi_SPI_TSC.cpp index 2ec9858..507005b 100644 --- a/src/DSi_SPI_TSC.cpp +++ b/src/DSi_SPI_TSC.cpp @@ -19,6 +19,7 @@ #include #include #include "DSi.h" +#include "SPI.h" #include "DSi_SPI_TSC.h" @@ -27,10 +28,11 @@ namespace DSi_SPI_TSC u32 DataPos; u8 Index; -u8 Mode; +u8 Bank; u8 Data; -u8 Mode3Regs[0x80]; +u8 Bank3Regs[0x80]; +u8 TSCMode; u16 TouchX, TouchY; @@ -48,21 +50,23 @@ void Reset() { DataPos = 0; - Mode = 0; + Bank = 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; + memset(Bank3Regs, 0, 0x80); + Bank3Regs[0x02] = 0x18; + Bank3Regs[0x03] = 0x87; + Bank3Regs[0x04] = 0x22; + Bank3Regs[0x05] = 0x04; + Bank3Regs[0x06] = 0x20; + Bank3Regs[0x09] = 0x40; + Bank3Regs[0x0E] = 0xAD; + Bank3Regs[0x0F] = 0xA0; + Bank3Regs[0x10] = 0x88; + Bank3Regs[0x11] = 0x81; + + TSCMode = 0x01; // DSi mode } void DoSavestate(Savestate* file) @@ -79,10 +83,17 @@ void DoSavestate(Savestate* file) 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; TouchY = y; -printf("touching: %d/%d\n", x, y); - u8 oldpress = Mode3Regs[0x0E] & 0x01; + + u8 oldpress = Bank3Regs[0x0E] & 0x01; if (y == 0xFFF) { @@ -92,8 +103,9 @@ printf("touching: %d/%d\n", x, y); TouchX = 0x7000; TouchY = 0x7000; - Mode3Regs[0x09] = 0x40; - Mode3Regs[0x0E] |= 0x01; + Bank3Regs[0x09] = 0x40; + //Bank3Regs[0x09] &= ~0x80; + Bank3Regs[0x0E] |= 0x01; } else { @@ -102,11 +114,12 @@ printf("touching: %d/%d\n", x, y); TouchX <<= 4; TouchY <<= 4; - Mode3Regs[0x09] = 0x80; - Mode3Regs[0x0E] &= ~0x01; + Bank3Regs[0x09] = 0x80; + //Bank3Regs[0x09] |= 0x80; + Bank3Regs[0x0E] &= ~0x01; } - if (oldpress ^ (Mode3Regs[0x0E] & 0x01)) + if (oldpress ^ (Bank3Regs[0x0E] & 0x01)) { TouchX |= 0x8000; TouchY |= 0x8000; @@ -115,16 +128,23 @@ printf("touching: %d/%d\n", x, y); 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() { + if (TSCMode == 0x00) return SPI_TSC::Read(); + return Data; } 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; } if (DataPos == 0) @@ -137,18 +157,18 @@ void Write(u8 val, u32 hold) 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 { 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) { @@ -174,9 +194,31 @@ void Write(u8 val, u32 hold) 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 { - 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 diff --git a/src/NDS.cpp b/src/NDS.cpp index da7f9f9..42b5d9f 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -580,7 +580,7 @@ bool DoSavestate_Scheduler(Savestate* file) } 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; } } @@ -694,7 +694,7 @@ bool DoSavestate(Savestate* file) for (int i = 0; i < 8; i++) DMAs[i]->DoSavestate(file); - file->Var8(&WRAMCnt); + file->Var8(&WRAMCnt); // FIXME!!!!! if (!file->Saving) { diff --git a/src/NDS.h b/src/NDS.h index d391cf7..309b16a 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -163,6 +163,8 @@ extern u8 ARM7BIOS[0x10000]; extern u8 MainRAM[MAIN_RAM_SIZE]; +extern u32 KeyInput; + bool Init(); void DeInit(); void Reset(); diff --git a/src/SPI.h b/src/SPI.h index 44de876..73fd57e 100644 --- a/src/SPI.h +++ b/src/SPI.h @@ -39,6 +39,9 @@ namespace SPI_TSC void SetTouchCoords(u16 x, u16 y); void MicInputFrame(s16* data, int samples); +u8 Read(); +void Write(u8 val, u32 hold); + } namespace SPI -- cgit v1.2.3