diff --git a/src/Makefile b/src/Makefile index 46f029d..e7e6157 100644 --- a/src/Makefile +++ b/src/Makefile @@ -55,7 +55,7 @@ TARGET = $(OBJDIR)/sd2snes # List C source files here. (C dependencies are automatically generated.) -SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c spi.c fileops.c rtc.c fpga.c fpga_spi.c snes.c smc.c memory.c filetypes.c faulthandler.c sort.c crc32.c cic.c cli.c xmodem.c irq.c rle.c sdnative.c msu1.c crc16.c +SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c spi.c fileops.c rtc.c fpga.c fpga_spi.c snes.c smc.c memory.c filetypes.c faulthandler.c sort.c crc32.c cic.c cli.c xmodem.c irq.c rle.c sdnative.c msu1.c crc16.c sysinfo.c # usbcontrol.c usb_hid.c usbhw_lpc.c usbinit.c usbstdreq.c diff --git a/src/cic.c b/src/cic.c index 9d6a75f..efb0d11 100644 --- a/src/cic.c +++ b/src/cic.c @@ -5,11 +5,16 @@ #include "cic.h" char *cicstatenames[4] = { "CIC_OK", "CIC_FAIL", "CIC_PAIR", "CIC_SCIC" }; +char *cicstatefriendly[4] = {"Original or no CIC", "Original CIC(failed)", "SuperCIC enhanced", "SuperCIC detected, not used"}; void print_cic_state() { printf("CIC state: %s\n", get_cic_statename(get_cic_state())); } +inline char *get_cic_statefriendlyname(enum cicstates state) { + return cicstatefriendly[state]; +} + inline char *get_cic_statename(enum cicstates state) { return cicstatenames[state]; } diff --git a/src/cic.h b/src/cic.h index 03e0648..23fd767 100644 --- a/src/cic.h +++ b/src/cic.h @@ -13,6 +13,7 @@ enum cic_region { CIC_NTSC = 0, CIC_PAL }; void print_cic_state(void); char *get_cic_statename(enum cicstates state); +char *get_cic_statefriendlyname(enum cicstates state); enum cicstates get_cic_state(void); void cic_init(int allow_pairmode); diff --git a/src/cli.c b/src/cli.c index 9c0c8e3..7362350 100644 --- a/src/cli.c +++ b/src/cli.c @@ -134,7 +134,7 @@ static int8_t parse_wordlist(char *wordlist) { do { // If current word list character is \0: No match found if (c == 0) { - printf("Unknown word: %s\n",curchar); + printf("Unknown word: %s\n(use ? for help)",curchar); return -1; } diff --git a/src/filetypes.c b/src/filetypes.c index ad91bde..6e03b3d 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -66,6 +66,8 @@ uint32_t scan_dir(char* path, FILINFO* fno_param, char mkdb, uint32_t this_dir_t static uint32_t parent_tgt; static uint32_t dir_end = 0; static uint8_t was_empty = 0; + static uint16_t num_files_total = 0; + static uint16_t num_dirs_total = 0; uint32_t dir_tgt; uint16_t numentries; uint32_t dirsize; @@ -91,6 +93,7 @@ uint32_t scan_dir(char* path, FILINFO* fno_param, char mkdb, uint32_t this_dir_t numentries=0; for(pass = 0; pass < 2; pass++) { if(pass) { + num_dirs_total++; dirsize = 4*(numentries); next_subdir_tgt += dirsize + 4; if(parent_tgt) next_subdir_tgt += 4; @@ -180,6 +183,7 @@ uint32_t scan_dir(char* path, FILINFO* fno_param, char mkdb, uint32_t this_dir_t } else { SNES_FTYPE type = determine_filetype((char*)fn); if(type != TYPE_UNKNOWN) { + num_files_total++; numentries++; if(pass) { if(mkdb) { @@ -250,6 +254,8 @@ uint32_t scan_dir(char* path, FILINFO* fno_param, char mkdb, uint32_t this_dir_t // printf("db_tgt=%lx dir_end=%lx\n", db_tgt, dir_end); sram_writelong(db_tgt, SRAM_DB_ADDR+4); sram_writelong(dir_end, SRAM_DB_ADDR+8); + sram_writeshort(num_files_total, SRAM_DB_ADDR+12); + sram_writeshort(num_dirs_total, SRAM_DB_ADDR+14); return crc; } diff --git a/src/main.c b/src/main.c index 8f961ce..28a3564 100644 --- a/src/main.c +++ b/src/main.c @@ -26,6 +26,7 @@ #include "smc.h" #include "msu1.h" #include "rtc.h" +#include "sysinfo.h" #define EMC0TOGGLE (3<<4) #define MR0R (1<<1) @@ -208,7 +209,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP); sram_writebyte(0x00, SRAM_STATUS_ADDR+SYS_RTC_STATUS); set_fpga_time(get_bcdtime()); } - + sram_memset(SRAM_SYSINFO_ADDR, 13*40, 0x20); printf("SNES GO!\n"); snes_reset(1); delay_ms(1); @@ -243,8 +244,13 @@ printf("PCONP=%lx\n", LPC_SC->PCONP); /* set RTC */ set_bcdtime(btime); set_fpga_time(btime); - cmd=0; /* stay in loop */ + cmd=0; /* stay in menu loop */ break; + case SNES_CMD_SYSINFO: + /* go to sysinfo loop */ + sysinfo_loop(); + cmd=0; /* stay in menu loop */ + break; default: printf("unknown cmd: %d\n", cmd); cmd=0; /* unknown cmd: stay in loop */ diff --git a/src/memory.h b/src/memory.h index 321563d..7ee78e1 100644 --- a/src/memory.h +++ b/src/memory.h @@ -30,19 +30,20 @@ #include #include "smc.h" -#define SRAM_ROM_ADDR (0x000000L) -#define SRAM_SAVE_ADDR (0xE00000L) +#define SRAM_ROM_ADDR (0x000000L) +#define SRAM_SAVE_ADDR (0xE00000L) -#define SRAM_MENU_ADDR (0xE00000L) -#define SRAM_DB_ADDR (0xE40000L) -#define SRAM_DIR_ADDR (0xE10000L) -#define SRAM_CMD_ADDR (0xFF1000L) -#define SRAM_PARAM_ADDR (0xFF1004L) -#define SRAM_STATUS_ADDR (0xFF1100L) -#define SRAM_MENU_SAVE_ADDR (0xFF0000L) -#define SRAM_SCRATCHPAD (0xFFFF00L) -#define SRAM_DIRID (0xFFFFF0L) -#define SRAM_RELIABILITY_SCORE (0x100) +#define SRAM_MENU_ADDR (0xE00000L) +#define SRAM_DB_ADDR (0xE40000L) +#define SRAM_DIR_ADDR (0xE10000L) +#define SRAM_CMD_ADDR (0xFF1000L) +#define SRAM_PARAM_ADDR (0xFF1004L) +#define SRAM_STATUS_ADDR (0xFF1100L) +#define SRAM_SYSINFO_ADDR (0xFF1110L) +#define SRAM_MENU_SAVE_ADDR (0xFF0000L) +#define SRAM_SCRATCHPAD (0xFFFF00L) +#define SRAM_DIRID (0xFFFFF0L) +#define SRAM_RELIABILITY_SCORE (0x100) #define LOADROM_WITH_SRAM (1) #define LOADROM_WITH_RESET (2) diff --git a/src/sdnative.c b/src/sdnative.c index 474ebdb..6d88107 100644 --- a/src/sdnative.c +++ b/src/sdnative.c @@ -111,6 +111,7 @@ uint8_t cmd[6]={0,0,0,0,0,0}; uint8_t rsp[17]; uint8_t csd[17]; +uint8_t cid[17]; uint8_t ccs=0; uint32_t rca; @@ -158,6 +159,17 @@ static uint32_t getbits(void *buffer, uint16_t start, int8_t bits) { return result; } +void sdn_checkinit(BYTE drv) { + if(disk_state == DISK_CHANGED) { + disk_initialize(drv); + } +} + +uint8_t* sdn_getcid() { + sdn_checkinit(0); + return cid; +} + static inline void wiggle_slow_pos(uint16_t times) { while(times--) { delay_us(2); @@ -578,12 +590,6 @@ int acmd_fast(uint8_t cmd, uint32_t param, uint8_t crc, uint8_t* dat, uint8_t* r return cmd_fast(cmd, param, crc, dat, rsp); } -void sdn_checkinit(BYTE drv) { - if(disk_state == DISK_CHANGED) { - disk_initialize(drv); - } -} - int stream_datablock(uint8_t *buf) { // uint8_t datshift=8; int j=512; @@ -887,7 +893,10 @@ DRESULT sdn_initialize(BYTE drv) { } /* record CSD for getinfo */ - cmd_slow(SEND_CSD, rca, 0, NULL, rsp); + cmd_slow(SEND_CSD, rca, 0, NULL, csd); + + /* record CID */ + cmd_slow(SEND_CID, rca, 0, NULL, cid); /* select the card */ if(cmd_slow(SELECT_CARD, rca, 0, NULL, rsp)) { diff --git a/src/sdnative.h b/src/sdnative.h index 636bc37..3deff21 100644 --- a/src/sdnative.h +++ b/src/sdnative.h @@ -24,6 +24,7 @@ DRESULT sdn_write(BYTE drv, const BYTE *buffer, DWORD sector, BYTE count); DRESULT sdn_getinfo(BYTE drv, BYTE page, void *buffer); void sdn_changed(void); +uint8_t* sdn_getcid(void); #endif diff --git a/src/snes.h b/src/snes.h index fa7b762..b8548e3 100644 --- a/src/snes.h +++ b/src/snes.h @@ -29,6 +29,7 @@ #define SNES_CMD_LOADROM (1) #define SNES_CMD_SETRTC (2) +#define SNES_CMD_SYSINFO (3) #define MENU_ERR_OK (0) #define MENU_ERR_NODSP (1)