basic ROM & SRAM mirroring [refactoring needed]

This commit is contained in:
ikari
2009-09-07 10:47:51 +02:00
parent be0fde297d
commit 66b0f0350e
12 changed files with 151 additions and 23 deletions

View File

@@ -100,7 +100,7 @@ FORMAT = ihex
TARGET = $(OBJDIR)/sd2snes
# List C source files here. (C dependencies are automatically generated.)
SRC = main.c ff.c utils.c timer.c led.c diskio.c sdcard.c spi.c crc7.c snes.c fpga.c memory.c crc16.c fileops.c fpga_spi.c
SRC = main.c ff.c utils.c timer.c led.c diskio.c sdcard.c spi.c crc7.c snes.c fpga.c memory.c crc16.c fileops.c fpga_spi.c filetypes.c
ifeq ($(CONFIG_UART_DEBUG),y)
SRC += uart.c

View File

@@ -1,5 +1,5 @@
// insert cool lenghty disclaimer here
// fileops.c: fatfs wrapping for convenience
// insert cool lengthy disclaimer here
// fileops.c: convenience
#include "config.h"
#include "uart.h"
@@ -29,3 +29,19 @@ UINT file_write() {
file_res = f_write(&file_handle, file_buf, sizeof(file_buf), &bytes_written);
return bytes_written;
}
UINT file_readblock(void* buf, uint32_t addr, uint16_t size) {
UINT bytes_read;
file_res = f_lseek(&file_handle, addr);
if(file_res) return 0;
file_res = f_read(&file_handle, buf, size, &bytes_read);
return bytes_read;
}
UINT file_writeblock(void* buf, uint32_t addr, uint16_t size) {
UINT bytes_written;
file_res = f_lseek(&file_handle, addr);
if(file_res) return 0;
file_res = f_write(&file_handle, buf, size, &bytes_written);
return bytes_written;
}

View File

@@ -15,4 +15,6 @@ void file_open(char* filename, BYTE flags);
void file_close(void);
UINT file_read(void);
UINT file_write(void);
UINT file_readblock(void* buf, uint32_t addr, uint16_t size);
UINT file_writeblock(void* buf, uint32_t addr, uint16_t size);
#endif

View File

@@ -6,8 +6,9 @@
cmd param function
=============================================
00 bb[hh[ll]] set address to 0xbbhhll
2s - set SRAM size to s
00 bb[hh[ll]] set address to 0xbb0000, 0xbbhh00, or 0xbbhhll
10 bbhhll set SNES input address mask to 0xbbhhll
2s bbhhll set SRAM address mask for chip #s to 0xbbhhll
3m - set mapper to m
0=HiROM, 1=LoROM
80 - read with increment
@@ -50,3 +51,20 @@ void set_avr_addr(uint32_t address) {
spi_sd();
}
void set_saveram_mask(uint32_t mask) {
spi_fpga();
spiTransferByte(0x20);
spiTransferByte((mask>>16)&0xff);
spiTransferByte((mask>>8)&0xff);
spiTransferByte((mask)&0xff);
spi_sd();
}
void set_rom_mask(uint32_t mask) {
spi_fpga();
spiTransferByte(0x10);
spiTransferByte((mask>>16)&0xff);
spiTransferByte((mask>>8)&0xff);
spiTransferByte((mask)&0xff);
spi_sd();
}

View File

@@ -8,3 +8,6 @@ void fpga_spi_test(void);
void spi_fpga(void);
void spi_sd(void);
void set_avr_addr(uint32_t);
void set_saveram_mask(uint32_t);
void set_rom_mask(uint32_t);

View File

@@ -174,7 +174,6 @@ int main(void) {
load_sram("/test.srm");
uart_putc(']');
set_busy_led(0);
set_avr_mapper(0);
set_avr_ena(1);
_delay_ms(100);
uart_puts_P(PSTR("SNES GO!"));

View File

@@ -1,5 +1,5 @@
// insert cool lenghty disclaimer here
// memory.c: ROM+RAM operations
// insert cool lengthy disclaimer here
// memory.c: SRAM operations
#include <stdint.h>
#include <avr/pgmspace.h>
@@ -14,24 +14,53 @@
#include "fpga_spi.h"
#include "avrcompat.h"
#include "led.h"
#include "filetypes.h"
#include "fpga_spi.h"
char* hex = "0123456789ABCDEF";
void sram_readblock(void* buf, uint32_t addr, uint16_t size) {
uint16_t count=size;
void* tgt = buf;
set_avr_addr(addr);
spi_fpga();
spiTransferByte(0x81); // READ
spiTransferByte(0x00); // dummy
while(count--) {
*((uint8_t*)tgt++) = spiTransferByte(0x00);
}
spi_sd();
}
void sram_writeblock(void* buf, uint32_t addr, uint16_t size) {
uint16_t count=size;
void* src = buf;
set_avr_addr(addr);
spi_fpga();
spiTransferByte(0x91); // WRITE
while(count--) {
spiTransferByte(*((uint8_t*)src++));
}
spiTransferByte(0x00); // dummy
spi_sd();
}
uint32_t load_rom(char* filename) {
// TODO Mapper, Mirroring, Bankselect
// snes_rom_properties_t romprops;
snes_romprops_t romprops;
// set_avr_bank(0);
UINT bytes_read;
DWORD filesize;
UINT count=0;
file_open(filename, FA_READ);
filesize = file_handle.fsize;
smc_id(&romprops);
if(file_res) {
uart_putc('?');
uart_putc(0x30+file_res);
return 0;
}
// snes_rom_id(&romprops, &file_handle);
f_lseek(&file_handle, romprops.offset);
for(;;) {
FPGA_SS_HIGH();
SPI_SS_LOW();
@@ -46,14 +75,35 @@ uint32_t load_rom(char* filename) {
}
for(int j=0; j<bytes_read; j++) {
spiTransferByte(file_buf[j]);
// uart_putc((file_buf[j] > 0x20)
// && (file_buf[j] < ('z'+1)) ? file_buf[j]:'.');
// _delay_ms(2);
}
spiTransferByte(0x00); // dummy tx for increment+write pulse
FPGA_SS_HIGH();
}
file_close();
set_avr_mapper(romprops.mapper_id);
uart_puthex(romprops.header.map);
uart_putc(0x30+romprops.mapper_id);
uint32_t rammask;
uint32_t rommask;
if(romprops.header.ramsize == 0) {
rammask = 0;
} else {
rammask = ((uint32_t)1024 << (romprops.header.ramsize)) - 1;
}
rommask = ((uint32_t)1024 << (romprops.header.romsize)) - 1;
uart_putc(' ');
uart_puthex(romprops.header.ramsize);
uart_putc('-');
uart_puthexlong(rammask);
uart_putc(' ');
uart_puthex(romprops.header.romsize);
uart_putc('-');
uart_puthexlong(rommask);
set_saveram_mask(rammask);
set_rom_mask(rommask);
return (uint32_t)filesize;
}

View File

@@ -72,6 +72,13 @@ void uart_puthex(uint8_t num) {
uart_putc('a'+tmp-10);
}
void uart_puthexlong(uint32_t num) {
uart_puthex((num>>24)&0xff);
uart_puthex((num>>16)&0xff);
uart_puthex((num>>8)&0xff);
uart_puthex(num&0xff);
}
void uart_trace(void *ptr, uint16_t start, uint16_t len) {
uint16_t i;
uint8_t j;

View File

@@ -35,6 +35,7 @@ void uart_init(void);
unsigned char uart_getc(void);
void uart_putc(char c);
void uart_puthex(uint8_t num);
void uart_puthexlong(uint32_t num);
void uart_trace(void *ptr, uint16_t start, uint16_t len);
void uart_flush(void);
void uart_puts_P(prog_char *text);