diff options
Diffstat (limited to 'src/emu/cpu/se3208/se3208dis.c')
-rw-r--r-- | src/emu/cpu/se3208/se3208dis.c | 1413 |
1 files changed, 1413 insertions, 0 deletions
diff --git a/src/emu/cpu/se3208/se3208dis.c b/src/emu/cpu/se3208/se3208dis.c new file mode 100644 index 00000000000..03b344d0564 --- /dev/null +++ b/src/emu/cpu/se3208/se3208dis.c @@ -0,0 +1,1413 @@ +#include "debugger.h" +#include "se3208.h" + + +static struct _DisSE3208 +{ + UINT32 PC; + UINT32 SR; + UINT32 ER; +} Context; + +#define FLAG_E 0x0800 + +#define CLRFLAG(f) Context.SR&=~(f); +#define SETFLAG(f) Context.SR|=(f); +#define TESTFLAG(f) (Context.SR&(f)) + +#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))) + +typedef UINT32 (*_OP)(UINT16 Opcode,char *dst); +#define INST(a) static UINT32 a(UINT16 Opcode,char *dst) + + +INST(INVALIDOP) +{ + sprintf(dst,"INVALID"); + return 0; +} + +INST(LDB) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"LDB (%%R%d,0x%x),%%R%d",Index,Offset,SrcDst); + else + sprintf(dst,"LDB (0x%x),%%R%d",Index+Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(STB) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"STB %%R%d,(%%R%d,0x%x)",SrcDst,Index,Offset); + else + sprintf(dst,"STB %%R%d,(0x%x)",SrcDst,Index+Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDS) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"LDS (%%R%d,0x%x),%%R%d",Index,Offset,SrcDst); + else + sprintf(dst,"LDS (0x%x),%%R%d",Index+Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(STS) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"STS %%R%d,(%%R%d,0x%x)",SrcDst,Index,Offset); + else + sprintf(dst,"STS %%R%d,(0x%x)",SrcDst,Index+Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LD) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=2; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"LD (%%R%d,0x%x),%%R%d",Index,Offset,SrcDst); + else + sprintf(dst,"LD (0x%x),%%R%d",Index+Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ST) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=2; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"ST %%R%d,(%%R%d,0x%x)",SrcDst,Index,Offset); + else + sprintf(dst,"ST %%R%d,(0x%x)",SrcDst,Index+Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDBU) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"LDBU (%%R%d,0x%x),%%R%d",Index,Offset,SrcDst); + else + sprintf(dst,"LDBU (0x%x),%%R%d",Index+Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDSU) +{ + UINT32 Offset=EXTRACT(Opcode,0,4); + UINT32 Index=EXTRACT(Opcode,5,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + if(Index) + sprintf(dst,"LDSU (%%R%d,0x%x),%%R%d",Index,Offset,SrcDst); + else + sprintf(dst,"LDSU (0x%x),%%R%d",Index+Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + + +INST(LERI) +{ + UINT32 Imm=EXTRACT(Opcode,0,13); + + if(TESTFLAG(FLAG_E)) + Context.ER=(EXTRACT(Context.ER,0,17)<<14)|Imm; + else + Context.ER=SEX(14,Imm); + + //sprintf(dst,"LERI 0x%x\t\tER=%08X",Imm,Context.ER); + sprintf(dst,"LERI 0x%x",Imm/*,Context.ER*/); + + SETFLAG(FLAG_E); + return 0; +} + +INST(LDSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=2; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"LD (%%SP,0x%x),%%R%d",Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(STSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 SrcDst=EXTRACT(Opcode,8,10); + + Offset<<=2; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"ST %%R%d,(%%SP,0x%x)",SrcDst,Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(PUSH) +{ + UINT32 Set=EXTRACT(Opcode,0,10); + char str[1024]; + strcpy(str,"PUSH "); + if(Set&(1<<10)) + strcat(str,"%PC-"); + if(Set&(1<<9)) + strcat(str,"%SR-"); + if(Set&(1<<8)) + strcat(str,"%ER-"); + if(Set&(1<<7)) + strcat(str,"%R7-"); + if(Set&(1<<6)) + strcat(str,"%R6-"); + if(Set&(1<<5)) + strcat(str,"%R5-"); + if(Set&(1<<4)) + strcat(str,"%R4-"); + if(Set&(1<<3)) + strcat(str,"%R3-"); + if(Set&(1<<2)) + strcat(str,"%R2-"); + if(Set&(1<<1)) + strcat(str,"%R1-"); + if(Set&(1<<0)) + strcat(str,"%R0-"); + str[strlen(str)-1]=0; + strcpy(dst,str); + return 0; +} + +INST(POP) +{ + UINT32 Set=EXTRACT(Opcode,0,10); + char str[1024]; + int Ret=0; + strcpy(str,"POP "); + if(Set&(1<<0)) + strcat(str,"%R0-"); + if(Set&(1<<1)) + strcat(str,"%R1-"); + if(Set&(1<<2)) + strcat(str,"%R2-"); + if(Set&(1<<3)) + strcat(str,"%R3-"); + if(Set&(1<<4)) + strcat(str,"%R4-"); + if(Set&(1<<5)) + strcat(str,"%R5-"); + if(Set&(1<<6)) + strcat(str,"%R6-"); + if(Set&(1<<7)) + strcat(str,"%R7-"); + if(Set&(1<<8)) + strcat(str,"%ER-"); + if(Set&(1<<9)) + strcat(str,"%SR-"); + if(Set&(1<<10)) + { + strcat(str,"%PC-"); + CLRFLAG(FLAG_E); //Clear the flag, this is a ret so disassemble will start a new E block + Ret=1; + } + str[strlen(str)-1]=0; + if(Ret) + strcat(str,"\n"); + strcpy(dst,str); + return Ret ? DASMFLAG_STEP_OUT : 0; +} + +INST(LEATOSP) +{ + UINT32 Offset=EXTRACT(Opcode,9,12); + UINT32 Index=EXTRACT(Opcode,3,5); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + else + Offset=SEX(4,Offset); + + if(Index) + sprintf(dst,"LEA (%%R%d,0x%x),%%SP",Index,Offset); + else + sprintf(dst,"LEA (0x%x),%%SP",Index+Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LEAFROMSP) +{ + UINT32 Offset=EXTRACT(Opcode,9,12); + UINT32 Index=EXTRACT(Opcode,3,5); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + else + Offset=SEX(4,Offset); + + sprintf(dst,"LEA (%%SP,0x%x),%%R%d",Offset,Index); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LEASPTOSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + + Offset<<=2; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,23)<<8)|(Offset&0xff); + else + Offset=SEX(10,Offset); + + + sprintf(dst,"LEA (%%SP,0x%x),%%SP",Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(MOV) +{ + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,9,11); + + if(Src==0 && Dst==0) + sprintf(dst,"NOP"); + else + sprintf(dst,"MOV %%SR%d,%%DR%d",Src,Dst); + return 0; +} + +INST(LDI) +{ + UINT32 Dst=EXTRACT(Opcode,8,10); + UINT32 Imm=EXTRACT(Opcode,0,7); + + if(TESTFLAG(FLAG_E)) + Imm=(EXTRACT(Context.ER,0,27)<<4)|(Imm&0xf); + else + Imm=SEX8(Imm); + + sprintf(dst,"LDI 0x%x,%%R%d",Imm,Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDBSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"LDB (%%SP,0x%x),%%R%d",Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(STBSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"STB %%R%d,(%%SP,0x%x)",SrcDst,Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDSSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"LDS (%%SP,0x%x),%%R%d",Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(STSSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"STS %%R%d,(%%SP,0x%x)",SrcDst,Offset); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDBUSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"LDBU (%%SP,0x%x),%%R%d",Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LDSUSP) +{ + UINT32 Offset=EXTRACT(Opcode,0,3); + UINT32 SrcDst=EXTRACT(Opcode,4,6); + + Offset<<=1; + + if(TESTFLAG(FLAG_E)) + Offset=(EXTRACT(Context.ER,0,27)<<4)|(Offset&0xf); + + sprintf(dst,"LDSU (%%SP,0x%x),%%R%d",Offset,SrcDst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ADDI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"ADD %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(SUBI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"SUB %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + + return 0; +} + +INST(ADCI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"ADC %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(SBCI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"SBC %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ANDI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"AND %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ORI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"OR %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(XORI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"XOR %%SR%d,0x%x,%%DR%d",Src,Imm2,Dst/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(CMPI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"CMP %%SR%d,0x%x",Src,Imm2/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(TSTI) +{ + UINT32 Imm=EXTRACT(Opcode,9,12); + UINT32 Src=EXTRACT(Opcode,3,5); + UINT32 Imm2=Imm; + + if(TESTFLAG(FLAG_E)) + Imm2=(EXTRACT(Context.ER,0,27)<<4)|(Imm2&0xf); + else + Imm2=SEX(4,Imm2); + + sprintf(dst,"TST %%SR%d,0x%x",Src,Imm2/*,Imm2*/); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ADD) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"ADD %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(SUB) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"SUB %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(ADC) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"ADC %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(SBC) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"SBC %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(AND) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"AND %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(OR) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"OR %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(XOR) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"XOR %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + return 0; +} + +INST(CMP) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + + sprintf(dst,"CMP %%SR%d,%%SR%d",Src1,Src2); + return 0; +} + +INST(TST) +{ + UINT32 Src2=EXTRACT(Opcode,9,11); + UINT32 Src1=EXTRACT(Opcode,3,5); + + sprintf(dst,"TST %%SR%d,%%SR%d",Src1,Src2); + return 0; +} + +INST(MULS) +{ + UINT32 Src2=EXTRACT(Opcode,6,8); + UINT32 Src1=EXTRACT(Opcode,3,5); + UINT32 Dst=EXTRACT(Opcode,0,2); + + sprintf(dst,"MUL %%SR%d,%%SR%d,%%DR%d",Src1,Src2,Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(NEG) +{ + UINT32 Dst=EXTRACT(Opcode,9,11); + UINT32 Src=EXTRACT(Opcode,3,5); + + sprintf(dst,"NEG %%SR%d,%%DR%d",Src,Dst); + return 0; +} + +INST(CALL) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"CALL 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return DASMFLAG_STEP_OVER; +} + +INST(JV) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JV 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JNV) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JNV 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JC) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JC 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JNC) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JNC 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JP) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JP 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JM) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JM 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JNZ) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JNZ 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JZ) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JZ 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JGE) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JGE 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JLE) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JLE 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JHI) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JHI 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JLS) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JLS 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JGT) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JGT 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JLT) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JLT 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + + + +INST(JMP) +{ + UINT32 Offset=EXTRACT(Opcode,0,7); + UINT32 Offset2; + + if(TESTFLAG(FLAG_E)) + Offset2=(EXTRACT(Context.ER,0,22)<<8)|Offset; + else + Offset2=SEX(8,Offset); + Offset2<<=1; + sprintf(dst,"JMP 0x%x",Context.PC+2+Offset2); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(JR) +{ + UINT32 Src=EXTRACT(Opcode,0,3); + + sprintf(dst,"JR %%R%d",Src); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(CALLR) +{ + UINT32 Src=EXTRACT(Opcode,0,3); + + sprintf(dst,"CALLR %%R%d",Src); + + CLRFLAG(FLAG_E); + return DASMFLAG_STEP_OVER; +} + +INST(ASR) +{ + UINT32 CS=Opcode&(1<<10); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm=EXTRACT(Opcode,5,9); + UINT32 Cnt=EXTRACT(Opcode,5,7); + + if(CS) + sprintf(dst,"ASR %%R%d,%%R%d",Cnt,Dst); + else + sprintf(dst,"ASR %x,%%R%d",Imm,Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(LSR) +{ + UINT32 CS=Opcode&(1<<10); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm=EXTRACT(Opcode,5,9); + UINT32 Cnt=EXTRACT(Opcode,5,7); + + if(CS) + sprintf(dst,"LSR %%R%d,%%R%d",Cnt,Dst); + else + sprintf(dst,"LSR %x,%%R%d",Imm,Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(ASL) +{ + UINT32 CS=Opcode&(1<<10); + UINT32 Dst=EXTRACT(Opcode,0,2); + UINT32 Imm=EXTRACT(Opcode,5,9); + UINT32 Cnt=EXTRACT(Opcode,5,7); + + if(CS) + sprintf(dst,"ASL %%R%d,%%R%d",Cnt,Dst); + else + sprintf(dst,"ASL %x,%%R%d",Imm,Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(EXTB) +{ + UINT32 Dst=EXTRACT(Opcode,0,3); + + sprintf(dst,"EXTB %%R%d",Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(EXTS) +{ + UINT32 Dst=EXTRACT(Opcode,0,3); + + sprintf(dst,"EXTS %%R%d",Dst); + + CLRFLAG(FLAG_E); + return 0; +} + +INST(SET) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"SET 0x%x",Imm); + return 0; +} + +INST(CLR) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"CLR 0x%x",Imm); + return 0; +} + +INST(SWI) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"SWI 0x%x",Imm); + return 0; +} + +INST(HALT) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"HALT 0x%x",Imm); + return 0; +} + +INST(MVTC) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"MVTC %%R0,%%CR%d",Imm); + return 0; +} + +INST(MVFC) +{ + UINT32 Imm=EXTRACT(Opcode,0,3); + + sprintf(dst,"MVFC %%CR0%d,%%R0",Imm); + return 0; +} + +static _OP DecodeOp(UINT16 Opcode) +{ + switch(EXTRACT(Opcode,14,15)) + { + case 0x0: + { + UINT8 Op=EXTRACT(Opcode,11,13); + switch(Op) + { + case 0x0: + return LDB; + case 0x1: + return LDS; + case 0x2: + return LD; + case 0x3: + return LDBU; + case 0x4: + return STB; + case 0x5: + return STS; + case 0x6: + return ST; + case 0x7: + return LDSU; + } + } + break; + case 0x1: + return LERI; + break; + case 0x2: + { + switch(EXTRACT(Opcode,11,13)) + { + case 0: + return LDSP; + case 1: + return STSP; + case 2: + return PUSH; + case 3: + return POP; + case 4: + case 5: + case 6: + case 7: + case 8: //arith + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + switch(EXTRACT(Opcode,6,8)) + { + case 0: + return ADDI; + case 1: + return ADCI; + case 2: + return SUBI; + case 3: + return SBCI; + case 4: + return ANDI; + case 5: + return ORI; + case 6: + return XORI; + case 7: + switch(EXTRACT(Opcode,0,2)) + { + case 0: + return CMPI; + case 1: + return TSTI; + case 2: + return LEATOSP; + case 3: + return LEAFROMSP; + } + break; + } + break; + } + } + break; + case 3: + switch(EXTRACT(Opcode,12,13)) + { + case 0: + switch(EXTRACT(Opcode,6,8)) + { + case 0: + return ADD; + case 1: + return ADC; + case 2: + return SUB; + case 3: + return SBC; + case 4: + return AND; + case 5: + return OR; + case 6: + return XOR; + case 7: + switch(EXTRACT(Opcode,0,2)) + { + case 0: + return CMP; + case 1: + return TST; + case 2: + return MOV; + case 3: + return NEG; + } + break; + } + break; + case 1: //Jumps + switch(EXTRACT(Opcode,8,11)) + { + case 0x0: + return JNV; + case 0x1: + return JV; + case 0x2: + return JP; + case 0x3: + return JM; + case 0x4: + return JNZ; + case 0x5: + return JZ; + case 0x6: + return JNC; + case 0x7: + return JC; + case 0x8: + return JGT; + case 0x9: + return JLT; + case 0xa: + return JGE; + case 0xb: + return JLE; + case 0xc: + return JHI; + case 0xd: + return JLS; + case 0xe: + return JMP; + case 0xf: + return CALL; + } + break; + case 2: + if(Opcode&(1<<11)) + return LDI; + else //SP Ops + { + if(Opcode&(1<<10)) + { + switch(EXTRACT(Opcode,7,9)) + { + case 0: + return LDBSP; + case 1: + return LDSSP; + case 3: + return LDBUSP; + case 4: + return STBSP; + case 5: + return STSSP; + case 7: + return LDSUSP; + } + } + else + { + if(Opcode&(1<<9)) + { + return LEASPTOSP; + } + else + { + if(Opcode&(1<<8)) + { + + } + else + { + switch(EXTRACT(Opcode,4,7)) + { + case 0: + return EXTB; + case 1: + return EXTS; + case 8: + return JR; + case 9: + return CALLR; + case 10: + return SET; + case 11: + return CLR; + case 12: + return SWI; + case 13: + return HALT; + } + } + } + } + } + break; + case 3: + switch(EXTRACT(Opcode,9,11)) + { + case 0: + case 1: + case 2: + case 3: + switch(EXTRACT(Opcode,3,4)) + { + case 0: + return ASR; + case 1: + return LSR; + case 2: + return ASL; + //case 3: + // return LSL; + } + break; + case 4: + return MULS; + case 6: + if(Opcode&(1<<3)) + return MVFC; + else + return MVTC; + break; + } + break; + } + break; + + } + return INVALIDOP; +} + + +offs_t SE3208_Dasm(char *Buffer, offs_t PC, const UINT8 *oprom, const UINT8 *opram) +{ + UINT16 Opcode; + + CLRFLAG(FLAG_E); + Context.ER=0; + + Context.PC=PC; + Opcode=oprom[0] | (oprom[1] << 8); + return 2 | ((*DecodeOp(Opcode))(Opcode,Buffer)) | DASMFLAG_SUPPORTED; +} |