diff options
| author | 2025-11-21 03:45:31 +1100 | |
|---|---|---|
| committer | 2025-11-21 03:45:31 +1100 | |
| commit | 79c43b1cb242e7d507e4f0097245024bb10ab71b (patch) | |
| tree | 0485adffa45b703bc631049281e9bf83d7d7620e | |
| parent | 7137af09148d720199b6fb62bf89c5cdd0ea4f47 (diff) | |
pc/pc_t1t.cpp: Use indirect colours so palette registers can be visualised.
| -rw-r--r-- | src/mame/pc/pc_t1t.cpp | 121 | ||||
| -rw-r--r-- | src/mame/pc/pc_t1t.h | 13 |
2 files changed, 71 insertions, 63 deletions
diff --git a/src/mame/pc/pc_t1t.cpp b/src/mame/pc/pc_t1t.cpp index 3dae5066d8c..fd13b7fbdb9 100644 --- a/src/mame/pc/pc_t1t.cpp +++ b/src/mame/pc/pc_t1t.cpp @@ -209,11 +209,14 @@ void pc_t1t_device::device_start() // colors for (int i = 0; i < 16; i++) - set_pen_color(i, tga_palette[i]); + set_indirect_color(i, tga_palette[i]); // b/w mode shades for (int i = 0; i < 16; i++) - set_pen_color(16 + i, pal4bit(i), pal4bit(i), pal4bit(i)); + set_indirect_color(16 + i, rgb_t(pal4bit(i), pal4bit(i), pal4bit(i))); + + for (int i = 0; i < 16; i++) + set_pen_indirect(i, 0); save_item(NAME(m_vga_addr)); save_item(NAME(m_palette_mask)); @@ -367,7 +370,6 @@ void pcvideo_pcjr_device::device_add_mconfig(machine_config &config) MC6845_UPDATE_ROW( pc_t1t_device::text_inten_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t const rowbase = row_base(ra); uint32_t *p = &bitmap.pix(y); @@ -378,8 +380,8 @@ MC6845_UPDATE_ROW( pc_t1t_device::text_inten_update_row ) uint16_t const vram = space(0).read_word(rowbase | offset); uint8_t const chr = vram & 0x00ff; uint8_t const attr = vram >> 8; - auto const fg = pal[m_palette_base + palette_r(BIT(attr, 0, 4))]; - auto const bg = pal[m_palette_base + palette_r(BIT(attr, 4, 4))]; + auto const fg = palette_r(BIT(attr, 0, 4)); + auto const bg = palette_r(BIT(attr, 4, 4)); uint8_t data = chr_gen_r(chr, ra); if (i == cursor_x && (m_pc_framecnt & 0x08)) @@ -399,7 +401,6 @@ MC6845_UPDATE_ROW( pc_t1t_device::text_inten_update_row ) MC6845_UPDATE_ROW( pcvideo_t1000_device::text_blink_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t const rowbase = row_base(ra); uint32_t *p = &bitmap.pix(y); @@ -413,9 +414,9 @@ MC6845_UPDATE_ROW( pcvideo_t1000_device::text_blink_update_row ) uint16_t const vram = space(0).read_word(rowbase | offset); uint8_t const chr = vram & 0x00ff; uint8_t const attr = vram >> 8; - auto const fg = pal[m_palette_base + palette_r(BIT(attr, 0, 4))]; - //auto const bg = pal[m_palette_base + palette_r(BIT(attr, 4, 3) | (BIT(m_color_sel, 4) << 3))]; - auto const bg = pal[m_palette_base + palette_r(BIT(attr, 4, 3))]; + auto const fg = palette_r(BIT(attr, 0, 4)); + //auto const bg = palette_r(BIT(attr, 4, 3) | (BIT(m_color_sel, 4) << 3)); + auto const bg = palette_r(BIT(attr, 4, 3)); uint8_t data = chr_gen_r(chr, ra); if (i == cursor_x) @@ -442,7 +443,6 @@ MC6845_UPDATE_ROW( pcvideo_t1000_device::text_blink_update_row ) MC6845_UPDATE_ROW( pcvideo_pcjr_device::text_blink_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t const rowbase = row_base(ra); uint32_t *p = &bitmap.pix(y); @@ -452,8 +452,8 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::text_blink_update_row ) uint16_t const vram = space(0).read_word(rowbase | offset); uint8_t const chr = vram & 0x00ff; uint8_t const attr = vram >> 8; - auto const fg = pal[m_palette_base + palette_r(BIT(attr, 0, 4))]; - auto const bg = pal[m_palette_base + palette_r(BIT(attr, 4, 3))]; + auto const fg = palette_r(BIT(attr, 0, 4)); + auto const bg = palette_r(BIT(attr, 4, 3)); uint8_t data = chr_gen_r(chr, ra); if (i == cursor_x) @@ -481,7 +481,6 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::text_blink_update_row ) MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjx_text_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t const rowbase = row_base(ra); uint32_t *p = &bitmap.pix(y); @@ -490,8 +489,8 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjx_text_update_row ) uint16_t const offset = ((ma + i) << 1) & 0x3fff; uint8_t chr = space(0).read_byte(rowbase + offset); uint8_t const attr = space(0).read_byte(rowbase + offset + 1); - auto const fg = pal[m_palette_base + palette_r(BIT(attr, 0, 3))]; - auto const bg = pal[m_palette_base + palette_r(BIT(attr, 4, 3))]; + auto const fg = palette_r(BIT(attr, 0, 3)); + auto const bg = palette_r(BIT(attr, 4, 3)); uint16_t code = chr & 0x1f; if((attr & 0x88) == 0x88) { @@ -522,7 +521,6 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjx_text_update_row ) MC6845_UPDATE_ROW( pc_t1t_device::gfx_4bpp_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = row_base(ra); @@ -531,14 +529,14 @@ MC6845_UPDATE_ROW( pc_t1t_device::gfx_4bpp_update_row ) uint16_t const offset = ((ma + i) << 1) & m_offset_mask; uint16_t const data = space(0).read_word(rowbase | offset); - *p++ = pal[m_palette_base + palette_r(BIT(data, 4, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 4, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 0, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 0, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 12, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 12, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 8, 4))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 8, 4))]; + *p++ = palette_r(BIT(data, 4, 4)); + *p++ = palette_r(BIT(data, 4, 4)); + *p++ = palette_r(BIT(data, 0, 4)); + *p++ = palette_r(BIT(data, 0, 4)); + *p++ = palette_r(BIT(data, 12, 4)); + *p++ = palette_r(BIT(data, 12, 4)); + *p++ = palette_r(BIT(data, 8, 4)); + *p++ = palette_r(BIT(data, 8, 4)); } } @@ -548,7 +546,6 @@ MC6845_UPDATE_ROW( pcvideo_t1000_device::gfx_2bpp_update_row ) // Unlike the PCjr, the Tandy 1000 seems to ignore the VRAM addressing // configuration in this mode - the BIOS sets ARDM0 and ADRM1 to zero for // CGA-compatible modes, but one bit of RA must be used for VRAM addressing. - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = m_display_base | ((uint32_t(ra) << 13) & 0x02000); @@ -557,20 +554,19 @@ MC6845_UPDATE_ROW( pcvideo_t1000_device::gfx_2bpp_update_row ) uint16_t const offset = ((ma + i) << 1) & 0x01fff; uint16_t const data = space(0).read_word(rowbase | offset); - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 6, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 4, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 2, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 0, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 14, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 12, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 10, 2))]; - *p++ = pal[m_palette_base + palette_cga_2bpp_r(BIT(data, 8, 2))]; + *p++ = palette_cga_2bpp_r(BIT(data, 6, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 4, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 2, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 0, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 14, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 12, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 10, 2)); + *p++ = palette_cga_2bpp_r(BIT(data, 8, 2)); } } MC6845_UPDATE_ROW( pcvideo_pcjr_device::gfx_2bpp_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = row_base(ra); @@ -579,21 +575,20 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::gfx_2bpp_update_row ) uint16_t const offset = ((ma + i) << 1) & m_offset_mask; uint16_t const data = space(0).read_word(rowbase | offset); - *p++ = pal[m_palette_base + palette_r(BIT(data, 6, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 4, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 2, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 0, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 14, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 12, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 10, 2))]; - *p++ = pal[m_palette_base + palette_r(BIT(data, 8, 2))]; + *p++ = palette_r(BIT(data, 6, 2)); + *p++ = palette_r(BIT(data, 4, 2)); + *p++ = palette_r(BIT(data, 2, 2)); + *p++ = palette_r(BIT(data, 0, 2)); + *p++ = palette_r(BIT(data, 14, 2)); + *p++ = palette_r(BIT(data, 12, 2)); + *p++ = palette_r(BIT(data, 10, 2)); + *p++ = palette_r(BIT(data, 8, 2)); } } MC6845_UPDATE_ROW( pc_t1t_device::gfx_2bpp_high_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = row_base(ra); @@ -602,25 +597,24 @@ MC6845_UPDATE_ROW( pc_t1t_device::gfx_2bpp_high_update_row ) uint16_t const offset = ((ma + i) << 1) & m_offset_mask; uint16_t const data = space(0).read_word(rowbase | offset); - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 15, 7))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 14, 6))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 13, 5))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 12, 4))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 11, 3))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 10, 2))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 9, 1))]; - *p++ = pal[m_palette_base + palette_r(bitswap<2>(data, 8, 0))]; + *p++ = palette_r(bitswap<2>(data, 15, 7)); + *p++ = palette_r(bitswap<2>(data, 14, 6)); + *p++ = palette_r(bitswap<2>(data, 13, 5)); + *p++ = palette_r(bitswap<2>(data, 12, 4)); + *p++ = palette_r(bitswap<2>(data, 11, 3)); + *p++ = palette_r(bitswap<2>(data, 10, 2)); + *p++ = palette_r(bitswap<2>(data, 9, 1)); + *p++ = palette_r(bitswap<2>(data, 8, 0)); } } MC6845_UPDATE_ROW( pcvideo_t1000_device::gfx_1bpp_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = row_base(ra); - auto const fg = pal[m_palette_base + palette_r(BIT(m_color_sel, 0, 4))]; - auto const bg = pal[m_palette_base + palette_r(0)]; + auto const fg = palette_r(BIT(m_color_sel, 0, 4)); + auto const bg = palette_r(0); for (int i = 0; i < x_count; i++) { @@ -648,11 +642,10 @@ MC6845_UPDATE_ROW( pcvideo_t1000_device::gfx_1bpp_update_row ) MC6845_UPDATE_ROW( pcvideo_pcjr_device::gfx_1bpp_update_row ) { - rgb_t const *const pal = palette()->entry_list_raw(); uint32_t *p = &bitmap.pix(y); uint32_t const rowbase = row_base(ra); - auto const fg = pal[m_palette_base + palette_r(1)]; - auto const bg = pal[m_palette_base + palette_r(0)]; + auto const fg = palette_r(1); + auto const bg = palette_r(0); for (int i = 0; i < x_count; i++) { @@ -737,6 +730,17 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::crtc_update_row ) } +void pc_t1t_device::set_palette_base(uint8_t base) +{ + if (base != m_palette_base) + { + m_palette_base = base; + for (unsigned i = 0; 16 > i; ++i) + set_pen_indirect(i, base + m_palette_reg[i]); + } +} + + void pcvideo_t1000_device::mode_switch() { bool const blink = BIT(m_mode_sel, 5); @@ -839,7 +843,7 @@ void pcvideo_pcjr_device::pc_pcjr_mode_switch() m_mc6845->set_clock(XTAL(14'318'181) / 16); // color or b/w? - m_palette_base = mono ? 16 : 0; + set_palette_base(mono ? 16 : 0); } @@ -911,6 +915,7 @@ void pc_t1t_device::vga_data_w(uint8_t data) if (BIT(m_vga_addr, 4)) { m_palette_reg[m_vga_addr & 0x0f] = data & 0x0f; + set_pen_indirect(m_vga_addr & 0x0f, m_palette_base + (data & 0x0f)); } else switch (m_vga_addr & 0x0f) { diff --git a/src/mame/pc/pc_t1t.h b/src/mame/pc/pc_t1t.h index d04333bb6fd..01a288544f8 100644 --- a/src/mame/pc/pc_t1t.h +++ b/src/mame/pc/pc_t1t.h @@ -31,13 +31,16 @@ protected: virtual void device_start() override ATTR_COLD; virtual void device_post_load() override ATTR_COLD; - virtual uint32_t palette_entries() const noexcept override { return 32; } + virtual uint32_t palette_entries() const noexcept override { return 16; } + virtual uint32_t palette_indirect_entries() const noexcept override { return 32; } virtual space_config_vector memory_space_config() const override ATTR_COLD; - uint8_t palette_r(uint8_t index) const { return m_palette_reg[!BIT(m_vga_addr, 4) ? (index & m_palette_mask) : (m_vga_addr & 0x0f)]; } + pen_t palette_r(uint8_t index) const { return pen(!BIT(m_vga_addr, 4) ? (index & m_palette_mask) : (m_vga_addr & 0x0f)); } uint8_t chr_gen_r(uint8_t chr, uint8_t ra) const { return m_chr_gen[(uint32_t(chr) << m_chr_stride) | (uint32_t(ra) << m_ra_stride)]; } uint32_t row_base(uint8_t ra) const { return (m_display_base & m_base_mask) | ((uint32_t(ra) << m_ra_shift) & m_ra_mask); } + void set_palette_base(uint8_t base); + int status_r(); void lightpen_strobe_w(int data); void vga_addr_w(uint8_t data); @@ -79,6 +82,8 @@ protected: int m_update_row_type; uint8_t m_display_enable; uint8_t m_vsync; + +private: uint8_t m_palette_base; }; @@ -88,8 +93,6 @@ class pcvideo_t1000_device : public pc_t1t_device, public device_gfx_interface public: pcvideo_t1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - using device_palette_interface::palette; - uint8_t read(address_space &space, offs_t offset); virtual void write(offs_t offset, uint8_t data); @@ -116,7 +119,7 @@ protected: virtual void device_post_load() override ATTR_COLD; private: - uint8_t palette_cga_2bpp_r(uint8_t index) const { return palette_r(index ? (BIT(m_color_sel, 5) | (index << 1) | (BIT(m_color_sel, 4) << 3)) : BIT(m_color_sel, 0, 4)); } + pen_t palette_cga_2bpp_r(uint8_t index) const { return palette_r(index ? (BIT(m_color_sel, 5) | (index << 1) | (BIT(m_color_sel, 4) << 3)) : BIT(m_color_sel, 0, 4)); } void mode_switch(); void vga_data_w(uint8_t data); |
