comparison vdp.c @ 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 5b20840711c1
comparison
equal deleted inserted replaced
1368:4c5a78555209 1369:3e7a921718de
1492 uint32_t bg_color = context->colors[pixel]; 1492 uint32_t bg_color = context->colors[pixel];
1493 if (test_layer) { 1493 if (test_layer) {
1494 switch(test_layer) 1494 switch(test_layer)
1495 { 1495 {
1496 case 1: 1496 case 1:
1497 //TODO: Display garbage from bus? 1497 bg_color = context->colors[0];
1498 for (int i = 0; i < BORDER_LEFT; i++, dst++) 1498 for (int i = 0; i < BORDER_LEFT; i++, dst++)
1499 { 1499 {
1500 *dst = bg_color; 1500 *dst = bg_color;
1501 } 1501 }
1502 break; 1502 break;
1503 case 2: { 1503 case 2: {
1504 //plane A 1504 //plane A
1505 //TODO: Deal with Window layer 1505 //TODO: Deal with Window layer
1506 int i; 1506 int i;
1507 /*for (i = 0; i < (context->hscroll_a & 0xF) - (16 - BORDER_LEFT); i++, dst++)
1508 {
1509 *dst = bg_color;
1510 }*/
1511 i = 0; 1507 i = 0;
1512 uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF) + (16 - BORDER_LEFT); 1508 uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF) + (16 - BORDER_LEFT);
1513 //uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK); 1509 //uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK);
1514 for (; i < BORDER_LEFT; buf_off++, i++, dst++) 1510 for (; i < BORDER_LEFT; buf_off++, i++, dst++)
1515 { 1511 {
1518 break; 1514 break;
1519 } 1515 }
1520 case 3: { 1516 case 3: {
1521 //plane B 1517 //plane B
1522 int i; 1518 int i;
1523 /*for (i = 0; i < (context->hscroll_b & 0xF) - (16 - BORDER_LEFT); i++, dst++)
1524 {
1525 *dst = bg_color;
1526 }*/
1527 i = 0; 1519 i = 0;
1528 uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF) + (16 - BORDER_LEFT); 1520 uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF) + (16 - BORDER_LEFT);
1529 //uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK); 1521 //uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK);
1530 for (; i < BORDER_LEFT; buf_off++, i++, dst++) 1522 for (; i < BORDER_LEFT; buf_off++, i++, dst++)
1531 { 1523 {
1771 uint8_t test_layer = context->test_port >> 7 & 3; 1763 uint8_t test_layer = context->test_port >> 7 & 3;
1772 if (test_layer) { 1764 if (test_layer) {
1773 switch(test_layer) 1765 switch(test_layer)
1774 { 1766 {
1775 case 1: 1767 case 1:
1776 //TODO: Display garbage from bus? 1768 bg_color = context->colors[0];
1777 for (int i = 0; i < BORDER_RIGHT; i++, dst++) 1769 for (int i = 0; i < BORDER_RIGHT; i++, dst++)
1778 { 1770 {
1779 *dst = bg_color; 1771 *dst = bg_color;
1780 } 1772 }
1781 break; 1773 break;
1782 case 2: { 1774 case 2: {
1783 //plane A 1775 //plane A
1784 //TODO: Deal with Window layer 1776 //TODO: Deal with Window layer
1785 int i; 1777 int i;
1786 /*for (i = 0; i < (context->hscroll_a & 0xF) - (16 - BORDER_LEFT); i++, dst++)
1787 {
1788 *dst = bg_color;
1789 }*/
1790 i = 0; 1778 i = 0;
1791 uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF); 1779 uint8_t buf_off = context->buf_a_off - (context->hscroll_a & 0xF);
1792 //uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK); 1780 //uint8_t *src = context->tmp_buf_a + ((context->buf_a_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_a & 0xF))) & SCROLL_BUFFER_MASK);
1793 for (; i < BORDER_RIGHT; buf_off++, i++, dst++) 1781 for (; i < BORDER_RIGHT; buf_off++, i++, dst++)
1794 { 1782 {
1797 break; 1785 break;
1798 } 1786 }
1799 case 3: { 1787 case 3: {
1800 //plane B 1788 //plane B
1801 int i; 1789 int i;
1802 /*for (i = 0; i < (context->hscroll_b & 0xF) - (16 - BORDER_LEFT); i++, dst++)
1803 {
1804 *dst = bg_color;
1805 }*/
1806 i = 0; 1790 i = 0;
1807 uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF); 1791 uint8_t buf_off = context->buf_b_off - (context->hscroll_b & 0xF);
1808 //uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK); 1792 //uint8_t *src = context->tmp_buf_b + ((context->buf_b_off + (i ? 0 : (16 - BORDER_LEFT) - (context->hscroll_b & 0xF))) & SCROLL_BUFFER_MASK);
1809 for (; i < BORDER_RIGHT; buf_off++, i++, dst++) 1793 for (; i < BORDER_RIGHT; buf_off++, i++, dst++)
1810 { 1794 {
1817 for (int i = 0; i < BORDER_RIGHT; i++, dst++) 1801 for (int i = 0; i < BORDER_RIGHT; i++, dst++)
1818 { 1802 {
1819 *dst = bg_color; 1803 *dst = bg_color;
1820 } 1804 }
1821 } 1805 }
1806 context->done_output = dst;
1822 context->buf_a_off = (context->buf_a_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK; 1807 context->buf_a_off = (context->buf_a_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK;
1823 context->buf_b_off = (context->buf_b_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK; 1808 context->buf_b_off = (context->buf_b_off + SCROLL_BUFFER_DRAW) & SCROLL_BUFFER_MASK;
1824 } 1809 }
1825 1810
1826 #define CHECK_ONLY if (context->cycles >= target_cycles) { return; } 1811 #define CHECK_ONLY if (context->cycles >= target_cycles) { return; }
2566 uint8_t *src; 2551 uint8_t *src;
2567 if (test_layer == 2) { 2552 if (test_layer == 2) {
2568 //plane A 2553 //plane A
2569 src_off += context->buf_a_off + context->hscroll_a; 2554 src_off += context->buf_a_off + context->hscroll_a;
2570 src = context->tmp_buf_a; 2555 src = context->tmp_buf_a;
2571 } else { 2556 } else if (test_layer == 3){
2572 //plane B 2557 //plane B
2573 src_off += context->buf_b_off + context->hscroll_b; 2558 src_off += context->buf_b_off + context->hscroll_b;
2574 src = context->tmp_buf_b; 2559 src = context->tmp_buf_b;
2560 } else {
2561 //sprite layer
2562 for (; len >=0; len--, dst++, src_off++)
2563 {
2564 *dst = context->colors[0];
2565 }
2575 } 2566 }
2576 for (; len >=0; len--, dst++, src_off++) 2567 for (; len >=0; len--, dst++, src_off++)
2577 { 2568 {
2578 *dst = context->colors[src[src_off & SCROLL_BUFFER_MASK] & 0x3F]; 2569 *dst = context->colors[src[src_off & SCROLL_BUFFER_MASK] & 0x3F];
2579 } 2570 }
2657 ) { 2648 ) {
2658 dst = context->output + 2 * (context->hslot - BG_START_SLOT); 2649 dst = context->output + 2 * (context->hslot - BG_START_SLOT);
2659 } 2650 }
2660 2651
2661 uint8_t test_layer = context->test_port >> 7 & 3; 2652 uint8_t test_layer = context->test_port >> 7 & 3;
2662 if (test_layer == 1) { 2653 if (test_layer) {
2663 //sprite layer doesn't do anything interesting in the passive area
2664 test_layer = 0;
2665 } else if (test_layer) {
2666 dst = NULL; 2654 dst = NULL;
2667 } 2655 }
2668 2656
2669 while(context->cycles < target_cycles) 2657 while(context->cycles < target_cycles)
2670 { 2658 {