From 8211d7d7faa515a30c4cabe0c99905207d2d8492 Mon Sep 17 00:00:00 2001 From: kbongers Date: Thu, 31 Jan 2002 05:58:27 +0000 Subject: [PATCH] work on instr git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1881 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- sim/ucsim/xa.src/inst.cc | 116 ++++++++++++++++++++++++++++++++++- sim/ucsim/xa.src/inst_gen.cc | 34 +++++----- sim/ucsim/xa.src/regsxa.h | 4 ++ 3 files changed, 135 insertions(+), 19 deletions(-) diff --git a/sim/ucsim/xa.src/inst.cc b/sim/ucsim/xa.src/inst.cc index cfb91214..d32e909b 100644 --- a/sim/ucsim/xa.src/inst.cc +++ b/sim/ucsim/xa.src/inst.cc @@ -235,6 +235,30 @@ cl_xa::inst_MOVS(uint code, int operands) 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 @@ -245,11 +269,56 @@ cl_xa::inst_MOVX(uint code, int operands) 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 @@ -304,11 +373,12 @@ cl_xa::inst_JMP(uint code, int operands) 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... */ } @@ -317,11 +387,45 @@ cl_xa::inst_JMP(uint code, int operands) 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 @@ -352,11 +456,19 @@ cl_xa::inst_DJNZ(uint code, int operands) 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 diff --git a/sim/ucsim/xa.src/inst_gen.cc b/sim/ucsim/xa.src/inst_gen.cc index d37890dd..1b621719 100644 --- a/sim/ucsim/xa.src/inst_gen.cc +++ b/sim/ucsim/xa.src/inst_gen.cc @@ -45,7 +45,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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), @@ -60,7 +60,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ); } if (operands == REG_IREGINC) { - set_reg2(RI_0F, srcreg+1); + set_reg2(RI_07, srcreg+1); } } break; @@ -79,7 +79,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA store1(addr, total); } if (operands == IREGINC_REG) { - set_reg2(RI_0F, addr+1); + set_reg2(RI_07, addr+1); } } break; @@ -94,13 +94,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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); @@ -137,7 +137,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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, @@ -154,7 +154,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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), @@ -176,7 +176,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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 : @@ -184,12 +184,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA { 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; @@ -204,7 +204,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA total = FUNC2(tmp, fetch2() ); store2(addr, total); if (operands == IREGINC_DATA16) { - set_reg2(RI_07, addr+1); + set_reg2(RI_70, addr+1); } } break; @@ -221,9 +221,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA offset = (int)((short)fetch2()); } tmp = fetch(); - addr = reg2(RI_07); + addr = reg2(RI_70); - store1( addr, + store1( addr+offset, FUNC1( tmp, get1(addr+offset) ) @@ -243,9 +243,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA offset = (int)((short)fetch2()); } tmp = fetch2(); - addr = reg2(RI_07); + addr = reg2(RI_70); - store2( addr, + store2( addr+offset, FUNC2( tmp, get2(addr+offset) ) @@ -255,7 +255,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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) ); @@ -264,7 +264,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 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) ); diff --git a/sim/ucsim/xa.src/regsxa.h b/sim/ucsim/xa.src/regsxa.h index 72729827..a5bb55fe 100644 --- a/sim/ucsim/xa.src/regsxa.h +++ b/sim/ucsim/xa.src/regsxa.h @@ -66,6 +66,10 @@ struct t_regs #define get1(addr) ram->get((t_addr) (addr)) #define get2(addr) (ram->get((t_addr) (addr)) | (ram->get((t_addr) (addr+1)) << 8) ) +/* get from code */ +#define getcode1(addr) rom->get((t_addr) (addr)) +#define getcode2(addr) (rom->get((t_addr) (addr)) | (rom->get((t_addr) (addr+1)) << 8) ) + /* fetch from opcode code space */ #define fetch2() ((fetch() << 8) | fetch()) #define fetch1() fetch() -- 2.30.2