Skip to content

Commit

Permalink
Reorganized rom loading code, added argv support
Browse files Browse the repository at this point in the history
  • Loading branch information
Gericom committed Dec 24, 2019
1 parent 6ef2b19 commit b740476
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 152 deletions.
13 changes: 12 additions & 1 deletion arm9/source/gbaBoot.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
#pragma once

enum RomLoadResult
{
ROM_LOAD_RESULT_OK,
ROM_LOAD_RESULT_ROM_READ_ERR,
ROM_LOAD_RESULT_SAVE_CREATE_ERR,
ROM_LOAD_RESULT_SAVE_TOO_SMALL,
ROM_LOAD_RESULT_SAVE_READ_ERR
};

void gbab_setupGfx();
void gbab_setupCache();
void gbab_setupCache();
void gbab_loadFrame(u32 id);
RomLoadResult gbab_loadRom(const char* path);
154 changes: 154 additions & 0 deletions arm9/source/gbaBoot.vram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
#include <nds/arm9/background.h>
#include "vram.h"
#include "vramheap.h"
#include "string.h"
#include "sd_access.h"
#include "settings.h"
#include "cp15.h"
#include "save/Save.h"
#include "crc16.h"
#include "gamePatches.h"
#include "gbaBoot.h"

extern u32 DISPCNT_copy;
Expand Down Expand Up @@ -73,4 +77,154 @@ void gbab_setupCache()
else
regions &= ~(1 << 5);
mpu_setICacheRegions(regions);
}

void gbab_loadFrame(u32 id)
{
char framePath[] = "/_gba/frames/ABCD.bin";
VRAM_I_CR = 0x80; //I to lcdc

framePath[13] = id & 0xFF;
framePath[14] = (id >> 8) & 0xFF;
framePath[15] = (id >> 16) & 0xFF;
framePath[16] = (id >> 24) & 0xFF;

if (f_stat(framePath, NULL) == FR_OK)
f_open(&vram_cd->fil, framePath, FA_OPEN_EXISTING | FA_READ);
else if (f_stat("/_gba/frames/default.bin", NULL) == FR_OK)
f_open(&vram_cd->fil, "/_gba/frames/default.bin", FA_OPEN_EXISTING | FA_READ);
else
{
for(int i = 0; i < 128; i++)
((u32*)0x06200000)[i] = 0;
return;
}

UINT br;
f_read(&vram_cd->fil, (void*)0x02020000, 512, &br);
arm9_memcpy16((u16*)0x06200000, (u16*)0x02020000, 256);
f_read(&vram_cd->fil, (void*)0x02020000, 2048, &br);
arm9_memcpy16((u16*)0x068A3800, (u16*)0x02020000, 1024);
f_read(&vram_cd->fil, (void*)0x02020000, 0x2A00, &br);
arm9_memcpy16((u16*)0x068A0000, (u16*)0x02020000, 0x2A00 >> 1);
f_close(&vram_cd->fil);
}

static RomLoadResult createLoadSave(const char* path, const save_type_t* saveType)
{
if (saveType)
vram_cd->save_work.saveSize = saveType->size;
else
vram_cd->save_work.saveSize = 64 * 1024;
vram_cd->save_work.save_state = SAVE_WORK_STATE_CLEAN;
if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
{
if (saveType && (saveType->type & SAVE_TYPE_TYPE_MASK) == SAVE_TYPE_FLASH)
{
for (int i = 0; i < vram_cd->save_work.saveSize >> 2; i++)
((uint32_t*)MAIN_MEMORY_ADDRESS_SAVE_DATA)[i] = 0xFFFFFFFF;
}
else
{
for (int i = 0; i < vram_cd->save_work.saveSize >> 2; i++)
((uint32_t*)MAIN_MEMORY_ADDRESS_SAVE_DATA)[i] = 0;
}

#ifdef ISNITRODEBUG
vram_cd->save_work.save_enabled = 0;
return ROM_LOAD_RESULT_OK;
#else
if (f_open(&vram_cd->fil, path, FA_CREATE_NEW | FA_WRITE) != FR_OK)
return ROM_LOAD_RESULT_SAVE_CREATE_ERR;

UINT bw;
if (f_write(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_SAVE_DATA, vram_cd->save_work.saveSize, &bw) != FR_OK ||
bw != vram_cd->save_work.saveSize)
return ROM_LOAD_RESULT_SAVE_CREATE_ERR;
f_close(&vram_cd->fil);
if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
return ROM_LOAD_RESULT_SAVE_CREATE_ERR;
#endif
}

if (saveType && (saveType->type & SAVE_TYPE_TYPE_MASK) == SAVE_TYPE_EEPROM && vram_cd->fil.obj.objsize == 512)
vram_cd->save_work.saveSize = 512;

if (vram_cd->fil.obj.objsize < vram_cd->save_work.saveSize)
return ROM_LOAD_RESULT_SAVE_TOO_SMALL;

uint32_t* cluster_table = &vram_cd->save_work.save_fat_table[0];
uint32_t cur_cluster = vram_cd->fil.obj.sclust;
while (cur_cluster >= 2 && cur_cluster != 0xFFFFFFFF)
{
*cluster_table = f_clst2sect(&vram_cd->fatFs, cur_cluster);
cluster_table++;
cur_cluster = f_getFat(&vram_cd->fil, cur_cluster);
}
*cluster_table = 0;

UINT br;
if (f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_SAVE_DATA, vram_cd->save_work.saveSize, &br) != FR_OK ||
br != vram_cd->save_work.saveSize)
return ROM_LOAD_RESULT_SAVE_READ_ERR;
f_close(&vram_cd->fil);

vram_cd->save_work.fat_table_crc = crc16(0xFFFF, vram_cd->save_work.save_fat_table,
sizeof(vram_cd->save_work.save_fat_table));
#ifdef ISNITRODEBUG
vram_cd->save_work.save_enabled = 0;
#else
vram_cd->save_work.save_enabled = 1;
#endif

return ROM_LOAD_RESULT_OK;
}

RomLoadResult gbab_loadRom(const char* path)
{
if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
return ROM_LOAD_RESULT_ROM_READ_ERR;
vram_cd->sd_info.gba_rom_size = vram_cd->fil.obj.objsize;
uint32_t* cluster_table = &vram_cd->gba_rom_cluster_table[0];
uint32_t cur_cluster = vram_cd->fil.obj.sclust;
while (cur_cluster >= 2 && cur_cluster != 0xFFFFFFFF)
{
*cluster_table = f_clst2sect(&vram_cd->fatFs, cur_cluster);
cluster_table++;
cur_cluster = f_getFat(&vram_cd->fil, cur_cluster);
}
UINT br;
if (f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_ROM_DATA, ROM_DATA_LENGTH, &br) != FR_OK)
return ROM_LOAD_RESULT_ROM_READ_ERR;

const save_type_t* saveType = save_findTag();
if (saveType != NULL)
{
if (saveType->patchFunc != NULL)
saveType->patchFunc(saveType);
}

f_close(&vram_cd->fil);

gptc_patchRom();

u32 gameCode = *(u32*)(MAIN_MEMORY_ADDRESS_ROM_DATA + 0xAC);
gbab_loadFrame(gameCode);

char nameBuf[256];
for (int i = 0; i < 256; i++)
{
char c = path[i];
nameBuf[i] = c;
if (c == 0)
break;
}

char* long_name_ptr = strrchr(nameBuf, '.');
long_name_ptr[1] = 's';
long_name_ptr[2] = 'a';
long_name_ptr[3] = 'v';
long_name_ptr[4] = '\0';

return createLoadSave(nameBuf, saveType);
}
5 changes: 1 addition & 4 deletions arm9/source/gui/FileBrowser.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,8 @@ class FileBrowser
CoverLoadState _coverLoadState;
u32 _gameId;

void LoadBios();
void LoadFolder(const char* path);
void CreateLoadSave(const char* path, const save_type_t* saveType);
void LoadFrame(u32 id);
void LoadGame(const char* path, u32 id);
void LoadGame(const char* path);//, u32 id);
void UpdateCover();
void InvalidateCover();
public:
Expand Down
163 changes: 16 additions & 147 deletions arm9/source/gui/FileBrowser.vram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,8 @@
#include "FileBrowserListAdapter.h"
#include "core/InputRepeater.h"
#include "qsort.h"
#include "crc16.h"
#include "save/Save.h"
#include "bios.h"
#include "gamePatches.h"
#include "settings.h"
#include "gbaBoot.h"
#include "FileBrowser.h"

static int compDirEntries(const FILINFO*& dir1, const FILINFO*& dir2)
Expand Down Expand Up @@ -102,156 +99,28 @@ void FileBrowser::LoadFolder(const char* path)
InvalidateCover();
}

void FileBrowser::CreateLoadSave(const char* path, const save_type_t* saveType)
{
if (saveType)
vram_cd->save_work.saveSize = saveType->size;
else
vram_cd->save_work.saveSize = 64 * 1024;
vram_cd->save_work.save_state = SAVE_WORK_STATE_CLEAN;
if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
{
if (saveType && (saveType->type & SAVE_TYPE_TYPE_MASK) == SAVE_TYPE_FLASH)
{
for (int i = 0; i < vram_cd->save_work.saveSize >> 2; i++)
((uint32_t*)MAIN_MEMORY_ADDRESS_SAVE_DATA)[i] = 0xFFFFFFFF;
}
else
{
for (int i = 0; i < vram_cd->save_work.saveSize >> 2; i++)
((uint32_t*)MAIN_MEMORY_ADDRESS_SAVE_DATA)[i] = 0;
}

#ifdef ISNITRODEBUG
vram_cd->save_work.save_enabled = 0;
return;
#else
if (f_open(&vram_cd->fil, path, FA_CREATE_NEW | FA_WRITE) != FR_OK)
_uiContext->FatalError("Error creating save file!");

UINT bw;
if (f_write(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_SAVE_DATA, vram_cd->save_work.saveSize, &bw) != FR_OK ||
bw != vram_cd->save_work.saveSize)
_uiContext->FatalError("Error creating save file!");
f_close(&vram_cd->fil);
if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
_uiContext->FatalError("Error creating save file!");
#endif
}

if (saveType && (saveType->type & SAVE_TYPE_TYPE_MASK) == SAVE_TYPE_EEPROM && vram_cd->fil.obj.objsize == 512)
vram_cd->save_work.saveSize = 512;

if (vram_cd->fil.obj.objsize < vram_cd->save_work.saveSize)
_uiContext->FatalError("Save file too small!");

uint32_t* cluster_table = &vram_cd->save_work.save_fat_table[0];
uint32_t cur_cluster = vram_cd->fil.obj.sclust;
while (cur_cluster >= 2 && cur_cluster != 0xFFFFFFFF)
{
*cluster_table = f_clst2sect(&vram_cd->fatFs, cur_cluster);
cluster_table++;
cur_cluster = f_getFat(&vram_cd->fil, cur_cluster);
}
*cluster_table = 0;

UINT br;
if (f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_SAVE_DATA, vram_cd->save_work.saveSize, &br) != FR_OK ||
br != vram_cd->save_work.saveSize)
_uiContext->FatalError("Error while reading save file!");
f_close(&vram_cd->fil);

vram_cd->save_work.fat_table_crc = crc16(0xFFFF, vram_cd->save_work.save_fat_table,
sizeof(vram_cd->save_work.save_fat_table));
#ifdef ISNITRODEBUG
vram_cd->save_work.save_enabled = 0;
#else
vram_cd->save_work.save_enabled = 1;
#endif
}

void FileBrowser::LoadFrame(u32 id)
{
char framePath[] = "/_gba/frames/ABCD.bin";
VRAM_I_CR = 0x80; //I to lcdc
if(!gEmuSettingFrame)
goto noframe;

framePath[13] = id & 0xFF;
framePath[14] = (id >> 8) & 0xFF;
framePath[15] = (id >> 16) & 0xFF;
framePath[16] = (id >> 24) & 0xFF;

if (f_stat(framePath, NULL) == FR_OK)
f_open(&vram_cd->fil, framePath, FA_OPEN_EXISTING | FA_READ);
else if (f_stat("/_gba/frames/default.bin", NULL) == FR_OK)
f_open(&vram_cd->fil, "/_gba/frames/default.bin", FA_OPEN_EXISTING | FA_READ);
else
goto noframe;

UINT br;
f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_ROM_DATA, 512, &br);
arm9_memcpy16((u16*)0x06200000, (u16*)MAIN_MEMORY_ADDRESS_ROM_DATA, 256);
f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_ROM_DATA, 2048, &br);
arm9_memcpy16((u16*)0x068A3800, (u16*)MAIN_MEMORY_ADDRESS_ROM_DATA, 1024);
f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_ROM_DATA, 0x2A00, &br);
arm9_memcpy16((u16*)0x068A0000, (u16*)MAIN_MEMORY_ADDRESS_ROM_DATA, 0x2A00 >> 1);
return;

noframe:
for(int i = 0; i < 128; i++)
((u32*)0x06200000)[i] = 0;
}

void FileBrowser::LoadGame(const char* path, u32 id)
void FileBrowser::LoadGame(const char* path)//, u32 id)
{
if(_coverLoadState == COVER_LOAD_STATE_LOAD)
f_close(&vram_cd->fil);

LoadFrame(id);

if (f_open(&vram_cd->fil, path, FA_OPEN_EXISTING | FA_READ) != FR_OK)
_uiContext->FatalError("Error while opening rom!");
vram_cd->sd_info.gba_rom_size = vram_cd->fil.obj.objsize;
uint32_t* cluster_table = &vram_cd->gba_rom_cluster_table[0];
uint32_t cur_cluster = vram_cd->fil.obj.sclust;
while (cur_cluster >= 2 && cur_cluster != 0xFFFFFFFF)
{
*cluster_table = f_clst2sect(&vram_cd->fatFs, cur_cluster);
cluster_table++;
cur_cluster = f_getFat(&vram_cd->fil, cur_cluster);
}
UINT br;
if (f_read(&vram_cd->fil, (void*)MAIN_MEMORY_ADDRESS_ROM_DATA, ROM_DATA_LENGTH, &br) != FR_OK)
_uiContext->FatalError("Error while reading rom!");
//gbab_loadFrame(id);

const save_type_t* saveType = save_findTag();
if (saveType != NULL)
switch(gbab_loadRom(path))
{
if (saveType->patchFunc != NULL)
saveType->patchFunc(saveType);
}

f_close(&vram_cd->fil);

gptc_patchRom();

char nameBuf[256];
for (int i = 0; i < 256; i++)
{
char c = path[i];
nameBuf[i] = c;
if (c == 0)
case ROM_LOAD_RESULT_ROM_READ_ERR:
_uiContext->FatalError("Error while reading rom!");
break;
case ROM_LOAD_RESULT_SAVE_CREATE_ERR:
_uiContext->FatalError("Error creating save file!");
break;
case ROM_LOAD_RESULT_SAVE_TOO_SMALL:
_uiContext->FatalError("Save file too small!");
break;
case ROM_LOAD_RESULT_SAVE_READ_ERR:
_uiContext->FatalError("Error while reading save file!");
break;
}

char* long_name_ptr = strrchr(nameBuf, '.');
long_name_ptr[1] = 's';
long_name_ptr[2] = 'a';
long_name_ptr[3] = 'v';
long_name_ptr[4] = '\0';

CreateLoadSave(nameBuf, saveType);
}

static bool loadCover(const char* path)
Expand Down Expand Up @@ -373,7 +242,7 @@ int FileBrowser::Run()
}
else
{
LoadGame(_sortedEntries[_selectedEntry]->fname, _ids[_selectedEntry]);
LoadGame(_sortedEntries[_selectedEntry]->fname);//, _ids[_selectedEntry]);
break;
}
}
Expand Down
Loading

0 comments on commit b740476

Please sign in to comment.