Mercurial > repos > blastem
view trans.c @ 1863:d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 14 May 2019 23:20:35 -0700 |
parents | 0c1491818f4b |
children | 374a5ae694e8 57ae42c3ab45 |
line wrap: on
line source
/* Copyright 2013 Michael Pavone This file is part of BlastEm. BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #include "68kinst.h" #ifdef NEW_CORE #include "m68k.h" #else #include "m68k_core.h" #endif #include "mem.h" #include <stdio.h> #include <stdlib.h> #include <string.h> int headless = 1; void render_errorbox(char * title, char * buf) { } void render_infobox(char * title, char * buf) { } #ifndef NEW_CORE m68k_context * sync_components(m68k_context * context, uint32_t address) { if (context->current_cycle > 0x80000000) { context->current_cycle -= 0x80000000; } if (context->status & M68K_STATUS_TRACE || context->trace_pending) { context->target_cycle = context->current_cycle; } return context; } #endif m68k_context *reset_handler(m68k_context *context) { m68k_print_regs(context); exit(0); //unreachable return context; } int main(int argc, char ** argv) { long filesize; unsigned short *filebuf; char disbuf[1024]; unsigned short * cur; m68k_options opts; FILE * f = fopen(argv[1], "rb"); fseek(f, 0, SEEK_END); filesize = ftell(f); fseek(f, 0, SEEK_SET); filebuf = malloc(0x400000); memset(filebuf, 0, 0x400000); fread(filebuf, 2, filesize/2 > 0x200000 ? 0x200000 : filesize/2, f); fclose(f); for(cur = filebuf; cur - filebuf < (filesize/2); ++cur) { *cur = (*cur >> 8) | (*cur << 8); } memmap_chunk memmap[2]; memset(memmap, 0, sizeof(memmap_chunk)*2); memmap[0].end = 0x400000; memmap[0].mask = 0xFFFFFF; memmap[0].flags = MMAP_READ; memmap[0].buffer = filebuf; memmap[1].start = 0xE00000; memmap[1].end = 0x1000000; memmap[1].mask = 0xFFFF; memmap[1].flags = MMAP_READ | MMAP_WRITE | MMAP_CODE; memmap[1].buffer = malloc(64 * 1024); memset(memmap[1].buffer, 0, 64 * 1024); init_m68k_opts(&opts, memmap, 2, 1); m68k_context * context = init_68k_context(&opts, reset_handler); context->mem_pointers[0] = memmap[0].buffer; context->mem_pointers[1] = memmap[1].buffer; #ifndef NEW_CORE context->target_cycle = context->sync_cycle = 0x80000000; #endif m68k_reset(context); #ifdef NEW_CORE for (;;) { m68k_execute(context, 0x80000000); context->cycles = 0; } #endif return 0; }