menu nav update, improve autosave, fix db creation (bankswitch), SRAM size, SPI speed fix in shared mode, soft reset, mapper detect

This commit is contained in:
ikari 2009-11-29 14:50:23 +01:00
parent 187595686e
commit dce8e08336
10 changed files with 145 additions and 30 deletions

View File

@ -111,6 +111,9 @@ menu_updates:
lda #$20
and pad1trig+1
bne key_select
lda #$80
and pad1trig
bne key_a
bra menuupd_out
key_down
jsr menu_key_down
@ -127,6 +130,9 @@ key_left
key_b
jsr menu_key_b
bra menuupd_out
key_a
jsr menu_key_a
bra menuupd_out
key_select
jsr menu_key_select
bra menuupd_out
@ -335,9 +341,9 @@ menu_key_left:
sbc listdisp
sec
sbc listdisp
bcc +
cmp dirstart_addr
bcc +
bmi +
- sta dirptr_addr
sep #$20 : .as
rts
@ -383,6 +389,18 @@ do_setup448
jsr setup_448
rts
menu_key_a:
rep #$20 : .al
lda dirstart_addr
beq skip_key_a
sta dirptr_addr
lda #$0000
sta menu_sel
bra select_item
skip_key_a
sep #$20 : .as
rts
select_item:
rep #$20 : .al
lda menu_sel
@ -425,6 +443,10 @@ select_file:
sep #$20 : .as
lda #$01
sta @AVR_CMD
lda #$00
sta @$4200
cli
jsl @infloop
rts
select_dir: ; y = direntry ptr

View File

@ -83,6 +83,13 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
if (res == FR_OK) {
if(pass && parent_tgt) {
// write backlink to parent dir
// switch to next bank if record does not fit in current bank
if((db_tgt&0xffff) > ((0x10000-(sizeof(next_subdir_tgt)+sizeof(len)+4))&0xffff)) {
dprintf("switch! old=%lx ", db_tgt);
db_tgt &= 0xffff0000;
db_tgt += 0x00010000;
dprintf("new=%lx\n", db_tgt);
}
sram_writelong(parent_tgt, db_tgt);
sram_writebyte(0, db_tgt+sizeof(next_subdir_tgt));
sram_writeblock("../\0", db_tgt+sizeof(next_subdir_tgt)+sizeof(len), 4);
@ -121,6 +128,12 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
// save element:
// - path name
// - pointer to sub dir structure
if((db_tgt&0xffff) > ((0x10000-(sizeof(next_subdir_tgt) + sizeof(len) + pathlen + 2))&0xffff)) {
dprintf("switch! old=%lx ", db_tgt);
db_tgt &= 0xffff0000;
db_tgt += 0x00010000;
dprintf("new=%lx\n", db_tgt);
}
dprintf(" Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, next_subdir_tgt, path);
// _delay_ms(100);
sram_writelong(next_subdir_tgt, db_tgt);
@ -161,6 +174,12 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
// 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);
if((db_tgt&0xffff) > ((0x10000-(sizeof(romprops) + sizeof(len) + pathlen + 1))&0xffff)) {
dprintf("switch! old=%lx ", db_tgt);
db_tgt &= 0xffff0000;
db_tgt += 0x00010000;
dprintf("new=%lx\n", db_tgt);
}
sram_writelong(db_tgt, dir_tgt);
// sram_writeblock((uint8_t*)&db_tgt, dir_tgt, sizeof(db_tgt));
dir_tgt += 4;

View File

@ -106,10 +106,16 @@ void fpga_pgm(uint8_t* filename) {
}
void set_avr_ena(uint8_t val) {
if(val) {
if(val) { // shared mode
PORTD |= _BV(PD7);
} else {
// Disable SPI double speed mode -> clock = f/4
SPSR = 0;
dprintf("SPI slow\n");
} else { // avr only
PORTD &= ~_BV(PD7);
// Enable SPI double speed mode -> clock = f/2
SPSR = _BV(SPI2X);
dprintf("SPI fast\n");
}
}

View File

@ -84,5 +84,7 @@ void led_pwm() {
}
void led_std() {
set_busy_led(0);
TCCR0A = 0;
TCCR0B = 0;
}

View File

@ -151,6 +151,8 @@ int main(void) {
fpga_spi_init();
uart_putc('!');
_delay_ms(100);
restart:
set_avr_ena(0);
snes_reset(1);
@ -160,14 +162,11 @@ int main(void) {
uint16_t mem_dir_id = sram_readshort(SRAM_DIRID);
uint32_t mem_magic = sram_readlong(SRAM_SCRATCHPAD);
led_pwm();
if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id)) {
uint16_t curr_dir_id = scan_dir(fs_path, 0, 0); // generate files footprint
dprintf("curr dir id = %x\n", curr_dir_id);
led_pwm();
if((get_db_id(&saved_dir_id) != FR_OK) // no database?
|| saved_dir_id != curr_dir_id) { // files changed? // XXX
dprintf("saved dir id = %x\n", saved_dir_id);
@ -201,6 +200,9 @@ int main(void) {
load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR);
load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR);
}
led_pwm();
uart_putc('(');
load_rom((uint8_t*)"/sd2snes/menu.bin");
set_rom_mask(0x3fffff); // force mirroring off
@ -229,9 +231,13 @@ int main(void) {
set_avr_ena(0);
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);
if(romprops.ramsize_bytes) {
strcpy(strrchr((char*)file_lfn, (int)'.'), ".srm");
dprintf("SRM file: %s\n", file_lfn);
load_sram(file_lfn, SRAM_SAVE_ADDR);
} else {
dprintf("No SRAM\n");
}
set_avr_ena(1);
snes_reset(1);
_delay_ms(100);
@ -247,12 +253,45 @@ int main(void) {
dprintf("cmd was %x, going to snes main loop\n", cmd);
led_std();
cmd=0;
uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0;
uint16_t reset_count=0;
while(1) {
if(get_snes_reset()) {
dprintf("RESET\n");
snes_reset_now=get_snes_reset();
if(snes_reset_now) {
if(!snes_reset_prev) {
dprintf("RESET BUTTON DOWN\n");
snes_reset_state=1;
// reset reset counter
reset_count=0;
}
} else {
if(snes_reset_prev) {
dprintf("RESET BUTTON UP\n");
snes_reset_state=0;
}
}
sram_reliable();
snes_main_loop();
if(snes_reset_state) {
_delay_ms(10);
reset_count++;
} else {
sram_reliable();
snes_main_loop();
}
if(reset_count>100) {
reset_count=0;
led_std();
set_avr_ena(0);
snes_reset(1);
if(romprops.ramsize_bytes) {
set_busy_led(1);
save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR);
set_busy_led(0);
}
_delay_ms(1000);
set_busy_led(1);
goto restart;
}
snes_reset_prev = snes_reset_now;
}

View File

@ -124,7 +124,6 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) {
}
uint32_t load_rom(uint8_t* filename) {
snes_romprops_t romprops;
set_avr_bank(0);
UINT bytes_read;
DWORD filesize;
@ -269,6 +268,7 @@ uint32_t calc_sram_crc(uint32_t base_addr, uint32_t size) {
uint8_t sram_reliable() {
uint16_t score=0;
uint32_t val;
// uint32_t val = sram_readlong(SRAM_SCRATCHPAD);
uint8_t result = 0;
/* while(score<SRAM_RELIABILITY_SCORE) {
@ -280,7 +280,8 @@ uint8_t sram_reliable() {
}
}*/
for(uint16_t i = 0; i < SRAM_RELIABILITY_SCORE; i++) {
if(sram_readlong(SRAM_SCRATCHPAD)==0x12345678) {
val=sram_readlong(SRAM_SCRATCHPAD);
if(val==0x12345678) {
score++;
}
}

View File

@ -27,4 +27,7 @@
void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr);
uint32_t calc_sram_crc(uint32_t base_addr, uint32_t size);
uint8_t sram_reliable(void);
#include "smc.h"
snes_romprops_t romprops;
#endif

View File

@ -65,8 +65,21 @@ void smc_id(snes_romprops_t* props) {
score = 0;
} else {
score = smc_headerscore(header)/(1+(num&1));
if((file_handle.fsize & 0x2ff) == 0x200) {
if(num&1) {
score+=20;
} else {
score=0;
}
} else {
if(!(num&1)) {
score+=20;
} else {
score=0;
}
}
}
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 +94,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) {
@ -118,6 +131,11 @@ void smc_id(snes_romprops_t* props) {
props->ramsize_bytes = (uint32_t)1024 << header->ramsize;
props->romsize_bytes = (uint32_t)1024 << header->romsize;
props->expramsize_bytes = (uint32_t)1024 << header->expramsize;
// dprintf("ramsize_bytes: %ld\n", props->ramsize_bytes);
if(props->ramsize_bytes > 32768 || props->ramsize_bytes < 2048) {
props->ramsize_bytes = 0;
}
// dprintf("ramsize_bytes: %ld\n", props->ramsize_bytes);
f_lseek(&file_handle, 0);
}

View File

@ -39,9 +39,4 @@ typedef struct _snes_romprops {
void smc_id(snes_romprops_t*);
uint8_t smc_headerscore(snes_header_t*);
/*pedef struct {
}*/
#endif

View File

@ -11,11 +11,10 @@
#include "fileops.h"
#include "ff.h"
#include "led.h"
#include "smc.h"
uint8_t initloop=1;
uint32_t saveram_crc, saveram_crc_old;
uint32_t saveram_size = 8192; // sane default
uint32_t saveram_base_addr = 0x600000; // chip 3
void snes_init() {
DDRD |= _BV(PD5); // PD5 = RESET_DIR
@ -55,14 +54,15 @@ uint8_t get_snes_reset() {
* SD2SNES main loop.
* monitors SRAM changes and other things
*/
uint32_t diffcount = 0, samecount = 0;
uint32_t diffcount = 0, samecount = 0, didnotsave = 0;
uint8_t sram_valid = 0;
void snes_main_loop() {
if(!romprops.ramsize_bytes)return;
if(initloop) {
saveram_crc_old = calc_sram_crc(saveram_base_addr, saveram_size);
saveram_crc_old = calc_sram_crc(saveram_base_addr, romprops.ramsize_bytes);
initloop=0;
}
saveram_crc = calc_sram_crc(saveram_base_addr, saveram_size);
saveram_crc = calc_sram_crc(saveram_base_addr, romprops.ramsize_bytes);
sram_valid = sram_reliable();
if(crc_valid && sram_valid) {
if(saveram_crc != saveram_crc_old) {
@ -70,23 +70,33 @@ void snes_main_loop() {
diffcount=1;
} else {
diffcount++;
didnotsave++;
}
samecount=0;
}
if(saveram_crc == saveram_crc_old) {
samecount++;
}
if(diffcount>=1 && samecount==3) {
if(diffcount>=1 && samecount==5) {
uart_putc('U');
uart_puthexshort(saveram_crc);
uart_putcrlf();
set_busy_led(1);
save_sram(file_lfn, saveram_size, saveram_base_addr);
save_sram(file_lfn, romprops.ramsize_bytes, saveram_base_addr);
set_busy_led(0);
didnotsave=0;
}
if(didnotsave>50) {
diffcount=0;
uart_putc('V');
set_busy_led(1);
save_sram(file_lfn, romprops.ramsize_bytes, saveram_base_addr);
didnotsave=0;
set_busy_led(0);
}
saveram_crc_old = saveram_crc;
}
dprintf("crc_valid=%d sram_valid=%d diffcount=%ld samecount=%ld\n", crc_valid, sram_valid, diffcount, samecount);
dprintf("crc_valid=%d sram_valid=%d diffcount=%ld samecount=%ld, didnotsave=%ld\n", crc_valid, sram_valid, diffcount, samecount, didnotsave);
}
/*