diff --git a/snes/const.a65 b/snes/const.a65
index 26b85c6..01fcde6 100644
--- a/snes/const.a65
+++ b/snes/const.a65
@@ -79,12 +79,8 @@ hdma_math_src .byt 1
.byt $00, $e0
.byt 1
.byt $00, $e0
- .byt 1
- .byt $60, $bf
- .byt 8
- .byt $60, $b0
- .byt 1
- .byt $60, $bf
+ .byt 10
+ .byt $20, $f0
.byt 1
.byt $00, $e0
.byt 0
diff --git a/snes/data.a65 b/snes/data.a65
index e045ff6..061c977 100644
--- a/snes/data.a65
+++ b/snes/data.a65
@@ -35,9 +35,24 @@ dma_len .word 0
dma_mode .byt 0
;----------state information----------
-bar_pos .byt 0 ; y position of select bar
+bar_xl .byt 0 ; logical x position of select bar
+bar_yl .byt 0 ; logical y position of select bar
+bar_x .byt 0 ; pixel x position of select bar
+bar_y .byt 0 ; pixel y position of select bar
+bar_w .byt 0 ; bar width
+fd_addr .word 0 ; address of current "file descriptor"
+fd_bank .byt 0 ; bank of current "file descriptor"
+file_path ; assembled current path
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-;----------hdma values in RAM
+;----------hdma tables in WRAM (must be stable when cartridge is cut off)
hdma_pal .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/src/config b/src/config
index a306bd8..d79440d 100644
--- a/src/config
+++ b/src/config
@@ -35,7 +35,7 @@ CONFIG_UART_BAUDRATE=38400
CONFIG_UART_BUF_SHIFT=7
CONFIG_HARDWARE_NAME=sd2snes
CONFIG_SD_AUTO_RETRIES=10
-CONFIG_SD_DATACRC=y
+#CONFIG_SD_DATACRC=y
CONFIG_EEPROM_SIZE=512
CONFIG_EEPROM_OFFSET=512
CONFIG_MAX_PARTITIONS=1
diff --git a/src/filetypes.c b/src/filetypes.c
index 42f8043..394f720 100644
--- a/src/filetypes.c
+++ b/src/filetypes.c
@@ -13,84 +13,144 @@
#include "crc16.h"
#include "memory.h"
+uint16_t scan_flat(const char* path) {
+ DIR dir;
+ FRESULT res;
+ FILINFO fno;
+ fno.lfn = NULL;
+ res = f_opendir(&dir, (unsigned char*)path);
+ uint16_t numentries = 0;
+ if (res == FR_OK) {
+ for (;;) {
+ res = f_readdir(&dir, &fno);
+ if(res != FR_OK || fno.fname[0] == 0)break;
+ numentries++;
+ }
+ }
+ return numentries;
+}
+
uint16_t scan_dir(char* path, char mkdb) {
DIR dir;
FILINFO fno;
FRESULT res;
- int len;
+ int len;
unsigned char* fn;
static unsigned char lfn[256];
static unsigned char depth = 0;
static uint16_t crc;
static uint32_t db_tgt;
+ static uint32_t dir_tgt;
+ uint32_t dir_tgt_save, dir_tgt_next;
+ uint16_t numentries;
+ uint32_t dirsize;
+ uint8_t pass = 0;
+
if(depth==0) {
crc = 0;
- db_tgt = SRAM_WORK_ADDR+0x10;
- }
-// dprintf("path=%s depth=%d ptr=%lx\n", path, depth, db_tgt);
-// _delay_ms(50);
+ db_tgt = SRAM_WORK_ADDR+0x200;
+ dir_tgt = SRAM_WORK_ADDR+0x100000;
+ dprintf("root dir @%lx\n", dir_tgt);
+ }
+
fno.lfn = lfn;
- res = f_opendir(&dir, (unsigned char*)path);
- if (res == FR_OK) {
- len = strlen((char*)path);
- for (;;) {
- res = f_readdir(&dir, &fno);
- if (res != FR_OK || fno.fname[0] == 0) break;
- fn = *fno.lfn ? fno.lfn : fno.fname;
-// dprintf("%s\n", fn);
-// _delay_ms(100);
- if (*fn == '.') continue;
- if (fno.fattrib & AM_DIR) {
- path[len]='/';
- strncpy(path+len+1, (char*)fn, sizeof(fs_path)-len);
- depth++;
- scan_dir(path, mkdb);
- depth--;
- path[len]=0;
-// if (res != FR_OK) {
-// break;
-// }
- } else {
- SNES_FTYPE type = determine_filetype((char*)fn);
- if(type != TYPE_UNKNOWN) {
- if(mkdb) {
- snes_romprops_t romprops;
+ numentries=0;
+ for(pass = 0; pass < 2; pass++) {
+ if(pass) {
+ dprintf("path=%s depth=%d ptr=%lx entries=%d next subdir @%lx\n", path, depth, db_tgt, numentries, numentries*4+dir_tgt);
+ _delay_ms(50);
+ }
+ dirsize = 4*(numentries+1);
+ dir_tgt_next = dir_tgt + dirsize;
+ res = f_opendir(&dir, (unsigned char*)path);
+ if (res == FR_OK) {
+ len = strlen((char*)path);
+ for (;;) {
+ res = f_readdir(&dir, &fno);
+ if (res != FR_OK || fno.fname[0] == 0) break;
+ fn = *fno.lfn ? fno.lfn : fno.fname;
+ // dprintf("%s\n", fn);
+ // _delay_ms(100);
+ if (*fn == '.') continue;
+ if (fno.fattrib & AM_DIR) {
+ numentries++;
+ if(pass) {
path[len]='/';
strncpy(path+len+1, (char*)fn, sizeof(fs_path)-len);
- switch(type) {
- case TYPE_SMC:
- file_open_by_filinfo(&fno);
- if(file_res){
- dprintf("ZOMG NOOOO %d\n", file_res);
- _delay_ms(30);
- }
- smc_id(&romprops);
- file_close();
- dprintf("%lx\n", db_tgt);
-// _delay_ms(30);
- sram_writeblock((uint8_t*)&romprops, db_tgt, sizeof(romprops));
- sram_writeblock(path, db_tgt + sizeof(romprops), 256);
- db_tgt += 0x140;
- break;
- case TYPE_UNKNOWN:
- default:
- break;
+ depth++;
+ dir_tgt_save = dir_tgt;
+ dir_tgt = dir_tgt_next;
+ if(mkdb) {
+ // 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_writeblock((uint8_t*)&db_tgt, dir_tgt_save, sizeof(dir_tgt_save));
+
+ // save element:
+ // - path name
+ // - pointer to sub dir structure
+ sram_writeblock(path, db_tgt, 256);
+ sram_writeblock((uint8_t*)&dir_tgt, db_tgt+256, sizeof(dir_tgt));
+ db_tgt += 0x200;
}
+ scan_dir(path, mkdb);
+ dir_tgt = dir_tgt_save;
+ dir_tgt += 4;
+ depth--;
path[len]=0;
-// dprintf("%s ", path);
-// _delay_ms(30);
}
- unsigned char* sfn = fno.fname;
- while(*sfn != 0) {
- crc += crc16_update(crc, sfn++, 1);
+ } else {
+ SNES_FTYPE type = determine_filetype((char*)fn);
+ if(type != TYPE_UNKNOWN) {
+ numentries++;
+ if(pass) {
+ if(mkdb) {
+ snes_romprops_t romprops;
+ path[len]='/';
+ strncpy(path+len+1, (char*)fn, sizeof(fs_path)-len);
+ switch(type) {
+ case TYPE_SMC:
+ file_open_by_filinfo(&fno);
+ if(file_res){
+ dprintf("ZOMG NOOOO %d\n", file_res);
+ _delay_ms(30);
+ }
+ smc_id(&romprops);
+ 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);
+ sram_writeblock((uint8_t*)&db_tgt, dir_tgt, sizeof(db_tgt));
+ dir_tgt += 4;
+ // save element:
+ // - 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;
+ break;
+ case TYPE_UNKNOWN:
+ default:
+ break;
+ }
+ path[len]=0;
+ // dprintf("%s ", path);
+ // _delay_ms(30);
+ }
+ } else {
+ unsigned char* sfn = fno.fname;
+ while(*sfn != 0) {
+ crc += crc16_update(crc, sfn++, 1);
+ }
+ }
}
+ // dprintf("%s/%s\n", path, fn);
+ // _delay_ms(50);
}
-// dprintf("%s/%s\n", path, fn);
-// _delay_ms(50);
-// _delay_ms(10);
- }
- }
- } else uart_putc(0x30+res);
+ }
+ } else uart_putc(0x30+res);
+ }
// dprintf("%x\n", crc);
// _delay_ms(50);
sram_writeblock(&db_tgt, SRAM_WORK_ADDR+4, sizeof(db_tgt));
diff --git a/src/fpga.c b/src/fpga.c
index 516fc59..a8b53d2 100644
--- a/src/fpga.c
+++ b/src/fpga.c
@@ -6,27 +6,6 @@
FPGA pin mapping
================
- PSM:
- ====
- FPGA AVR dir
- ------------------------
- PROG_B PD3 OUT
- CCLK PD4 OUT
- CS_B PD7 OUT
- INIT_B PB2 IN
- RDWR_B PB3 OUT
-
- D7 PC0 OUT
- D6 PC1 OUT
- D5 PC2 OUT
- D4 PC3 OUT
- D3 PC4 OUT
- D2 PC5 OUT
- D1 PC6 OUT
- D0 PC7 OUT
-
- SSM:
- ====
PROG_B PD3 OUT
CCLK PD4 OUT
INIT_B PD7 IN
@@ -59,22 +38,6 @@ void set_prog_b(uint8_t val) {
}
}
-void set_cs_b(uint8_t val) {
- if(val) {
- PORTD |= _BV(PD7);
- } else {
- PORTD &= ~_BV(PD7);
- }
-}
-
-void set_rdwr_b(uint8_t val) {
- if(val) {
- PORTB |= _BV(PB3);
- } else {
- PORTB &= ~_BV(PB3);
- }
-}
-
void set_cclk(uint8_t val) {
if(val) {
PORTD |= _BV(PD4);
@@ -84,8 +47,6 @@ void set_cclk(uint8_t val) {
}
void fpga_init() {
- DDRB |= _BV(PB3); // PB3 is output
-
DDRD &= ~_BV(PD7); // PD7 is input
DDRC = _BV(PC7); // for FPGA config, PC7 is output
@@ -108,7 +69,7 @@ void fpga_postinit() {
void fpga_pgm(char* filename) {
int MAXRETRIES = 10;
-// int retries = MAXRETRIES;
+ int retries = MAXRETRIES;
do {
set_prog_b(0);
uart_putc('P');
@@ -125,9 +86,6 @@ void fpga_pgm(char* filename) {
uart_putc(0x30+file_res);
return;
}
- // file open successful
- set_cs_b(0);
- set_rdwr_b(0);
for (;;) {
bytes_read = file_read();
@@ -138,7 +96,7 @@ void fpga_pgm(char* filename) {
}
file_close();
_delay_ms(10);
- } while (0); //(!fpga_get_done() && retries--);
+ } while (!fpga_get_done() && retries--);
if(!fpga_get_done()) {
dprintf("FPGA failed to configure after %d tries.\n", MAXRETRIES);
_delay_ms(50);
@@ -146,22 +104,6 @@ void fpga_pgm(char* filename) {
fpga_postinit();
}
-void set_avr_read(uint8_t val) {
- if(val) {
- PORTB |= _BV(PB3);
- } else {
- PORTB &= ~_BV(PB3);
- }
-}
-
-void set_avr_write(uint8_t val) {
- if(val) {
- PORTB |= _BV(PB2);
- } else {
- PORTB &= ~_BV(PB2);
- }
-}
-
void set_avr_ena(uint8_t val) {
if(val) {
PORTD |= _BV(PD7);
@@ -170,34 +112,6 @@ void set_avr_ena(uint8_t val) {
}
}
-void set_avr_nextaddr(uint8_t val) {
- if(val) {
- PORTA |= _BV(PA4);
- } else {
- PORTA &= ~_BV(PA4);
- }
-}
-
-void set_avr_addr_reset(uint8_t val) {
- if(val) {
- PORTA |= _BV(PA5);
- } else {
- PORTA &= ~_BV(PA5);
- }
-}
-
-void set_avr_data(uint8_t data) {
- PORTC = data;
-}
-
-void set_avr_addr_en(uint8_t val) {
- if(val) {
- PORTA |= _BV(PA6);
- } else {
- PORTA &= ~_BV(PA6);
- }
-}
-
void set_avr_mapper(uint8_t val) {
SPI_SS_HIGH();
FPGA_SS_LOW();
diff --git a/src/main.c b/src/main.c
index 59f79d9..c313c32 100644
--- a/src/main.c
+++ b/src/main.c
@@ -127,11 +127,12 @@ int main(void) {
#ifdef CLOCK_PRESCALE
clock_prescale_set(CLOCK_PRESCALE);
#endif
+ set_pwr_led(0);
+ set_busy_led(1);
spi_none();
snes_reset(1);
uart_init();
sei(); // suspected to reset the AVR when inserting an SD card
- set_busy_led(0);
_delay_ms(100);
disk_init();
snes_init();
@@ -158,7 +159,7 @@ int main(void) {
dprintf("curr dir id = %x\n", curr_dir_id);
uint16_t saved_dir_id;
if((get_db_id(&saved_dir_id) != FR_OK) // no database?
- || saved_dir_id != curr_dir_id) { // files changed?
+ || 1 /*saved_dir_id != curr_dir_id*/) { // files changed? // XXX
dprintf("saved dir id = %x\n", saved_dir_id);
_delay_ms(50);
dprintf("rebuilding database...");
diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise
index 4049288..f26bbe1 100644
--- a/verilog/sd2snes/sd2snes.xise
+++ b/verilog/sd2snes/sd2snes.xise
@@ -73,7 +73,7 @@
-
+