Skip to content

Commit 9c243aa

Browse files
committed
Compress NRIO DLDI driver to fit in bootstub (without loading from NitroFS)
1 parent d852daa commit 9c243aa

File tree

9 files changed

+1496
-375
lines changed

9 files changed

+1496
-375
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <nds.h>
1+
#include <nds/ndstypes.h>
22

33
TWL_CODE ALIGN(4) unsigned char nrio_dldi[19724] = {
44
0xED, 0xA5, 0x8D, 0xBF, 0x20, 0x43, 0x68, 0x69, 0x73, 0x68, 0x6D, 0x00,

arm9/dldi-include/dldi-include.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
extern unsigned char ak2_dldi[];
55
extern unsigned char r4tf_dldi[];
6-
extern unsigned char nrio_dldi[];
6+
extern unsigned char nrio_lz77[];
77

88
// extern unsigned char dstwo_dldi[];
99
// extern unsigned char ttio_dldi[];

arm9/dldi-include/nrio_lz77.c

Lines changed: 1047 additions & 0 deletions
Large diffs are not rendered by default.

arm9/source/driveOperations.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,35 @@ TWL_CODE void dldiLoadFromBin (const u8 dldiAddr[]) {
350350
dldiRelocateBinary ((data_t*)dldiAddr, dldiSize);
351351
}
352352

353+
TWL_CODE void dldiLoadFromLzss (const u8 dldiLzss[], const u32 len) {
354+
*(u32*)0x02FF8000 = 0x53535A4C;
355+
tonccpy((u32*)0x02FF8004, dldiLzss, len);
356+
357+
u32* dldiAddr = new u32[0x8000/sizeof(u32)];
358+
LZ77_Decompress((u8*)0x02FF8004, (u8*)dldiAddr);
359+
360+
// Check that it is a valid DLDI
361+
if (!dldiIsValid ((DLDI_INTERFACE*)dldiAddr)) {
362+
delete[] dldiAddr;
363+
return;
364+
}
365+
366+
DLDI_INTERFACE* device = (DLDI_INTERFACE*)dldiAddr;
367+
size_t dldiSize;
368+
369+
// Calculate actual size of DLDI
370+
// Although the file may only go to the dldiEnd, the BSS section can extend past that
371+
if (device->dldiEnd > device->bssEnd) {
372+
dldiSize = (char*)device->dldiEnd - (char*)device->dldiStart;
373+
} else {
374+
dldiSize = (char*)device->bssEnd - (char*)device->dldiStart;
375+
}
376+
dldiSize = (dldiSize + 0x03) & ~0x03; // Round up to nearest integer multiple
377+
378+
dldiRelocateBinary ((data_t*)dldiAddr, dldiSize);
379+
delete[] dldiAddr;
380+
}
381+
353382
TWL_CODE bool UpdateCardInfo(char* gameid, char* gamename) {
354383
cardReadHeader((uint8*)0x02000000);
355384
tonccpy(&nds, (void*)0x02000000, sizeof(sNDSHeader));
@@ -416,7 +445,7 @@ TWL_CODE bool twl_flashcardMount(void) {
416445
dldiLoadFromBin(r4tf_dldi);
417446
fatMountSimple("fat", dldiGet());
418447
} else if (!memcmp(gameid, "DSGB", 4)) {
419-
dldiLoadFromBin(nrio_dldi);
448+
dldiLoadFromLzss(nrio_lz77, 0x30DD);
420449
fatMountSimple("fat", dldiGet());
421450
} /* else if (!memcmp(gameid, "ALXX", 4)) { // SuperCard DSTWO
422451
dldiLoadFromBin(dstwo_dldi);

arm9/source/dumpOperations.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "fileOperations.h"
88
#include "font.h"
99
#include "gba.h"
10-
#include "lzss.h"
10+
#include "lzss_enc.h"
1111
#include "main.h"
1212
#include "ndsheaderbanner.h"
1313
#include "read_card.h"

0 commit comments

Comments
 (0)