From c685f9a09fcefd0ef9d36b4f05141653586d4f75 Mon Sep 17 00:00:00 2001 From: ikari Date: Sun, 1 Nov 2009 19:07:58 +0100 Subject: [PATCH] update --- snes/main.a65 | 12 ++++++----- src/Makefile | 2 +- src/config | 1 + src/fileops.c | 2 +- src/fileops.h | 3 ++- src/filetypes.c | 53 +++++++++++++++++++++++++++---------------------- src/fpga.c | 2 +- src/fpga.h | 2 +- src/main.c | 52 +++++++++++++++++++++++++++++++++++++++--------- src/memory.c | 52 +++++++++++++++++++++++++++++++++++++++++++----- src/memory.h | 17 +++++++++++++--- src/snes.c | 24 +++++++++++++++++++--- src/snes.h | 2 ++ 13 files changed, 170 insertions(+), 54 deletions(-) diff --git a/snes/main.a65 b/snes/main.a65 index 75aa612..8a8ddc6 100644 --- a/snes/main.a65 +++ b/snes/main.a65 @@ -8,15 +8,17 @@ GAME_MAIN: jsr setup_hdma jsr tests jsr colortest - lda #$01 + lda #$00 sta @$306000 - inc + lda #$50 sta @$306001 - inc + lda #$11 sta @$306002 - inc + lda #$00 sta @$306003 - + lda #$01 + sta @$306004 + cli jmp @infloop ;infinite loop in WRAM colortest: diff --git a/src/Makefile b/src/Makefile index ba810d6..5e6c100 100644 --- a/src/Makefile +++ b/src/Makefile @@ -343,7 +343,7 @@ endif # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y +AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. diff --git a/src/config b/src/config index d79440d..3db936b 100644 --- a/src/config +++ b/src/config @@ -39,3 +39,4 @@ CONFIG_SD_AUTO_RETRIES=10 CONFIG_EEPROM_SIZE=512 CONFIG_EEPROM_OFFSET=512 CONFIG_MAX_PARTITIONS=1 +CONFIG_DEADLOCK_ME_HARDER=y diff --git a/src/fileops.c b/src/fileops.c index 6c7fadb..f6b6b91 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -18,7 +18,7 @@ void file_init() { void file_open_by_filinfo(FILINFO* fno) { file_res = l_openfilebycluster(&fatfs, &file_handle, (UCHAR*)"", fno->clust, fno->fsize); } -void file_open(char* filename, BYTE flags) { +void file_open(uint8_t* filename, BYTE flags) { file_res = f_open(&file_handle, (unsigned char*)filename, flags); } diff --git a/src/fileops.h b/src/fileops.h index 2974dfc..bab51bc 100644 --- a/src/fileops.h +++ b/src/fileops.h @@ -9,9 +9,10 @@ BYTE file_buf[512]; FATFS fatfs; FIL file_handle; FRESULT file_res; +uint8_t file_lfn[256]; void file_init(void); -void file_open(char* filename, BYTE flags); +void file_open(uint8_t* filename, BYTE flags); void file_open_by_filinfo(FILINFO* fno); void file_close(void); UINT file_read(void); diff --git a/src/filetypes.c b/src/filetypes.c index 0e95251..0e1f0ac 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -12,6 +12,7 @@ #include "fileops.h" #include "crc16.h" #include "memory.h" +#include "led.h" uint16_t scan_flat(const char* path) { DIR dir; @@ -34,9 +35,8 @@ uint16_t scan_dir(char* path, char mkdb) { DIR dir; FILINFO fno; FRESULT res; - int len; + uint8_t len; unsigned char* fn; - static unsigned char lfn[256]; static unsigned char depth = 0; static uint16_t crc; static uint32_t db_tgt; @@ -50,12 +50,12 @@ uint16_t scan_dir(char* path, char mkdb) { if(depth==0) { crc = 0; - db_tgt = SRAM_WORK_ADDR+0x200; - dir_tgt = SRAM_WORK_ADDR+0x100000; + db_tgt = SRAM_DB_ADDR+0x10; + dir_tgt = SRAM_DIR_ADDR; dprintf("root dir @%lx\n", dir_tgt); } - fno.lfn = lfn; + fno.lfn = file_lfn; numentries=0; dir_tgt_next=0; for(pass = 0; pass < 2; pass++) { @@ -65,11 +65,11 @@ uint16_t scan_dir(char* path, char mkdb) { if(dir_tgt_next > dir_end) { dir_end = dir_tgt_next; } - dprintf("path=%s depth=%d ptr=%lx entries=%d next subdir @%lx\n", path, depth, db_tgt, numentries, dir_tgt_next); - _delay_ms(50); +// dprintf("path=%s depth=%d ptr=%lx entries=%d next subdir @%lx\n", path, depth, db_tgt, numentries, dir_tgt_next); +// _delay_ms(50); if(mkdb) { - dprintf("d=%d Saving %lX to Address %lX [end]\n", depth, 0L, dir_tgt_next - 4); - _delay_ms(50); +// dprintf("d=%d Saving %lX to Address %lX [end]\n", depth, 0L, dir_tgt_next - 4); +// _delay_ms(50); sram_writelong(0L, dir_tgt_next - 4); } } @@ -77,6 +77,7 @@ uint16_t scan_dir(char* path, char mkdb) { if (res == FR_OK) { len = strlen((char*)path); for (;;) { + toggle_busy_led(); res = f_readdir(&dir, &fno); if (res != FR_OK || fno.fname[0] == 0) { if(pass) { @@ -97,21 +98,23 @@ uint16_t scan_dir(char* path, char mkdb) { dir_tgt_save = dir_tgt; dir_tgt = dir_tgt_next; if(mkdb) { + uint16_t pathlen = strlen(path); // write element pointer to current dir structure - dprintf("d=%d Saving %lX to Address %lX [dir]\n", depth, db_tgt, dir_tgt_save); - _delay_ms(50); - sram_writelong(db_tgt, dir_tgt_save); +// dprintf("d=%d Saving %lX to Address %lX [dir]\n", depth, db_tgt, dir_tgt_save); +// _delay_ms(50); + sram_writelong(db_tgt|((uint32_t)0x80<<24), dir_tgt_save); // sram_writeblock((uint8_t*)&db_tgt, dir_tgt_save, sizeof(dir_tgt_save)); // save element: // - path name // - pointer to sub dir structure - dprintf(" Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, dir_tgt, path); - _delay_ms(100); - sram_writeblock(path, db_tgt, 256); - sram_writelong(dir_tgt|((uint32_t)0x80<<24), db_tgt+256); +// dprintf(" Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, dir_tgt, path); +// _delay_ms(100); + sram_writelong(dir_tgt, db_tgt); + sram_writebyte(len+1, db_tgt+sizeof(dir_tgt)); + sram_writeblock(path, db_tgt+sizeof(dir_tgt)+sizeof(len), pathlen + 1); // sram_writeblock((uint8_t*)&dir_tgt, db_tgt+256, sizeof(dir_tgt)); - db_tgt += 0x200; + db_tgt += sizeof(dir_tgt) + sizeof(len) + pathlen + 1; } scan_dir(path, mkdb); dir_tgt = dir_tgt_save + 4; @@ -129,6 +132,7 @@ uint16_t scan_dir(char* path, char mkdb) { snes_romprops_t romprops; path[len]='/'; strncpy(path+len+1, (char*)fn, sizeof(fs_path)-len); + uint16_t pathlen = strlen(path); switch(type) { case TYPE_SMC: file_open_by_filinfo(&fno); @@ -140,8 +144,8 @@ uint16_t scan_dir(char* path, char mkdb) { file_close(); // _delay_ms(30); // 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); +// dprintf("d=%d Saving %lX to Address %lX [file]\n", depth, db_tgt, dir_tgt); +// _delay_ms(50); sram_writelong(db_tgt, dir_tgt); // sram_writeblock((uint8_t*)&db_tgt, dir_tgt, sizeof(db_tgt)); dir_tgt += 4; @@ -149,8 +153,9 @@ uint16_t scan_dir(char* path, char mkdb) { // - SNES header information // - file name sram_writeblock((uint8_t*)&romprops, db_tgt, sizeof(romprops)); - sram_writeblock(path, db_tgt + sizeof(romprops), 256); - db_tgt += 0x200; + sram_writebyte(len+1, db_tgt + sizeof(romprops)); + sram_writeblock(path, db_tgt + sizeof(romprops) + sizeof(len), pathlen + 1); + db_tgt += sizeof(romprops) + sizeof(len) + pathlen + 1; break; case TYPE_UNKNOWN: default: @@ -175,8 +180,8 @@ uint16_t scan_dir(char* path, char mkdb) { } // dprintf("%x\n", crc); // _delay_ms(50); - sram_writeblock(&db_tgt, SRAM_WORK_ADDR+4, sizeof(db_tgt)); - sram_writeblock(&dir_end, SRAM_WORK_ADDR+8, sizeof(dir_end)); + sram_writeblock(&db_tgt, SRAM_DB_ADDR+4, sizeof(db_tgt)); + sram_writeblock(&dir_end, SRAM_DB_ADDR+8, sizeof(dir_end)); return crc; } @@ -198,7 +203,7 @@ SNES_FTYPE determine_filetype(char* filename) { } FRESULT get_db_id(uint16_t* id) { - file_open("/sd2snes/sd2snes.db", FA_READ); + file_open((uint8_t*)"/sd2snes/sd2snes.db", FA_READ); if(file_res == FR_OK) { file_readblock(id, 0, 2); /* XXX */// *id=0xdead; diff --git a/src/fpga.c b/src/fpga.c index a8b53d2..e4d4343 100644 --- a/src/fpga.c +++ b/src/fpga.c @@ -67,7 +67,7 @@ void fpga_postinit() { DDRD |= _BV(PD7); // turn PD7 into output } -void fpga_pgm(char* filename) { +void fpga_pgm(uint8_t* filename) { int MAXRETRIES = 10; int retries = MAXRETRIES; do { diff --git a/src/fpga.h b/src/fpga.h index 799f6ca..bfd5da2 100644 --- a/src/fpga.h +++ b/src/fpga.h @@ -7,7 +7,7 @@ void fpga_init(void); void fpga_postinit(void); -void fpga_pgm(char* filename); +void fpga_pgm(uint8_t* filename); void set_avr_read(uint8_t val); void set_avr_write(uint8_t val); diff --git a/src/main.c b/src/main.c index 34fdb48..13b037e 100644 --- a/src/main.c +++ b/src/main.c @@ -145,7 +145,7 @@ int main(void) { f_mount(0,&fatfs); uart_putc('W'); fpga_init(); - fpga_pgm("/sd2snes/main.bit"); + fpga_pgm((uint8_t*)"/sd2snes/main.bit"); _delay_ms(100); set_pwr_led(1); fpga_spi_init(); @@ -154,34 +154,43 @@ int main(void) { set_avr_ena(0); snes_reset(1); + sram_writelong(0x12345678, SRAM_SCRATCHPAD); *fs_path=0; uint16_t curr_dir_id = scan_dir(fs_path, 0); // generate files footprint dprintf("curr dir id = %x\n", curr_dir_id); uint16_t saved_dir_id; if((get_db_id(&saved_dir_id) != FR_OK) // no database? - || 1 /*saved_dir_id != curr_dir_id*/) { // files changed? // XXX + || 1 || saved_dir_id != curr_dir_id) { // files changed? // XXX dprintf("saved dir id = %x\n", saved_dir_id); _delay_ms(50); dprintf("rebuilding database..."); _delay_ms(50); curr_dir_id = scan_dir(fs_path, 1); // then rebuild database - sram_writeblock(&curr_dir_id, SRAM_WORK_ADDR, 2); + sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 2); uint32_t endaddr, direndaddr; - sram_readblock(&endaddr, SRAM_WORK_ADDR+4, 4); - sram_readblock(&direndaddr, SRAM_WORK_ADDR+8, 4); + sram_readblock(&endaddr, SRAM_DB_ADDR+4, 4); + sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4); dprintf("%lx %lx\n", endaddr, direndaddr); - save_sram("/sd2snes/sd2snes.db", endaddr-SRAM_WORK_ADDR, SRAM_WORK_ADDR); - save_sram("/sd2snes/sd2snes.dir", direndaddr-(SRAM_WORK_ADDR+0x100000), SRAM_WORK_ADDR+0x100000); + save_sram((uint8_t*)"/sd2snes/sd2snes.db", endaddr-SRAM_DB_ADDR, SRAM_DB_ADDR); + save_sram((uint8_t*)"/sd2snes/sd2snes.dir", direndaddr-(SRAM_DIR_ADDR), SRAM_DIR_ADDR); dprintf("done\n"); + sram_hexdump(SRAM_DB_ADDR, 0x400); + } else { + dprintf("loading db...\n"); + load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR); + load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR); } + uart_putc('['); - load_sram("/test.srm"); + load_sram((uint8_t*)"/test.srm", SRAM_SAVE_ADDR); uart_putc(']'); uart_putc('('); - load_rom("/test.smc"); + load_rom((uint8_t*)"/test.smc"); uart_putc(')'); + sram_writebyte(0, SRAM_CMD_ADDR); + set_busy_led(0); set_avr_ena(1); @@ -189,7 +198,32 @@ int main(void) { uart_puts_P(PSTR("SNES GO!\n")); snes_reset(0); + uint8_t cmd = 0; + while(!sram_reliable()); + + while(!cmd) { + cmd=menu_main_loop(); + switch(cmd) { + case 0x01: // SNES_CMD_LOADROM: + get_selected_name(file_lfn); + _delay_ms(100); +// snes_reset(1); + set_avr_ena(0); + dprintf("%s\n", file_lfn); + load_rom(file_lfn); + set_avr_ena(1); + snes_reset(1); + _delay_ms(100); + snes_reset(0); + break; + default: + break; + } + + } + dprintf("cmd was %x, going to snes main loop\n", cmd); + cmd=0; while(1) { snes_main_loop(); } diff --git a/src/memory.c b/src/memory.c index cb78f71..bcc7dab 100644 --- a/src/memory.c +++ b/src/memory.c @@ -16,9 +16,38 @@ #include "led.h" #include "smc.h" #include "fpga_spi.h" +#include "memory.h" char* hex = "0123456789ABCDEF"; +void sram_hexdump(uint32_t addr, uint32_t len) { + static uint8_t buf[16]; + uint32_t ptr; + for(ptr=0; ptr < len; ptr += 16) { + sram_readblock((void*)buf, ptr+addr, 16); + uart_trace(buf, 0, 16); + } +} + +void sram_writebyte(uint8_t val, uint32_t addr) { + set_avr_addr(addr); + spi_fpga(); + spiTransferByte(0x91); // WRITE + spiTransferByte(val); + spiTransferByte(0x00); // dummy + spi_none(); +} + +uint8_t sram_readbyte(uint32_t addr) { + set_avr_addr(addr); + spi_fpga(); + spiTransferByte(0x81); // READ + spiTransferByte(0x00); // dummy + uint8_t val = spiTransferByte(0x00); + spi_none(); + return val; +} + void sram_writelong(uint32_t val, uint32_t addr) { set_avr_addr(addr); spi_fpga(); @@ -41,7 +70,7 @@ uint32_t sram_readlong(uint32_t addr) { val |= ((uint32_t)spiTransferByte(0x00)<<8); val |= ((uint32_t)spiTransferByte(0x00)<<16); val |= ((uint32_t)spiTransferByte(0x00)<<24); - + spi_none(); return val; } @@ -71,7 +100,7 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) { spi_none(); } -uint32_t load_rom(char* filename) { +uint32_t load_rom(uint8_t* filename) { snes_romprops_t romprops; set_avr_bank(0); UINT bytes_read; @@ -138,8 +167,8 @@ uint32_t load_rom(char* filename) { return (uint32_t)filesize; } -uint32_t load_sram(char* filename) { - set_avr_bank(3); +uint32_t load_sram(uint8_t* filename, uint32_t base_addr) { + set_avr_addr(base_addr); UINT bytes_read; DWORD filesize; file_open(filename, FA_READ); @@ -164,7 +193,7 @@ uint32_t load_sram(char* filename) { } -void save_sram(char* filename, uint32_t sram_size, uint32_t base_addr) { +void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) { uint32_t count = 0; uint32_t num = 0; @@ -208,3 +237,16 @@ uint32_t calc_sram_crc(uint32_t base_addr, uint32_t size) { spi_none(); return crc; } + +uint8_t sram_reliable() { + uint16_t score=0; + uint32_t val = sram_readlong(SRAM_SCRATCHPAD); + while(score