Mercurial > repos > blastem
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 { |