/* Very Simple Compiler $Id: s-code-09.c,v 1.1 96/11/16 01:15:12 kono Exp Locker: kono $ */ #include "s-compile.h" int label = 0; char *comments = "*****"; #define O_SUB 1 #define O_ADD 2 #define O_MUL 3 #define O_DIV 4 char *intro[] = { " ORG $100\n", "variable EQU 0\n", "main\n", " LDS #$FF00\n", " LDY #4096\n", " PSHS U\n", " LEAU ,S\n", " LDD #3\n", NULL }; char *ending[] = { " SYNC\n", " LEAS 2,S\n", " PULS U,PC\n", "\n", NULL }; void emit_push() { printf("\tPSHS D\n"); } void emit_compare() { printf("\tTFR D,X\n"); printf("\tCLRA\n"); printf("\tCLRB\n"); printf("\tCMPX ,S++\n"); printf("\tBGE L%d\n",label); printf("\tINCB\n"); printf("L%d\n",label); label++; } void emit_store(assign) int assign; { printf("\tSTD %d,Y\n",assign*2); } char *opcode[] = { "", "SUBD", "ADDD", "", /* no multiply for 6809 */ "" /* no division for 6809 */ }; void emit_calc(op) int op; { if(op==O_SUB) { printf("\t%s ,S++\n",opcode[op]); printf("\tNEGA\n"); printf("\tNEGB\n"); printf("\tSBCA #0\n"); } else if(op==O_ADD) { printf("\t%s ,S++\n",opcode[op]); } else if(op==O_SUB_R) { printf("\tsubd ,S++\n"); } else if(op==O_MUL) { printf("\tLDX ,S++\n",opcode[op]); printf("\tLBSR _MULTI\n"); } else if(op==O_DIV) { printf("\tLDX ,S++\n",opcode[op]); printf("\tEXG D,X\n"); printf("\tLBSR _DIVIDE\n"); } else if(op==O_DIV_R) { printf("\tLDX ,S++\n",opcode[op]); printf("\tLBSR _DIVIDE\n"); } } void emit_value(d) int d; { printf("\tLDD #%d\n",d); } void emit_load(d) int d; { printf("\tLDD %d,Y\n",d*2); } void emit_comment() { if (before < ptr) { putchar('*'); putchar('*'); putchar(' '); while (before < ptr) { if(*before && *before!='\n') { putchar(*before); } before++; } putchar('\n'); } } void emit_print() { printf("\tLBSR print\n"); } void emit_intro() { char **iptr; for(iptr=intro;*iptr;iptr++) { printf("%s",*iptr); } } void emit_ending() { char **iptr; for(iptr=ending;*iptr;iptr++) { printf("%s",*iptr); } fflush(stdout); system("/bin/cat ending.09"); } /* end */