diff --git a/src/config.h b/src/config.h index 37d4eba..adb6b5d 100644 --- a/src/config.h +++ b/src/config.h @@ -64,6 +64,7 @@ #define FPGA_MCU_RDY_BIT 9 #define QSORT_MAXELEM 2048 +#define SORT_STRLEN 256 #define CLTBL_SIZE 100 #define DIR_FILE_MAX 16380 diff --git a/src/memory.c b/src/memory.c index 50c7ac1..8dd2049 100644 --- a/src/memory.c +++ b/src/memory.c @@ -163,6 +163,19 @@ void sram_readblock(void* buf, uint32_t addr, uint16_t size) { FPGA_DESELECT(); } +void sram_readstrn(void* buf, uint32_t addr, uint16_t size) { + uint16_t count=size; + uint8_t* tgt = buf; + set_mcu_addr(addr); + FPGA_SELECT(); + FPGA_TX_BYTE(0x88); /* READ */ + while(count--) { + FPGA_WAIT_RDY(); + if(!(*(tgt++) = FPGA_RX_BYTE())) break; + } + FPGA_DESELECT(); +} + void sram_writeblock(void* buf, uint32_t addr, uint16_t size) { uint16_t count=size; uint8_t* src = buf; diff --git a/src/memory.h b/src/memory.h index d24fe75..d6815ef 100644 --- a/src/memory.h +++ b/src/memory.h @@ -68,6 +68,7 @@ void sram_writebyte(uint8_t val, uint32_t addr); void sram_writeshort(uint16_t val, uint32_t addr); void sram_writelong(uint32_t val, uint32_t addr); void sram_readblock(void* buf, uint32_t addr, uint16_t size); +void sram_readstrn(void* buf, uint32_t addr, uint16_t size); void sram_readlongblock(uint32_t* buf, uint32_t addr, uint16_t count); void sram_writeblock(void* buf, uint32_t addr, uint16_t size); void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr); diff --git a/src/sort.c b/src/sort.c index 9596f7c..962d62e 100644 --- a/src/sort.c +++ b/src/sort.c @@ -15,7 +15,7 @@ */ uint32_t stat_getstring = 0; -static char sort_str1[21], sort_str2[21]; +static char sort_str1[SORT_STRLEN+1], sort_str2[SORT_STRLEN+1]; uint32_t ptrcache[QSORT_MAXELEM] IN_AHBRAM; /* get element from pointer table in external RAM*/ @@ -71,13 +71,12 @@ void sort_getstring_for_dirent(char *ptr, uint32_t addr) { if(addr & 0x80000000) { /* is directory link, name offset 4 */ leaf_offset = sram_readbyte(addr + 4 + SRAM_MENU_ADDR); - sram_readblock(ptr, addr + 5 + leaf_offset + SRAM_MENU_ADDR, 20); + sram_readstrn(ptr, addr + 5 + leaf_offset + SRAM_MENU_ADDR, SORT_STRLEN); } else { /* is file link, name offset 6 */ leaf_offset = sram_readbyte(addr + 6 + SRAM_MENU_ADDR); - sram_readblock(ptr, addr + 7 + leaf_offset + SRAM_MENU_ADDR, 20); + sram_readstrn(ptr, addr + 7 + leaf_offset + SRAM_MENU_ADDR, SORT_STRLEN); } - ptr[20]=0; } void sort_heapify(uint32_t addr, unsigned int i, unsigned int heapsize)