8bitworkshop/gen/sms-6QH6TDVI.js.map

8 lines
14 KiB
Plaintext

{
"version": 3,
"sources": ["../src/machine/sms.ts", "../src/platform/sms.ts"],
"sourcesContent": ["\nimport { BaseZ80VDPBasedMachine } from \"./vdp_z80\";\nimport { newAddressDecoder, padBytes, Keys, makeKeycodeMap } from \"../common/emu\";\nimport { hex } from \"../common/util\";\nimport { MasterAudio, SN76489_Audio } from \"../common/audio\";\nimport { SMSVDP, GameGearVDP } from \"../common/video/tms9918a\";\n\n// http://www.smspower.org/Development/Index\n// http://www.smspower.org/uploads/Development/sg1000.txt\n// http://www.smspower.org/uploads/Development/richard.txt\n// http://www.smspower.org/uploads/Development/msvdp-20021112.txt\n// http://www.smspower.org/uploads/Development/SN76489-20030421.txt\n\nvar SG1000_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 [Keys.GP_A, 0, 0x10],\n [Keys.GP_B, 0, 0x20],\n\n [Keys.P2_UP, 0, 0x40],\n [Keys.P2_DOWN, 0, 0x80],\n [Keys.P2_LEFT, 1, 0x1],\n [Keys.P2_RIGHT, 1, 0x2],\n [Keys.P2_A, 1, 0x4],\n [Keys.P2_B, 1, 0x8],\n [Keys.VK_BACK_SLASH, 1, 0x10], // reset\n [Keys.VK_ENTER, 1, 0x80], // start/pause\n]);\n\nexport class SG1000 extends BaseZ80VDPBasedMachine {\n\n numVisibleScanlines = 240;\n defaultROMSize = 0xc000;\n ram = new Uint8Array(0x400);\n \n constructor() {\n super();\n this.init(this, this.newIOBus(), new SN76489_Audio(new MasterAudio()));\n }\n \n getKeyboardMap() { return SG1000_KEYCODE_MAP; }\n\n vdpInterrupt() {\n this.probe.logInterrupt(0xff);\n return this.cpu.interrupt(0xff); // RST 0x38\n }\n \n read = newAddressDecoder([\n [0xc000, 0xffff, 0x3ff, (a) => { return this.ram[a]; }],\n [0x0000, 0xbfff, 0xffff, (a) => { return this.rom && this.rom[a]; }],\n ]);\n write = newAddressDecoder([\n [0xc000, 0xffff, 0x3ff, (a,v) => { this.ram[a] = v; }],\n ]);\n \n getVCounter() : number { return 0; }\n getHCounter() : number { return 0; }\n setMemoryControl(v:number) { }\n setIOPortControl(v:number) { }\n\n readIO(addr:number) {\n switch (addr & 0xc1) {\n case 0x40: return this.getVCounter();\n case 0x41: return this.getHCounter();\n case 0x80: return this.vdp.readData();\n case 0x81: return this.vdp.readStatus();\n case 0xc0: return this.inputs[0] ^ 0xff;\n case 0xc1: return this.inputs[1] ^ 0xff;\n }\n return 0;\n }\n\n writeIO(addr:number, val:number) {\n switch (addr & 0xc1) {\n case 0x00: return this.setMemoryControl(val);\n case 0x01: return this.setIOPortControl(val);\n case 0x40:\n case 0x41: return this.psg.setData(val);\n case 0x80: return this.vdp.writeData(val);\n case 0x81: return this.vdp.writeAddress(val);\n }\n }\n\n newIOBus() {\n return {\n read: (addr:number) => {\n addr &= 0xff;\n //console.log('IO read', hex(addr,4));\n return this.readIO(addr);\n },\n write: (addr:number, val:number) => {\n addr &= 0xff;\n val &= 0xff;\n //console.log('IO write', hex(addr,4), hex(val,2));\n this.writeIO(addr, val);\n }\n };\n }\n \n}\n\n///\n\nexport class SMS extends SG1000 {\n\n cartram = new Uint8Array(0);\n pagingRegisters = new Uint8Array(4);\n romPageMask : number;\n latchedHCounter = 0;\n ioControlFlags = 0;\n // TODO: hide bottom scanlines\n ram = new Uint8Array(0x2000);\n \n newVDP(frameData, cru, flicker) {\n return new SMSVDP(frameData, cru, flicker);\n }\n\n reset() {\n super.reset();\n this.pagingRegisters.set([0,0,1,2]);\n }\n\n getVCounter() {\n var y = this.scanline;\n return (y <= 0xda) ? (y) : (y - 6);\n }\n getHCounter() {\n return this.latchedHCounter;\n }\n computeHCounter() {\n return 0;\n /*\n var t0 = this.startLineTstates;\n var t1 = this.cpu.getTstates();\n return (t1-t0) & 0xff; // TODO\n */\n }\n setIOPortControl(v:number) {\n if ((v ^ this.ioControlFlags) & 0xa0) { // either joystick TH pin\n this.latchedHCounter = this.computeHCounter();\n //console.log(\"H:\"+hex(this.latchedHCounter)+\" V:\"+hex(this.getVCounter()));\n }\n this.ioControlFlags = v;\n }\n \n \n getPagedROM(a:number, reg:number) {\n //if (!(a&0xff)) console.log(hex(a), reg, this.pagingRegisters[reg], this.romPageMask);\n return this.rom && this.rom[a + ((this.pagingRegisters[reg] & this.romPageMask) << 14)]; // * $4000\n }\n\n read = newAddressDecoder([\n [0xc000, 0xffff, 0x1fff, (a) => { return this.ram[a]; }],\n [0x0000, 0x03ff, 0x3ff, (a) => { return this.rom && this.rom[a]; }],\n [0x0400, 0x3fff, 0x3fff, (a) => { return this.getPagedROM(a,1); }],\n [0x4000, 0x7fff, 0x3fff, (a) => { return this.getPagedROM(a,2); }],\n [0x8000, 0xbfff, 0x3fff, (a) => {\n var reg0 = this.pagingRegisters[0]; // RAM select?\n if (reg0 & 0x8) {\n return this.cartram[(reg0 & 0x4) ? a+0x4000 : a];\n } else {\n return this.getPagedROM(a,3);\n }\n }],\n ]);\n \n write = newAddressDecoder([\n [0xc000, 0xfffb, 0x1fff, (a,v) => {\n this.ram[a] = v;\n }],\n [0xfffc, 0xffff, 0x3, (a,v) => {\n this.pagingRegisters[a] = v;\n this.ram[a+0x1ffc] = v;\n }],\n [0x8000, 0xbfff, 0x3fff, (a,v) => {\n var reg0 = this.pagingRegisters[0]; // RAM select?\n if (reg0 & 0x8) {\n if (this.cartram.length == 0)\n this.cartram = new Uint8Array(0x8000); // create cartridge RAM lazily\n this.cartram[(reg0 & 0x4) ? a+0x4000 : a] = v;\n }\n }],\n ]);\n\n loadROM(data:Uint8Array) {\n if (data.length <= 0xc000) {\n this.rom = padBytes(data, 0xc000);\n this.romPageMask = 3; // only pages 0, 1, 2\n } else {\n switch (data.length) {\n case 0x10000:\n case 0x20000:\n case 0x40000:\n case 0x80000:\n this.rom = data;\n this.romPageMask = (data.length >> 14) - 1; // div $4000\n break;\n default:\n throw Error(\"Unknown rom size: $\" + hex(data.length));\n }\n }\n //console.log(\"romPageMask: \" + hex(this.romPageMask));\n this.reset();\n }\n\n loadState(state) {\n super.loadState(state);\n this.pagingRegisters.set(state.pr);\n this.cartram.set(state.cr);\n this.latchedHCounter = state.lhc;\n this.ioControlFlags = state.iocf;\n }\n saveState() {\n var state = super.saveState();\n state['pr'] = this.pagingRegisters.slice(0);\n state['cr'] = this.cartram.slice(0);\n state['lhc'] = this.latchedHCounter;\n state['iocf'] = this.ioControlFlags;\n return state;\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'SMS': // TODO\n return super.getDebugInfo(category, state) +\n \"\\nBank Regs: \" + this.pagingRegisters + \"\\n\";\n default: return super.getDebugInfo(category, state);\n }\n }\n}\n\n// https://segaretro.org/images/1/16/Sega_Game_Gear_Hardware_Reference_Manual.pdf\nexport class GameGear extends SMS {\n newVDP(frameData, cru, flicker) {\n return new GameGearVDP(frameData, cru, flicker);\n }\n readIO(addr:number) {\n switch (addr & 0xc1) {\n case 0x00: return (~this.inputs[1] & 0x80) | 0x40;\n case 0xdc: return this.inputs[0] ^ 0xff;\n case 0xdd: return this.inputs[1] ^ 0xff;\n }\n return super.readIO(addr);\n }\n}\n", "\nimport { GameGear, SG1000, SMS } from \"../machine/sms\";\nimport { Platform, BaseZ80MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\n// TODO: merge w/ coleco\nexport var SG1000_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\nexport var SMS_PRESETS = [\n {id:'mode4test.c', name:'Mode 4 Test'},\n {id:'climber.c', name:'Climber Game'},\n];\n\n///\n\nclass SG1000Platform extends BaseZ80MachinePlatform<SG1000> implements Platform {\n\n newMachine() { return new SG1000(); }\n getPresets() { return SG1000_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.read(a); }\n readVRAMAddress(a) { return this.machine.readVRAMAddress(a); }\n}\n\nclass SMSPlatform extends BaseZ80MachinePlatform<SMS> implements Platform {\n\n newMachine() { return new SMS(); }\n getPresets() { return SMS_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.read(a); }\n readVRAMAddress(a) { return this.machine.readVRAMAddress(a); }\n}\n\nclass GameGearPlatform extends BaseZ80MachinePlatform<GameGear> implements Platform {\n\n newMachine() { return new GameGear(); }\n getPresets() { return SMS_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.read(a); }\n readVRAMAddress(a) { return this.machine.readVRAMAddress(a); }\n}\n\n///\n\nPLATFORMS['sms-sg1000-libcv'] = SG1000Platform;\nPLATFORMS['sms-sms-libcv'] = SMSPlatform;\nPLATFORMS['sms-gg-libcv'] = GameGearPlatform;\n"],
"mappings": "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",
"names": []
}