Browse Source

Firmware: cleanup ROM loading, minor touchups

ikari 13 years ago
parent
commit
cfa78624c9
8 changed files with 71 additions and 52 deletions
  1. 2 0
      src/filetypes.h
  2. 3 18
      src/main.c
  3. 35 25
      src/memory.c
  4. 4 1
      src/memory.h
  5. 8 8
      src/smc.c
  6. 7 0
      src/smc.h
  7. 7 0
      src/snes.c
  8. 5 0
      src/snes.h

+ 2 - 0
src/filetypes.h

@@ -28,6 +28,8 @@
 #define FILETYPES_H
 
 #include "ff.h"
+
+#define SYS_DIR_NAME	((const uint8_t*)"sd2snes")
 typedef enum {
   TYPE_UNKNOWN = 0, /* 0 */
   TYPE_SMC,         /* 1 */

+ 3 - 18
src/main.c

@@ -115,7 +115,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP);
     uint8_t card_go = 0;
     while(!card_go) {
       if(disk_status(0) & (STA_NOINIT|STA_NODISK)) {
-	snes_bootprint("            No Card!            \0");
+	snes_bootprint("        No SD Card found!       \0");
 	while(disk_status(0) & (STA_NOINIT|STA_NODISK));
 	delay_ms(200);
       }
@@ -191,7 +191,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP);
     fpga_pgm((uint8_t*)"/sd2snes/fpga_base.bit");
     fpga_dspx_reset(1);
     uart_putc('(');
-    load_rom((uint8_t*)"/sd2snes/menu.bin", SRAM_MENU_ADDR);
+    load_rom((uint8_t*)"/sd2snes/menu.bin", SRAM_MENU_ADDR, 0);
     /* force memory size + mapper */
     set_rom_mask(0x3fffff);
     set_mapper(0x7);
@@ -236,7 +236,6 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300);
   //sram_hexdump(SRAM_MENU_ADDR, 0x400);
     while(!cmd) {
       cmd=menu_main_loop();
-// cmd = 1;
       printf("cmd: %d\n", cmd);
       sleep_ms(500);
       uart_putc('-');
@@ -244,22 +243,8 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300);
 	case SNES_CMD_LOADROM:
 	  get_selected_name(file_lfn);
 	  set_mcu_ovr(1);
-// strcpy((char*)file_lfn, "/mon.smc");
-
 	  printf("Selected name: %s\n", file_lfn);
-	  filesize = load_rom(file_lfn, SRAM_ROM_ADDR);
-	  if(romprops.ramsize_bytes) {
-	    strcpy(strrchr((char*)file_lfn, (int)'.'), ".srm");
-	    printf("SRM file: %s\n", file_lfn);
-	    load_sram(file_lfn, SRAM_SAVE_ADDR);
-	  } else {
-	    printf("No SRAM\n");
-	  }
-	  set_mcu_ovr(0);
-	  snes_reset(1);
-	  delay_ms(10);
-	  snes_reset(0);
-          fpga_dspx_reset(0);
+	  filesize = load_rom(file_lfn, SRAM_ROM_ADDR, LOADROM_WITH_SRAM | LOADROM_WITH_RESET);
 	  break;
 	case SNES_CMD_SETRTC:
           /* get time from RAM */

+ 35 - 25
src/memory.c

@@ -43,6 +43,7 @@
 #include "diskio.h"
 #include "snesboot.h"
 
+#include <string.h>
 char* hex = "0123456789ABCDEF";
 
 extern snes_romprops_t romprops;
@@ -163,13 +164,14 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) {
   FPGA_DESELECT();
 }
 
-uint32_t load_rom(uint8_t* filename, uint32_t base_addr) {
+uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags) {
   UINT bytes_read;
   DWORD filesize;
   UINT count=0;
-  tick_t tickstmp, ticksstart, ticks_read=0, ticks_tx=0, ticks_total=0;
-ticksstart=getticks();
-printf("%s\n", filename);
+  tick_t ticksstart, ticks_total=0;
+  ticksstart=getticks();
+  printf("%s\n", filename);
+  if(flags & LOADROM_WITH_RESET) set_mcu_ovr(1);
   file_open(filename, FA_READ);
   if(file_res) {
     uart_putc('?');
@@ -181,35 +183,20 @@ printf("%s\n", filename);
   set_mcu_addr(base_addr);
   printf("no nervous breakdown beyond this point! or else!\n");
   f_lseek(&file_handle, romprops.offset);
-//  FPGA_DESELECT();
-//  FPGA_SELECT();
-//  FPGA_TX_BYTE(0x91); /* write w/ increment */
   for(;;) {
     ff_sd_offload=1;
     sd_offload_tgt=0;
-tickstmp=getticks();
     bytes_read = file_read();
-ticks_read+=getticks()-tickstmp;
     if (file_res || !bytes_read) break;
     if(!(count++ % 512)) {
-//      toggle_read_led();
-/*    bounce_busy_led(); */
       uart_putc('.');
     }
-//    for(int j=0; j<bytes_read; j++) {
-//      FPGA_TX_BYTE(file_buf[j]);
-//    }
-//tickstmp = getticks();
-//    FPGA_TX_BLOCK(file_buf, 512);
-//ticks_tx+=getticks()-tickstmp;
   }
-//  FPGA_TX_BYTE(0x00); /* dummy tx for increment+write pulse */
-//  FPGA_DESELECT();
   file_close();
   set_mapper(romprops.mapper_id);
   printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
-ticks_total=getticks()-ticksstart;
-  printf("%u ticks in read, %u ticks in tx, %u ticks total\n", ticks_read, ticks_tx, ticks_total);
+  ticks_total=getticks()-ticksstart;
+  printf("%u ticks total\n", ticks_total);
   if(romprops.mapper_id==3) {
     printf("BSX Flash cart image\n");
     printf("attempting to load BSX BIOS /sd2snes/bsxbios.bin...\n");
@@ -229,14 +216,20 @@ ticks_total=getticks()-ticksstart;
     sram_writebyte(0xfc, rombase+0xd5);
     set_fpga_time(0x0220110301180530LL);
   }
-  if(romprops.mapper_id == 4 || romprops.mapper_id == 5) {
+  if(romprops.has_dspx) {
     printf("DSPx game. Loading firmware image %s...\n", romprops.necdsp_fw);
     load_dspx(romprops.necdsp_fw);
+    if(file_res && romprops.necdsp_fw == DSPFW_1) {
+      load_dspx(DSPFW_1B);
+    }
+    if(file_res) {
+      snes_menu_errmsg(MENU_ERR_NODSP, (void*)romprops.necdsp_fw);
+    }
   }
   uint32_t rammask;
   uint32_t rommask;
 
-  if(filesize > (romprops.romsize_bytes + romprops.offset)) {
+  while(filesize > (romprops.romsize_bytes + romprops.offset)) {
     romprops.romsize_bytes <<= 1;
   }
 
@@ -250,6 +243,25 @@ ticks_total=getticks()-ticksstart;
   set_saveram_mask(rammask);
   set_rom_mask(rommask);
   readled(0);
+  if(flags & LOADROM_WITH_SRAM) {
+    if(romprops.ramsize_bytes) {
+      strcpy(strrchr((char*)filename, (int)'.'), ".srm");
+      printf("SRM file: %s\n", filename);
+      load_sram(filename, SRAM_SAVE_ADDR);
+    } else {
+      printf("No SRAM\n");
+    }
+  }
+
+  if(flags & LOADROM_WITH_RESET) {
+    set_mcu_ovr(0);
+    fpga_dspx_reset(1);
+    snes_reset(1);
+    delay_ms(10);
+    snes_reset(0);
+    fpga_dspx_reset(0);
+  }
+
   return (uint32_t)filesize;
 }
 
@@ -487,7 +499,6 @@ void load_dspx(const uint8_t *filename) {
       wordsize_cnt = 0;
       word_cnt++;
       fpga_write_dspx_pgm(pgmdata);
-      printf("%06lx ", pgmdata&0xffffff);
     }
   }
 
@@ -507,7 +518,6 @@ void load_dspx(const uint8_t *filename) {
       wordsize_cnt = 0;
       word_cnt++;
       fpga_write_dspx_dat(datdata);
-      printf("%04x ",datdata&0xffff);
     }
   }
 

+ 4 - 1
src/memory.h

@@ -44,7 +44,10 @@
 #define SRAM_DIRID (0xFFFFF0L)
 #define SRAM_RELIABILITY_SCORE (0x100)
 
-uint32_t load_rom(uint8_t* filename, uint32_t base_addr);
+#define LOADROM_WITH_SRAM	(1)
+#define LOADROM_WITH_RESET	(2)
+
+uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags);
 uint32_t load_sram(uint8_t* filename, uint32_t base_addr);
 uint32_t load_sram_offload(uint8_t* filename, uint32_t base_addr);
 uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr);

+ 8 - 8
src/smc.c

@@ -32,12 +32,6 @@
 
 snes_romprops_t romprops;
 
-const uint8_t* DSPFW_1  = (uint8_t*)"/sd2snes/dsp1.bin";
-const uint8_t* DSPFW_1B = (uint8_t*)"/sd2snes/dsp1b.bin";
-const uint8_t* DSPFW_2  = (uint8_t*)"/sd2snes/dsp2.bin";
-const uint8_t* DSPFW_3  = (uint8_t*)"/sd2snes/dsp3.bin";
-const uint8_t* DSPFW_4  = (uint8_t*)"/sd2snes/dsp4.bin";
-
 uint32_t hdr_addr[6] = {0xffb0, 0x101b0, 0x7fb0, 0x81b0, 0x40ffb0, 0x4101b0};
 uint8_t countAllASCII(uint8_t* data, int size) {
   uint8_t res = 0;
@@ -86,6 +80,7 @@ void smc_id(snes_romprops_t* props) {
   uint8_t score, maxscore=1, score_idx=2; /* assume LoROM */
   snes_header_t* header = &(props->header);
 
+  props->has_dspx = 0;
   for(uint8_t num = 0; num < 6; num++) {
     if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t))
        || file_res) {
@@ -144,6 +139,7 @@ void smc_id(snes_romprops_t* props) {
 
     case 0x21: /* HiROM */
       if(header->map == 0x31 && (header->carttype == 0x03 || header->carttype == 0x05)) {
+        props->has_dspx = 1;
         props->mapper_id = 4; /* DSPx HiROM */
         props->necdsp_fw = DSPFW_1B;
       } else {
@@ -155,6 +151,7 @@ void smc_id(snes_romprops_t* props) {
       if ((header->map == 0x20 && header->carttype == 0x03) ||
           (header->map == 0x30 && header->carttype == 0x05 && header->licensee != 0xb2)) {
         props->mapper_id = 5;
+        props->has_dspx = 1;
         // Pilotwings uses DSP1 instead of DSP1B
         if(!memcmp(header->name, "PILOTWINGS", 10)) {
           props->necdsp_fw = DSPFW_1;
@@ -162,12 +159,15 @@ void smc_id(snes_romprops_t* props) {
           props->necdsp_fw = DSPFW_1B;
         }
       } else if (header->map == 0x20 && header->carttype == 0x05) {
+        props->has_dspx = 1;
         props->mapper_id = 5; /* DSPx LoROM */
         props->necdsp_fw = DSPFW_2;
       } else if (header->map == 0x30 && header->carttype == 0x05 && header->licensee == 0xb2) {
+        props->has_dspx = 1;
         props->mapper_id = 5; /* DSPx LoROM */
         props->necdsp_fw = DSPFW_3;
       } else if (header->map == 0x30 && header->carttype == 0x03) {
+        props->has_dspx = 1;
         props->mapper_id = 5; /* DSPx LoROM */
         props->necdsp_fw = DSPFW_4;
       } else {
@@ -183,7 +183,7 @@ void smc_id(snes_romprops_t* props) {
       if(file_handle.fsize > 0x400200) {
         props->mapper_id = 6; /* SO96 */
       } else {
-        props->mapper_id = 4;
+        props->mapper_id = 1;
       }
       break;
 
@@ -198,7 +198,7 @@ void smc_id(snes_romprops_t* props) {
           if(file_handle.fsize > 0x800200) {
             props->mapper_id = 6; /* SO96 interleaved */
           } else if(file_handle.fsize > 0x400200) {
-            props->mapper_id = 4; /* ExLoROM */
+            props->mapper_id = 1; /* ExLoROM */
           } else {
             props->mapper_id = 1; /* LoROM */
           }

+ 7 - 0
src/smc.h

@@ -27,6 +27,12 @@
 #ifndef SMC_H
 #define SMC_H
 
+#define DSPFW_1 ((const uint8_t*)"/sd2snes/dsp1.bin")
+#define DSPFW_2 ((const uint8_t*)"/sd2snes/dsp2.bin")
+#define DSPFW_3 ((const uint8_t*)"/sd2snes/dsp3.bin")
+#define DSPFW_4 ((const uint8_t*)"/sd2snes/dsp4.bin")
+#define DSPFW_1B ((const uint8_t*)"/sd2snes/dsp1b.bin") 
+
 typedef struct _snes_header {
   uint8_t maker[2];     /* 0xB0 */
   uint8_t gamecode[4];  /* 0xB2 */
@@ -54,6 +60,7 @@ typedef struct _snes_romprops {
   uint32_t ramsize_bytes;     /* CartRAM size in bytes */
   uint32_t romsize_bytes;     /* ROM size in bytes (rounded up) */
   const uint8_t* necdsp_fw;   /* NEC DSP ROM filename */
+  uint8_t has_dspx;           /* DSP[1-4] presence flag */
   snes_header_t header;       /* original header from ROM image */
 } snes_romprops_t;
 

+ 7 - 0
src/snes.c

@@ -171,3 +171,10 @@ void snes_bootprint(void* msg) {
   delay_ms(30);
   set_mcu_ovr(1);
 }
+
+void snes_menu_errmsg(int err, void* msg) {
+  set_mcu_ovr(1);
+  sram_writeblock(msg, SRAM_CMD_ADDR+1, 64);
+  sram_writebyte(err, SRAM_CMD_ADDR);
+}
+

+ 5 - 0
src/snes.h

@@ -30,6 +30,10 @@
 #define SNES_CMD_LOADROM   (1)
 #define SNES_CMD_SETRTC    (2)
 
+#define MENU_ERR_OK		(0)
+#define MENU_ERR_NODSP	(1)
+#define MENU_ERR_NOBSX	(2)
+
 uint8_t crc_valid;
 
 void prepare_reset(void);
@@ -40,4 +44,5 @@ void snes_main_loop(void);
 uint8_t menu_main_loop(void);
 void get_selected_name(uint8_t* lfn);
 void snes_bootprint(void* msg);
+void snes_menu_errmsg(int err, void* msg);
 #endif