#include #include #include #include "CASL.h" #include "debug.h" #define MAX_CASL_LINES 1000 #define STRING_TABLE_SIZE 500 /* defined in debug.c */ extern int Mode; void optimize(); CaslCode CaslLines[MAX_CASL_LINES]; int CLp=0; int label_no=0; char *newLabel() { char *l = malloc(7); sprintf(l,"L%05d",label_no++); return l; } void label(char *label) { CaslLines[CLp].label = label; } void C3(char *code, char *op1, char *op2, char *op3) { CaslLines[CLp].code = code; CaslLines[CLp].op1 = op1; CaslLines[CLp].op2 = op2; CaslLines[CLp].op3 = op3; CaslLines[CLp].comment = NULL; CLp++; CaslLines[CLp].label = NULL; if (Mode & OPTIMIZE) optimize(); } char *d(int n) { char *s = malloc(7); sprintf(s,"%d",n); return s; } void comment(char *com) { CaslLines[CLp-1].comment = com; } void dumpCode() { int i; for (i=0; i= 2 && strcmp(CaslLines[CLp-2].code,"PUSH") == 0 && strcmp(CaslLines[CLp-1].code,"POP") == 0 && CaslLines[CLp-1].label == NULL) { CaslLines[CLp-2].code = "LAD"; CaslLines[CLp-2].op3 = CaslLines[CLp-2].op2; CaslLines[CLp-2].op2 = CaslLines[CLp-2].op1; CaslLines[CLp-2].op1 = CaslLines[CLp-1].op1; CLp--; } if (CLp >= 1 && strcmp(CaslLines[CLp-1].code,"LAD") == 0 && CaslLines[CLp-1].op3 != NULL && strcmp(CaslLines[CLp-1].op1,CaslLines[CLp-1].op3) == 0 && strcmp(CaslLines[CLp-1].op2,"0") == 0) { CaslLines[CLp-1].code = "DS"; CaslLines[CLp-1].op1 = "0"; CaslLines[CLp-1].op2 = CaslLines[CLp-1].op3 = NULL; } if (CLp>=2 && strcmp(CaslLines[CLp-2].code,"DS") == 0 && strcmp(CaslLines[CLp-2].op1,"0") == 0 && CaslLines[CLp-1].label == NULL) { CaslLines[CLp-2].code = CaslLines[CLp-1].code; CaslLines[CLp-2].op1 = CaslLines[CLp-1].op1; CaslLines[CLp-2].op2 = CaslLines[CLp-1].op2; CaslLines[CLp-2].op3 = CaslLines[CLp-1].op3; CLp--; } }