From 8bb67e56103d2a5ffc295a57193e9459a8f77c66 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Thu, 23 Aug 2018 19:45:36 -0400 Subject: [PATCH] more platform tests --- javatari.js | 2 +- src/baseplatform.ts | 2 +- src/platform/vcs.ts | 8 +-- src/platform/vector.ts | 33 +++++---- test/cli/testplatforms.js | 83 +++++++++++++++++++++-- test/roms/galaxian-scramble/shoot2.c.rom | Bin 0 -> 20512 bytes test/roms/mw8080bw/game2.c.rom | Bin 0 -> 8192 bytes test/roms/sound_williams-z80/swave.c.rom | Bin 0 -> 16384 bytes test/roms/vector-z80color/game.c.rom | Bin 0 -> 32768 bytes test/roms/vicdual/snake1.c.rom | Bin 0 -> 16416 bytes test/roms/williams-z80/game1.c.rom | Bin 0 -> 38912 bytes 11 files changed, 102 insertions(+), 26 deletions(-) create mode 100644 test/roms/galaxian-scramble/shoot2.c.rom create mode 100644 test/roms/mw8080bw/game2.c.rom create mode 100644 test/roms/sound_williams-z80/swave.c.rom create mode 100644 test/roms/vector-z80color/game.c.rom create mode 100644 test/roms/vicdual/snake1.c.rom create mode 100644 test/roms/williams-z80/game1.c.rom diff --git a/javatari.js b/javatari.js index 67d15ccb..8f5767e4 160000 --- a/javatari.js +++ b/javatari.js @@ -1 +1 @@ -Subproject commit 67d15ccb4940c0049fcd6444a72316148056e5b3 +Subproject commit 8f5767e4ca9a759d759e9a09677d649d58f6aff7 diff --git a/src/baseplatform.ts b/src/baseplatform.ts index ebf361b7..d3fdbf21 100644 --- a/src/baseplatform.ts +++ b/src/baseplatform.ts @@ -21,7 +21,7 @@ export interface CpuState { }; export interface EmuState { c:CpuState, // CPU state - b?:number[] // RAM + b?:number[] // RAM (TODO: not for vcs) }; export interface EmuControlsState { } diff --git a/src/platform/vcs.ts b/src/platform/vcs.ts index 59dc2aee..6e40cb57 100644 --- a/src/platform/vcs.ts +++ b/src/platform/vcs.ts @@ -49,7 +49,6 @@ Javatari.AUDIO_BUFFER_SIZE = 256; class VCSPlatform { - current_output; recorder : EmuRecorder; paused : boolean = true; @@ -70,7 +69,6 @@ class VCSPlatform { loadROM(title, data) { Javatari.loadROM(title, data); - this.current_output = data; // TODO: use bus } getOpcodeMetadata(opcode, offset) { @@ -155,9 +153,11 @@ class VCSPlatform { loadControlsState(state) { Javatari.room.console.loadControlsState(state); } - // TODO: load/save controls state readAddress(addr) { - return this.current_output[addr & 0xfff]; // TODO: use bus to read + return Javatari.room.console.readAddress(addr); + } + writeAddress(addr,value) { + Javatari.room.console.writeAddress(addr,value); } runUntilReturn() { var depth = 1; diff --git a/src/platform/vector.ts b/src/platform/vector.ts index ded29326..1a13e79f 100644 --- a/src/platform/vector.ts +++ b/src/platform/vector.ts @@ -106,8 +106,12 @@ var AtariVectorPlatform = function(mainElement) { dvg = new DVGBWStateMachine(bus, video, 0x4000); audio = newPOKEYAudio(); video.create(); - timer = new AnimationTimer(60, function() { - video.clear(); + timer = new AnimationTimer(60, this.nextFrame.bind(this)); + setKeyboardFromMap(video, switches, ASTEROIDS_KEYCODE_MAP); + } + + this.advance = function(novideo) { + if (!novideo) video.clear(); var debugCond = self.getDebugCallback(); clock = 0; for (var i=0; i { } }); assert.equal(platform.saveState().p.SA, 0xff ^ 0x40); + assert.equal(60, platform.readAddress(0x80)); // player x pos }); it('Should run nes', () => { var platform = testPlatform('nes', 'shoot2.c.rom', 70, (platform, frameno) => { if (frameno == 60) { - keycallback(Keys.VK_Z.c, Keys.VK_Z.c, 1); + keycallback(Keys.VK_LEFT.c, Keys.VK_LEFT.c, 1); } }); - assert.equal(65, platform.saveControlsState().c1[0]); + assert.equal(120-10, platform.readAddress(0x41d)); // player x pos }); + it('Should run vicdual', () => { + var platform = testPlatform('vicdual', 'snake1.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_DOWN.c, Keys.VK_DOWN.c, 1); + } + }); + }); + + it('Should run mw8080bw', () => { + var platform = testPlatform('mw8080bw', 'game2.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_LEFT.c, Keys.VK_LEFT.c, 1); + } + }); + assert.equal(96-9*2, platform.readAddress(0x2006)); // player x pos + }); + + it('Should run galaxian', () => { + var platform = testPlatform('galaxian-scramble', 'shoot2.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_LEFT.c, Keys.VK_LEFT.c, 1); + } + }); + assert.equal(112-10, platform.readAddress(0x4074)); // player x pos + }); + + it('Should run vector', () => { + var platform = testPlatform('vector-z80color', 'game.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_UP.c, Keys.VK_UP.c, 1); + } + }); + }); + + it('Should run williams', () => { + var platform = testPlatform('williams-z80', 'game1.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_LEFT.c, Keys.VK_LEFT.c, 1); + } + }); + }); +/* + it('Should run sound_williams', () => { + var platform = testPlatform('sound_williams-z80', 'swave.c.rom', 70, (platform, frameno) => { + if (frameno == 60) { + keycallback(Keys.VK_2.c, Keys.VK_2.c, 1); + } + }); + }); +*/ }); + diff --git a/test/roms/galaxian-scramble/shoot2.c.rom b/test/roms/galaxian-scramble/shoot2.c.rom new file mode 100644 index 0000000000000000000000000000000000000000..dbb4783952ad9466e215f36fa0ae8935d00a977b GIT binary patch literal 20512 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 HUnTHgTD8m` literal 0 HcmV?d00001 diff --git a/test/roms/vicdual/snake1.c.rom b/test/roms/vicdual/snake1.c.rom new file mode 100644 index 0000000000000000000000000000000000000000..f1963ba2251c95acd86bdabccd7ceddab45cdbb0 GIT binary patch literal 16416 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 V{oaC$E8+-n1ULd5f&aG%{5KsOh)n