| Code: // 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; }
| |