Mercurial > repos > simple16
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; + } +}