//// WASM Machine // http://www.zimmers.net/anonftp/pub/cbm/documents/chipdata/VIC-I.txt // http://www.zimmers.net/anonftp/pub/cbm/maps/Vic20.MemoryMap.txt // http://sleepingelephant.com/denial/wiki/index.php/Autostart import { Machine } from "../common/baseplatform"; import { Probeable, TrapCondition } from "../common/devices"; import { KeyFlags } from "../common/emu"; import { hex } from "../common/util"; import { BaseWASMMachine } from "../common/wasmplatform"; export class VIC20_WASMMachine extends BaseWASMMachine implements Machine, Probeable { numTotalScanlines = 312; cpuCyclesPerLine = 71; videoOffsetBytes = -24 * 4; prgstart : number; joymask0 = 0; joymask1 = 0; getBIOSLength() { return 0x5000 }; loadBIOS(srcArray: Uint8Array) { super.loadBIOS(srcArray); } reset() { super.reset(); // clear keyboard for (var ch=0; ch<128; ch++) { this.setKeyInput(ch, 0, KeyFlags.KeyUp); } // load rom if (this.romptr && this.romlen) { let rom = this.romarr; this.exports.machine_load_rom(this.sys, this.romptr, this.romlen); let iscart = rom[4+2]==0x41 && rom[5+2]==0x30 && rom[6+2]==0xC3 && rom[7+2]==0xC2 && rom[8+2]==0xCD; if (!iscart) { this.prgstart = rom[0] + (rom[1]<<8); // get load address // look for BASIC program start if (this.prgstart == 0x1001) { this.prgstart = rom[2] + (rom[3]<<8) + 2; // point to after BASIC program console.log("prgstart", hex(this.prgstart)); } // is program loaded into RAM? if (this.prgstart < 0x8000) { // advance BIOS a few frames this.exports.machine_exec(this.sys, 500000); // type in command (SYS 2061) var cmd = "SYS "+this.prgstart+"\r"; console.log(cmd); for (var i=0; i