diff options
Diffstat (limited to 'src/devices/cpu/se3208/se3208.cpp')
-rw-r--r-- | src/devices/cpu/se3208/se3208.cpp | 649 |
1 files changed, 319 insertions, 330 deletions
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp index 71235c9423d..32d9dc533a4 100644 --- a/src/devices/cpu/se3208/se3208.cpp +++ b/src/devices/cpu/se3208/se3208.cpp @@ -4,8 +4,6 @@ #include "se3208.h" #include "se3208dis.h" -#include "debugger.h" - /* SE3208 CPU Emulator by ElSemi @@ -16,35 +14,23 @@ */ -#define FLAG_C 0x0080 -#define FLAG_V 0x0010 -#define FLAG_S 0x0020 -#define FLAG_Z 0x0040 - -#define FLAG_M 0x0200 -#define FLAG_E 0x0800 -#define FLAG_AUT 0x1000 -#define FLAG_ENI 0x2000 -#define FLAG_NMI 0x4000 - -#define CLRFLAG(f) m_SR&=~(f); -#define SETFLAG(f) m_SR|=(f); -#define TESTFLAG(f) (m_SR&(f)) +enum : uint32_t +{ + FLAG_C = 0x0080, + FLAG_V = 0x0010, + FLAG_S = 0x0020, + FLAG_Z = 0x0040, -#define EXTRACT(val,sbit,ebit) (((val)>>sbit)&((1<<((ebit-sbit)+1))-1)) -#define SEX8(val) ((val&0x80)?(val|0xFFFFFF00):(val&0xFF)) -#define SEX16(val) ((val&0x8000)?(val|0xFFFF0000):(val&0xFFFF)) -#define ZEX8(val) ((val)&0xFF) -#define ZEX16(val) ((val)&0xFFFF) -#define SEX(bits,val) ((val)&(1<<(bits-1))?((val)|(~((1<<bits)-1))):(val&((1<<bits)-1))) + FLAG_M = 0x0200, + FLAG_E = 0x0800, + FLAG_AUT = 0x1000, + FLAG_ENI = 0x2000, + FLAG_NMI = 0x4000 +}; //Precompute the instruction decoding in a big table #define INST(a) void se3208_device::a(uint16_t Opcode) -// officeye and donghaer perform unaligned DWORD accesses, allowing them to happen causes the games to malfunction. -// are such accesses simply illegal, be handled in a different way, or simply not be happening in the first place? -#define ALLOW_UNALIGNED_DWORD_ACCESS 0 - DEFINE_DEVICE_TYPE(SE3208, se3208_device, "se3208", "ADChips SE3208") @@ -52,7 +38,7 @@ se3208_device::se3208_device(const machine_config &mconfig, const char *tag, dev : cpu_device(mconfig, SE3208, tag, owner, clock) , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0) , m_machinex_cb(*this) - , m_iackx_cb(*this) + , m_iackx_cb(*this, 0) , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_IRQ(0), m_NMI(0), m_icount(0) { } @@ -65,13 +51,6 @@ device_memory_interface::space_config_vector se3208_device::memory_space_config( } -void se3208_device::device_resolve_objects() -{ - m_machinex_cb.resolve_safe(); - m_iackx_cb.resolve_safe(0); -} - - uint8_t se3208_device::SE3208_Read8(uint32_t address) { return m_program.read_byte(address); @@ -92,11 +71,7 @@ uint32_t se3208_device::SE3208_Read32(uint32_t address) else { osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); -#if ALLOW_UNALIGNED_DWORD_ACCESS return m_program.read_byte(address) | m_program.read_byte(address + 1) << 8 | m_program.read_byte(address + 2) << 16 | m_program.read_byte(address + 3) << 24; -#else - return 0; -#endif } } @@ -124,12 +99,10 @@ void se3208_device::SE3208_Write32(uint32_t address, uint32_t data) m_program.write_dword(address, data); else { -#if ALLOW_UNALIGNED_DWORD_ACCESS m_program.write_byte(address, data & 0xff); m_program.write_byte(address + 1, (data >> 8) & 0xff); m_program.write_byte(address + 2, (data >> 16) & 0xff); m_program.write_byte(address + 3, (data >> 24) & 0xff); -#endif osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); } } @@ -222,7 +195,7 @@ uint32_t se3208_device::AsrWithFlags(uint32_t Val, uint8_t By) SETFLAG(FLAG_Z); if(v&0x80000000) SETFLAG(FLAG_S); - if(Val&(1<<(By-1))) + if(BIT(Val,By-1)) SETFLAG(FLAG_C); return (uint32_t) v; } @@ -236,7 +209,7 @@ uint32_t se3208_device::LsrWithFlags(uint32_t Val, uint8_t By) SETFLAG(FLAG_Z); if(v&0x80000000) SETFLAG(FLAG_S); - if(Val&(1<<(By-1))) + if(BIT(Val,By-1)) SETFLAG(FLAG_C); return v; } @@ -250,7 +223,7 @@ uint32_t se3208_device::AslWithFlags(uint32_t Val, uint8_t By) SETFLAG(FLAG_Z); if(v&0x80000000) SETFLAG(FLAG_S); - if(Val&(1<<(32-By))) + if(BIT(Val,32-By)) SETFLAG(FLAG_C); return v; } @@ -263,9 +236,9 @@ INST(INVALIDOP) INST(LDB) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); uint32_t Val; if(Index) @@ -274,19 +247,19 @@ INST(LDB) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read8(Index+Offset); - m_R[SrcDst]=SEX8(Val); + m_R[SrcDst]=int8_t(Val); CLRFLAG(FLAG_E); } INST(STB) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); if(Index) Index=m_R[Index]; @@ -294,18 +267,18 @@ INST(STB) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); - SE3208_Write8(Index+Offset,ZEX8(m_R[SrcDst])); + SE3208_Write8(Index+Offset,m_R[SrcDst]&0xFF); CLRFLAG(FLAG_E); } INST(LDS) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); uint32_t Val; Offset<<=1; @@ -316,19 +289,19 @@ INST(LDS) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read16(Index+Offset); - m_R[SrcDst]=SEX16(Val); + m_R[SrcDst]=int16_t(Val); CLRFLAG(FLAG_E); } INST(STS) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); Offset<<=1; @@ -338,18 +311,18 @@ INST(STS) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); - SE3208_Write16(Index+Offset,ZEX16(m_R[SrcDst])); + SE3208_Write16(Index+Offset,m_R[SrcDst]&0xFFFF); CLRFLAG(FLAG_E); } INST(LD) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); Offset<<=2; @@ -359,7 +332,7 @@ INST(LD) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); m_R[SrcDst]=SE3208_Read32(Index+Offset); @@ -368,9 +341,9 @@ INST(LD) INST(ST) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); Offset<<=2; @@ -380,7 +353,7 @@ INST(ST) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); SE3208_Write32(Index+Offset,m_R[SrcDst]); @@ -389,9 +362,9 @@ INST(ST) INST(LDBU) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); uint32_t Val; if(Index) @@ -400,19 +373,19 @@ INST(LDBU) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read8(Index+Offset); - m_R[SrcDst]=ZEX8(Val); + m_R[SrcDst]=Val; CLRFLAG(FLAG_E); } INST(LDSU) { - uint32_t Offset=EXTRACT(Opcode,0,4); - uint32_t Index=EXTRACT(Opcode,5,7); - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t Offset=BIT(Opcode,0,5); + uint32_t Index=BIT(Opcode,5,3); + uint32_t SrcDst=BIT(Opcode,8,3); uint32_t Val; Offset<<=1; @@ -423,10 +396,10 @@ INST(LDSU) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read16(Index+Offset); - m_R[SrcDst]=ZEX16(Val); + m_R[SrcDst]=Val&0xFFFF; CLRFLAG(FLAG_E); } @@ -434,11 +407,11 @@ INST(LDSU) INST(LERI) { - uint32_t Imm=EXTRACT(Opcode,0,13); + uint32_t Imm=BIT(Opcode,0,14); if(TESTFLAG(FLAG_E)) - m_ER=(EXTRACT(m_ER,0,17)<<14)|Imm; + m_ER=(m_ER<<14)|Imm; else - m_ER=SEX(14,Imm); + m_ER=util::sext(Imm,14); SETFLAG(FLAG_E); @@ -446,14 +419,14 @@ INST(LERI) INST(LDSP) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t SrcDst=BIT(Opcode,8,3); Offset<<=2; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); m_R[SrcDst]=SE3208_Read32(Index+Offset); @@ -462,14 +435,14 @@ INST(LDSP) INST(STSP) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,8,10); + uint32_t SrcDst=BIT(Opcode,8,3); Offset<<=2; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); SE3208_Write32(Index+Offset,m_R[SrcDst]); @@ -491,55 +464,55 @@ uint32_t se3208_device::PopVal() INST(PUSH) { - uint32_t Set=EXTRACT(Opcode,0,10); - if(Set&(1<<10)) + uint32_t Set=BIT(Opcode,0,11); + if(BIT(Set,10)) PushVal(m_PC); - if(Set&(1<<9)) + if(BIT(Set,9)) PushVal(m_SR); - if(Set&(1<<8)) + if(BIT(Set,8)) PushVal(m_ER); - if(Set&(1<<7)) + if(BIT(Set,7)) PushVal(m_R[7]); - if(Set&(1<<6)) + if(BIT(Set,6)) PushVal(m_R[6]); - if(Set&(1<<5)) + if(BIT(Set,5)) PushVal(m_R[5]); - if(Set&(1<<4)) + if(BIT(Set,4)) PushVal(m_R[4]); - if(Set&(1<<3)) + if(BIT(Set,3)) PushVal(m_R[3]); - if(Set&(1<<2)) + if(BIT(Set,2)) PushVal(m_R[2]); - if(Set&(1<<1)) + if(BIT(Set,1)) PushVal(m_R[1]); - if(Set&(1<<0)) + if(BIT(Set,0)) PushVal(m_R[0]); } INST(POP) { - uint32_t Set=EXTRACT(Opcode,0,10); - if(Set&(1<<0)) + uint32_t Set=BIT(Opcode,0,11); + if(BIT(Set,0)) m_R[0]=PopVal(); - if(Set&(1<<1)) + if(BIT(Set,1)) m_R[1]=PopVal(); - if(Set&(1<<2)) + if(BIT(Set,2)) m_R[2]=PopVal(); - if(Set&(1<<3)) + if(BIT(Set,3)) m_R[3]=PopVal(); - if(Set&(1<<4)) + if(BIT(Set,4)) m_R[4]=PopVal(); - if(Set&(1<<5)) + if(BIT(Set,5)) m_R[5]=PopVal(); - if(Set&(1<<6)) + if(BIT(Set,6)) m_R[6]=PopVal(); - if(Set&(1<<7)) + if(BIT(Set,7)) m_R[7]=PopVal(); - if(Set&(1<<8)) + if(BIT(Set,8)) m_ER=PopVal(); - if(Set&(1<<9)) + if(BIT(Set,9)) m_SR=PopVal(); - if(Set&(1<<10)) + if(BIT(Set,10)) { m_PC=PopVal()-2; //PC automatically incresases by 2 } @@ -547,8 +520,8 @@ INST(POP) INST(LEATOSP) { - uint32_t Offset=EXTRACT(Opcode,9,12); - uint32_t Index=EXTRACT(Opcode,3,5); + uint32_t Offset=BIT(Opcode,9,4); + uint32_t Index=BIT(Opcode,3,3); if(Index) Index=m_R[Index]; @@ -556,9 +529,9 @@ INST(LEATOSP) Index=0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|Offset; else - Offset=SEX(4,Offset); + Offset=util::sext(Offset,4); m_SP=(Index+Offset) & (~3); @@ -567,13 +540,13 @@ INST(LEATOSP) INST(LEAFROMSP) { - uint32_t Offset=EXTRACT(Opcode,9,12); - uint32_t Index=EXTRACT(Opcode,3,5); + uint32_t Offset=BIT(Opcode,9,4); + uint32_t Index=BIT(Opcode,3,3); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|Offset; else - Offset=SEX(4,Offset); + Offset=util::sext(Offset,4); m_R[Index]=m_SP+Offset; @@ -582,14 +555,14 @@ INST(LEAFROMSP) INST(LEASPTOSP) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); Offset<<=2; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,23)<<8)|(Offset&0xff); + Offset=(m_ER<<8)|(Offset&0xff); else - Offset=SEX(10,Offset); + Offset=util::sext(Offset,10); m_SP=(m_SP+Offset) & (~3); @@ -598,21 +571,21 @@ INST(LEASPTOSP) INST(MOV) { - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,9,11); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,9,3); m_R[Dst]=m_R[Src]; } INST(LDI) { - uint32_t Dst=EXTRACT(Opcode,8,10); - uint32_t Imm=EXTRACT(Opcode,0,7); + uint32_t Dst=BIT(Opcode,8,3); + uint32_t Imm=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|(Imm&0xf); else - Imm=SEX8(Imm); + Imm=int8_t(Imm); m_R[Dst]=Imm; @@ -621,112 +594,112 @@ INST(LDI) INST(LDBSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); uint32_t Val; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|Offset; Val=SE3208_Read8(Index+Offset); - m_R[SrcDst]=SEX8(Val); + m_R[SrcDst]=int8_t(Val); CLRFLAG(FLAG_E); } INST(STBSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|Offset; - SE3208_Write8(Index+Offset,ZEX8(m_R[SrcDst])); + SE3208_Write8(Index+Offset,m_R[SrcDst]&0xFF); CLRFLAG(FLAG_E); } INST(LDSSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); uint32_t Val; Offset<<=1; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read16(Index+Offset); - m_R[SrcDst]=SEX16(Val); + m_R[SrcDst]=int16_t(Val); CLRFLAG(FLAG_E); } INST(STSSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); Offset<<=1; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); - SE3208_Write16(Index+Offset,ZEX16(m_R[SrcDst])); + SE3208_Write16(Index+Offset,m_R[SrcDst]&0xFFFF); CLRFLAG(FLAG_E); } INST(LDBUSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); uint32_t Val; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|Offset; Val=SE3208_Read8(Index+Offset); - m_R[SrcDst]=ZEX8(Val); + m_R[SrcDst]=Val; CLRFLAG(FLAG_E); } INST(LDSUSP) { - uint32_t Offset=EXTRACT(Opcode,0,3); + uint32_t Offset=BIT(Opcode,0,4); uint32_t Index=m_SP; - uint32_t SrcDst=EXTRACT(Opcode,4,6); + uint32_t SrcDst=BIT(Opcode,4,3); uint32_t Val; Offset<<=1; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf); + Offset=(m_ER<<4)|(Offset&0xf); Val=SE3208_Read16(Index+Offset); - m_R[SrcDst]=ZEX16(Val); + m_R[SrcDst]=Val; CLRFLAG(FLAG_E); } INST(ADDI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=AddWithFlags(m_R[Src],Imm); @@ -735,14 +708,14 @@ INST(ADDI) INST(SUBI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=SubWithFlags(m_R[Src],Imm); @@ -751,14 +724,14 @@ INST(SUBI) INST(ADCI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=AdcWithFlags(m_R[Src],Imm); @@ -767,14 +740,14 @@ INST(ADCI) INST(SBCI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=SbcWithFlags(m_R[Src],Imm); @@ -783,14 +756,14 @@ INST(SBCI) INST(ANDI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=m_R[Src]&Imm; @@ -803,14 +776,14 @@ INST(ANDI) INST(ORI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=m_R[Src]|Imm; @@ -823,14 +796,14 @@ INST(ORI) INST(XORI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); m_R[Dst]=m_R[Src]^Imm; @@ -843,13 +816,13 @@ INST(XORI) INST(CMPI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); SubWithFlags(m_R[Src],Imm); @@ -858,14 +831,14 @@ INST(CMPI) INST(TSTI) { - uint32_t Imm=EXTRACT(Opcode,9,12); - uint32_t Src=EXTRACT(Opcode,3,5); + uint32_t Imm=BIT(Opcode,9,4); + uint32_t Src=BIT(Opcode,3,3); uint32_t Dst; if(TESTFLAG(FLAG_E)) - Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf); + Imm=(m_ER<<4)|Imm; else - Imm=SEX(4,Imm); + Imm=util::sext(Imm,4); Dst=m_R[Src]&Imm; @@ -878,45 +851,45 @@ INST(TSTI) INST(ADD) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=AddWithFlags(m_R[Src1],m_R[Src2]); } INST(SUB) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=SubWithFlags(m_R[Src1],m_R[Src2]); } INST(ADC) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=AdcWithFlags(m_R[Src1],m_R[Src2]); } INST(SBC) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=SbcWithFlags(m_R[Src1],m_R[Src2]); } INST(AND) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=m_R[Src1]&m_R[Src2]; @@ -929,9 +902,9 @@ INST(AND) INST(OR) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=m_R[Src1]|m_R[Src2]; @@ -945,9 +918,9 @@ INST(OR) INST(XOR) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=m_R[Src1]^m_R[Src2]; @@ -961,16 +934,16 @@ INST(XOR) INST(CMP) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); SubWithFlags(m_R[Src1],m_R[Src2]); } INST(TST) { - uint32_t Src2=EXTRACT(Opcode,9,11); - uint32_t Src1=EXTRACT(Opcode,3,5); + uint32_t Src2=BIT(Opcode,9,3); + uint32_t Src1=BIT(Opcode,3,3); uint32_t Dst; Dst=m_R[Src1]&m_R[Src2]; @@ -984,9 +957,9 @@ INST(TST) INST(MULS) { - uint32_t Src2=EXTRACT(Opcode,6,8); - uint32_t Src1=EXTRACT(Opcode,3,5); - uint32_t Dst=EXTRACT(Opcode,0,2); + uint32_t Src2=BIT(Opcode,6,3); + uint32_t Src1=BIT(Opcode,3,3); + uint32_t Dst=BIT(Opcode,0,3); m_R[Dst]=MulWithFlags(m_R[Src1],m_R[Src2]); @@ -995,20 +968,20 @@ INST(MULS) INST(NEG) { - uint32_t Dst=EXTRACT(Opcode,9,11); - uint32_t Src=EXTRACT(Opcode,3,5); + uint32_t Dst=BIT(Opcode,9,3); + uint32_t Src=BIT(Opcode,3,3); m_R[Dst]=NegWithFlags(m_R[Src]); } INST(CALL) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; PushVal(m_PC+2); m_PC=m_PC+Offset; @@ -1018,12 +991,12 @@ INST(CALL) INST(JV) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_V)) @@ -1037,12 +1010,12 @@ INST(JV) INST(JNV) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!TESTFLAG(FLAG_V)) @@ -1055,12 +1028,12 @@ INST(JNV) INST(JC) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_C)) @@ -1073,12 +1046,12 @@ INST(JC) INST(JNC) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!TESTFLAG(FLAG_C)) @@ -1091,12 +1064,12 @@ INST(JNC) INST(JP) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!TESTFLAG(FLAG_S)) @@ -1109,12 +1082,12 @@ INST(JP) INST(JM) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_S)) @@ -1127,12 +1100,12 @@ INST(JM) INST(JNZ) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!TESTFLAG(FLAG_Z)) @@ -1145,12 +1118,12 @@ INST(JNZ) INST(JZ) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_Z)) @@ -1163,14 +1136,14 @@ INST(JZ) INST(JGE) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t S=TESTFLAG(FLAG_S)?1:0; uint32_t V=TESTFLAG(FLAG_V)?1:0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!(S^V)) @@ -1183,14 +1156,14 @@ INST(JGE) INST(JLE) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t S=TESTFLAG(FLAG_S)?1:0; uint32_t V=TESTFLAG(FLAG_V)?1:0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_Z) || (S^V)) @@ -1202,12 +1175,12 @@ INST(JLE) INST(JHI) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!(TESTFLAG(FLAG_Z) || TESTFLAG(FLAG_C))) @@ -1220,12 +1193,12 @@ INST(JHI) INST(JLS) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(TESTFLAG(FLAG_Z) || TESTFLAG(FLAG_C)) @@ -1238,14 +1211,14 @@ INST(JLS) INST(JGT) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t S=TESTFLAG(FLAG_S)?1:0; uint32_t V=TESTFLAG(FLAG_V)?1:0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(!(TESTFLAG(FLAG_Z) || (S^V))) @@ -1258,14 +1231,14 @@ INST(JGT) INST(JLT) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); uint32_t S=TESTFLAG(FLAG_S)?1:0; uint32_t V=TESTFLAG(FLAG_V)?1:0; if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; if(S^V) @@ -1280,12 +1253,12 @@ INST(JLT) INST(JMP) { - uint32_t Offset=EXTRACT(Opcode,0,7); + uint32_t Offset=BIT(Opcode,0,8); if(TESTFLAG(FLAG_E)) - Offset=(EXTRACT(m_ER,0,22)<<8)|Offset; + Offset=(m_ER<<8)|Offset; else - Offset=SEX(8,Offset); + Offset=int8_t(Offset); Offset<<=1; @@ -1296,7 +1269,7 @@ INST(JMP) INST(JR) { - uint32_t Src=EXTRACT(Opcode,0,3); + uint32_t Src=BIT(Opcode,0,4); m_PC=m_R[Src]-2; @@ -1305,7 +1278,7 @@ INST(JR) INST(CALLR) { - uint32_t Src=EXTRACT(Opcode,0,3); + uint32_t Src=BIT(Opcode,0,4); PushVal(m_PC+2); m_PC=m_R[Src]-2; @@ -1314,55 +1287,64 @@ INST(CALLR) INST(ASR) { - uint32_t CS=Opcode&(1<<10); - uint32_t Dst=EXTRACT(Opcode,0,2); - uint32_t Imm=EXTRACT(Opcode,5,9); - uint32_t Cnt=EXTRACT(Opcode,5,7); + uint32_t Dst=BIT(Opcode,0,3); - if(CS) + if(BIT(Opcode,10)) + { + uint32_t Cnt=BIT(Opcode,5,3); m_R[Dst]=AsrWithFlags(m_R[Dst],m_R[Cnt]&0x1f); + } else - m_R[Dst]=AsrWithFlags(m_R[Dst],Imm&0x1f); + { + uint32_t Imm=BIT(Opcode,5,5); + m_R[Dst]=AsrWithFlags(m_R[Dst],Imm); + } CLRFLAG(FLAG_E); } INST(LSR) { - uint32_t CS=Opcode&(1<<10); - uint32_t Dst=EXTRACT(Opcode,0,2); - uint32_t Imm=EXTRACT(Opcode,5,9); - uint32_t Cnt=EXTRACT(Opcode,5,7); + uint32_t Dst=BIT(Opcode,0,3); - if(CS) + if(BIT(Opcode,10)) + { + uint32_t Cnt=BIT(Opcode,5,3); m_R[Dst]=LsrWithFlags(m_R[Dst],m_R[Cnt]&0x1f); + } else - m_R[Dst]=LsrWithFlags(m_R[Dst],Imm&0x1f); + { + uint32_t Imm=BIT(Opcode,5,5); + m_R[Dst]=LsrWithFlags(m_R[Dst],Imm); + } CLRFLAG(FLAG_E); } INST(ASL) { - uint32_t CS=Opcode&(1<<10); - uint32_t Dst=EXTRACT(Opcode,0,2); - uint32_t Imm=EXTRACT(Opcode,5,9); - uint32_t Cnt=EXTRACT(Opcode,5,7); + uint32_t Dst=BIT(Opcode,0,3); - if(CS) + if(BIT(Opcode,10)) + { + uint32_t Cnt=BIT(Opcode,5,3); m_R[Dst]=AslWithFlags(m_R[Dst],m_R[Cnt]&0x1f); + } else - m_R[Dst]=AslWithFlags(m_R[Dst],Imm&0x1f); + { + uint32_t Imm=BIT(Opcode,5,5); + m_R[Dst]=AslWithFlags(m_R[Dst],Imm); + } CLRFLAG(FLAG_E); } INST(EXTB) { - uint32_t Dst=EXTRACT(Opcode,0,3); + uint32_t Dst=BIT(Opcode,0,4); uint32_t Val=m_R[Dst]; - m_R[Dst]=SEX8(Val); + m_R[Dst]=int8_t(Val&0xFF); CLRFLAG(FLAG_S|FLAG_Z|FLAG_E); if(!m_R[Dst]) @@ -1374,10 +1356,10 @@ INST(EXTB) INST(EXTS) { - uint32_t Dst=EXTRACT(Opcode,0,3); + uint32_t Dst=BIT(Opcode,0,4); uint32_t Val=m_R[Dst]; - m_R[Dst]=SEX16(Val); + m_R[Dst]=int16_t(Val&0xFFFF); CLRFLAG(FLAG_S|FLAG_Z|FLAG_E); if(!m_R[Dst]) @@ -1388,21 +1370,27 @@ INST(EXTS) INST(SET) { - uint32_t Imm=EXTRACT(Opcode,0,3); + uint32_t Imm=BIT(Opcode,0,4); m_SR|=(1<<Imm); } INST(CLR) { - uint32_t Imm=EXTRACT(Opcode,0,3); + uint32_t Imm=BIT(Opcode,0,4); m_SR&=~(1<<Imm); } +void se3208_device::TakeExceptionVector(uint8_t vector) +{ + debugger_exception_hook(vector); + m_PC=SE3208_Read32(4*vector); +} + INST(SWI) { - uint32_t Imm=EXTRACT(Opcode,0,3); + uint32_t Imm=BIT(Opcode,0,4); if(!TESTFLAG(FLAG_ENI)) return; @@ -1411,12 +1399,13 @@ INST(SWI) CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M); - m_PC=SE3208_Read32(4*Imm+0x40)-2; + TakeExceptionVector(Imm+0x10); + m_PC-=2; } INST(HALT) { - uint32_t Imm=EXTRACT(Opcode,0,3); + uint32_t Imm=BIT(Opcode,0,4); m_machinex_cb(0x10 | Imm); @@ -1425,14 +1414,14 @@ INST(HALT) INST(MVTC) { -// uint32_t Imm=EXTRACT(Opcode,0,3); +// uint32_t Imm=BIT(Opcode,0,4); // DEBUGMESSAGE("MVTC\t%%R0,%%CR%d",Imm); } INST(MVFC) { -// uint32_t Imm=EXTRACT(Opcode,0,3); +// uint32_t Imm=BIT(Opcode,0,4); // DEBUGMESSAGE("MVFC\t%%CR0%d,%%R0",Imm); } @@ -1440,11 +1429,11 @@ INST(MVFC) se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) { - switch(EXTRACT(Opcode,14,15)) + switch(BIT(Opcode,14,2)) { case 0x0: { - uint8_t Op=EXTRACT(Opcode,11,13); + uint8_t Op=BIT(Opcode,11,3); switch(Op) { case 0x0: @@ -1470,7 +1459,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) return &se3208_device::LERI; case 0x2: { - switch(EXTRACT(Opcode,11,13)) + switch(BIT(Opcode,11,3)) { case 0: return &se3208_device::LDSP; @@ -1492,7 +1481,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) case 13: case 14: case 15: - switch(EXTRACT(Opcode,6,8)) + switch(BIT(Opcode,6,3)) { case 0: return &se3208_device::ADDI; @@ -1509,7 +1498,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) case 6: return &se3208_device::XORI; case 7: - switch(EXTRACT(Opcode,0,2)) + switch(BIT(Opcode,0,3)) { case 0: return &se3208_device::CMPI; @@ -1527,10 +1516,10 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) } break; case 3: - switch(EXTRACT(Opcode,12,13)) + switch(BIT(Opcode,12,2)) { case 0: - switch(EXTRACT(Opcode,6,8)) + switch(BIT(Opcode,6,3)) { case 0: return &se3208_device::ADD; @@ -1547,7 +1536,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) case 6: return &se3208_device::XOR; case 7: - switch(EXTRACT(Opcode,0,2)) + switch(BIT(Opcode,0,3)) { case 0: return &se3208_device::CMP; @@ -1562,7 +1551,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) } break; case 1: //Jumps - switch(EXTRACT(Opcode,8,11)) + switch(BIT(Opcode,8,4)) { case 0x0: return &se3208_device::JNV; @@ -1599,13 +1588,13 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) } break; case 2: - if(Opcode&(1<<11)) + if(BIT(Opcode,11)) return &se3208_device::LDI; else //SP Ops { - if(Opcode&(1<<10)) + if(BIT(Opcode,10)) { - switch(EXTRACT(Opcode,7,9)) + switch(BIT(Opcode,7,3)) { case 0: return &se3208_device::LDBSP; @@ -1623,18 +1612,18 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) } else { - if(Opcode&(1<<9)) + if(BIT(Opcode,9)) { return &se3208_device::LEASPTOSP; } else { - if(Opcode&(1<<8)) + if(BIT(Opcode,8)) { } else { - switch(EXTRACT(Opcode,4,7)) + switch(BIT(Opcode,4,4)) { case 0: return &se3208_device::EXTB; @@ -1659,13 +1648,13 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) } break; case 3: - switch(EXTRACT(Opcode,9,11)) + switch(BIT(Opcode,9,3)) { case 0: case 1: case 2: case 3: - switch(EXTRACT(Opcode,3,4)) + switch(BIT(Opcode,3,2)) { case 0: return &se3208_device::ASR; @@ -1680,7 +1669,7 @@ se3208_device::OP se3208_device::DecodeOp(uint16_t Opcode) case 4: return &se3208_device::MULS; case 6: - if(Opcode&(1<<3)) + if(BIT(Opcode,3)) return &se3208_device::MVFC; else return &se3208_device::MVTC; @@ -1720,7 +1709,7 @@ void se3208_device::device_reset() void se3208_device::SE3208_NMI() { - standard_irq_callback(INPUT_LINE_NMI); + standard_irq_callback(INPUT_LINE_NMI, m_PC); m_machinex_cb(0x00); PushVal(m_PC); @@ -1728,7 +1717,7 @@ void se3208_device::SE3208_NMI() CLRFLAG(FLAG_NMI|FLAG_ENI|FLAG_E|FLAG_M); - m_PC=SE3208_Read32(4); + TakeExceptionVector(0x01); } void se3208_device::SE3208_Interrupt() @@ -1736,7 +1725,7 @@ void se3208_device::SE3208_Interrupt() if(!TESTFLAG(FLAG_ENI)) return; - standard_irq_callback(0); + standard_irq_callback(0, m_PC); m_machinex_cb(0x01); PushVal(m_PC); @@ -1745,9 +1734,9 @@ void se3208_device::SE3208_Interrupt() CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M); if(!(TESTFLAG(FLAG_AUT))) - m_PC=SE3208_Read32(8); + TakeExceptionVector(0x02); else - m_PC=SE3208_Read32(4*m_iackx_cb()); + TakeExceptionVector(m_iackx_cb()); } |