diff --git a/avr/usbload/main.c b/avr/usbload/main.c index 3bac336..26fdc60 100644 --- a/avr/usbload/main.c +++ b/avr/usbload/main.c @@ -145,8 +145,8 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) req_percent = (uint32_t)( 100 * req_addr ) / req_addr_end; if (req_percent!=req_percent_last){ - debug(DEBUG_USB, - "USB_BULK_UPLOAD_ADDR: precent=%i\n", req_percent); + //debug(DEBUG_USB, + // "USB_BULK_UPLOAD_ADDR: precent=%i\n", req_percent); shared_memory_write(SHARED_MEM_TX_CMD_UPLOAD_PROGESS, req_percent); sram_bulk_write_start(req_addr); } @@ -283,20 +283,15 @@ void usb_connect() void boot_startup_rom() { - info("Activate AVR bus\n"); avr_bus_active(); - info("IRQ off\n"); snes_irq_lo(); snes_irq_off(); - snes_lorom(); info("Set Snes lowrom \n"); - rle_decode(&_rom, ROM_BUFFER_SIZE, 0x000000); dump_memory(0x10000 - 0x100, 0x10000); - snes_reset_hi(); snes_reset_off(); snes_irq_lo(); @@ -307,20 +302,9 @@ void boot_startup_rom() info("Disable snes WR\n"); snes_bus_active(); info("Activate Snes bus\n"); - _delay_ms(100); - info("Reset Snes\n"); + _delay_ms(20); send_reset(); - _delay_ms(100); -#if 0 - uint8_t i = 0; - i = 20; - info("Wait"); - while (--i) { - _delay_ms(500); - info("."); - } - info("\n"); -#endif + _delay_ms(200); } @@ -343,10 +327,12 @@ int main(void) info("Boot startup rom\n"); boot_startup_rom(); + usbInit(); usb_connect(); while (1) { + avr_bus_active(); info("Activate AVR bus\n"); info("IRQ off\n"); @@ -369,7 +355,6 @@ int main(void) snes_bus_active(); info("Activate Snes bus\n"); _delay_ms(100); - info("Reset Snes\n"); send_reset(); info("Poll\n"); @@ -411,6 +396,8 @@ int main(void) info("Read 0x3000=%c\n", c); #endif } + info("Boot startup rom\n"); + boot_startup_rom(); } return 0; diff --git a/avr/usbload/shared_memory.c b/avr/usbload/shared_memory.c index a46d7fb..e53ee2f 100644 --- a/avr/usbload/shared_memory.c +++ b/avr/usbload/shared_memory.c @@ -73,6 +73,7 @@ void shared_memory_write(uint8_t cmd, uint8_t value) debug(DEBUG_SHM,"shared_memory_write: 0x%04x=0x%02x 0x%04x=0x%02x \n", SHARED_MEM_TX_LOC_CMD, cmd, SHARED_MEM_TX_LOC_PAYLOAD, value); + sram_bulk_addr_save(); shared_memory_scratchpad_tx_save(); shared_memory_irq_hook(); @@ -81,6 +82,7 @@ void shared_memory_write(uint8_t cmd, uint8_t value) sram_write(SHARED_MEM_TX_LOC_PAYLOAD, value); snes_hirom(); + snes_wr_disable(); snes_bus_active(); #if SHARED_MEM_SWITCH_IRQ @@ -94,10 +96,14 @@ void shared_memory_write(uint8_t cmd, uint8_t value) #endif avr_bus_active(); + snes_irq_lo(); + snes_irq_off(); snes_lorom(); + snes_wr_disable(); shared_memory_scratchpad_tx_restore(); shared_memory_irq_restore(); + //sram_bulk_addr_restore(); } @@ -124,6 +130,7 @@ int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) if (state != SHARED_MEM_RX_AVR_ACK){ return 1; } + sram_bulk_addr_save(); *cmd = sram_read(SHARED_MEM_RX_LOC_CMD); *len = sram_read(SHARED_MEM_RX_LOC_LEN); @@ -134,6 +141,7 @@ int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) sram_write(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_AVR_RTS); snes_hirom(); + snes_wr_disable(); snes_bus_active(); #if SHARED_MEM_SWITCH_IRQ @@ -148,5 +156,7 @@ int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) avr_bus_active(); snes_lorom(); + snes_wr_disable(); + sram_bulk_addr_restore(); return 0; } diff --git a/avr/usbload/shared_memory.h b/avr/usbload/shared_memory.h index 803c4c6..8aff84c 100644 --- a/avr/usbload/shared_memory.h +++ b/avr/usbload/shared_memory.h @@ -54,8 +54,11 @@ #define SHARED_IRQ_LOC_LO 0x00fffe #define SHARED_IRQ_LOC_HI 0x00ffff -#define SHARED_IRQ_HANDLER_LO 0x00 -#define SHARED_IRQ_HANDLER_HI 0x10 +/* Use COP IRQ LOC for hooked IRQ handler */ +#define SHARED_IRQ_HANDLER_LO 0x0ffe4 +#define SHARED_IRQ_HANDLER_HI 0x0ffe5 + + void shared_memory_write(uint8_t cmd, uint8_t value); int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer); diff --git a/avr/usbload/sram.c b/avr/usbload/sram.c index 7b0de9e..14ae271 100644 --- a/avr/usbload/sram.c +++ b/avr/usbload/sram.c @@ -124,7 +124,7 @@ inline void sram_bulk_addr_save() inline void sram_bulk_addr_restore() { - sram_bulk_read_start(addr_stash); + sreg_set(addr_stash); }