ドカタしながらCOMET II用アセンブラを30日で作る日記(1日目)

おそらく突然、1,2日でゴリゴリすすんでおわりそうだけど、
COMET II用アセンブラくらいなら30日くらいでつくれるんじゃないかと期待しつつ、
作ってみることにしました。
眠いのでココまで。
駄目駄目だなぁ。

>>|
import std.file;
import std.string;
ushort reg;
enum {
GR0 = 0,
GR1 = 1,
GR2 = 2,
GR3 = 3,
GR4 = 4,
GR5 = 5,
GR6 = 6,
GR7 = 7,
SP = 8,
PR = 9,
FR = 10,

OF = 1,
SF = 2,
ZF = 4,
}
void main() {
foreach(char c; (cast(char)read("asm.cas")).split("\r\n")){
if (c.length == 0) continue;
switch (c.split(" ")[1]) {
case "LD": r1r2(0x14, c) | radrx(0x10, c); break;
case "ST": radrx(0x11, c); break;
case "LAD": radrx(0x12, c); break;
case "ADDA":r1r2(0x24, c) | radrx(0x20, c); break;
case "ADDL":r1r2(0x26, c) | radrx(0x22, c); break;
case "SUBA":r1r2(0x25, c) | radrx(0x21, c); break;
case "SUBL":r1r2(0x27, c) | radrx(0x23, c); break;
case "AND": r1r2(0x34, c) | radrx(0x30, c); break;
case "OR": r1r2(0x35, c) | radrx(0x31, c); break;
case "XOR": r1r2(0x36, c) | radrx(0x32, c); break;
case "CPA": r1r2(0x44, c) | radrx(0x40, c); break;
case "CPL": r1r2(0x45, c) | radrx(0x41, c); break;
case "SLA": radrx(0x50, c); break;
case "SRA": radrx(0x51, c); break;
case "SLL": radrx(0x52, c); break;
case "SRL": radrx(0x53, c); break;
case "JPL": adrx(0x65, c); break;
case "JMI": adrx(0x61, c); break;
case "JNZ": adrx(0x62, c); break;
case "JZE": adrx(0x63, c); break;
case "JOV": adrx(0x66, c); break;
case "JUMP":adrx(0x64, c); break;
case "PUSH":adrx(0x70, c); break;
case "POP": r(0x71, c); break;
case "CALL":adrx(0x80, c); break;
case "RET": p(0x81); break;
case "SVC": adrx(0xF0, c); break;
case "NOP": p(0x00); break;

default:
continue;
}
ln();
}
}


int regs(char c) {
char regs = ["GR0","GR1","GR2","GR3","GR4","GR5","GR6", "GR7"];
for (int i = 0; i < regs.length; i++) {
if (cp[j]==regs[i]) {
return i;
}
}
return -1;
}

bool r1r2(byte b, char c) {
char
cp = c.split(" ")[2].split(",");
int i;
int r[2];
r[0] = r[1] = -1;
for (j = 0; j < 2; j++) {
r[j] = regs(cp[j]);
if (r[j] == -1) return false;
}
p(b);
p((r[0]<<4) & r[1]);
return true;
}

void radrx(byte b, char c) {
char cp = c.split(" ")[2].split(",");
ushort a = atoi(cp[0]);
p((a >> 8) & 0xff);
p(a & 0xff);
if (cp.length > 1) {

}
p(b);
}

void adrx(byte b, char c) {
p(b);
}
void r(byte b, char
c) {
p(b);
}

void p(int a) {
printf("0x%02x,", a);
}

void ln() {
printf("\n");
}

<<