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

昨日は台風みたいな雨の中作業ですよ。てーへんでした。
まぁ、いいや。


いや、10分しか作業時間取れなかったので、とりあえず、コンパイル通して、
コメントつけて終了みたいな。
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() {
	bool b; // ダミー
	foreach(char[] c; (cast(char[])read("asm.cas")).split("\r\n")){
		if (c.length == 0) continue;
		switch (c.split(" ")[1]) {
		case "LD":  b = r1r2(0x14, c) | radrx(0x10, c); break;
		case "ST":  radrx(0x11, c); break;
		case "LAD": radrx(0x12, c); break;
		case "ADDA":b = r1r2(0x24, c) | radrx(0x20, c); break;
		case "ADDL":b = r1r2(0x26, c) | radrx(0x22, c); break;
 		case "SUBA":b = r1r2(0x25, c) | radrx(0x21, c); break;
		case "SUBL":b = r1r2(0x27, c) | radrx(0x23, c); break;
		case "AND": b = r1r2(0x34, c) | radrx(0x30, c); break;
		case "OR":  b = r1r2(0x35, c) | radrx(0x31, c); break;
		case "XOR": b = r1r2(0x36, c) | radrx(0x32, c); break;
		case "CPA": b = r1r2(0x44, c) | radrx(0x40, c); break;
		case "CPL": b = 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 (c == regs[i]) {
			return i;
		}
	}
	return -1;
}

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

/**
 * 
 */
bool 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);
	return true;
}

/**
 * 
 */
void adrx(ubyte b, char[] c) {
	p(b);
}

/**
 * 
 */
void r(byte b, char[] c) {
	p(b);
}

/**
 * 1バイト出力
 */
void p(int a) {
	printf("0x%02x,", a);
}

/**
 * 改行を表示する。
 */
void ln() {
	printf("\n");
}