|
@@ -12,6 +12,7 @@
|
|
|
#include "fileops.h"
|
|
|
#include "crc16.h"
|
|
|
#include "memory.h"
|
|
|
+#include "led.h"
|
|
|
|
|
|
uint16_t scan_flat(const char* path) {
|
|
|
DIR dir;
|
|
@@ -34,9 +35,8 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
DIR dir;
|
|
|
FILINFO fno;
|
|
|
FRESULT res;
|
|
|
- int len;
|
|
|
+ uint8_t len;
|
|
|
unsigned char* fn;
|
|
|
- static unsigned char lfn[256];
|
|
|
static unsigned char depth = 0;
|
|
|
static uint16_t crc;
|
|
|
static uint32_t db_tgt;
|
|
@@ -50,12 +50,12 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
|
|
|
if(depth==0) {
|
|
|
crc = 0;
|
|
|
- db_tgt = SRAM_WORK_ADDR+0x200;
|
|
|
- dir_tgt = SRAM_WORK_ADDR+0x100000;
|
|
|
+ db_tgt = SRAM_DB_ADDR+0x10;
|
|
|
+ dir_tgt = SRAM_DIR_ADDR;
|
|
|
dprintf("root dir @%lx\n", dir_tgt);
|
|
|
}
|
|
|
|
|
|
- fno.lfn = lfn;
|
|
|
+ fno.lfn = file_lfn;
|
|
|
numentries=0;
|
|
|
dir_tgt_next=0;
|
|
|
for(pass = 0; pass < 2; pass++) {
|
|
@@ -65,11 +65,11 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
if(dir_tgt_next > dir_end) {
|
|
|
dir_end = dir_tgt_next;
|
|
|
}
|
|
|
- dprintf("path=%s depth=%d ptr=%lx entries=%d next subdir @%lx\n", path, depth, db_tgt, numentries, dir_tgt_next);
|
|
|
- _delay_ms(50);
|
|
|
+// dprintf("path=%s depth=%d ptr=%lx entries=%d next subdir @%lx\n", path, depth, db_tgt, numentries, dir_tgt_next);
|
|
|
+// _delay_ms(50);
|
|
|
if(mkdb) {
|
|
|
- dprintf("d=%d Saving %lX to Address %lX [end]\n", depth, 0L, dir_tgt_next - 4);
|
|
|
- _delay_ms(50);
|
|
|
+// dprintf("d=%d Saving %lX to Address %lX [end]\n", depth, 0L, dir_tgt_next - 4);
|
|
|
+// _delay_ms(50);
|
|
|
sram_writelong(0L, dir_tgt_next - 4);
|
|
|
}
|
|
|
}
|
|
@@ -77,6 +77,7 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
if (res == FR_OK) {
|
|
|
len = strlen((char*)path);
|
|
|
for (;;) {
|
|
|
+ toggle_busy_led();
|
|
|
res = f_readdir(&dir, &fno);
|
|
|
if (res != FR_OK || fno.fname[0] == 0) {
|
|
|
if(pass) {
|
|
@@ -97,21 +98,23 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
dir_tgt_save = dir_tgt;
|
|
|
dir_tgt = dir_tgt_next;
|
|
|
if(mkdb) {
|
|
|
+ uint16_t pathlen = strlen(path);
|
|
|
// write element pointer to current dir structure
|
|
|
- dprintf("d=%d Saving %lX to Address %lX [dir]\n", depth, db_tgt, dir_tgt_save);
|
|
|
- _delay_ms(50);
|
|
|
- sram_writelong(db_tgt, dir_tgt_save);
|
|
|
+// dprintf("d=%d Saving %lX to Address %lX [dir]\n", depth, db_tgt, dir_tgt_save);
|
|
|
+// _delay_ms(50);
|
|
|
+ sram_writelong(db_tgt|((uint32_t)0x80<<24), dir_tgt_save);
|
|
|
// sram_writeblock((uint8_t*)&db_tgt, dir_tgt_save, sizeof(dir_tgt_save));
|
|
|
|
|
|
// save element:
|
|
|
// - path name
|
|
|
// - pointer to sub dir structure
|
|
|
- dprintf(" Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, dir_tgt, path);
|
|
|
- _delay_ms(100);
|
|
|
- sram_writeblock(path, db_tgt, 256);
|
|
|
- sram_writelong(dir_tgt|((uint32_t)0x80<<24), db_tgt+256);
|
|
|
+// dprintf(" Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, dir_tgt, path);
|
|
|
+// _delay_ms(100);
|
|
|
+ sram_writelong(dir_tgt, db_tgt);
|
|
|
+ sram_writebyte(len+1, db_tgt+sizeof(dir_tgt));
|
|
|
+ sram_writeblock(path, db_tgt+sizeof(dir_tgt)+sizeof(len), pathlen + 1);
|
|
|
// sram_writeblock((uint8_t*)&dir_tgt, db_tgt+256, sizeof(dir_tgt));
|
|
|
- db_tgt += 0x200;
|
|
|
+ db_tgt += sizeof(dir_tgt) + sizeof(len) + pathlen + 1;
|
|
|
}
|
|
|
scan_dir(path, mkdb);
|
|
|
dir_tgt = dir_tgt_save + 4;
|
|
@@ -129,6 +132,7 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
snes_romprops_t romprops;
|
|
|
path[len]='/';
|
|
|
strncpy(path+len+1, (char*)fn, sizeof(fs_path)-len);
|
|
|
+ uint16_t pathlen = strlen(path);
|
|
|
switch(type) {
|
|
|
case TYPE_SMC:
|
|
|
file_open_by_filinfo(&fno);
|
|
@@ -140,8 +144,8 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
file_close();
|
|
|
// _delay_ms(30);
|
|
|
// write element pointer to current dir structure
|
|
|
- dprintf("d=%d Saving %lX to Address %lX [file]\n", depth, db_tgt, dir_tgt);
|
|
|
- _delay_ms(50);
|
|
|
+// dprintf("d=%d Saving %lX to Address %lX [file]\n", depth, db_tgt, dir_tgt);
|
|
|
+// _delay_ms(50);
|
|
|
sram_writelong(db_tgt, dir_tgt);
|
|
|
// sram_writeblock((uint8_t*)&db_tgt, dir_tgt, sizeof(db_tgt));
|
|
|
dir_tgt += 4;
|
|
@@ -149,8 +153,9 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
// - SNES header information
|
|
|
// - file name
|
|
|
sram_writeblock((uint8_t*)&romprops, db_tgt, sizeof(romprops));
|
|
|
- sram_writeblock(path, db_tgt + sizeof(romprops), 256);
|
|
|
- db_tgt += 0x200;
|
|
|
+ sram_writebyte(len+1, db_tgt + sizeof(romprops));
|
|
|
+ sram_writeblock(path, db_tgt + sizeof(romprops) + sizeof(len), pathlen + 1);
|
|
|
+ db_tgt += sizeof(romprops) + sizeof(len) + pathlen + 1;
|
|
|
break;
|
|
|
case TYPE_UNKNOWN:
|
|
|
default:
|
|
@@ -175,8 +180,8 @@ uint16_t scan_dir(char* path, char mkdb) {
|
|
|
}
|
|
|
// dprintf("%x\n", crc);
|
|
|
// _delay_ms(50);
|
|
|
- sram_writeblock(&db_tgt, SRAM_WORK_ADDR+4, sizeof(db_tgt));
|
|
|
- sram_writeblock(&dir_end, SRAM_WORK_ADDR+8, sizeof(dir_end));
|
|
|
+ sram_writeblock(&db_tgt, SRAM_DB_ADDR+4, sizeof(db_tgt));
|
|
|
+ sram_writeblock(&dir_end, SRAM_DB_ADDR+8, sizeof(dir_end));
|
|
|
return crc;
|
|
|
}
|
|
|
|
|
@@ -198,7 +203,7 @@ SNES_FTYPE determine_filetype(char* filename) {
|
|
|
}
|
|
|
|
|
|
FRESULT get_db_id(uint16_t* id) {
|
|
|
- file_open("/sd2snes/sd2snes.db", FA_READ);
|
|
|
+ file_open((uint8_t*)"/sd2snes/sd2snes.db", FA_READ);
|
|
|
if(file_res == FR_OK) {
|
|
|
file_readblock(id, 0, 2);
|
|
|
/* XXX */// *id=0xdead;
|