9front - general discussion about 9front
 help / color / mirror / Atom feed
From: Michael Forney <mforney@mforney.org>
To: 9front@9front.org
Subject: [9front] games/gb: various HDMA fixes
Date: Sun, 07 Feb 2021 23:22:39 +0000	[thread overview]
Message-ID: <62F01D3475CF901E438C0A146D0F8C3C@arrow.hsd1.ca.comcast.net> (raw)

H-blank DMA should only transfer 16 bytes per h-blank, rather than
waiting for the first h-blank and then transferring the whole size.

HDMAC should read 0xff when the transfer is finished, and 0 in the
high bit when the transfer is ongoing. Also, if 0 is written in the
high bit, the current transfer should be aborted.

Introduce two flags, DMAREADY and DMAHBLANK rather than special
constants 1 and -1. If dma is non-zero, there is an ongoing DMA. If
DMAREADY is set, the next chunk is ready to transfer.

Reference: https://gbdev.io/pandocs/#ff55-hdma5-cgb-mode-only-new-dma-length-mode-start

diff 9f73daae4c186334de5c9ee5b6bb0d9aa598f9bd 3fc115a6ff6eef65210fb78a51128958d2b55910
--- a/sys/src/games/gb/dat.h	Sat Feb  6 04:50:06 2021
+++ b/sys/src/games/gb/dat.h	Sun Feb  7 15:22:39 2021
@@ -8,7 +8,7 @@
 extern uchar vram[16384];
 extern int nrom, nback, nbackbank;
 extern u32int pal[64];
-extern s8int dma;
+extern u8int dma;
 extern u32int divclock;
 
 extern Event *elist;
@@ -113,6 +113,9 @@
 	FEATRAM = 1,
 	FEATBAT = 2,
 	FEATTIM = 4,
+
+	DMAREADY = 1,
+	DMAHBLANK = 2,
 	
 	INIT = -1,
 	SAVE = -2,
--- a/sys/src/games/gb/gb.c	Sat Feb  6 04:50:06 2021
+++ b/sys/src/games/gb/gb.c	Sun Feb  7 15:22:39 2021
@@ -308,7 +308,7 @@
 			qlock(&pauselock);
 			qunlock(&pauselock);
 		}
-		if(dma > 0)
+		if(dma & DMAREADY)
 			t = dmastep();
 		else
 			t = step();
--- a/sys/src/games/gb/mem.c	Sat Feb  6 04:50:06 2021
+++ b/sys/src/games/gb/mem.c	Sun Feb  7 15:22:39 2021
@@ -15,7 +15,7 @@
 u32int divclock;
 int prish;
 MBC3Timer timer, timerl;
-s8int dma;
+u8int dma;
 u32int white;
 u32int moncols[4];
 
@@ -175,7 +175,14 @@
 	case HDMAC:
 		if((mode & COL) == 0)
 			goto ff;
-		dma = (v & 0x80) != 0 ? -1 : 1;
+		if(v & 0x80){
+			v &= 0x7f;
+			dma = DMAHBLANK;
+		}else if(dma){
+			v |= 0x80;
+			dma = 0;
+		}else
+			dma = DMAREADY;
 		break;
 	case NR10: v |= 0x80; goto snd;
 	case NR14: case NR24: v |= 0x38; goto snd;
@@ -534,6 +541,7 @@
 	reg[VBK] = 0xfe;
 	reg[SVBK] = 0xf8;
 	reg[IF] = 0xe0;
+	reg[HDMAC] = 0xff;
 }
 
 void
@@ -572,7 +580,7 @@
 {
 	int i;
 	u16int sa, da;
-	
+
 	sa = (reg[HDMASL] | reg[HDMASH] << 8) & 0xfff0;
 	da = (reg[HDMADL] | reg[HDMADH] << 8) & 0x1ff0 | 0x8000;
 	for(i = 0; i < 16; i++)
@@ -583,12 +591,9 @@
 	reg[HDMADL] += 16;
 	if((reg[HDMADL] & 0xf0) == 0)
 		reg[HDMADH]++;
-	if((reg[HDMAC] & 0x7f) == 0)
+	if(--reg[HDMAC] == 0xff)
 		dma = 0;
-	else{
-		reg[HDMAC]--;
-		if((reg[HDMAC] & 0x80) != 0)
-			dma = 1;
-	}
+	else if(dma & DMAHBLANK)
+		dma &= ~DMAREADY;
 	return 64;
 }
--- a/sys/src/games/gb/ppu.c	Sat Feb  6 04:50:06 2021
+++ b/sys/src/games/gb/ppu.c	Sun Feb  7 15:22:39 2021
@@ -338,8 +338,8 @@
 			reg[IF] |= IRQLCDS;
 		t = hblclock + 456 * 2 - clock;
 		addevent(&evhblank, t < 0 ? 456 * 2 : t);
-		if(dma < 0)
-			dma = 1;
+		if(dma & DMAHBLANK)
+			dma |= DMAREADY;
 		break;
 	}
 }

                 reply	other threads:[~2021-02-08  0:50 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=62F01D3475CF901E438C0A146D0F8C3C@arrow.hsd1.ca.comcast.net \
    --to=mforney@mforney.org \
    --cc=9front@9front.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).