X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=mx%2Flinux%2Fmx_flasher.c;h=1bec2783394a838412a183155518e3b928c831d7;hb=65d9165cf790c51d46b68866f47b042105083f43;hp=e831d3c4abf7cb2036d0354b6908f7f181740d56;hpb=fa45c6d9d1be59d152ce7775297436fba6d15de4;p=megadrive.git diff --git a/mx/linux/mx_flasher.c b/mx/linux/mx_flasher.c index e831d3c..1bec278 100644 --- a/mx/linux/mx_flasher.c +++ b/mx/linux/mx_flasher.c @@ -13,16 +13,16 @@ * 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 - * 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 - * 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 - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include @@ -45,9 +45,10 @@ 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_BLK_SIZE 0x2000 /* 8K - unreliable? */ +#define IO_BLK_SIZE 0x800 #define IO_RAM_BLK_SIZE 256 #define CMD_ATM_READY 0x22 @@ -490,7 +491,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); @@ -1003,7 +1004,8 @@ breakloop: if (do_check && (w_fname[ret - 4] == '.' || w_fname[ret - 3] == '.' || w_fname[ret - 2] == '.') && strcasecmp(&w_fname[ret - 4], ".gen") != 0 && - strcasecmp(&w_fname[ret - 4], ".bin") != 0) { + strcasecmp(&w_fname[ret - 4], ".bin") != 0 && + strcasecmp(&w_fname[ret - 4], ".32x") != 0) { fprintf(stderr, "\"%s\" doesn't look like a game ROM, aborting " "(use -f to disable this check)\n", w_fname); return 1; @@ -1013,6 +1015,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; } @@ -1057,28 +1072,6 @@ breakloop: goto end; } - /* set mode */ - if (mx_mode || w_fsize > 0x200000) { - if (mx_mode == 0) - mx_mode = '3'; - printf("MX mode set to "); - switch (mx_mode) { - case '1': - printf("2M with RAM.\n"); - mx_mode = C_MODE_2M_RAM; - break; - case '2': - printf("4M, no RAM.\n"); - mx_mode = C_MODE_4M_NORAM; - break; - default: - printf("4M with RAM.\n"); - mx_mode = C_MODE_4M_RAM; - break; - } - set_ram_mode(device, mx_mode); - } - /* erase */ if (do_erase_size != 0) { if (erase_method) @@ -1134,6 +1127,28 @@ breakloop: fprintf(stderr, "warning: failed to save RAM filename\n"); } + /* set mode */ + if (mx_mode || w_fsize > 0x200000) { + if (mx_mode == 0) + mx_mode = '3'; + printf("MX mode set to "); + switch (mx_mode) { + case '1': + printf("2M with RAM.\n"); + mx_mode = C_MODE_2M_RAM; + break; + case '2': + printf("4M, no RAM.\n"); + mx_mode = C_MODE_4M_NORAM; + break; + default: + printf("4M with RAM.\n"); + mx_mode = C_MODE_4M_RAM; + break; + } + set_ram_mode(device, mx_mode); + } + /* read flash */ if (do_read && r_fname == NULL) { ret = read_filename(device, fname_buff, sizeof(fname_buff), FILENAME_ROM0);