trunk/src/mame/machine/megavdp.c
| r22068 | r22069 | |
| 2498 | 2498 | void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running_machine &machine, int scanline) |
| 2499 | 2499 | { |
| 2500 | 2500 | sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually |
| 2501 | UINT16 *lineptr; |
| 2501 | 2502 | |
| 2502 | | |
| 2503 | | UINT16*lineptr; |
| 2504 | | int x; |
| 2505 | | |
| 2506 | 2503 | if (!m_use_alt_timing) |
| 2507 | | { |
| 2508 | 2504 | lineptr = &m_render_bitmap->pix16(scanline); |
| 2509 | | } |
| 2510 | 2505 | else |
| 2511 | | { |
| 2512 | 2506 | lineptr = m_render_line; |
| 2513 | | } |
| 2514 | 2507 | |
| 2515 | | |
| 2516 | 2508 | if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(scanline); |
| 2517 | 2509 | |
| 2518 | | |
| 2519 | | |
| 2520 | | if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT) |
| 2510 | for (int x = 0; x < 320; x++) |
| 2521 | 2511 | { |
| 2522 | | for (x=0;x<320;x++) |
| 2523 | | { |
| 2524 | | UINT32 dat; |
| 2525 | | dat = m_video_renderline[x]; |
| 2526 | | int drawn = 0; |
| 2512 | UINT32 dat = m_video_renderline[x]; |
| 2513 | int drawn = 0; |
| 2527 | 2514 | |
| 2528 | | // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled... |
| 2529 | | if (_32xdev) |
| 2530 | | { |
| 2531 | | if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0)) |
| 2532 | | { |
| 2533 | | if (!_32xdev->m_32x_videopriority) |
| 2534 | | { |
| 2535 | | if (!(_32xdev->m_32x_linerender[x]&0x8000)) |
| 2536 | | { |
| 2537 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2538 | | drawn = 1; |
| 2539 | | } |
| 2540 | | } |
| 2541 | | else |
| 2542 | | { |
| 2543 | | if ((_32xdev->m_32x_linerender[x]&0x8000)) |
| 2544 | | { |
| 2545 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2546 | | drawn = 1; |
| 2547 | | } |
| 2548 | | } |
| 2549 | | } |
| 2550 | | } |
| 2515 | // low priority 32x - if it's the bg pen, we have a 32x, and its display is enabled... |
| 2516 | if (_32xdev && dat & 0x20000) |
| 2517 | drawn = _32xdev->_32x_render_videobuffer_to_screenbuffer_lopri(x, lineptr[x]); |
| 2551 | 2518 | |
| 2552 | | if (!(dat&0x20000)) |
| 2553 | | m_render_line_raw[x] = 0x100; |
| 2554 | | else |
| 2555 | | m_render_line_raw[x] = 0x000; |
| 2519 | if (!(dat & 0x20000)) |
| 2520 | m_render_line_raw[x] = 0x100; |
| 2521 | else |
| 2522 | m_render_line_raw[x] = 0x000; |
| 2556 | 2523 | |
| 2557 | 2524 | |
| 2558 | | if (drawn==0) |
| 2525 | if (!drawn) |
| 2526 | { |
| 2527 | if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT) |
| 2559 | 2528 | { |
| 2560 | | if (dat&0x10000) |
| 2529 | if (dat & 0x10000) |
| 2561 | 2530 | { |
| 2562 | | lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)]; |
| 2531 | lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat & 0x3f)]; |
| 2563 | 2532 | m_render_line_raw[x] |= (dat & 0x3f) | 0x080; |
| 2564 | 2533 | } |
| 2565 | 2534 | else |
| 2566 | 2535 | { |
| 2567 | | lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)]; |
| 2536 | lineptr[x] = megadrive_vdp_palette_lookup[(dat & 0x3f)]; |
| 2568 | 2537 | m_render_line_raw[x] |= (dat & 0x3f) | 0x040; |
| 2569 | 2538 | } |
| 2570 | | } |
| 2571 | 2539 | |
| 2572 | | |
| 2573 | | |
| 2574 | | } |
| 2575 | | } |
| 2576 | | else |
| 2577 | | { |
| 2578 | | for (x=0;x<320;x++) |
| 2579 | | { |
| 2580 | | UINT32 dat; |
| 2581 | | dat = m_video_renderline[x]; |
| 2582 | | |
| 2583 | | int drawn = 0; |
| 2584 | | |
| 2585 | | // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled... |
| 2586 | | if (_32xdev) |
| 2587 | | { |
| 2588 | | if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0)) |
| 2589 | | { |
| 2590 | | if (!_32xdev->m_32x_videopriority) |
| 2591 | | { |
| 2592 | | if (!(_32xdev->m_32x_linerender[x]&0x8000)) |
| 2593 | | { |
| 2594 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2595 | | drawn = 1; |
| 2596 | | } |
| 2597 | | } |
| 2598 | | else |
| 2599 | | { |
| 2600 | | if ((_32xdev->m_32x_linerender[x]&0x8000)) |
| 2601 | | { |
| 2602 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2603 | | drawn = 1; |
| 2604 | | } |
| 2605 | | } |
| 2606 | | } |
| 2607 | 2540 | } |
| 2608 | | |
| 2609 | | if (!(dat&0x20000)) |
| 2610 | | m_render_line_raw[x] = 0x100; |
| 2611 | 2541 | else |
| 2612 | | m_render_line_raw[x] = 0x000; |
| 2613 | | |
| 2614 | | |
| 2615 | | if (drawn==0) |
| 2616 | 2542 | { |
| 2617 | 2543 | /* Verify my handling.. I'm not sure all cases are correct */ |
| 2618 | | switch (dat&0x1e000) |
| 2544 | switch (dat & 0x1e000) |
| 2619 | 2545 | { |
| 2620 | 2546 | case 0x00000: // low priority, no shadow sprite, no highlight = shadow |
| 2621 | 2547 | case 0x02000: // low priority, shadow sprite, no highlight = shadow |
| r22068 | r22069 | |
| 2623 | 2549 | case 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow |
| 2624 | 2550 | case 0x12000: // (sprite) low priority, shadow sprite, no highlight = shadow |
| 2625 | 2551 | case 0x16000: // (sprite) normal pri, shadow sprite, no highlight = shadow? |
| 2626 | | lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x3f)]; |
| 2552 | lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat & 0x3f)]; |
| 2627 | 2553 | m_render_line_raw[x] |= (dat & 0x3f) | 0x000; |
| 2628 | 2554 | break; |
| 2629 | 2555 | |
| 2630 | 2556 | case 0x4000: // normal pri, no shadow sprite, no highlight = normal; |
| 2631 | 2557 | case 0x8000: // low pri, highlight sprite = normal; |
| 2632 | | lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)]; |
| 2558 | lineptr[x] = megadrive_vdp_palette_lookup[(dat & 0x3f)]; |
| 2633 | 2559 | m_render_line_raw[x] |= (dat & 0x3f) | 0x040; |
| 2634 | 2560 | break; |
| 2635 | 2561 | |
| 2636 | 2562 | case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal; |
| 2637 | 2563 | case 0x18000: // (sprite) low pri, highlight sprite = normal; |
| 2638 | | lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)]; |
| 2564 | lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat & 0x3f)]; |
| 2639 | 2565 | m_render_line_raw[x] |= (dat & 0x3f) | 0x080; |
| 2640 | 2566 | break; |
| 2641 | 2567 | |
| 2642 | 2568 | |
| 2643 | 2569 | case 0x0c000: // normal pri, highlight set = highlight? |
| 2644 | 2570 | case 0x1c000: // (sprite) normal pri, highlight set = highlight? |
| 2645 | | lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x3f)]; |
| 2571 | lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat & 0x3f)]; |
| 2646 | 2572 | m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0; |
| 2647 | 2573 | break; |
| 2648 | 2574 | |
| r22068 | r22069 | |
| 2651 | 2577 | case 0x1a000: // (sprite)shadow set, highlight set - not possible |
| 2652 | 2578 | case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible |
| 2653 | 2579 | default: |
| 2654 | | lineptr[x] = m_render_line_raw[x] |= (machine.rand()&0x3f); |
| 2655 | | break; |
| 2580 | lineptr[x] = m_render_line_raw[x] |= (machine.rand() & 0x3f); |
| 2581 | break; |
| 2656 | 2582 | } |
| 2657 | | |
| 2658 | 2583 | } |
| 2659 | | |
| 2660 | | |
| 2661 | | |
| 2662 | 2584 | } |
| 2663 | 2585 | |
| 2586 | // high priority 32x |
| 2587 | if (_32xdev) |
| 2588 | _32xdev->_32x_render_videobuffer_to_screenbuffer_hipri(x, lineptr[x]); |
| 2664 | 2589 | } |
| 2665 | | |
| 2666 | | |
| 2667 | | // high priority 32x |
| 2668 | | if (_32xdev) |
| 2669 | | { |
| 2670 | | if (_32xdev->m_32x_displaymode != 0) |
| 2671 | | { |
| 2672 | | for (x=0;x<320;x++) |
| 2673 | | { |
| 2674 | | if (!_32xdev->m_32x_videopriority) |
| 2675 | | { |
| 2676 | | if ((_32xdev->m_32x_linerender[x]&0x8000)) |
| 2677 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2678 | | } |
| 2679 | | else |
| 2680 | | { |
| 2681 | | if (!(_32xdev->m_32x_linerender[x]&0x8000)) |
| 2682 | | lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff; |
| 2683 | | } |
| 2684 | | } |
| 2685 | | } |
| 2686 | | } |
| 2687 | 2590 | } |
| 2688 | 2591 | |
| 2689 | 2592 | void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine) |
| 2690 | 2593 | { |
| 2691 | 2594 | int scanline = genesis_get_scanline_counter(machine); |
| 2595 | |
| 2692 | 2596 | if (scanline >= 0 && scanline < m_visible_scanlines) |
| 2693 | 2597 | { |
| 2694 | 2598 | //if (MEGADRIVE_REG01_DMA_ENABLE==0) mame_printf_debug("off\n"); |
trunk/src/mame/machine/mega32x.c
| r22068 | r22069 | |
| 1602 | 1602 | |
| 1603 | 1603 | |
| 1604 | 1604 | |
| 1605 | | UINT32* sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline) |
| 1605 | void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline) |
| 1606 | 1606 | { |
| 1607 | 1607 | int x; |
| 1608 | 1608 | |
| r22068 | r22069 | |
| 1707 | 1707 | } |
| 1708 | 1708 | } |
| 1709 | 1709 | } |
| 1710 | } |
| 1710 | 1711 | |
| 1711 | | return m_32x_linerender; |
| 1712 | int sega_32x_device::_32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr) |
| 1713 | { |
| 1714 | int drawn = 0; |
| 1715 | |
| 1716 | if (m_32x_displaymode != 0) |
| 1717 | { |
| 1718 | if (!m_32x_videopriority) |
| 1719 | { |
| 1720 | if (!(m_32x_linerender[x] & 0x8000)) |
| 1721 | { |
| 1722 | lineptr = m_32x_linerender[x] & 0x7fff; |
| 1723 | drawn = 1; |
| 1724 | } |
| 1725 | } |
| 1726 | else |
| 1727 | { |
| 1728 | if (m_32x_linerender[x] & 0x8000) |
| 1729 | { |
| 1730 | lineptr = m_32x_linerender[x] & 0x7fff; |
| 1731 | drawn = 1; |
| 1732 | } |
| 1733 | } |
| 1734 | } |
| 1735 | |
| 1736 | return drawn; |
| 1712 | 1737 | } |
| 1713 | 1738 | |
| 1739 | void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr) |
| 1740 | { |
| 1741 | if (m_32x_displaymode != 0) |
| 1742 | { |
| 1743 | if (!m_32x_videopriority) |
| 1744 | { |
| 1745 | if (m_32x_linerender[x] & 0x8000) |
| 1746 | lineptr = m_32x_linerender[x] & 0x7fff; |
| 1747 | } |
| 1748 | else |
| 1749 | { |
| 1750 | if (!(m_32x_linerender[x] & 0x8000)) |
| 1751 | lineptr = m_32x_linerender[x] & 0x7fff; |
| 1752 | } |
| 1753 | } |
| 1754 | } |
| 1755 | |
| 1714 | 1756 | static const sh2_cpu_core sh2_conf_master = { 0, NULL, _32x_fifo_available_callback }; |
| 1715 | 1757 | static const sh2_cpu_core sh2_conf_slave = { 1, NULL, _32x_fifo_available_callback }; |
| 1716 | 1758 | |
trunk/src/mame/machine/mega32x.h
| r22068 | r22069 | |
| 33 | 33 | required_device<dac_device> m_rch_pwm; |
| 34 | 34 | |
| 35 | 35 | void pause_cpu(); |
| 36 | | |
| 36 | |
| 37 | 37 | // set some variables at start, depending on region (shall be moved to a device interface?) |
| 38 | 38 | void set_framerate(int rate) { m_framerate = rate; } |
| 39 | 39 | void set_32x_pal(bool pal) { m_32x_pal = pal ? 1 : 0; } |
| 40 | 40 | |
| 41 | | |
| 41 | |
| 42 | 42 | DECLARE_READ32_MEMBER( _32x_sh2_master_4000_common_4002_r ); |
| 43 | 43 | DECLARE_READ32_MEMBER( _32x_sh2_slave_4000_common_4002_r ); |
| 44 | 44 | DECLARE_READ32_MEMBER( _32x_sh2_common_4004_common_4006_r ); |
| r22068 | r22069 | |
| 104 | 104 | DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w ); |
| 105 | 105 | DECLARE_WRITE16_MEMBER( _32x_sh2_slave_401e_w ); |
| 106 | 106 | |
| 107 | | UINT32* _32x_render_videobuffer_to_screenbuffer_helper(int scanline); |
| 107 | void _32x_render_videobuffer_to_screenbuffer_helper(int scanline); |
| 108 | int _32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr); |
| 109 | void _32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr); |
| 108 | 110 | int sh2_master_pwmint_enable, sh2_slave_pwmint_enable; |
| 109 | 111 | |
| 110 | 112 | void _32x_check_framebuffer_swap(bool enabled); |
| r22068 | r22069 | |
| 112 | 114 | void _32x_scanline_cb0(); |
| 113 | 115 | void _32x_scanline_cb1(int scanline); |
| 114 | 116 | |
| 115 | | /* our current main rendering code needs to know this for mixing in */ |
| 116 | | int m_32x_displaymode; |
| 117 | | int m_32x_videopriority; |
| 118 | 117 | /* our main vblank handler resets this */ |
| 119 | 118 | int m_32x_hcount_compare_val; |
| 120 | 119 | int m_sh2_are_running; |
| 121 | 120 | int m_32x_240mode; |
| 122 | 121 | UINT16 m_32x_a1518a_reg; |
| 123 | 122 | |
| 124 | | |
| 125 | | UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode) |
| 126 | | |
| 127 | | |
| 128 | 123 | void handle_pwm_callback(); |
| 129 | 124 | void calculate_pwm_timer(); |
| 130 | 125 | UINT16 m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg; |
| r22068 | r22069 | |
| 138 | 133 | UINT16 get_hposition(void); |
| 139 | 134 | |
| 140 | 135 | emu_timer *m_32x_pwm_timer; |
| 136 | |
| 141 | 137 | protected: |
| 142 | 138 | virtual void device_start(); |
| 143 | 139 | virtual void device_reset(); |
| r22068 | r22069 | |
| 145 | 141 | // optional information overrides |
| 146 | 142 | // virtual const rom_entry *device_rom_region() const; |
| 147 | 143 | virtual machine_config_constructor device_mconfig_additions() const; |
| 144 | |
| 148 | 145 | private: |
| 146 | |
| 147 | int m_32x_displaymode; |
| 148 | int m_32x_videopriority; |
| 149 | UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode) |
| 150 | |
| 149 | 151 | // virtual void device_config_complete(); |
| 150 | 152 | int m_32x_adapter_enabled; |
| 151 | 153 | int m_32x_access_auth; |