8bitworkshop/gen/exidy-4ZSLRK6K.js.map

8 lines
18 KiB
Plaintext

{
"version": 3,
"sources": ["../src/machine/exidy.ts", "../src/platform/exidy.ts"],
"sourcesContent": ["import { MOS6502 } from \"../common/cpu/MOS6502\";\nimport { BasicScanlineMachine, CPU } from \"../common/devices\";\nimport { KeyFlags, Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\n\n// https://github.com/mamedev/mame/blob/e9ac85ca86a873c67d6bc8d7cf2e37bc7696b379/src/mame/exidy/exidy.cpp#L327\n// http://www.arcaderestoration.com/games/9089/Targ.aspx\n// http://www.arcaderestoration.com/memorymap/9089/Targ.aspx\n// http://www.arcaderestoration.com/memorymap/3933/Hard+Hat.aspx\n// https://github.com/mamedev/mame/blob/74c4a0c3774e3aeb4895eb13f3c47773d34ce270/src/mame/shared/exidysound.cpp#L13\n\nconst EXIDY_KEYCODE_MAP = makeKeycodeMap([\n [Keys.START, 1, -0x1],\n //[Keys.START, 1, -0x2],\n [Keys.RIGHT, 1, -0x4],\n [Keys.LEFT, 1, -0x8],\n [Keys.A, 1, -0x10],\n [Keys.UP, 1, -0x20],\n [Keys.DOWN, 1, -0x40],\n [Keys.SELECT, 1, -0x80],\n]);\n\n/*\nROM layout:\n0x0000 - 0x5fff: program ROM\n0x6000 - 0x67ff: sprite ROM\n0x6800 - 0x7fff: audio ROM\n*/\n\nexport class ExidyUGBv2 extends BasicScanlineMachine {\n cpuFrequency = 705562;\n sampleRate = 894886;\n numVisibleScanlines = 256;\n numTotalScanlines = 262;\n cpuCyclesPerLine = 0x150 >> 3;\n canvasWidth = 256;\n defaultROMSize = 0x8000 + 0x800 + 0x2800; // PRG + CHR + SOUND\n cpu = new MOS6502();\n ram = new Uint8Array(0x7000);\n color_latch = [0x54, 0xee, 0x6b]; // RGB\n palette = [\n 0xff000000, 0xff0000ff, 0xffff0000, 0xffff00ff,\n 0xff00ff00, 0xff00ffff, 0xffffff00, 0xffffffff,\n ];\n sprite_gfx: Uint8Array;\n inputs = new Uint8Array(4);\n keyMap = EXIDY_KEYCODE_MAP;\n handler = newKeyboardHandler(this.inputs, this.keyMap); /*, (o,k,c,f) => {\n // coin inserted?\n if (o.index == 1 && o.mask == 128 && (f & KeyFlags.KeyDown)) {\n this.inputs[3] |= 0x40;\n //this.cpu.IRQ();\n //this.ram[0xa2] += 8; // TODO\n }\n });\n */\n scrnbase = 0x4000;\n charbase = 0x6800;\n\n bus = {\n read: newAddressDecoder([\n [0x0000, 0x03ff, 0, (a) => { return this.ram[a]; }],\n [0x1000, 0x3fff, 0, (a) => { return this.rom[a - 0x1000]; }],\n [0x4000, 0x4fff, 0, (a) => { return this.ram[a]; }],\n [0x5100, 0x51ff, 0x03, (a) => { return a == 3 ? this.int_latch() : this.inputs[a] }],\n [0x6000, 0x6fff, 0, (a) => { return this.ram[a]; }],\n [0x8000, 0xffff, 0, (a) => { return this.rom[a - 0x8000]; }],\n ]),\n write: newAddressDecoder([\n [0x0000, 0x03ff, 0, (a, v) => { this.ram[a] = v; }],\n [0x4000, 0x4fff, 0, (a, v) => { this.ram[a] = v; }],\n [0x5000, 0x5101, 0, (a, v) => { this.ram[a] = v; }], // TODO: sprite latch\n [0x5210, 0x5212, 3, (a, v) => { this.setColorLatch(a, v); }],\n [0x6000, 0x6fff, 0, (a, v) => { this.ram[a] = v; }],\n ]),\n }\n\n constructor() {\n super();\n this.connectCPUMemoryBus(this);\n this.updatePalette();\n this.inputs[0] = 0b11101010; // dip switch\n this.inputs[1] = 0b11111111; // active low\n }\n\n loadROM(rom: Uint8Array) {\n super.loadROM(rom);\n if (rom.length < 0x8000) {\n if (rom.length == 11616) { // targ\n this.rom.set(rom.slice(0x2800, 0x3000), 0x8000); // copy sprites\n this.rom.set(rom.slice(0x2700, 0x2800), 0x7f00); // copy ff00-ffff\n this.rom.set(rom.slice(0x0000, 0x2800), 0x0800); // ROM starts @ 0x1800\n this.scrnbase = 0x4000;\n this.charbase = 0x4800;\n } else if (rom.length == 14336) { // spectar\n this.rom.set(rom.slice(0x3400, 0x3800), 0x8000); // copy sprites\n this.rom.set(rom.slice(0x2f00, 0x3000), 0x7f00); // copy ff00-ffff\n this.scrnbase = 0x4000;\n this.charbase = 0x4800;\n } else {\n console.log(\"Warning: ROM is too small\", rom.length);\n }\n }\n let sprite_ofs = 0x8000;\n this.sprite_gfx = this.rom.subarray(sprite_ofs, sprite_ofs + 32 * 32);\n }\n\n read(a: number): number {\n return this.bus.read(a);\n }\n readConst(a: number): number {\n if (a == 0x5103) return this.inputs[3];\n return this.bus.read(a);\n }\n write(a: number, v: number): void {\n this.bus.write(a, v);\n }\n\n int_latch() {\n let intsrc = this.inputs[3];\n intsrc |= (this.inputs[1] & 0x80) ? 0 : 0x40; // coin 1\n this.inputs[3] = 0x80; // clear int latch\n return intsrc; // TODO\n }\n\n updatePalette() {\n /* motion object 1 */\n this.set_1_color(0, 0);\n this.set_1_color(1, 7);\n\n /* motion object 2 */\n this.set_1_color(2, 0);\n this.set_1_color(3, 6);\n\n /* characters */\n this.set_1_color(4, 4);\n this.set_1_color(5, 3);\n this.set_1_color(6, 2);\n this.set_1_color(7, 1);\n }\n set_1_color(index: number, dipsw: number) {\n let r = (this.color_latch[0] & (1 << dipsw)) ? 1 : 0;\n let g = (this.color_latch[1] & (1 << dipsw)) ? 2 : 0;\n let b = (this.color_latch[2] & (1 << dipsw)) ? 4 : 0;\n this.palette[index] = RGB8[r | g | b];\n }\n setColorLatch(a: number, v: number): void {\n this.color_latch[a & 3] = v;\n this.updatePalette();\n }\n drawSprite(xpos: number, ypos: number, ofs: number, palind: number) {\n var sx = 236 - xpos - 4;\n var sy = 244 - ypos - 4;\n /*\n \tm_gfxdecode->gfx(0)->transpen(bitmap,cliprect,\n\t\t\t((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 1,\n\t\t\t0, 0, sx, sy, 0);*/\n sy += 15;\n sy -= this.scanline;\n if (sy >= 0 && sy < 16) {\n sy = 15 - sy;\n //console.log(\"draw sprite\", sx, sy, ofs);\n let yofs = this.scanline * this.canvasWidth;\n let pix = this.sprite_gfx[ofs + sy];\n for (let x = 0; x < 8; x++) {\n if (pix & (0x80 >> x)) {\n this.pixels[yofs + sx + x] = this.palette[palind];\n }\n }\n pix = this.sprite_gfx[ofs + sy + 16];\n for (let x = 0; x < 8; x++) {\n if (pix & (0x80 >> x)) {\n this.pixels[yofs + sx + x + 8] = this.palette[palind];\n }\n }\n }\n }\n drawSprite1() {\n let xpos = this.ram[0x5000];\n let ypos = this.ram[0x5040];\n let set = (this.ram[0x5101] & 0x20) ? 1 : 0;\n let sprite = (this.ram[0x5100] & 0x0f) + 16 * set;\n this.drawSprite(xpos, ypos, sprite * 32, 1);\n }\n drawSprite2() {\n let xpos = this.ram[0x5080];\n let ypos = this.ram[0x50c0];\n let set = (this.ram[0x5101] & 0x40) ? 1 : 0;\n let sprite = (this.ram[0x5100] >> 4) + 16 * set;\n this.drawSprite(xpos, ypos, sprite * 32, 3);\n }\n startScanline(): void {\n }\n drawScanline(): void {\n const y = this.scanline;\n const row = y >> 3;\n const yofs = y * this.canvasWidth;\n for (let x = 0; x < 256; x++) {\n const col = x >> 3;\n let code = this.ram[this.scrnbase + row * 32 + col];\n let color1 = 4 + ((code >> 6) & 0x03);\n let pix = this.ram[this.charbase + code * 8 + (y & 7)];\n let palind = (pix & (0x80 >> (x & 7))) ? color1 : 0;\n this.pixels[yofs + x] = this.palette[palind];\n }\n this.drawSprite2();\n this.drawSprite1();\n }\n postFrame() {\n this.inputs[3] &= 0x7f; // TODO?\n this.cpu.IRQ();\n }\n getVideoParams() {\n return { width: 256, height: 256, aspect: 6/5 };\n }\n}\n\nconst RGB8 = [\n 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff,\n 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff,\n];\n\n\n/*\n 0000-00FF R/W Zero Page RAM\n 0100-01FF R/W Stack RAM\n 0200-03FF R/W Scratchpad RAM\n 0800-3FFF R Program ROM (Targ, Spectar only)\n 1A00 R PX3 (Player 2 inputs) (Fax only)\n bit 4 D\n bit 5 C\n bit 6 B\n bit 7 A\n 1C00 R PX2 (Player 1 inputs) (Fax only)\n bit 0 2 player start\n bit 1 1 player start\n bit 4 D\n bit 5 C\n bit 6 B\n bit 7 A\n 2000-3FFF R Banked question ROM (Fax only)\n 4000-43FF R/W Screen RAM\n 4800-4FFF R/W Character Generator RAM (except Pepper II and Fax)\n 5000 W Motion Object 1 Horizontal Position Latch (sprite 1 X)\n 5040 W Motion Object 1 Vertical Position Latch (sprite 1 Y)\n 5080 W Motion Object 2 Horizontal Position Latch (sprite 2 X)\n 50C0 W Motion Object 2 Vertical Position Latch (sprite 2 Y)\n 5100 R Option Dipswitch Port\n bit 0 coin 2 (NOT inverted) (must activate together with $5103 bit 5)\n bit 1-2 bonus\n bit 3-4 coins per play\n bit 5-6 lives\n bit 7 US/UK coins\n 5100 W Motion Objects Image Latch\n Sprite number bits 0-3 Sprite #1 4-7 Sprite #2\n 5101 R Control Inputs Port\n bit 0 start 1\n bit 1 start 2\n bit 2 right\n bit 3 left\n bit 5 up\n bit 6 down\n bit 7 coin 1 (must activate together with $5103 bit 6)\n 5101 W Output Control Latch (not used in PEPPER II upright)\n bit 7 Enable sprite #1\n bit 6 Enable sprite #2\n 5103 R Interrupt Condition Latch\n bit 0 LNG0 - supposedly a language DIP switch\n bit 1 LNG1 - supposedly a language DIP switch\n bit 2 different for each game, but generally a collision bit\n bit 3 TABLE - supposedly a cocktail table DIP switch\n bit 4 different for each game, but generally a collision bit\n bit 5 coin 2 (must activate together with $5100 bit 0)\n bit 6 coin 1 (must activate together with $5101 bit 7)\n bit 7 L256 - VBlank?\n 5213 R IN2 (Mouse Trap)\n bit 3 blue button\n bit 2 free play\n bit 1 red button\n bit 0 yellow button\n 52XX R/W Audio/Color Board Communications\n 6000-6FFF R/W Character Generator RAM (Pepper II, Fax only)\n 8000-FFF9 R Program memory space\n FFFA-FFFF R Interrupt and Reset Vectors\n\n Exidy Sound Board:\n 0000-07FF R/W RAM (mirrored every 0x7f)\n 0800-0FFF R/W 6532 Timer\n 1000-17FF R/W 6520 PIA\n 1800-1FFF R/W 8253 Timer\n 2000-27FF bit 0 Channel 1 Filter 1 enable\n bit 1 Channel 1 Filter 2 enable\n bit 2 Channel 2 Filter 1 enable\n bit 3 Channel 2 Filter 2 enable\n bit 4 Channel 3 Filter 1 enable\n bit 5 Channel 3 Filter 2 enable\n 2800-2FFF 6840 Timer\n 3000 Bit 0..1 Noise select\n 3001 Bit 0..2 Channel 1 Amplitude\n 3002 Bit 0..2 Channel 2 Amplitude\n 3003 Bit 0..2 Channel 3 Amplitude\n 5800-7FFF ROM\n\n Targ:\n 5200 Sound board control\n bit 0 Music\n bit 1 Shoot\n bit 2 unused\n bit 3 Swarn\n bit 4 Sspec\n bit 5 crash\n bit 6 long\n bit 7 game\n\n 5201 Sound board control\n bit 0 note\n bit 1 upper\n\n MouseTrap:\n 5101 W MouseTrap P1/P2 LED States\n bit 2 Player 1 LED state\n bit 4 Player 2 LED state\n\n MouseTrap Digital Sound:\n 0000-3FFF ROM\n\n IO:\n A7 = 0: R Communication from sound processor\n A6 = 0: R CVSD Clock State\n A5 = 0: W Busy to sound processor\n A4 = 0: W Data to CVSD\n*/\n", "import { Base6502MachinePlatform, Platform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { ExidyUGBv2 } from \"../machine/exidy\";\n\nvar EXIDY_PRESETS = [\n { id: 'minimal.c', name: 'Minimal Example', category: \"C\" },\n];\n\nclass ExidyUGBPlatform extends Base6502MachinePlatform<ExidyUGBv2> implements Platform {\n\n newMachine() { return new ExidyUGBv2(); }\n getPresets() { return EXIDY_PRESETS; }\n getDefaultExtension() { return \".dasm\"; };\n readAddress(a) { return this.machine.readConst(a); }\n\n getMemoryMap() {\n return { main: [\n { name: 'RAM', start: 0x00, size: 0x400, type: 'ram' },\n { name: 'Sprite I/O', start: 0x5000, size: 0x100, type: 'io' },\n { name: 'I/O', start: 0x5100, size: 0x3, type: 'io' },\n { name: 'PIA 6821', start: 0x5200, size: 0xf, type: 'io' },\n { name: 'Color Latches', start: 0x5210, size: 0x3, type: 'io' },\n { name: 'Screen RAM', start: 0x4000, size: 0x400, type: 'ram' },\n { name: 'Character RAM', start: 0x6800, size: 0x800, type: 'ram' },\n { name: 'Audio ROM', start: 0x5800, size: 0x2800, type: 'rom' },\n { name: 'Program ROM', start: 0x8000, size: 0x8000, type: 'rom' },\n ]\n } }\n}\n\nPLATFORMS[\"exidy\"] = ExidyUGBPlatform;\n\n"],
"mappings": "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",
"names": []
}