1.1 diff -r 746fb8d0653e -r 87662afa1d98 src/main.c 1.2 --- a/src/main.c Thu Dec 02 20:42:30 2010 +0000 1.3 +++ b/src/main.c Thu Dec 02 20:58:12 2010 +0000 1.4 @@ -148,29 +148,42 @@ 1.5 * in a non-void function, even if it's impossible to ever reach the 1.6 * return-with-no-value. UGH! 1.7 */ 1.8 -#define ACCESS_CHECK_WR() do { \ 1.9 - /* MEM_STATUS st; */ \ 1.10 - switch (checkMemoryAccess(address, true)) { \ 1.11 - case MEM_ALLOWED: \ 1.12 - /* Access allowed */ \ 1.13 - break; \ 1.14 - case MEM_PAGEFAULT: \ 1.15 - /* Page fault */ \ 1.16 - state.genstat = 0x8FFF; \ 1.17 - m68k_pulse_bus_error(); \ 1.18 - return; \ 1.19 - case MEM_UIE: \ 1.20 - /* User access to memory above 4MB */ \ 1.21 - state.genstat = 0x9EFF; \ 1.22 - m68k_pulse_bus_error(); \ 1.23 - return; \ 1.24 - case MEM_KERNEL: \ 1.25 - case MEM_PAGE_NO_WE: \ 1.26 - /* kernel access or page not write enabled */ \ 1.27 - /* TODO: which regs need setting? */ \ 1.28 - m68k_pulse_bus_error(); \ 1.29 - return; \ 1.30 - } \ 1.31 +#define ACCESS_CHECK_WR(address, bits) do { \ 1.32 + bool fault = false; \ 1.33 + /* MEM_STATUS st; */ \ 1.34 + switch (checkMemoryAccess(address, true)) { \ 1.35 + case MEM_ALLOWED: \ 1.36 + /* Access allowed */ \ 1.37 + break; \ 1.38 + case MEM_PAGEFAULT: \ 1.39 + /* Page fault */ \ 1.40 + state.genstat = 0x8FFF; \ 1.41 + fault = true; \ 1.42 + break; \ 1.43 + case MEM_UIE: \ 1.44 + /* User access to memory above 4MB */ \ 1.45 + state.genstat = 0x9EFF; \ 1.46 + fault = true; \ 1.47 + break; \ 1.48 + case MEM_KERNEL: \ 1.49 + case MEM_PAGE_NO_WE: \ 1.50 + /* kernel access or page not write enabled */ \ 1.51 + /* TODO: which regs need setting? */ \ 1.52 + fault = true; \ 1.53 + break; \ 1.54 + } \ 1.55 + \ 1.56 + if (fault) { \ 1.57 + if (bits >= 16) \ 1.58 + state.bsr0 = 0x7F00; \ 1.59 + else \ 1.60 + state.bsr0 = (address & 1) ? 0x7D00 : 0x7E00; \ 1.61 + state.bsr0 |= (address >> 16); \ 1.62 + state.bsr1 = address & 0xffff; \ 1.63 + printf("ERR: BusError WR\n"); \ 1.64 + m68k_pulse_bus_error(); \ 1.65 + return; \ 1.66 + } \ 1.67 } while (false) 1.68 1.69 /** 1.70 @@ -182,31 +195,45 @@ 1.71 * in a non-void function, even if it's impossible to ever reach the 1.72 * return-with-no-value. UGH! 1.73 */ 1.74 -#define ACCESS_CHECK_RD() do { \ 1.75 - /* MEM_STATUS st; */ \ 1.76 - switch (checkMemoryAccess(address, false)) { \ 1.77 - case MEM_ALLOWED: \ 1.78 - /* Access allowed */ \ 1.79 - break; \ 1.80 - case MEM_PAGEFAULT: \ 1.81 - /* Page fault */ \ 1.82 - state.genstat = 0xCFFF; \ 1.83 - m68k_pulse_bus_error(); \ 1.84 - return 0xFFFFFFFF; \ 1.85 - case MEM_UIE: \ 1.86 - /* User access to memory above 4MB */ \ 1.87 - state.genstat = 0xDEFF; \ 1.88 - m68k_pulse_bus_error(); \ 1.89 - return 0xFFFFFFFF; \ 1.90 - case MEM_KERNEL: \ 1.91 - case MEM_PAGE_NO_WE: \ 1.92 - /* kernel access or page not write enabled */ \ 1.93 - /* TODO: which regs need setting? */ \ 1.94 - m68k_pulse_bus_error(); \ 1.95 - return 0xFFFFFFFF; \ 1.96 - } \ 1.97 +#define ACCESS_CHECK_RD(address, bits) do { \ 1.98 + bool fault = false; \ 1.99 + /* MEM_STATUS st; */ \ 1.100 + switch (checkMemoryAccess(address, false)) { \ 1.101 + case MEM_ALLOWED: \ 1.102 + /* Access allowed */ \ 1.103 + break; \ 1.104 + case MEM_PAGEFAULT: \ 1.105 + /* Page fault */ \ 1.106 + state.genstat = 0x8FFF; \ 1.107 + fault = true; \ 1.108 + break; \ 1.109 + case MEM_UIE: \ 1.110 + /* User access to memory above 4MB */ \ 1.111 + state.genstat = 0x9EFF; \ 1.112 + fault = true; \ 1.113 + break; \ 1.114 + case MEM_KERNEL: \ 1.115 + case MEM_PAGE_NO_WE: \ 1.116 + /* kernel access or page not write enabled */ \ 1.117 + /* TODO: which regs need setting? */ \ 1.118 + fault = true; \ 1.119 + break; \ 1.120 + } \ 1.121 + \ 1.122 + if (fault) { \ 1.123 + if (bits >= 16) \ 1.124 + state.bsr0 = 0x7F00; \ 1.125 + else \ 1.126 + state.bsr0 = (address & 1) ? 0x7D00 : 0x7E00; \ 1.127 + state.bsr0 |= (address >> 16); \ 1.128 + state.bsr1 = address & 0xffff; \ 1.129 + printf("ERR: BusError RD\n"); \ 1.130 + m68k_pulse_bus_error(); \ 1.131 + return 0xFFFFFFFF; \ 1.132 + } \ 1.133 } while (false) 1.134 1.135 + 1.136 /** 1.137 * @brief Read M68K memory, 32-bit 1.138 */ 1.139 @@ -219,7 +246,7 @@ 1.140 address |= 0x800000; 1.141 1.142 // Check access permissions 1.143 - ACCESS_CHECK_RD(); 1.144 + ACCESS_CHECK_RD(address, 32); 1.145 1.146 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.147 // ROM access 1.148 @@ -372,7 +399,7 @@ 1.149 address |= 0x800000; 1.150 1.151 // Check access permissions 1.152 - ACCESS_CHECK_RD(); 1.153 + ACCESS_CHECK_RD(address, 16); 1.154 1.155 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.156 // ROM access 1.157 @@ -525,7 +552,7 @@ 1.158 address |= 0x800000; 1.159 1.160 // Check access permissions 1.161 - ACCESS_CHECK_RD(); 1.162 + ACCESS_CHECK_RD(address, 8); 1.163 1.164 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.165 // ROM access 1.166 @@ -679,7 +706,7 @@ 1.167 address |= 0x800000; 1.168 1.169 // Check access permissions 1.170 - ACCESS_CHECK_WR(); 1.171 + ACCESS_CHECK_WR(address, 32); 1.172 1.173 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.174 // ROM access 1.175 @@ -832,7 +859,7 @@ 1.176 address |= 0x800000; 1.177 1.178 // Check access permissions 1.179 - ACCESS_CHECK_WR(); 1.180 + ACCESS_CHECK_WR(address, 16); 1.181 1.182 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.183 // ROM access 1.184 @@ -985,7 +1012,7 @@ 1.185 address |= 0x800000; 1.186 1.187 // Check access permissions 1.188 - ACCESS_CHECK_WR(); 1.189 + ACCESS_CHECK_WR(address, 8); 1.190 1.191 if ((address >= 0x800000) && (address <= 0xBFFFFF)) { 1.192 // ROM access