|
35 | 35 |
|
36 | 36 | #include "DSi_NDMA.h"
|
37 | 37 | #include "DSi_I2C.h"
|
| 38 | +#include "DSi_I2S.h" |
38 | 39 | #include "DSi_SD.h"
|
39 | 40 | #include "DSi_AES.h"
|
40 | 41 | #include "DSi_NAND.h"
|
@@ -108,6 +109,7 @@ DSi::DSi(DSiArgs&& args, void* userdata) noexcept :
|
108 | 109 | SDMMC(*this, std::move(args.NANDImage), std::move(args.DSiSDCard)),
|
109 | 110 | SDIO(*this),
|
110 | 111 | I2C(*this),
|
| 112 | + I2S(*this), |
111 | 113 | CamModule(*this),
|
112 | 114 | AES(*this)
|
113 | 115 | {
|
@@ -141,6 +143,7 @@ void DSi::Reset()
|
141 | 143 | for (int i = 0; i < 8; i++) NDMAs[i].Reset();
|
142 | 144 |
|
143 | 145 | I2C.Reset();
|
| 146 | + I2S.Reset(); |
144 | 147 | CamModule.Reset();
|
145 | 148 | DSP.Reset();
|
146 | 149 |
|
@@ -210,6 +213,13 @@ void DSi::CamInputFrame(int cam, const u32* data, int width, int height, bool rg
|
210 | 213 | }
|
211 | 214 | }
|
212 | 215 |
|
| 216 | +void DSi::MicInputFrame(s16* data, int samples) |
| 217 | +{ |
| 218 | + SPI.GetTSC()->MicInputFrame(data, samples); |
| 219 | + I2S.MicInputFrame(data, samples); |
| 220 | + // TODO: Need to send the mic samples to the DSP! |
| 221 | +} |
| 222 | + |
213 | 223 | void DSi::DoSavestateExtra(Savestate* file)
|
214 | 224 | {
|
215 | 225 | file->Section("DSIG");
|
@@ -285,6 +295,7 @@ void DSi::DoSavestateExtra(Savestate* file)
|
285 | 295 | CamModule.DoSavestate(file);
|
286 | 296 | DSP.DoSavestate(file);
|
287 | 297 | I2C.DoSavestate(file);
|
| 298 | + I2S.DoSavestate(file); |
288 | 299 | SDMMC.DoSavestate(file);
|
289 | 300 | SDIO.DoSavestate(file);
|
290 | 301 | }
|
@@ -644,6 +655,8 @@ void DSi::SetupDirectBoot()
|
644 | 655 |
|
645 | 656 | SPI.GetFirmwareMem()->SetupDirectBoot();
|
646 | 657 |
|
| 658 | + I2S.WriteSndExCnt(0x8008, 0xFFFF); |
| 659 | + |
647 | 660 | ARM9.CP15Write(0x100, 0x00056078);
|
648 | 661 | ARM9.CP15Write(0x200, 0x0000004A);
|
649 | 662 | ARM9.CP15Write(0x201, 0x0000004A);
|
@@ -690,6 +703,9 @@ void DSi::SoftReset()
|
690 | 703 |
|
691 | 704 | NDS::MapSharedWRAM(3);
|
692 | 705 |
|
| 706 | + // TODO: is this actually reset? |
| 707 | + I2S.Reset(); |
| 708 | + |
693 | 709 | // TODO: does the DSP get reset? NWRAM doesn't, so I'm assuming no
|
694 | 710 | // *HOWEVER*, the bootrom (which does get rerun) does remap NWRAM, and thus
|
695 | 711 | // the DSP most likely gets reset
|
@@ -2707,8 +2723,16 @@ u8 DSi::ARM7IORead8(u32 addr)
|
2707 | 2723 | case 0x04004D07: if (SCFG_BIOS & (1<<10)) return 0; return SDMMC.GetNAND()->GetConsoleID() >> 56;
|
2708 | 2724 | case 0x04004D08: return 0;
|
2709 | 2725 |
|
2710 |
| - case 0x4004700: return DSP.ReadSNDExCnt() & 0xFF; |
2711 |
| - case 0x4004701: return DSP.ReadSNDExCnt() >> 8; |
| 2726 | + case 0x4004600: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicCnt() & 0xFF; |
| 2727 | + case 0x4004601: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicCnt() >> 8; |
| 2728 | + case 0x4004602: return 0; |
| 2729 | + case 0x4004603: return 0; |
| 2730 | + case 0x4004604: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicData() & 0xFF; |
| 2731 | + case 0x4004605: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return (I2S.ReadMicData() >> 8) & 0xFF; |
| 2732 | + case 0x4004606: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return (I2S.ReadMicData() >> 16) & 0xFF; |
| 2733 | + case 0x4004607: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicData() >> 24; |
| 2734 | + case 0x4004700: if (!(SCFG_EXT[1] & (1 << 21))) return 0; return I2S.ReadSndExCnt() & 0xFF; |
| 2735 | + case 0x4004701: if (!(SCFG_EXT[1] & (1 << 21))) return 0; return I2S.ReadSndExCnt() >> 8; |
2712 | 2736 |
|
2713 | 2737 | case 0x04004C00: return GPIO_Data;
|
2714 | 2738 | case 0x04004C01: return GPIO_Dir;
|
@@ -2751,7 +2775,11 @@ u16 DSi::ARM7IORead16(u32 addr)
|
2751 | 2775 | case 0x04004D06: if (SCFG_BIOS & (1<<10)) return 0; return SDMMC.GetNAND()->GetConsoleID() >> 48;
|
2752 | 2776 | case 0x04004D08: return 0;
|
2753 | 2777 |
|
2754 |
| - case 0x4004700: return DSP.ReadSNDExCnt(); |
| 2778 | + case 0x4004600: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicCnt(); |
| 2779 | + case 0x4004602: return 0; |
| 2780 | + case 0x4004604: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicData() >> 16; |
| 2781 | + case 0x4004606: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicData() & 0xFFFF; |
| 2782 | + case 0x4004700: if (!(SCFG_EXT[1] & (1 << 21))) return 0; return I2S.ReadSndExCnt(); |
2755 | 2783 |
|
2756 | 2784 | case 0x04004C00: return GPIO_Data | ((u16)GPIO_Dir << 8);
|
2757 | 2785 | case 0x04004C02: return GPIO_IEdgeSel | ((u16)GPIO_IE << 8);
|
@@ -2829,9 +2857,9 @@ u32 DSi::ARM7IORead32(u32 addr)
|
2829 | 2857 | case 0x04004D04: if (SCFG_BIOS & (1<<10)) return 0; return SDMMC.GetNAND()->GetConsoleID() >> 32;
|
2830 | 2858 | case 0x04004D08: return 0;
|
2831 | 2859 |
|
2832 |
| - case 0x4004700: |
2833 |
| - Log(LogLevel::Debug, "32-Bit SNDExCnt read? %08X\n", ARM7.R[15]); |
2834 |
| - return DSP.ReadSNDExCnt(); |
| 2860 | + case 0x4004600: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicCnt(); |
| 2861 | + case 0x4004604: if (!(SCFG_EXT[1] & (1 << 20))) return 0; return I2S.ReadMicData(); |
| 2862 | + case 0x4004700: if (!(SCFG_EXT[1] & (1 << 21))) return 0; return I2S.ReadSndExCnt(); |
2835 | 2863 | }
|
2836 | 2864 |
|
2837 | 2865 | if (addr >= 0x04004800 && addr < 0x04004A00)
|
@@ -2884,11 +2912,25 @@ void DSi::ARM7IOWrite8(u32 addr, u8 val)
|
2884 | 2912 | case 0x04004500: I2C.WriteData(val); return;
|
2885 | 2913 | case 0x04004501: I2C.WriteCnt(val); return;
|
2886 | 2914 |
|
| 2915 | + case 0x4004600: |
| 2916 | + if (!(SCFG_EXT[1] & (1 << 20))) |
| 2917 | + return; |
| 2918 | + I2S.WriteMicCnt((u16)val, 0xFF); |
| 2919 | + return; |
| 2920 | + case 0x4004601: |
| 2921 | + if (!(SCFG_EXT[1] & (1 << 20))) |
| 2922 | + return; |
| 2923 | + I2S.WriteMicCnt(((u16)val << 8), 0xFF00); |
| 2924 | + return; |
2887 | 2925 | case 0x4004700:
|
2888 |
| - DSP.WriteSNDExCnt((u16)val, 0xFF); |
| 2926 | + if (!(SCFG_EXT[1] & (1 << 21))) |
| 2927 | + return; |
| 2928 | + I2S.WriteSndExCnt((u16)val, 0xFF); |
2889 | 2929 | return;
|
2890 | 2930 | case 0x4004701:
|
2891 |
| - DSP.WriteSNDExCnt(((u16)val << 8), 0xFF00); |
| 2931 | + if (!(SCFG_EXT[1] & (1 << 21))) |
| 2932 | + return; |
| 2933 | + I2S.WriteSndExCnt(((u16)val << 8), 0xFF00); |
2892 | 2934 | return;
|
2893 | 2935 |
|
2894 | 2936 | case 0x04004C00:
|
@@ -2987,8 +3029,15 @@ void DSi::ARM7IOWrite16(u32 addr, u16 val)
|
2987 | 3029 | AES.WriteBlkCnt(val<<16);
|
2988 | 3030 | return;
|
2989 | 3031 |
|
| 3032 | + case 0x4004600: |
| 3033 | + if (!(SCFG_EXT[1] & (1 << 20))) |
| 3034 | + return; |
| 3035 | + I2S.WriteMicCnt(val, 0xFFFF); |
| 3036 | + return; |
2990 | 3037 | case 0x4004700:
|
2991 |
| - DSP.WriteSNDExCnt(val, 0xFFFF); |
| 3038 | + if (!(SCFG_EXT[1] & (1 << 21))) |
| 3039 | + return; |
| 3040 | + I2S.WriteSndExCnt(val, 0xFFFF); |
2992 | 3041 | return;
|
2993 | 3042 |
|
2994 | 3043 | case 0x04004C00:
|
@@ -3136,9 +3185,15 @@ void DSi::ARM7IOWrite32(u32 addr, u32 val)
|
3136 | 3185 | case 0x04004404: AES.WriteBlkCnt(val); return;
|
3137 | 3186 | case 0x04004408: AES.WriteInputFIFO(val); return;
|
3138 | 3187 |
|
| 3188 | + case 0x4004600: |
| 3189 | + if (!(SCFG_EXT[1] & (1 << 20))) |
| 3190 | + return; |
| 3191 | + I2S.WriteMicCnt(val, 0xFFFF); |
| 3192 | + return; |
3139 | 3193 | case 0x4004700:
|
3140 |
| - Log(LogLevel::Debug, "32-Bit SNDExCnt write? %08X %08X\n", val, ARM7.R[15]); |
3141 |
| - DSP.WriteSNDExCnt(val, 0xFFFF); |
| 3194 | + if (!(SCFG_EXT[1] & (1 << 21))) |
| 3195 | + return; |
| 3196 | + I2S.WriteSndExCnt(val, 0xFFFF); |
3142 | 3197 | return;
|
3143 | 3198 | }
|
3144 | 3199 |
|
|
0 commit comments