X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=m68kcpu.h;h=e93c3d4a04703f259e3dea05f8901ddcb0c3610a;hb=18cba7ddc6d8b268f5749bf3ba8cf3cbd0d226b2;hp=38d6b9f8eff29a54dea4a5869c852ae79a38b957;hpb=3203ac85909c4feadb96bdf56b373785f9c81210;p=pistorm diff --git a/m68kcpu.h b/m68kcpu.h index 38d6b9f..e93c3d4 100644 --- a/m68kcpu.h +++ b/m68kcpu.h @@ -938,6 +938,15 @@ typedef union } fp_reg; typedef struct +{ + unsigned int lower; + unsigned int upper; + unsigned char *offset; +} address_translation_cache; + + + +typedef struct m68ki_cpu_core { uint cpu_type; /* CPU Type: 68000, 68008, 68010, 68EC020, 68020, 68EC030, 68030, 68EC040, or 68040 */ uint dar[16]; /* Data and Address Registers */ @@ -1042,6 +1051,19 @@ typedef struct void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */ void (*instr_hook_callback)(unsigned int pc); /* Called every instruction cycle prior to execution */ + /* address translation caches */ + + unsigned char read_ranges; + unsigned int read_addr[8]; + unsigned int read_upper[8]; + unsigned char *read_data[8]; + unsigned char write_ranges; + unsigned int write_addr[8]; + unsigned int write_upper[8]; + unsigned char *write_data[8]; + address_translation_cache code_translation_cache; + + } m68ki_cpu_core; @@ -1075,24 +1097,6 @@ char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type); /* ---------------------------- Read Immediate ---------------------------- */ -typedef struct -{ - unsigned int lower; - unsigned int upper; - unsigned char *data; -} address_translation_cache; - - -extern unsigned char read_ranges; -extern unsigned int read_addr[8]; -extern unsigned int read_upper[8]; -extern unsigned char *read_data[8]; -extern unsigned char write_ranges; -extern unsigned int write_addr[8]; -extern unsigned int write_upper[8]; -extern unsigned char *write_data[8]; - -extern address_translation_cache code_translation_cache; // clear the instruction cache inline void m68ki_ic_clear() @@ -1161,24 +1165,23 @@ static inline uint32 m68ki_ic_readimm16(uint32 address) /* Handles all immediate reads, does address error check, function code setting, * and prefetching if they are enabled in m68kconf.h */ -uint m68ki_read_imm6_addr_slowpath(uint32_t address, address_translation_cache *cache); +uint m68ki_read_imm6_addr_slowpath(uint32_t pc, address_translation_cache *cache); static inline uint m68ki_read_imm_16(void) { - uint32_t address = ADDRESS_68K(REG_PC); + uint32_t pc = REG_PC; - address_translation_cache *cache = &code_translation_cache; - if(address >= cache->lower && address < cache->upper) - { - REG_PC += 2; - return be16toh(((unsigned short *)(cache->data + (address - cache->lower)))[0]); - } - return m68ki_read_imm6_addr_slowpath(address, cache); + address_translation_cache *cache = &m68ki_cpu.code_translation_cache; + if(pc >= cache->lower && pc < cache->upper) + { + REG_PC += 2; + return be16toh(((unsigned short *)(cache->offset + pc))[0]); + } + return m68ki_read_imm6_addr_slowpath(pc, cache); } - static inline uint m68ki_read_imm_8(void) { /* map read immediate 8 to read immediate 16 */ @@ -1194,10 +1197,10 @@ static inline uint m68ki_read_imm_32(void) #endif #endif uint32_t address = ADDRESS_68K(REG_PC); - for (int i = 0; i < read_ranges; i++) { - if(address >= read_addr[i] && address < read_upper[i]) { + for (int i = 0; i < m68ki_cpu.read_ranges; i++) { + if(address >= m68ki_cpu.read_addr[i] && address < m68ki_cpu.read_upper[i]) { REG_PC += 4; - return be32toh(((unsigned int *)(read_data[i] + (address - read_addr[i])))[0]); + return be32toh(((unsigned int *)(m68ki_cpu.read_data[i] + (address - m68ki_cpu.read_addr[i])))[0]); } } @@ -1227,15 +1230,7 @@ static inline uint m68ki_read_imm_32(void) return temp_val; #else - m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ - m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ - uint32_t address = ADDRESS_68K(REG_PC); REG_PC += 4; - for (int i = 0; i < read_ranges; i++) { - if(address >= read_addr[i] && address < read_upper[i]) { - return be32toh(((unsigned int *)(read_data[i] + (address - read_addr[i])))[0]); - } - } return m68k_read_immediate_32(address); #endif /* M68K_EMULATE_PREFETCH */ @@ -1263,9 +1258,9 @@ static inline uint m68ki_read_8_fc(uint address, uint fc) address = pmmu_translate_addr(address,1); #endif - for (int i = 0; i < read_ranges; i++) { - if(address >= read_addr[i] && address < read_upper[i]) { - return read_data[i][address - read_addr[i]]; + for (int i = 0; i < m68ki_cpu.read_ranges; i++) { + if(address >= m68ki_cpu.read_addr[i] && address < m68ki_cpu.read_upper[i]) { + return m68ki_cpu.read_data[i][address - m68ki_cpu.read_addr[i]]; } } @@ -1284,9 +1279,9 @@ static inline uint m68ki_read_16_fc(uint address, uint fc) address = pmmu_translate_addr(address,1); #endif - for (int i = 0; i < read_ranges; i++) { - if(address >= read_addr[i] && address < read_upper[i]) { - return be16toh(((unsigned short *)(read_data[i] + (address - read_addr[i])))[0]); + for (int i = 0; i < m68ki_cpu.read_ranges; i++) { + if(address >= m68ki_cpu.read_addr[i] && address < m68ki_cpu.read_upper[i]) { + return be16toh(((unsigned short *)(m68ki_cpu.read_data[i] + (address - m68ki_cpu.read_addr[i])))[0]); } } @@ -1305,9 +1300,9 @@ static inline uint m68ki_read_32_fc(uint address, uint fc) address = pmmu_translate_addr(address,1); #endif - for (int i = 0; i < read_ranges; i++) { - if(address >= read_addr[i] && address < read_upper[i]) { - return be32toh(((unsigned int *)(read_data[i] + (address - read_addr[i])))[0]); + for (int i = 0; i < m68ki_cpu.read_ranges; i++) { + if(address >= m68ki_cpu.read_addr[i] && address < m68ki_cpu.read_upper[i]) { + return be32toh(((unsigned int *)(m68ki_cpu.read_data[i] + (address - m68ki_cpu.read_addr[i])))[0]); } } @@ -1326,9 +1321,9 @@ static inline void m68ki_write_8_fc(uint address, uint fc, uint value) address = pmmu_translate_addr(address,0); #endif - for (int i = 0; i < write_ranges; i++) { - if(address >= write_addr[i] && address < write_upper[i]) { - write_data[i][address - write_addr[i]] = (unsigned char)value; + for (int i = 0; i < m68ki_cpu.write_ranges; i++) { + if(address >= m68ki_cpu.write_addr[i] && address < m68ki_cpu.write_upper[i]) { + m68ki_cpu.write_data[i][address - m68ki_cpu.write_addr[i]] = (unsigned char)value; return; } } @@ -1348,9 +1343,9 @@ static inline void m68ki_write_16_fc(uint address, uint fc, uint value) address = pmmu_translate_addr(address,0); #endif - for (int i = 0; i < write_ranges; i++) { - if(address >= write_addr[i] && address < write_upper[i]) { - ((short *)(write_data[i] + (address - write_addr[i])))[0] = htobe16(value); + for (int i = 0; i < m68ki_cpu.write_ranges; i++) { + if(address >= m68ki_cpu.write_addr[i] && address < m68ki_cpu.write_upper[i]) { + ((short *)(m68ki_cpu.write_data[i] + (address - m68ki_cpu.write_addr[i])))[0] = htobe16(value); return; } } @@ -1370,9 +1365,9 @@ static inline void m68ki_write_32_fc(uint address, uint fc, uint value) address = pmmu_translate_addr(address,0); #endif - for (int i = 0; i < write_ranges; i++) { - if(address >= write_addr[i] && address < write_upper[i]) { - ((int *)(write_data[i] + (address - write_addr[i])))[0] = htobe32(value); + for (int i = 0; i < m68ki_cpu.write_ranges; i++) { + if(address >= m68ki_cpu.write_addr[i] && address < m68ki_cpu.write_upper[i]) { + ((int *)(m68ki_cpu.write_data[i] + (address - m68ki_cpu.write_addr[i])))[0] = htobe32(value); return; } }