diff src/vdp.c @ 19:04fc17376999

Sort of working tile rendering and tile test ROM
author Michael Pavone <pavone@retrodev.com>
date Mon, 28 Mar 2016 23:43:31 -0700
parents 04d8efe7a1f0
children 91ded3b12d96
line wrap: on
line diff
--- a/src/vdp.c	Sun Mar 27 22:14:26 2016 -0700
+++ b/src/vdp.c	Mon Mar 28 23:43:31 2016 -0700
@@ -1,5 +1,6 @@
 #include <stdint.h>
 #include <string.h>
+#include <stdio.h>
 #include "vdp.h"
 #include "system.h"
 
@@ -25,7 +26,55 @@
 				context->vcounter = 0;
 			}
 		}
-		//TODO: do rendering stuff here
+		context->status &= ~(VDP_STATUS_VRAM|VDP_STATUS_SRAM);
+		//Render to linebuffer
+		if (context->vcounter > 15 && context->vcounter < 240 && context->hcounter < 406) {
+			if (context->hcounter < 246) {
+				context->status |= VDP_STATUS_VRAM;
+				if (!context->hcounter) {
+					//flip linebuffers
+					if (context->drawbuffer == context->linebuffers) {
+						context->drawbuffer = context->linebuffers + 328;
+						context->readbuffer = context->linebuffers;
+					} else {
+						context->drawbuffer = context->linebuffers;
+						context->readbuffer = context->linebuffers + 328;
+					}
+					context->draw_dest = 0;
+				}
+				if (context->draw_counter) {
+					context->draw_counter--;
+					uint16_t pixels = context->vram[context->draw_source++];
+					for (int i = 0; i < 4; i++)
+					{
+						uint8_t pixel = ((pixels >> ((3-i) * 4)) & 0xF) | context->palpriority;
+						context->drawbuffer[context->draw_dest++] = pixel;
+					}
+				} else {
+					//00VV VVVV VVHH HHHH
+					uint16_t vpos = (context->vscroll & 0x7FF) + context->vcounter - 16;
+					uint16_t vmask = (context->vscroll >> 2) & 0x3E00;
+					uint16_t vcoarse = (vpos << 3) & 0x3FC0;
+					uint16_t vfine = vpos & 7;
+					uint16_t hcoarse = ((context->hscroll >> 3) + context->hcounter/6) & 0x3F;
+					uint16_t tableaddress = hcoarse | (vcoarse & ~vmask) | ((context->vscroll << 3) & vmask);
+					//printf("VCounter: %X, VScroll: %X, HCounter: %X, Table: %X\n", context->vcounter, context->vscroll, context->hcounter, tableaddress);
+					uint16_t entry = context->vram[tableaddress];
+					context->draw_source = (entry & 0x3FF) * 16;
+					if (entry & 0x1000) {
+						context->draw_source += 14 - vfine * 2;
+					} else {
+						context->draw_source += vfine * 2;
+					}
+					context->palpriority = entry >> 9 & 0x70;
+					context->draw_counter = 2;
+					//TODO: handle horizontal flip
+				}
+				//TODO: Scan sprite table
+			} else {
+				//TODO: Render sprites
+			}
+		}
 		//Draw to framebuffer
 		if (context->vcounter > 8 && context->vcounter < 249 && context->hcounter < 320) {
 			if (!context->hcounter && context->vcounter == 9) {
@@ -96,3 +145,13 @@
 	context->fifo = value;
 	context->status |= VDP_STATUS_FIFO;
 }
+
+void vdp_write_hscroll(vdp *context, uint16_t value)
+{
+	context->hscroll = value & 0x1FF;
+	if (value & 0x8000) {
+		context->status |= VDP_STATUS_ENABLED;
+	} else {
+		context->status &= ~VDP_STATUS_ENABLED;
+	}
+}