summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/osi/osi_v.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/osi/osi_v.cpp')
-rw-r--r--src/mame/osi/osi_v.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/mame/osi/osi_v.cpp b/src/mame/osi/osi_v.cpp
new file mode 100644
index 00000000000..9130a7a80e1
--- /dev/null
+++ b/src/mame/osi/osi_v.cpp
@@ -0,0 +1,180 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder, Robbbert, Wilbert Pol
+#include "emu.h"
+#include "osi.h"
+#include "screen.h"
+
+/* Palette Initialization */
+
+void sb2m600_state::osi630_palette(palette_device &palette) const
+{
+ /* black and white */
+ palette.set_pen_color(0, 0x00, 0x00, 0x00); // black
+ palette.set_pen_color(1, 0xff, 0xff, 0xff); // white
+
+ /* color enabled */
+ palette.set_pen_color(2, 0xff, 0xff, 0x00); // yellow
+ palette.set_pen_color(3, 0xff, 0x00, 0x00); // red
+ palette.set_pen_color(4, 0x00, 0xff, 0x00); // green
+ palette.set_pen_color(5, 0x00, 0x80, 0x00); // olive green
+ palette.set_pen_color(6, 0x00, 0x00, 0xff); // blue
+ palette.set_pen_color(7, 0xff, 0x00, 0xff); // purple
+ palette.set_pen_color(8, 0x00, 0x00, 0x80); // sky blue
+ palette.set_pen_color(9, 0x00, 0x00, 0x00); // black
+}
+
+/* Video Start */
+
+void sb2m600_state::video_start()
+{
+ // randomize video memory contents
+ for (uint16_t addr = 0; addr < OSI600_VIDEORAM_SIZE; addr++)
+ m_video_ram[addr] = machine().rand() & 0xff;
+
+ // randomize color memory contents
+ if (m_color_ram)
+ for (uint16_t addr = 0; addr < OSI630_COLORRAM_SIZE; addr++)
+ m_color_ram[addr] = machine().rand() & 0x0f;
+
+ m_32 = 0;
+ m_coloren = 0;
+}
+
+/* Video Update */
+
+uint32_t sb2m600_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ if (m_32)
+ {
+ for (int y = 0; y < 256; y++)
+ {
+ uint16_t videoram_addr = (y >> 4) * 64;
+ int const line = (y >> 1) & 0x07;
+ int x = 0;
+
+ for (int sx = 0; sx < 64; sx++)
+ {
+ uint8_t videoram_data = m_video_ram[videoram_addr];
+ uint16_t charrom_addr = ((videoram_data << 3) | line) & 0x7ff;
+ uint8_t charrom_data = m_p_chargen[charrom_addr];
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ bool color = BIT(charrom_data, 7);
+
+ if (m_coloren)
+ {
+ uint8_t colorram_data = m_color_ram[videoram_addr];
+ color = (color ^ BIT(colorram_data, 0)) ? (((colorram_data >> 1) & 0x07) + 2) : 0;
+ }
+
+ bitmap.pix(y, x++) = color;
+
+ charrom_data <<= 1;
+ }
+
+ videoram_addr++;
+ }
+ }
+ }
+ else
+ {
+ for (int y = 0; y < 256; y++)
+ {
+ uint16_t videoram_addr = (y >> 3) * 32;
+ int const line = y & 0x07;
+ int x = 0;
+
+ for (int sx = 0; sx < 32; sx++)
+ {
+ uint8_t videoram_data = m_video_ram[videoram_addr];
+ uint16_t const charrom_addr = ((videoram_data << 3) | line) & 0x7ff;
+ uint8_t charrom_data = m_p_chargen[charrom_addr];
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ bool color = BIT(charrom_data, 7);
+
+ if (m_coloren)
+ {
+ uint8_t colorram_data = m_color_ram[videoram_addr];
+ color = (color ^ BIT(colorram_data, 0)) ? (((colorram_data >> 1) & 0x07) + 2) : 0;
+ }
+
+ bitmap.pix(y, x++) = color;
+ bitmap.pix(y, x++) = color;
+
+ charrom_data <<= 1;
+ }
+
+ videoram_addr++;
+ }
+ }
+ }
+
+ return 0;
+}
+
+uint32_t uk101_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (int y = 0; y < 256; y++)
+ {
+ uint16_t videoram_addr = (y >> 4) * 64;
+ int const line = (y >> 1) & 0x07;
+ int x = 0;
+
+ for (int sx = 0; sx < 64; sx++)
+ {
+ uint8_t videoram_data = m_video_ram[videoram_addr++];
+ uint16_t const charrom_addr = ((videoram_data << 3) | line) & 0x7ff;
+ uint8_t charrom_data = m_p_chargen[charrom_addr];
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ bitmap.pix(y, x) = BIT(charrom_data, 7);
+ x++;
+ charrom_data <<= 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* Machine Drivers */
+
+void sb2m600_state::osi600_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(X1/256/256); // 60 Hz
+ screen.set_screen_update(FUNC(sb2m600_state::screen_update));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0, 32*8-1);
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", palette_device::MONOCHROME);
+}
+
+void uk101_state::uk101_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(uk101_state::screen_update));
+ screen.set_size(64*8, 16*16);
+ screen.set_visarea(0, 64*8-1, 0, 16*16-1);
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", palette_device::MONOCHROME);
+}
+
+void sb2m600_state::osi630_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(X1/256/256); // 60 Hz
+ screen.set_screen_update(FUNC(sb2m600_state::screen_update));
+ screen.set_size(64*8, 16*16);
+ screen.set_visarea(0, 64*8-1, 0, 16*16-1);
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(sb2m600_state::osi630_palette), 8+2);
+}