"use strict"; //// WASM Machine Object.defineProperty(exports, "__esModule", { value: true }); exports.CPC_WASMMachine = void 0; const emu_1 = require("../common/emu"); const wasmplatform_1 = require("../common/wasmplatform"); const BIN_HEADER = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0x0, 0x40, 0, 0x0, 0x0, 0x0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; class CPC_WASMMachine extends wasmplatform_1.BaseWASMMachine { constructor() { super(...arguments); this.numTotalScanlines = 312; this.cpuCyclesPerLine = 224; this.joymask0 = 0; this.runaddr = 0x4000; } loadROM(rom) { let combined = new Uint8Array(rom.length + BIN_HEADER.length); combined.set(BIN_HEADER, 0); combined[24] = rom.length & 0xff; combined[25] = rom.length >> 8; combined[26] = this.runaddr & 0xff; combined[27] = this.runaddr >> 8; combined.set(rom, BIN_HEADER.length); super.loadROM(combined); } reset() { super.reset(); // advance bios this.exports.machine_exec(this.sys, 1000000); // TODO? // load rom (SNA or BIN) if (this.romptr && this.romlen) { this.exports.machine_load_rom(this.sys, this.romptr, this.romlen); // advance clock until program starts for (var i = 0; i < 100000 && this.getPC() != this.runaddr; i++) { this.exports.machine_tick(this.sys); } } } advanceFrame(trap) { var scanline = this.getRasterY(); var clocks = Math.floor((this.numTotalScanlines - scanline) * (4000000 / 50) / this.numTotalScanlines); var probing = this.probe != null; if (probing) this.exports.machine_reset_probe_buffer(); clocks = super.advanceFrameClock(trap, clocks); if (probing) this.copyProbeData(); return clocks; } getRasterY() { return this.exports.machine_get_raster_line(this.sys); } /* z80_tick_t tick_cb; // 0 uint64_t bc_de_hl_fa; // 8 uint64_t bc_de_hl_fa_; // 16 uint64_t wz_ix_iy_sp; // 24 uint64_t im_ir_pc_bits; // 32 uint64_t pins; // 48 void* user_data; z80_trap_t trap_cb; void* trap_user_data; int trap_id; */ getCPUState() { this.exports.machine_save_cpu_state(this.sys, this.cpustateptr); var s = this.cpustatearr; var af = s[9] + (s[8] << 8); // not FA var hl = s[10] + (s[11] << 8); var de = s[12] + (s[13] << 8); var bc = s[14] + (s[15] << 8); var sp = s[24] + (s[25] << 8); var iy = s[26] + (s[27] << 8); var ix = s[28] + (s[29] << 8); var pc = s[34] + (s[35] << 8); var ir = s[36] + (s[37] << 8); return { PC: pc, SP: sp, AF: af, BC: bc, DE: de, HL: hl, IX: ix, IY: iy, IR: ir, o: this.readConst(pc), }; } saveState() { this.exports.machine_save_state(this.sys, this.stateptr); return { c: this.getCPUState(), state: this.statearr.slice(0), }; } loadState(state) { this.statearr.set(state.state); this.exports.machine_load_state(this.sys, this.stateptr); } getVideoParams() { return { width: 768, height: 272, overscan: true, videoFrequency: 50, aspect: 1.3 }; } setKeyInput(key, code, flags) { // TODO: handle shifted keys if (key == 16 || key == 17 || key == 18 || key == 224) return; // meta keys //console.log(key, code, flags); //if (flags & KeyFlags.Shift) { key += 64; } var mask = 0; var mask2 = 0; if (key == 37) { key = 0x8; mask = 0x4; } // LEFT if (key == 38) { key = 0xb; mask = 0x1; } // UP if (key == 39) { key = 0x9; mask = 0x8; } // RIGHT if (key == 40) { key = 0xa; mask = 0x2; } // DOWN if (key == 32) { mask = 0x10; } // FIRE if (key == 65) { key = 65; mask2 = 0x4; } // LEFT if (key == 87) { key = 87; mask2 = 0x1; } // UP if (key == 68) { key = 68; mask2 = 0x8; } // RIGHT if (key == 83) { key = 83; mask2 = 0x2; } // DOWN if (key == 69) { mask2 = 0x10; } // FIRE if (key == 113) { key = 0xf1; } // F2 if (key == 115) { key = 0xf3; } // F4 if (key == 119) { key = 0xf5; } // F8 if (key == 121) { key = 0xf7; } // F10 if (flags & emu_1.KeyFlags.KeyDown) { this.exports.machine_key_down(this.sys, key); this.joymask0 |= mask; } else if (flags & emu_1.KeyFlags.KeyUp) { this.exports.machine_key_up(this.sys, key); this.joymask0 &= ~mask; } // TODO: this.exports.cpc_joystick(this.sys, this.joymask0, 0); } } exports.CPC_WASMMachine = CPC_WASMMachine; //# sourceMappingURL=cpc.js.map