annotate src/vdp.c @ 22:407725d9a02f

Implemented sprite drawing. Added small sprite example.
author Michael Pavone <pavone@retrodev.com>
date Wed, 30 Mar 2016 19:55:48 -0700
parents 91ded3b12d96
children a085f17b79e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <stdint.h>
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <string.h>
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
3 #include <stdio.h>
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include "vdp.h"
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
5 #include "system.h"
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 void vdp_init(vdp *context, uint32_t clock_div)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 memset(context, 0, sizeof(vdp));
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
10 //clock div specifies the pixel clock divider
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
11 //but our emulation step is half that fast
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
12 context->clock_inc = clock_div*2;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
13 context->drawbuffer = context->linebuffers;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
14 context->readbuffer = context->linebuffers+320;
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 void vdp_run(vdp *context, uint32_t target)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 while (context->cycles < target)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 {
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
21 context->hcounter+=2;
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 if (context->hcounter == 416) {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 context->hcounter = 0;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 context->vcounter++;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 if (context->vcounter == 262) {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 context->vcounter = 0;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 }
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
29 context->status &= ~(VDP_STATUS_VRAM|VDP_STATUS_SRAM);
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
30 //Render to linebuffer
21
91ded3b12d96 Only run rendering hardware when display is enabled
Michael Pavone <pavone@retrodev.com>
parents: 19
diff changeset
31 if ((context->status & VDP_STATUS_ENABLED) && context->vcounter > 15 && context->vcounter < 240 && context->hcounter < 406) {
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
32 if (context->hcounter < 246) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
33 context->status |= VDP_STATUS_VRAM;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
34 if (!context->hcounter) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
35 //flip linebuffers
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
36 if (context->drawbuffer == context->linebuffers) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
37 context->drawbuffer = context->linebuffers + 328;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
38 context->readbuffer = context->linebuffers;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
39 } else {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
40 context->drawbuffer = context->linebuffers;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
41 context->readbuffer = context->linebuffers + 328;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
42 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
43 context->draw_dest = 0;
22
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
44 //enable sprite scanning
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
45 context->status |= VDP_STATUS_SPRITE_SCAN;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
46 context->current_draw = 0;
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
47 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
48 if (context->draw_counter) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
49 context->draw_counter--;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
50 uint16_t pixels = context->vram[context->draw_source++];
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
51 for (int i = 0; i < 4; i++)
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
52 {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
53 uint8_t pixel = ((pixels >> ((3-i) * 4)) & 0xF) | context->palpriority;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
54 context->drawbuffer[context->draw_dest++] = pixel;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
55 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
56 } else {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
57 //00VV VVVV VVHH HHHH
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
58 uint16_t vpos = (context->vscroll & 0x7FF) + context->vcounter - 16;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
59 uint16_t vmask = (context->vscroll >> 2) & 0x3E00;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
60 uint16_t vcoarse = (vpos << 3) & 0x3FC0;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
61 uint16_t vfine = vpos & 7;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
62 uint16_t hcoarse = ((context->hscroll >> 3) + context->hcounter/6) & 0x3F;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
63 uint16_t tableaddress = hcoarse | (vcoarse & ~vmask) | ((context->vscroll << 3) & vmask);
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
64 //printf("VCounter: %X, VScroll: %X, HCounter: %X, Table: %X\n", context->vcounter, context->vscroll, context->hcounter, tableaddress);
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
65 uint16_t entry = context->vram[tableaddress];
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
66 context->draw_source = (entry & 0x3FF) * 16;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
67 if (entry & 0x1000) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
68 context->draw_source += 14 - vfine * 2;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
69 } else {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
70 context->draw_source += vfine * 2;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
71 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
72 context->palpriority = entry >> 9 & 0x70;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
73 context->draw_counter = 2;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
74 //TODO: handle horizontal flip
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
75 }
22
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
76 if (context->status & VDP_STATUS_SPRITE_SCAN) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
77 context->status |= VDP_STATUS_SRAM;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
78 uint16_t pos = context->sram[context->hcounter];
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
79 uint16_t y = pos & 0xFF;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
80 uint16_t x = pos >> 8;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
81 uint16_t atts = context->sram[context->hcounter+1];
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
82 x |= atts << 2 & 0x100;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
83 if (x | y) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
84 uint16_t size = atts & 0x400 ? 16 : 8;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
85 if (context->vcounter >= y && context->vcounter < y + size) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
86 uint16_t address = (atts & 0x3F) * 16;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
87 if (atts & 0x1000) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
88 address += (size-1) * 2 - (context->vcounter - y) * 2;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
89 } else {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
90 address += (context->vcounter - y) * 2;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
91 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
92 context->sprite_draws[context->current_draw].source = address;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
93 context->sprite_draws[context->current_draw].x = x;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
94 context->sprite_draws[context->current_draw].hflip = (atts & 0x800) != 0;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
95 context->sprite_draws[context->current_draw].palpriority = 0x80 | (atts >> 9 & 0x50);
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
96 context->current_draw++;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
97 if (size == 16) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
98 context->sprite_draws[context->current_draw].source = address + 32;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
99 context->sprite_draws[context->current_draw].x = x + 8;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
100 context->sprite_draws[context->current_draw].hflip = (atts & 0x800) != 0;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
101 context->sprite_draws[context->current_draw].palpriority = 0x80 | (atts >> 9 & 0x50);
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
102 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
103 context->current_draw++;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
104 if (context->current_draw == 40) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
105 //no more rendering capacity
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
106 context->status &= ~VDP_STATUS_SPRITE_SCAN;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
107 context->current_draw = 0;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
108 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
109 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
110 } else {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
111 //hit sprite list terminator
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
112 context->status &= ~VDP_STATUS_SPRITE_SCAN;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
113 context->current_draw = 0;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
114 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
115 }
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
116 } else {
22
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
117 sprite_draw *draw = context->sprite_draws + (context->current_draw >> 1);
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
118 if (draw->palpriority) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
119 context->status |= VDP_STATUS_VRAM;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
120 uint16_t pixels = context->vram[draw->source + (context->current_draw & 1)];
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
121 uint16_t x = draw->x - 16 + (context->hscroll & 7);
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
122 for (int i = 0; i < 4; i++, x++)
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
123 {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
124 //TODO: handle horizontal flip
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
125 uint8_t pixel = (pixels >> ((3-i) * 4)) & 0xF;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
126 if (pixel && x < 328 && ((draw->palpriority & 0x40) || !(context->drawbuffer[x] & 0x40))) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
127 context->drawbuffer[x] = pixel | draw->palpriority;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
128 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
129 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
130 if (context->current_draw & 1) {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
131 draw->palpriority = 0;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
132 } else {
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
133 draw->x += 4;
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
134 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
135 }
407725d9a02f Implemented sprite drawing. Added small sprite example.
Michael Pavone <pavone@retrodev.com>
parents: 21
diff changeset
136 context->current_draw++;
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
137 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
138 }
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
139 //Draw to framebuffer
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
140 if (context->vcounter > 8 && context->vcounter < 249 && context->hcounter < 320) {
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
141 if (!context->hcounter && context->vcounter == 9) {
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
142 context->framebuffer = system_get_framebuffer(&context->pitch);
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
143 //pitch is in terms of bytes, but we want it in terms of pixels
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
144 context->pitch /= sizeof(uint16_t);
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
145 }
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
146 uint16_t *dest = context->framebuffer + (context->vcounter - 9) * context->pitch + context->hcounter;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
147 if (context->status & VDP_STATUS_ENABLED && context->vcounter > 16 && context->vcounter < 241) {
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
148 *dest = context->cram[0x3F & context->readbuffer[context->hcounter]];
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
149 dest++;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
150 *dest = context->cram[0x3F & context->readbuffer[context->hcounter+1]];
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
151 } else {
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
152 //Display is disabled or we're in the border area, draw the background color
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
153 *dest = *context->cram;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
154 dest++;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
155 *dest = *context->cram;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
156 }
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
157 } else if(!context->hcounter && context->vcounter == 249) {
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
158 system_framebuffer_updated();
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
159 context->framebuffer = NULL;
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
160 }
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
161 //Handle the FIFO
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 if (context->status & VDP_STATUS_FIFO) {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 switch (context->fifo_dest)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 case FIFO_DEST_VRAM:
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 if (!(context->status & VDP_STATUS_VRAM)) {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 context->vram[context->dest_offset++] = context->fifo;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 context->dest_offset &= sizeof(context->vram)/2-1;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 context->status &= ~VDP_STATUS_FIFO;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 break;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 case FIFO_DEST_SRAM:
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 if (!(context->status & VDP_STATUS_SRAM)) {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 context->sram[context->dest_offset++] = context->fifo;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 context->dest_offset &= sizeof(context->sram)/2-1;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 context->status &= ~VDP_STATUS_FIFO;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 break;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 case FIFO_DEST_CRAM:
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 context->cram[context->dest_offset++] = context->fifo;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 context->dest_offset &= sizeof(context->cram)/2-1;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 context->status &= ~VDP_STATUS_FIFO;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 break;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 context->cycles += context->clock_inc;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 void vdp_write_address(vdp *context, uint16_t value)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 context->status &= ~VDP_STATUS_FIFO;
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
192 if (!(value & 0x8000)) {
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 context->fifo_dest = FIFO_DEST_VRAM;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 context->dest_offset = (value & (sizeof(context->vram) -1))/2;
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
195 } else if ((value & 0xFF00) == 0xFE00) {
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 context->fifo_dest = FIFO_DEST_SRAM;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 context->dest_offset = (value & (sizeof(context->sram) -1))/2;
11
04d8efe7a1f0 Initial stab at video output and background color rendering. Fixed address decoding in address port write handler.
Michael Pavone <pavone@retrodev.com>
parents: 8
diff changeset
198 } else if ((value & 0xFF00) == 0xFF00) {
8
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 context->fifo_dest = FIFO_DEST_CRAM;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 context->dest_offset = (value & (sizeof(context->cram) -1))/2;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 }
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 void vdp_write_data(vdp *context, uint16_t value)
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 {
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 context->fifo = value;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 context->status |= VDP_STATUS_FIFO;
5176efdda5ae Initial work on VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 }
19
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
209
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
210 void vdp_write_hscroll(vdp *context, uint16_t value)
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
211 {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
212 context->hscroll = value & 0x1FF;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
213 if (value & 0x8000) {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
214 context->status |= VDP_STATUS_ENABLED;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
215 } else {
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
216 context->status &= ~VDP_STATUS_ENABLED;
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
217 }
04fc17376999 Sort of working tile rendering and tile test ROM
Michael Pavone <pavone@retrodev.com>
parents: 11
diff changeset
218 }