changeset 1369:3e7a921718de

Fix handling of test register selected sprite layer in border area. Gets rid of the border garbage in the "disco floor/ceiling" scene of OD2
author Michael Pavone <pavone@retrodev.com>
date Tue, 23 May 2017 19:09:57 -0700
parents 4c5a78555209
children eaca4443e831
files vdp.c
diffstat 1 files changed, 11 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/vdp.c	Tue May 23 09:39:22 2017 -0700
+++ b/vdp.c	Tue May 23 19:09:57 2017 -0700
@@ -1494,7 +1494,7 @@
 			switch(test_layer)
 			{
 			case 1:
-				//TODO: Display garbage from bus?
+				bg_color = context->colors[0];
 				for (int i = 0; i < BORDER_LEFT; i++, dst++)
 				{
 					*dst = bg_color;
@@ -1504,10 +1504,6 @@
 				//plane A
 				//TODO: Deal with Window layer
 				int i;
-				/*for (i = 0; i < (context->hscroll_a & 0xF) - (16 - BORDER_LEFT); i++, dst++)
-				{
-					*dst = bg_color;
-				}*/
 				i = 0;
 				uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF) + (16 - BORDER_LEFT);
 				//uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK); 
@@ -1520,10 +1516,6 @@
 			case 3: {
 				//plane B
 				int i;
-				/*for (i = 0; i < (context->hscroll_b & 0xF) - (16 - BORDER_LEFT); i++, dst++)
-				{
-					*dst = bg_color;
-				}*/
 				i = 0;
 				uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF) + (16 - BORDER_LEFT);
 				//uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK); 
@@ -1773,7 +1765,7 @@
 		switch(test_layer)
 			{
 			case 1:
-				//TODO: Display garbage from bus?
+				bg_color = context->colors[0];
 				for (int i = 0; i < BORDER_RIGHT; i++, dst++)
 				{
 					*dst = bg_color;
@@ -1783,10 +1775,6 @@
 				//plane A
 				//TODO: Deal with Window layer
 				int i;
-				/*for (i = 0; i < (context->hscroll_a & 0xF) - (16 - BORDER_LEFT); i++, dst++)
-				{
-					*dst = bg_color;
-				}*/
 				i = 0;
 				uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF);
 				//uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK); 
@@ -1799,10 +1787,6 @@
 			case 3: {
 				//plane B
 				int i;
-				/*for (i = 0; i < (context->hscroll_b & 0xF) - (16 - BORDER_LEFT); i++, dst++)
-				{
-					*dst = bg_color;
-				}*/
 				i = 0;
 				uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF);
 				//uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK); 
@@ -1819,6 +1803,7 @@
 			*dst = bg_color;
 		}
 	}
+	context->done_output = dst;
 	context->buf_a_off = (context->buf_a_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK;
 	context->buf_b_off = (context->buf_b_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK;
 }
@@ -2568,10 +2553,16 @@
 		//plane A
 		src_off += context->buf_a_off + context->hscroll_a;
 		src = context->tmp_buf_a;
-	} else {
+	} else if (test_layer == 3){
 		//plane B
 		src_off += context->buf_b_off + context->hscroll_b;
 		src = context->tmp_buf_b;
+	} else {
+		//sprite layer
+		for (; len >=0; len--, dst++, src_off++)
+		{
+			*dst = context->colors[0];
+		}
 	}
 	for (; len >=0; len--, dst++, src_off++)
 	{
@@ -2659,10 +2650,7 @@
 	}
 		
 	uint8_t test_layer = context->test_port >> 7 & 3;
-	if (test_layer == 1) {
-		//sprite layer doesn't do anything interesting in the passive area
-		test_layer = 0;
-	} else if (test_layer) {
+	if (test_layer) {
 		dst = NULL;
 	}