diff vdp.c @ 329:fd5f6577db9b

Implement first line/last line weirdness in VDP
author Mike Pavone <pavone@retrodev.com>
date Mon, 13 May 2013 21:52:33 -0700
parents bf7ed23efa40
children 57453d3d8be4
line wrap: on
line diff
--- a/vdp.c	Mon May 13 21:36:33 2013 -0700
+++ b/vdp.c	Mon May 13 21:52:33 2013 -0700
@@ -770,12 +770,14 @@
 	case 0:
 		context->cur_slot = MAX_DRAWS-1;
 		memset(context->linebuf, 0, LINEBUF_SIZE);
-		render_sprite_cells(context);
-		break;
 	case 1:
 	case 2:
 	case 3:
-		render_sprite_cells(context);
+		if (line == 0xFF) {
+			external_slot(context);
+		} else {
+			render_sprite_cells(context);
+		}
 		break;
 	//sprite attribute table scan starts
 	case 4:
@@ -922,12 +924,14 @@
 	case 0:
 		context->cur_slot = MAX_DRAWS_H32-1;
 		memset(context->linebuf, 0, LINEBUF_SIZE);
-		render_sprite_cells(context);
-		break;
 	case 1:
 	case 2:
 	case 3:
-		render_sprite_cells(context);
+		if (line == 0xFF) {
+			external_slot(context);
+		} else {
+			render_sprite_cells(context);
+		}
 		break;
 	//sprite attribute table scan starts
 	case 4:
@@ -1126,7 +1130,7 @@
 				context->flags2 |= FLAG2_VINT_PENDING;
 			}
 		}
-		if (line < active_lines && context->regs[REG_MODE_2] & DISPLAY_ENABLE) {
+		if ((line < active_lines || (line == active_lines && linecyc < (context->latched_mode & BIT_H40 ? 64 : 80))) && context->regs[REG_MODE_2] & DISPLAY_ENABLE) {
 			//first sort-of active line is treated as 255 internally
 			//it's used for gathering sprite info for line 
 			line = (line - 1) & 0xFF;