From a7eaf970b2a6b24a8907d50605b0d07d8015f59b Mon Sep 17 00:00:00 2001 From: paul eeepc Date: Mon, 12 Dec 2016 10:56:53 -0600 Subject: [PATCH] CHR-ROM dumping working for NROM checksum appears to be off need to compare files. --- firmware/source/dump.c | 4 ++-- firmware/source/nes.c | 48 ++++++++++++++++++++++++++++++++++++++++++ firmware/source/temp | 20 ++++++++++++++++++ host/source/dump.c | 20 ++++++++++++++++++ host/source/temp | 20 ++++++++++++++++++ 5 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 firmware/source/temp create mode 100644 host/source/temp diff --git a/firmware/source/dump.c b/firmware/source/dump.c index b30140b..321c884 100644 --- a/firmware/source/dump.c +++ b/firmware/source/dump.c @@ -24,8 +24,8 @@ uint8_t dump_page( buffer *buff ) { buff->last_idx, ~FALSE ); break; case CHRROM: //$0000 - //buff->cur_byte = nes_ppu_page_rd( buff->data, addrH, buff->id, - // (buff->last_idx | buff->id) ); + buff->cur_byte = nes_ppu_page_rd_poll( buff->data, addrH, buff->id, + buff->last_idx, ~FALSE ); break; case PRGRAM: addrH |= 0x60; //$6000 diff --git a/firmware/source/nes.c b/firmware/source/nes.c index c468f2e..483088e 100644 --- a/firmware/source/nes.c +++ b/firmware/source/nes.c @@ -442,3 +442,51 @@ uint8_t nes_cpu_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8 //return index of last byte read return i; } + +/* Desc:NES PPU Page Read with optional USB polling + * decode A13 from addrH to set /A13 as expected + * if poll is true calls usbdrv.h usbPoll fuction + * this is needed to keep from timing out when double buffering usb data + * Pre: nes_init() setup of io pins + * num_bytes can't exceed 256B page boundary + * Post:address left on bus + * data bus left clear + * data buffer filled starting at first for len number of bytes + * Rtn: Index of last byte read + */ +uint8_t nes_ppu_page_rd_poll( uint8_t *data, uint8_t addrH, uint8_t first, uint8_t len, uint8_t poll ) +{ + uint8_t i; + + if (addrH < 0x20) { //below $2000 A13 clear, /A13 set + _ADDRH_SET(addrH | PPU_A13N); + } else { //above PPU $1FFF, A13 set, /A13 clear + _ADDRH_SET(addrH); + } + + //set CHR /RD and /WR + _CSRD_LO(); + + //set lower address bits + ADDR_OUT = first; //doing this prior to entry and right after latching + //gives longest delay between address out and latching data + for( i=0; i<=len; i++ ) { + //couple more NOP's waiting for data + if ( poll == FALSE ) { + NOP(); //one prob good enough considering the if/else + NOP(); + } else { + usbPoll(); + } + //latch data + data[i] = DATA_IN; + //set lower address bits + ADDR_OUT = ++first; + } + + //return bus to default + _CSRD_HI(); + + //return index of last byte read + return i; +} diff --git a/firmware/source/temp b/firmware/source/temp new file mode 100644 index 0000000..5cd31c1 --- /dev/null +++ b/firmware/source/temp @@ -0,0 +1,20 @@ +AVR Memory Usage +---------------- +Device: atmega164a + +Program: 5486 bytes (33.5% Full) +(.text + .data + .bootloader) + +Data: 653 bytes (63.8% Full) +(.data + .bss + .noinit) + +AVR Memory Usage +---------------- +Device: atmega164a + +Program: 5498 bytes (33.6% Full) +(.text + .data + .bootloader) + +Data: 653 bytes (63.8% Full) +(.data + .bss + .noinit) + diff --git a/host/source/dump.c b/host/source/dump.c index a4fee29..7337df7 100644 --- a/host/source/dump.c +++ b/host/source/dump.c @@ -114,8 +114,28 @@ int dump_cart( USBtransfer* transfer, rom_image *rom, cartridge *cart ) //tell buffer manager when to stop + // or not..? just reset buffers and start next memory or quit //reset buffers and setup to dump CHR-ROM + check(! reset_buffers( transfer ), "Unable to reset device buffers"); + check(! allocate_buffers( transfer, num_buffers, buff_size ), "Unable to allocate buffers"); + check(! set_mem_n_part( transfer, buff0, CHRROM, MASKROM ), "Unable to set mem_type and part"); + check(! set_mem_n_part( transfer, buff1, CHRROM, MASKROM ), "Unable to set mem_type and part"); + check(! set_map_n_mapvar( transfer, buff0, NROM, NILL ), "Unable to set mapper and map_var"); + check(! set_map_n_mapvar( transfer, buff1, NROM, NILL ), "Unable to set mapper and map_var"); + + debug("\n\nsetting operation STARTDUMP"); + check(! set_buff_operation( transfer, STARTDUMP ), "Unable to set buffer operation"); + + for( i=0; i<(8*KByte/buff_size); i++) { + //payload transfer in and append to file + if ( i % 256 == 0 ) debug("payload in #%d", i); + check(! payload_in( transfer, data, buff_size ), "Error with payload IN"); + if (i==0) printf("first byte: %x\n", data[0]); + check(! append_to_file( rom, data, buff_size ), "Error with file append"); + } + debug("payload done"); + //close file in main //reset io at end diff --git a/host/source/temp b/host/source/temp new file mode 100644 index 0000000..5cd31c1 --- /dev/null +++ b/host/source/temp @@ -0,0 +1,20 @@ +AVR Memory Usage +---------------- +Device: atmega164a + +Program: 5486 bytes (33.5% Full) +(.text + .data + .bootloader) + +Data: 653 bytes (63.8% Full) +(.data + .bss + .noinit) + +AVR Memory Usage +---------------- +Device: atmega164a + +Program: 5498 bytes (33.6% Full) +(.text + .data + .bootloader) + +Data: 653 bytes (63.8% Full) +(.data + .bss + .noinit) +