ドカタしながら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"); }