Browse Source

mapper tweaks, srm file name

ikari 14 years ago
parent
commit
6d6fe8cfb7
4 changed files with 32 additions and 11 deletions
  1. 7 2
      src/main.c
  2. 0 1
      src/memory.h
  3. 24 7
      src/smc.c
  4. 1 1
      src/snes.c

+ 7 - 2
src/main.c

@@ -212,7 +212,7 @@ int main(void) {
 	set_avr_ena(1);
 
 	_delay_ms(100);
-	uart_puts_P(PSTR("SNES GO!\n"));
+	uart_puts_P(PSTR("SNES GO!\r\n"));
 	snes_reset(0);
 
 	uint8_t cmd = 0;
@@ -227,14 +227,19 @@ int main(void) {
 				_delay_ms(100);
 //				snes_reset(1);
 				set_avr_ena(0);
-//				dprintf("Selected name: %s\n", file_lfn);
+				dprintf("Selected name: %s\n", file_lfn);
 				load_rom(file_lfn);
+				strcpy(strrchr((char*)file_lfn, (int)'.'), ".srm");
+				dprintf("SRM file: %s\n", file_lfn);
+				load_sram(file_lfn, SRAM_SAVE_ADDR);
 				set_avr_ena(1);
 				snes_reset(1);
 				_delay_ms(100);
 				snes_reset(0);
 				break;
 			default:
+				dprintf("unknown cmd: %d\n", cmd);
+				cmd=0; // unknown cmd: stay in loop
 			break;
 		}
 		

+ 0 - 1
src/memory.h

@@ -4,7 +4,6 @@
 #ifndef MEMORY_H
 #define MEMORY_H
 
-#define SRAM_WORK_ADDR	(0x100000L)
 #define SRAM_DB_ADDR (0x080000L)
 #define SRAM_DIR_ADDR (0x300000L)
 #define SRAM_CMD_ADDR (0x601004L)

+ 24 - 7
src/smc.c

@@ -53,7 +53,7 @@ uint8_t checkChksum(uint16_t cchk, uint16_t chk) {
 }
 
 void smc_id(snes_romprops_t* props) {
-	uint8_t score, maxscore=1, score_idx=0;
+	uint8_t score, maxscore=1, score_idx=2; // assume LoROM
 
 	snes_header_t* header = &(props->header);
 	
@@ -64,9 +64,9 @@ void smc_id(snes_romprops_t* props) {
 //			_delay_ms(30);
 			score = 0;
 		} else {
-			score = smc_headerscore(header);
+			score = smc_headerscore(header)/(1+(num&1));
 		}
-//		dprintf("%d: offset = %lX; score = %d\n", num, hdr_addr[num], score);
+		dprintf("%d: offset = %lX; score = %d\n", num, hdr_addr[num], score);
 //		_delay_ms(100);
 		if(score>=maxscore) {
 			score_idx=num;
@@ -81,7 +81,7 @@ void smc_id(snes_romprops_t* props) {
 	}
 	
 	// restore the chosen one
-//	dprintf("winner is %d\n", score_idx);
+	dprintf("winner is %d\n", score_idx);
 //	_delay_ms(30);
 	file_readblock(header, hdr_addr[score_idx], sizeof(snes_header_t));
 	switch(header->map & 0xef) {
@@ -94,10 +94,27 @@ void smc_id(snes_romprops_t* props) {
 		case 0x25:
 			props->mapper_id = 2;
 			break;
-		default:
-			props->mapper_id = 0; // whatever
+		default: // invalid/unsupported mapper, use header location
+			switch(score_idx) {
+				case 0:
+				case 1:
+					props->mapper_id = 0;
+					break;
+				case 2:
+				case 3:
+					props->mapper_id = 1;
+					break;
+				case 4:
+				case 5:
+					props->mapper_id = 2;
+					break;
+				default:
+					props->mapper_id = 1; // whatever
+			}
+	}
+	if(header->romsize == 0 || header->romsize > 13) {
+		header->romsize = 13;
 	}
-
 	props->ramsize_bytes = (uint32_t)1024 << header->ramsize;
 	props->romsize_bytes = (uint32_t)1024 << header->romsize;
 	props->expramsize_bytes = (uint32_t)1024 << header->expramsize;

+ 1 - 1
src/snes.c

@@ -79,7 +79,7 @@ void snes_main_loop() {
 			uart_puthexshort(saveram_crc);
 			uart_putcrlf();
 			set_busy_led(1);
-			save_sram((uint8_t*)"/test.srm", saveram_size, saveram_base_addr);
+			save_sram(file_lfn, saveram_size, saveram_base_addr);
 			set_busy_led(0);
 		}
 		saveram_crc_old = saveram_crc;