diff options
Diffstat (limited to 'src/devices/cpu/se3208/se3208.cpp')
-rw-r--r-- | src/devices/cpu/se3208/se3208.cpp | 739 |
1 files changed, 361 insertions, 378 deletions
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp index 787649174c5..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,44 +14,35 @@ */ -#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") se3208_device::se3208_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : cpu_device(mconfig, SE3208, tag, owner, clock) , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0) - , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_program(nullptr), m_cache(nullptr), m_IRQ(0), m_NMI(0), m_icount(0) + , m_machinex_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) { } + device_memory_interface::space_config_vector se3208_device::memory_space_config() const { return space_config_vector { @@ -62,88 +51,60 @@ device_memory_interface::space_config_vector se3208_device::memory_space_config( } -uint32_t se3208_device::read_dword_unaligned(address_space &space, uint32_t address) +uint8_t se3208_device::SE3208_Read8(uint32_t address) { - if (DWORD_ALIGNED(address)) - return space.read_dword(address); - else - { - osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); -#if ALLOW_UNALIGNED_DWORD_ACCESS - return space.read_byte(address) | space.read_byte(address + 1) << 8 | space.read_byte(address + 2) << 16 | space.read_byte(address + 3) << 24; -#else - return 0; -#endif - } + return m_program.read_byte(address); } -uint16_t se3208_device::read_word_unaligned(address_space &space, uint32_t address) +uint16_t se3208_device::SE3208_Read16(uint32_t address) { if (!WORD_ALIGNED(address)) - return space.read_byte(address) | space.read_byte(address+1)<<8; + return m_program.read_byte(address) | m_program.read_byte(address+1)<<8; else - return space.read_word(address); + return m_program.read_word(address); } -void se3208_device::write_dword_unaligned(address_space &space, uint32_t address, uint32_t data) +uint32_t se3208_device::SE3208_Read32(uint32_t address) { if (DWORD_ALIGNED(address)) - space.write_dword(address, data); + return m_program.read_dword(address); else { -#if ALLOW_UNALIGNED_DWORD_ACCESS - space.write_byte(address, data & 0xff); - space.write_byte(address + 1, (data >> 8) & 0xff); - space.write_byte(address + 2, (data >> 16) & 0xff); - space.write_byte(address + 3, (data >> 24) & 0xff); -#endif - osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); + osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); + 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; } +} +void se3208_device::SE3208_Write8(uint32_t address,uint8_t data) +{ + m_program.write_byte(address,data); } -void se3208_device::write_word_unaligned(address_space &space, uint32_t address, uint16_t data) +void se3208_device::SE3208_Write16(uint32_t address,uint16_t data) { if (!WORD_ALIGNED(address)) { - space.write_byte(address, data & 0xff); - space.write_byte(address+1, (data>>8)&0xff); + m_program.write_byte(address, data & 0xff); + m_program.write_byte(address+1, (data>>8)&0xff); } else { - space.write_word(address, data); + m_program.write_word(address, data); } } - -uint8_t se3208_device::SE3208_Read8(uint32_t addr) -{ - return m_program->read_byte(addr); -} - -uint16_t se3208_device::SE3208_Read16(uint32_t addr) -{ - return read_word_unaligned(*m_program,addr); -} - -uint32_t se3208_device::SE3208_Read32(uint32_t addr) -{ - return read_dword_unaligned(*m_program,addr); -} - -void se3208_device::SE3208_Write8(uint32_t addr,uint8_t val) -{ - m_program->write_byte(addr,val); -} - -void se3208_device::SE3208_Write16(uint32_t addr,uint16_t val) +void se3208_device::SE3208_Write32(uint32_t address, uint32_t data) { - write_word_unaligned(*m_program,addr,val); -} - -void se3208_device::SE3208_Write32(uint32_t addr,uint32_t val) -{ - write_dword_unaligned(*m_program,addr,val); + if (DWORD_ALIGNED(address)) + m_program.write_dword(address, data); + else + { + 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); + osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); + } } @@ -234,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; } @@ -248,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; } @@ -262,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; } @@ -275,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) @@ -286,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]; @@ -306,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; @@ -328,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; @@ -350,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; @@ -371,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); @@ -380,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; @@ -392,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]); @@ -401,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) @@ -412,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; @@ -435,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); } @@ -446,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); @@ -458,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); @@ -474,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]); @@ -503,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 } @@ -559,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]; @@ -568,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); @@ -579,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; @@ -594,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); @@ -610,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; @@ -633,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); @@ -747,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); @@ -763,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); @@ -779,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); @@ -795,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; @@ -815,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; @@ -835,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; @@ -855,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); @@ -870,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; @@ -890,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]; @@ -941,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]; @@ -957,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]; @@ -973,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]; @@ -996,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]); @@ -1007,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; @@ -1030,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)) @@ -1049,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)) @@ -1067,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)) @@ -1085,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)) @@ -1103,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)) @@ -1121,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)) @@ -1139,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)) @@ -1157,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)) @@ -1175,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)) @@ -1195,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)) @@ -1214,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))) @@ -1232,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)) @@ -1250,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))) @@ -1270,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) @@ -1292,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; @@ -1308,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; @@ -1317,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; @@ -1326,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]) @@ -1386,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]) @@ -1400,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; @@ -1423,26 +1399,29 @@ 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); // DEBUGMESSAGE("HALT\t0x%x",Imm); } 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); } @@ -1450,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: @@ -1480,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; @@ -1502,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; @@ -1519,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; @@ -1537,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; @@ -1557,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; @@ -1572,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; @@ -1609,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; @@ -1633,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; @@ -1669,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; @@ -1690,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,8 +1699,8 @@ void se3208_device::device_reset() m_SP = 0; m_ER = 0; m_PPC = 0; - m_program = &space(AS_PROGRAM); - m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>(); + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); m_PC=SE3208_Read32(0); m_SR=0; m_IRQ=CLEAR_LINE; @@ -1730,12 +1709,15 @@ void se3208_device::device_reset() void se3208_device::SE3208_NMI() { + standard_irq_callback(INPUT_LINE_NMI, m_PC); + m_machinex_cb(0x00); + PushVal(m_PC); PushVal(m_SR); CLRFLAG(FLAG_NMI|FLAG_ENI|FLAG_E|FLAG_M); - m_PC=SE3208_Read32(4); + TakeExceptionVector(0x01); } void se3208_device::SE3208_Interrupt() @@ -1743,16 +1725,18 @@ void se3208_device::SE3208_Interrupt() if(!TESTFLAG(FLAG_ENI)) return; + standard_irq_callback(0, m_PC); + m_machinex_cb(0x01); + PushVal(m_PC); PushVal(m_SR); CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M); - if(!(TESTFLAG(FLAG_AUT))) - m_PC=SE3208_Read32(8); + TakeExceptionVector(0x02); else - m_PC=SE3208_Read32(4*standard_irq_callback(0)); + TakeExceptionVector(m_iackx_cb()); } @@ -1760,7 +1744,7 @@ void se3208_device::execute_run() { do { - uint16_t Opcode=m_cache->read_word(m_PC, WORD_XOR_LE(0)); + uint16_t Opcode=m_cache.read_word(m_PC, WORD_XOR_LE(0)); m_PPC = m_PC; debugger_instruction_hook(m_PC); @@ -1785,8 +1769,8 @@ void se3208_device::device_start() { BuildTable(); - m_program = &space(AS_PROGRAM); - m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>(); + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); save_item(NAME(m_R)); save_item(NAME(m_PC)); @@ -1812,7 +1796,6 @@ void se3208_device::device_start() state_add(STATE_GENPC, "GENPC", m_PC).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_PPC).noshow(); - state_add(STATE_GENSP, "GENSP", m_SP).noshow(); state_add(STATE_GENFLAGS, "GENFLAGS", m_SR).formatstr("%10s").noshow(); set_icountptr(m_icount); |