Mercurial > repos > blastem
comparison vdp.c @ 1157:d5dda22ae6b4
Fix H40 slot mapping to better match old VRAM bus captures and adjust for recent VCounter measurements
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 06 Jan 2017 19:25:04 -0800 |
parents | b519965f6394 |
children | 5f119fe935e7 |
comparison
equal
deleted
inserted
replaced
1156:b519965f6394 | 1157:d5dda22ae6b4 |
---|---|
1555 uint32_t const slot_cycles = MCLKS_SLOT_H40; | 1555 uint32_t const slot_cycles = MCLKS_SLOT_H40; |
1556 switch(context->hslot) | 1556 switch(context->hslot) |
1557 { | 1557 { |
1558 for (;;) | 1558 for (;;) |
1559 { | 1559 { |
1560 case 165: | |
1561 if (context->vcounter == 0x1FF) { | |
1562 external_slot(context); | |
1563 } else { | |
1564 render_sprite_cells(context); | |
1565 } | |
1566 CHECK_LIMIT | |
1567 case 166: | |
1568 if (context->vcounter == 0x1FF) { | |
1569 external_slot(context); | |
1570 } else { | |
1571 render_sprite_cells(context); | |
1572 } | |
1573 CHECK_LIMIT | |
1560 //sprite attribute table scan starts | 1574 //sprite attribute table scan starts |
1561 case 165: | 1575 case 167: |
1562 context->sprite_index = 0x80; | 1576 context->sprite_index = 0x80; |
1563 context->slot_counter = MAX_SPRITES_LINE; | 1577 context->slot_counter = MAX_SPRITES_LINE; |
1564 render_sprite_cells( context); | 1578 render_sprite_cells( context); |
1565 scan_sprite_table(context->vcounter, context); | 1579 scan_sprite_table(context->vcounter, context); |
1566 CHECK_LIMIT | 1580 CHECK_LIMIT |
1567 SPRITE_RENDER_H40(166) | 1581 SPRITE_RENDER_H40(168) |
1568 SPRITE_RENDER_H40(167) | |
1569 case 168: | |
1570 external_slot(context); | |
1571 CHECK_LIMIT | |
1572 SPRITE_RENDER_H40(169) | 1582 SPRITE_RENDER_H40(169) |
1573 SPRITE_RENDER_H40(170) | 1583 SPRITE_RENDER_H40(170) |
1574 SPRITE_RENDER_H40(171) | 1584 SPRITE_RENDER_H40(171) |
1575 SPRITE_RENDER_H40(172) | 1585 SPRITE_RENDER_H40(172) |
1576 SPRITE_RENDER_H40(173) | 1586 SPRITE_RENDER_H40(173) |
1580 SPRITE_RENDER_H40(177) | 1590 SPRITE_RENDER_H40(177) |
1581 SPRITE_RENDER_H40(178) | 1591 SPRITE_RENDER_H40(178) |
1582 SPRITE_RENDER_H40(179) | 1592 SPRITE_RENDER_H40(179) |
1583 SPRITE_RENDER_H40(180) | 1593 SPRITE_RENDER_H40(180) |
1584 SPRITE_RENDER_H40(181) | 1594 SPRITE_RENDER_H40(181) |
1585 //!HSYNC asserted | |
1586 SPRITE_RENDER_H40(182) | 1595 SPRITE_RENDER_H40(182) |
1587 SPRITE_RENDER_H40(229) | 1596 SPRITE_RENDER_H40(229) |
1597 //!HSYNC asserted | |
1588 SPRITE_RENDER_H40(230) | 1598 SPRITE_RENDER_H40(230) |
1589 SPRITE_RENDER_H40(231) | 1599 SPRITE_RENDER_H40(231) |
1590 SPRITE_RENDER_H40(232) | 1600 case 232: |
1601 external_slot(context); | |
1602 CHECK_LIMIT | |
1591 SPRITE_RENDER_H40(233) | 1603 SPRITE_RENDER_H40(233) |
1592 SPRITE_RENDER_H40(234) | 1604 SPRITE_RENDER_H40(234) |
1593 SPRITE_RENDER_H40(235) | 1605 SPRITE_RENDER_H40(235) |
1594 SPRITE_RENDER_H40(236) | 1606 SPRITE_RENDER_H40(236) |
1595 SPRITE_RENDER_H40(237) | 1607 SPRITE_RENDER_H40(237) |
1596 SPRITE_RENDER_H40(238) | 1608 SPRITE_RENDER_H40(238) |
1597 SPRITE_RENDER_H40(239) | 1609 SPRITE_RENDER_H40(239) |
1598 SPRITE_RENDER_H40(240) | 1610 SPRITE_RENDER_H40(240) |
1599 SPRITE_RENDER_H40(241) | 1611 SPRITE_RENDER_H40(241) |
1600 case 242: | 1612 SPRITE_RENDER_H40(242) |
1613 SPRITE_RENDER_H40(243) | |
1614 case 244: | |
1601 address = (context->regs[REG_HSCROLL] & 0x3F) << 10; | 1615 address = (context->regs[REG_HSCROLL] & 0x3F) << 10; |
1602 mask = 0; | 1616 mask = 0; |
1603 if (context->regs[REG_MODE_3] & 0x2) { | 1617 if (context->regs[REG_MODE_3] & 0x2) { |
1604 mask |= 0xF8; | 1618 mask |= 0xF8; |
1605 } | 1619 } |
1613 if (context->flags & FLAG_DMA_RUN) { run_dma_src(context, -1); } | 1627 if (context->flags & FLAG_DMA_RUN) { run_dma_src(context, -1); } |
1614 context->hslot++; | 1628 context->hslot++; |
1615 context->cycles += h40_hsync_cycles[14]; | 1629 context->cycles += h40_hsync_cycles[14]; |
1616 CHECK_ONLY | 1630 CHECK_ONLY |
1617 //!HSYNC high | 1631 //!HSYNC high |
1618 SPRITE_RENDER_H40(243) | |
1619 SPRITE_RENDER_H40(244) | |
1620 SPRITE_RENDER_H40(245) | 1632 SPRITE_RENDER_H40(245) |
1621 SPRITE_RENDER_H40(246) | 1633 SPRITE_RENDER_H40(246) |
1622 case 247: | 1634 SPRITE_RENDER_H40(247) |
1623 read_map_scroll_a(0, context->vcounter, context); | |
1624 CHECK_LIMIT | |
1625 SPRITE_RENDER_H40(248) | 1635 SPRITE_RENDER_H40(248) |
1626 case 249: | 1636 case 249: |
1637 read_map_scroll_a(0, context->vcounter, context); | |
1638 CHECK_LIMIT | |
1639 SPRITE_RENDER_H40(250) | |
1640 case 251: | |
1627 render_map_1(context); | 1641 render_map_1(context); |
1628 scan_sprite_table(context->vcounter, context);//Just a guess | 1642 scan_sprite_table(context->vcounter, context);//Just a guess |
1629 CHECK_LIMIT | 1643 CHECK_LIMIT |
1630 case 250: | 1644 case 252: |
1631 render_map_2(context); | 1645 render_map_2(context); |
1632 scan_sprite_table(context->vcounter, context);//Just a guess | 1646 scan_sprite_table(context->vcounter, context);//Just a guess |
1633 CHECK_LIMIT | 1647 CHECK_LIMIT |
1634 case 251: | 1648 case 253: |
1635 read_map_scroll_b(0, context->vcounter, context); | 1649 read_map_scroll_b(0, context->vcounter, context); |
1636 CHECK_LIMIT | 1650 CHECK_LIMIT |
1637 SPRITE_RENDER_H40(252) | 1651 SPRITE_RENDER_H40(254) |
1638 case 253: | 1652 case 255: |
1639 render_map_3(context); | 1653 render_map_3(context); |
1640 scan_sprite_table(context->vcounter, context);//Just a guess | 1654 scan_sprite_table(context->vcounter, context);//Just a guess |
1641 CHECK_LIMIT | 1655 CHECK_LIMIT |
1642 case 254: | 1656 case 0: |
1643 if (context->vcounter == (context->latched_mode & BIT_PAL ? PAL_INACTIVE_START : NTSC_INACTIVE_START)) { | 1657 if (context->vcounter == (context->latched_mode & BIT_PAL ? PAL_INACTIVE_START : NTSC_INACTIVE_START)) { |
1644 context->flags2 |= FLAG2_VINT_PENDING; | 1658 context->flags2 |= FLAG2_VINT_PENDING; |
1645 context->pending_vint_start = context->cycles; | 1659 context->pending_vint_start = context->cycles; |
1646 } | 1660 } |
1647 render_map_output(context->vcounter, 0, context); | 1661 render_map_output(context->vcounter, 0, context); |
1651 //context->slot_counter = MAX_SPRITES_LINE - context->slot_counter; | 1665 //context->slot_counter = MAX_SPRITES_LINE - context->slot_counter; |
1652 context->cur_slot = MAX_SPRITES_LINE-1; | 1666 context->cur_slot = MAX_SPRITES_LINE-1; |
1653 context->sprite_draws = MAX_DRAWS; | 1667 context->sprite_draws = MAX_DRAWS; |
1654 context->flags &= (~FLAG_CAN_MASK & ~FLAG_MASKED); | 1668 context->flags &= (~FLAG_CAN_MASK & ~FLAG_MASKED); |
1655 CHECK_LIMIT | 1669 CHECK_LIMIT |
1656 COLUMN_RENDER_BLOCK(2, 255) | 1670 COLUMN_RENDER_BLOCK(2, 1) |
1657 COLUMN_RENDER_BLOCK(4, 7) | 1671 COLUMN_RENDER_BLOCK(4, 9) |
1658 COLUMN_RENDER_BLOCK(6, 15) | 1672 COLUMN_RENDER_BLOCK(6, 17) |
1659 COLUMN_RENDER_BLOCK_REFRESH(8, 23) | 1673 COLUMN_RENDER_BLOCK_REFRESH(8, 25) |
1660 COLUMN_RENDER_BLOCK(10, 31) | 1674 COLUMN_RENDER_BLOCK(10, 33) |
1661 COLUMN_RENDER_BLOCK(12, 39) | 1675 COLUMN_RENDER_BLOCK(12, 41) |
1662 COLUMN_RENDER_BLOCK(14, 47) | 1676 COLUMN_RENDER_BLOCK(14, 49) |
1663 COLUMN_RENDER_BLOCK_REFRESH(16, 55) | 1677 COLUMN_RENDER_BLOCK_REFRESH(16, 57) |
1664 COLUMN_RENDER_BLOCK(18, 63) | 1678 COLUMN_RENDER_BLOCK(18, 65) |
1665 COLUMN_RENDER_BLOCK(20, 71) | 1679 COLUMN_RENDER_BLOCK(20, 73) |
1666 COLUMN_RENDER_BLOCK(22, 79) | 1680 COLUMN_RENDER_BLOCK(22, 81) |
1667 COLUMN_RENDER_BLOCK_REFRESH(24, 87) | 1681 COLUMN_RENDER_BLOCK_REFRESH(24, 89) |
1668 COLUMN_RENDER_BLOCK(26, 95) | 1682 COLUMN_RENDER_BLOCK(26, 97) |
1669 COLUMN_RENDER_BLOCK(28, 103) | 1683 COLUMN_RENDER_BLOCK(28, 105) |
1670 COLUMN_RENDER_BLOCK(30, 111) | 1684 COLUMN_RENDER_BLOCK(30, 113) |
1671 COLUMN_RENDER_BLOCK_REFRESH(32, 119) | 1685 COLUMN_RENDER_BLOCK_REFRESH(32, 121) |
1672 COLUMN_RENDER_BLOCK(34, 127) | 1686 COLUMN_RENDER_BLOCK(34, 129) |
1673 COLUMN_RENDER_BLOCK(36, 135) | 1687 COLUMN_RENDER_BLOCK(36, 137) |
1674 COLUMN_RENDER_BLOCK(38, 143) | 1688 COLUMN_RENDER_BLOCK(38, 145) |
1675 COLUMN_RENDER_BLOCK_REFRESH(40, 151) | 1689 COLUMN_RENDER_BLOCK_REFRESH(40, 153) |
1676 case 159: | 1690 case 161: |
1677 external_slot(context); | 1691 external_slot(context); |
1678 CHECK_LIMIT | 1692 CHECK_LIMIT |
1679 case 160: | 1693 case 162: |
1680 external_slot(context); | 1694 external_slot(context); |
1681 CHECK_LIMIT | 1695 CHECK_LIMIT |
1682 //sprite render to line buffer starts | 1696 //sprite render to line buffer starts |
1683 case 161: | 1697 case 163: |
1684 context->cur_slot = MAX_DRAWS-1; | 1698 context->cur_slot = MAX_DRAWS-1; |
1685 memset(context->linebuf, 0, LINEBUF_SIZE); | 1699 memset(context->linebuf, 0, LINEBUF_SIZE); |
1686 render_sprite_cells(context); | |
1687 CHECK_LIMIT | |
1688 case 162: | |
1689 render_sprite_cells(context); | |
1690 CHECK_LIMIT | |
1691 case 163: | |
1692 render_sprite_cells(context); | 1700 render_sprite_cells(context); |
1693 CHECK_LIMIT | 1701 CHECK_LIMIT |
1694 case 164: | 1702 case 164: |
1695 render_sprite_cells(context); | 1703 render_sprite_cells(context); |
1696 vdp_advance_line(context); | 1704 vdp_advance_line(context); |