From b37fc1b846169b4b4e5a6f1fa9c2015eceaf4134 Mon Sep 17 00:00:00 2001 From: ikari Date: Sat, 19 Dec 2009 10:16:55 +0100 Subject: [PATCH] fix strange inverted address line bug, lots of other stuff --- pcb/cart/sd2snes19.brd | Bin 184539 -> 184755 bytes snes/menu.a65 | 2 +- src/filetypes.c | 2 +- src/fpga.c | 1 + src/fpga.h | 2 + src/main.c | 37 +++++++++++-- src/memory.c | 1 + verilog/sd2snes/address.v | 21 ++++--- verilog/sd2snes/avr_cmd.v | 28 ++++++---- verilog/sd2snes/data.v | 3 +- verilog/sd2snes/main.ucf | 104 ++++++++++++++++++----------------- verilog/sd2snes/main.v | 6 +- verilog/sd2snes/sd2snes.xise | 2 +- 13 files changed, 125 insertions(+), 84 deletions(-) diff --git a/pcb/cart/sd2snes19.brd b/pcb/cart/sd2snes19.brd index 33cd3af87b8169ce4043d87a384939bcd0db03a3..0841eb96a4943e123e4ddb01e1ab91dc73b66ae5 100644 GIT binary patch delta 41645 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 ((0x10000-(sizeof(next_subdir_tgt)+sizeof(len)+4))&0xffff)) { diff --git a/src/fpga.c b/src/fpga.c index 08100c9..40453b0 100644 --- a/src/fpga.c +++ b/src/fpga.c @@ -141,6 +141,7 @@ void set_avr_bank(uint8_t val) { uint8_t fpga_test() { spi_fpga(); spiTransferByte(0xF0); // TEST + spiTransferByte(0x00); // dummy uint8_t result = spiTransferByte(0x00); spi_none(); return result; diff --git a/src/fpga.h b/src/fpga.h index 64be7ed..bd2bb14 100644 --- a/src/fpga.h +++ b/src/fpga.h @@ -21,6 +21,8 @@ void set_avr_mapper(uint8_t val); void set_avr_bank(uint8_t val); +#define FPGA_TEST_TOKEN (0xa5) + // some macros for bulk transfers (faster) #define FPGA_SEND_BYTE(data) do {SET_AVR_DATA(data); CCLK();} while (0) #define FPGA_SEND_BYTE_SERIAL(data) do {SET_AVR_DATA(data); CCLK();\ diff --git a/src/main.c b/src/main.c index d774293..63ccbee 100644 --- a/src/main.c +++ b/src/main.c @@ -49,6 +49,32 @@ #include "avrcompat.h" #include "filetypes.h" +void writetest(void) { +// HERE BE LIONS, GET IN THE CAR + char teststring[58]; + while(1) { + sram_writeblock((void*)"Testtext of DOOM!!1! 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", SRAM_SCRATCHPAD+0x20, 58); + sram_readblock((void*)teststring, SRAM_SCRATCHPAD+0x20, 58); + teststring[57]=0; + dprintf("%s\n", teststring); + } +// END OF LIONS +} + + +void memtest(void) { +/* HERE BE DRAGONS */ + uint32_t dbg_i; + for(dbg_i=0; dbg_i < 65536; dbg_i++) { + sram_writeshort((uint16_t)dbg_i&0xffff, dbg_i*2); + } + save_sram((uint8_t*)"/sd2snes/memtest", 0x20000, 0); + set_pwr_led(0); + while(1); +/* END OF DRAGONS */ +} + + /* Make sure the watchdog is disabled as soon as possible */ /* Copy this code to your bootloader if you use one and your */ /* MCU doesn't disable the WDT after reset! */ @@ -163,14 +189,13 @@ restart: uint16_t mem_dir_id = sram_readshort(SRAM_DIRID); uint32_t mem_magic = sram_readlong(SRAM_SCRATCHPAD); + 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); - 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); - _delay_ms(50); dprintf("rebuilding database..."); _delay_ms(50); curr_dir_id = scan_dir(fs_path, 1, 0); // then rebuild database @@ -184,6 +209,7 @@ restart: dprintf("done\n"); sram_hexdump(SRAM_DB_ADDR, 0x400); } else { + dprintf("saved dir id = %x\n", saved_dir_id); dprintf("different card, consistent db, loading db...\n"); load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR); load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR); @@ -220,7 +246,6 @@ restart: uint8_t cmd = 0; while(!sram_reliable()); - while(!cmd) { cmd=menu_main_loop(); switch(cmd) { @@ -255,7 +280,8 @@ restart: cmd=0; uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0; uint16_t reset_count=0; - while(fpga_test() == 0xa5) { + while(fpga_test() == FPGA_TEST_TOKEN) { + dprintf("%02X\n", fpga_test()); snes_reset_now=get_snes_reset(); if(snes_reset_now) { if(!snes_reset_prev) { @@ -307,7 +333,6 @@ restart: _delay_ms(150); } - /* HERE BE LIONS */ while(1) { set_avr_addr(0x600000); @@ -335,6 +360,6 @@ while(1) { } spi_none(); } - while(1); + while(1); } diff --git a/src/memory.c b/src/memory.c index 8d5c003..d4ddd3a 100644 --- a/src/memory.c +++ b/src/memory.c @@ -286,6 +286,7 @@ uint8_t sram_reliable() { if(val==0x12345678) { score++; } +// dprintf("val=%08lX\n", val); } if(score (32'h0+2*cmd_data[4]))) + if (avr_nextaddr & (cmd_data[7:5] == 3'h4) && (cmd_data[0]) && (spi_byte_cnt > (32'h1+cmd_data[4]))) ADDR_OUT_BUF <= ADDR_OUT_BUF + 1; end +always @(posedge clk) begin + if (spi_bit_cnt == 3'h7) + if (cmd_data[7:4] == 4'hF) + AVR_DATA_IN_BUF <= 8'hA5; + else + AVR_DATA_IN_BUF <= avr_data_in; +end + always @(posedge clk) begin if (spi_bit_cnt == 3'h0) avr_nextaddr_buf <= {avr_nextaddr_buf[0], 1'b1}; @@ -120,15 +128,15 @@ always @(posedge clk) begin end always @(posedge clk) begin - if (spi_bit_cnt == 3'h1 & (cmd_data[7:4] == 4'h9) & (spi_byte_cnt > 32'h1)) + if ((spi_bit_cnt == 3'h1) & (cmd_data[7:4] == 4'h9) & (spi_byte_cnt > 32'h1)) AVR_WRITE_BUF <= 1'b0; else AVR_WRITE_BUF <= 1'b1; - if ((spi_bit_cnt == 3'h7) & (cmd_data[7:4] == 4'h8) & (spi_byte_cnt > 32'h0)) + if ((spi_bit_cnt == 3'h6 || spi_bit_cnt == 3'h7) & (cmd_data[7:4] == 4'h8) & (spi_byte_cnt > 32'h0)) AVR_READ_BUF <= 1'b0; else - AVR_READ_BUF <= 1'b1; + AVR_READ_BUF <= 1'b1; end assign avr_nextaddr = avr_nextaddr_buf == 2'b01; diff --git a/verilog/sd2snes/data.v b/verilog/sd2snes/data.v index eab68f5..6067334 100644 --- a/verilog/sd2snes/data.v +++ b/verilog/sd2snes/data.v @@ -46,7 +46,7 @@ wire [7:0] FROM_SRAM_BYTE; assign SNES_DATA = SNES_READ ? 8'bZ : SNES_OUT_MEM; -assign FROM_SRAM_BYTE = ((SRAM_ADDR0 ^ !AVR_ENA) ? SRAM_DATA[7:0] : SRAM_DATA[15:8]); +assign FROM_SRAM_BYTE = (SRAM_ADDR0 ? SRAM_DATA[7:0] : SRAM_DATA[15:8]); assign AVR_OUT_DATA = !AVR_ENA ? (FROM_SRAM_BYTE) : (AVR_OUT_MEM); @@ -58,6 +58,7 @@ assign SRAM_DATA[7:0] = SRAM_ADDR0 ? (!AVR_ENA ? (!AVR_WRITE ? AVR_IN_DATA : 8'b assign SRAM_DATA[15:8] = SRAM_ADDR0 ? 8'bZ : (!AVR_ENA ? (!AVR_WRITE ? AVR_IN_DATA : 8'bZ) : (MODE ? (!AVR_WRITE ? AVR_IN_MEM : 8'bZ) : (!SNES_WRITE ? SNES_IN_MEM : 8'bZ))); + always @(posedge CLK) begin if(SNES_DATA_TO_MEM) SNES_IN_MEM <= SNES_DATA; diff --git a/verilog/sd2snes/main.ucf b/verilog/sd2snes/main.ucf index 5c032a8..33a6d9f 100644 --- a/verilog/sd2snes/main.ucf +++ b/verilog/sd2snes/main.ucf @@ -26,8 +26,6 @@ NET "SNES_ADDR[7]" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[8]" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[9]" IOSTANDARD = LVCMOS33; NET "SNES_CS" IOSTANDARD = LVCMOS33; -NET "SNES_DATABUS_DIR" IOSTANDARD = LVCMOS33; -NET "SNES_DATABUS_OE" IOSTANDARD = LVCMOS33; NET "SNES_DATA[0]" IOSTANDARD = LVCMOS33; NET "SNES_DATA[1]" IOSTANDARD = LVCMOS33; NET "SNES_DATA[2]" IOSTANDARD = LVCMOS33; @@ -38,54 +36,14 @@ NET "SNES_DATA[6]" IOSTANDARD = LVCMOS33; NET "SNES_DATA[7]" IOSTANDARD = LVCMOS33; NET "SNES_READ" IOSTANDARD = LVCMOS33; NET "SNES_WRITE" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[0]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[10]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[11]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[12]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[13]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[14]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[15]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[16]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[17]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[18]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[19]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[1]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[2]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[3]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[4]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[5]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[6]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[7]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[8]" IOSTANDARD = LVCMOS33; -NET "SRAM_ADDR[9]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[0]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[1]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[2]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[3]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[4]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[5]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[6]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[7]" IOSTANDARD = LVCMOS33; -NET "SRAM_OE" IOSTANDARD = LVCMOS33; -NET "SRAM_WE" IOSTANDARD = LVCMOS33; NET "SNES_CPU_CLK" IOSTANDARD = LVCMOS33; -NET "SNES_IRQ" IOSTANDARD = LVCMOS33; NET "SNES_REFRESH" IOSTANDARD = LVCMOS33; NET "SPI_MISO" IOSTANDARD = LVCMOS33; NET "SPI_MOSI" IOSTANDARD = LVCMOS33; NET "SPI_SCK" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[10]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[11]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[12]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[13]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[14]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[15]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[8]" IOSTANDARD = LVCMOS33; -NET "SRAM_DATA[9]" IOSTANDARD = LVCMOS33; NET "AVR_ENA" LOC = P58; -NET "CLKIN" LOC = P55; +NET "CLKIN" LOC = P125; NET "IRQ_DIR" LOC = P40; -NET "IRQ_DIR" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[0]" LOC = P7; NET "SNES_ADDR[10]" LOC = P32; NET "SNES_ADDR[11]" LOC = P35; @@ -126,13 +84,9 @@ NET "SRAM_ADDR[19]" LOC = P69; NET "SRAM_ADDR[8]" LOC = P68; NET "SRAM_ADDR[9]" LOC = P63; NET "SRAM_CE2[0]" LOC = P77; -NET "SRAM_CE2[0]" IOSTANDARD = LVCMOS33; NET "SRAM_CE2[1]" LOC = P76; -NET "SRAM_CE2[1]" IOSTANDARD = LVCMOS33; NET "SRAM_CE2[2]" LOC = P74; -NET "SRAM_CE2[2]" IOSTANDARD = LVCMOS33; NET "SRAM_CE2[3]" LOC = P73; -NET "SRAM_CE2[3]" IOSTANDARD = LVCMOS33; NET "SRAM_WE" LOC = P70; NET "SNES_DATABUS_DIR" LOC = P141; NET "SNES_DATABUS_OE" LOC = P140; @@ -144,7 +98,7 @@ NET "SNES_DATA[4]" LOC = P135; NET "SNES_DATA[5]" LOC = P131; NET "SNES_DATA[6]" LOC = P129; NET "SNES_DATA[7]" LOC = P127; -NET "SNES_IRQ" LOC = P125; +NET "SNES_IRQ" LOC = P55; NET "SPI_MISO" LOC = P123; NET "SPI_MOSI" LOC = P122; NET "SPI_SCK" LOC = P124; @@ -160,9 +114,7 @@ NET "SRAM_ADDR[5]" LOC = P85; NET "SRAM_ADDR[6]" LOC = P84; NET "SRAM_ADDR[7]" LOC = P83; NET "SRAM_BHE" LOC = P78; -NET "SRAM_BHE" IOSTANDARD = LVCMOS33; NET "SRAM_BLE" LOC = P79; -NET "SRAM_BLE" IOSTANDARD = LVCMOS33; NET "SRAM_DATA[0]" LOC = P95; NET "SRAM_DATA[10]" LOC = P100; NET "SRAM_DATA[11]" LOC = P103; @@ -182,8 +134,58 @@ NET "SRAM_DATA[9]" LOC = P98; NET "SRAM_OE" LOC = P93; NET "CLKIN" IOSTANDARD = LVCMOS33; -NET "CLKIN" PULLUP; +//NET "CLKIN" PULLUP; NET "SPI_SS" IOSTANDARD = LVCMOS33; NET "SPI_SS" PULLUP; //NET "DCM_RST" LOC = P46; //NET "DCM_RST" IOSTANDARD = LVCMOS33; +NET "IRQ_DIR" IOSTANDARD = LVCMOS33; +NET "SNES_DATABUS_DIR" IOSTANDARD = LVCMOS33; +NET "SNES_DATABUS_OE" IOSTANDARD = LVCMOS33; +NET "SNES_IRQ" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[0]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[10]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[11]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[12]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[13]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[14]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[15]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[16]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[17]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[18]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[19]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[1]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[2]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[3]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[4]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[5]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[6]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[7]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[8]" IOSTANDARD = LVCMOS33; +NET "SRAM_ADDR[9]" IOSTANDARD = LVCMOS33; +NET "SRAM_BHE" IOSTANDARD = LVCMOS33; +NET "SRAM_BLE" IOSTANDARD = LVCMOS33; +NET "SRAM_CE2[0]" IOSTANDARD = LVCMOS33; +NET "SRAM_CE2[1]" IOSTANDARD = LVCMOS33; +NET "SRAM_CE2[2]" IOSTANDARD = LVCMOS33; +NET "SRAM_CE2[3]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[0]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[10]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[11]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[12]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[13]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[14]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[15]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[1]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[2]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[3]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[4]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[5]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[6]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[7]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[8]" IOSTANDARD = LVCMOS33; +NET "SRAM_DATA[9]" IOSTANDARD = LVCMOS33; +NET "SRAM_OE" IOSTANDARD = LVCMOS33; +NET "SRAM_WE" IOSTANDARD = LVCMOS33; +TEMPERATURE = 60 C; +VOLTAGE = 1.25 V; diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index 3138e0b..d23c39b 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -309,13 +309,15 @@ initial begin SRAM_OE_ARRAY[2'b11] = 13'b0000000000000; SNES_DATA_TO_MEM_ARRAY[1'b0] = 13'b0001000000000; // SNES write + /* 13'b0001000000000 */ SNES_DATA_TO_MEM_ARRAY[1'b1] = 13'b0000000000000; // SNES read - AVR_DATA_TO_MEM_ARRAY[1'b0] = 13'b0000000010000; // AVR write + AVR_DATA_TO_MEM_ARRAY[1'b0] = 13'b0000000001000; // AVR write AVR_DATA_TO_MEM_ARRAY[1'b1] = 13'b0000000000000; // AVR read SRAM_DATA_TO_SNES_MEM_ARRAY[1'b0] = 13'b0000000000000; // SNES write SRAM_DATA_TO_SNES_MEM_ARRAY[1'b1] = 13'b0000100000000; // SNES read + /* 13'b0000100000000; */ SRAM_DATA_TO_AVR_MEM_ARRAY[1'b0] = 13'b0000000000000; // AVR write SRAM_DATA_TO_AVR_MEM_ARRAY[1'b1] = 13'b0000000000001; // AVR read @@ -328,7 +330,7 @@ end // we have 24 internal cycles to work with. (CLKIN * 4) always @(posedge CLK2) begin - CYCLE_RESET <= {CYCLE_RESET[0], SNES_cycle_start}; + CYCLE_RESET <= {CYCLE_RESET[0], SNES_RW_start}; end always @(posedge CLK2) begin diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise index 86f2ad4..975f83b 100644 --- a/verilog/sd2snes/sd2snes.xise +++ b/verilog/sd2snes/sd2snes.xise @@ -66,8 +66,8 @@ - +