int
cl_xa::inst_MOVC(uint code, int operands)
{
+ switch (operands) {
+ case REG_IREGINC:
+ {
+ short srcreg = reg2(RI_07);
+ if (code & 0x0800) { /* word op */
+ set_reg2( RI_F0,
+ mov2( reg2(RI_F0),
+ getcode2(srcreg)
+ )
+ );
+ } else {
+ set_reg1( RI_F0,
+ mov1( reg1(RI_F0),
+ getcode1(srcreg)
+ )
+ );
+ }
+ if (operands == REG_IREGINC) {
+ set_reg2(RI_07, srcreg+1);
+ }
+ }
+ break;
+ // fixme, 2 more
+ }
return(resGO);
}
int
int
cl_xa::inst_PUSH(uint code, int operands)
{
+ switch(operands) {
+ case DIRECT_ALONE:
+ {
+ unsigned short sp;
+ unsigned short direct_addr = ((operands & 0x7) << 8) | fetch();
+
+ sp = get_sp()-2;
+ set_sp(sp);
+ if (code & 0x0800) { /* word op */
+ store2( sp, get_word_direct(direct_addr));
+ } else {
+ store2( sp, get_byte_direct(direct_addr));
+ }
+ }
+ break;
+
+ case RLIST:
+ // fixme: implement
+ unsigned char rlist = fetch();
+ rlist = rlist; //shutup compiler
+ break;
+ }
+
return(resGO);
}
int
cl_xa::inst_POP(uint code, int operands)
{
+ switch(operands) {
+ case DIRECT_ALONE:
+ {
+ unsigned short sp;
+ unsigned short direct_addr = ((operands & 0x7) << 8) | fetch();
+
+ sp = get_sp();
+ if (code & 0x0800) { /* word op */
+ set_word_direct(direct_addr, get2(sp) );
+ } else {
+ set_byte_direct(direct_addr, get2(sp) & 0xff );
+ }
+ set_sp(sp+2);
+ }
+ break;
+
+ case RLIST:
+ // fixme: implement
+ unsigned char rlist = fetch();
+ rlist = rlist; //shutup compiler
+ break;
+ }
return(resGO);
}
int
saddr = fetch2();
jmpaddr = saddr;
jmpaddr *= 2;
- PC = (PC + 3) + jmpaddr;
+ PC = (PC + jmpaddr) & 0xfffffffe;
}
break;
case IREG:
- PC = reg2(RI_07) & 0xfffe; /* word aligned */
+ PC &= 0xffff0000;
+ PC |= (reg2(RI_07) & 0xfffe); /* word aligned */
break;
/* fixme 2 more... */
}
int
cl_xa::inst_CALL(uint code, int operands)
{
+ unsigned int jmpaddr;
+ unsigned int sp;
+
+ switch(operands) {
+ case REL16:
+ {
+ jmpaddr = fetch2();
+ sp = get_sp() - 4;
+ set_sp(sp);
+ store2(sp, PC);
+ store2(sp+2, 0); /* segment(not sure about ordering...) */
+ jmpaddr *= 2;
+ PC = (PC + jmpaddr) & 0xfffffffe;
+ }
+ break;
+ case IREG:
+ {
+ sp = get_sp() - 4;
+ set_sp(sp);
+ store2(sp, PC);
+ store2(sp+2, 0); /* segment(not sure about ordering...) */
+ jmpaddr = reg2(RI_07);
+ jmpaddr *= 2;
+ PC = (PC + jmpaddr) & 0xfffffffe;
+ }
+ break;
+ /* fixme 2 more... */
+ }
return(resGO);
}
int
cl_xa::inst_RET(uint code, int operands)
{
+ unsigned int retaddr;
+ unsigned short sp;
+ sp = get_sp();
+ retaddr = get2(sp);
+ //retaddr |= get2(sp+2) << 16);
+ PC = retaddr;
return(resGO);
}
int
int
cl_xa::inst_JZ(uint code, int operands)
{
+ short saddr = (fetch1() * 2);
+ if (get_psw() & BIT_Z) {
+ PC += saddr;
+ }
return(resGO);
}
int
cl_xa::inst_JNZ(uint code, int operands)
{
+ short saddr = (fetch1() * 2);
+ if (!(get_psw() & BIT_Z)) {
+ PC += saddr;
+ }
return(resGO);
}
int
case REG_IREGINC :
case REG_IREG:
{
- short srcreg = reg2(RI_0F);
+ short srcreg = reg2(RI_07);
if (code & 0x0800) { /* word op */
set_reg2( RI_F0,
FUNC2( reg2(RI_F0),
);
}
if (operands == REG_IREGINC) {
- set_reg2(RI_0F, srcreg+1);
+ set_reg2(RI_07, srcreg+1);
}
}
break;
store1(addr, total);
}
if (operands == IREGINC_REG) {
- set_reg2(RI_0F, addr+1);
+ set_reg2(RI_07, addr+1);
}
}
break;
offset = (int)((short)fetch2());
}
if (code & 0x0800) { /* word op */
- t_mem addr = reg2(RI_07) + offset;
+ t_mem addr = reg2(RI_70) + offset;
unsigned short wtmp, wtotal;
wtmp = get2(addr);
wtotal = FUNC2( wtmp, reg2(RI_F0) );
store2(addr, wtotal);
} else {
- t_mem addr = reg2(RI_07) + ((short) fetch2());
+ t_mem addr = reg2(RI_70) + ((short) fetch2());
unsigned char total;
total = FUNC1( get1(addr), reg1(RI_F0) );
store1(addr, total);
case DIRECT_REG :
{
- int addr = ((code & 0x3) << 8) | fetch();
+ int addr = ((code & 0x7) << 8) | fetch();
if (code & 0x0800) { /* word op */
unsigned short wtmp = get_word_direct(addr);
set_word_direct( addr,
case REG_DIRECT :
{
- int addr = ((code & 0x3) << 8) | fetch();
+ int addr = ((code & 0x7) << 8) | fetch();
if (code & 0x0800) { /* word op */
set_reg2( RI_F0,
FUNC2( reg2(RI_F0),
break;
case REG_DATA16 :
- set_reg2( RI_F0, FUNC2( reg2(RI_F0), fetch()) );
+ set_reg2( RI_F0, FUNC2( reg2(RI_F0), fetch2()) );
break;
case IREGINC_DATA8 :
{
unsigned char total;
unsigned char tmp;
- t_mem addr = reg2(RI_07);
+ t_mem addr = reg2(RI_70);
tmp = get1(addr);
total = FUNC1(tmp, fetch() );
store1(addr, total);
if (operands == IREGINC_DATA8) {
- set_reg2(RI_07, addr+1);
+ set_reg2(RI_70, addr+1);
}
}
break;
total = FUNC2(tmp, fetch2() );
store2(addr, total);
if (operands == IREGINC_DATA16) {
- set_reg2(RI_07, addr+1);
+ set_reg2(RI_70, addr+1);
}
}
break;
offset = (int)((short)fetch2());
}
tmp = fetch();
- addr = reg2(RI_07);
+ addr = reg2(RI_70);
- store1( addr,
+ store1( addr+offset,
FUNC1( tmp,
get1(addr+offset)
)
offset = (int)((short)fetch2());
}
tmp = fetch2();
- addr = reg2(RI_07);
+ addr = reg2(RI_70);
- store2( addr,
+ store2( addr+offset,
FUNC2( tmp,
get2(addr+offset)
)
case DIRECT_DATA8 :
{
- int addr = ((code & 0x3) << 8) | fetch();
+ int addr = ((code & 0x70) << 4) | fetch();
unsigned char bdir = get_byte_direct(addr);
unsigned char bdat = fetch();
set_byte_direct( addr, FUNC1( bdir, bdat) );
case DIRECT_DATA16 :
{
- int addr = ((code & 0x3) << 8) | fetch();
+ int addr = ((code & 0x70) << 4) | fetch();
unsigned short wdir = get_word_direct(addr);
unsigned short wdat = fetch2();
set_word_direct( addr, FUNC2( wdir, wdat) );