ref: fc93bb35a8cebade80d9f0b920bb93b2b78aa81d
dir: /cc2/code.c/
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <cc.h>
#include "cc2.h"
static char *opnames[] = {
[PUSH] = "PUSH", [POP] = "POP", [LD] = "LD", [ADD] = "ADD",
[RET] = "RET" , [ADDI]= "ADD", [LDI] = "LD", [ADDX] = "ADD",
[ADCX] = "ADC" , [LDX] = "LD" , [LDFX] = "LD"
};
static char *regnames[] = {
[AF] = "AF", [HL] = "HL", [DE] = "DE", [BC] = "BC", [IX] = "IX",
[IY] = "IY", [SP] = "SP", [A] = "A", [F] = "F", [B] = "B",
[C] = "C", [D] = "D", [E] = "E", [H] = "H", [L] = "L",
[IXL]= "IXL",[IXH]= "IXH",[IYL]= "IYL",[IYH]= "IYH", [I] = "I"
};
void
code(char op, ...)
{
va_list va;
uint8_t reg1, reg2;
TINT imm;
short off;
char *label;
va_start(va, op);
switch (op) {
case RET:
printf("\t%s\n", opnames[op]);
break;
case PUSH: case POP:
reg1 = va_arg(va, int);
printf("\t%s\t%s\n", opnames[op], regnames[reg1]);
break;
case ADD: case LD:
reg1 = va_arg(va, int);
reg2 = va_arg(va, int);
printf("\t%s\t%s,%s\n",
opnames[op], regnames[reg1], regnames[reg2]);
break;
case ADDI: case LDI:
reg1 = va_arg(va, int);
imm = va_arg(va, int);
printf("\t%s\t%s,%d\n", opnames[op], regnames[reg1], imm);
break;
case ADDX: case ADCX: case LDFX:
reg1 = va_arg(va, int);
reg2 = va_arg(va, int);
off = va_arg(va, int);
printf("\t%s\t%s,(%s%+d)\n",
opnames[op], regnames[reg1], regnames[reg2], off);
break;
case LDX:
reg1 = va_arg(va, int);
off = va_arg(va, int);
reg2 = va_arg(va, int);
printf("\t%s\t(%s%+d),%s\n",
opnames[op], regnames[reg1], off, regnames[reg2]);
break;
case ADDR:
label = va_arg(va, char *);
printf("%s:\n", label);
break;
}
va_end(va);
}