mirror of
https://github.com/pskupinski/65816.js.git
synced 2024-06-04 01:29:29 +00:00
fixed DEC operations to properly handle decrementing 0 by 1 and numerous fixes to the DEC and INC operations otherwise
This commit is contained in:
parent
f2f47833a7
commit
17dd04c7d6
8
README
8
README
|
@ -13,11 +13,3 @@ cpu.r.a should be 0 after executing this.
|
|||
cpu.execute("18fbc230a9ff01a0010099fea5ff");
|
||||
|
||||
cpu.r.a should be 511 after executing this.
|
||||
|
||||
cpu.execute("18fbc230a900001ad0fd")
|
||||
|
||||
This will loop until 0 is incremented past 0xffff and overflows back to 0.
|
||||
|
||||
cpu.execute("18fbc230a9ffff3a30fd")
|
||||
|
||||
This will loop until 0xffff is decremented to 0x7fff and then stops.
|
||||
|
|
203
cpu.js
203
cpu.js
|
@ -790,19 +790,27 @@ var DEX = {
|
|||
return 1;
|
||||
},
|
||||
execute:function(cpu) {
|
||||
cpu.r.x--;
|
||||
if(cpu.p.x) {
|
||||
cpu.r.x &= 0xff;
|
||||
cpu.p.n = cpu.r.x >> 7;
|
||||
} else {
|
||||
cpu.r.x &= 0xffff;
|
||||
cpu.p.n = cpu.r.x >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.x===0) {
|
||||
cpu.p.z = 1;
|
||||
if(cpu.p.x) {
|
||||
cpu.r.x = 0xff;
|
||||
} else {
|
||||
cpu.r.x = 0xffff;
|
||||
}
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
cpu.r.x--;
|
||||
if(cpu.p.x) {
|
||||
cpu.p.n = cpu.r.x >> 7;
|
||||
} else {
|
||||
cpu.p.n = cpu.r.x >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.x===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -812,20 +820,28 @@ var DEY = {
|
|||
return 1;
|
||||
},
|
||||
execute:function(cpu) {
|
||||
cpu.r.y--;
|
||||
|
||||
if(cpu.p.x) {
|
||||
cpu.r.y &= 0xff;
|
||||
cpu.p.n = cpu.r.y >> 7;
|
||||
} else {
|
||||
cpu.r.y &= 0xffff;
|
||||
cpu.p.n = cpu.r.y >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.y===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
if(cpu.p.x) {
|
||||
cpu.r.y = 0xff;
|
||||
} else {
|
||||
cpu.r.y = 0xffff;
|
||||
}
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
cpu.r.y--;
|
||||
|
||||
if(cpu.p.x) {
|
||||
cpu.p.n = cpu.r.y >> 7;
|
||||
} else {
|
||||
cpu.p.n = cpu.r.y >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.y===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -835,20 +851,29 @@ var DEC_accumulator = {
|
|||
return 1;
|
||||
},
|
||||
execute: function(cpu) {
|
||||
cpu.r.a--;
|
||||
|
||||
if(cpu.p.x) {
|
||||
cpu.r.a &= 0xff;
|
||||
cpu.p.n = cpu.r.a >> 7;
|
||||
} else {
|
||||
cpu.r.a &= 0xffff;
|
||||
cpu.p.n = cpu.r.a >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.a===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
if(cpu.p.x) {
|
||||
cpu.r.a = 0xff;
|
||||
} else {
|
||||
cpu.r.a = 0xffff;
|
||||
}
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
cpu.r.a--;
|
||||
if(cpu.p.x) {
|
||||
cpu.r.a &= 0xff;
|
||||
cpu.p.n = cpu.r.a >> 7;
|
||||
} else {
|
||||
cpu.r.a &= 0xffff;
|
||||
cpu.p.n = cpu.r.a >> 15;
|
||||
}
|
||||
|
||||
if(cpu.r.a===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -861,25 +886,43 @@ var DEC_absolute = {
|
|||
var location = (bytes[1]<<8)|bytes[0]
|
||||
var temp;
|
||||
if(cpu.p.m) {
|
||||
temp = cpu.mmu.read_byte(location) - 1;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
cpu.p.n = temp >> 7;
|
||||
temp = cpu.mmu.read_byte(location);
|
||||
if(temp===0) {
|
||||
cpu.mmu.store_byte(location, 0xff);
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
temp--;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
cpu.p.n = temp >> 7;
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var low_byte = cpu.mmu.read_byte(location);
|
||||
var high_byte = cpu.mmu.read_byte(location+1);
|
||||
temp = high_byte | low_byte;
|
||||
temp--;
|
||||
cpu.p.n = temp >> 15;
|
||||
if(temp===0) {
|
||||
temp = 0xffff;
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
temp--;
|
||||
cpu.p.n = temp >> 15;
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
high_byte = temp & 0xff00;
|
||||
low_byte = temp & 0x00ff;
|
||||
cpu.mmu.store_byte(location, low_byte);
|
||||
cpu.mmu.store_byte(location+1, high_byte);
|
||||
}
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -891,25 +934,43 @@ var DEC_direct_page = {
|
|||
var location = bytes[0] + cpu.r.d;
|
||||
var temp;
|
||||
if(cpu.p.m) {
|
||||
temp = cpu.mmu.read_byte(location) - 1;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
cpu.p.n = temp >> 7;
|
||||
temp = cpu.mmu.read_byte(location);
|
||||
if(temp===0) {
|
||||
cpu.mmu.store_byte(location, 0xff);
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
temp--;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
cpu.p.n = temp >> 7;
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var low_byte = cpu.mmu.read_byte(location);
|
||||
var high_byte = cpu.mmu.read_byte(location+1);
|
||||
temp = high_byte | low_byte;
|
||||
temp--;
|
||||
cpu.p.n = temp >> 15;
|
||||
if(temp===0) {
|
||||
temp = 0xffff;
|
||||
cpu.p.n = 1;
|
||||
cpu.p.z = 0;
|
||||
} else {
|
||||
temp--;
|
||||
cpu.p.n = temp >> 15;
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
high_byte = temp & 0xff00;
|
||||
low_byte = temp & 0x00ff;
|
||||
cpu.mmu.store_byte(location, low_byte);
|
||||
cpu.mmu.store_byte(location+1, high_byte);
|
||||
}
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -989,8 +1050,14 @@ var INC_absolute = {
|
|||
var temp;
|
||||
if(cpu.p.m) {
|
||||
temp = cpu.mmu.read_byte(location) + 1;
|
||||
temp &= 0xff;
|
||||
cpu.p.n = temp >> 7;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
} else {
|
||||
var low_byte = cpu.mmu.read_byte(location);
|
||||
var high_byte = cpu.mmu.read_byte(location+1);
|
||||
|
@ -1001,11 +1068,11 @@ var INC_absolute = {
|
|||
low_byte = temp & 0x00ff;
|
||||
cpu.mmu.store_byte(location, low_byte);
|
||||
cpu.mmu.store_byte(location+1, high_byte);
|
||||
}
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -1019,8 +1086,14 @@ var INC_direct_page = {
|
|||
var temp;
|
||||
if(cpu.p.m) {
|
||||
temp = cpu.mmu.read_byte(location) + 1;
|
||||
temp &= 0xff;
|
||||
cpu.mmu.store_byte(location, temp);
|
||||
cpu.p.n = temp >> 7;
|
||||
if(temp===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
} else {
|
||||
var low_byte = cpu.mmu.read_byte(location);
|
||||
var high_byte = cpu.mmu.read_byte(location+1);
|
||||
|
@ -1031,11 +1104,11 @@ var INC_direct_page = {
|
|||
low_byte = temp & 0x00ff;
|
||||
cpu.mmu.store_byte(location, low_byte);
|
||||
cpu.mmu.store_byte(location+1, high_byte);
|
||||
}
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
if((high_byte|low_byte)===0) {
|
||||
cpu.p.z = 1;
|
||||
} else {
|
||||
cpu.p.z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user