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);