diff options
author | 2008-11-20 17:07:08 +0000 | |
---|---|---|
committer | 2008-11-20 17:07:08 +0000 | |
commit | 0bf352e5e86b22affc892f2f097e4ddbc34656de (patch) | |
tree | b2fb2dec2001ea9a42d5e24953c3926e08bfe2db /src/emu/cpu/jaguar | |
parent | e23c6d66763435cba882826f2134c56f048402e6 (diff) |
Pointer-ified the jaguar CPU core.
Diffstat (limited to 'src/emu/cpu/jaguar')
-rw-r--r-- | src/emu/cpu/jaguar/jaguar.c | 1743 | ||||
-rw-r--r-- | src/emu/cpu/jaguar/jaguar.h | 26 |
2 files changed, 852 insertions, 917 deletions
diff --git a/src/emu/cpu/jaguar/jaguar.c b/src/emu/cpu/jaguar/jaguar.c index 465698d2d43..20ca231ee9c 100644 --- a/src/emu/cpu/jaguar/jaguar.c +++ b/src/emu/cpu/jaguar/jaguar.c @@ -19,37 +19,37 @@ CONSTANTS ***************************************************************************/ -#define ZFLAG 0x00001 -#define CFLAG 0x00002 -#define NFLAG 0x00004 -#define IFLAG 0x00008 -#define EINT0FLAG 0x00010 -#define EINT1FLAG 0x00020 -#define EINT2FLAG 0x00040 -#define EINT3FLAG 0x00080 -#define EINT4FLAG 0x00100 -#define EINT04FLAGS (EINT0FLAG | EINT1FLAG | EINT2FLAG | EINT3FLAG | EINT4FLAG) -#define CINT0FLAG 0x00200 -#define CINT1FLAG 0x00400 -#define CINT2FLAG 0x00800 -#define CINT3FLAG 0x01000 -#define CINT4FLAG 0x02000 -#define CINT04FLAGS (CINT0FLAG | CINT1FLAG | CINT2FLAG | CINT3FLAG | CINT4FLAG) -#define RPAGEFLAG 0x04000 -#define DMAFLAG 0x08000 -#define EINT5FLAG 0x10000 /* DSP only */ -#define CINT5FLAG 0x20000 /* DSP only */ - -#define CLR_Z (jaguar.FLAGS &= ~ZFLAG) -#define CLR_ZN (jaguar.FLAGS &= ~(ZFLAG | NFLAG)) -#define CLR_ZNC (jaguar.FLAGS &= ~(CFLAG | ZFLAG | NFLAG)) -#define SET_Z(r) (jaguar.FLAGS |= ((r) == 0)) -#define SET_C_ADD(a,b) (jaguar.FLAGS |= ((UINT32)(b) > (UINT32)(~(a))) << 1) -#define SET_C_SUB(a,b) (jaguar.FLAGS |= ((UINT32)(b) > (UINT32)(a)) << 1) -#define SET_N(r) (jaguar.FLAGS |= (((UINT32)(r) >> 29) & 4)) -#define SET_ZN(r) SET_N(r); SET_Z(r) -#define SET_ZNC_ADD(a,b,r) SET_N(r); SET_Z(r); SET_C_ADD(a,b) -#define SET_ZNC_SUB(a,b,r) SET_N(r); SET_Z(r); SET_C_SUB(a,b) +#define ZFLAG 0x00001 +#define CFLAG 0x00002 +#define NFLAG 0x00004 +#define IFLAG 0x00008 +#define EINT0FLAG 0x00010 +#define EINT1FLAG 0x00020 +#define EINT2FLAG 0x00040 +#define EINT3FLAG 0x00080 +#define EINT4FLAG 0x00100 +#define EINT04FLAGS (EINT0FLAG | EINT1FLAG | EINT2FLAG | EINT3FLAG | EINT4FLAG) +#define CINT0FLAG 0x00200 +#define CINT1FLAG 0x00400 +#define CINT2FLAG 0x00800 +#define CINT3FLAG 0x01000 +#define CINT4FLAG 0x02000 +#define CINT04FLAGS (CINT0FLAG | CINT1FLAG | CINT2FLAG | CINT3FLAG | CINT4FLAG) +#define RPAGEFLAG 0x04000 +#define DMAFLAG 0x08000 +#define EINT5FLAG 0x10000 /* DSP only */ +#define CINT5FLAG 0x20000 /* DSP only */ + +#define CLR_Z(J) ((J)->FLAGS &= ~ZFLAG) +#define CLR_ZN(J) ((J)->FLAGS &= ~(ZFLAG | NFLAG)) +#define CLR_ZNC(J) ((J)->FLAGS &= ~(CFLAG | ZFLAG | NFLAG)) +#define SET_Z(J,r) ((J)->FLAGS |= ((r) == 0)) +#define SET_C_ADD(J,a,b) ((J)->FLAGS |= ((UINT32)(b) > (UINT32)(~(a))) << 1) +#define SET_C_SUB(J,a,b) ((J)->FLAGS |= ((UINT32)(b) > (UINT32)(a)) << 1) +#define SET_N(J,r) ((J)->FLAGS |= (((UINT32)(r) >> 29) & 4)) +#define SET_ZN(J,r) SET_N(J,r); SET_Z(J,r) +#define SET_ZNC_ADD(J,a,b,r) SET_N(J,r); SET_Z(J,r); SET_C_ADD(J,a,b) +#define SET_ZNC_SUB(J,a,b,r) SET_N(J,r); SET_Z(J,r); SET_C_SUB(J,a,b) @@ -57,18 +57,18 @@ MACROS ***************************************************************************/ -#define PC ctrl[G_PC] -#define FLAGS ctrl[G_FLAGS] +#define PC ctrl[G_PC] +#define FLAGS ctrl[G_FLAGS] -#define CONDITION(x) condition_table[(x) + ((jaguar.FLAGS & 7) << 5)] +#define CONDITION(x) condition_table[(x) + ((jaguar->FLAGS & 7) << 5)] -#define READBYTE(a) program_read_byte_32be(a) -#define READWORD(a) program_read_word_32be(a) -#define READLONG(a) program_read_dword_32be(a) +#define READBYTE(J,a) memory_read_byte_32be((J)->program, a) +#define READWORD(J,a) memory_read_word_32be((J)->program, a) +#define READLONG(J,a) memory_read_dword_32be((J)->program, a) -#define WRITEBYTE(a,v) program_write_byte_32be(a,v) -#define WRITEWORD(a,v) program_write_word_32be(a,v) -#define WRITELONG(a,v) program_write_dword_32be(a,v) +#define WRITEBYTE(J,a,v) memory_write_byte_32be((J)->program, a, v) +#define WRITEWORD(J,a,v) memory_write_word_32be((J)->program, a, v) +#define WRITELONG(J,a,v) memory_write_dword_32be((J)->program, a, v) @@ -77,7 +77,8 @@ ***************************************************************************/ /* Jaguar Registers */ -typedef struct +typedef struct _jaguar_state jaguar_state; +struct _jaguar_state { /* core registers */ UINT32 r[32]; @@ -92,22 +93,14 @@ typedef struct /* internal stuff */ int isdsp; - int op; - int interrupt_cycles; - void (*const *table)(void); + int icount; + int bankswitch_icount; + void (*const *table)(jaguar_state *jaguar, UINT16 op); cpu_irq_callback irq_callback; + jaguar_int_func cpu_interrupt; const device_config *device; - void (*cpu_interrupt)(void); -} jaguar_regs; - - - -/*************************************************************************** - PUBLIC GLOBAL VARIABLES -***************************************************************************/ - -static int jaguar_icount; -static int bankswitch_icount; + const address_space *program; +}; @@ -115,10 +108,9 @@ static int bankswitch_icount; PRIVATE GLOBAL VARIABLES ***************************************************************************/ -static jaguar_regs jaguar; +static UINT32 table_refcount; static UINT16 * mirror_table; static UINT8 * condition_table; -static int executing_cpu; static const UINT32 convert_zero[32] = { 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; @@ -129,78 +121,78 @@ static const UINT32 convert_zero[32] = FUNCTION TABLES ***************************************************************************/ -static void abs_rn(void); -static void add_rn_rn(void); -static void addc_rn_rn(void); -static void addq_n_rn(void); -static void addqmod_n_rn(void); /* DSP only */ -static void addqt_n_rn(void); -static void and_rn_rn(void); -static void bclr_n_rn(void); -static void bset_n_rn(void); -static void btst_n_rn(void); -static void cmp_rn_rn(void); -static void cmpq_n_rn(void); -static void div_rn_rn(void); -static void illegal(void); -static void imacn_rn_rn(void); -static void imult_rn_rn(void); -static void imultn_rn_rn(void); -static void jr_cc_n(void); -static void jump_cc_rn(void); -static void load_rn_rn(void); -static void load_r14n_rn(void); -static void load_r15n_rn(void); -static void load_r14rn_rn(void); -static void load_r15rn_rn(void); -static void loadb_rn_rn(void); -static void loadw_rn_rn(void); -static void loadp_rn_rn(void); /* GPU only */ -static void mirror_rn(void); /* DSP only */ -static void mmult_rn_rn(void); -static void move_rn_rn(void); -static void move_pc_rn(void); -static void movefa_rn_rn(void); -static void movei_n_rn(void); -static void moveq_n_rn(void); -static void moveta_rn_rn(void); -static void mtoi_rn_rn(void); -static void mult_rn_rn(void); -static void neg_rn(void); -static void nop(void); -static void normi_rn_rn(void); -static void not_rn(void); -static void or_rn_rn(void); -static void pack_rn(void); /* GPU only */ -static void resmac_rn(void); -static void ror_rn_rn(void); -static void rorq_n_rn(void); -static void sat8_rn(void); /* GPU only */ -static void sat16_rn(void); /* GPU only */ -static void sat16s_rn(void); /* DSP only */ -static void sat24_rn(void); /* GPU only */ -static void sat32s_rn(void); /* DSP only */ -static void sh_rn_rn(void); -static void sha_rn_rn(void); -static void sharq_n_rn(void); -static void shlq_n_rn(void); -static void shrq_n_rn(void); -static void store_rn_rn(void); -static void store_rn_r14n(void); -static void store_rn_r15n(void); -static void store_rn_r14rn(void); -static void store_rn_r15rn(void); -static void storeb_rn_rn(void); -static void storew_rn_rn(void); -static void storep_rn_rn(void); /* GPU only */ -static void sub_rn_rn(void); -static void subc_rn_rn(void); -static void subq_n_rn(void); -static void subqmod_n_rn(void); /* DSP only */ -static void subqt_n_rn(void); -static void xor_rn_rn(void); - -static void (*const gpu_op_table[64])(void) = +static void abs_rn(jaguar_state *jaguar, UINT16 op); +static void add_rn_rn(jaguar_state *jaguar, UINT16 op); +static void addc_rn_rn(jaguar_state *jaguar, UINT16 op); +static void addq_n_rn(jaguar_state *jaguar, UINT16 op); +static void addqmod_n_rn(jaguar_state *jaguar, UINT16 op); /* DSP only */ +static void addqt_n_rn(jaguar_state *jaguar, UINT16 op); +static void and_rn_rn(jaguar_state *jaguar, UINT16 op); +static void bclr_n_rn(jaguar_state *jaguar, UINT16 op); +static void bset_n_rn(jaguar_state *jaguar, UINT16 op); +static void btst_n_rn(jaguar_state *jaguar, UINT16 op); +static void cmp_rn_rn(jaguar_state *jaguar, UINT16 op); +static void cmpq_n_rn(jaguar_state *jaguar, UINT16 op); +static void div_rn_rn(jaguar_state *jaguar, UINT16 op); +static void illegal(jaguar_state *jaguar, UINT16 op); +static void imacn_rn_rn(jaguar_state *jaguar, UINT16 op); +static void imult_rn_rn(jaguar_state *jaguar, UINT16 op); +static void imultn_rn_rn(jaguar_state *jaguar, UINT16 op); +static void jr_cc_n(jaguar_state *jaguar, UINT16 op); +static void jump_cc_rn(jaguar_state *jaguar, UINT16 op); +static void load_rn_rn(jaguar_state *jaguar, UINT16 op); +static void load_r14n_rn(jaguar_state *jaguar, UINT16 op); +static void load_r15n_rn(jaguar_state *jaguar, UINT16 op); +static void load_r14rn_rn(jaguar_state *jaguar, UINT16 op); +static void load_r15rn_rn(jaguar_state *jaguar, UINT16 op); +static void loadb_rn_rn(jaguar_state *jaguar, UINT16 op); +static void loadw_rn_rn(jaguar_state *jaguar, UINT16 op); +static void loadp_rn_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void mirror_rn(jaguar_state *jaguar, UINT16 op); /* DSP only */ +static void mmult_rn_rn(jaguar_state *jaguar, UINT16 op); +static void move_rn_rn(jaguar_state *jaguar, UINT16 op); +static void move_pc_rn(jaguar_state *jaguar, UINT16 op); +static void movefa_rn_rn(jaguar_state *jaguar, UINT16 op); +static void movei_n_rn(jaguar_state *jaguar, UINT16 op); +static void moveq_n_rn(jaguar_state *jaguar, UINT16 op); +static void moveta_rn_rn(jaguar_state *jaguar, UINT16 op); +static void mtoi_rn_rn(jaguar_state *jaguar, UINT16 op); +static void mult_rn_rn(jaguar_state *jaguar, UINT16 op); +static void neg_rn(jaguar_state *jaguar, UINT16 op); +static void nop(jaguar_state *jaguar, UINT16 op); +static void normi_rn_rn(jaguar_state *jaguar, UINT16 op); +static void not_rn(jaguar_state *jaguar, UINT16 op); +static void or_rn_rn(jaguar_state *jaguar, UINT16 op); +static void pack_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void resmac_rn(jaguar_state *jaguar, UINT16 op); +static void ror_rn_rn(jaguar_state *jaguar, UINT16 op); +static void rorq_n_rn(jaguar_state *jaguar, UINT16 op); +static void sat8_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void sat16_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void sat16s_rn(jaguar_state *jaguar, UINT16 op); /* DSP only */ +static void sat24_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void sat32s_rn(jaguar_state *jaguar, UINT16 op); /* DSP only */ +static void sh_rn_rn(jaguar_state *jaguar, UINT16 op); +static void sha_rn_rn(jaguar_state *jaguar, UINT16 op); +static void sharq_n_rn(jaguar_state *jaguar, UINT16 op); +static void shlq_n_rn(jaguar_state *jaguar, UINT16 op); +static void shrq_n_rn(jaguar_state *jaguar, UINT16 op); +static void store_rn_rn(jaguar_state *jaguar, UINT16 op); +static void store_rn_r14n(jaguar_state *jaguar, UINT16 op); +static void store_rn_r15n(jaguar_state *jaguar, UINT16 op); +static void store_rn_r14rn(jaguar_state *jaguar, UINT16 op); +static void store_rn_r15rn(jaguar_state *jaguar, UINT16 op); +static void storeb_rn_rn(jaguar_state *jaguar, UINT16 op); +static void storew_rn_rn(jaguar_state *jaguar, UINT16 op); +static void storep_rn_rn(jaguar_state *jaguar, UINT16 op); /* GPU only */ +static void sub_rn_rn(jaguar_state *jaguar, UINT16 op); +static void subc_rn_rn(jaguar_state *jaguar, UINT16 op); +static void subq_n_rn(jaguar_state *jaguar, UINT16 op); +static void subqmod_n_rn(jaguar_state *jaguar, UINT16 op); /* DSP only */ +static void subqt_n_rn(jaguar_state *jaguar, UINT16 op); +static void xor_rn_rn(jaguar_state *jaguar, UINT16 op); + +static void (*const gpu_op_table[64])(jaguar_state *jaguar, UINT16 op) = { /* 00-03 */ add_rn_rn, addc_rn_rn, addq_n_rn, addqt_n_rn, /* 04-07 */ sub_rn_rn, subc_rn_rn, subq_n_rn, subqt_n_rn, @@ -220,7 +212,7 @@ static void (*const gpu_op_table[64])(void) = /* 60-63 */ store_rn_r14rn, store_rn_r15rn, sat24_rn, pack_rn }; -static void (*const dsp_op_table[64])(void) = +static void (*const dsp_op_table[64])(jaguar_state *jaguar, UINT16 op) = { /* 00-03 */ add_rn_rn, addc_rn_rn, addq_n_rn, addqt_n_rn, /* 04-07 */ sub_rn_rn, subc_rn_rn, subq_n_rn, subqt_n_rn, @@ -254,35 +246,35 @@ static void (*const dsp_op_table[64])(void) = INLINE FUNCTIONS ***************************************************************************/ -INLINE void update_register_banks(void) +INLINE void update_register_banks(jaguar_state *jaguar) { UINT32 temp; int i, bank; /* pick the bank */ - bank = jaguar.FLAGS & RPAGEFLAG; - if (jaguar.FLAGS & IFLAG) bank = 0; + bank = jaguar->FLAGS & RPAGEFLAG; + if (jaguar->FLAGS & IFLAG) bank = 0; /* do we need to swap? */ - if ((!bank && jaguar.b0 != jaguar.r) || (bank && jaguar.b1 != jaguar.r)) + if ((bank == 0 && jaguar->b0 != jaguar->r) || (bank != 0 && jaguar->b1 != jaguar->r)) { /* remember the icount of the instruction after we swap */ - bankswitch_icount = jaguar_icount - 1; + jaguar->bankswitch_icount = jaguar->icount - 1; /* exchange the contents */ for (i = 0; i < 32; i++) - temp = jaguar.r[i], jaguar.r[i] = jaguar.a[i], jaguar.a[i] = temp; + temp = jaguar->r[i], jaguar->r[i] = jaguar->a[i], jaguar->a[i] = temp; /* swap the bank pointers */ - if (!bank) + if (bank == 0) { - jaguar.b0 = jaguar.r; - jaguar.b1 = jaguar.a; + jaguar->b0 = jaguar->r; + jaguar->b1 = jaguar->a; } else { - jaguar.b0 = jaguar.a; - jaguar.b1 = jaguar.r; + jaguar->b0 = jaguar->a; + jaguar->b1 = jaguar->r; } } } @@ -293,25 +285,25 @@ INLINE void update_register_banks(void) IRQ HANDLING ***************************************************************************/ -static void check_irqs(void) +static void check_irqs(jaguar_state *jaguar) { int bits, mask, which = 0; /* if the IMASK is set, bail */ - if (jaguar.FLAGS & IFLAG) + if (jaguar->FLAGS & IFLAG) return; /* get the active interrupt bits */ - bits = (jaguar.ctrl[G_CTRL] >> 6) & 0x1f; - bits |= (jaguar.ctrl[G_CTRL] >> 10) & 0x20; + bits = (jaguar->ctrl[G_CTRL] >> 6) & 0x1f; + bits |= (jaguar->ctrl[G_CTRL] >> 10) & 0x20; /* get the interrupt mask */ - mask = (jaguar.FLAGS >> 4) & 0x1f; - mask |= (jaguar.FLAGS >> 11) & 0x20; + mask = (jaguar->FLAGS >> 4) & 0x1f; + mask |= (jaguar->FLAGS >> 11) & 0x20; /* bail if nothing is available */ bits &= mask; - if (!bits) + if (bits == 0) return; /* determine which interrupt */ @@ -323,28 +315,27 @@ static void check_irqs(void) if (bits & 0x20) which = 5; /* set the interrupt flag */ - jaguar.FLAGS |= IFLAG; - update_register_banks(); + jaguar->FLAGS |= IFLAG; + update_register_banks(jaguar); /* push the PC-2 on the stack */ - jaguar.r[31] -= 4; - WRITELONG(jaguar.r[31], jaguar.PC - 2); + jaguar->r[31] -= 4; + WRITELONG(jaguar, jaguar->r[31], jaguar->PC - 2); /* dispatch */ - jaguar.PC = (jaguar.isdsp) ? 0xf1b000 : 0xf03000; - jaguar.PC += which * 0x10; - change_pc(jaguar.PC); + jaguar->PC = (jaguar->isdsp) ? 0xf1b000 : 0xf03000; + jaguar->PC += which * 0x10; } -static void set_irq_line(int irqline, int state) +static void set_irq_line(jaguar_state *jaguar, int irqline, int state) { int mask = (irqline < 5) ? (0x40 << irqline) : 0x10000; - jaguar.ctrl[G_CTRL] &= ~mask; + jaguar->ctrl[G_CTRL] &= ~mask; if (state != CLEAR_LINE) { - jaguar.ctrl[G_CTRL] |= mask; - check_irqs(); + jaguar->ctrl[G_CTRL] |= mask; + check_irqs(jaguar); } } @@ -356,20 +347,11 @@ static void set_irq_line(int irqline, int state) static CPU_GET_CONTEXT( jaguar ) { - /* copy the context */ - if (dst) - *(jaguar_regs *)dst = jaguar; } static CPU_SET_CONTEXT( jaguar ) { - /* copy the context */ - if (src) - jaguar = *(jaguar_regs *)src; - - /* check for IRQs */ - check_irqs(); } @@ -380,118 +362,111 @@ static CPU_SET_CONTEXT( jaguar ) static void init_tables(void) { int i, j; - - /* allocate the mirror table */ - if (!mirror_table) - mirror_table = malloc_or_die(65536 * sizeof(mirror_table[0])); + + /* if we're not the first, skip */ + if (table_refcount++ != 0) + { + assert(mirror_table != NULL); + assert(condition_table != NULL); + return; + } /* fill in the mirror table */ - for (i = 0; i < 65536; i++) - mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) | - ((i >> 11) & 0x0004) | ((i >> 9) & 0x0008) | - ((i >> 7) & 0x0010) | ((i >> 5) & 0x0020) | - ((i >> 3) & 0x0040) | ((i >> 1) & 0x0080) | - ((i << 1) & 0x0100) | ((i << 3) & 0x0200) | - ((i << 5) & 0x0400) | ((i << 7) & 0x0800) | - ((i << 9) & 0x1000) | ((i << 11) & 0x2000) | - ((i << 13) & 0x4000) | ((i << 15) & 0x8000); - - /* allocate the condition table */ - if (!condition_table) - condition_table = malloc_or_die(32 * 8 * sizeof(condition_table[0])); + mirror_table = malloc_or_die(65536 * sizeof(mirror_table[0])); + for (i = 0; i < 65536; i++) + mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) | + ((i >> 11) & 0x0004) | ((i >> 9) & 0x0008) | + ((i >> 7) & 0x0010) | ((i >> 5) & 0x0020) | + ((i >> 3) & 0x0040) | ((i >> 1) & 0x0080) | + ((i << 1) & 0x0100) | ((i << 3) & 0x0200) | + ((i << 5) & 0x0400) | ((i << 7) & 0x0800) | + ((i << 9) & 0x1000) | ((i << 11) & 0x2000) | + ((i << 13) & 0x4000) | ((i << 15) & 0x8000); /* fill in the condition table */ - for (i = 0; i < 8; i++) - for (j = 0; j < 32; j++) - { - int result = 1; - if (j & 1) - if (i & ZFLAG) result = 0; - if (j & 2) - if (!(i & ZFLAG)) result = 0; - if (j & 4) - if (i & (CFLAG << (j >> 4))) result = 0; - if (j & 8) - if (!(i & (CFLAG << (j >> 4)))) result = 0; - condition_table[i * 32 + j] = result; - } + condition_table = malloc_or_die(32 * 8 * sizeof(condition_table[0])); + for (i = 0; i < 8; i++) + for (j = 0; j < 32; j++) + { + int result = 1; + if (j & 1) + if (i & ZFLAG) result = 0; + if (j & 2) + if (!(i & ZFLAG)) result = 0; + if (j & 4) + if (i & (CFLAG << (j >> 4))) result = 0; + if (j & 8) + if (!(i & (CFLAG << (j >> 4)))) result = 0; + condition_table[i * 32 + j] = result; + } } + static STATE_POSTLOAD( jaguar_postload ) { - update_register_banks(); - check_irqs(); + const device_config *device = param; + jaguar_state *jaguar = device->token; + + update_register_banks(jaguar); + check_irqs(jaguar); } -static void jaguar_state_register(const device_config *device, const char *type) -{ - state_save_register_item_array(type, device->tag, 0, jaguar.r); - state_save_register_item_array(type, device->tag, 0, jaguar.a); - state_save_register_item_array(type, device->tag, 0, jaguar.ctrl); - state_save_register_item(type, device->tag, 0, jaguar.ppc); - state_save_register_postload(device->machine, jaguar_postload, NULL); -} -static CPU_INIT( jaguargpu ) +static void init_common(int isdsp, const device_config *device, cpu_irq_callback irqcallback) { - const jaguar_cpu_core *configdata = device->static_config; - - memset(&jaguar, 0, sizeof(jaguar)); + const jaguar_cpu_config *configdata = device->static_config; + jaguar_state *jaguar = device->token; - jaguar_state_register(device, "jaguargpu"); - - jaguar.irq_callback = irqcallback; - jaguar.device = device; - if (configdata) - jaguar.cpu_interrupt = configdata->cpu_int_callback; -} - -static CPU_INIT( jaguardsp ) -{ - const jaguar_cpu_core *configdata = device->static_config; + init_tables(); - memset(&jaguar, 0, sizeof(jaguar)); + jaguar->table = isdsp ? dsp_op_table : gpu_op_table; + jaguar->isdsp = isdsp; - jaguar_state_register(device, "jaguardsp"); + jaguar->irq_callback = irqcallback; + jaguar->device = device; + jaguar->program = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM); + if (configdata != NULL) + jaguar->cpu_interrupt = configdata->cpu_int_callback; - jaguar.irq_callback = irqcallback; - jaguar.device = device; - if (configdata) - jaguar.cpu_interrupt = configdata->cpu_int_callback; + state_save_register_item_array("jaguar", device->tag, 0, jaguar->r); + state_save_register_item_array("jaguar", device->tag, 0, jaguar->a); + state_save_register_item_array("jaguar", device->tag, 0, jaguar->ctrl); + state_save_register_item("jaguar", device->tag, 0, jaguar->ppc); + state_save_register_postload(device->machine, jaguar_postload, (void *)device); } -INLINE CPU_RESET( common ) -{ - init_tables(); - - executing_cpu = -1; - jaguar.b0 = jaguar.r; - jaguar.b1 = jaguar.a; - change_pc(jaguar.PC); +static CPU_INIT( jaguargpu ) +{ + init_common(FALSE, device, irqcallback); } -static CPU_RESET( jaguargpu ) + +static CPU_INIT( jaguardsp ) { - CPU_RESET_CALL(common); - jaguar.table = gpu_op_table; - jaguar.isdsp = 0; + init_common(TRUE, device, irqcallback); } -static CPU_RESET( jaguardsp ) + +static CPU_RESET( jaguar ) { - CPU_RESET_CALL(common); - jaguar.table = dsp_op_table; - jaguar.isdsp = 1; + jaguar_state *jaguar = device->token; + + jaguar->b0 = jaguar->r; + jaguar->b1 = jaguar->a; } + static CPU_EXIT( jaguar ) { - if (mirror_table) + if (--table_refcount != 0) + return; + + if (mirror_table != NULL) free(mirror_table); mirror_table = NULL; - if (condition_table) + if (condition_table != NULL) free(condition_table); condition_table = NULL; } @@ -504,94 +479,84 @@ static CPU_EXIT( jaguar ) static CPU_EXECUTE( jaguargpu ) { + jaguar_state *jaguar = device->token; + /* if we're halted, we shouldn't be here */ - if (!(jaguar.ctrl[G_CTRL] & 1)) + if (!(jaguar->ctrl[G_CTRL] & 1)) { - cpu_set_input_line(device->machine->activecpu, INPUT_LINE_HALT, ASSERT_LINE); + cpu_set_input_line(device, INPUT_LINE_HALT, ASSERT_LINE); return cycles; } - /* count cycles and interrupt cycles */ - bankswitch_icount = -1000; - jaguar_icount = cycles; - jaguar_icount -= jaguar.interrupt_cycles; - jaguar.interrupt_cycles = 0; - change_pc(jaguar.PC); + /* check for IRQs */ + check_irqs(jaguar); - /* remember that we're executing */ - executing_cpu = cpunum_get_active(); + /* count cycles and interrupt cycles */ + jaguar->bankswitch_icount = -1000; + jaguar->icount = cycles; /* core execution loop */ do { + UINT32 op; + /* debugging */ - //if (jaguar.PC < 0xf03000 || jaguar.PC > 0xf04000) { fatalerror("GPU: jaguar.PC = %06X (ppc = %06X)", jaguar.PC, jaguar.ppc); } - jaguar.ppc = jaguar.PC; - debugger_instruction_hook(device->machine, jaguar.PC); + //if (jaguar->PC < 0xf03000 || jaguar->PC > 0xf04000) { fatalerror("GPU: jaguar->PC = %06X (ppc = %06X)", jaguar->PC, jaguar->ppc); } + jaguar->ppc = jaguar->PC; + debugger_instruction_hook(device->machine, jaguar->PC); /* instruction fetch */ - jaguar.op = ROPCODE(jaguar.PC); - jaguar.PC += 2; + op = ROPCODE(jaguar->PC); + jaguar->PC += 2; /* parse the instruction */ - (*gpu_op_table[jaguar.op >> 10])(); - jaguar_icount--; - - } while (jaguar_icount > 0 || jaguar_icount == bankswitch_icount); + (*gpu_op_table[op >> 10])(jaguar, op); + jaguar->icount--; - /* no longer executing */ - executing_cpu = -1; + } while (jaguar->icount > 0 || jaguar->icount == jaguar->bankswitch_icount); - /* adjust cycles for interrupts */ - jaguar_icount -= jaguar.interrupt_cycles; - jaguar.interrupt_cycles = 0; - return cycles - jaguar_icount; + return cycles - jaguar->icount; } static CPU_EXECUTE( jaguardsp ) { + jaguar_state *jaguar = device->token; + /* if we're halted, we shouldn't be here */ - if (!(jaguar.ctrl[G_CTRL] & 1)) + if (!(jaguar->ctrl[G_CTRL] & 1)) { - cpu_set_input_line(Machine->activecpu, INPUT_LINE_HALT, ASSERT_LINE); + cpu_set_input_line(device, INPUT_LINE_HALT, ASSERT_LINE); return cycles; } - /* count cycles and interrupt cycles */ - bankswitch_icount = -1000; - jaguar_icount = cycles; - jaguar_icount -= jaguar.interrupt_cycles; - jaguar.interrupt_cycles = 0; - change_pc(jaguar.PC); + /* check for IRQs */ + check_irqs(jaguar); - /* remember that we're executing */ - executing_cpu = cpunum_get_active(); + /* count cycles and interrupt cycles */ + jaguar->bankswitch_icount = -1000; + jaguar->icount = cycles; /* core execution loop */ do { + UINT32 op; + /* debugging */ - //if (jaguar.PC < 0xf1b000 || jaguar.PC > 0xf1d000) { fatalerror(stderr, "DSP: jaguar.PC = %06X", jaguar.PC); } - jaguar.ppc = jaguar.PC; - debugger_instruction_hook(device->machine, jaguar.PC); + //if (jaguar->PC < 0xf1b000 || jaguar->PC > 0xf1d000) { fatalerror(stderr, "DSP: jaguar->PC = %06X", jaguar->PC); } + jaguar->ppc = jaguar->PC; + debugger_instruction_hook(device->machine, jaguar->PC); /* instruction fetch */ - jaguar.op = ROPCODE(jaguar.PC); - jaguar.PC += 2; + op = ROPCODE(jaguar->PC); + jaguar->PC += 2; /* parse the instruction */ - (*dsp_op_table[jaguar.op >> 10])(); - jaguar_icount--; - - } while (jaguar_icount > 0 || jaguar_icount == bankswitch_icount); + (*dsp_op_table[op >> 10])(jaguar, op); + jaguar->icount--; - /* no longer executing */ - executing_cpu = -1; + } while (jaguar->icount > 0 || jaguar->icount == jaguar->bankswitch_icount); - /* adjust cycles for interrupts */ - jaguar_icount -= jaguar.interrupt_cycles; - jaguar.interrupt_cycles = 0; - return cycles - jaguar_icount; + return cycles - jaguar->icount; } @@ -618,295 +583,295 @@ static CPU_DISASSEMBLE( jaguardsp ) OPCODES ***************************************************************************/ -void abs_rn(void) +void abs_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 res = jaguar.r[dreg]; - CLR_ZNC; + int dreg = op & 31; + UINT32 res = jaguar->r[dreg]; + CLR_ZNC(jaguar); if (res & 0x80000000) { - jaguar.r[dreg] = res = -res; - jaguar.FLAGS |= CFLAG; + jaguar->r[dreg] = res = -res; + jaguar->FLAGS |= CFLAG; } - SET_Z(res); + SET_Z(jaguar, res); } -void add_rn_rn(void) +void add_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 + r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_ADD(r2,r1,res); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_ADD(jaguar, r2, r1, res); } -void addc_rn_rn(void) +void addc_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; - UINT32 res = r2 + r1 + ((jaguar.FLAGS >> 1) & 1); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_ADD(r2,r1,res); + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; + UINT32 res = r2 + r1 + ((jaguar->FLAGS >> 1) & 1); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_ADD(jaguar, r2, r1, res); } -void addq_n_rn(void) +void addq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 + r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_ADD(r2,r1,res); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_ADD(jaguar, r2, r1, res); } -void addqmod_n_rn(void) /* DSP only */ +void addqmod_n_rn(jaguar_state *jaguar, UINT16 op) /* DSP only */ { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 + r1; - res = (res & ~jaguar.ctrl[D_MOD]) | (r2 & ~jaguar.ctrl[D_MOD]); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_ADD(r2,r1,res); + res = (res & ~jaguar->ctrl[D_MOD]) | (r2 & ~jaguar->ctrl[D_MOD]); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_ADD(jaguar, r2, r1, res); } -void addqt_n_rn(void) +void addqt_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 + r1; - jaguar.r[dreg] = res; + jaguar->r[dreg] = res; } -void and_rn_rn(void) +void and_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 & r1; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void bclr_n_rn(void) +void bclr_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = (jaguar.op >> 5) & 31; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = (op >> 5) & 31; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 & ~(1 << r1); - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void bset_n_rn(void) +void bset_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = (jaguar.op >> 5) & 31; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = (op >> 5) & 31; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 | (1 << r1); - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void btst_n_rn(void) +void btst_n_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = (jaguar.op >> 5) & 31; - UINT32 r2 = jaguar.r[jaguar.op & 31]; - CLR_Z; jaguar.FLAGS |= (~r2 >> r1) & 1; + UINT32 r1 = (op >> 5) & 31; + UINT32 r2 = jaguar->r[op & 31]; + CLR_Z(jaguar); jaguar->FLAGS |= (~r2 >> r1) & 1; } -void cmp_rn_rn(void) +void cmp_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[jaguar.op & 31]; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[op & 31]; UINT32 res = r2 - r1; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void cmpq_n_rn(void) +void cmpq_n_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = (INT8)(jaguar.op >> 2) >> 3; - UINT32 r2 = jaguar.r[jaguar.op & 31]; + UINT32 r1 = (INT8)(op >> 2) >> 3; + UINT32 r2 = jaguar->r[op & 31]; UINT32 res = r2 - r1; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void div_rn_rn(void) +void div_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; if (r1) { - if (jaguar.ctrl[D_DIVCTRL] & 1) + if (jaguar->ctrl[D_DIVCTRL] & 1) { - jaguar.r[dreg] = ((UINT64)r2 << 16) / r1; - jaguar.ctrl[D_REMAINDER] = ((UINT64)r2 << 16) % r1; + jaguar->r[dreg] = ((UINT64)r2 << 16) / r1; + jaguar->ctrl[D_REMAINDER] = ((UINT64)r2 << 16) % r1; } else { - jaguar.r[dreg] = r2 / r1; - jaguar.ctrl[D_REMAINDER] = r2 % r1; + jaguar->r[dreg] = r2 / r1; + jaguar->ctrl[D_REMAINDER] = r2 % r1; } } else - jaguar.r[dreg] = 0xffffffff; + jaguar->r[dreg] = 0xffffffff; } -void illegal(void) +void illegal(jaguar_state *jaguar, UINT16 op) { } -void imacn_rn_rn(void) +void imacn_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[jaguar.op & 31]; - jaguar.accum += (INT64)((INT16)r1 * (INT16)r2); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[op & 31]; + jaguar->accum += (INT64)((INT16)r1 * (INT16)r2); logerror("Unexpected IMACN instruction!\n"); } -void imult_rn_rn(void) +void imult_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (INT16)r1 * (INT16)r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void imultn_rn_rn(void) +void imultn_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (INT16)r1 * (INT16)r2; - jaguar.accum = (INT32)res; - CLR_ZN; SET_ZN(res); + jaguar->accum = (INT32)res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); - jaguar.op = ROPCODE(jaguar.PC); - while ((jaguar.op >> 10) == 20) + op = ROPCODE(jaguar->PC); + while ((op >> 10) == 20) { - r1 = jaguar.r[(jaguar.op >> 5) & 31]; - r2 = jaguar.r[jaguar.op & 31]; - jaguar.accum += (INT64)((INT16)r1 * (INT16)r2); - jaguar.PC += 2; - jaguar.op = ROPCODE(jaguar.PC); + r1 = jaguar->r[(op >> 5) & 31]; + r2 = jaguar->r[op & 31]; + jaguar->accum += (INT64)((INT16)r1 * (INT16)r2); + jaguar->PC += 2; + op = ROPCODE(jaguar->PC); } - if ((jaguar.op >> 10) == 19) + if ((op >> 10) == 19) { - jaguar.PC += 2; - jaguar.r[jaguar.op & 31] = (UINT32)jaguar.accum; + jaguar->PC += 2; + jaguar->r[op & 31] = (UINT32)jaguar->accum; } } -void jr_cc_n(void) +void jr_cc_n(jaguar_state *jaguar, UINT16 op) { - if (CONDITION(jaguar.op & 31)) + if (CONDITION(op & 31)) { - INT32 r1 = (INT8)((jaguar.op >> 2) & 0xf8) >> 2; - UINT32 newpc = jaguar.PC + r1; - debugger_instruction_hook(Machine, jaguar.PC); - jaguar.op = ROPCODE(jaguar.PC); - jaguar.PC = newpc; - (*jaguar.table[jaguar.op >> 10])(); - - jaguar_icount -= 3; /* 3 wait states guaranteed */ + INT32 r1 = (INT8)((op >> 2) & 0xf8) >> 2; + UINT32 newpc = jaguar->PC + r1; + debugger_instruction_hook(Machine, jaguar->PC); + op = ROPCODE(jaguar->PC); + jaguar->PC = newpc; + (*jaguar->table[op >> 10])(jaguar, op); + + jaguar->icount -= 3; /* 3 wait states guaranteed */ } } -void jump_cc_rn(void) +void jump_cc_rn(jaguar_state *jaguar, UINT16 op) { - if (CONDITION(jaguar.op & 31)) + if (CONDITION(op & 31)) { - UINT8 reg = (jaguar.op >> 5) & 31; + UINT8 reg = (op >> 5) & 31; /* special kludge for risky code in the cojag DSP interrupt handlers */ - UINT32 newpc = (jaguar_icount == bankswitch_icount) ? jaguar.a[reg] : jaguar.r[reg]; - debugger_instruction_hook(Machine, jaguar.PC); - jaguar.op = ROPCODE(jaguar.PC); - jaguar.PC = newpc; - (*jaguar.table[jaguar.op >> 10])(); + UINT32 newpc = (jaguar->icount == jaguar->bankswitch_icount) ? jaguar->a[reg] : jaguar->r[reg]; + debugger_instruction_hook(Machine, jaguar->PC); + op = ROPCODE(jaguar->PC); + jaguar->PC = newpc; + (*jaguar->table[op >> 10])(jaguar, op); - jaguar_icount -= 3; /* 3 wait states guaranteed */ + jaguar->icount -= 3; /* 3 wait states guaranteed */ } } -void load_rn_rn(void) +void load_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READLONG(r1); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = READLONG(jaguar, r1); } -void load_r14n_rn(void) +void load_r14n_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READLONG(jaguar.r[14] + 4 * r1); + UINT32 r1 = convert_zero[(op >> 5) & 31]; + jaguar->r[op & 31] = READLONG(jaguar, jaguar->r[14] + 4 * r1); } -void load_r15n_rn(void) +void load_r15n_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READLONG(jaguar.r[15] + 4 * r1); + UINT32 r1 = convert_zero[(op >> 5) & 31]; + jaguar->r[op & 31] = READLONG(jaguar, jaguar->r[15] + 4 * r1); } -void load_r14rn_rn(void) +void load_r14rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READLONG(jaguar.r[14] + r1); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = READLONG(jaguar, jaguar->r[14] + r1); } -void load_r15rn_rn(void) +void load_r15rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READLONG(jaguar.r[15] + r1); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = READLONG(jaguar, jaguar->r[15] + r1); } -void loadb_rn_rn(void) +void loadb_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READBYTE(r1); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = READBYTE(jaguar, r1); } -void loadw_rn_rn(void) +void loadw_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = READWORD(r1); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = READWORD(jaguar, r1); } -void loadp_rn_rn(void) /* GPU only */ +void loadp_rn_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.ctrl[G_HIDATA] = READWORD(r1); - jaguar.r[jaguar.op & 31] = READWORD(r1+4); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->ctrl[G_HIDATA] = READWORD(jaguar, r1); + jaguar->r[op & 31] = READWORD(jaguar, r1+4); } -void mirror_rn(void) /* DSP only */ +void mirror_rn(jaguar_state *jaguar, UINT16 op) /* DSP only */ { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[dreg]; UINT32 res = (mirror_table[r1 & 0xffff] << 16) | mirror_table[r1 >> 16]; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void mmult_rn_rn(void) +void mmult_rn_rn(jaguar_state *jaguar, UINT16 op) { - int count = jaguar.ctrl[G_MTXC] & 15, i; - int sreg = (jaguar.op >> 5) & 31; - int dreg = jaguar.op & 31; - UINT32 addr = jaguar.ctrl[G_MTXA]; + int count = jaguar->ctrl[G_MTXC] & 15, i; + int sreg = (op >> 5) & 31; + int dreg = op & 31; + UINT32 addr = jaguar->ctrl[G_MTXA]; INT64 accum = 0; UINT32 res; - if (!(jaguar.ctrl[G_MTXC] & 0x10)) + if (!(jaguar->ctrl[G_MTXC] & 0x10)) { for (i = 0; i < count; i++) { - accum += (INT16)(jaguar.b1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)READWORD(addr); + accum += (INT16)(jaguar->b1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)READWORD(jaguar, addr); addr += 2; } } @@ -914,78 +879,78 @@ void mmult_rn_rn(void) { for (i = 0; i < count; i++) { - accum += (INT16)(jaguar.b1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)READWORD(addr); + accum += (INT16)(jaguar->b1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)READWORD(jaguar, addr); addr += 2 * count; } } - jaguar.r[dreg] = res = (UINT32)accum; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res = (UINT32)accum; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void move_rn_rn(void) +void move_rn_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.r[jaguar.op & 31] = jaguar.r[(jaguar.op >> 5) & 31]; + jaguar->r[op & 31] = jaguar->r[(op >> 5) & 31]; } -void move_pc_rn(void) +void move_pc_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.r[jaguar.op & 31] = jaguar.ppc; + jaguar->r[op & 31] = jaguar->ppc; } -void movefa_rn_rn(void) +void movefa_rn_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.r[jaguar.op & 31] = jaguar.a[(jaguar.op >> 5) & 31]; + jaguar->r[op & 31] = jaguar->a[(op >> 5) & 31]; } -void movei_n_rn(void) +void movei_n_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 res = ROPCODE(jaguar.PC) | (ROPCODE(jaguar.PC + 2) << 16); - jaguar.PC += 4; - jaguar.r[jaguar.op & 31] = res; + UINT32 res = ROPCODE(jaguar->PC) | (ROPCODE(jaguar->PC + 2) << 16); + jaguar->PC += 4; + jaguar->r[op & 31] = res; } -void moveq_n_rn(void) +void moveq_n_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.r[jaguar.op & 31] = (jaguar.op >> 5) & 31; + jaguar->r[op & 31] = (op >> 5) & 31; } -void moveta_rn_rn(void) +void moveta_rn_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.a[jaguar.op & 31] = jaguar.r[(jaguar.op >> 5) & 31]; + jaguar->a[op & 31] = jaguar->r[(op >> 5) & 31]; } -void mtoi_rn_rn(void) +void mtoi_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - jaguar.r[jaguar.op & 31] = (((INT32)r1 >> 8) & 0xff800000) | (r1 & 0x007fffff); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + jaguar->r[op & 31] = (((INT32)r1 >> 8) & 0xff800000) | (r1 & 0x007fffff); } -void mult_rn_rn(void) +void mult_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (UINT16)r1 * (UINT16)r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void neg_rn(void) +void neg_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = -r2; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_SUB(0,r2,res); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, 0, r2, res); } -void nop(void) +void nop(jaguar_state *jaguar, UINT16 op) { } -void normi_rn_rn(void) +void normi_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; UINT32 res = 0; if (r1 != 0) { @@ -1000,294 +965,294 @@ void normi_rn_rn(void) res++; } } - jaguar.r[jaguar.op & 31] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[op & 31] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void not_rn(void) +void not_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 res = ~jaguar.r[dreg]; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + int dreg = op & 31; + UINT32 res = ~jaguar->r[dreg]; + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void or_rn_rn(void) +void or_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r1 | r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void pack_rn(void) /* GPU only */ +void pack_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res; if (r1 == 0) /* PACK */ res = ((r2 >> 10) & 0xf000) | ((r2 >> 5) & 0x0f00) | (r2 & 0xff); else /* UNPACK */ res = ((r2 & 0xf000) << 10) | ((r2 & 0x0f00) << 5) | (r2 & 0xff); - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void resmac_rn(void) +void resmac_rn(jaguar_state *jaguar, UINT16 op) { - jaguar.r[jaguar.op & 31] = (UINT32)jaguar.accum; + jaguar->r[op & 31] = (UINT32)jaguar->accum; } -void ror_rn_rn(void) +void ror_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31] & 31; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31] & 31; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 >> r1) | (r2 << (32 - r1)); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZN(res); jaguar.FLAGS |= (r2 >> 30) & 2; + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZN(jaguar, res); jaguar->FLAGS |= (r2 >> 30) & 2; } -void rorq_n_rn(void) +void rorq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 >> r1) | (r2 << (32 - r1)); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZN(res); jaguar.FLAGS |= (r2 >> 30) & 2; + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZN(jaguar, res); jaguar->FLAGS |= (r2 >> 30) & 2; } -void sat8_rn(void) /* GPU only */ +void sat8_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - int dreg = jaguar.op & 31; - INT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 < 0) ? 0 : (r2 > 255) ? 255 : r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void sat16_rn(void) /* GPU only */ +void sat16_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - int dreg = jaguar.op & 31; - INT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 < 0) ? 0 : (r2 > 65535) ? 65535 : r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void sat16s_rn(void) /* DSP only */ +void sat16s_rn(jaguar_state *jaguar, UINT16 op) /* DSP only */ { - int dreg = jaguar.op & 31; - INT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 < -32768) ? -32768 : (r2 > 32767) ? 32767 : r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void sat24_rn(void) /* GPU only */ +void sat24_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - int dreg = jaguar.op & 31; - INT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r2 = jaguar->r[dreg]; UINT32 res = (r2 < 0) ? 0 : (r2 > 16777215) ? 16777215 : r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void sat32s_rn(void) /* DSP only */ +void sat32s_rn(jaguar_state *jaguar, UINT16 op) /* DSP only */ { - int dreg = jaguar.op & 31; - INT32 r2 = (UINT32)jaguar.r[dreg]; - INT32 temp = jaguar.accum >> 32; + int dreg = op & 31; + INT32 r2 = (UINT32)jaguar->r[dreg]; + INT32 temp = jaguar->accum >> 32; UINT32 res = (temp < -1) ? (INT32)0x80000000 : (temp > 0) ? (INT32)0x7fffffff : r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } -void sh_rn_rn(void) +void sh_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - INT32 r1 = (INT32)jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r1 = (INT32)jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res; - CLR_ZNC; + CLR_ZNC(jaguar); if (r1 < 0) { res = (r1 <= -32) ? 0 : (r2 << -r1); - jaguar.FLAGS |= (r2 >> 30) & 2; + jaguar->FLAGS |= (r2 >> 30) & 2; } else { res = (r1 >= 32) ? 0 : (r2 >> r1); - jaguar.FLAGS |= (r2 << 1) & 2; + jaguar->FLAGS |= (r2 << 1) & 2; } - jaguar.r[dreg] = res; - SET_ZN(res); + jaguar->r[dreg] = res; + SET_ZN(jaguar, res); } -void sha_rn_rn(void) +void sha_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - INT32 r1 = (INT32)jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r1 = (INT32)jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res; - CLR_ZNC; + CLR_ZNC(jaguar); if (r1 < 0) { res = (r1 <= -32) ? 0 : (r2 << -r1); - jaguar.FLAGS |= (r2 >> 30) & 2; + jaguar->FLAGS |= (r2 >> 30) & 2; } else { res = (r1 >= 32) ? ((INT32)r2 >> 31) : ((INT32)r2 >> r1); - jaguar.FLAGS |= (r2 << 1) & 2; + jaguar->FLAGS |= (r2 << 1) & 2; } - jaguar.r[dreg] = res; - SET_ZN(res); + jaguar->r[dreg] = res; + SET_ZN(jaguar, res); } -void sharq_n_rn(void) +void sharq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - INT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = (INT32)r2 >> r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZN(res); jaguar.FLAGS |= (r2 << 1) & 2; + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZN(jaguar, res); jaguar->FLAGS |= (r2 << 1) & 2; } -void shlq_n_rn(void) +void shlq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - INT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 << (32 - r1); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZN(res); jaguar.FLAGS |= (r2 >> 30) & 2; + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZN(jaguar, res); jaguar->FLAGS |= (r2 >> 30) & 2; } -void shrq_n_rn(void) +void shrq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - INT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + INT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 >> r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZN(res); jaguar.FLAGS |= (r2 << 1) & 2; + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZN(jaguar, res); jaguar->FLAGS |= (r2 << 1) & 2; } -void store_rn_rn(void) +void store_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITELONG(r1, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITELONG(jaguar, r1, jaguar->r[op & 31]); } -void store_rn_r14n(void) +void store_rn_r14n(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - WRITELONG(jaguar.r[14] + r1 * 4, jaguar.r[jaguar.op & 31]); + UINT32 r1 = convert_zero[(op >> 5) & 31]; + WRITELONG(jaguar, jaguar->r[14] + r1 * 4, jaguar->r[op & 31]); } -void store_rn_r15n(void) +void store_rn_r15n(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - WRITELONG(jaguar.r[15] + r1 * 4, jaguar.r[jaguar.op & 31]); + UINT32 r1 = convert_zero[(op >> 5) & 31]; + WRITELONG(jaguar, jaguar->r[15] + r1 * 4, jaguar->r[op & 31]); } -void store_rn_r14rn(void) +void store_rn_r14rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITELONG(jaguar.r[14] + r1, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITELONG(jaguar, jaguar->r[14] + r1, jaguar->r[op & 31]); } -void store_rn_r15rn(void) +void store_rn_r15rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITELONG(jaguar.r[15] + r1, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITELONG(jaguar, jaguar->r[15] + r1, jaguar->r[op & 31]); } -void storeb_rn_rn(void) +void storeb_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITEBYTE(r1, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITEBYTE(jaguar, r1, jaguar->r[op & 31]); } -void storew_rn_rn(void) +void storew_rn_rn(jaguar_state *jaguar, UINT16 op) { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITEWORD(r1, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITEWORD(jaguar, r1, jaguar->r[op & 31]); } -void storep_rn_rn(void) /* GPU only */ +void storep_rn_rn(jaguar_state *jaguar, UINT16 op) /* GPU only */ { - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - WRITELONG(r1, jaguar.ctrl[G_HIDATA]); - WRITELONG(r1+4, jaguar.r[jaguar.op & 31]); + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + WRITELONG(jaguar, r1, jaguar->ctrl[G_HIDATA]); + WRITELONG(jaguar, r1+4, jaguar->r[op & 31]); } -void sub_rn_rn(void) +void sub_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 - r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void subc_rn_rn(void) +void subc_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; - UINT32 res = r2 - r1 - ((jaguar.FLAGS >> 1) & 1); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; + UINT32 res = r2 - r1 - ((jaguar->FLAGS >> 1) & 1); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void subq_n_rn(void) +void subq_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 - r1; - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void subqmod_n_rn(void) /* DSP only */ +void subqmod_n_rn(jaguar_state *jaguar, UINT16 op) /* DSP only */ { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 - r1; - res = (res & ~jaguar.ctrl[D_MOD]) | (r2 & ~jaguar.ctrl[D_MOD]); - jaguar.r[dreg] = res; - CLR_ZNC; SET_ZNC_SUB(r2,r1,res); + res = (res & ~jaguar->ctrl[D_MOD]) | (r2 & ~jaguar->ctrl[D_MOD]); + jaguar->r[dreg] = res; + CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res); } -void subqt_n_rn(void) +void subqt_n_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = convert_zero[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = convert_zero[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r2 - r1; - jaguar.r[dreg] = res; + jaguar->r[dreg] = res; } -void xor_rn_rn(void) +void xor_rn_rn(jaguar_state *jaguar, UINT16 op) { - int dreg = jaguar.op & 31; - UINT32 r1 = jaguar.r[(jaguar.op >> 5) & 31]; - UINT32 r2 = jaguar.r[dreg]; + int dreg = op & 31; + UINT32 r1 = jaguar->r[(op >> 5) & 31]; + UINT32 r2 = jaguar->r[dreg]; UINT32 res = r1 ^ r2; - jaguar.r[dreg] = res; - CLR_ZN; SET_ZN(res); + jaguar->r[dreg] = res; + CLR_ZN(jaguar); SET_ZN(jaguar, res); } @@ -1296,33 +1261,26 @@ void xor_rn_rn(void) I/O HANDLING ***************************************************************************/ -UINT32 jaguargpu_ctrl_r(int cpunum, offs_t offset) +UINT32 jaguargpu_ctrl_r(const device_config *device, offs_t offset) { - UINT32 result; + jaguar_state *jaguar = device->token; - if (LOG_GPU_IO) logerror("%08X/%d:GPU read register @ F021%02X\n", cpu_get_previouspc(Machine->activecpu), cpunum_get_active(), offset * 4); + if (LOG_GPU_IO) logerror("GPU read register @ F021%02X\n", offset * 4); - /* switch to the target context */ - cpu_push_context(Machine->cpu[cpunum]); - result = jaguar.ctrl[offset]; - cpu_pop_context(); - - return result; + return jaguar->ctrl[offset]; } -void jaguargpu_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) +void jaguargpu_ctrl_w(const device_config *device, offs_t offset, UINT32 data, UINT32 mem_mask) { - UINT32 oldval, newval; + jaguar_state *jaguar = device->token; + UINT32 oldval, newval; if (LOG_GPU_IO && offset != G_HIDATA) - logerror("%08X/%d:GPU write register @ F021%02X = %08X\n", cpu_get_previouspc(Machine->activecpu), cpunum_get_active(), offset * 4, data); - - /* switch to the target context */ - cpu_push_context(Machine->cpu[cpunum]); + logerror("GPU write register @ F021%02X = %08X\n", offset * 4, data); /* remember the old and set the new */ - oldval = jaguar.ctrl[offset]; + oldval = jaguar->ctrl[offset]; newval = oldval; COMBINE_DATA(&newval); @@ -1332,56 +1290,53 @@ void jaguargpu_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) case G_FLAGS: /* combine the data properly */ - jaguar.ctrl[offset] = newval & (ZFLAG | CFLAG | NFLAG | EINT04FLAGS | RPAGEFLAG); + jaguar->ctrl[offset] = newval & (ZFLAG | CFLAG | NFLAG | EINT04FLAGS | RPAGEFLAG); if (newval & IFLAG) - jaguar.ctrl[offset] |= oldval & IFLAG; + jaguar->ctrl[offset] |= oldval & IFLAG; /* clear interrupts */ - jaguar.ctrl[G_CTRL] &= ~((newval & CINT04FLAGS) >> 3); + jaguar->ctrl[G_CTRL] &= ~((newval & CINT04FLAGS) >> 3); /* determine which register bank should be active */ - update_register_banks(); + update_register_banks(jaguar); /* update IRQs */ - check_irqs(); + check_irqs(jaguar); break; case G_MTXC: case G_MTXA: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; break; case G_END: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; if ((newval & 7) != 7) logerror("GPU to set to little-endian!\n"); break; case G_PC: - jaguar.PC = newval & 0xffffff; - if (executing_cpu == cpunum) - change_pc(jaguar.PC); + jaguar->PC = newval & 0xffffff; break; case G_CTRL: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; if ((oldval ^ newval) & 0x01) { - cpu_set_input_line(Machine->cpu[cpunum], INPUT_LINE_HALT, (newval & 1) ? CLEAR_LINE : ASSERT_LINE); - if (cpunum_get_active() >= 0) - cpu_yield(Machine->activecpu); + cpu_set_input_line(device, INPUT_LINE_HALT, (newval & 1) ? CLEAR_LINE : ASSERT_LINE); + cpu_yield(device); } if (newval & 0x02) { - if (jaguar.cpu_interrupt) - (*jaguar.cpu_interrupt)(); - jaguar.ctrl[offset] &= ~0x02; + if (jaguar->cpu_interrupt != NULL) + (*jaguar->cpu_interrupt)(device); + jaguar->ctrl[offset] &= ~0x02; } if (newval & 0x04) { - jaguar.ctrl[G_CTRL] |= 1 << 6; - jaguar.ctrl[offset] &= ~0x04; - check_irqs(); + jaguar->ctrl[G_CTRL] |= 1 << 6; + jaguar->ctrl[offset] &= ~0x04; + check_irqs(jaguar); } if (newval & 0x18) { @@ -1391,12 +1346,9 @@ void jaguargpu_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) case G_HIDATA: case G_DIVCTRL: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; break; } - - /* restore old context */ - cpu_pop_context(); } @@ -1405,34 +1357,28 @@ void jaguargpu_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) I/O HANDLING ***************************************************************************/ -UINT32 jaguardsp_ctrl_r(int cpunum, offs_t offset) +UINT32 jaguardsp_ctrl_r(const device_config *device, offs_t offset) { - UINT32 result; + jaguar_state *jaguar = device->token; if (LOG_DSP_IO && offset != D_FLAGS) - logerror("%08X/%d:DSP read register @ F1A1%02X\n", cpu_get_previouspc(Machine->activecpu), cpunum_get_active(), offset * 4); + logerror("DSP read register @ F1A1%02X\n", offset * 4); /* switch to the target context */ - cpu_push_context(Machine->cpu[cpunum]); - result = jaguar.ctrl[offset]; - cpu_pop_context(); - - return result; + return jaguar->ctrl[offset]; } -void jaguardsp_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) +void jaguardsp_ctrl_w(const device_config *device, offs_t offset, UINT32 data, UINT32 mem_mask) { - UINT32 oldval, newval; + jaguar_state *jaguar = device->token; + UINT32 oldval, newval; if (LOG_DSP_IO && offset != D_FLAGS) - logerror("%08X/%d:DSP write register @ F1A1%02X = %08X\n", cpu_get_previouspc(Machine->activecpu), cpunum_get_active(), offset * 4, data); - - /* switch to the target context */ - cpu_push_context(Machine->cpu[cpunum]); + logerror("DSP write register @ F1A1%02X = %08X\n", offset * 4, data); /* remember the old and set the new */ - oldval = jaguar.ctrl[offset]; + oldval = jaguar->ctrl[offset]; newval = oldval; COMBINE_DATA(&newval); @@ -1442,57 +1388,54 @@ void jaguardsp_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) case D_FLAGS: /* combine the data properly */ - jaguar.ctrl[offset] = newval & (ZFLAG | CFLAG | NFLAG | EINT04FLAGS | EINT5FLAG | RPAGEFLAG); + jaguar->ctrl[offset] = newval & (ZFLAG | CFLAG | NFLAG | EINT04FLAGS | EINT5FLAG | RPAGEFLAG); if (newval & IFLAG) - jaguar.ctrl[offset] |= oldval & IFLAG; + jaguar->ctrl[offset] |= oldval & IFLAG; /* clear interrupts */ - jaguar.ctrl[D_CTRL] &= ~((newval & CINT04FLAGS) >> 3); - jaguar.ctrl[D_CTRL] &= ~((newval & CINT5FLAG) >> 1); + jaguar->ctrl[D_CTRL] &= ~((newval & CINT04FLAGS) >> 3); + jaguar->ctrl[D_CTRL] &= ~((newval & CINT5FLAG) >> 1); /* determine which register bank should be active */ - update_register_banks(); + update_register_banks(jaguar); /* update IRQs */ - check_irqs(); + check_irqs(jaguar); break; case D_MTXC: case D_MTXA: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; break; case D_END: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; if ((newval & 7) != 7) logerror("DSP to set to little-endian!\n"); break; case D_PC: - jaguar.PC = newval & 0xffffff; - if (executing_cpu == cpunum) - change_pc(jaguar.PC); + jaguar->PC = newval & 0xffffff; break; case D_CTRL: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; if ((oldval ^ newval) & 0x01) { - cpu_set_input_line(Machine->cpu[cpunum], INPUT_LINE_HALT, (newval & 1) ? CLEAR_LINE : ASSERT_LINE); - if (cpunum_get_active() >= 0) - cpu_yield(Machine->activecpu); + cpu_set_input_line(device, INPUT_LINE_HALT, (newval & 1) ? CLEAR_LINE : ASSERT_LINE); + cpu_yield(device); } if (newval & 0x02) { - if (jaguar.cpu_interrupt) - (*jaguar.cpu_interrupt)(); - jaguar.ctrl[offset] &= ~0x02; + if (jaguar->cpu_interrupt != NULL) + (*jaguar->cpu_interrupt)(device); + jaguar->ctrl[offset] &= ~0x02; } if (newval & 0x04) { - jaguar.ctrl[D_CTRL] |= 1 << 6; - jaguar.ctrl[offset] &= ~0x04; - check_irqs(); + jaguar->ctrl[D_CTRL] |= 1 << 6; + jaguar->ctrl[offset] &= ~0x04; + check_irqs(jaguar); } if (newval & 0x18) { @@ -1502,12 +1445,9 @@ void jaguardsp_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) case D_MOD: case D_DIVCTRL: - jaguar.ctrl[offset] = newval; + jaguar->ctrl[offset] = newval; break; } - - /* restore old context */ - cpu_pop_context(); } @@ -1518,52 +1458,53 @@ void jaguardsp_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask) static CPU_SET_INFO( jaguargpu ) { + jaguar_state *jaguar = device->token; switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ0: set_irq_line(JAGUAR_IRQ0, info->i); break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ1: set_irq_line(JAGUAR_IRQ1, info->i); break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ2: set_irq_line(JAGUAR_IRQ2, info->i); break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ3: set_irq_line(JAGUAR_IRQ3, info->i); break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ4: set_irq_line(JAGUAR_IRQ4, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ0: set_irq_line(jaguar, JAGUAR_IRQ0, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ1: set_irq_line(jaguar, JAGUAR_IRQ1, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ2: set_irq_line(jaguar, JAGUAR_IRQ2, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ3: set_irq_line(jaguar, JAGUAR_IRQ3, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ4: set_irq_line(jaguar, JAGUAR_IRQ4, info->i); break; case CPUINFO_INT_PC: - case CPUINFO_INT_REGISTER + JAGUAR_PC: jaguar.PC = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_FLAGS: jaguar.FLAGS = info->i; break; - - case CPUINFO_INT_REGISTER + JAGUAR_R0: jaguar.r[0] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R1: jaguar.r[1] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R2: jaguar.r[2] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R3: jaguar.r[3] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R4: jaguar.r[4] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R5: jaguar.r[5] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R6: jaguar.r[6] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R7: jaguar.r[7] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R8: jaguar.r[8] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R9: jaguar.r[9] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R10: jaguar.r[10] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R11: jaguar.r[11] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R12: jaguar.r[12] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R13: jaguar.r[13] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R14: jaguar.r[14] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R15: jaguar.r[15] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R16: jaguar.r[16] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R17: jaguar.r[17] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R18: jaguar.r[18] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R19: jaguar.r[19] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R20: jaguar.r[20] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R21: jaguar.r[21] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R22: jaguar.r[22] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R23: jaguar.r[23] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R24: jaguar.r[24] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R25: jaguar.r[25] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R26: jaguar.r[26] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R27: jaguar.r[27] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R28: jaguar.r[28] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R29: jaguar.r[29] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R30: jaguar.r[30] = info->i; break; - case CPUINFO_INT_REGISTER + JAGUAR_R31: jaguar.r[31] = info->i; break; - case CPUINFO_INT_SP: jaguar.b0[31] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_PC: jaguar->PC = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_FLAGS: jaguar->FLAGS = info->i; break; + + case CPUINFO_INT_REGISTER + JAGUAR_R0: jaguar->r[0] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R1: jaguar->r[1] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R2: jaguar->r[2] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R3: jaguar->r[3] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R4: jaguar->r[4] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R5: jaguar->r[5] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R6: jaguar->r[6] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R7: jaguar->r[7] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R8: jaguar->r[8] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R9: jaguar->r[9] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R10: jaguar->r[10] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R11: jaguar->r[11] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R12: jaguar->r[12] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R13: jaguar->r[13] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R14: jaguar->r[14] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R15: jaguar->r[15] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R16: jaguar->r[16] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R17: jaguar->r[17] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R18: jaguar->r[18] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R19: jaguar->r[19] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R20: jaguar->r[20] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R21: jaguar->r[21] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R22: jaguar->r[22] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R23: jaguar->r[23] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R24: jaguar->r[24] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R25: jaguar->r[25] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R26: jaguar->r[26] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R27: jaguar->r[27] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R28: jaguar->r[28] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R29: jaguar->r[29] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R30: jaguar->r[30] = info->i; break; + case CPUINFO_INT_REGISTER + JAGUAR_R31: jaguar->r[31] = info->i; break; + case CPUINFO_INT_SP: jaguar->b0[31] = info->i; break; } } @@ -1575,142 +1516,137 @@ static CPU_SET_INFO( jaguargpu ) CPU_GET_INFO( jaguargpu ) { + jaguar_state *jaguar = (device != NULL) ? device->token : NULL; switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ - case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(jaguar); break; - case CPUINFO_INT_INPUT_LINES: info->i = 5; break; - case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; - case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break; - case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; - case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; - case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break; - case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 6; break; - case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; - case CPUINFO_INT_MAX_CYCLES: info->i = 1; break; - - case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break; - case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 24; break; - case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break; - case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break; - case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break; - - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ0: info->i = (jaguar.ctrl[G_CTRL] & 0x40) ? ASSERT_LINE : CLEAR_LINE; break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ1: info->i = (jaguar.ctrl[G_CTRL] & 0x80) ? ASSERT_LINE : CLEAR_LINE; break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ2: info->i = (jaguar.ctrl[G_CTRL] & 0x100) ? ASSERT_LINE : CLEAR_LINE; break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ3: info->i = (jaguar.ctrl[G_CTRL] & 0x200) ? ASSERT_LINE : CLEAR_LINE; break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ4: info->i = (jaguar.ctrl[G_CTRL] & 0x400) ? ASSERT_LINE : CLEAR_LINE; break; - - case CPUINFO_INT_PREVIOUSPC: info->i = jaguar.ppc; break; + case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(jaguar_state); break; + case CPUINFO_INT_INPUT_LINES: info->i = 5; break; + case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; + case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break; + case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; + case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; + case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break; + case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 6; break; + case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; + case CPUINFO_INT_MAX_CYCLES: info->i = 1; break; + + case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break; + case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 24; break; + case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break; + + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ0: info->i = (jaguar->ctrl[G_CTRL] & 0x40) ? ASSERT_LINE : CLEAR_LINE; break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ1: info->i = (jaguar->ctrl[G_CTRL] & 0x80) ? ASSERT_LINE : CLEAR_LINE; break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ2: info->i = (jaguar->ctrl[G_CTRL] & 0x100) ? ASSERT_LINE : CLEAR_LINE; break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ3: info->i = (jaguar->ctrl[G_CTRL] & 0x200) ? ASSERT_LINE : CLEAR_LINE; break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ4: info->i = (jaguar->ctrl[G_CTRL] & 0x400) ? ASSERT_LINE : CLEAR_LINE; break; + + case CPUINFO_INT_PREVIOUSPC: info->i = jaguar->ppc; break; case CPUINFO_INT_PC: - case CPUINFO_INT_REGISTER + JAGUAR_PC: info->i = jaguar.PC; break; - case CPUINFO_INT_REGISTER + JAGUAR_FLAGS: info->i = jaguar.FLAGS; break; - - case CPUINFO_INT_REGISTER + JAGUAR_R0: info->i = jaguar.r[0]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R1: info->i = jaguar.r[1]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R2: info->i = jaguar.r[2]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R3: info->i = jaguar.r[3]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R4: info->i = jaguar.r[4]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R5: info->i = jaguar.r[5]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R6: info->i = jaguar.r[6]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R7: info->i = jaguar.r[7]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R8: info->i = jaguar.r[8]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R9: info->i = jaguar.r[9]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R10: info->i = jaguar.r[10]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R11: info->i = jaguar.r[11]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R12: info->i = jaguar.r[12]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R13: info->i = jaguar.r[13]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R14: info->i = jaguar.r[14]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R15: info->i = jaguar.r[15]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R16: info->i = jaguar.r[16]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R17: info->i = jaguar.r[17]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R18: info->i = jaguar.r[18]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R19: info->i = jaguar.r[19]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R20: info->i = jaguar.r[20]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R21: info->i = jaguar.r[21]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R22: info->i = jaguar.r[22]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R23: info->i = jaguar.r[23]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R24: info->i = jaguar.r[24]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R25: info->i = jaguar.r[25]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R26: info->i = jaguar.r[26]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R27: info->i = jaguar.r[27]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R28: info->i = jaguar.r[28]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R29: info->i = jaguar.r[29]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R30: info->i = jaguar.r[30]; break; - case CPUINFO_INT_REGISTER + JAGUAR_R31: info->i = jaguar.r[31]; break; - case CPUINFO_INT_SP: info->i = jaguar.b0[31]; break; + case CPUINFO_INT_REGISTER + JAGUAR_PC: info->i = jaguar->PC; break; + case CPUINFO_INT_REGISTER + JAGUAR_FLAGS: info->i = jaguar->FLAGS; break; + + case CPUINFO_INT_REGISTER + JAGUAR_R0: info->i = jaguar->r[0]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R1: info->i = jaguar->r[1]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R2: info->i = jaguar->r[2]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R3: info->i = jaguar->r[3]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R4: info->i = jaguar->r[4]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R5: info->i = jaguar->r[5]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R6: info->i = jaguar->r[6]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R7: info->i = jaguar->r[7]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R8: info->i = jaguar->r[8]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R9: info->i = jaguar->r[9]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R10: info->i = jaguar->r[10]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R11: info->i = jaguar->r[11]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R12: info->i = jaguar->r[12]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R13: info->i = jaguar->r[13]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R14: info->i = jaguar->r[14]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R15: info->i = jaguar->r[15]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R16: info->i = jaguar->r[16]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R17: info->i = jaguar->r[17]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R18: info->i = jaguar->r[18]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R19: info->i = jaguar->r[19]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R20: info->i = jaguar->r[20]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R21: info->i = jaguar->r[21]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R22: info->i = jaguar->r[22]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R23: info->i = jaguar->r[23]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R24: info->i = jaguar->r[24]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R25: info->i = jaguar->r[25]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R26: info->i = jaguar->r[26]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R27: info->i = jaguar->r[27]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R28: info->i = jaguar->r[28]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R29: info->i = jaguar->r[29]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R30: info->i = jaguar->r[30]; break; + case CPUINFO_INT_REGISTER + JAGUAR_R31: info->i = jaguar->r[31]; break; + case CPUINFO_INT_SP: info->i = jaguar->b0[31]; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(jaguargpu); break; case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(jaguar); break; case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(jaguar); break; - case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(jaguargpu); break; - case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(jaguargpu); break; - case CPUINFO_PTR_EXIT: info->exit = CPU_EXIT_NAME(jaguar); break; + case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(jaguargpu); break; + case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(jaguar); break; + case CPUINFO_PTR_EXIT: info->exit = CPU_EXIT_NAME(jaguar); break; case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(jaguargpu); break; - case CPUINFO_PTR_BURN: info->burn = NULL; break; - case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(jaguargpu); break; - case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &jaguar_icount; break; + case CPUINFO_PTR_BURN: info->burn = NULL; break; + case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(jaguargpu);break; + case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &jaguar->icount; break; /* --- the following bits of info are returned as NULL-terminated strings --- */ - case CPUINFO_STR_NAME: strcpy(info->s, "Jaguar GPU"); break; - case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Atari Jaguar"); break; - case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break; - case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; - case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Aaron Giles"); break; + case CPUINFO_STR_NAME: strcpy(info->s, "Jaguar GPU"); break; + case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Atari Jaguar"); break; + case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break; + case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; + case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Aaron Giles"); break; case CPUINFO_STR_FLAGS: sprintf(info->s, "%c%c%c%c%c%c%c%c%c%c%c", - jaguar.FLAGS & 0x8000 ? 'D':'.', - jaguar.FLAGS & 0x4000 ? 'A':'.', - jaguar.FLAGS & 0x0100 ? '4':'.', - jaguar.FLAGS & 0x0080 ? '3':'.', - jaguar.FLAGS & 0x0040 ? '2':'.', - jaguar.FLAGS & 0x0020 ? '1':'.', - jaguar.FLAGS & 0x0010 ? '0':'.', - jaguar.FLAGS & 0x0008 ? 'I':'.', - jaguar.FLAGS & 0x0004 ? 'N':'.', - jaguar.FLAGS & 0x0002 ? 'C':'.', - jaguar.FLAGS & 0x0001 ? 'Z':'.'); break; - - case CPUINFO_STR_REGISTER + JAGUAR_PC: sprintf(info->s, "PC: %08X", jaguar.PC); break; - case CPUINFO_STR_REGISTER + JAGUAR_FLAGS: sprintf(info->s, "FLAGS: %08X", jaguar.FLAGS); break; - case CPUINFO_STR_REGISTER + JAGUAR_R0: sprintf(info->s, "R0: %08X", jaguar.r[0]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R1: sprintf(info->s, "R1: %08X", jaguar.r[1]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R2: sprintf(info->s, "R2: %08X", jaguar.r[2]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R3: sprintf(info->s, "R3: %08X", jaguar.r[3]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R4: sprintf(info->s, "R4: %08X", jaguar.r[4]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R5: sprintf(info->s, "R5: %08X", jaguar.r[5]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R6: sprintf(info->s, "R6: %08X", jaguar.r[6]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R7: sprintf(info->s, "R7: %08X", jaguar.r[7]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R8: sprintf(info->s, "R8: %08X", jaguar.r[8]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R9: sprintf(info->s, "R9: %08X", jaguar.r[9]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R10: sprintf(info->s, "R10:%08X", jaguar.r[10]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R11: sprintf(info->s, "R11:%08X", jaguar.r[11]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R12: sprintf(info->s, "R12:%08X", jaguar.r[12]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R13: sprintf(info->s, "R13:%08X", jaguar.r[13]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R14: sprintf(info->s, "R14:%08X", jaguar.r[14]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R15: sprintf(info->s, "R15:%08X", jaguar.r[15]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R16: sprintf(info->s, "R16:%08X", jaguar.r[16]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R17: sprintf(info->s, "R17:%08X", jaguar.r[17]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R18: sprintf(info->s, "R18:%08X", jaguar.r[18]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R19: sprintf(info->s, "R19:%08X", jaguar.r[19]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R20: sprintf(info->s, "R20:%08X", jaguar.r[20]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R21: sprintf(info->s, "R21:%08X", jaguar.r[21]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R22: sprintf(info->s, "R22:%08X", jaguar.r[22]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R23: sprintf(info->s, "R23:%08X", jaguar.r[23]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R24: sprintf(info->s, "R24:%08X", jaguar.r[24]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R25: sprintf(info->s, "R25:%08X", jaguar.r[25]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R26: sprintf(info->s, "R26:%08X", jaguar.r[26]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R27: sprintf(info->s, "R27:%08X", jaguar.r[27]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R28: sprintf(info->s, "R28:%08X", jaguar.r[28]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R29: sprintf(info->s, "R29:%08X", jaguar.r[29]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R30: sprintf(info->s, "R30:%08X", jaguar.r[30]); break; - case CPUINFO_STR_REGISTER + JAGUAR_R31: sprintf(info->s, "R31:%08X", jaguar.r[31]); break; + jaguar->FLAGS & 0x8000 ? 'D':'.', + jaguar->FLAGS & 0x4000 ? 'A':'.', + jaguar->FLAGS & 0x0100 ? '4':'.', + jaguar->FLAGS & 0x0080 ? '3':'.', + jaguar->FLAGS & 0x0040 ? '2':'.', + jaguar->FLAGS & 0x0020 ? '1':'.', + jaguar->FLAGS & 0x0010 ? '0':'.', + jaguar->FLAGS & 0x0008 ? 'I':'.', + jaguar->FLAGS & 0x0004 ? 'N':'.', + jaguar->FLAGS & 0x0002 ? 'C':'.', + jaguar->FLAGS & 0x0001 ? 'Z':'.'); break; + + case CPUINFO_STR_REGISTER + JAGUAR_PC: sprintf(info->s, "PC: %08X", jaguar->PC); break; + case CPUINFO_STR_REGISTER + JAGUAR_FLAGS: sprintf(info->s, "FLAGS: %08X", jaguar->FLAGS); break; + case CPUINFO_STR_REGISTER + JAGUAR_R0: sprintf(info->s, "R0: %08X", jaguar->r[0]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R1: sprintf(info->s, "R1: %08X", jaguar->r[1]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R2: sprintf(info->s, "R2: %08X", jaguar->r[2]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R3: sprintf(info->s, "R3: %08X", jaguar->r[3]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R4: sprintf(info->s, "R4: %08X", jaguar->r[4]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R5: sprintf(info->s, "R5: %08X", jaguar->r[5]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R6: sprintf(info->s, "R6: %08X", jaguar->r[6]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R7: sprintf(info->s, "R7: %08X", jaguar->r[7]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R8: sprintf(info->s, "R8: %08X", jaguar->r[8]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R9: sprintf(info->s, "R9: %08X", jaguar->r[9]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R10: sprintf(info->s, "R10:%08X", jaguar->r[10]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R11: sprintf(info->s, "R11:%08X", jaguar->r[11]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R12: sprintf(info->s, "R12:%08X", jaguar->r[12]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R13: sprintf(info->s, "R13:%08X", jaguar->r[13]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R14: sprintf(info->s, "R14:%08X", jaguar->r[14]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R15: sprintf(info->s, "R15:%08X", jaguar->r[15]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R16: sprintf(info->s, "R16:%08X", jaguar->r[16]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R17: sprintf(info->s, "R17:%08X", jaguar->r[17]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R18: sprintf(info->s, "R18:%08X", jaguar->r[18]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R19: sprintf(info->s, "R19:%08X", jaguar->r[19]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R20: sprintf(info->s, "R20:%08X", jaguar->r[20]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R21: sprintf(info->s, "R21:%08X", jaguar->r[21]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R22: sprintf(info->s, "R22:%08X", jaguar->r[22]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R23: sprintf(info->s, "R23:%08X", jaguar->r[23]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R24: sprintf(info->s, "R24:%08X", jaguar->r[24]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R25: sprintf(info->s, "R25:%08X", jaguar->r[25]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R26: sprintf(info->s, "R26:%08X", jaguar->r[26]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R27: sprintf(info->s, "R27:%08X", jaguar->r[27]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R28: sprintf(info->s, "R28:%08X", jaguar->r[28]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R29: sprintf(info->s, "R29:%08X", jaguar->r[29]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R30: sprintf(info->s, "R30:%08X", jaguar->r[30]); break; + case CPUINFO_STR_REGISTER + JAGUAR_R31: sprintf(info->s, "R31:%08X", jaguar->r[31]); break; } } @@ -1721,39 +1657,36 @@ CPU_GET_INFO( jaguargpu ) static CPU_SET_INFO( jaguardsp ) { + jaguar_state *jaguar = device->token; switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ5: set_irq_line(JAGUAR_IRQ5, info->i); break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ5: set_irq_line(jaguar, JAGUAR_IRQ5, info->i); break; /* --- the following bits of info are set as pointers to data or functions --- */ - default: - CPU_SET_INFO_CALL(jaguargpu); - break; + default: CPU_SET_INFO_CALL(jaguargpu); break; } } CPU_GET_INFO( jaguardsp ) { + jaguar_state *jaguar = (device != NULL) ? device->token : NULL; switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ - case CPUINFO_INT_INPUT_LINES: info->i = 6; break; - case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ5: info->i = (jaguar.ctrl[G_CTRL] & 0x10000) ? ASSERT_LINE : CLEAR_LINE; break; + case CPUINFO_INT_INPUT_LINES: info->i = 6; break; + case CPUINFO_INT_INPUT_STATE + JAGUAR_IRQ5: info->i = (jaguar->ctrl[G_CTRL] & 0x10000) ? ASSERT_LINE : CLEAR_LINE; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(jaguardsp); break; - case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(jaguardsp); break; - case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(jaguardsp); break; + case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(jaguardsp); break; case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(jaguardsp); break; - case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(jaguardsp); break; + case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(jaguardsp);break; /* --- the following bits of info are returned as NULL-terminated strings --- */ - case CPUINFO_STR_NAME: strcpy(info->s, "Jaguar DSP"); break; + case CPUINFO_STR_NAME: strcpy(info->s, "Jaguar DSP"); break; - default: - CPU_GET_INFO_CALL(jaguargpu); - break; + default: CPU_GET_INFO_CALL(jaguargpu); break; } } diff --git a/src/emu/cpu/jaguar/jaguar.h b/src/emu/cpu/jaguar/jaguar.h index 0c518199964..f5d8845a5a6 100644 --- a/src/emu/cpu/jaguar/jaguar.h +++ b/src/emu/cpu/jaguar/jaguar.h @@ -15,11 +15,6 @@ /*************************************************************************** - COMPILE-TIME DEFINITIONS -***************************************************************************/ - - -/*************************************************************************** GLOBAL CONSTANTS ***************************************************************************/ @@ -27,6 +22,7 @@ #define JAGUAR_VARIANT_DSP 1 + /*************************************************************************** REGISTER ENUMERATION ***************************************************************************/ @@ -71,17 +67,22 @@ enum }; + /*************************************************************************** CONFIGURATION STRUCTURE ***************************************************************************/ -typedef struct _jaguar_cpu_core jaguar_cpu_core; -struct _jaguar_cpu_core +typedef void (*jaguar_int_func)(const device_config *device); + + +typedef struct _jaguar_cpu_config jaguar_cpu_config; +struct _jaguar_cpu_config { - void (*cpu_int_callback)(void); + jaguar_int_func cpu_int_callback; }; + /*************************************************************************** INTERRUPT CONSTANTS ***************************************************************************/ @@ -94,17 +95,18 @@ struct _jaguar_cpu_core #define JAGUAR_IRQ5 5 /* IRQ5 */ + /*************************************************************************** PUBLIC FUNCTIONS ***************************************************************************/ extern CPU_GET_INFO( jaguargpu ); -extern void jaguargpu_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask); -extern UINT32 jaguargpu_ctrl_r(int cpunum, offs_t offset); +extern void jaguargpu_ctrl_w(const device_config *device, offs_t offset, UINT32 data, UINT32 mem_mask); +extern UINT32 jaguargpu_ctrl_r(const device_config *device, offs_t offset); extern CPU_GET_INFO( jaguardsp ); -extern void jaguardsp_ctrl_w(int cpunum, offs_t offset, UINT32 data, UINT32 mem_mask); -extern UINT32 jaguardsp_ctrl_r(int cpunum, offs_t offset); +extern void jaguardsp_ctrl_w(const device_config *device, offs_t offset, UINT32 data, UINT32 mem_mask); +extern UINT32 jaguardsp_ctrl_r(const device_config *device, offs_t offset); #endif /* __JAGUAR_H__ */ |