X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=mx%2Flinux%2Fmx_flasher.c;h=62bb0b6330925c7db75ac1d3e20d84bbf61e8264;hb=f28eaaadd73dce455231733228d3f0cbbf4462de;hp=e831d3c4abf7cb2036d0354b6908f7f181740d56;hpb=fa45c6d9d1be59d152ce7775297436fba6d15de4;p=megadrive.git diff --git a/mx/linux/mx_flasher.c b/mx/linux/mx_flasher.c index e831d3c..62bb0b6 100644 --- a/mx/linux/mx_flasher.c +++ b/mx/linux/mx_flasher.c @@ -13,10 +13,10 @@ * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND @@ -45,7 +45,7 @@ static const struct { { 0x03eb, 0x202d, "32MX+UF Game Device" }, }; -#define VERSION "0.9" +#define VERSION "0.91" #define IO_BLK_SIZE 0x2000 /* 8K */ #define IO_RAM_BLK_SIZE 256 @@ -490,7 +490,7 @@ static int read_write_rom(struct usb_dev_handle *dev, u32 addr, void *buffer, in print_progress(total_bytes, total_bytes); } - if (count & 1) + if ((count & 1) && !is_write) /* work around rw_dev_block() limitation 3 (works for reads only?) */ rw_dev_block(dev, 0, dummy, sizeof(dummy), 0); @@ -1013,6 +1013,19 @@ breakloop: if (ret < 0) return 1; + /* align size to 64 */ + ret = (w_fsize + 63) & ~63; + if (w_fsize != ret) { + printf("ROM image size is %d, padding to %d\n", w_fsize, ret); + w_fdata = realloc(w_fdata, ret); + if (w_fdata == NULL) { + fprintf(stderr, "low mem\n"); + return 1; + } + memset((char *)w_fdata + w_fsize, 0, ret - w_fsize); + w_fsize = ret; + } + if (do_erase_size < w_fsize) do_erase_size = w_fsize; }