8bitworkshop/gen/msx-OOYI4EPW.js.map

8 lines
27 KiB
Plaintext

{
"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<keymap.length; i++) {\n if (keymap[i] && keymap[i].c == key) {\n let row = 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<<bit);\n } else if (flags & KeyFlags.KeyUp) {\n this.inputs[KEYBOARD_ROW_0+row] &= ~(1<<bit);\n }\n break;\n }\n }\n };\n }\n \n read = (a) => {\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<<ibit)) | ((val&1)<<ibit);\n break;\n case 0xa0: this.psg.selectRegister(val); break;\n case 0xa1: this.psg.setData(val); break; \n case 0xfc:\n case 0xfd:\n case 0xfe:\n case 0xff:\n break; // memory mapper (MSX2)\n //default: throw new EmuHalt(\"Write I/O \" + hex(addr));\n }\n }\n };\n }\n\n vdpInterrupt() {\n this.probe.logInterrupt(0xff);\n this.cpu.interrupt(0xff); // RST 0x38\n }\n\n loadState(state) {\n super.loadState(state);\n this.slotmask = state['slotmask'];\n this.ppi_c = state['ppi_c'];\n this.psg.selectRegister(state['psgRegister']);\n }\n saveState() {\n var state = super.saveState();\n state['slotmask'] = this.slotmask;\n state['ppi_c'] = this.ppi_c;\n state['psgRegister'] = this.psg.currentRegister();\n return state;\n }\n reset() {\n super.reset();\n this.slotmask = 0;\n this.ppi_c = 0;\n }\n /* TODO\n resume() {\n super.resume();\n this.resetInputs();\n }*/\n resetInputs() {\n // clear keyboard matrix\n this.inputs.fill(0);\n }\n}\n\n\n///\n\n/*\n C-BIOS is a BIOS compatible with the MSX BIOS\n C-BIOS was written from scratch by BouKiCHi\n C-BIOS is available for free, including its source code (2-clause BSD license)\n C-BIOS can be shipped with MSX emulators so they are usable out-of-the-box without copyright issues\n\n http://cbios.sourceforge.net/\n*/\nvar MSX1_BIOS_LZG = `\n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\nweHV5TsMNno7CjZZzYXz0eVRtuHJCNnz/eXx3eXhV6dRMtVRIUcO/N3l8VF3hygHywDLAT0g+SFn\nJOXbqPWhsNnDjPNRK9FRtgjZyfPlb1EqPqvGVQXyeyRXOwNuZ0c+wAcHBfKLJF8vT3qjR32n8tYk\nDw/mA+XFOwUipSSjR3rmwGfbqG/mwLRaBAxiobBPMv//fdOoIcX8euYDhW98zgBneXfB4duoobDT\nqOHJVw8PX+bAb9uoT+Y/tdOoe+YDb3wmAxgCKSnWQDD6fC9nUX5fpLVRPm9506hRPE8GAH0hxfwJ\nd8l6Dw/mwEdRs7BRM1EbOwcaUVlzydOoXhgD06hzetOoUQQIzZjzCPGT4cnd6QBaBQ87MC4yOTsk\n8mNiaW9zLnNmLm5ldA0KQ2hhcmFjdGVyIHNldDogVVMNCkluUQdydXB0IGZyZXF1ZW5jeTogNjBI\neg0KS2V5Ym9hcmQgdHlwZVHmkyQASW5pdCBST00gaW4gc2xvdDogAENhbm5vdCBleGVjdXRlIGEg\nQkFTSUNRXS5RKUVSUk9SOgBNRU1PUlkgTk9UIEZPVU5ELgBDQUxMRURRCk4gRVhJU1RJTkdR8i4A\nU1RBQ0sgUbIuADsCb05vIGNhcnRyaWRnZSBmb3VuZC5RT1RoaXMgdmVyc2lvbiBvZiA7BfxjYW4N\nCm9ubHkgc3RRLjsIM3NRLlBsZWFzZSByZVHUeW91ciBNU1gNCihlbXVsYXRvcikgd2l0aCBhOwgw\nDQppbnNlcnRlZC4AMDEyMzQ1Njc4OS09XFtdOwAnYCwuLwBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2\nd3h5eikhQCMkJV4mKihfK3x7fToifjw+PwBBQkNERUZHSElKS0xNTk9QUQBSU1RVVldYWVoACayr\nuu+99PvsBxfxHgENBgW78/IdAMQRvMfNFBUT3MbdyAsbwtvMGNISwBrPHBkPCgD9/AAA9QAACB/w\nFgIOBAP3rq/2AP4A+sHO1BDW38reyQzTw9fLqdEAxdXQ+ar465/Zv5uY4OHnh+7pAO3at7nlhqan\nAISXjYuMlIGxoZGzteakoqODkwCJloKViIqghditnr6cnQAA4jvCpOjqtrjkjwCoAI5RBQCZmrAA\nkrK0AKUA41FHO4QvkwgbCQAIAA0gDAAAHR4fHCorLzspMywuAIBwgQCCAYT1h1oEAnWTH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+THpMdkwPF5cEbe7IoAwkY+FoDGKu1Mc2fCT4g\n0y560y970y/x4clST01CQVM7H6CTH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5MekxyTBj46kz+T\nP5Ms5fUhSTpaBRvgWgMMYHN0YXRlbWVudHMgYXJlIG5vdCBpbXBsUYtlZCB5ZXQ7P7uTH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mf\nkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TBc2O\nWgpBt5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5MfWh5ixDsfeZMfkx+TH5Mfkx+TH5Mfkx+TH5MeAOX1ISJ9WgQ60XVua25v\nd25AN0QxNwA5fd0hiQHNPxrJ3SGFAcM/Wh9abpMeOw71H347DfVFMTQ735aTH5Mfkx6TC1oNaeX/\nzW8AWgdqSmIAKiL5AQADPgDNVgABAALNRwABA5+TogQAk6FaA3T+B5MBR1oDcC9aA3AqyfNRIyok\nUS4ECesBMAMhvIDNXFHJAQnrKgQACQEAA1FKyfM7Bxvsg1HJEQABGVEWPvFReyL5AYQACeshHIcG\nCsXl1QEYAFEd4QEgUQzhUQUJwRDpO01I/viTYh9/k6E/OwwSHzsIAvj+OwYDfx9aA1VJ/vz48B8/\nUS2TBVFIAFG+kwk7CS8Afz8f+Pw7CwdaBVbh/v4fP387CUH+/DsGUPiTAfCTAR+TAT+TAVFIUdBR\nzTsGKzsGCDsHJMffUQ3wOwi3WgZcfjsDen8//pMB/Pz8fDsGKAAA/PgfP3/+UWnwf1Ef/FFk8FFr\nfz8fH/D++PAff3z8+D8/f5MDOwZMOwYIOwaYUUdRUFEzkwN8PDw8x5MBHx7j45Pi/Pjw8FFhOwb/\nOwUfkwT+fzstdn87B7hRKz9+kwFRHvAfHz9+OwJEOwK0k+J4eHh8UVg/OyRI/vz8+DsDTzsD0loI\nXXOTBTsEcfD4/HyTAlEDf39/PzsKcFGIOwJkOwwv/B+TgfA7Itw8jx9/OwJ0n5MBfH5+f+M+Pz87\nJE7wPlEiOwZEOyI6OyLQ/vjxPPA7Isc7JS1RkHz8+DsiaAA/OyJV8Pj8k8L4UT07TRc7TTU7BwY7\nBFz++D87S3k7SYo7CEB/OwovOwYCOyJQ/viTofA7Tac7AvaTCztz8gkJk2KQkAmTgZNhkxFRGFGX\nOwUnkAGTARmTAZGRkTsHHFEEkQmRGRlRVJMGOwYIOwcZOwUoOwU4kTsGeDsHETsFIFEUUbg7QoCT\nCvGTAVFQCFEfCJCQkJPjk2GBUSyBUS07BhyTgQ8Pk8EPkwFRaJPiH1FBUVZRUTsJSJPiURFRhFEu\nD/FRRlHBUWtRnzsFI/GAkJCAkICAOwJwCAkICAkYGRkYGRgYGVGVOwdEAQE7B1k7B1w7Bho7BnQ7\nJBg7CA6TBFHOOwSsOwJzCAg7Al8ICfHx4ZNB4VE0Hh+T4lFIHx5RBJPlUVCT4VF4k+JRkPHhk+E7\nBWA7BkoPDx47BXA7BEgICAhaA1/Qk+GTA1ETGJMC4ZMBDpMBUWST4x4eUQhRTuHhHpNikwFRhDsG\nAVEnUUZRJx47BTCT4lHSUZ4BAVE5OwsQUU07BnQYGBiBkwIICDtEClELUQZRDTsHkFGak+GTAxiT\npBiBUW47BrRRq1EsUVU7CEA7AliT4pMCOwffUYWAURCEOwUhBDtmAwSTDVHOAICAgYKDhIWGhzsj\nJpMJiImKi4yNjo+QjJMK45GSkwCUjJWWUUSXOwkQ5JiZmoyMm5ydnp+goaKjnaSlpp2TAYzkp6ip\njIyqq4yMrK2ur4yMsLGys7OztIzktbVRLraTYbe4ubqMjLu8vb6+v8CM5MHCw4yMxMXFxsfIycrL\nzM3OxcXFz9CM5NHC0jsLgZMF5NPU1dbX2Nna2zsHC1YwLjI55IDc3d7C3+Dh4pMM5VoGXW2TH5Mf\nkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mf\nkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+T\nH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+TH5Mfkx+THpMc/w==\n`;\n", "\nimport { MSX1 } from \"../machine/msx\";\nimport { Platform, BaseZ80MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\n// https://github.com/Konamiman/MSX2-Technical-Handbook\n// https://www.msx.org/wiki/MSX_Cartridge_slot\n// http://map.grauw.nl/resources/msx_io_ports.php\n// https://openmsx.org/manual/setup.html\n// https://www.msx.org/wiki/Slots\n// https://www.msx.org/wiki/SDCC\n// https://github.com/gseidler/The-MSX-Red-Book/blob/master/the_msx_red_book.md\n\nvar MSX_BIOS_PRESETS = [\n {id:'helloworld.asm', name:'Hello World (ASM)'},\n {id:'redbook_kbd.asm', name:'Redbook Keyboard Scanner (ASM)'},\n {id:'siegegame.c', name:'Siege Game'},\n {id:'eliza.c', name:'Eliza'},\n {id:'hello.wiz', name:'Hello (Wiz)'},\n];\n\n// TODO: share with coleco, sms\nvar LIBCV_PRESETS = [\n { id: 'text.c', name: 'Text Mode' },\n { id: 'hello.c', name: 'Scrolling Text' },\n { id: 'text32.c', name: '32-Column Color Text' },\n { id: 'stars.c', name: 'Scrolling Starfield' },\n { id: 'cursorsmooth.c', name: 'Moving Cursor' },\n { id: 'simplemusic.c', name: 'Simple Music' },\n { id: 'musicplayer.c', name: 'Multivoice Music' },\n { id: 'mode2bitmap.c', name: 'Mode 2 Bitmap' },\n { id: 'mode2compressed.c', name: 'Mode 2 Bitmap (LZG)' },\n { id: 'lines.c', name: 'Mode 2 Lines' },\n { id: 'multicolor.c', name: 'Multicolor Mode' },\n { id: 'siegegame.c', name: 'Siege Game' },\n { id: 'shoot.c', name: 'Solarian Game' },\n { id: 'climber.c', name: 'Climber Game' },\n];\n\nclass MSXPlatform extends BaseZ80MachinePlatform<MSX1> 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": []
}