mx_flasher: set mode after other writes
[megadrive.git] / mx / linux / mx_flasher.c
index 9cb5e3c..1bec278 100644 (file)
  *       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 <copyright holder> 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 <stdio.h>
 #include <string.h>
@@ -47,7 +47,8 @@ static const struct {
 
 #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
@@ -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;
@@ -1070,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)
@@ -1147,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);