8bitworkshop/src/platform/base_z80.ts

82 lines
1.9 KiB
TypeScript

"use strict";
import { Platform, BaseZ80Platform, BaseMAMEPlatform } from "../baseplatform";
import { PLATFORMS, RAM, newAddressDecoder, padBytes } from "../emu";
var BASEZ80_PRESETS = [
{id:'simple1.c', name:'Multiply by 2'},
{id:'simple2.c', name:'Divide by 4'},
{id:'prng.c', name:'Pseudorandom Numbers'},
{id:'fib.c', name:'Fibonacci'},
{id:'gfx.c', name:'Graphics'},
{id:'empty.c', name:'Your Code Here...'},
];
var Base_Z80Platform = function(mainElement) {
var self = this;
this.__proto__ = new (BaseZ80Platform as any)();
var cpu, ram, membus, iobus, rom, timer;
this.getPresets = function() {
return BASEZ80_PRESETS;
}
this.start = function() {
ram = new RAM(0x8000);
membus = {
read: newAddressDecoder([
[0x0000, 0x7fff, 0x7fff, function(a) { return rom ? rom[a] : null; }],
[0x8000, 0xffff, 0x7fff, function(a) { return ram.mem[a]; }],
]),
write: newAddressDecoder([
[0x8000, 0xffff, 0x7fff, function(a,v) { ram.mem[a] = v; }],
]),
};
this.readAddress = membus.read;
iobus = {
read: function(addr) {
return 0;
},
write: function(addr, val) {
}
};
cpu = this.newCPU(membus, iobus);
}
this.loadROM = function(title, data) {
rom = padBytes(data, 0x8000);
self.reset();
}
this.loadState = function(state) {
cpu.loadState(state.c);
ram.mem.set(state.b);
}
this.saveState = function() {
return {
c:self.getCPUState(),
b:ram.mem.slice(0),
};
}
this.getCPUState = function() {
return cpu.saveState();
}
this.isRunning = function() {
return timer && timer.isRunning();
}
this.pause = function() {
if (timer) timer.stop();
}
this.resume = function() {
if (timer) timer.start();
}
this.reset = function() {
cpu.reset();
if (!this.getDebugCallback()) cpu.setTstates(0); // TODO?
}
}
PLATFORMS['base_z80'] = Base_Z80Platform;