jsSID.MOS6510 = function(mem, sid) {

// other internal values
this.cycles = 0;
this.bval = 0;
this.wval = 0;

if(mem) {
        this.mem = mem;
} else {
        this.mem = new Array(65536);
        for(var i=0; i<65536; i++) {
                memory[i]=0;
        }
}

if(sid) {
        this.sid = sid;
} else {
        this.sid = null;
}

this.cpuReset();

}

jsSID.MOS6510.prototype.getmem = function(addr) {

//if (addr < 0 || addr > 65536) console.log("jsSID.MOS6510.getmem: out of range addr: " + addr + " (caller: " + arguments.caller + ")");
//if (addr == 0xdd0d) {
//      this.mem[addr] = 0;
//}
return this.mem[addr];

};

jsSID.MOS6510.prototype.setmem = function(addr, value) {

//if (addr < 0 || addr > 65535) console.log("jsSID.MOS6510.getmem: out of range addr: " + addr + " (caller: " + arguments.caller + ")");
//if (value < 0 || value > 255 ) console.log("jsSID.MOS6510.getmem: out of range value: " + value + " (caller: " + arguments.caller + ")");
if ((addr & 0xfc00) == 0xd400 && this.sid !== null) {
        this.sid.poke(addr & 0x1f, value);
        if (addr > 0xd418) {
                console.log("attempted digi poke:", addr, value);
                this.sid.pokeDigi(addr, value);
        }
} else {
        this.mem[addr] = value;
}

};

// just like pc++, but with bound check on pc after jsSID.MOS6510.prototype.pcinc = function(mode) {

var pc = this.pc++;
this.pc &= 0xffff;
return pc;

};

jsSID.MOS6510.prototype.getaddr = function(mode) {

var ad,ad2;
switch(mode) {
        case jsSID.MOS6510.mode.imp:
                this.cycles += 2;
                return 0;
        case jsSID.MOS6510.mode.imm:
                this.cycles += 2;
                return this.getmem(this.pcinc());
        case jsSID.MOS6510.mode.abs:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= this.getmem(this.pcinc()) << 8;
                return this.getmem(ad);
        case jsSID.MOS6510.mode.absx:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= 256 * this.getmem(this.pcinc());
                ad2 = ad + this.x;
                ad2 &= 0xffff;
                if ((ad2 & 0xff00) != (ad & 0xff00)) this.cycles++;
                return this.getmem(ad2);
        case jsSID.MOS6510.mode.absy:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= 256 * this.getmem(this.pcinc());
                ad2 = ad + this.y;
                ad2 &= 0xffff;
                if ((ad2 & 0xff00) != (ad & 0xff00)) this.cycles++;
                return this.getmem(ad2);
        case jsSID.MOS6510.mode.zp:
                this.cycles += 3;
                ad = this.getmem(this.pcinc());
                return this.getmem(ad);
        case jsSID.MOS6510.mode.zpx:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad += this.x;
                return this.getmem(ad & 0xff);
        case jsSID.MOS6510.mode.zpy:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad += this.y;
                return this.getmem(ad & 0xff);
        case jsSID.MOS6510.mode.indx:
                this.cycles += 6;
                ad = this.getmem(this.pcinc());
                ad += this.x;
                ad2 = this.getmem(ad & 0xff);
                ad++;
                ad2 |= this.getmem(ad & 0xff) << 8;
                return this.getmem(ad2);
        case jsSID.MOS6510.mode.indy:
                this.cycles += 5;
                ad = this.getmem(this.pcinc());
                ad2 = this.getmem(ad);
                ad2 |= this.getmem((ad + 1) & 0xff) << 8;
                ad = ad2 + this.y;
                ad &= 0xffff;
                if ((ad2 & 0xff00) != (ad & 0xff00)) this.cycles++;
                return this.getmem(ad);
        case jsSID.MOS6510.mode.acc:
                this.cycles += 2;
                return this.a;
}
console.log("getaddr: attempted unhandled mode");
return 0;

};

jsSID.MOS6510.prototype.setaddr = function(mode, val) {

var ad,ad2;
// FIXME: not checking pc addresses as all should be relative to a valid instruction
switch(mode) {
        case jsSID.MOS6510.mode.abs:
                this.cycles += 2;
                ad = this.getmem(this.pc - 2);
                ad |= 256 * this.getmem(this.pc - 1);
                this.setmem(ad, val);
                return;
        case jsSID.MOS6510.mode.absx:
                this.cycles += 3;
                ad = this.getmem(this.pc - 2);
                ad |= 256 * this.getmem(this.pc - 1);
                ad2 = ad + this.x;
                ad2 &= 0xffff;
                if ((ad2 & 0xff00) != (ad & 0xff00)) this.cycles--;
                this.setmem(ad2, val);
                return;
        case jsSID.MOS6510.mode.zp:
                this.cycles += 2;
                ad = this.getmem(this.pc - 1);
                this.setmem(ad, val);
                return;
        case jsSID.MOS6510.mode.zpx:
                this.cycles += 2;
                ad = this.getmem(this.pc - 1);
                ad += this.x;
                this.setmem(ad & 0xff, val);
                return;
        case jsSID.MOS6510.mode.acc:
                this.a = val;
                return;
}
console.log("setaddr: attempted unhandled mode");

};

jsSID.MOS6510.prototype.putaddr = function(mode, val) {

var ad,ad2;
switch(mode) {
        case jsSID.MOS6510.mode.abs:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= this.getmem(this.pcinc()) << 8;
                this.setmem(ad, val);
                return;
        case jsSID.MOS6510.mode.absx:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= this.getmem(this.pcinc()) << 8;
                ad2 = ad + this.x;
                ad2 &= 0xffff;
                this.setmem(ad2, val);
                return;
        case jsSID.MOS6510.mode.absy:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad |= this.getmem(this.pcinc()) << 8;
                ad2 = ad + this.y;
                ad2 &= 0xffff;
                if ((ad2 & 0xff00) != (ad & 0xff00)) this.cycles++;
                this.setmem(ad2, val);
                return;
        case jsSID.MOS6510.mode.zp:
                this.cycles += 3;
                ad = this.getmem(this.pcinc());
                this.setmem(ad, val);
                return;
        case jsSID.MOS6510.mode.zpx:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad += this.x;
                this.setmem(ad & 0xff, val);
                return;
        case jsSID.MOS6510.mode.zpy:
                this.cycles += 4;
                ad = this.getmem(this.pcinc());
                ad += this.y;
                this.setmem(ad & 0xff,val);
                return;
        case jsSID.MOS6510.mode.indx:
                this.cycles += 6;
                ad = this.getmem(this.pcinc());
                ad += this.x;
                ad2 = this.getmem(ad & 0xff);
                ad++;
                ad2 |= this.getmem(ad & 0xff) << 8;
                this.setmem(ad2, val);
                return;
        case jsSID.MOS6510.mode.indy:
                this.cycles += 5;
                ad = this.getmem(this.pcinc());
                ad2 = this.getmem(ad);
                ad2 |= this.getmem((ad + 1) & 0xff) << 8;
                ad = ad2 + this.y;
                ad &= 0xffff;
                this.setmem(ad, val);
                return;
        case jsSID.MOS6510.mode.acc:
                this.cycles += 2;
                this.a = val;
                return;
}
console.log("putaddr: attempted unhandled mode");

};

jsSID.MOS6510.prototype.setflags = function(flag, cond) {

if (cond) {
        this.p |= flag;
} else {
        this.p &= ~flag & 0xff;
}

};

jsSID.MOS6510.prototype.push = function(val) {

this.setmem(0x100 + this.s, val);
if (this.s) this.s--;

};

jsSID.MOS6510.prototype.pop = function() {

if (this.s < 0xff) this.s++;
return this.getmem(0x100 + this.s);

};

jsSID.MOS6510.prototype.branch = function(flag) {

var dist = this.getaddr(jsSID.MOS6510.mode.imm);
// FIXME: while this was checked out, it still seems too complicated
// make signed
if (dist & 0x80) {
        dist = 0 - ((~dist & 0xff) + 1);
}

// this here needs to be extracted for general 16-bit rounding needs
this.wval= this.pc + dist;
// FIXME: added boundary checks to wrap around. Not sure this is whats needed
if (this.wval < 0) this.wval += 65536;
this.wval &= 0xffff;
if (flag) {
        this.cycles += ((this.pc & 0x100) != (this.wval & 0x100)) ? 2 : 1;
        this.pc = this.wval;
}

};

jsSID.MOS6510.prototype.cpuReset = function() {

this.a  = 0;
this.x  = 0;
this.y  = 0;
this.p  = 0;
this.s  = 255;
this.pc = this.getmem(0xfffc);
this.pc |= 256 * this.getmem(0xfffd);

};

jsSID.MOS6510.prototype.cpuResetTo = function(npc, na) {

this.a  = na || 0;
this.x  = 0;
this.y  = 0;
this.p  = 0;
this.s  = 255;
this.pc = npc;

};

jsSID.MOS6510.prototype.cpuParse = function() {

var c;
this.cycles = 0;

var opc = this.getmem(this.pcinc());
var cmd = jsSID.MOS6510.opcodes[opc][0];
var addr = jsSID.MOS6510.opcodes[opc][1];

//console.log(opc, cmd, addr);

switch (cmd) {
        case jsSID.MOS6510.inst.adc:
                this.wval = this.a + this.getaddr(addr) + ((this.p & jsSID.MOS6510.flag.C) ? 1 : 0);
                this.setflags(jsSID.MOS6510.flag.C, this.wval & 0x100);
                this.a = this.wval & 0xff;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                this.setflags(jsSID.MOS6510.flag.V, ((this.p & jsSID.MOS6510.flag.C) ? 1 : 0) ^ ((this.p & jsSID.MOS6510.flag.N) ? 1 : 0));
                break;
        case jsSID.MOS6510.inst.and:
                this.bval = this.getaddr(addr);
                this.a &= this.bval;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        case jsSID.MOS6510.inst.asl:
                this.wval = this.getaddr(addr);
                this.wval <<= 1;
                this.setaddr(addr, this.wval & 0xff);
                this.setflags(jsSID.MOS6510.flag.Z, !this.wval);
                this.setflags(jsSID.MOS6510.flag.N, this.wval & 0x80);
                this.setflags(jsSID.MOS6510.flag.C, this.wval & 0x100);
                break;
        case jsSID.MOS6510.inst.bcc:
                this.branch(!(this.p & jsSID.MOS6510.flag.C));
                break;
        case jsSID.MOS6510.inst.bcs:
                this.branch(this.p & jsSID.MOS6510.flag.C);
                break;
        case jsSID.MOS6510.inst.bne:
                this.branch(!(this.p & jsSID.MOS6510.flag.Z));
                break;
        case jsSID.MOS6510.inst.beq:
                this.branch(this.p & jsSID.MOS6510.flag.Z);
                break;
        case jsSID.MOS6510.inst.bpl:
                this.branch(!(this.p & jsSID.MOS6510.flag.N));
                break;
        case jsSID.MOS6510.inst.bmi:
                this.branch(this.p & jsSID.MOS6510.flag.N);
                break;
        case jsSID.MOS6510.inst.bvc:
                this.branch(!(this.p & jsSID.MOS6510.flag.V));
                break;
        case jsSID.MOS6510.inst.bvs:
                this.branch(this.p & jsSID.MOS6510.flag.V);
                break;
        case jsSID.MOS6510.inst.bit:
                this.bval = this.getaddr(addr);
                this.setflags(jsSID.MOS6510.flag.Z, !(this.a & this.bval));
                this.setflags(jsSID.MOS6510.flag.N, this.bval & 0x80);
                this.setflags(jsSID.MOS6510.flag.V, this.bval & 0x40);
                break;
        case jsSID.MOS6510.inst.brk:
                pc=0;   // just quit per rockbox
                //this.push(this.pc & 0xff);
                //this.push(this.pc >> 8);
                //this.push(this.p);
                //this.setflags(jsSID.MOS6510.flag.B, 1);
                // FIXME: should Z be set as well?
                //this.pc = this.getmem(0xfffe);
                //this.cycles += 7;
                break;
        case jsSID.MOS6510.inst.clc:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.C, 0);
                break;
        case jsSID.MOS6510.inst.cld:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.D, 0);
                break;
        case jsSID.MOS6510.inst.cli:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.I, 0);
                break;
        case jsSID.MOS6510.inst.clv:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.V, 0);
                break;
        case jsSID.MOS6510.inst.cmp:
                this.bval = this.getaddr(addr);
                this.wval = this.a - this.bval;
                // FIXME: may not actually be needed (yay 2's complement)
                if(this.wval < 0) this.wval += 256;
                this.setflags(jsSID.MOS6510.flag.Z, !this.wval);
                this.setflags(jsSID.MOS6510.flag.N, this.wval & 0x80);
                this.setflags(jsSID.MOS6510.flag.C, this.a >= this.bval);
                break;
        case jsSID.MOS6510.inst.cpx:
                this.bval = this.getaddr(addr);
                this.wval = this.x - this.bval;
                // FIXME: may not actually be needed (yay 2's complement)
                if(this.wval < 0) this.wval += 256;
                this.setflags(jsSID.MOS6510.flag.Z, !this.wval);
                this.setflags(jsSID.MOS6510.flag.N, this.wval & 0x80);
                this.setflags(jsSID.MOS6510.flag.C, this.x >= this.bval);
                break;
        case jsSID.MOS6510.inst.cpy:
                this.bval = this.getaddr(addr);
                this.wval = this.y - this.bval;
                // FIXME: may not actually be needed (yay 2's complement)
                if(this.wval < 0) this.wval += 256;
                this.setflags(jsSID.MOS6510.flag.Z, !this.wval);
                this.setflags(jsSID.MOS6510.flag.N, this.wval & 0x80);
                this.setflags(jsSID.MOS6510.flag.C, this.y >= this.bval);
                break;
        case jsSID.MOS6510.inst.dec:
                this.bval = this.getaddr(addr);
                this.bval--;
                // FIXME: may be able to just mask this (yay 2's complement)
                if(this.bval < 0) this.bval += 256;
                this.setaddr(addr, this.bval);
                this.setflags(jsSID.MOS6510.flag.Z, !this.bval);
                this.setflags(jsSID.MOS6510.flag.N, this.bval & 0x80);
                break;
        case jsSID.MOS6510.inst.dex:
                this.cycles += 2;
                this.x--;
                // FIXME: may be able to just mask this (yay 2's complement)
                if(this.x < 0) this.x += 256;
                this.setflags(jsSID.MOS6510.flag.Z, !this.x);
                this.setflags(jsSID.MOS6510.flag.N, this.x & 0x80);
                break;
        case jsSID.MOS6510.inst.dey:
                this.cycles += 2;
                this.y--;
                // FIXME: may be able to just mask this (yay 2's complement)
                if(this.y < 0) this.y += 256;
                this.setflags(jsSID.MOS6510.flag.Z, !this.y);
                this.setflags(jsSID.MOS6510.flag.N, this.y & 0x80);
                break;
        case jsSID.MOS6510.inst.eor:
                this.bval = this.getaddr(addr);
                this.a ^= this.bval;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        case jsSID.MOS6510.inst.inc:
                this.bval = this.getaddr(addr);
                this.bval++;
                this.bval &= 0xff;
                this.setaddr(addr, this.bval);
                this.setflags(jsSID.MOS6510.flag.Z, !this.bval);
                this.setflags(jsSID.MOS6510.flag.N, this.bval & 0x80);
                break;
        case jsSID.MOS6510.inst.inx:
                this.cycles += 2;
                this.x++;
                this.x &= 0xff;
                this.setflags(jsSID.MOS6510.flag.Z, !this.x);
                this.setflags(jsSID.MOS6510.flag.N, this.x & 0x80);
                break;
        case jsSID.MOS6510.inst.iny:
                this.cycles += 2;
                this.y++;
                this.y &= 0xff;
                this.setflags(jsSID.MOS6510.flag.Z, !this.y);
                this.setflags(jsSID.MOS6510.flag.N, this.y & 0x80);
                break;
        case jsSID.MOS6510.inst.jmp:
                this.cycles += 3;
                this.wval = this.getmem(this.pcinc());
                this.wval |= 256 * this.getmem(this.pcinc());
                switch (addr) {
                        case jsSID.MOS6510.mode.abs:
                                this.pc = this.wval;
                                break;
                        case jsSID.MOS6510.mode.ind:
                                this.pc = this.getmem(this.wval);
                                this.pc |= 256 * this.getmem((this.wval + 1) & 0xffff);
                                this.cycles += 2;
                                break;
                }
                break;
        case jsSID.MOS6510.inst.jsr:
                this.cycles += 6;
                this.push(((this.pc + 1) & 0xffff) >> 8);
                this.push((this.pc + 1) & 0xff);
                this.wval = this.getmem(this.pcinc());
                this.wval |= 256 * this.getmem(this.pcinc());
                this.pc = this.wval;
                break;
        case jsSID.MOS6510.inst.lda:
                this.a = this.getaddr(addr);
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        case jsSID.MOS6510.inst.ldx:
                this.x = this.getaddr(addr);
                this.setflags(jsSID.MOS6510.flag.Z, !this.x);
                this.setflags(jsSID.MOS6510.flag.N, this.x & 0x80);
                break;
        case jsSID.MOS6510.inst.ldy:
                this.y = this.getaddr(addr);
                this.setflags(jsSID.MOS6510.flag.Z, !this.y);
                this.setflags(jsSID.MOS6510.flag.N, this.y & 0x80);
                break;
        case jsSID.MOS6510.inst.lsr:
                this.bval = this.getaddr(addr);
                this.wval = this.bval;
                this.wval >>= 1;
                this.setaddr(addr, this.wval & 0xff);
                this.setflags(jsSID.MOS6510.flag.Z, !this.wval);
                this.setflags(jsSID.MOS6510.flag.N, this.wval & 0x80);
                this.setflags(jsSID.MOS6510.flag.C, this.bval & 1);
                break;
        case jsSID.MOS6510.inst.nop:
                this.cycles += 2;
                break;
        case jsSID.MOS6510.inst.ora:
                this.bval = this.getaddr(addr);
                this.a |= this.bval;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        case jsSID.MOS6510.inst.pha:
                this.push(this.a);
                this.cycles += 3;
                break;
        case jsSID.MOS6510.inst.php:
                this.push(this.p);
                this.cycles += 3;
                break;
        case jsSID.MOS6510.inst.pla:
                this.a = this.pop();
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                this.cycles += 4;
                break;
        case jsSID.MOS6510.inst.plp:
                this.p = this.pop();
                this.cycles += 4;
                break;
        case jsSID.MOS6510.inst.rol:
                this.bval = this.getaddr(addr);
                c = (this.p & jsSID.MOS6510.flag.C) ? 1 : 0;
                this.setflags(jsSID.MOS6510.flag.C, this.bval & 0x80);
                this.bval <<= 1;
                this.bval |= c;
                this.bval &= 0xff;
                this.setaddr(addr, this.bval);
                this.setflags(jsSID.MOS6510.flag.N, this.bval & 0x80);
                this.setflags(jsSID.MOS6510.flag.Z, !this.bval);
                break;
        case jsSID.MOS6510.inst.ror:
                this.bval = this.getaddr(addr);
                c = (this.p & jsSID.MOS6510.flag.C) ? 128 : 0;
                this.setflags(jsSID.MOS6510.flag.C, this.bval & 1);
                this.bval >>= 1;
                this.bval |= c;
                this.setaddr(addr, this.bval);
                this.setflags(jsSID.MOS6510.flag.N, this.bval & 0x80);
                this.setflags(jsSID.MOS6510.flag.Z, !this.bval);
                break;
        case jsSID.MOS6510.inst.rti:
                // treat like RTS
        case jsSID.MOS6510.inst.rts:
                this.wval = this.pop();
                this.wval |= 256 * this.pop();
                this.pc = this.wval + 1;
                this.cycles += 6;
                break;
        case jsSID.MOS6510.inst.sbc:
                this.bval = this.getaddr(addr) ^ 0xff;
                this.wval = this.a + this.bval + (( this.p & jsSID.MOS6510.flag.C) ? 1 : 0);
                this.setflags(jsSID.MOS6510.flag.C, this.wval & 0x100);
                this.a = this.wval & 0xff;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a > 127);
                this.setflags(jsSID.MOS6510.flag.V, ((this.p & jsSID.MOS6510.flag.C) ? 1 : 0) ^ ((this.p & jsSID.MOS6510.flag.N) ? 1 : 0));
                break;
        case jsSID.MOS6510.inst.sec:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.C, 1);
                break;
        case jsSID.MOS6510.inst.sed:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.D, 1);
                break;
        case jsSID.MOS6510.inst.sei:
                this.cycles += 2;
                this.setflags(jsSID.MOS6510.flag.I, 1);
                break;
        case jsSID.MOS6510.inst.sta:
                this.putaddr(addr, this.a);
                break;
        case jsSID.MOS6510.inst.stx:
                this.putaddr(addr, this.x);
                break;
        case jsSID.MOS6510.inst.sty:
                this.putaddr(addr, this.y);
                break;
        case jsSID.MOS6510.inst.tax:
                this.cycles += 2;
                this.x = this.a;
                this.setflags(jsSID.MOS6510.flag.Z, !this.x);
                this.setflags(jsSID.MOS6510.flag.N, this.x & 0x80);
                break;
        case jsSID.MOS6510.inst.tay:
                this.cycles += 2;
                this.y = this.a;
                this.setflags(jsSID.MOS6510.flag.Z, !this.y);
                this.setflags(jsSID.MOS6510.flag.N, this.y & 0x80);
                break;
        case jsSID.MOS6510.inst.tsx:
                this.cycles += 2;
                this.x = this.s;
                this.setflags(jsSID.MOS6510.flag.Z, !this.x);
                this.setflags(jsSID.MOS6510.flag.N, this.x & 0x80);
                break;
        case jsSID.MOS6510.inst.txa:
                this.cycles += 2;
                this.a = this.x;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        case jsSID.MOS6510.inst.txs:
                this.cycles += 2;
                this.s = this.x;
                break;
        case jsSID.MOS6510.inst.tya:
                this.cycles += 2;
                this.a = this.y;
                this.setflags(jsSID.MOS6510.flag.Z, !this.a);
                this.setflags(jsSID.MOS6510.flag.N, this.a & 0x80);
                break;
        default:
        console.log("cpuParse: attempted unhandled instruction, opcode: ", opc);
}
return this.cycles;

};

jsSID.MOS6510.prototype.cpuJSR = function(npc, na) {

var ccl = 0;

this.a = na;
this.x = 0;
this.y = 0;
this.p = 0;
this.s = 255;
this.pc = npc;
this.push(0);
this.push(0);

while (this.pc > 1) {
        ccl += this.cpuParse();
}
return ccl;

};

// Flags Enum jsSID.MOS6510.flag = Object.freeze ({

N: 128, V: 64, B: 16, D: 8, I: 4, Z: 2, C: 1

});

// Opcodes Enum jsSID.MOS6510.inst = Object.freeze ({

adc: {}, and: {}, asl: {}, bcc: {}, bcs: {}, beq: {}, bit: {}, bmi: {}, bne: {}, bpl: {}, brk: {}, bvc: {}, bvs: {}, clc: {},
cld: {}, cli: {}, clv: {}, cmp: {}, cpx: {}, cpy: {}, dec: {}, dex: {}, dey: {}, eor: {}, inc: {}, inx: {}, iny: {}, jmp: {},
jsr: {}, lda: {}, ldx: {}, ldy: {}, lsr: {}, nop: {}, ora: {}, pha: {}, php: {}, pla: {}, plp: {}, rol: {}, ror: {}, rti: {},
rts: {}, sbc: {}, sec: {}, sed: {}, sei: {}, sta: {}, stx: {}, sty: {}, tax: {}, tay: {}, tsx: {}, txa: {}, txs: {}, tya: {},
xxx: {}

});

// Modes Enum jsSID.MOS6510.mode = Object.freeze ({

imp: {}, imm: {}, abs: {}, absx: {}, absy: {}, zp: {}, zpx: {}, zpy: {}, ind: {}, indx: {}, indy: {}, acc: {}, rel: {}, xxx: {}

});

// 256 entries, each entry array pair of [inst, mode] jsSID.MOS6510.opcodes = new Array(

[jsSID.MOS6510.inst.brk, jsSID.MOS6510.mode.imp],                                                       // 0x00
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.indx],                                                      // 0x01
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x02
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x03
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.zp],                                                        // 0x04
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.zp],                                                        // 0x05
[jsSID.MOS6510.inst.asl, jsSID.MOS6510.mode.zp],                                                        // 0x06
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x07
[jsSID.MOS6510.inst.php, jsSID.MOS6510.mode.imp],                                                       // 0x08
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.imm],                                                       // 0x09
[jsSID.MOS6510.inst.asl, jsSID.MOS6510.mode.acc],                                                       // 0x0a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x0b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.abs],                                                       // 0x0c
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.abs],                                                       // 0x0d
[jsSID.MOS6510.inst.asl, jsSID.MOS6510.mode.abs],                                                       // 0x0e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x0f

[jsSID.MOS6510.inst.bpl, jsSID.MOS6510.mode.rel],                                                       // 0x10
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.indy],                                                      // 0x11
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x12
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x13
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x14
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.zpx],                                                       // 0x15
[jsSID.MOS6510.inst.asl, jsSID.MOS6510.mode.zpx],                                                       // 0x16
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x17
[jsSID.MOS6510.inst.clc, jsSID.MOS6510.mode.imp],                                                       // 0x18
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.absy],                                                      // 0x19
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x1a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x1b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x1c
[jsSID.MOS6510.inst.ora, jsSID.MOS6510.mode.absx],                                                      // 0x1d
[jsSID.MOS6510.inst.asl, jsSID.MOS6510.mode.absx],                                                      // 0x1e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x1f

[jsSID.MOS6510.inst.jsr, jsSID.MOS6510.mode.abs],                                                       // 0x20
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.indx],                                                      // 0x21
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x22
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x23
[jsSID.MOS6510.inst.bit, jsSID.MOS6510.mode.zp],                                                        // 0x24
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.zp],                                                        // 0x25
[jsSID.MOS6510.inst.rol, jsSID.MOS6510.mode.zp],                                                        // 0x26
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x27
[jsSID.MOS6510.inst.plp, jsSID.MOS6510.mode.imp],                                                       // 0x28
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.imm],                                                       // 0x29
[jsSID.MOS6510.inst.rol, jsSID.MOS6510.mode.acc],                                                       // 0x2a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x2b
[jsSID.MOS6510.inst.bit, jsSID.MOS6510.mode.abs],                                                       // 0x2c
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.abs],                                                       // 0x2d
[jsSID.MOS6510.inst.rol, jsSID.MOS6510.mode.abs],                                                       // 0x2e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x2f

[jsSID.MOS6510.inst.bmi, jsSID.MOS6510.mode.rel],                                                       // 0x30
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.indy],                                                      // 0x31
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x32
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x33
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x34
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.zpx],                                                       // 0x35
[jsSID.MOS6510.inst.rol, jsSID.MOS6510.mode.zpx],                                                       // 0x36
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x37
[jsSID.MOS6510.inst.sec, jsSID.MOS6510.mode.imp],                                                       // 0x38
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.absy],                                                      // 0x39
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x3a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x3b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x3c
[jsSID.MOS6510.inst.and, jsSID.MOS6510.mode.absx],                                                      // 0x3d
[jsSID.MOS6510.inst.rol, jsSID.MOS6510.mode.absx],                                                      // 0x3e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x3f

[jsSID.MOS6510.inst.rti, jsSID.MOS6510.mode.imp],                                                       // 0x40
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.indx],                                                      // 0x41
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x42
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x43
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.zp],                                                        // 0x44
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.zp],                                                        // 0x45
[jsSID.MOS6510.inst.lsr, jsSID.MOS6510.mode.zp],                                                        // 0x46
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x47
[jsSID.MOS6510.inst.pha, jsSID.MOS6510.mode.imp],                                                       // 0x48
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.imm],                                                       // 0x49
[jsSID.MOS6510.inst.lsr, jsSID.MOS6510.mode.acc],                                                       // 0x4a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x4b
[jsSID.MOS6510.inst.jmp, jsSID.MOS6510.mode.abs],                                                       // 0x4c
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.abs],                                                       // 0x4d
[jsSID.MOS6510.inst.lsr, jsSID.MOS6510.mode.abs],                                                       // 0x4e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x4f

[jsSID.MOS6510.inst.bvc, jsSID.MOS6510.mode.rel],                                                       // 0x50
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.indy],                                                      // 0x51
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x52
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x53
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x54
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.zpx],                                                       // 0x55
[jsSID.MOS6510.inst.lsr, jsSID.MOS6510.mode.zpx],                                                       // 0x56
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x57
[jsSID.MOS6510.inst.cli, jsSID.MOS6510.mode.imp],                                                       // 0x58
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.absy],                                                      // 0x59
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x5a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x5b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x5c
[jsSID.MOS6510.inst.eor, jsSID.MOS6510.mode.absx],                                                      // 0x5d
[jsSID.MOS6510.inst.lsr, jsSID.MOS6510.mode.absx],                                                      // 0x5e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x5f

[jsSID.MOS6510.inst.rts, jsSID.MOS6510.mode.imp],                                                       // 0x60
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.indx],                                                      // 0x61
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x62
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x63
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.zp],                                                        // 0x64
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.zp],                                                        // 0x65
[jsSID.MOS6510.inst.ror, jsSID.MOS6510.mode.zp],                                                        // 0x66
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x67
[jsSID.MOS6510.inst.pla, jsSID.MOS6510.mode.imp],                                                       // 0x68
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.imm],                                                       // 0x69
[jsSID.MOS6510.inst.ror, jsSID.MOS6510.mode.acc],                                                       // 0x6a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x6b
[jsSID.MOS6510.inst.jmp, jsSID.MOS6510.mode.ind],                                                       // 0x6c
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.abs],                                                       // 0x6d
[jsSID.MOS6510.inst.ror, jsSID.MOS6510.mode.abs],                                                       // 0x6e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x6f

[jsSID.MOS6510.inst.bvs, jsSID.MOS6510.mode.rel],                                                       // 0x70
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.indy],                                                      // 0x71
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x72
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x73
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x74
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.zpx],                                                       // 0x75
[jsSID.MOS6510.inst.ror, jsSID.MOS6510.mode.zpx],                                                       // 0x76
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x77
[jsSID.MOS6510.inst.sei, jsSID.MOS6510.mode.imp],                                                       // 0x78
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.absy],                                                      // 0x79
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x7a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x7b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x7c
[jsSID.MOS6510.inst.adc, jsSID.MOS6510.mode.absx],                                                      // 0x7d
[jsSID.MOS6510.inst.ror, jsSID.MOS6510.mode.absx],                                                      // 0x7e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x7f

[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.imm],                                                       // 0x80
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.indx],                                                      // 0x81
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x82
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x83
[jsSID.MOS6510.inst.sty, jsSID.MOS6510.mode.zp],                                                        // 0x84
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.zp],                                                        // 0x85
[jsSID.MOS6510.inst.stx, jsSID.MOS6510.mode.zp],                                                        // 0x86
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x87
[jsSID.MOS6510.inst.dey, jsSID.MOS6510.mode.imp],                                                       // 0x88
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.imm],                                                       // 0x89
[jsSID.MOS6510.inst.txa, jsSID.MOS6510.mode.acc],                                                       // 0x8a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x8b
[jsSID.MOS6510.inst.sty, jsSID.MOS6510.mode.abs],                                                       // 0x8c
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.abs],                                                       // 0x8d
[jsSID.MOS6510.inst.stx, jsSID.MOS6510.mode.abs],                                                       // 0x8e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x8f

[jsSID.MOS6510.inst.bcc, jsSID.MOS6510.mode.rel],                                                       // 0x90
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.indy],                                                      // 0x91
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x92
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x93
[jsSID.MOS6510.inst.sty, jsSID.MOS6510.mode.zpx],                                                       // 0x94
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.zpx],                                                       // 0x95
[jsSID.MOS6510.inst.stx, jsSID.MOS6510.mode.zpy],                                                       // 0x96
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x97
[jsSID.MOS6510.inst.tya, jsSID.MOS6510.mode.imp],                                                       // 0x98
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.absy],                                                      // 0x99
[jsSID.MOS6510.inst.txs, jsSID.MOS6510.mode.acc],                                                       // 0x9a
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x9b
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x9c
[jsSID.MOS6510.inst.sta, jsSID.MOS6510.mode.absx],                                                      // 0x9d
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.absx],                                                      // 0x9e
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0x9f

[jsSID.MOS6510.inst.ldy, jsSID.MOS6510.mode.imm],                                                       // 0xa0
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.indx],                                                      // 0xa1
[jsSID.MOS6510.inst.ldx, jsSID.MOS6510.mode.imm],                                                       // 0xa2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xa3
[jsSID.MOS6510.inst.ldy, jsSID.MOS6510.mode.zp],                                                        // 0xa4
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.zp],                                                        // 0xa5
[jsSID.MOS6510.inst.ldx, jsSID.MOS6510.mode.zp],                                                        // 0xa6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xa7
[jsSID.MOS6510.inst.tay, jsSID.MOS6510.mode.imp],                                                       // 0xa8
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.imm],                                                       // 0xa9
[jsSID.MOS6510.inst.tax, jsSID.MOS6510.mode.acc],                                                       // 0xaa
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xab
[jsSID.MOS6510.inst.ldy, jsSID.MOS6510.mode.abs],                                                       // 0xac
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.abs],                                                       // 0xad
[jsSID.MOS6510.inst.ldx, jsSID.MOS6510.mode.abs],                                                       // 0xae
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xaf

[jsSID.MOS6510.inst.bcs, jsSID.MOS6510.mode.rel],                                                       // 0xb0
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.indy],                                                      // 0xb1
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xb2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xb3
[jsSID.MOS6510.inst.ldy, jsSID.MOS6510.mode.zpx],                                                       // 0xb4
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.zpx],                                                       // 0xb5
[jsSID.MOS6510.inst.ldx, jsSID.MOS6510.mode.zpy],                                                       // 0xb6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xb7
[jsSID.MOS6510.inst.clv, jsSID.MOS6510.mode.imp],                                                       // 0xb8
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.absy],                                                      // 0xb9
[jsSID.MOS6510.inst.tsx, jsSID.MOS6510.mode.acc],                                                       // 0xba
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xbb
[jsSID.MOS6510.inst.ldy, jsSID.MOS6510.mode.absx],                                                      // 0xbc
[jsSID.MOS6510.inst.lda, jsSID.MOS6510.mode.absx],                                                      // 0xbd
[jsSID.MOS6510.inst.ldx, jsSID.MOS6510.mode.absy],                                                      // 0xbe
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xbf

[jsSID.MOS6510.inst.cpy, jsSID.MOS6510.mode.imm],                                                       // 0xc0
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.indx],                                                      // 0xc1
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xc2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xc3
[jsSID.MOS6510.inst.cpy, jsSID.MOS6510.mode.zp],                                                        // 0xc4
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.zp],                                                        // 0xc5
[jsSID.MOS6510.inst.dec, jsSID.MOS6510.mode.zp],                                                        // 0xc6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xc7
[jsSID.MOS6510.inst.iny, jsSID.MOS6510.mode.imp],                                                       // 0xc8
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.imm],                                                       // 0xc9
[jsSID.MOS6510.inst.dex, jsSID.MOS6510.mode.acc],                                                       // 0xca
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xcb
[jsSID.MOS6510.inst.cpy, jsSID.MOS6510.mode.abs],                                                       // 0xcc
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.abs],                                                       // 0xcd
[jsSID.MOS6510.inst.dec, jsSID.MOS6510.mode.abs],                                                       // 0xce
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xcf

[jsSID.MOS6510.inst.bne, jsSID.MOS6510.mode.rel],                                                       // 0xd0
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.indy],                                                      // 0xd1
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xd2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xd3
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.zpx],                                                       // 0xd4
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.zpx],                                                       // 0xd5
[jsSID.MOS6510.inst.dec, jsSID.MOS6510.mode.zpx],                                                       // 0xd6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xd7
[jsSID.MOS6510.inst.cld, jsSID.MOS6510.mode.imp],                                                       // 0xd8
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.absy],                                                      // 0xd9
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.acc],                                                       // 0xda
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xdb
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xdc
[jsSID.MOS6510.inst.cmp, jsSID.MOS6510.mode.absx],                                                      // 0xdd
[jsSID.MOS6510.inst.dec, jsSID.MOS6510.mode.absx],                                                      // 0xde
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xdf

[jsSID.MOS6510.inst.cpx, jsSID.MOS6510.mode.imm],                                                       // 0xe0
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.indx],                                                      // 0xe1
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xe2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xe3
[jsSID.MOS6510.inst.cpx, jsSID.MOS6510.mode.zp],                                                        // 0xe4
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.zp],                                                        // 0xe5
[jsSID.MOS6510.inst.inc, jsSID.MOS6510.mode.zp],                                                        // 0xe6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xe7
[jsSID.MOS6510.inst.inx, jsSID.MOS6510.mode.imp],                                                       // 0xe8
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.imm],                                                       // 0xe9
[jsSID.MOS6510.inst.nop, jsSID.MOS6510.mode.acc],                                                       // 0xea
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xeb
[jsSID.MOS6510.inst.cpx, jsSID.MOS6510.mode.abs],                                                       // 0xec
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.abs],                                                       // 0xed
[jsSID.MOS6510.inst.inc, jsSID.MOS6510.mode.abs],                                                       // 0xee
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xef

[jsSID.MOS6510.inst.beq, jsSID.MOS6510.mode.rel],                                                       // 0xf0
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.indy],                                                      // 0xf1
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xf2
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xf3
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.zpx],                                                       // 0xf4
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.zpx],                                                       // 0xf5
[jsSID.MOS6510.inst.inc, jsSID.MOS6510.mode.zpx],                                                       // 0xf6
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xf7
[jsSID.MOS6510.inst.sed, jsSID.MOS6510.mode.imp],                                                       // 0xf8
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.absy],                                                      // 0xf9
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.acc],                                                       // 0xfa
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xfb
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx],                                                       // 0xfc
[jsSID.MOS6510.inst.sbc, jsSID.MOS6510.mode.absx],                                                      // 0xfd
[jsSID.MOS6510.inst.inc, jsSID.MOS6510.mode.absx],                                                      // 0xfe
[jsSID.MOS6510.inst.xxx, jsSID.MOS6510.mode.xxx]                                                        // 0xff

);