LoginSignup
0
0

More than 5 years have passed since last update.

概要

jsdoでchip8やってみた。
アセンブラ作ってみた。

写真

image

サンプルコード

function _arrayBufferToBase64(buffer) {
    var binary = '';
    var bytes = new Uint8Array(buffer);
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) 
    {
        binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
}
function tob(url) {
    var bin = atob(url);
    var buffer = new Uint8Array(bin.length);
    for (var i = 0; i < bin.length; i++)
    {
        buffer[i] = bin.charCodeAt(i);
    }
    var blob = new Blob([buffer.buffer], {
        type : 'application/octet-binary'
    });
    var blob_url = window.URL.createObjectURL(blob);
    return blob_url;
}
function run() {
    var c1, 
        c2, 
        c3, 
        a, 
        i, 
        j;
    var pc = 0;
    var la = new Array(10);
    var r = new Array(100);
    var src = document.getElementById('src0').value;
    var m = src.split("\n");
    for (j = 0; j < m.length; j++)
    {
        var cm = m[j].split("  ");
        if (cm[0] != "")
        {
            la[cm[0]] = pc + 2;
        }
        switch (cm[1])
        {
        case "disp":
            var x = 0;
            switch (cm[2])
            {
            case "v0":
                x = 0;
            break;
            case "v1":
                x = 1;
            break;        
            case "v2":
                x = 2;
            break;        
            case "v3":
                x = 3;
            break;        
            case "v4":
                x = 4;
            break;        
            case "v5":
                x = 5;
            break;
            case "v6":
                y = 6;
            break;            
            case "v7":
                x = 7;
            break;        
            case "v8":
                x = 8;
            break;        
            case "v9":
                x = 9; 
            break;        
            case "v10":
                x = 10;
            break;        
            case "v11":
                x = 11;
            break;        
            case "v12":
                x = 12;
            break;        
            case "v13":
                x = 13;
            break;        
            case "v14":
                x = 14;
            break;        
            case "v15":
                x = 15;
            break;        
            }
            var y = 0;
            switch (cm[3])
            {
            case "v0":
                y = 0;
            break;        
            case "v1":
                y = 1;
            break;        
            case "v2":
                y = 2;
            break;        
            case "v3":
                y = 3;
            break;        
            case "v4":
                y = 4;
            break;        
            case "v5":
                y = 5;
            break;
            case "v6":
                y = 6;
            break;            
            case "v7":
                y = 7;
            break;        
            case "v8":
                y = 8;
            break;        
            case "v9":
                y = 9;
            break;        
            case "v10":
                y = 10;
            break;        
            case "v11":
                y = 11;
            break;        
            case "v12":
                y = 12;
            break;        
            case "v13":
                y = 13;
            break;        
            case "v14":
                y = 14;
            break;        
            case "v15":
                y = 15;
            break;        
            }    
            r[pc] = 0xD0 + x;
            pc++;
            r[pc] = y * 16 + Number(cm[4]);
            pc++;
        break;
        case "add":
            if (cm[2] == "I")
            {
                var x = 0;
                switch (cm[3])
                {
                case "v0":
                    x = 0;
                break;        
                case "v1":
                    x = 1;
                break;        
                case "v2":
                    x = 2;
                break;        
                case "v3":
                    x = 3;
                break;        
                case "v4":
                    x = 4;
                break;        
                case "v5":
                    x = 5;
                break;  
                case "v6":
                    y = 6;
                break;            
                case "v7":
                    x = 7;
                break;        
                case "v8":
                    x = 8;
                break;        
                case "v9":
                    x = 9;
                break;        
                case "v10":
                    x = 10;
                break;        
                case "v11":
                    x = 11;
                break;        
                case "v12":
                    x = 12;
                break;        
                case "v13":
                    x = 13;
                break;        
                case "v14":
                    x = 14;
                break;        
                case "v15":
                    x = 15;
                break;        
                }
                //alert(x);
                r[pc] = 0xF0 + x;
                pc++;
                r[pc] = 0x1E;
                pc++;
            }
            else if (cm[3].indexOf("v") > -1)
            {
                var x = 0;
                switch (cm[2])
                {
                case "v0":
                    x = 0;
                break;        
                case "v1":
                    x = 1;
                break;        
                case "v2":
                    x = 2;
                break;        
                case "v3":
                    x = 3;
                break;        
                case "v4":
                    x = 4;
                break;        
                case "v5":
                    x = 5;
                break;
                case "v6":
                    y = 6;
                break;            
                case "v7":
                    x = 7;
                break;        
                case "v8":
                    x = 8;
                break;        
                case "v9":
                    x = 9;
                break;        
                case "v10":
                    x = 10;
                break;        
                case "v11":
                    x = 11;
                break;        
                case "v12":
                    x = 12;
                break;        
                case "v13":
                    x = 13;
                break;        
                case "v14":
                    x = 14;
                break;        
                case "v15":
                    x = 15;
                break;        
                }
                var y = 0;
                switch (cm[3])
                {
                case "v0":
                    y = 0;
                break;        
                case "v1":
                    y = 1;
                break;        
                case "v2":
                    y = 2; 
                break;        
                case "v3":
                    y = 3; 
                break;        
                case "v4":
                    y = 4; 
                break;        
                case "v5":
                    y = 5; 
                break;
                case "v6":
                    y = 6;
                break;            
                case "v7":
                    y = 7; 
                break;        
                case "v8":
                    y = 8; 
                break;        
                case "v9":
                    y = 9; 
                break;        
                case "v10":
                    y = 10; 
                break;        
                case "v11":
                    y = 11; 
                break;        
                case "v12":
                    y = 12; 
                break;        
                case "v13":
                    y = 13; 
                break;        
                case "v14":
                    y = 14; 
                break;        
                case "v15":
                    y = 15; 
                break;       
                }            
                r[pc] = 0x80 + x;
                pc++;
                r[pc] = y * 16 + 4;
                pc++;
            }
            else
            {
                var x = 0;
                switch (cm[2])
                {
                case "v0":
                    x = 0;
                break;        
                case "v1":
                    x = 1;
                break;        
                case "v2":
                    x = 2; 
                break;        
                case "v3":
                    x = 3; 
                break;        
                case "v4":
                    x = 4; 
                break;        
                case "v5":
                    x = 5; 
                break;
                case "v6":
                    y = 6;
                break;            
                case "v7":
                    x = 7;
                break;        
                case "v8":
                    x = 8; 
                break;        
                case "v9":
                    x = 9; 
                break;        
                case "v10":
                    x = 10; 
                break;        
                case "v11":
                    x = 11; 
                break;        
                case "v12":
                    x = 12; 
                break;        
                case "v13":
                    x = 13; 
                break;        
                case "v14":
                    x = 14; 
                break;        
                case "v15":
                    x = 15; 
                break;        
                }
                r[pc] = 0x70 + x;
                pc++;
                r[pc] = cm[3];
                pc++;
            }
        break;
        case "load":
            if (cm[2] == "I")
            {
                r[pc] = 0xA0 + Math.floor(cm[3] / 256);
                pc++;
                r[pc] = cm[3] % 256;
                pc++;
            }
            else
            {
                var x = 0;
                switch (cm[2])
                {
                case "v0":
                    x = 0;
                break;        
                case "v1":
                    x = 1;
                break;        
                case "v2":
                    x = 2; 
                break;        
                case "v3":
                    x = 3; 
                break;        
                case "v4":
                    x = 4;
                break;        
                case "v5":
                    x = 5; 
                break;
                case "v6":
                    y = 6;
                break;           
                case "v7":
                    x = 7; 
                break;        
                case "v8":
                    x = 8; 
                break;        
                case "v9":
                    x = 9; 
                break;        
                case "v10":
                    x = 10; 
                break;        
                case "v11":
                    x = 11; 
                break;       
                case "v12":
                    x = 12; 
                break;        
                case "v13":
                    x = 13; 
                break;        
                case "v14":
                    x = 14; 
                break;        
                case "v15":
                    x = 15; 
                break;        
                }
                r[pc] = 0x60 + x;
                pc++;
                r[pc] = Number(cm[3]);
                pc++;
            }
        break;
        }
    }
    for (var a in la) 
    {

        for (i = 0; i < pc; i++)
        {
            if (r[i] == a)
            {

                c3 = la[a] - i - 4;
                r[i] = c3;
            }
        }
    }
    var b = _arrayBufferToBase64(r);
    var url1 = tob(b);
    var a = document.createElement('a');    
    a.download = "test.rom";
    a.href = url1;
    a.textContent = "Download rom";
    document.getElementById('out').appendChild(a);
}


成果物

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0