Implement m68k_read_disassembler_* properly

Tue, 15 Jan 2013 17:02:56 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Tue, 15 Jan 2013 17:02:56 +0000
changeset 121
15ae2788e848
parent 120
df40e6668a46
child 122
b214cf455ff2

Implement m68k_read_disassembler_* properly

The previous implementations of m68k_read_disassembler are unsuitable due to
interactions with the memory mapper. A read from memory by the DASM should not
mutate system state.

So we modify the m68k_read_disassembler_{8,16,32} functions to do the memory
mapping themselves without causing page faults (bus error exception) or
updating the page flag bits (which could really upset the kernel).

Now all we need is a debugger/disassembler...

src/memory.c file | annotate | diff | revisions
     1.1 diff -r df40e6668a46 -r 15ae2788e848 src/memory.c
     1.2 --- a/src/memory.c	Mon Jan 14 09:50:37 2013 +0000
     1.3 +++ b/src/memory.c	Tue Jan 15 17:02:56 2013 +0000
     1.4 @@ -111,7 +111,6 @@
     1.5  	return MEM_ALLOWED;
     1.6  }/*}}}*/
     1.7  
     1.8 -#undef MAPRAM
     1.9  
    1.10  
    1.11  /********************************************************
    1.12 @@ -1011,7 +1010,72 @@
    1.13  
    1.14  
    1.15  // for the disassembler
    1.16 -uint32_t m68k_read_disassembler_32(uint32_t addr) { return m68k_read_memory_32(addr); }
    1.17 -uint32_t m68k_read_disassembler_16(uint32_t addr) { return m68k_read_memory_16(addr); }
    1.18 -uint32_t m68k_read_disassembler_8 (uint32_t addr) { return m68k_read_memory_8 (addr); }
    1.19 +uint32_t m68k_read_disassembler_32(uint32_t addr)
    1.20 +{
    1.21 +	if (addr < 0x400000) {
    1.22 +		uint16_t page = (addr >> 12) & 0x3FF;
    1.23 +		uint32_t new_page_addr = MAPRAM(page) & 0x3FF;
    1.24 +		uint32_t newAddr = (new_page_addr << 12) + (addr & 0xFFF);
    1.25 +		if (newAddr <= 0x1fffff) {
    1.26 +			if (newAddr >= state.base_ram_size)
    1.27 +				return EMPTY;
    1.28 +			else
    1.29 +				return RD32(state.base_ram, newAddr, state.base_ram_size - 1);
    1.30 +		} else {
    1.31 +			if ((newAddr <= (state.exp_ram_size + 0x200000 - 1)) && (newAddr >= 0x200000))
    1.32 +				return RD32(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    1.33 +			else
    1.34 +				return EMPTY;
    1.35 +		}
    1.36 +	} else {
    1.37 +		printf(">>> WARNING Disassembler RD32 out of range 0x%08X\n", addr);
    1.38 +		return EMPTY;
    1.39 +	}
    1.40 +}
    1.41  
    1.42 +uint32_t m68k_read_disassembler_16(uint32_t addr)
    1.43 +{
    1.44 +	if (addr < 0x400000) {
    1.45 +		uint16_t page = (addr >> 12) & 0x3FF;
    1.46 +		uint32_t new_page_addr = MAPRAM(page) & 0x3FF;
    1.47 +		uint32_t newAddr = (new_page_addr << 12) + (addr & 0xFFF);
    1.48 +		if (newAddr <= 0x1fffff) {
    1.49 +			if (newAddr >= state.base_ram_size)
    1.50 +				return EMPTY & 0xffff;
    1.51 +			else
    1.52 +				return RD16(state.base_ram, newAddr, state.base_ram_size - 1);
    1.53 +		} else {
    1.54 +			if ((newAddr <= (state.exp_ram_size + 0x200000 - 1)) && (newAddr >= 0x200000))
    1.55 +				return RD16(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    1.56 +			else
    1.57 +				return EMPTY & 0xffff;
    1.58 +		}
    1.59 +	} else {
    1.60 +		printf(">>> WARNING Disassembler RD16 out of range 0x%08X\n", addr);
    1.61 +		return EMPTY & 0xffff;
    1.62 +	}
    1.63 +}
    1.64 +
    1.65 +uint32_t m68k_read_disassembler_8 (uint32_t addr)
    1.66 +{
    1.67 +	if (addr < 0x400000) {
    1.68 +		uint16_t page = (addr >> 12) & 0x3FF;
    1.69 +		uint32_t new_page_addr = MAPRAM(page) & 0x3FF;
    1.70 +		uint32_t newAddr = (new_page_addr << 12) + (addr & 0xFFF);
    1.71 +		if (newAddr <= 0x1fffff) {
    1.72 +			if (newAddr >= state.base_ram_size)
    1.73 +				return EMPTY & 0xff;
    1.74 +			else
    1.75 +				return RD8(state.base_ram, newAddr, state.base_ram_size - 1);
    1.76 +		} else {
    1.77 +			if ((newAddr <= (state.exp_ram_size + 0x200000 - 1)) && (newAddr >= 0x200000))
    1.78 +				return RD8(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    1.79 +			else
    1.80 +				return EMPTY & 0xff;
    1.81 +		}
    1.82 +	} else {
    1.83 +		printf(">>> WARNING Disassembler RD8 out of range 0x%08X\n", addr);
    1.84 +		return EMPTY & 0xff;
    1.85 +	}
    1.86 +}
    1.87 +