--- uae/src/memory.c 2018/04/24 16:38:39 1.1 +++ uae/src/memory.c 2018/04/24 16:39:12 1.1.1.2 @@ -17,10 +17,11 @@ #include "ersatz.h" #include "zfile.h" #include "events.h" +#include "readcpu.h" #include "newcpu.h" #include "compiler.h" -#ifdef USE_COMPILER +#ifdef USE_MAPPED_MEMORY #include #endif @@ -29,26 +30,61 @@ int ersatzkickfile = 0; int buserr; addrbank membanks[65536]; +#ifdef NO_INLINE_MEMORY_ACCESS +__inline__ ULONG alongget(CPTR addr) +{ + return call_mem_get_func(membanks[bankindex(addr)].alget, addr); +} +__inline__ ULONG awordget(CPTR addr) +{ + return call_mem_get_func(membanks[bankindex(addr)].awget, addr); +} +__inline__ ULONG longget(CPTR addr) +{ + return call_mem_get_func(membanks[bankindex(addr)].lget, addr); +} +__inline__ ULONG wordget(CPTR addr) +{ + return call_mem_get_func(membanks[bankindex(addr)].wget, addr); +} +__inline__ ULONG byteget(CPTR addr) +{ + return call_mem_get_func(membanks[bankindex(addr)].bget, addr); +} +__inline__ void longput(CPTR addr, ULONG l) +{ + call_mem_put_func(membanks[bankindex(addr)].lput, addr, l); +} +__inline__ void wordput(CPTR addr, ULONG w) +{ + call_mem_put_func(membanks[bankindex(addr)].wput, addr, w); +} +__inline__ void byteput(CPTR addr, ULONG b) +{ + call_mem_put_func(membanks[bankindex(addr)].bput, addr, b); +} +#endif + /* Default memory access functions */ -int default_check(CPTR a, ULONG b) +int REGPARAM2 default_check(CPTR a, ULONG b) { return 0; } -UBYTE *default_xlate(CPTR a) +UBYTE REGPARAM2 *default_xlate(CPTR a) { fprintf(stderr, "Your Amiga program just did something terribly stupid\n"); return 0; } -UWORD default_awget(CPTR addr) +ULONG REGPARAM2 default_awget(CPTR addr) { default_xlate(addr); return 0; } -ULONG default_alget(CPTR addr) +ULONG REGPARAM2 default_alget(CPTR addr) { default_xlate(addr); return 0; @@ -57,45 +93,45 @@ ULONG default_alget(CPTR addr) /* A dummy bank that only contains zeros */ static ULONG dummy_lget(CPTR) REGPARAM; -static UWORD dummy_wget(CPTR) REGPARAM; -static UBYTE dummy_bget(CPTR) REGPARAM; +static ULONG dummy_wget(CPTR) REGPARAM; +static ULONG dummy_bget(CPTR) REGPARAM; static void dummy_lput(CPTR, ULONG) REGPARAM; -static void dummy_wput(CPTR, UWORD) REGPARAM; -static void dummy_bput(CPTR, UBYTE) REGPARAM; +static void dummy_wput(CPTR, ULONG) REGPARAM; +static void dummy_bput(CPTR, ULONG) REGPARAM; static int dummy_check(CPTR addr, ULONG size) REGPARAM; -ULONG dummy_lget(CPTR addr) +ULONG REGPARAM2 dummy_lget(CPTR addr) { if (illegal_mem) printf("Illegal lget at %08lx pc=%08lx\n",addr,m68k_getpc()); return 0; } -UWORD dummy_wget(CPTR addr) +ULONG REGPARAM2 dummy_wget(CPTR addr) { if (illegal_mem) printf("Illegal wget at %08lx pc=%08lx\n",addr,m68k_getpc()); return 0; } -UBYTE dummy_bget(CPTR addr) +ULONG REGPARAM2 dummy_bget(CPTR addr) { if (illegal_mem) printf("Illegal bget at %08lx pc=%08lx\n",addr,m68k_getpc()); return 0; } -void dummy_lput(CPTR addr, ULONG l) +void REGPARAM2 dummy_lput(CPTR addr, ULONG l) { if (illegal_mem) printf("Illegal lput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -void dummy_wput(CPTR addr, UWORD w) +void REGPARAM2 dummy_wput(CPTR addr, ULONG w) { if (illegal_mem) printf("Illegal wput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -void dummy_bput(CPTR addr, UBYTE b) +void REGPARAM2 dummy_bput(CPTR addr, ULONG b) { if (illegal_mem) printf("Illegal bput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -int dummy_check(CPTR addr, ULONG size) +int REGPARAM2 dummy_check(CPTR addr, ULONG size) { if (illegal_mem) printf("Illegal check at %08lx pc=%08lx\n",addr,m68k_getpc()); return 0; @@ -108,103 +144,97 @@ ULONG chipmem_mask,kickmem_mask,bogomem_ UBYTE *chipmemory; static ULONG chipmem_alget(CPTR) REGPARAM; -static UWORD chipmem_awget(CPTR) REGPARAM; +static ULONG chipmem_awget(CPTR) REGPARAM; static ULONG chipmem_lget(CPTR) REGPARAM; -static UWORD chipmem_wget(CPTR) REGPARAM; -static UBYTE chipmem_bget(CPTR) REGPARAM; +static ULONG chipmem_wget(CPTR) REGPARAM; +static ULONG chipmem_bget(CPTR) REGPARAM; static void chipmem_lput(CPTR, ULONG) REGPARAM; -static void chipmem_wput(CPTR, UWORD) REGPARAM; -static void chipmem_bput(CPTR, UBYTE) REGPARAM; +static void chipmem_wput(CPTR, ULONG) REGPARAM; +static void chipmem_bput(CPTR, ULONG) REGPARAM; static int chipmem_check(CPTR addr, ULONG size) REGPARAM; static UBYTE *chipmem_xlate(CPTR addr) REGPARAM; -ULONG chipmem_alget(CPTR addr) +ULONG REGPARAM2 chipmem_alget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= chipmem_mask; + m = (ULONG *)(chipmemory + addr); + return do_get_mem_long(m); } -UWORD chipmem_awget(CPTR addr) +ULONG REGPARAM2 chipmem_awget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= chipmem_mask; + m = (UWORD *)(chipmemory + addr); + return do_get_mem_word(m); } -ULONG chipmem_lget(CPTR addr) +ULONG REGPARAM2 chipmem_lget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= chipmem_mask; + m = (ULONG *)(chipmemory + addr); + return do_get_mem_long(m); } -UWORD chipmem_wget(CPTR addr) +ULONG REGPARAM2 chipmem_wget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= chipmem_mask; + m = (UWORD *)(chipmemory + addr); + return do_get_mem_word(m); } -UBYTE chipmem_bget(CPTR addr) +ULONG REGPARAM2 chipmem_bget(CPTR addr) { addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; + addr &= chipmem_mask; return chipmemory[addr]; } -void chipmem_lput(CPTR addr, ULONG l) +void REGPARAM2 chipmem_lput(CPTR addr, ULONG l) { - UBYTE *m; + ULONG *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - m[0] = l >> 24; - m[1] = l >> 16; - m[2] = l >> 8; - m[3] = l; + addr &= chipmem_mask; + m = (ULONG *)(chipmemory + addr); + do_put_mem_long(m, l); } -void chipmem_wput(CPTR addr, UWORD w) +void REGPARAM2 chipmem_wput(CPTR addr, ULONG w) { - UBYTE *m; + UWORD *m; addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; - m = chipmemory + addr; - m[0] = w >> 8; - m[1] = w; + addr &= chipmem_mask; + m = (UWORD *)(chipmemory + addr); + do_put_mem_word(m, w); } -void chipmem_bput(CPTR addr, UBYTE b) +void REGPARAM2 chipmem_bput(CPTR addr, ULONG b) { addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; + addr &= chipmem_mask; chipmemory[addr] = b; } -int chipmem_check(CPTR addr, ULONG size) +int REGPARAM2 chipmem_check(CPTR addr, ULONG size) { addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; + addr &= chipmem_mask; return (addr + size) < chipmem_size; } -UBYTE *chipmem_xlate(CPTR addr) +UBYTE REGPARAM2 *chipmem_xlate(CPTR addr) { addr -= chipmem_start & chipmem_mask; - addr &= chipmem_size-1; + addr &= chipmem_mask; return chipmemory + addr; } @@ -213,101 +243,95 @@ UBYTE *chipmem_xlate(CPTR addr) static UBYTE *bogomemory; static ULONG bogomem_alget(CPTR) REGPARAM; -static UWORD bogomem_awget(CPTR) REGPARAM; +static ULONG bogomem_awget(CPTR) REGPARAM; static ULONG bogomem_lget(CPTR) REGPARAM; -static UWORD bogomem_wget(CPTR) REGPARAM; -static UBYTE bogomem_bget(CPTR) REGPARAM; +static ULONG bogomem_wget(CPTR) REGPARAM; +static ULONG bogomem_bget(CPTR) REGPARAM; static void bogomem_lput(CPTR, ULONG) REGPARAM; -static void bogomem_wput(CPTR, UWORD) REGPARAM; -static void bogomem_bput(CPTR, UBYTE) REGPARAM; +static void bogomem_wput(CPTR, ULONG) REGPARAM; +static void bogomem_bput(CPTR, ULONG) REGPARAM; static int bogomem_check(CPTR addr, ULONG size) REGPARAM; static UBYTE *bogomem_xlate(CPTR addr) REGPARAM; -ULONG bogomem_alget(CPTR addr) +ULONG REGPARAM2 bogomem_alget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= bogomem_mask; + m = (ULONG *)(bogomemory + addr); + return do_get_mem_long(m); } -UWORD bogomem_awget(CPTR addr) +ULONG REGPARAM2 bogomem_awget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= bogomem_mask; + m = (UWORD *)(bogomemory + addr); + return do_get_mem_word(m); } -ULONG bogomem_lget(CPTR addr) +ULONG REGPARAM2 bogomem_lget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= bogomem_mask; + m = (ULONG *)(bogomemory + addr); + return do_get_mem_long(m); } -UWORD bogomem_wget(CPTR addr) +ULONG REGPARAM2 bogomem_wget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= bogomem_mask; + m = (UWORD *)(bogomemory + addr); + return do_get_mem_word(m); } -UBYTE bogomem_bget(CPTR addr) +ULONG REGPARAM2 bogomem_bget(CPTR addr) { addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; + addr &= bogomem_mask; return bogomemory[addr]; } -void bogomem_lput(CPTR addr, ULONG l) +void REGPARAM2 bogomem_lput(CPTR addr, ULONG l) { - UBYTE *m; + ULONG *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - m[0] = l >> 24; - m[1] = l >> 16; - m[2] = l >> 8; - m[3] = l; + addr &= bogomem_mask; + m = (ULONG *)(bogomemory + addr); + do_put_mem_long(m, l); } -void bogomem_wput(CPTR addr, UWORD w) +void REGPARAM2 bogomem_wput(CPTR addr, ULONG w) { - UBYTE *m; + UWORD *m; addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; - m = bogomemory + addr; - m[0] = w >> 8; - m[1] = w; + addr &= bogomem_mask; + m = (UWORD *)(bogomemory + addr); + do_put_mem_word(m, w); } -void bogomem_bput(CPTR addr, UBYTE b) +void REGPARAM2 bogomem_bput(CPTR addr, ULONG b) { addr -= bogomem_start & bogomem_mask; - addr &= bogomem_size-1; + addr &= bogomem_mask; bogomemory[addr] = b; } -int bogomem_check(CPTR addr, ULONG size) +int REGPARAM2 bogomem_check(CPTR addr, ULONG size) { - addr -= bogomem_start & (bogomem_size-1); - addr &= bogomem_size-1; + addr -= bogomem_start & bogomem_mask; + addr &= bogomem_mask; return (addr + size) < bogomem_size; } -UBYTE *bogomem_xlate(CPTR addr) +UBYTE REGPARAM2 *bogomem_xlate(CPTR addr) { - addr -= bogomem_start & (bogomem_size-1); - addr &= bogomem_size-1; + addr -= bogomem_start & bogomem_mask; + addr &= bogomem_mask; return bogomemory + addr; } @@ -317,87 +341,85 @@ static int zkickfile = 0; UBYTE *kickmemory; static ULONG kickmem_alget(CPTR) REGPARAM; -static UWORD kickmem_awget(CPTR) REGPARAM; +static ULONG kickmem_awget(CPTR) REGPARAM; static ULONG kickmem_lget(CPTR) REGPARAM; -static UWORD kickmem_wget(CPTR) REGPARAM; -static UBYTE kickmem_bget(CPTR) REGPARAM; +static ULONG kickmem_wget(CPTR) REGPARAM; +static ULONG kickmem_bget(CPTR) REGPARAM; static void kickmem_lput(CPTR, ULONG) REGPARAM; -static void kickmem_wput(CPTR, UWORD) REGPARAM; -static void kickmem_bput(CPTR, UBYTE) REGPARAM; +static void kickmem_wput(CPTR, ULONG) REGPARAM; +static void kickmem_bput(CPTR, ULONG) REGPARAM; static int kickmem_check(CPTR addr, ULONG size) REGPARAM; static UBYTE *kickmem_xlate(CPTR addr) REGPARAM; -ULONG kickmem_alget(CPTR addr) +ULONG REGPARAM2 kickmem_alget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= kickmem_start & kickmem_mask; - addr &= kickmem_size-1; - m = kickmemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= kickmem_mask; + m = (ULONG *)(kickmemory + addr); + return do_get_mem_long(m); } -UWORD kickmem_awget(CPTR addr) +ULONG REGPARAM2 kickmem_awget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= kickmem_start & kickmem_mask; - addr &= kickmem_size-1; - m = kickmemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= kickmem_mask; + m = (UWORD *)(kickmemory + addr); + return do_get_mem_word(m); } -ULONG kickmem_lget(CPTR addr) +ULONG REGPARAM2 kickmem_lget(CPTR addr) { - UBYTE *m; + ULONG *m; addr -= kickmem_start & kickmem_mask; - addr &= kickmem_size-1; - m = kickmemory + addr; - return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) - + ((ULONG)m[2] << 8) + ((ULONG)m[3])); + addr &= kickmem_mask; + m = (ULONG *)(kickmemory + addr); + return do_get_mem_long(m); } -UWORD kickmem_wget(CPTR addr) +ULONG REGPARAM2 kickmem_wget(CPTR addr) { - UBYTE *m; + UWORD *m; addr -= kickmem_start & kickmem_mask; - addr &= kickmem_size-1; - m = kickmemory + addr; - return ((UWORD)m[0] << 8) + m[1]; + addr &= kickmem_mask; + m = (UWORD *)(kickmemory + addr); + return do_get_mem_word(m); } -UBYTE kickmem_bget(CPTR addr) +ULONG REGPARAM2 kickmem_bget(CPTR addr) { addr -= kickmem_start & kickmem_mask; - addr &= kickmem_size-1; + addr &= kickmem_mask; return kickmemory[addr]; } -void kickmem_lput(CPTR addr, ULONG b) +void REGPARAM2 kickmem_lput(CPTR addr, ULONG b) { if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -void kickmem_wput(CPTR addr, UWORD b) +void REGPARAM2 kickmem_wput(CPTR addr, ULONG b) { if (illegal_mem) printf("Illegal kickmem wput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -void kickmem_bput(CPTR addr, UBYTE b) +void REGPARAM2 kickmem_bput(CPTR addr, ULONG b) { if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc()); } -int kickmem_check(CPTR addr, ULONG size) +int REGPARAM2 kickmem_check(CPTR addr, ULONG size) { - addr -= kickmem_start & (kickmem_size-1); - addr &= kickmem_size-1; + addr -= kickmem_start & kickmem_mask; + addr &= kickmem_mask; return (addr + size) < kickmem_size; } -UBYTE *kickmem_xlate(CPTR addr) +UBYTE REGPARAM2 *kickmem_xlate(CPTR addr) { - addr -= kickmem_start & (kickmem_size-1); - addr &= kickmem_size-1; + addr -= kickmem_start & kickmem_mask; + addr &= kickmem_mask; return kickmemory + addr; } @@ -411,6 +433,15 @@ static int load_kickstart(void) if (f == NULL) { fprintf(stderr, "No Kickstart ROM found.\n"); +#if defined(AMIGA) +#define USE_UAE_ERSATZ "USE_UAE_ERSATZ" + fprintf(stderr, "Using current ROM. (create ENV:%s to " + "use uae's ROM replacement)\n",USE_UAE_ERSATZ); + if(!getenv(USE_UAE_ERSATZ)) { + memcpy(kickmemory,(char*)0x1000000-kickmem_size,kickmem_size); + goto chk_sum; + } +#endif return 0; } @@ -423,7 +454,7 @@ static int load_kickstart(void) i = fread(kickmemory, 1, kickmem_size, f); if (i == kickmem_size/2) { - fprintf(stderr, "Warning: Kickstart is only 256K.\n"); +/* fprintf(stderr, "Warning: Kickstart is only 256K.\n"); */ memcpy (kickmemory + kickmem_size/2, kickmemory, kickmem_size/2); } else if (i != kickmem_size) { fprintf(stderr, "Error while reading Kickstart.\n"); @@ -431,6 +462,10 @@ static int load_kickstart(void) } zfile_close (f); +#if defined(AMIGA) + chk_sum: +#endif + for (i = 0; i < kickmem_size; i+=4) { ULONG data = kickmemory[i]*65536*256 + kickmemory[i+1]*65536 + kickmemory[i+2]*256 + kickmemory[i+3]; cksum += data; @@ -438,7 +473,7 @@ static int load_kickstart(void) cksum++; prevck = cksum; } - if (cksum != 0xFFFFFFFF) { + if (cksum != 0xFFFFFFFFul) { fprintf(stderr, "Warning: Kickstart checksum incorrect. You probably have a corrupted ROM image.\n"); } return 1; @@ -476,7 +511,7 @@ addrbank kickmem_bank = { char *address_space, *good_address_map; int good_address_fd; - +#define MAKE_USER_PROGRAMS_BEHAVE 1 void memory_init(void) { char buffer[4096]; @@ -488,10 +523,23 @@ void memory_init(void) kickmem_mask = kickmem_size - 1; bogomem_mask = bogomem_size - 1; -#ifdef USE_COMPILER +#ifdef USE_MAPPED_MEMORY fd = open("/dev/zero", O_RDWR); good_address_map = mmap(NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0); - address_space = mmap(NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0); + /* Don't believe USER_PROGRAMS_BEHAVE. Otherwise, we'd segfault as soon + * as a decrunch routine tries to do color register hacks. */ + address_space = mmap(NULL, 1 << 24, PROT_READ | (USER_PROGRAMS_BEHAVE || MAKE_USER_PROGRAMS_BEHAVE? PROT_WRITE : 0), MAP_PRIVATE, fd, 0); + if ((int)address_space < 0 || (int)good_address_map < 0) { + fprintf(stderr, "Your system does not have enough virtual memory - increase swap.\n"); + abort(); + } +#ifdef MAKE_USER_PROGRAMS_BEHAVE + memset(address_space + 0xDFF180, 0xFF, 32*2); +#else + /* Likewise. This is mostly for mouse button checks. */ + if (USER_PROGRAMS_BEHAVE) + memset(address_space + 0xA00000, 0xFF, 0xF00000 - 0xA00000); +#endif chipmemory = mmap(address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0); kickmemory = mmap(address_space + 0xF80000, 0x80000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0); @@ -511,6 +559,10 @@ void memory_init(void) #else chipmemory = (UBYTE *)malloc(chipmem_size); kickmemory = (UBYTE *)malloc(kickmem_size); + if(!chipmemory || !kickmemory) { + fprintf(stderr,"virtual memory exhausted !\n"); + abort(); + } #endif for(i = 0; i < 65536; i++) @@ -524,6 +576,10 @@ void memory_init(void) if (bogomem_size > 0) { bogomemory = (UBYTE *)malloc(bogomem_size); + if(!bogomemory) { + fprintf(stderr,"virtual memory exhausted !\n"); + abort(); + } map_banks(&bogomem_bank, 0xC0, bogomem_size >> 16); } @@ -544,7 +600,7 @@ void map_banks(addrbank *bank, int start { int bnr; int hioffs = 0; -#if 0 && CPU_LEVEL < 2 +#if 1 || CPU_LEVEL < 2 for (hioffs = 0; hioffs < 256; hioffs++) #endif for (bnr = start; bnr < start+size; bnr++)