Skip to content

Instantly share code, notes, and snippets.

@binji
Created June 12, 2020 19:59

Revisions

  1. binji created this gist Jun 12, 2020.
    287 changes: 287 additions & 0 deletions chip8.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,287 @@
    export memory mem(initial: 1, max: 0);

    global g_a:int = 512;
    global g_b:int = 144;
    global g_c:int = 0;
    global g_d:int = 0;
    global g_e:int = 0;

    data d_pPpPPPP(offset: 0) =
    "\f0\90\90\90\f0` p\f0\10\f0\80\f0\f0\10\f0\10\f0\a0\a0\f0 \f0\80\f0"
    "\10\f0\f0\80\f0\90\f0\f0\10\10\10\10\f0\90\f0\90\f0\f0\90\f0\10\f0\f0\90"
    "\f0\90\90\f0PpP\f0\f0\80\80\80\f0\f0PPP\f0\f0\80\f0\80\f0\f0\80\f0\80\80"
    "";

    import function Math_random():float;

    export function run(a:int) {
    var h:int;
    var k:int;
    var j:int;
    var e:int;
    var i:int;
    var e:int;
    var i:int;
    var e:int;
    var f:int;
    var i:int;
    var e:int;
    var i:int;
    var h:int;
    var f:int;
    var e:int;
    var f:int;
    var e:int;
    var f:int;
    var e:int;
    var f:int;
    var e:int;
    var f:int;
    var e:int;
    var e:int;
    var e:int;
    var f:int;
    var e:int;
    var f:int;
    var f:int;
    var f:int;
    var f:int;
    var e:int;
    var f:int;
    var e:int;
    var f:int;
    var f:int;
    var e:int;
    var f:int;
    var j:int;
    var j:int;
    var i:int;
    var f:int;
    var e:int;
    var s:long;
    var g:int;
    var h:int;
    var g:int;
    var e:int;
    var i:int;
    var i:int;
    var e:int;
    var i:int;
    var e:int;
    var e:int;
    var e:int;
    var e:int;
    var e:int;
    var e:int;
    var d:int;
    var m:int;
    var n:int;
    var l:int;
    var n:int;
    var n:int;
    var n:int;
    var d:int;
    var k:int;
    var d:int;
    var e:int;
    var g:int;
    var d:int;
    var e:int;
    var k:int;
    var q:int_ptr;
    var c:int;
    var c:int;
    if (g_d) { g_d = g_d - 1 }
    if (g_e) { g_e = g_e - 1 }
    loop L_d {
    g_a =
    {
    e =
    {
    e =
    {
    ({
    k = g_a + 2;
    c = g_a[0]:ubyte;
    d = c & 15;
    e = d[96]:ubyte;
    i = g_a[1]:ubyte;
    f = (i >> 4)[96]:ubyte;
    h = i & 15;
    j = d << 8 | i;
    br_table[B_aa, B_y, B_z, B_x, B_w, B_v, B_u, B_t, B_s, B_r, B_q, B_p, B_o, B_n, B_m, ..B_l](
    c >> 4);
    label B_aa:
    if (h) {
    k = g_b[0]:ushort;
    g_b = g_b + 2;
    goto B_f;
    } else {
    l = 12544;
    m = 4096;
    d = 255;
    goto B_j;
    }
    label B_z:
    g_b = g_b - 2;
    g_b[0]:short = k;
    label B_y:
    j;
    goto B_e;
    label B_x:
    e == i;
    goto B_i;
    label B_w:
    e != i;
    goto B_i;
    label B_v:
    e == f;
    goto B_i;
    label B_u:
    i;
    goto B_g;
    label B_t:
    e + i;
    goto B_g;
    label B_s:
    br_table[B_ka, B_ja, B_ia, B_ha, B_ga, B_fa, B_ea, B_da, ..B_ca](h)
    label B_ka:
    f;
    goto B_g;
    label B_ja:
    e | f;
    goto B_g;
    label B_ia:
    e & f;
    goto B_g;
    label B_ha:
    e ^ f;
    goto B_g;
    label B_ga:
    e = e + f;
    g = e >> 8;
    e;
    goto B_h;
    label B_fa:
    g = e >= f;
    e - f;
    goto B_h;
    label B_ea:
    g = f & 1;
    f >> 1;
    goto B_h;
    label B_da:
    g = f >= e;
    f - e;
    goto B_h;
    label B_ca:
    g = f >> 7;
    f << 1;
    goto B_h;
    label B_r:
    e != f;
    goto B_i;
    label B_q:
    g_c = j;
    goto B_f;
    label B_p:
    j + 0[96]:ubyte;
    goto B_e;
    label B_o:
    i32_trunc_f32_u(Math_random() * 256.0f) & i;
    goto B_g;
    label B_n:
    g = 0;
    n = 0;
    loop L_la {
    var o:long_ptr = 31 - (f + n & 31) << 3;
    var r:long =
    i64_extend_i32_u((g_c + n)[0]:ubyte) >> i64_extend_i32_u(e) + 8L;
    o[512] = (s = o[512]) ^ r;
    g = g | (s & r) != 0L;
    n = n + 1;
    if (n < h) continue L_la;
    }
    0[111]:byte = g;
    goto B_f;
    label B_m:
    (0[40]:ushort >> e & 1) ^ i == 161;
    goto B_i;
    label B_l:
    br_table[B_ta, B_sa, B_ra, B_qa, B_qa, B_pa, B_oa, B_oa, B_oa, B_oa, B_na, B_na, ..B_ma](
    i >> 3)
    label B_ta:
    g_d;
    goto B_g;
    label B_sa:
    var b:int = 0[40]:ushort;
    if (b) {
    ctz(b);
    goto B_g;
    }
    goto B_c;
    label B_ra:
    g_d = e;
    goto B_f;
    label B_qa:
    if (i == 24) { g_e = e } else { g_c = g_c + e & 65535 }
    goto B_f;
    label B_pa:
    g_c = (e & 15) * 5;
    goto B_f;
    label B_oa:
    g_c[0]:byte = e / 100 % 10;
    g_c[1]:byte = e / 10 % 10;
    g_c[2]:byte = e % 10;
    goto B_f;
    label B_na:
    l = 96;
    m = g_c;
    goto B_k;
    label B_ma:
    l = g_c;
    m = 96;
    label B_k:
    g_c = g_c + d + 1 & 65535;
    label B_j:
    n = 0;
    loop L_wa {
    (m + n)[0]:byte = (l + n)[0]:ubyte;
    n = n + 1;
    if (n <= d) continue L_wa;
    }
    goto B_f;
    label B_i:
    } <<
    1) +
    k;
    goto B_e;
    label B_h:
    }
    d[96]:byte = e;
    0[111]:byte = g;
    goto B_f;
    label B_g:
    }
    d[96]:byte = e;
    label B_f:
    k;
    label B_e:
    }
    a = a - 1;
    if (a) continue L_d;
    }
    label B_c:
    var p:ubyte_ptr = 256;
    loop L_xa {
    c = p[4095];
    loop L_ya {
    q[1088] = if (c & 128) { -1 } else { -16777216 }
    c = c << 1;
    q = q + 4;
    if (q & 31) continue L_ya;
    }
    p = p - 1;
    if (p) continue L_xa;
    }
    }