mirror of
https://github.com/jasonm76/GSjs.git
synced 2024-09-27 12:56:11 +00:00
131 lines
3.3 KiB
JavaScript
131 lines
3.3 KiB
JavaScript
// A cross-browser requestAnimationFrame
|
|
// See https://hacks.mozilla.org/2011/08/animating-with-javascript-from-setinterval-to-requestanimationframe/
|
|
var requestAnimFrame = (function(){
|
|
return window.requestAnimationFrame ||
|
|
window.webkitRequestAnimationFrame ||
|
|
window.mozRequestAnimationFrame ||
|
|
window.oRequestAnimationFrame ||
|
|
window.msRequestAnimationFrame ||
|
|
function(callback){
|
|
window.setTimeout(callback, 1000 / 60);
|
|
};
|
|
})();
|
|
|
|
|
|
var mem64k = new DebugMemController();
|
|
var cpu = Cpu(mem64k);
|
|
var dis = new Disassembler(mem64k);
|
|
var mon = new Monitor(cpu);
|
|
|
|
var intervalId; // id for interval timer
|
|
|
|
var print_flag = true;
|
|
var old_irq_pin;
|
|
var old_nmi_pin;
|
|
|
|
var statusElem;
|
|
|
|
|
|
// The main game loop
|
|
var lastTime;
|
|
function main() {
|
|
console.log("Inside main");
|
|
var now = Date.now();
|
|
var dt = (now - lastTime) / 1000.0;
|
|
|
|
runCPU(dt);
|
|
render();
|
|
|
|
lastTime = now;
|
|
requestAnimFrame(main);
|
|
}
|
|
|
|
function init() {
|
|
console.log("Inside init");
|
|
// Create the canvas
|
|
var canvas = document.createElement("canvas");
|
|
var ctx = canvas.getContext("2d");
|
|
canvas.width = 512;
|
|
canvas.height = 480;
|
|
document.getElementById("screen").appendChild(canvas);
|
|
|
|
statusElem = document.getElementById("status");
|
|
|
|
mem64k.loadData(0x0000, resources.get('test6502'));
|
|
cpu.reset();
|
|
|
|
old_irq_pin = (mem64k.getData(0xBFFC) & 0x01) > 0;
|
|
old_nmi_pin = ((mem64k.getData(0xBFFC) & 0x02) >> 1) > 0;
|
|
|
|
cpu.setPC(0x0400);
|
|
|
|
console.log("Press keys to operate CPU:");
|
|
console.log("0) reset");
|
|
console.log("1) NMI");
|
|
console.log("2) IRQ");
|
|
console.log("3) end simulation");
|
|
|
|
print_flag = false;
|
|
|
|
statusElem.innerHTML = "Running";
|
|
lastTime = Date.now;
|
|
main();
|
|
}
|
|
|
|
function runCPU(dt) {
|
|
var numCycles = dt*1022727;
|
|
if (print_flag) {
|
|
console.log(mon.getStatusStr());
|
|
dis.disassemble(cpu.regPC());
|
|
}
|
|
cpu_start = Date.now();
|
|
cpu.run(numCycles);
|
|
cpu_dt = (Date.now() - cpu_start) / 1000.0;
|
|
console.log('CPU time = ' + cpu_dt);
|
|
|
|
var irq_pin = (mem64k.getData(0xBFFC) & 0x01) > 0;
|
|
var nmi_pin = ((mem64k.getData(0xBFFC) & 0x02) >> 1) > 0;
|
|
|
|
if (irq_pin != old_irq_pin) {
|
|
console.log("Changed IRQ pin: " + old_irq_pin + " --> " + irq_pin);
|
|
old_irq_pin = irq_pin;
|
|
cpu.irq_pin = irq_pin;
|
|
}
|
|
if (nmi_pin != old_nmi_pin) {
|
|
console.log("Changed NMI pin: " + old_nmi_pin + " --> " + nmi_pin);
|
|
old_nmi_pin = nmi_pin;
|
|
cpu.nmi_pin = nmi_pin;
|
|
}
|
|
}
|
|
|
|
function render() {
|
|
// Nothing yet
|
|
}
|
|
|
|
document.onkeypress = function (e) {
|
|
e = e || window.event;
|
|
if (e.keyCode === 51) {
|
|
clearInterval(intervalId);
|
|
console.log("STOPPED");
|
|
statusElem.innerHTML = "STOPPED";
|
|
}
|
|
else if (e.keyCode === 48) { cpu.reset(); statusElem.innerHTML = "Running (" + intervalId + "): ";}
|
|
else if(e.keyCode === 49) { cpu.nmi(); statusElem.innerHTML += "1 ";}
|
|
else if(e.keyCode === 50) { cpu.irq(); statusElem.innerHTML += "2 ";}
|
|
else if(e.keyCode >= 0 && e.keyCode <= 255) {
|
|
mem64k.setData(mem64k.in_port, e.keyCode);
|
|
}
|
|
};
|
|
|
|
$(document).ready(function() {
|
|
console.log("Document ready");
|
|
$.when(
|
|
resources.loadBinary('/tests/6502_functional_test.bin', 'test6502')
|
|
|
|
).then(function() {
|
|
init();
|
|
}, function() {
|
|
console.log("Resource not available");
|
|
}) ;
|
|
});
|