#include <stdio.h>
#include <stdlib.h>
#include "dy.h"
#include "stm8.h"
#include <string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define clr_str(str) memset(str,0,sizeof(str));
typedef struct ins_info
{
uchar ins_width;
uchar data_width;
uint ins_line_num;
}ins_info;
typedef struct print_ret
{
uint use_legth;
char print_string[50];
}print_ret;
char ASCII[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char* hex2char(uchar hex_num,char* p)
{
p[0] = ASCII[(hex_num & 0xF0) >> 4];
p[1] = ASCII[hex_num & 0x0F];
p[2] = '\0';
return p;
}
ins_info search_ins(uchar ins_a,uchar ins_b)
{
uint i = 0;
ins_info temp ;
if(ins_a == 0x72 || ins_a == 0x90 || ins_a == 0x91 || ins_a == 0x92)
{
while(ins_a != ins[i].opcode[0] || ins_b != ins[i].opcode[1]) i++;
temp.data_width = ins[i].opdata_W;
temp.ins_line_num = i;
temp.ins_width = 2;
return temp;
}
else
{
while(ins_a != ins[i].opcode[0])
{
if(i == 649)
{
temp.data_width = 0xff;
temp.ins_line_num = 0xff;
temp.ins_width = 0xff;
return temp;
}
i++;
}
temp.data_width = ins[i].opdata_W;
temp.ins_line_num = i;
temp.ins_width = 1;
return temp;
}
}
print_ret print_asm(ins_info info,uchar *input_array)
{
print_ret ret;
ret.use_legth = 0;
char *tep = (char*)ins[info.ins_line_num].pntchr;
char *pt = ret.print_string;
char temp[30];
memset(ret.print_string,0,sizeof(ret.print_string));
memset(ret.print_string,0,sizeof(temp));
if(info.ins_width == 0xff)
{
strcat(ret.print_string,"DC8 ");
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*input_array,temp));
ret.use_legth = 1;
return ret;
}
if(info.ins_width == 1)
{
input_array++;
}
else
{
input_array+=2;
}
if(info.ins_line_num < 19)
{
if(info.ins_line_num < 16)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*input_array,temp));
pt+=4;
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,hex2char(*(input_array+1),temp));
pt+=2;
while((*pt++ = *tep++) != '\0');
}
if(info.ins_line_num >= 16 && info.ins_line_num < 19)
{
if(info.data_width == 2)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array+1),temp));
pt+=4;
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array),temp));
pt+=4;
while((*pt++ = *tep++) != '\0');
}
if(info.data_width == 3)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array+1),temp));
strcat(ret.print_string,hex2char(*(input_array+2),temp));
pt+=6;
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array),temp));
pt+=4;
while((*pt++ = *tep++) != '\0');
}
if(info.data_width == 4)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array+2),temp));
strcat(ret.print_string,hex2char(*(input_array+3),temp));
pt+=6;
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*(input_array),temp));
strcat(ret.print_string,hex2char(*(input_array+1),temp));
pt+=6;
while((*pt++ = *tep++) != '\0');
}
}
}
else
{
if(info.data_width == 0)
{
strcpy(ret.print_string,ins[info.ins_line_num].pntchr);
}
if(info.data_width == 1)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*input_array,temp));
pt+=4;
while((*pt++ = *tep++) != '\0');
}
if(info.data_width == 2)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*input_array,temp));
strcat(ret.print_string,hex2char(*(input_array+1),temp));
pt+=6;
while((*pt++ = *tep++) != '\0');
}
if(info.data_width == 3)
{
while((*pt++ = *tep++) != '$');
strcat(ret.print_string,"0x");
strcat(ret.print_string,hex2char(*input_array,temp));
strcat(ret.print_string,hex2char(*(input_array+1),temp));
strcat(ret.print_string,hex2char(*(input_array+2),temp));
pt+=8;
while((*pt++ = *tep++) != '\0');
}
}
ret.use_legth = info.ins_width + info.data_width;
return ret;
}
int main()
{
int bin_cnt = 0;
int i = 0;
uint line_num = 0x8000;
unsigned long long int code = 0;
char tmp[200];
char temp[20];
FILE *fp;
ins_info insf;
print_ret retu;
if((fp=fopen("C:\\Users\\Administrator\\Desktop\\stm8ASM.txt","w+"))==NULL) {
printf("File cannot be opened/n");
exit(0);
}else printf("File opened for writing/n");
for(bin_cnt =0x80 ;bin_cnt < 376*16;)
{
insf = search_ins(tt_bin[bin_cnt],tt_bin[bin_cnt + 1]);
retu = print_asm(insf,&tt_bin[bin_cnt]);
code = 0;
for(i = 0;i<retu.use_legth;i++)
{
code |= tt_bin[bin_cnt + i];
code <<= 8;
}
code >>= 8;
clr_str(tmp);
clr_str(temp);
snprintf(temp,12,"0x%x : \t",bin_cnt+0x8000);
strncat(tmp,temp,strlen(temp));
clr_str(temp);
snprintf(temp,15,"%-15x \t ",code);
strncat(tmp,temp,strlen(temp));
clr_str(temp);
strncat(tmp,retu.print_string,strlen(retu.print_string));
strncat(tmp,"\n",2);
fputs(tmp,fp);
bin_cnt += retu.use_legth;
}
fclose(fp);
return 0;
}