summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/se3208/se3208.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/se3208/se3208.cpp')
-rw-r--r--src/devices/cpu/se3208/se3208.cpp739
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);