trunk/src/mess/drivers/hp16500.c
| r242424 | r242425 | |
| 27 | 27 | public: |
| 28 | 28 | hp16500_state(const machine_config &mconfig, device_type type, const char *tag) |
| 29 | 29 | : driver_device(mconfig, type, tag), |
| 30 | | m_maincpu(*this, "maincpu"), |
| 31 | | m_vram(*this, "vram") |
| 30 | m_maincpu(*this, "maincpu") |
| 32 | 31 | { } |
| 33 | 32 | |
| 34 | 33 | virtual void video_start(); |
| 35 | 34 | UINT32 screen_update_hp16500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 36 | 35 | |
| 37 | 36 | required_device<cpu_device> m_maincpu; |
| 38 | | required_shared_ptr<UINT32> m_vram; |
| 37 | dynamic_array<UINT8> m_vram; |
| 39 | 38 | |
| 39 | UINT8 m_mask, m_val; |
| 40 | 40 | |
| 41 | 41 | DECLARE_WRITE32_MEMBER(palette_w); |
| 42 | 42 | |
| 43 | DECLARE_WRITE8_MEMBER(vram_w); |
| 44 | DECLARE_READ8_MEMBER (vram_r); |
| 45 | DECLARE_WRITE8_MEMBER(mask_w); |
| 46 | DECLARE_WRITE8_MEMBER(val_w); |
| 47 | |
| 43 | 48 | private: |
| 44 | 49 | UINT32 m_palette[256], m_colors[3], m_count, m_clutoffs; |
| 45 | 50 | }; |
| r242424 | r242425 | |
| 47 | 52 | static ADDRESS_MAP_START(hp16500_map, AS_PROGRAM, 32, hp16500_state) |
| 48 | 53 | AM_RANGE(0x00000000, 0x0001ffff) AM_ROM AM_REGION("bios", 0) |
| 49 | 54 | AM_RANGE(0x0020f000, 0x0020f003) AM_WRITE(palette_w) |
| 50 | | AM_RANGE(0x00600000, 0x0063ffff) AM_RAM AM_SHARE("vram") |
| 55 | AM_RANGE(0x00600000, 0x0061ffff) AM_WRITE8(vram_w, 0x00ff00ff) |
| 56 | AM_RANGE(0x00600000, 0x0067ffff) AM_READ8 (vram_r, 0x00ff00ff) |
| 57 | AM_RANGE(0x00700000, 0x00700003) AM_WRITE8(mask_w, 0xff000000) |
| 58 | AM_RANGE(0x00740000, 0x00740003) AM_WRITE8(val_w, 0xff000000) |
| 51 | 59 | AM_RANGE(0x00800000, 0x009fffff) AM_RAM // 284e end of test - d0 = 0 for pass |
| 52 | 60 | ADDRESS_MAP_END |
| 53 | 61 | |
| r242424 | r242425 | |
| 56 | 64 | m_count = 0; |
| 57 | 65 | m_clutoffs = 0; |
| 58 | 66 | memset(m_palette, 0, sizeof(m_palette)); |
| 67 | m_vram.resize(0x40000); |
| 68 | m_mask = 0; |
| 69 | m_val = 0; |
| 59 | 70 | } |
| 60 | 71 | |
| 72 | WRITE8_MEMBER(hp16500_state::vram_w) |
| 73 | { |
| 74 | for(int i=0; i<4; i++) { |
| 75 | int off = offset + i * 0x10000; |
| 76 | if(data & (8 >> i)) |
| 77 | m_vram[off] = (m_vram[off] & ~m_mask) | (m_val & m_mask); |
| 78 | else |
| 79 | m_vram[off] = (m_vram[off] & ~m_mask); |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | READ8_MEMBER (hp16500_state::vram_r) |
| 84 | { |
| 85 | return m_vram[offset]; |
| 86 | } |
| 87 | |
| 88 | WRITE8_MEMBER(hp16500_state::mask_w) |
| 89 | { |
| 90 | m_mask = data; |
| 91 | } |
| 92 | |
| 93 | WRITE8_MEMBER(hp16500_state::val_w) |
| 94 | { |
| 95 | m_val = data; |
| 96 | } |
| 97 | |
| 61 | 98 | WRITE32_MEMBER(hp16500_state::palette_w) |
| 62 | 99 | { |
| 63 | 100 | if (mem_mask == 0xff000000) |
| r242424 | r242425 | |
| 92 | 129 | // addr = ((Y * 0xfc0) + 0x360) + (X * 4) |
| 93 | 130 | UINT32 hp16500_state::screen_update_hp16500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 94 | 131 | { |
| 95 | | UINT32 *scanline; |
| 96 | | int x, y; |
| 97 | | UINT32 pixels; |
| 98 | | |
| 99 | | for (y = 0; y < 400; y++) |
| 132 | int pos = 0; |
| 133 | for (int y = 0; y < 384; y++) |
| 100 | 134 | { |
| 101 | | scanline = &bitmap.pix32(y); |
| 135 | UINT32 *scanline = &bitmap.pix32(y); |
| 102 | 136 | |
| 103 | | for (x = 0; x < 576/8; x++) |
| 137 | for (int x = 0; x < 576; x+=4) |
| 104 | 138 | { |
| 105 | | pixels = m_vram[(y * (288/4)) + x]; |
| 106 | | |
| 107 | | UINT8 gfx = ((pixels & 0xf0000) >> 12) | (pixels & 15); |
| 108 | | *scanline++ = m_palette[BIT(gfx, 7) ? 2 : 0]; |
| 109 | | *scanline++ = m_palette[BIT(gfx, 6) ? 2 : 0]; |
| 110 | | *scanline++ = m_palette[BIT(gfx, 5) ? 2 : 0]; |
| 111 | | *scanline++ = m_palette[BIT(gfx, 4) ? 2 : 0]; |
| 112 | | *scanline++ = m_palette[BIT(gfx, 3) ? 2 : 0]; |
| 113 | | *scanline++ = m_palette[BIT(gfx, 2) ? 2 : 0]; |
| 114 | | *scanline++ = m_palette[BIT(gfx, 1) ? 2 : 0]; |
| 115 | | *scanline++ = m_palette[BIT(gfx, 0) ? 2 : 0]; |
| 116 | | #if 0 |
| 117 | | *scanline++ = m_palette[((pixels&0xf0000000)>>28)]; |
| 118 | | *scanline++ = m_palette[((pixels&0xf000000)>>24)]; |
| 119 | | *scanline++ = m_palette[((pixels&0xf00000)>>20)]; |
| 120 | | *scanline++ = m_palette[((pixels&0xf0000)>>16)]; |
| 121 | | *scanline++ = m_palette[((pixels&0xf000)>>12)]; |
| 122 | | *scanline++ = m_palette[((pixels&0xf00)>>8)]; |
| 123 | | *scanline++ = m_palette[((pixels&0xf0)>>4)]; |
| 124 | | *scanline++ = m_palette[(pixels&0xf)]; |
| 125 | | #endif |
| 139 | *scanline++ = m_palette[m_vram[pos+0x00000]]; |
| 140 | *scanline++ = m_palette[m_vram[pos+0x10000]]; |
| 141 | *scanline++ = m_palette[m_vram[pos+0x20000]]; |
| 142 | *scanline++ = m_palette[m_vram[pos+0x30000]]; |
| 143 | pos++; |
| 126 | 144 | } |
| 127 | 145 | } |
| 128 | 146 | |
| r242424 | r242425 | |
| 136 | 154 | |
| 137 | 155 | MCFG_SCREEN_ADD("screen", RASTER) |
| 138 | 156 | MCFG_SCREEN_UPDATE_DRIVER(hp16500_state, screen_update_hp16500) |
| 139 | | MCFG_SCREEN_SIZE(576,400) |
| 140 | | MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 0, 400-1) |
| 157 | MCFG_SCREEN_SIZE(576,384) |
| 158 | MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 0, 384-1) |
| 141 | 159 | MCFG_SCREEN_REFRESH_RATE(60) |
| 142 | 160 | |
| 143 | 161 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |