Code: Select all
// RASM2MAC.CPP - Alexander Shabarshin 01.03.2002
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MNEMO 244
char mnemo[MNEMO][24] = {
"LXI_B,$ld\tbc,~",
"LXI_D,$ld\tde,~",
"LXI_H,$ld\thl,~",
"LXI_SP,$ld\tsp,~",
"STAX_B$ld\t(bc),a",
"STAX_D$ld\t(de),a",
"SHLD$ld\t(~),hl",
"STA$ld\t(~),a",
"INX_B$inc\tbc",
"INX_D$inc\tde",
"INX_H$inc\thl",
"INX_SP$inc\tsp",
"INR_B$inc\tb",
"INR_D$inc\td",
"INR_H$inc\th",
"INR_M$inc\t(hl)",
"DCR_B$dec\tb",
"DCR_D$dec\td",
"DCR_H$dec\th",
"DCR_M$dec\t(hl)",
"MVI_B,$ld\tb,~",
"MVI_D,$ld\td,~",
"MVI_H,$ld\th,~",
"MVI_M,$ld\t(hl),~",
"DAD_B$add\thl,bc",
"DAD_D$add\thl,de",
"DAD_H$add\thl,hl",
"DAD_SP$add\thl,sp",
"LDAX_B$ld\ta,(bc)",
"LDAX_D$ld\ta,(de)",
"LHLD$ld\thl,(~)",
"LDA$ld\ta,(~)",
"DCX_B$dec\tbc",
"DCX_D$dec\tde",
"DCX_H$dec\thl",
"DCX_SP$dec\tsp",
"INR_C$inc\tc",
"INR_E$inc\te",
"INR_L$inc\tl",
"INR_A$inc\ta",
"DCR_C$dec\tc",
"DCR_E$dec\te",
"DCR_L$dec\tl",
"DCR_A$dec\ta",
"MVI_C,$ld\tc,~",
"MVI_E,$ld\te,~",
"MVI_L,$ld\tl,~",
"MVI_A,$ld\ta,~",
"MOV_B,B$ld\tb,b",
"MOV_B,C$ld\tb,c",
"MOV_B,D$ld\tb,d",
"MOV_B,E$ld\tb,e",
"MOV_B,H$ld\tb,h",
"MOV_B,L$ld\tb,l",
"MOV_B,M$ld\tb,(hl)",
"MOV_B,A$ld\tb,a",
"MOV_C,B$ld\tc,b",
"MOV_C,C$ld\tc,c",
"MOV_C,D$ld\tc,d",
"MOV_C,E$ld\tc,e",
"MOV_C,H$ld\tc,h",
"MOV_C,L$ld\tc,l",
"MOV_C,M$ld\tc,(hl)",
"MOV_C,A$ld\tc,a",
"MOV_D,B$ld\td,b",
"MOV_D,C$ld\td,c",
"MOV_D,D$ld\td,d",
"MOV_D,E$ld\td,e",
"MOV_D,H$ld\td,h",
"MOV_D,L$ld\td,l",
"MOV_D,M$ld\td,(hl)",
"MOV_D,A$ld\td,a",
"MOV_E,B$ld\te,b",
"MOV_E,C$ld\te,c",
"MOV_E,D$ld\te,d",
"MOV_E,E$ld\te,e",
"MOV_E,H$ld\te,h",
"MOV_E,L$ld\te,l",
"MOV_E,M$ld\te,(hl)",
"MOV_E,A$ld\te,a",
"MOV_H,B$ld\th,b",
"MOV_H,C$ld\th,c",
"MOV_H,D$ld\th,d",
"MOV_H,E$ld\th,e",
"MOV_H,H$ld\th,h",
"MOV_H,L$ld\th,l",
"MOV_H,M$ld\th,(hl)",
"MOV_H,A$ld\th,a",
"MOV_L,B$ld\tl,b",
"MOV_L,C$ld\tl,c",
"MOV_L,D$ld\tl,d",
"MOV_L,E$ld\tl,e",
"MOV_L,H$ld\tl,h",
"MOV_L,L$ld\tl,l",
"MOV_L,M$ld\tl,(hl)",
"MOV_L,A$ld\tl,a",
"MOV_M,B$ld\t(hl),b",
"MOV_M,C$ld\t(hl),c",
"MOV_M,D$ld\t(hl),d",
"MOV_M,E$ld\t(hl),e",
"MOV_M,H$ld\t(hl),h",
"MOV_M,L$ld\t(hl),l",
"MOV_M,A$ld\t(hl),a",
"MOV_A,B$ld\ta,b",
"MOV_A,C$ld\ta,c",
"MOV_A,D$ld\ta,d",
"MOV_A,E$ld\ta,e",
"MOV_A,H$ld\ta,h",
"MOV_A,L$ld\ta,l",
"MOV_A,M$ld\ta,(hl)",
"MOV_A,A$ld\ta,a",
"ADD_B$add\ta,b",
"ADD_C$add\ta,c",
"ADD_D$add\ta,d",
"ADD_E$add\ta,e",
"ADD_H$add\ta,h",
"ADD_L$add\ta,l",
"ADD_M$add\ta,(hl)",
"ADD_A$add\ta,a",
"ADC_B$adc\ta,b",
"ADC_C$adc\ta,c",
"ADC_D$adc\ta,d",
"ADC_E$adc\ta,e",
"ADC_H$adc\ta,h",
"ADC_L$adc\ta,l",
"ADC_M$adc\ta,(hl)",
"ADC_A$adc\ta,a",
"SUB_B$sub\tb",
"SUB_C$sub\tc",
"SUB_D$sub\td",
"SUB_E$sub\te",
"SUB_H$sub\th",
"SUB_L$sub\tl",
"SUB_M$sub\t(hl)",
"SUB_A$sub\ta",
"SBB_B$sbc\ta,b",
"SBB_C$sbc\ta,c",
"SBB_D$sbc\ta,d",
"SBB_E$sbc\ta,e",
"SBB_H$sbc\ta,h",
"SBB_L$sbc\ta,l",
"SBB_M$sbc\ta,(hl)",
"SBB_A$sbc\ta,a",
"ANA_B$and\tb",
"ANA_C$and\tc",
"ANA_D$and\td",
"ANA_E$and\te",
"ANA_H$and\th",
"ANA_L$and\tl",
"ANA_M$and\t(hl)",
"ANA_A$and\ta",
"XRA_B$xor\tb",
"XRA_C$xor\tc",
"XRA_D$xor\td",
"XRA_E$xor\te",
"XRA_H$xor\th",
"XRA_L$xor\tl",
"XRA_M$xor\t(hl)",
"XRA_A$xor\ta",
"ORA_B$or\tb",
"ORA_C$or\tc",
"ORA_D$or\td",
"ORA_E$or\te",
"ORA_H$or\th",
"ORA_L$or\tl",
"ORA_M$or\t(hl)",
"ORA_A$or\ta",
"CMP_B$cp\tb",
"CMP_C$cp\tc",
"CMP_D$cp\td",
"CMP_E$cp\te",
"CMP_H$cp\th",
"CMP_L$cp\tl",
"CMP_M$cp\t(hl)",
"CMP_A$cp\ta",
"RNZ$ret\tnz",
"RNC$ret\tnc",
"RPO$ret\tpo",
"POP_B$pop\tbc",
"POP_D$pop\tde",
"POP_H$pop\thl",
"POP_PSW$pop\taf",
"JNZ$jp\tnz,~",
"JNC$jp\tnc,~",
"JPO$jp\tpo,~",
"JMP$jp\t~",
"OUT$out\t(~),a",
"XTHL$ex\t(sp),hl",
"CNZ$call\tnz,~",
"CNC$call\tnc,~",
"CPO$call\tpo,~",
"PUSH_B$push\tbc",
"PUSH_D$push\tde",
"PUSH_H$push\thl",
"PUSH_PSW$push\taf",
"ADI$add\ta,~",
"SUI$sub\t~",
"ANI$and\t~",
"ORI$or\t~",
"RST_0$rst\t#00",
"RST_2$rst\t#10",
"RST_4$rst\t#20",
"RST_6$rst\t#30",
"RET$ret",
"PCHL$jp\t(hl)",
"SPHL$ld\tsp,hl",
"XCHG$ex\tde,hl",
"CPE$call\tpe,~",
"CALL$call\t~",
"ACI$adc\ta,~",
"SBI$sbc\t~",
"XRI$xor\t~",
"CPI$cp\t~",
"RST_1$rst\t#08",
"RST_3$rst\t#18",
"RST_5$rst\t#28",
"RST_7$rst\t#38",
"RLC$rlca",
"RAL$rla",
"DAA$daa",
"STC$scf",
"RRC$rrca",
"RAR$rra",
"CMA$cpl",
"CMC$ccf",
"CP$call\tp,~", // !!!
"JP$jp\tp,~", // !!!
"RP$ret\tp", // !!!
"EI$ei", // !!!
"DI$di", // !!!
"CZ$call\tz,~", // !!!
"CC$call\tc,~", // !!!
"CM$call\tm,~", // !!!
"JZ$jp\tz,~",
"JC$jp\tc,~",
"JPE$jp\tpe,~",
"JM$jp\tm,~",
"IN$in\ta,(~)",
"RZ$ret\tz",
"RC$ret\tc",
"RPE$ret\tpe",
"RM$ret\tm",
"HLT$halt",
"NOP$nop",
};
int main(int argc,char **argv)
{
int i,j,k;
FILE *fi,*fo;
char str[256],st[256],st2[100],*po,*p2,*p3;
printf("\nRASM2MAC, Copyright (c) 2002, Alexander Shabarshin\n");
if(argc<2)
{
printf("\n\nRASM2MAC old.a new.a\n\n");
return 0;
}
fi = fopen(argv[1],"rt");
if(fi==NULL) return 0;
fo = fopen(argv[2],"wt");
if(fo==NULL){fclose(fi);return 0;}
while(1)
{
fgets(str,255,fi);
if(feof(fi)) break;
j = 0;
k = 0;
for(i=0;i<strlen(str);i++)
{
if(str[i]=='@') str[i]='_';
if(str[i]=='\\')
{ if(k) str[i]='/';
else str[i]=';';
}
if(str[i]!='\n'&&str[i]!='\r') str[j++]=str[i];
if(str[i]!=' '&&str[i]!='\t') k=1;
else k=0;
}
str[j] = 0;
while(j && (str[j-1]==' '||str[j-1]=='\t')) str[--j]=0;
if(*str=='+')
{
sprintf(st2,"include %s.a",&str[1]);
strcpy(str,st2);
}
for(i=0;i<MNEMO;i++)
{
strcpy(st2,mnemo[i]);
p2 = strchr(st2,'$');
*p2 = 0; p2++;
po = strstr(str,st2);
// if(po!=NULL) printf("%s|%s\n",str,st2);
if(po!=NULL && (*str==' '||*str=='\t'))
{
for(j=1,p3=str;p3!=po;p3++)
{
if(*p3!=' '&&*p3!='\t') j=0;
}
}
p3 = strchr(str,';');
if(p3==NULL) p3=po;
if(po!=NULL && po>str && (po[-1]==' '||po[-1]=='\t') && po<=p3 && j)
{
if(*str==' ' || *str=='\t') strcpy(st,"\t");
else
{
*po = 0;
strcpy(st,str);
}
p3 = strchr(p2,'~');
if(p3==NULL)
{
strcat(st,p2);
}
else
{
*p3 = 0; p3++;
strcat(st,p2);
p2 = &po[strlen(st2)];
while(*p2==' '||*p2=='\t') p2++;
strcat(st,p2);
strcat(st,p3);
}
strcpy(str,st);
break;
}
}
if(*str!='*')
for(i=0;i<strlen(str);i++)
str[i]=tolower(str[i]);
fprintf(fo,"%s\n",str);
}
fclose(fi);
fclose(fo);
return 1;
}