{ "version": 3, "sources": ["../src/machine/msx.ts", "../src/platform/msx.ts"], "sourcesContent": ["\nimport { Z80, Z80State } from \"../common/cpu/ZilogZ80\";\nimport { BasicScanlineMachine } from \"../common/devices\";\nimport { BaseZ80VDPBasedMachine } from \"./vdp_z80\";\nimport { KeyFlags, newAddressDecoder, padBytes, Keys, makeKeycodeMap, newKeyboardHandler } from \"../common/emu\";\nimport { hex, lzgmini, stringToByteArray } from \"../common/util\";\nimport { TssChannelAdapter, MasterAudio, AY38910_Audio } from \"../common/audio\";\nimport { TMS9918A } from \"../common/video/tms9918a\";\n\n\nvar MSX_KEYCODE_MAP = makeKeycodeMap([\n [Keys.UP, 0, 0x1],\n [Keys.DOWN, 0, 0x2],\n [Keys.LEFT, 0, 0x4],\n [Keys.RIGHT, 0, 0x8],\n [Keys.A, 0, 0x10],\n [Keys.B, 0, 0x20],\n\n [Keys.P2_UP, 1, 0x1],\n [Keys.P2_DOWN, 1, 0x2],\n [Keys.P2_LEFT, 1, 0x4],\n [Keys.P2_RIGHT, 1, 0x8],\n [Keys.P2_A, 1, 0x10],\n [Keys.P2_B, 1, 0x20],\n\n [Keys.ANYKEY, 2, 0x0],\n]);\n\nconst JOY_INPUT_0 = 0;\nconst JOY_INPUT_1 = 1;\nconst KEYBOARD_ROW_0 = 16;\n\nconst MSX_KEYMATRIX_INTL_NOSHIFT = [\n Keys.VK_7, Keys.VK_6, Keys.VK_5, Keys.VK_4, Keys.VK_3, Keys.VK_2, Keys.VK_1, Keys.VK_0,\n Keys.VK_SEMICOLON, Keys.VK_CLOSE_BRACKET, Keys.VK_OPEN_BRACKET, Keys.VK_BACK_SLASH, Keys.VK_EQUALS, Keys.VK_MINUS, Keys.VK_9, Keys.VK_8,\n Keys.VK_B, Keys.VK_A, null/*DEAD*/, Keys.VK_SLASH, Keys.VK_PERIOD, Keys.VK_COMMA, Keys.VK_ACUTE, Keys.VK_QUOTE,\n Keys.VK_J, Keys.VK_I, Keys.VK_H, Keys.VK_G, Keys.VK_F, Keys.VK_E, Keys.VK_D, Keys.VK_C,\n Keys.VK_R, Keys.VK_Q, Keys.VK_P, Keys.VK_O, Keys.VK_N, Keys.VK_M, Keys.VK_L, Keys.VK_K,\n Keys.VK_Z, Keys.VK_Y, Keys.VK_X, Keys.VK_W, Keys.VK_V, Keys.VK_U, Keys.VK_T, Keys.VK_S,\n Keys.VK_F3, Keys.VK_F2, Keys.VK_F1, null, Keys.VK_CAPS_LOCK, null, Keys.VK_CONTROL, Keys.VK_SHIFT,\n Keys.VK_ENTER, null, Keys.VK_BACK_SPACE, null, Keys.VK_TAB, Keys.VK_ESCAPE, Keys.VK_F5, Keys.VK_F4,\n Keys.VK_RIGHT, Keys.VK_DOWN, Keys.VK_UP, Keys.VK_LEFT, Keys.VK_DELETE, Keys.VK_INSERT, Keys.VK_HOME, Keys.VK_SPACE,\n null, null, null, null, null, null, null, null, \n null, null, null, null, null, null, null, null, \n // TODO: null keycodes\n];\n\n/// standard emulator\n\ninterface MSXSlot {\n read(addr:number) : number;\n write(addr:number, val:number) : void;\n}\n\nexport class MSX1 extends BaseZ80VDPBasedMachine {\n\n numVisibleScanlines = 240;\n defaultROMSize = 0x8000;\n ram = new Uint8Array(0x10000);\n\n vdp : TMS9918A;\n bios : Uint8Array;\n slots : MSXSlot[];\n slotmask : number = 0;\n ppi_c : number = 0;\n \n constructor() {\n super();\n this.init(this, this.newIOBus(), new AY38910_Audio(new MasterAudio()));\n this.bios = new lzgmini().decode(stringToByteArray(atob(MSX1_BIOS_LZG)));\n // skip splash screen\n this.bios[0xdd5] = 0;\n this.bios[0xdd6] = 0;\n this.bios[0xdd7] = 0;\n // slot definitions\n this.slots = [\n // slot 0 : BIOS\n {\n read: (a) => { return this.bios[a] | 0; },\n write: (a,v) => { }\n },\n // slot 1: cartridge\n {\n read: (a) => { return this.rom[a - 0x4000] | 0; },\n write: (a,v) => { }\n },\n // slot 2: cartridge\n {\n read: (a) => { return this.rom[a - 0x4000] | 0; },\n write: (a,v) => { }\n },\n // slot 3 : RAM\n {\n read: (a) => { return this.ram[a] | 0; },\n write: (a,v) => { this.ram[a] = v; }\n },\n ];\n }\n \n loadBIOS(bios: Uint8Array) {\n this.bios = bios;\n }\n \n getKeyboardMap() { return MSX_KEYCODE_MAP; }\n\n // http://map.grauw.nl/articles/keymatrix.php\n getKeyboardFunction() {\n return (o,key,code,flags) => {\n //console.log(o,key,code,flags);\n var keymap = MSX_KEYMATRIX_INTL_NOSHIFT;\n for (var i=0; i> 3;\n let bit = 7 - (i & 7);\n //console.log(key, row, bit);\n if (flags & KeyFlags.KeyDown) {\n this.inputs[KEYBOARD_ROW_0+row] |= (1< {\n let shift = (a >> 14) << 1;\n let slotnum = (this.slotmask >> shift) & 3;\n let slot = this.slots[slotnum];\n return slot ? slot.read(a) : 0;\n };\n \n write = (a,v) => {\n let shift = (a >> 14) << 1;\n let slotnum = (this.slotmask >> shift) & 3;\n let slot = this.slots[slotnum];\n if (slot) slot.write(a, v);\n };\n \n newIOBus() {\n return {\n read: (addr) => {\n addr &= 0xff;\n //console.log('IO read', hex(addr,4));\n switch (addr) {\n case 0x98: return this.vdp.readData();\n case 0x99: return this.vdp.readStatus();\n case 0xa2:\n if (this.psg.currentRegister() == 14) return ~this.inputs[JOY_INPUT_0]; // TODO: joy 1?\n else return this.psg.readData();\n case 0xa8: return this.slotmask;\n case 0xa9: return ~this.inputs[KEYBOARD_ROW_0 + (this.ppi_c & 15)];\n case 0xaa: return this.ppi_c; // TODO?\n //default: throw new EmuHalt(\"Read I/O \" + hex(addr));\n }\n return 0;\n },\n write: (addr, val) => {\n addr &= 0xff;\n val &= 0xff;\n //console.log('IO write', hex(addr,4), hex(val,2));\n switch (addr) {\n case 0x98: this.vdp.writeData(val); break;\n case 0x99: this.vdp.writeAddress(val); break;\n case 0xa8: this.slotmask = val; break;\n case 0xaa: this.ppi_c = val; break;\n case 0xab: // command register, modifies PPI C\n let ibit = (val >> 1) & 7;\n this.ppi_c = (this.ppi_c & ~(1< implements Platform {\n\n newMachine() { return new MSX1(); }\n getPresets() { return MSX_BIOS_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.read(a); }\n readVRAMAddress(a) { return this.machine.readVRAMAddress(a); }\n getMemoryMap = function() { return { main:[\n {name:'BIOS',start:0x0,size:0x4000,type:'rom'},\n //{name:'Cartridge',start:0x4000,size:0x4000,type:'rom'},\n {name:'RAM',start:0xc000,size:0x3200,type:'ram'},\n {name:'Stack',start:0xf000,size:0x300,type:'ram'},\n {name:'BIOS Work RAM',start:0xf300,size:0xd00},\n ] } };\n}\n\nclass MSXLibCVPlatform extends MSXPlatform implements Platform {\n getPresets() { return LIBCV_PRESETS; }\n}\n\nPLATFORMS['msx'] = MSXPlatform;\nPLATFORMS['msx-libcv'] = MSXLibCVPlatform;\n"], "mappings": "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", "names": [] }