From 4de248765ce6033fccd33353eeeee5a27f364161 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Tue, 12 Aug 2008 16:57:24 +0300 Subject: [PATCH] imported winuaesrc1510.zip --- cpummu.c | 209 +- include/cpummu.h | 392 ++-- include/newcpu.h | 2 +- od-win32/WinUAE_Install.nsi | 2 +- od-win32/direct3d.c | 105 +- od-win32/win32.c | 2 +- od-win32/win32.h | 6 +- od-win32/winuae_msvc/winuae_msvc.8.vcproj | 2535 --------------------- od-win32/winuae_msvc/winuae_msvc.vcproj | 10 +- od-win32/winuaechangelog.txt | 13 +- 10 files changed, 338 insertions(+), 2938 deletions(-) delete mode 100755 od-win32/winuae_msvc/winuae_msvc.8.vcproj diff --git a/cpummu.c b/cpummu.c index 9beaa7c4..cde065e1 100755 --- a/cpummu.c +++ b/cpummu.c @@ -2,7 +2,7 @@ * cpummu.cpp - MMU emulation * * Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS) - * + * * Inspired by UAE MMU patch * * This file is part of the ARAnyM project which builds a new and powerful @@ -23,10 +23,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#if 0 +#define FULLMMU + #define DEBUG 0 -#define DUNUSED(x) #include "sysconfig.h" #include "sysdeps.h" @@ -35,19 +35,22 @@ #include "newcpu.h" #include "cpummu.h" #include "debug.h" +#ifdef USE_JIT +# include "compiler/compemu.h" +#endif #define DBG_MMU_VERBOSE 1 #define DBG_MMU_SANITY 1 -static int mmu_hit; +#ifdef FULLMMU mmu_atc_l1_array atc_l1[2]; mmu_atc_l1_array *current_atc; struct mmu_atc_line atc_l2[2][ATC_L2_SIZE]; -#ifdef ATC_STATS +# ifdef ATC_STATS static unsigned int mmu_atc_hits[ATC_L2_SIZE]; -#endif +# endif static void mmu_dump_ttr(const char * label, uae_u32 ttr) @@ -57,14 +60,14 @@ static void mmu_dump_ttr(const char * label, uae_u32 ttr) from_addr = ttr & MMU_TTR_LOGICAL_BASE; to_addr = (ttr & MMU_TTR_LOGICAL_MASK) << 8; - write_log ("%s: [%08lx] %08lx - %08lx enabled=%d supervisor=%d wp=%d cm=%02d", + D(bug("%s: [%08lx] %08lx - %08lx enabled=%d supervisor=%d wp=%d cm=%02d", label, ttr, from_addr, to_addr, ttr & MMU_TTR_BIT_ENABLED ? 1 : 0, (ttr & (MMU_TTR_BIT_SFIELD_ENABLED | MMU_TTR_BIT_SFIELD_SUPER)) >> MMU_TTR_SFIELD_SHIFT, ttr & MMU_TTR_BIT_WRITE_PROTECT ? 1 : 0, (ttr & MMU_TTR_CACHE_MASK) >> MMU_TTR_CACHE_SHIFT - ); + )); } void mmu_make_transparent_region(uaecptr baseaddr, uae_u32 size, int datamode) @@ -84,7 +87,7 @@ void mmu_make_transparent_region(uaecptr baseaddr, uae_u32 size, int datamode) *ttr |= ((baseaddr + size - 1) & MMU_TTR_LOGICAL_BASE) >> 8; *ttr |= MMU_TTR_BIT_ENABLED; - write_log ("MMU: map transparent mapping of %08x", *ttr); + D(bug("MMU: map transparent mapping of %08x", *ttr)); } /* check if an address matches a ttr */ @@ -145,7 +148,7 @@ static void mmu_dump_table(const char * label, uaecptr root_ptr) D(bug("%s: root=%lx", label, root_ptr)); for (root_idx = 0; root_idx < ROOT_TABLE_SIZE; root_idx++) { - root_des = phys_get_long (root_ptr + root_idx); + root_des = phys_get_long(root_ptr + root_idx); if ((root_des & 2) == 0) continue; /* invalid */ @@ -168,7 +171,7 @@ static void mmu_dump_table(const char * label, uaecptr root_ptr) } page_info[PAGE_TABLE_SIZE]; int n_pages_used; - ptr_des = phys_get_long (ptr_des_addr + ptr_idx); + ptr_des = phys_get_long(ptr_des_addr + ptr_idx); ptr_log = root_log | (ptr_idx << PTR_INDEX_SHIFT); if ((ptr_des & 2) == 0) @@ -179,7 +182,7 @@ static void mmu_dump_table(const char * label, uaecptr root_ptr) n_pages_used = -1; for (page_idx = 0; page_idx < PAGE_TABLE_SIZE; page_idx++) { - page_des = phys_get_long (page_addr + page_idx); + page_des = phys_get_long(page_addr + page_idx); page_log = ptr_log | (page_idx << 2); // ??? PAGE_INDEX_SHIFT switch (page_des & 3) { @@ -255,10 +258,10 @@ void mmu_dump_atc(void) for (j = 0; j < ATC_L2_SIZE; j++) { if (atc_l2[i][j].tag == 0x8000) continue; - write_log ("ATC[%02d] G=%d TT=%d M=%d WP=%d VD=%d VI=%d tag=%08x --> phys=%08x", + D(bug("ATC[%02d] G=%d TT=%d M=%d WP=%d VD=%d VI=%d tag=%08x --> phys=%08x", j, atc_l2[i][j].global, atc_l2[i][j].tt, atc_l2[i][j].modified, atc_l2[i][j].write_protect, atc_l2[i][j].valid_data, atc_l2[i][j].valid_inst, - atc_l2[i][j].tag, atc_l2[i][j].phys); + atc_l2[i][j].tag, atc_l2[i][j].phys)); } } } @@ -267,7 +270,7 @@ void mmu_dump_atc(void) /* {{{ mmu_dump_tables */ void mmu_dump_tables(void) { - write_log ("URP: %08x SRP: %08x MMUSR: %x TC: %x", regs.urp, regs.srp, regs.mmusr, regs.tcr); + D(bug("URP: %08x SRP: %08x MMUSR: %x TC: %x", regs.urp, regs.srp, regs.mmusr, regs.tcr)); mmu_dump_ttr("DTT0", regs.dtt0); mmu_dump_ttr("DTT1", regs.dtt1); mmu_dump_ttr("ITT0", regs.itt0); @@ -277,9 +280,9 @@ void mmu_dump_tables(void) } /* }}} */ -static uaecptr REGPARAM3 mmu_lookup_pagetable(uaecptr addr, int super, int write) REGPARAM; +static uaecptr REGPARAM2 mmu_lookup_pagetable(uaecptr addr, int super, int write); -STATIC_INLINE int mmu_get_fc(int super, int data) +static ALWAYS_INLINE int mmu_get_fc(bool super, bool data) { return (super ? 4 : 0) | (data ? 1 : 2); } @@ -308,7 +311,7 @@ static void mmu_bus_error(uaecptr addr, int fc, int write, int size) regs.mmu_fault_addr = addr; regs.mmu_ssw = ssw | MMU_SSW_ATC; - write_log ("BUS ERROR: fc=%d w=%d log=%08x ssw=%04x", fc, write, addr, ssw); + D(bug("BUS ERROR: fc=%d w=%d log=%08x ssw=%04x", fc, write, addr, ssw)); THROW(2); } @@ -357,7 +360,7 @@ static uaecptr mmu_fill_atc_l2(uaecptr addr, int super, int data, int write, SAVE_EXCEPTION; TRY(prb) { desc = mmu_lookup_pagetable(addr, super, write); - write_log ("translate: %x,%u,%u,%u -> %x", addr, super, write, data, desc); + D(bug("translate: %x,%u,%u,%u -> %x", addr, super, write, data, desc)); RESTORE_EXCEPTION; } CATCH(prb) { @@ -385,7 +388,7 @@ static uaecptr mmu_fill_atc_l2(uaecptr addr, int super, int data, int write, return desc; } -STATIC_INLINE int +static ALWAYS_INLINE bool mmu_fill_atc_l1(uaecptr addr, int super, int data, int write, struct mmu_atc_line *l1) { @@ -399,12 +402,12 @@ mmu_fill_atc_l1(uaecptr addr, int super, int data, int write, mmu_fill_atc_l2(addr, super, data, write, l); } if (!(data ? l->valid_data : l->valid_inst)) { - write_log ("MMU: non-resident page (%x,%x,%x)!", addr, regs.pc, regs.fault_pc); + D(bug("MMU: non-resident page (%x,%x,%x)!", addr, regs.pc, regs.fault_pc)); goto fail; } if (write) { if (l->write_protect) { - write_log ("MMU: write protected (via %s) %lx", l->tt ? "ttr" : "atc", addr); + D(bug("MMU: write protected (via %s) %lx", l->tt ? "ttr" : "atc", addr)); goto fail; } if (!l->modified) @@ -428,11 +431,11 @@ mmu_fill_atc_l1(uaecptr addr, int super, int data, int write, goto fail; } - return 1; + return true; fail: l1->tag = ~l1->tag; - return 0; + return false; } uaecptr REGPARAM2 mmu_translate(uaecptr addr, int super, int data, int write) @@ -442,7 +445,7 @@ uaecptr REGPARAM2 mmu_translate(uaecptr addr, int super, int data, int write) l = &atc_l2[super][ATC_L2_INDEX(addr)]; mmu_fill_atc_l2(addr, super, data, write, l); if (!(data ? l->valid_data : l->valid_inst)) - THROW(2); + THROW(2); return addr + l->phys; } @@ -464,27 +467,27 @@ static uaecptr REGPARAM2 mmu_lookup_pagetable(uaecptr addr, int super, int write /* fetch root table descriptor */ i = (addr >> 23) & 0x1fc; desc_addr = (desc & MMU_ROOT_PTR_ADDR_MASK) | i; - desc = phys_get_long (desc_addr); + desc = phys_get_long(desc_addr); if ((desc & 2) == 0) { - write_log ("MMU: invalid root descriptor for %lx", addr); + D(bug("MMU: invalid root descriptor for %lx", addr)); return 0; } wp |= desc; if ((desc & MMU_DES_USED) == 0) - phys_put_long (desc_addr, desc | MMU_DES_USED); + phys_put_long(desc_addr, desc | MMU_DES_USED); /* fetch pointer table descriptor */ i = (addr >> 16) & 0x1fc; desc_addr = (desc & MMU_ROOT_PTR_ADDR_MASK) | i; - desc = phys_get_long (desc_addr); + desc = phys_get_long(desc_addr); if ((desc & 2) == 0) { - write_log ("MMU: invalid ptr descriptor for %lx", addr); + D(bug("MMU: invalid ptr descriptor for %lx", addr)); return 0; } wp |= desc; if ((desc & MMU_DES_USED) == 0) - phys_put_long (desc_addr, desc | MMU_DES_USED); + phys_put_long(desc_addr, desc | MMU_DES_USED); /* fetch page table descriptor */ if (regs.mmu_pagesize_8k) { @@ -496,20 +499,20 @@ static uaecptr REGPARAM2 mmu_lookup_pagetable(uaecptr addr, int super, int write } get_page_descriptor: - desc = phys_get_long (desc_addr); + desc = phys_get_long(desc_addr); if ((desc & 1) == 0) { if ((desc & 2) == 0) { - write_log ("MMU: invalid page descriptor log=%08lx desc=%08lx @%08lx", addr, desc, desc_addr); + D(bug("MMU: invalid page descriptor log=%08lx desc=%08lx @%08lx", addr, desc, desc_addr)); return desc; } /* indirect */ if (indirect) { - write_log ("MMU: double indirect descriptor log=%lx descriptor @ %lx", addr, desc_addr); + D(bug("MMU: double indirect descriptor log=%lx descriptor @ %lx", addr, desc_addr)); return desc; } wp |= desc; if ((desc & MMU_DES_USED) == 0) - phys_put_long (desc_addr, desc | MMU_DES_USED); + phys_put_long(desc_addr, desc | MMU_DES_USED); desc_addr = desc & MMU_PAGE_INDIRECT_MASK; indirect = 1; goto get_page_descriptor; @@ -520,17 +523,17 @@ get_page_descriptor: if (desc & MMU_DES_WP) { if ((desc & MMU_DES_USED) == 0) { desc |= MMU_DES_USED; - phys_put_long (desc_addr, desc); + phys_put_long(desc_addr, desc); } } else if ((desc & (MMU_DES_USED|MMU_DES_MODIFIED)) != (MMU_DES_USED|MMU_DES_MODIFIED)) { desc |= MMU_DES_USED|MMU_DES_MODIFIED; - phys_put_long (desc_addr, desc); + phys_put_long(desc_addr, desc); } } else { if ((desc & MMU_DES_USED) == 0) { desc |= MMU_DES_USED; - phys_put_long (desc_addr, desc); + phys_put_long(desc_addr, desc); } } return desc; @@ -540,10 +543,10 @@ uae_u16 REGPARAM2 mmu_get_word_unaligned(uaecptr addr, int data) { uae_u16 res; - res = (uae_u16)mmu_get_byte (addr, data, sz_word) << 8; + res = (uae_u16)mmu_get_byte(addr, data, sz_word) << 8; SAVE_EXCEPTION; TRY(prb) { - res |= mmu_get_byte (addr + 1, data, sz_word); + res |= mmu_get_byte(addr + 1, data, sz_word); RESTORE_EXCEPTION; } CATCH(prb) { @@ -555,15 +558,15 @@ uae_u16 REGPARAM2 mmu_get_word_unaligned(uaecptr addr, int data) return res; } -uae_u32 mmu_get_long_unaligned(uaecptr addr, int data) +uae_u32 REGPARAM2 mmu_get_long_unaligned(uaecptr addr, int data) { uae_u32 res; if (likely(!(addr & 1))) { - res = (uae_u32)mmu_get_word (addr, data, sz_long) << 16; + res = (uae_u32)mmu_get_word(addr, data, sz_long) << 16; SAVE_EXCEPTION; TRY(prb) { - res |= mmu_get_word (addr + 2, data, sz_long); + res |= mmu_get_word(addr + 2, data, sz_long); RESTORE_EXCEPTION; } CATCH(prb) { @@ -573,12 +576,12 @@ uae_u32 mmu_get_long_unaligned(uaecptr addr, int data) THROW_AGAIN(prb); } } else { - res = (uae_u32)mmu_get_byte (addr, data, sz_long) << 8; + res = (uae_u32)mmu_get_byte(addr, data, sz_long) << 8; SAVE_EXCEPTION; TRY(prb) { - res = (res | mmu_get_byte (addr + 1, data, sz_long)) << 8; - res = (res | mmu_get_byte (addr + 2, data, sz_long)) << 8; - res |= mmu_get_byte (addr + 3, data, sz_long); + res = (res | mmu_get_byte(addr + 1, data, sz_long)) << 8; + res = (res | mmu_get_byte(addr + 2, data, sz_long)) << 8; + res |= mmu_get_byte(addr + 3, data, sz_long); RESTORE_EXCEPTION; } CATCH(prb) { @@ -607,7 +610,7 @@ uae_u8 REGPARAM2 mmu_get_byte_slow(uaecptr addr, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 0, cl)) goto redo; - return do_get_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl)); + return do_get_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl)); } uae_u16 REGPARAM2 mmu_get_word_slow(uaecptr addr, int super, int data, @@ -626,7 +629,7 @@ uae_u16 REGPARAM2 mmu_get_word_slow(uaecptr addr, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 0, cl)) goto redo; - return do_get_mem_word((uae_u16 *)mmu_get_real_address (addr, cl)); + return do_get_mem_word((uae_u16 *)mmu_get_real_address(addr, cl)); } uae_u32 REGPARAM2 mmu_get_long_slow(uaecptr addr, int super, int data, @@ -645,7 +648,7 @@ uae_u32 REGPARAM2 mmu_get_long_slow(uaecptr addr, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 0, cl)) goto redo; - return do_get_mem_long((uae_u32 *)mmu_get_real_address (addr, cl)); + return do_get_mem_long((uae_u32 *)mmu_get_real_address(addr, cl)); } void REGPARAM2 mmu_put_long_unaligned(uaecptr addr, uae_u32 val, int data) @@ -653,13 +656,13 @@ void REGPARAM2 mmu_put_long_unaligned(uaecptr addr, uae_u32 val, int data) SAVE_EXCEPTION; TRY(prb) { if (likely(!(addr & 1))) { - mmu_put_word (addr, val >> 16, data, sz_long); - mmu_put_word (addr + 2, val, data, sz_long); + mmu_put_word(addr, val >> 16, data, sz_long); + mmu_put_word(addr + 2, val, data, sz_long); } else { - mmu_put_byte (addr, val >> 24, data, sz_long); - mmu_put_byte (addr + 1, val >> 16, data, sz_long); - mmu_put_byte (addr + 2, val >> 8, data, sz_long); - mmu_put_byte (addr + 3, val, data, sz_long); + mmu_put_byte(addr, val >> 24, data, sz_long); + mmu_put_byte(addr + 1, val >> 16, data, sz_long); + mmu_put_byte(addr + 2, val >> 8, data, sz_long); + mmu_put_byte(addr + 3, val, data, sz_long); } RESTORE_EXCEPTION; } @@ -678,8 +681,8 @@ void REGPARAM2 mmu_put_word_unaligned(uaecptr addr, uae_u16 val, int data) { SAVE_EXCEPTION; TRY(prb) { - mmu_put_byte (addr, val >> 8, data, sz_word); - mmu_put_byte (addr + 1, val, data, sz_word); + mmu_put_byte(addr, val >> 8, data, sz_word); + mmu_put_byte(addr + 1, val, data, sz_word); RESTORE_EXCEPTION; } CATCH(prb) { @@ -712,7 +715,7 @@ void REGPARAM2 mmu_put_byte_slow(uaecptr addr, uae_u8 val, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 1, cl)) goto redo; - do_put_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl), val); + do_put_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl), val); } void REGPARAM2 mmu_put_word_slow(uaecptr addr, uae_u16 val, int super, int data, @@ -734,7 +737,7 @@ void REGPARAM2 mmu_put_word_slow(uaecptr addr, uae_u16 val, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 1, cl)) goto redo; - do_put_mem_word((uae_u16 *)mmu_get_real_address (addr, cl), val); + do_put_mem_word((uae_u16 *)mmu_get_real_address(addr, cl), val); } void REGPARAM2 mmu_put_long_slow(uaecptr addr, uae_u32 val, int super, int data, @@ -756,10 +759,10 @@ void REGPARAM2 mmu_put_long_slow(uaecptr addr, uae_u32 val, int super, int data, if (!mmu_fill_atc_l1(addr, super, data, 1, cl)) goto redo; - do_put_mem_long((uae_u32 *)mmu_get_real_address (addr, cl), val); + do_put_mem_long((uae_u32 *)mmu_get_real_address(addr, cl), val); } -uae_u32 REGPARAM2 sfc_get_long (uaecptr addr) +uae_u32 REGPARAM2 sfc_get_long(uaecptr addr) { int super = (regs.sfc & 4) != 0; int data = (regs.sfc & 3) != 2; @@ -800,7 +803,7 @@ uae_u32 REGPARAM2 sfc_get_long (uaecptr addr) return res; } -uae_u16 REGPARAM2 sfc_get_word (uaecptr addr) +uae_u16 REGPARAM2 sfc_get_word(uaecptr addr) { int super = (regs.sfc & 4) != 0; int data = (regs.sfc & 3) != 2; @@ -824,7 +827,7 @@ uae_u16 REGPARAM2 sfc_get_word (uaecptr addr) return res; } -uae_u8 REGPARAM2 sfc_get_byte (uaecptr addr) +uae_u8 REGPARAM2 sfc_get_byte(uaecptr addr) { int super = (regs.sfc & 4) != 0; int data = (regs.sfc & 3) != 2; @@ -832,7 +835,7 @@ uae_u8 REGPARAM2 sfc_get_byte (uaecptr addr) return mmu_get_user_byte(addr, super, data, sz_byte); } -void REGPARAM2 dfc_put_long (uaecptr addr, uae_u32 val) +void REGPARAM2 dfc_put_long(uaecptr addr, uae_u32 val) { int super = (regs.dfc & 4) != 0; int data = (regs.dfc & 3) != 2; @@ -863,7 +866,7 @@ void REGPARAM2 dfc_put_long (uaecptr addr, uae_u32 val) } } -void REGPARAM2 dfc_put_word (uaecptr addr, uae_u16 val) +void REGPARAM2 dfc_put_word(uaecptr addr, uae_u16 val) { int super = (regs.dfc & 4) != 0; int data = (regs.dfc & 3) != 2; @@ -889,7 +892,7 @@ void REGPARAM2 dfc_put_word (uaecptr addr, uae_u16 val) } } -void REGPARAM2 dfc_put_byte (uaecptr addr, uae_u8 val) +void REGPARAM2 dfc_put_byte(uaecptr addr, uae_u8 val) { int super = (regs.dfc & 4) != 0; int data = (regs.dfc & 3) != 2; @@ -906,9 +909,9 @@ void REGPARAM2 dfc_put_byte (uaecptr addr, uae_u8 val) } } -void mmu_op(uae_u32 opcode, struct regstruct *regs, uae_u16 extra) +void REGPARAM2 mmu_op_real(uae_u32 opcode, uae_u16 extra) { - int super = (regs->dfc & 4) != 0; + int super = (regs.dfc & 4) != 0; DUNUSED(extra); if ((opcode & 0xFE0) == 0x0500) { int regno, glob; @@ -919,11 +922,11 @@ void mmu_op(uae_u32 opcode, struct regstruct *regs, uae_u16 extra) glob = (opcode & 8) != 0; if (opcode & 16) { - write_log ("pflusha(%u,%u)", glob, regs->dfc); + D(bug("pflusha(%u,%u)", glob, regs.dfc)); mmu_flush_atc_all(glob); } else { - addr = m68k_areg (regs, regno); - write_log ("pflush(%u,%u,%x)", glob, regs->dfc, addr); + addr = m68k_areg(®s, regno); + D(bug("pflush(%u,%u,%x)", glob, regs.dfc, addr)); mmu_flush_atc(addr, super, glob); } flush_internals(); @@ -936,37 +939,38 @@ void mmu_op(uae_u32 opcode, struct regstruct *regs, uae_u16 extra) regno = opcode & 7; write = (opcode & 32) == 0; - addr = m68k_areg (regs, regno); - write_log ("PTEST%c (A%d) %08x DFC=%d", write ? 'W' : 'R', regno, addr, regs->dfc); - mmu_flush_atc(addr, super, 1); + addr = m68k_areg(®s, regno); + //bug("ptest(%u,%u,%x)", write, regs.dfc, addr); + D(bug("PTEST%c (A%d) %08x DFC=%d", write ? 'W' : 'R', regno, addr, regs.dfc)); + mmu_flush_atc(addr, super, true); SAVE_EXCEPTION; TRY(prb) { struct mmu_atc_line *l; uae_u32 desc; - int data = (regs->dfc & 3) != 2; + bool data = (regs.dfc & 3) != 2; l = &atc_l2[super][ATC_L2_INDEX(addr)]; desc = mmu_fill_atc_l2(addr, super, data, write, l); if (!(data ? l->valid_data : l->valid_inst)) - regs->mmusr = MMU_MMUSR_B; + regs.mmusr = MMU_MMUSR_B; else if (l->tt) - regs->mmusr = MMU_MMUSR_T | MMU_MMUSR_R; + regs.mmusr = MMU_MMUSR_T | MMU_MMUSR_R; else { - regs->mmusr = desc & (~0xfff|MMU_MMUSR_G|MMU_MMUSR_Ux|MMU_MMUSR_S| + regs.mmusr = desc & (~0xfff|MMU_MMUSR_G|MMU_MMUSR_Ux|MMU_MMUSR_S| MMU_MMUSR_CM|MMU_MMUSR_M|MMU_MMUSR_W); - regs->mmusr |= MMU_MMUSR_R; + regs.mmusr |= MMU_MMUSR_R; } } CATCH(prb) { - regs->mmusr = MMU_MMUSR_B; + regs.mmusr = MMU_MMUSR_B; } RESTORE_EXCEPTION; - write_log ("PTEST result: mmusr %08x", regs->mmusr); + D(bug("PTEST result: mmusr %08x", regs.mmusr)); } else - op_illg (opcode, regs); + op_illg (opcode, ®s); } -void REGPARAM2 mmu_flush_atc(uaecptr addr, int super, int global) +void REGPARAM2 mmu_flush_atc(uaecptr addr, bool super, bool global) { struct mmu_atc_line *l; int i, j; @@ -997,7 +1001,7 @@ void REGPARAM2 mmu_flush_atc(uaecptr addr, int super, int global) } } -void REGPARAM2 mmu_flush_atc_all(int global) +void REGPARAM2 mmu_flush_atc_all(bool global) { struct mmu_atc_line *l; unsigned int i; @@ -1017,7 +1021,7 @@ void REGPARAM2 mmu_flush_atc_all(int global) void REGPARAM2 mmu_reset(void) { - mmu_flush_atc_all(1); + mmu_flush_atc_all(true); regs.urp = regs.srp = 0; regs.itt0 = regs.itt0 = 0; @@ -1026,22 +1030,39 @@ void REGPARAM2 mmu_reset(void) } -void REGPARAM2 mmu_set_tc(uae_u16 tcr) +void REGPARAM2 mmu_set_tc(uae_u16 tc) { - if (regs.tcr == tcr) + if (regs.tcr == tc) return; - regs.tcr = tcr; - regs.mmu_enabled = tcr & 0x8000 ? 1 : 0; - regs.mmu_pagesize_8k = tcr & 0x4000 ? 1 : 0; - mmu_flush_atc_all(1); + regs.tcr = tc; + regs.mmu_enabled = tc & 0x8000 ? 1 : 0; + regs.mmu_pagesize_8k = tc & 0x4000 ? 1 : 0; + mmu_flush_atc_all(true); - write_log ("MMU: enabled=%d page8k=%d\n", regs.mmu_enabled, regs.mmu_pagesize_8k); + D(bug("MMU: enabled=%d page8k=%d\n", regs.mmu_enabled, regs.mmu_pagesize_8k)); } -void REGPARAM2 mmu_set_super(int super) +void REGPARAM2 mmu_set_super(bool super) { current_atc = &atc_l1[super]; } +#else + +void mmu_op(uae_u32 opcode, uae_u16 /*extra*/) +{ + if ((opcode & 0xFE0) == 0x0500) { + /* PFLUSH instruction */ + flush_internals(); + } else if ((opcode & 0x0FD8) == 0x548) { + /* PTEST instruction */ + } else + op_illg(opcode); +} + #endif + +/* +vim:ts=4:sw=4: +*/ diff --git a/include/cpummu.h b/include/cpummu.h index 6078a4d5..c7dcfffc 100755 --- a/include/cpummu.h +++ b/include/cpummu.h @@ -2,7 +2,7 @@ * cpummu.h - MMU emulation * * Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS) - * + * * Inspired by UAE MMU patch * * This file is part of the ARAnyM project which builds a new and powerful @@ -26,13 +26,68 @@ #ifndef CPUMMU_H #define CPUMMU_H +#define ALWAYS_INLINE __forceinline +#define bool int +#define DUNUSED(x) +#define D +#define bug write_log +#define MMUEX 0x12345678 +#define TRY(x) __try +#define CATCH(x) __except(GetExceptionCode() == MMUEX) +#define THROW(x) RaiseException(MMUEX,EXCEPTION_NONCONTINUABLE,0,NULL) +#define THROW_AGAIN(x) THROW(x) #define SAVE_EXCEPTION #define RESTORE_EXCEPTION -#define TRY(x) -#define CATCH(x) -#define THROW(x) -#define THROW_AGAIN(x) +#define true 1 +#define false 0 #define likely(x) x +#define unlikely(x) x + +typedef char flagtype; + +struct xttrx { + uae_u32 log_addr_base : 8; + uae_u32 log_addr_mask : 8; + uae_u32 enable : 1; + uae_u32 s_field : 2; + uae_u32 : 3; + uae_u32 usr1 : 1; + uae_u32 usr0 : 1; + uae_u32 : 1; + uae_u32 cmode : 2; + uae_u32 : 2; + uae_u32 write : 1; + uae_u32 : 2; +}; + +struct mmusr_t { + uae_u32 phys_addr : 20; + uae_u32 bus_err : 1; + uae_u32 global : 1; + uae_u32 usr1 : 1; + uae_u32 usr0 : 1; + uae_u32 super : 1; + uae_u32 cmode : 2; + uae_u32 modif : 1; + uae_u32 : 1; + uae_u32 write : 1; + uae_u32 ttrhit : 1; + uae_u32 resident : 1; +}; + +struct log_addr4 { + uae_u32 rif : 7; + uae_u32 pif : 7; + uae_u32 paif : 6; + uae_u32 poff : 12; +}; + +struct log_addr8 { + uae_u32 rif : 7; + uae_u32 pif : 7; + uae_u32 paif : 5; + uae_u32 poff : 13; +}; #define MMU_TEST_PTEST 1 #define MMU_TEST_VERBOSE 2 @@ -110,16 +165,16 @@ extern void mmu_dump_tables(void); #define TTR_OK_MATCH 2 struct mmu_atc_line { - uae_u16 tag; - unsigned tt : 1; - unsigned valid_data : 1; - unsigned valid_inst : 1; - unsigned global : 1; - unsigned modified : 1; - unsigned write_protect : 1; - unsigned hw : 1; - unsigned bus_fault : 1; - uaecptr phys; + uae_u16 tag; + unsigned tt : 1; + unsigned valid_data : 1; + unsigned valid_inst : 1; + unsigned global : 1; + unsigned modified : 1; + unsigned write_protect : 1; + unsigned hw : 1; + unsigned bus_fault : 1; + uaecptr phys; }; /* @@ -138,7 +193,7 @@ struct mmu_atc_line { #define ATC_L1_SIZE_LOG 8 -#define ATC_L1_SIZE (1 << ATC_L1_SIZE_LOG) +#define ATC_L1_SIZE (1 << ATC_L1_SIZE_LOG) #define ATC_L1_INDEX(addr) (((addr) >> 12) % ATC_L1_SIZE) @@ -152,7 +207,7 @@ extern mmu_atc_l1_array atc_l1[2]; extern mmu_atc_l1_array *current_atc; #define ATC_L2_SIZE_LOG 12 -#define ATC_L2_SIZE (1 << ATC_L2_SIZE_LOG) +#define ATC_L2_SIZE (1 << ATC_L2_SIZE_LOG) #define ATC_L2_INDEX(addr) ((((addr) >> 12) ^ ((addr) >> (32 - ATC_L2_SIZE_LOG))) % ATC_L2_SIZE) @@ -163,7 +218,7 @@ extern struct mmu_atc_line atc_l2[2][ATC_L2_SIZE]; * the data and write arguments are constant in the common, * thus allows gcc to generate a constant offset. */ -STATIC_INLINE int mmu_lookup(uaecptr addr, int data, int write, +static ALWAYS_INLINE int mmu_lookup(uaecptr addr, bool data, bool write, struct mmu_atc_line **cl) { addr >>= 12; @@ -174,8 +229,8 @@ STATIC_INLINE int mmu_lookup(uaecptr addr, int data, int write, /* * similiar to mmu_user_lookup, but for the use of the moves instruction */ -STATIC_INLINE int mmu_user_lookup(uaecptr addr, int super, int data, - int write, struct mmu_atc_line **cl) +static ALWAYS_INLINE int mmu_user_lookup(uaecptr addr, bool super, bool data, + bool write, struct mmu_atc_line **cl) { addr >>= 12; *cl = &atc_l1[super][data][write][addr % ATC_L1_SIZE]; @@ -183,12 +238,12 @@ STATIC_INLINE int mmu_user_lookup(uaecptr addr, int super, int data, } extern uae_u16 REGPARAM3 mmu_get_word_unaligned(uaecptr addr, int data) REGPARAM; -extern uae_u32 REGPARAM3mmu_get_long_unaligned(uaecptr addr, int data) REGPARAM; +extern uae_u32 REGPARAM3 mmu_get_long_unaligned(uaecptr addr, int data) REGPARAM; extern uae_u8 REGPARAM3 mmu_get_byte_slow(uaecptr addr, int super, int data, - int size, struct mmu_atc_line *cl) REGPARAM; + int size, struct mmu_atc_line *cl) REGPARAM; extern uae_u16 REGPARAM3 mmu_get_word_slow(uaecptr addr, int super, int data, - int size, struct mmu_atc_line *cl) REGPARAM; + int size, struct mmu_atc_line *cl) REGPARAM; extern uae_u32 REGPARAM3 mmu_get_long_slow(uaecptr addr, int super, int data, int size, struct mmu_atc_line *cl) REGPARAM; @@ -240,365 +295,180 @@ STATIC_INLINE void mmu_set_root_pointer(int regno, uae_u32 val) #define FC_DATA (regs.s ? 5 : 1) #define FC_INST (regs.s ? 6 : 2) -extern uaecptr REGPARAM3 mmu_translate(uaecptr addr, int super, int data, int write); +extern uaecptr REGPARAM3 mmu_translate(uaecptr addr, int super, int data, int write) REGPARAM; -extern uae_u32 REGPARAM3 sfc_get_long (uaecptr addr) REGPARAM; -extern uae_u16 REGPARAM3 sfc_get_word (uaecptr addr) REGPARAM; -extern uae_u8 REGPARAM3 sfc_get_byte (uaecptr addr) REGPARAM; -extern void REGPARAM3 dfc_put_long (uaecptr addr, uae_u32 val) REGPARAM; -extern void REGPARAM3 dfc_put_word (uaecptr addr, uae_u16 val) REGPARAM; -extern void REGPARAM3 dfc_put_byte (uaecptr addr, uae_u8 val) REGPARAM; +extern uae_u32 REGPARAM3 sfc_get_long(uaecptr addr) REGPARAM; +extern uae_u16 REGPARAM3 sfc_get_word(uaecptr addr) REGPARAM; +extern uae_u8 REGPARAM3 sfc_get_byte(uaecptr addr) REGPARAM; +extern void REGPARAM3 dfc_put_long(uaecptr addr, uae_u32 val) REGPARAM; +extern void REGPARAM3 dfc_put_word(uaecptr addr, uae_u16 val) REGPARAM; +extern void REGPARAM3 dfc_put_byte(uaecptr addr, uae_u8 val) REGPARAM; -extern void REGPARAM3 mmu_flush_atc(uaecptr addr, int super, int global) REGPARAM; -extern void REGPARAM3 mmu_flush_atc_all(int global) REGPARAM; - -extern void REGPARAM3 mmu_reset(void) REGPARAM; -extern void REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM; -extern void REGPARAM3 mmu_set_super(int super) REGPARAM; +extern void REGPARAM3 mmu_flush_atc(uaecptr addr, bool super, bool global) REGPARAM; +extern void REGPARAM3 mmu_flush_atc_all(bool global) REGPARAM; +extern void REGPARAM3 mmu_op_real(uae_u32 opcode, uae_u16 extra) REGPARAM; -STATIC_INLINE int test_ram_boundary(uaecptr a, int b, int c, int d) { return 1; } -STATIC_INLINE void check_ram_boundary(uaecptr a, int b, int c) { } -STATIC_INLINE int phys_valid_address(uaecptr a,int b, int c) { return 1; } +#ifdef FULLMMU +extern void REGPARAM3 mmu_reset(void) REGPARAM; +extern void REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM; +extern void REGPARAM3 mmu_set_super(bool super) REGPARAM; +#else -STATIC_INLINE uae_u32 phys_get_long (uaecptr addr) +STATIC_INLINE void mmu_reset(void) { -#if ARAM_PAGE_CHECK - if (((addr ^ read_page) <= ARAM_PAGE_MASK)) - return do_get_mem_long((uae_u32*)(addr + read_offset)); -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) return HWget_l(addr); -#endif - check_ram_boundary(addr, 4, false); - uae_u32 * const m = (uae_u32 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - read_page = addr; - read_offset = (uintptr)m - (uintptr)addr; -#endif - return do_get_mem_long(m); } -STATIC_INLINE uae_u32 phys_get_word (uaecptr addr) +STATIC_INLINE void mmu_set_tc(uae_u16 /*tc*/) { -#if ARAM_PAGE_CHECK - if (((addr ^ read_page) <= ARAM_PAGE_MASK)) - return do_get_mem_word((uae_u16*)(addr + read_offset)); -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) return HWget_w(addr); -#endif - check_ram_boundary(addr, 2, false); - uae_u16 * const m = (uae_u16 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - read_page = addr; - read_offset = (uintptr)m - (uintptr)addr; -#endif - return do_get_mem_word(m); } -STATIC_INLINE uae_u32 phys_get_byte (uaecptr addr) +STATIC_INLINE void mmu_set_super(bool /*super*/) { -#if ARAM_PAGE_CHECK - if (((addr ^ read_page) <= ARAM_PAGE_MASK)) - return do_get_mem_byte((uae_u8*)(addr + read_offset)); -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) return HWget_b(addr); -#endif - check_ram_boundary(addr, 1, false); - uae_u8 * const m = (uae_u8 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - read_page = addr; - read_offset = (uintptr)m - (uintptr)addr; -#endif - return do_get_mem_byte(m); } -STATIC_INLINE void phys_put_long (uaecptr addr, uae_u32 l) -{ -#if ARAM_PAGE_CHECK - if (((addr ^ write_page) <= ARAM_PAGE_MASK)) { - do_put_mem_long((uae_u32*)(addr + write_offset), l); - return; - } -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) { - HWput_l(addr, l); - return; - } #endif - check_ram_boundary(addr, 4, true); - uae_u32 * const m = (uae_u32 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - write_page = addr; - write_offset = (uintptr)m - (uintptr)addr; -#endif - do_put_mem_long(m, l); -} -STATIC_INLINE void phys_put_word (uaecptr addr, uae_u32 w) -{ -#if ARAM_PAGE_CHECK - if (((addr ^ write_page) <= ARAM_PAGE_MASK)) { - do_put_mem_word((uae_u16*)(addr + write_offset), w); - return; - } -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) { - HWput_w(addr, w); - return; - } -#endif - check_ram_boundary(addr, 2, true); - uae_u16 * const m = (uae_u16 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - write_page = addr; - write_offset = (uintptr)m - (uintptr)addr; -#endif - do_put_mem_word(m, w); -} - -STATIC_INLINE void phys_put_byte (uaecptr addr, uae_u32 b) -{ -#if ARAM_PAGE_CHECK - if (((addr ^ write_page) <= ARAM_PAGE_MASK)) { - do_put_mem_byte((uae_u8*)(addr + write_offset), b); - return; - } -#endif -#ifndef HW_SIGSEGV - addr = addr < 0xff000000 ? addr : addr & 0x00ffffff; - if ((addr & 0xfff00000) == 0x00f00000) { - HWput_b(addr, b); - return; - } -#endif - check_ram_boundary(addr, 1, true); - uae_u8 * const m = (uae_u8 *)phys_get_real_address (addr); -#if ARAM_PAGE_CHECK - write_page = addr; - write_offset = (uintptr)m - (uintptr)addr; -#endif - do_put_mem_byte(m, b); -} #ifdef FULLMMU -STATIC_INLINE int is_unaligned(uaecptr addr, int size) +static ALWAYS_INLINE bool is_unaligned(uaecptr addr, int size) { return unlikely((addr & (size - 1)) && (addr ^ (addr + size - 1)) & 0x1000); } -STATIC_INLINE uae_u8 *mmu_get_real_address (uaecptr addr, struct mmu_atc_line *cl) +static ALWAYS_INLINE uae_u8 *mmu_get_real_address(uaecptr addr, struct mmu_atc_line *cl) { - return do_get_real_address (cl->phys + addr); + return do_get_real_address(cl->phys + addr); } -STATIC_INLINE uae_u32 mmu_get_long (uaecptr addr, int data, int size) +static ALWAYS_INLINE uae_u32 mmu_get_long(uaecptr addr, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 0, &cl))) - return do_get_mem_long((uae_u32 *)mmu_get_real_address (addr, cl)); + return do_get_mem_long((uae_u32 *)mmu_get_real_address(addr, cl)); return mmu_get_long_slow(addr, regs.s, data, size, cl); } -STATIC_INLINE uae_u32 get_long (uaecptr addr) -{ - if (unlikely(is_unaligned(addr, 4))) - return mmu_get_long_unaligned(addr, 1); - return mmu_get_long (addr, 1, sz_long); -} - -STATIC_INLINE uae_u16 mmu_get_word (uaecptr addr, int data, int size) +static ALWAYS_INLINE uae_u16 mmu_get_word(uaecptr addr, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 0, &cl))) - return do_get_mem_word((uae_u16 *)mmu_get_real_address (addr, cl)); + return do_get_mem_word((uae_u16 *)mmu_get_real_address(addr, cl)); return mmu_get_word_slow(addr, regs.s, data, size, cl); } -STATIC_INLINE uae_u16 get_word (uaecptr addr) -{ - if (unlikely(is_unaligned(addr, 2))) - return mmu_get_word_unaligned(addr, 1); - return mmu_get_word (addr, 1, sz_word); -} - -STATIC_INLINE uae_u8 mmu_get_byte (uaecptr addr, int data, int size) +static ALWAYS_INLINE uae_u8 mmu_get_byte(uaecptr addr, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 0, &cl))) - return do_get_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl)); + return do_get_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl)); return mmu_get_byte_slow(addr, regs.s, data, size, cl); } -STATIC_INLINE uae_u8 get_byte (uaecptr addr) -{ - return mmu_get_byte (addr, 1, sz_byte); -} -STATIC_INLINE void mmu_put_long (uaecptr addr, uae_u32 val, int data, int size) +static ALWAYS_INLINE void mmu_put_long(uaecptr addr, uae_u32 val, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 1, &cl))) - do_put_mem_long((uae_u32 *)mmu_get_real_address (addr, cl), val); + do_put_mem_long((uae_u32 *)mmu_get_real_address(addr, cl), val); else mmu_put_long_slow(addr, val, regs.s, data, size, cl); } -STATIC_INLINE void put_long (uaecptr addr, uae_u32 val) -{ - if (unlikely(is_unaligned(addr, 4))) - mmu_put_long_unaligned(addr, val, 1); - else - mmu_put_long (addr, val, 1, sz_long); -} - -STATIC_INLINE void mmu_put_word (uaecptr addr, uae_u16 val, int data, int size) +static ALWAYS_INLINE void mmu_put_word(uaecptr addr, uae_u16 val, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 1, &cl))) - do_put_mem_word((uae_u16 *)mmu_get_real_address (addr, cl), val); + do_put_mem_word((uae_u16 *)mmu_get_real_address(addr, cl), val); else mmu_put_word_slow(addr, val, regs.s, data, size, cl); } -STATIC_INLINE void put_word (uaecptr addr, uae_u16 val) -{ - if (unlikely(is_unaligned(addr, 2))) - mmu_put_word_unaligned(addr, val, 1); - else - mmu_put_word (addr, val, 1, sz_word); -} - -STATIC_INLINE void mmu_put_byte (uaecptr addr, uae_u8 val, int data, int size) +static ALWAYS_INLINE void mmu_put_byte(uaecptr addr, uae_u8 val, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_lookup(addr, data, 1, &cl))) - do_put_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl), val); + do_put_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl), val); else mmu_put_byte_slow(addr, val, regs.s, data, size, cl); } -STATIC_INLINE void put_byte (uaecptr addr, uae_u8 val) -{ - mmu_put_byte (addr, val, 1, sz_byte); -} - -STATIC_INLINE uae_u8 *get_real_address (uaecptr addr, int write, int sz) -{ - (void)sz; - return phys_get_real_address (mmu_translate(addr, regs.s, 1, write)); -} - -STATIC_INLINE uae_u32 mmu_get_user_long(uaecptr addr, int super, int data, int size) +static ALWAYS_INLINE uae_u32 mmu_get_user_long(uaecptr addr, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 0, &cl))) - return do_get_mem_long((uae_u32 *)mmu_get_real_address (addr, cl)); + return do_get_mem_long((uae_u32 *)mmu_get_real_address(addr, cl)); return mmu_get_long_slow(addr, super, data, size, cl); } -STATIC_INLINE uae_u16 mmu_get_user_word(uaecptr addr, int super, int data, int size) +static ALWAYS_INLINE uae_u16 mmu_get_user_word(uaecptr addr, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 0, &cl))) - return do_get_mem_word((uae_u16 *)mmu_get_real_address (addr, cl)); + return do_get_mem_word((uae_u16 *)mmu_get_real_address(addr, cl)); return mmu_get_word_slow(addr, super, data, size, cl); } -STATIC_INLINE uae_u8 mmu_get_user_byte(uaecptr addr, int super, int data, int size) +static ALWAYS_INLINE uae_u8 mmu_get_user_byte(uaecptr addr, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 0, &cl))) - return do_get_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl)); + return do_get_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl)); return mmu_get_byte_slow(addr, super, data, size, cl); } -STATIC_INLINE void mmu_put_user_long(uaecptr addr, uae_u32 val, int super, int data, int size) +static ALWAYS_INLINE void mmu_put_user_long(uaecptr addr, uae_u32 val, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 1, &cl))) - do_put_mem_long((uae_u32 *)mmu_get_real_address (addr, cl), val); + do_put_mem_long((uae_u32 *)mmu_get_real_address(addr, cl), val); else mmu_put_long_slow(addr, val, super, data, size, cl); } -STATIC_INLINE void mmu_put_user_word(uaecptr addr, uae_u16 val, int super, int data, int size) +static ALWAYS_INLINE void mmu_put_user_word(uaecptr addr, uae_u16 val, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 1, &cl))) - do_put_mem_word((uae_u16 *)mmu_get_real_address (addr, cl), val); + do_put_mem_word((uae_u16 *)mmu_get_real_address(addr, cl), val); else mmu_put_word_slow(addr, val, super, data, size, cl); } -STATIC_INLINE void mmu_put_user_byte(uaecptr addr, uae_u8 val, int super, int data, int size) +static ALWAYS_INLINE void mmu_put_user_byte(uaecptr addr, uae_u8 val, int super, int data, int size) { struct mmu_atc_line *cl; if (likely(mmu_user_lookup(addr, super, data, 1, &cl))) - do_put_mem_byte((uae_u8 *)mmu_get_real_address (addr, cl), val); + do_put_mem_byte((uae_u8 *)mmu_get_real_address(addr, cl), val); else mmu_put_byte_slow(addr, val, super, data, size, cl); } -STATIC_INLINE int valid_address(uaecptr addr, int write, int sz) -{ - SAVE_EXCEPTION; - TRY(prb) { - (void)sz; - check_ram_boundary(mmu_translate(addr, regs.s, 1, (write ? 1 : 0)), sz, write); - RESTORE_EXCEPTION; - return true; - } - CATCH(prb) { - RESTORE_EXCEPTION; - return false; - } -} - #else -#define get_long (a) phys_get_long (a) -#define get_word (a) phys_get_word (a) -#define get_byte (a) phys_get_byte (a) -#define put_long (a,b) phys_put_long (a,b) -#define put_word (a,b) phys_put_word (a,b) -#define put_byte (a,b) phys_put_byte (a,b) -#define get_real_address (a,w,s) phys_get_real_address (a) +# define get_long(a) phys_get_long(a) +# define get_word(a) phys_get_word(a) +# define get_byte(a) phys_get_byte(a) +# define put_long(a,b) phys_put_long(a,b) +# define put_word(a,b) phys_put_word(a,b) +# define put_byte(a,b) phys_put_byte(a,b) +# define get_real_address(a,w,s) phys_get_real_address(a) #define valid_address(a,w,s) phys_valid_address(a,w,s) #endif -STATIC_INLINE void flush_internals(void) -{ -#if ARAM_PAGE_CHECK - pc_page = 0xeeeeeeee; - read_page = 0xeeeeeeee; - write_page = 0xeeeeeeee; -#endif -} - - -#endif +#endif /* CPUMMU_H */ diff --git a/include/newcpu.h b/include/newcpu.h index 48a8412e..2f035180 100755 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -121,13 +121,13 @@ extern struct regstruct uae_u32 cacr, caar; uae_u32 itt0, itt1, dtt0, dtt1; uae_u32 tcr, mmusr, urp, srp, buscr; - uae_u32 mmu_fslw, mmu_fault_addr; uae_u16 mmu_ssw; uae_u32 wb3_data; uae_u16 wb3_status; int mmu_enabled; int mmu_pagesize_8k; + uae_u32 fault_pc; #endif uae_u32 pcr; diff --git a/od-win32/WinUAE_Install.nsi b/od-win32/WinUAE_Install.nsi index 2993ee18..ed3c1a3c 100755 --- a/od-win32/WinUAE_Install.nsi +++ b/od-win32/WinUAE_Install.nsi @@ -1,5 +1,5 @@ !define PRODUCT_NAME "WinUAE" -!define PRODUCT_VERSION "1.5.0" +!define PRODUCT_VERSION "1.5.1" !define PRODUCT_PUBLISHER "Arabuusimiehet" !define PRODUCT_WEB_SITE "http://www.winuae.net/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\winuae.exe" diff --git a/od-win32/direct3d.c b/od-win32/direct3d.c index fee051dc..feee5791 100755 --- a/od-win32/direct3d.c +++ b/od-win32/direct3d.c @@ -20,15 +20,18 @@ #include "direct3d.h" #include "hq2x_d3d.h" +#define D3DEX 0 + static int tex_pow2, tex_square, tex_dynamic; static int psEnabled, psActive, psPreProcess; static int tformat; -static int d3d_enabled, scanlines_ok; -static HINSTANCE d3dDLL; +static int d3d_enabled, d3d_ex, scanlines_ok; static LPDIRECT3D9 d3d; +static LPDIRECT3D9EX d3dex; static D3DPRESENT_PARAMETERS dpp; static LPDIRECT3DDEVICE9 d3ddev; +static LPDIRECT3DDEVICE9EX d3ddevex; static D3DSURFACE_DESC dsdbb; static LPDIRECT3DTEXTURE9 texture, sltexture; static LPDIRECT3DTEXTURE9 lpWorkTexture1, lpWorkTexture2; @@ -308,19 +311,29 @@ int D3D_canshaders (void) { static int yesno = 0; HANDLE h; + LPDIRECT3D9 d3dx; + D3DCAPS9 d3dCaps; if (yesno < 0) return 0; if (yesno > 0) return 1; - h = LoadLibrary ("d3dx9_36.dll"); - if (h == NULL) { - yesno = -1; - return 0; + yesno = -1; + h = LoadLibrary ("d3dx9_39.dll"); + if (h != NULL) { + FreeLibrary (h); + d3dx = Direct3DCreate9 (D3D_SDK_VERSION); + if (d3dx != NULL) { + if (SUCCEEDED (IDirect3D9_GetDeviceCaps (d3dx, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps))) { + if(d3dCaps.PixelShaderVersion >= D3DPS_VERSION(2,0)) { + write_log ("D3D: Pixel shader 2.0+ support detected, shader filters enabled.\n"); + yesno = 1; + } + } + IDirect3D9_Release (d3dx); + } } - FreeLibrary (h); - yesno = 1; - return 1; + return yesno > 0 ? 1 : 0; } static int psEffect_LoadEffect (const char *shaderfile) @@ -897,7 +910,7 @@ static int restoredeviceobjects (void) invalidatedeviceobjects (); if (currprefs.gfx_filtershader[0]) { - if (!psEffect_LoadEffect (currprefs.gfx_filtershader)) + if (!psEnabled || !psEffect_LoadEffect (currprefs.gfx_filtershader)) currprefs.gfx_filtershader[0] = changed_prefs.gfx_filtershader[0] = 0; } if (!createtexture (tin_w, tin_h)) @@ -937,10 +950,6 @@ void D3D_free (void) IDirect3DDevice9_Release (d3ddev); d3ddev = NULL; } - if (d3dDLL) { - FreeLibrary (d3dDLL); - d3dDLL = NULL; - } if (d3d) { IDirect3D9_Release (d3d); d3d = NULL; @@ -955,10 +964,14 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) HRESULT ret; static char errmsg[100] = { 0 }; D3DDISPLAYMODE mode; + D3DDISPLAYMODEEX modeex; D3DCAPS9 d3dCaps; int adapter; + DWORD flags; + HINSTANCE d3dDLL; D3D_free (); + D3D_canshaders (); adapter = currprefs.gfx_display - 1; if (adapter < 0) adapter = 0; @@ -969,19 +982,37 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) return errmsg; } + d3d_ex = FALSE; d3dDLL = LoadLibrary ("D3D9.DLL"); if (d3dDLL == NULL) { strcpy (errmsg, "Direct3D: DirectX 9 or newer required"); return errmsg; + } else { + typedef HRESULT (WINAPI *LPDIRECT3DCREATE9EX)(UINT, void**); + LPDIRECT3DCREATE9EX d3dexp = (LPDIRECT3DCREATE9EX)GetProcAddress (d3dDLL, "Direct3DCreate9Ex"); + if (d3dexp) + d3d_ex = TRUE; + } + FreeLibrary (d3dDLL); + if (d3d_ex && D3DEX) { + if (FAILED (Direct3DCreate9Ex (D3D_SDK_VERSION, &d3dex))) { + D3D_free (); + strcpy (errmsg, "Direct3D: failed to create D3DEx object"); + return errmsg; + } + d3d = (IDirect3D9*)d3dex; + } else { + d3d = Direct3DCreate9 (D3D_SDK_VERSION); + if (d3d == NULL) { + D3D_free (); + strcpy (errmsg, "Direct3D: failed to create D3D object"); + return errmsg; + } } - d3d = Direct3DCreate9 (D3D_SDK_VERSION); - if (d3d == NULL) { - D3D_free (); - strcpy (errmsg, "Direct3D: failed to create D3D object"); - return errmsg; - } - + modeex.Size = sizeof modeex; + if (d3dex && D3DEX) + IDirect3D9Ex_GetAdapterDisplayModeEx (d3dex, adapter, &modeex, NULL); IDirect3D9_GetAdapterDisplayMode (d3d, adapter, &mode); IDirect3D9_GetDeviceCaps (d3d, adapter, D3DDEVTYPE_HAL, &d3dCaps); @@ -994,9 +1025,17 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) dpp.BackBufferWidth = w_w; dpp.BackBufferHeight = w_h; dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + + modeex.Width = w_w; + modeex.Height = w_h; + modeex.RefreshRate = 0; + modeex.ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE; + modeex.Format = mode.Format; + vsync2 = 0; if (isfullscreen() > 0) { dpp.FullScreen_RefreshRateInHz = currprefs.gfx_refreshrate > 0 ? currprefs.gfx_refreshrate : 0; + modeex.RefreshRate = dpp.FullScreen_RefreshRateInHz; if (currprefs.gfx_avsync > 0) { dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; if (currprefs.gfx_avsync > 85) { @@ -1009,20 +1048,22 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) } d3dhwnd = ahwnd; + // Check if hardware vertex processing is available - if(d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { - // Create device with hardware vertex processing - ret = IDirect3D9_CreateDevice (d3d, adapter, D3DDEVTYPE_HAL, ahwnd, - D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_NOWINDOWCHANGES|D3DCREATE_FPU_PRESERVE, - &dpp, &d3ddev); + if(d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) + flags = D3DCREATE_HARDWARE_VERTEXPROCESSING; + else + flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; + flags |= D3DCREATE_NOWINDOWCHANGES | D3DCREATE_FPU_PRESERVE; + + if (d3d_ex && D3DEX) { + ret = IDirect3D9Ex_CreateDeviceEx (d3dex, adapter, D3DDEVTYPE_HAL, ahwnd, flags, &dpp, &modeex, &d3ddevex); + d3ddev = (LPDIRECT3DDEVICE9)d3ddevex; } else { - // Create device with software vertex processing - ret = IDirect3D9_CreateDevice (d3d, adapter, D3DDEVTYPE_HAL, ahwnd, - D3DCREATE_SOFTWARE_VERTEXPROCESSING|D3DCREATE_NOWINDOWCHANGES|D3DCREATE_FPU_PRESERVE, - &dpp, &d3ddev); + ret = IDirect3D9_CreateDevice (d3d, adapter, D3DDEVTYPE_HAL, ahwnd, flags, &dpp, &d3ddev); } if(FAILED (ret)) { - sprintf (errmsg, "CreateDevice failed, %s\n", D3D_ErrorString (ret)); + sprintf (errmsg, "%s failed, %s\n", d3d_ex ? "CreateDeviceEx" : "CreateDevice", D3D_ErrorString (ret)); D3D_free (); return errmsg; } @@ -1041,7 +1082,7 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) if(d3dCaps.Caps2 & D3DCAPS2_DYNAMICTEXTURES) tex_dynamic = TRUE; - if(d3dCaps.PixelShaderVersion >= D3DPS_VERSION(1,4)) { + if(d3dCaps.PixelShaderVersion >= D3DPS_VERSION(2,0)) { if((d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) && tex_dynamic) { psEnabled = TRUE; tex_square = TRUE; diff --git a/od-win32/win32.c b/od-win32/win32.c index b9ddd752..22d2ad9b 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -1606,7 +1606,7 @@ HMODULE language_load (WORD language) if (vsFileInfo && HIWORD(vsFileInfo->dwProductVersionMS) == UAEMAJOR && LOWORD(vsFileInfo->dwProductVersionMS) == UAEMINOR - && (HIWORD(vsFileInfo->dwProductVersionLS) == UAESUBREV || HIWORD(vsFileInfo->dwProductVersionLS) == UAESUBREV - 1)) { + && (HIWORD(vsFileInfo->dwProductVersionLS) == UAESUBREV)) { success = TRUE; write_log ("Translation DLL '%s' loaded and enabled\n", dllbuf); } else { diff --git a/od-win32/win32.h b/od-win32/win32.h index 8fc263d5..085abf2e 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -16,10 +16,10 @@ #define GETBDD(x) ((x) % 100) #define WINUAEBETA 0 -#define WINUAEPUBLICBETA 1 -#define WINUAEDATE MAKEBD(2008, 8, 9) +#define WINUAEPUBLICBETA 0 +#define WINUAEDATE MAKEBD(2008, 8, 12) #define WINUAEEXTRA "" -#define WINUAEREV "RC4" +#define WINUAEREV "" #define IHF_WINDOWHIDDEN 6 #define NORMAL_WINDOW_STYLE (WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX) diff --git a/od-win32/winuae_msvc/winuae_msvc.8.vcproj b/od-win32/winuae_msvc/winuae_msvc.8.vcproj deleted file mode 100755 index 5aef5009..00000000 --- a/od-win32/winuae_msvc/winuae_msvc.8.vcproj +++ /dev/null @@ -1,2535 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/od-win32/winuae_msvc/winuae_msvc.vcproj b/od-win32/winuae_msvc/winuae_msvc.vcproj index 6f4ffafd..b0fc9cf3 100755 --- a/od-win32/winuae_msvc/winuae_msvc.vcproj +++ b/od-win32/winuae_msvc/winuae_msvc.vcproj @@ -92,7 +92,7 @@ LinkIncremental="2" SuppressStartupBanner="true" GenerateManifest="false" - DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_36.dll" + DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_39.dll" GenerateDebugInformation="true" ProgramDatabaseFile=".\Debug/winuae.pdb" SubSystem="2" @@ -307,7 +307,7 @@ AdditionalLibraryDirectories="" GenerateManifest="true" AdditionalManifestDependencies="" - DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_36.dll" + DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_39.dll" GenerateDebugInformation="true" ProgramDatabaseFile=".\Release/winuae.pdb" SubSystem="2" @@ -1090,7 +1090,7 @@ AdditionalLibraryDirectories="" GenerateManifest="true" AdditionalManifestDependencies="" - DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_36.dll" + DelayLoadDLLs="wpcap.dll;packet.dll;d3dx9_39.dll" GenerateDebugInformation="true" ProgramDatabaseFile=".\FullRelease/winuae.pdb" SubSystem="2" @@ -1679,10 +1679,6 @@ RelativePath="..\..\cpuemu_12.c" > - - diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index b2872166..74d6a97d 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,11 @@ +Final + +- compiled with August 2008 DXSDK, shader files modified (old ones are + not compatible anymore) D3D filter now requires August 2008 or newer + DirectX. Shader support need pixel shader version 2.0 or later. +- MSVC 2008 updated to final SP1 + RC4: (still waiting for fixed winuae.net..) - quickstart A1200: increase A1200 KS 3.1 priority over @@ -12,7 +19,7 @@ RC4: (still waiting for fixed winuae.net..) - crash when inserting or removing USB devices before emulation has been started - inserting/removing USB devices does not anymore change currently - selected mouse or joystick device in ports panel + selected mouse or joystick in ports panel RC3: @@ -5707,7 +5714,7 @@ Beta 6: Beta 5: - ignore mouse events when WinUAE is not in focus -- disk emulation track length/motor speed fix (István Fabian) +- disk emulation track length/motor speed fix (Istv¯n Fabian) - filesystem "ghost"-file fix (but we still have one bug left in ACTION_RENAME that isn't so easy to fix) - F10 and ALT-keys don't freeze the emulation anymore @@ -6082,7 +6089,7 @@ Beta 1: (VSync test beta) - joystick keyboard emulation do not anymore create normal key presses - sprite update (no more flashing bees in Superfrog) -- CIA update (fixes Powermonger, thanks to István Fábián) +- CIA update (fixes Powermonger, thanks to Istv¯n F¯bi¯n) - VSync and separate refresh rate selection added I had to implement this because I got too many requests :) - requires DirectX 7 or newer (was DX5 or newer) -- 2.47.3