From 806687c31de680c710e8c4cf8def315910cba0c5 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 7 May 2019 22:36:06 -0400 Subject: [PATCH] will load bios on startup from binary file "local/.rom" --- src/baseplatform.ts | 1 + src/platform/astrocade.ts | 7 +-- src/platform/atari8.ts | 96 ++++++++++++++++++++++----------------- src/ui.ts | 11 +++++ tss | 2 +- 5 files changed, 68 insertions(+), 49 deletions(-) diff --git a/src/baseplatform.ts b/src/baseplatform.ts index 644c76cd..43034574 100644 --- a/src/baseplatform.ts +++ b/src/baseplatform.ts @@ -64,6 +64,7 @@ export interface Platform { pause() : void; resume() : void; loadROM(title:string, rom:any); // TODO: Uint8Array + loadBIOS?(title:string, rom:Uint8Array); loadState?(state : EmuState) : void; saveState?() : EmuState; diff --git a/src/platform/astrocade.ts b/src/platform/astrocade.ts index 1a25f26f..017664ca 100644 --- a/src/platform/astrocade.ts +++ b/src/platform/astrocade.ts @@ -183,11 +183,7 @@ const _BallyAstrocadePlatform = function(mainElement, arcade) { start = function() { ram = new RAM(arcade ? 0x5000 : 0x1000); - var lzgrom = window['ASTROCADE_LZGROM'] || window['ASTROCADE_BIOS_LZG']; - if (lzgrom) - bios = new lzgmini().decode(stringToByteArray(atob(lzgrom))); - else - bios = padBytes(ASTROCADE_MINIMAL_BIOS, 0x2000); + bios = padBytes(ASTROCADE_MINIMAL_BIOS, 0x2000); if (!arcade) { // game console membus = { @@ -497,4 +493,3 @@ var ASTROCADE_MINIMAL_BIOS = [ 0xe9, ]; -//var ASTROCADE_BIOS_LZG = decodeURIComponent(); diff --git a/src/platform/atari8.ts b/src/platform/atari8.ts index c11f8850..edde6b4a 100644 --- a/src/platform/atari8.ts +++ b/src/platform/atari8.ts @@ -1,7 +1,7 @@ "use strict"; import { Platform, Base6502Platform, BaseMAMEPlatform, getOpcodeMetadata_6502, getToolForFilename_6502 } from "../baseplatform"; -import { PLATFORMS, RAM, newAddressDecoder, padBytes, noise, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap, dumpRAM } from "../emu"; +import { PLATFORMS, RAM, newAddressDecoder, padBytes, noise, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap, dumpRAM, getMousePos } from "../emu"; import { hex, lzgmini, stringToByteArray, lpad, rpad, rgb2bgr } from "../util"; import { MasterAudio, POKEYDeviceChannel } from "../audio"; @@ -12,6 +12,11 @@ var Atari8_PRESETS = [ {id:'hellopm.a', name:'Hello Sprites (ASM)'}, ]; +const ATARI8_KEYCODE_MAP = makeKeycodeMap([ + [Keys.VK_SPACE, 0, 0], + [Keys.VK_ENTER, 0, 0], +]); + function newPOKEYAudio() { var pokey1 = new POKEYDeviceChannel(); var audio = new MasterAudio(); @@ -25,6 +30,9 @@ function newPOKEYAudio() { // https://www.atarimax.com/jindroush.atari.org/atanttim.html // http://www.virtualdub.org/blog/pivot/entry.php?id=243 // http://www.beipmu.com/Antic_Timings.txt +// https://user.xmission.com/~trevin/atari/antic_regs.html +// https://user.xmission.com/~trevin/atari/antic_insns.html +// http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html const PF_LEFT = [999,64,48,32]; const PF_RIGHT = [999,192,208,224]; @@ -135,7 +143,7 @@ class ANTIC { this.setLeftRight(); break; case NMIRES: - this.regs[NMIST] = 0; + this.regs[NMIST] = 0x1f; break; } } @@ -158,8 +166,9 @@ class ANTIC { this.yofs++; } if (!this.linesleft) { - if (this.mode & 0x80) + if (this.mode & 0x80) { this.triggerInterrupt(0x80); // Display List Interrupt (DLI) + } this.mode = this.nextInsn(); this.setLeftRight(); stolen++; @@ -213,7 +222,7 @@ class ANTIC { triggerInterrupt(mask : number) { if (this.regs[NMIEN] & mask) { this.nmiPending = true; - //this.regs[NMIST] = mask | 0x1f; + this.regs[NMIST] |= mask; } } @@ -262,13 +271,16 @@ class ANTIC { if (mode < 8) { // character mode let ch = this.ch = this.nextScreen(); let addrofs = this.yofs; + let chbase = this.regs[CHBASE]; // modes 6 & 7 if ((mode & 0xe) == 6) { // or 7 ch &= 0x3f; + chbase &= 0xfe; } else { ch &= 0x7f; + chbase &= 0xfc; } - let addr = (ch<<3) + (this.regs[CHBASE]<<8); + let addr = (ch<<3) + (chbase<<8); // modes 2 & 3 if ((mode & 0xe) == 2) { // or 3 let chactl = this.regs[CHACTL]; @@ -312,6 +324,8 @@ class ANTIC { } // GTIA +// https://user.xmission.com/~trevin/atari/gtia_regs.html + // write regs const HPOSP0 = 0x0; const HPOSM0 = 0x4; @@ -430,7 +444,7 @@ const _Atari8Platform = function(mainElement) { var timer; // TODO : AnimationTimer; var antic : ANTIC; var gtia : GTIA; - var kbdlatch = 0; + var inputs = new Uint8Array(4); class Atari8Platform extends Base6502Platform implements Platform { @@ -440,12 +454,7 @@ const _Atari8Platform = function(mainElement) { start() { cpu = new jt.M6502(); ram = new RAM(0x4000); // TODO - var lzgrom = window['ATARI5200_LZGROM']; - if (lzgrom) { - bios = new lzgmini().decode(stringToByteArray(atob(lzgrom))); - } else { - bios = padBytes([0], 0x800); // TODO - } + bios = new Uint8Array(0x800); bus = { // TODO: https://github.com/dmlloyd/atari800/blob/master/DOC/cart.txt // TODO: http://atariage.com/forums/topic/169971-5200-memory-map/ @@ -470,31 +479,22 @@ const _Atari8Platform = function(mainElement) { video = new RasterVideo(mainElement, 352, 192); audio = newPOKEYAudio(); video.create(); - video.setKeyboardEvents((key,code,flags) => { - if (flags & 1) { - if (code) { - // convert to uppercase for Apple ][ - if (code >= 0x61 && code <= 0x7a) - code -= 0x20; - kbdlatch = (code | 0x80) & 0xff; - } else if (key) { - switch (key) { - case 16: return; // shift - case 17: return; // ctrl - case 18: return; // alt - case 37: key=8; break; // left - case 39: key=21; break; // right - case 38: key=11; break; // up - case 40: key=10; break; // down - } - if (key >= 65 && key < 65+26) { - if (flags & 5) key -= 64; // ctrl - } - kbdlatch = (key | 0x80) & 0xff; - } - } + setKeyboardFromMap(video, inputs, ATARI8_KEYCODE_MAP, (o,key,code,flags) => { + // TODO }); timer = new AnimationTimer(60, this.nextFrame.bind(this)); + // setup mouse events + var rasterPosBreakFn = (e) => { + if (e.ctrlKey) { + var clickpos = getMousePos(e.target, e); + this.runEval( (c) => { + var pos = {x:antic.h, y:this.getRasterScanline()}; + return (pos.x == (clickpos.x&~3)) && (pos.y == (clickpos.y|0)); + }); + } + }; + var jacanvas = $("#emulator").find("canvas"); + jacanvas.mousedown(rasterPosBreakFn); } advance(novideo : boolean) { @@ -503,6 +503,9 @@ const _Atari8Platform = function(mainElement) { var debugCond = this.getDebugCallback(); var rgb; var freeClocks = 0; + // load controls + // TODO + gtia.regs[0x10] = inputs[0] ^ 1; // visible lines for (var sl=0; sl { + console.log('loading BIOS') + platform.loadBIOS('BIOS', biosdata); + }); + } +} + function showDebugInfo(state?) { var meminfo = $("#mem_info"); var allcats = platform.getDebugCategories && platform.getDebugCategories(); @@ -1482,6 +1492,7 @@ function startPlatform() { } // start platform and load file platform.start(); + loadBIOSFromProject(); initProject(); loadProject(qs['file']); setupDebugControls(); diff --git a/tss b/tss index 61a1691a..5b5ee67f 160000 --- a/tss +++ b/tss @@ -1 +1 @@ -Subproject commit 61a1691a1de05dca3b694bf603db49ffbaf572cf +Subproject commit 5b5ee67fc06956bc7dce51726e98812d2d897eaa