summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/mach32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/mach32.cpp')
-rw-r--r--src/devices/bus/isa/mach32.cpp75
1 files changed, 73 insertions, 2 deletions
diff --git a/src/devices/bus/isa/mach32.cpp b/src/devices/bus/isa/mach32.cpp
index 8bf78a14505..7d498310a28 100644
--- a/src/devices/bus/isa/mach32.cpp
+++ b/src/devices/bus/isa/mach32.cpp
@@ -54,7 +54,7 @@ MACHINE_CONFIG_END
void mach32_8514a_device::device_config_complete()
{
- m_vga = dynamic_cast<svga_device*>(owner());
+ m_vga = dynamic_cast<mach32_device*>(owner());
}
void mach32_8514a_device::device_start()
@@ -85,6 +85,32 @@ READ16_MEMBER(mach32_8514a_device::mach32_config1_r)
}
+/* 7AEE (W) Mach 32
+ * bits 0-2 Monitor Alias - Monitor ID
+ * bit 3 Enable reporting of Monitor Alias
+ * bits 4-5 Pixel Width (0=4bpp, 1=8bpp, 2=16bpp, 3=24bpp)
+ * bits 6-7 16bpp colour mode (0=555, 1=565, 2=655, 3=664)
+ * bit 8 Multiplex pixels - processes 4 pixels in parallel by the DAC
+ * bit 9 24bpp config (0=3Bytes/pixel, 1=4Bytes/pixel)
+ * bit 10 24bpp colour order (0=RGB, LSB reserved in 4Bpp, 1=BGR, MSB reserved in 4Bpp)
+ * bit 11 Display pixel size to be written
+ * bits 12-13 DAC extended address inputs RS2,RS3
+ * bit 14 Enabled 8-bit DAC (0=6-bit)
+ * bit 15 Draw pixel size to be written
+ * If bits 11 and 15 are both 0, then for compatibility, both will be written
+ */
+WRITE16_MEMBER(mach32_8514a_device::mach32_ge_ext_config_w)
+{
+ if(offset == 1)
+ {
+ COMBINE_DATA(&mach8.ge_ext_config);
+ if(data & 0x0800)
+ display_mode_change = true;
+ if(!(data & 0x8000) && (!(data & 0x0800)))
+ display_mode_change = true;
+ }
+}
+
void mach32_8514a_device::device_reset()
{
}
@@ -104,6 +130,51 @@ void mach32_device::device_reset()
ati_vga_device::device_reset();
}
+void mach32_device::ati_define_video_mode()
+{
+ uint16_t config = m_8514a->get_ext_config();
+
+ if(ati.ext_reg[0x30] & 0x20)
+ {
+ if(m_8514a->has_display_mode_changed())
+ {
+ svga.rgb8_en = 0;
+ svga.rgb15_en = 0;
+ svga.rgb16_en = 0;
+ svga.rgb32_en = 0;
+
+ switch(config & 0x0030) // pixel depth
+ {
+ case 0x0000:
+ break;
+ case 0x0010:
+ svga.rgb8_en = 1;
+ break;
+ case 0x0020:
+ svga.rgb15_en = 1;
+ break;
+ case 0x0030:
+ svga.rgb32_en = 1;
+ break;
+ }
+ }
+ }
+ else
+ {
+ ati_vga_device::ati_define_video_mode();
+ return;
+ }
+
+ set_dot_clock();
+}
+
+uint16_t mach32_device::offset()
+{
+ if(get_video_depth() >= 15)
+ return ati_vga_device::offset() << 1;
+ return ati_vga_device::offset();
+}
+
uint32_t mach32_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
ati_vga_device::screen_update(screen,bitmap,cliprect);
@@ -273,7 +344,7 @@ MACHINE_CONFIG_END
void mach64_8514a_device::device_config_complete()
{
- m_vga = dynamic_cast<svga_device*>(owner());
+ m_vga = dynamic_cast<mach64_device*>(owner());
}
void mach64_8514a_device::device_start()