mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-10 21:05:12 +01:00
[Core/CPU] minor optimization to 68k read/write handlers
This commit is contained in:
parent
afefce4496
commit
9810f9d34b
@ -529,16 +529,6 @@
|
|||||||
#define m68k_read_pcrelative_16(address) m68k_read_immediate_16(address)
|
#define m68k_read_pcrelative_16(address) m68k_read_immediate_16(address)
|
||||||
#define m68k_read_pcrelative_32(address) m68k_read_immediate_32(address)
|
#define m68k_read_pcrelative_32(address) m68k_read_immediate_32(address)
|
||||||
|
|
||||||
/* Read from the current address space */
|
|
||||||
#define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space())
|
|
||||||
#define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space())
|
|
||||||
#define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space())
|
|
||||||
|
|
||||||
/* Write to the current data space */
|
|
||||||
#define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
|
|
||||||
#define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
|
|
||||||
#define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
|
|
||||||
|
|
||||||
/* map read immediate 8 to read immediate 16 */
|
/* map read immediate 8 to read immediate 16 */
|
||||||
#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16())
|
#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16())
|
||||||
|
|
||||||
@ -547,17 +537,6 @@
|
|||||||
#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A)
|
#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A)
|
||||||
#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A)
|
#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A)
|
||||||
|
|
||||||
/* Read from the program space */
|
|
||||||
#define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
|
|
||||||
#define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
|
|
||||||
#define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
|
|
||||||
|
|
||||||
/* Read from the data space */
|
|
||||||
#define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
|
|
||||||
#define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
|
|
||||||
#define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
/* =============================== PROTOTYPES ============================= */
|
/* =============================== PROTOTYPES ============================= */
|
||||||
@ -684,15 +663,15 @@ static const uint16 m68ki_exception_cycle_table[256] =
|
|||||||
INLINE uint m68ki_read_imm_16(void);
|
INLINE uint m68ki_read_imm_16(void);
|
||||||
INLINE uint m68ki_read_imm_32(void);
|
INLINE uint m68ki_read_imm_32(void);
|
||||||
|
|
||||||
/* Read data with specific function code */
|
/* Read from the current address space */
|
||||||
INLINE uint m68ki_read_8_fc (uint address, uint fc);
|
INLINE uint m68ki_read_8(uint address);
|
||||||
INLINE uint m68ki_read_16_fc (uint address, uint fc);
|
INLINE uint m68ki_read_16(uint address);
|
||||||
INLINE uint m68ki_read_32_fc (uint address, uint fc);
|
INLINE uint m68ki_read_32(uint address);
|
||||||
|
|
||||||
/* Write data with specific function code */
|
/* Write to the current data space */
|
||||||
INLINE void m68ki_write_8_fc (uint address, uint fc, uint value);
|
INLINE void m68ki_write_8(uint address, uint value);
|
||||||
INLINE void m68ki_write_16_fc(uint address, uint fc, uint value);
|
INLINE void m68ki_write_16(uint address, uint value);
|
||||||
INLINE void m68ki_write_32_fc(uint address, uint fc, uint value);
|
INLINE void m68ki_write_32(uint address, uint value);
|
||||||
|
|
||||||
/* Indexed and PC-relative ea fetching */
|
/* Indexed and PC-relative ea fetching */
|
||||||
INLINE uint m68ki_get_ea_pcdi(void);
|
INLINE uint m68ki_get_ea_pcdi(void);
|
||||||
@ -864,69 +843,69 @@ INLINE uint m68ki_read_imm_32(void)
|
|||||||
* These functions will also check for address error and set the function
|
* These functions will also check for address error and set the function
|
||||||
* code if they are enabled in m68kconf.h.
|
* code if they are enabled in m68kconf.h.
|
||||||
*/
|
*/
|
||||||
INLINE uint m68ki_read_8_fc(uint address, uint fc)
|
INLINE uint m68ki_read_8(uint address)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];;
|
cpu_memory_map *temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | m68ki_get_address_space()) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
if (temp->read8) return (*temp->read8)(ADDRESS_68K(address));
|
if (temp->read8) return (*temp->read8)(ADDRESS_68K(address));
|
||||||
else return READ_BYTE(temp->base, (address) & 0xffff);
|
else return READ_BYTE(temp->base, (address) & 0xffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE uint m68ki_read_16_fc(uint address, uint fc)
|
INLINE uint m68ki_read_16(uint address)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp;
|
cpu_memory_map *temp;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | m68ki_get_address_space()) /* auto-disable (see m68kcpu.h) */
|
||||||
m68ki_check_address_error(address, MODE_READ, fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_READ, FLAG_S | m68ki_get_address_space()) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
||||||
if (temp->read16) return (*temp->read16)(ADDRESS_68K(address));
|
if (temp->read16) return (*temp->read16)(ADDRESS_68K(address));
|
||||||
else return *(uint16 *)(temp->base + ((address) & 0xffff));
|
else return *(uint16 *)(temp->base + ((address) & 0xffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE uint m68ki_read_32_fc(uint address, uint fc)
|
INLINE uint m68ki_read_32(uint address)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp;
|
cpu_memory_map *temp;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | m68ki_get_address_space()) /* auto-disable (see m68kcpu.h) */
|
||||||
m68ki_check_address_error(address, MODE_READ, fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_READ, FLAG_S | m68ki_get_address_space()) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
||||||
if (temp->read16) return ((*temp->read16)(ADDRESS_68K(address)) << 16) | ((*temp->read16)(ADDRESS_68K(address + 2)));
|
if (temp->read16) return ((*temp->read16)(ADDRESS_68K(address)) << 16) | ((*temp->read16)(ADDRESS_68K(address + 2)));
|
||||||
else return m68k_read_immediate_32(address);
|
else return m68k_read_immediate_32(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void m68ki_write_8_fc(uint address, uint fc, uint value)
|
INLINE void m68ki_write_8(uint address, uint value)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp;
|
cpu_memory_map *temp;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
||||||
if (temp->write8) (*temp->write8)(ADDRESS_68K(address),value);
|
if (temp->write8) (*temp->write8)(ADDRESS_68K(address),value);
|
||||||
else WRITE_BYTE(temp->base, (address) & 0xffff, value);
|
else WRITE_BYTE(temp->base, (address) & 0xffff, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void m68ki_write_16_fc(uint address, uint fc, uint value)
|
INLINE void m68ki_write_16(uint address, uint value)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp;
|
cpu_memory_map *temp;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
m68ki_check_address_error(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA); /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
||||||
if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value);
|
if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value);
|
||||||
else *(uint16 *)(temp->base + ((address) & 0xffff)) = value;
|
else *(uint16 *)(temp->base + ((address) & 0xffff)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void m68ki_write_32_fc(uint address, uint fc, uint value)
|
INLINE void m68ki_write_32(uint address, uint value)
|
||||||
{
|
{
|
||||||
cpu_memory_map *temp;
|
cpu_memory_map *temp;
|
||||||
|
|
||||||
m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
m68ki_check_address_error(address, MODE_WRITE, fc) /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];
|
||||||
if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value>>16);
|
if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value>>16);
|
||||||
@ -1117,7 +1096,8 @@ INLINE void m68ki_jump(uint new_pc)
|
|||||||
|
|
||||||
INLINE void m68ki_jump_vector(uint vector)
|
INLINE void m68ki_jump_vector(uint vector)
|
||||||
{
|
{
|
||||||
REG_PC = m68ki_read_data_32(vector<<2);
|
m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */
|
||||||
|
REG_PC = m68ki_read_32(vector<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1385,11 +1365,12 @@ INLINE void m68ki_exception_interrupt(uint int_level)
|
|||||||
m68ki_int_ack(int_level);
|
m68ki_int_ack(int_level);
|
||||||
|
|
||||||
/* Get the new PC */
|
/* Get the new PC */
|
||||||
new_pc = m68ki_read_data_32(vector<<2);
|
m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */
|
||||||
|
new_pc = m68ki_read_32(vector<<2);
|
||||||
|
|
||||||
/* If vector is uninitialized, call the uninitialized interrupt vector */
|
/* If vector is uninitialized, call the uninitialized interrupt vector */
|
||||||
if(new_pc == 0)
|
if(new_pc == 0)
|
||||||
new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2));
|
new_pc = m68ki_read_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2));
|
||||||
|
|
||||||
/* Generate a stack frame */
|
/* Generate a stack frame */
|
||||||
m68ki_stack_frame_3word(REG_PC, sr);
|
m68ki_stack_frame_3word(REG_PC, sr);
|
||||||
|
Loading…
Reference in New Issue
Block a user