* 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>
{ 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
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);
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;
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;
}
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)
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);