From cc385b7d9850708711bf899b0379a1fa1b5307c5 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sun, 16 Jul 2023 21:43:10 -0500 Subject: [PATCH] atari7800: fixed write mode --- src/machine/atari7800.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/machine/atari7800.ts b/src/machine/atari7800.ts index e0ca600e..ec61f81c 100644 --- a/src/machine/atari7800.ts +++ b/src/machine/atari7800.ts @@ -114,6 +114,7 @@ class MARIA { dli : boolean = false; h16 : boolean = false; h8 : boolean = false; + writemode : number = 0; indirect : boolean = false; pixels = new Uint8Array(320); WSYNC : number = 0; @@ -140,6 +141,7 @@ class MARIA { h16: this.h16, h8: this.h8, indirect: this.indirect, + writemode: this.writemode, }; } loadState(s) { @@ -152,6 +154,7 @@ class MARIA { this.h16 = !!s.h16; this.h8 = !!s.h8; this.indirect = !!s.indirect; + this.writemode = s.writemode|0; } isDMAEnabled() { return (this.regs[0x1c] & 0x60) == 0x40; @@ -225,7 +228,6 @@ class MARIA { let b2 = bus.read(dlhi + ((dlofs+2) & 0x1ff)); let b3 = bus.read(dlhi + ((dlofs+3) & 0x1ff)); let indirect = false; - const writemode = b1 & 0x80; // extended header? if ((b1 & 31) == 0) { var pal = b3 >> 5; @@ -234,6 +236,7 @@ class MARIA { indirect = (b1 & 0x20) != 0; dlofs += 5; this.cycles += 10; + this.writemode = b1 & 0x80; } else { // direct mode var xpos = b3; @@ -247,7 +250,7 @@ class MARIA { xpos *= 2; const ctrlreg = this.regs[0x1c]; // gfx mode (readmode + writemode * 4) - const grmode = (ctrlreg & 0x3) + (writemode ? 4 : 0); + const grmode = (ctrlreg & 0x3) + (this.writemode ? 4 : 0); // kangaroo mode const kangaroo = (ctrlreg & 0x4) != 0; // double bytes? @@ -687,12 +690,14 @@ export class Atari7800 extends BasicMachine implements RasterFrameBased { // extended header? let indirect = false; let description = ""; + let writemode; const grmode = (ctrlreg & 0x3) + ((b1 & 0x80) ? 4 : 0); if ((b1 & 31) == 0) { var pal = b3 >> 5; var width = 32 - (b3 & 31); var xpos = this.readConst(dlhi + ((dlofs+4) & 0x1ff)); indirect = (b1 & 0x20) != 0; + writemode = b1 & 0x80; dlofs += 5; } else { // direct mode @@ -702,6 +707,7 @@ export class Atari7800 extends BasicMachine implements RasterFrameBased { dlofs += 4; } description += "X=" + xpos + " W=" + width + " P=" + pal; + if (writemode) description += " WM=1"; if (indirect) description += " CHR=$" + hex((this.maria.regs[0x14] + this.maria.offset) & 0xff) + "xx"; let gfxadr = b0 + (((b2 + (indirect?0:this.maria.offset)) & 0xff) << 8); description = " $" + hex(gfxadr,4) + " " + description;