diff options
Diffstat (limited to 'src/mame/video/samcoupe.cpp')
-rw-r--r-- | src/mame/video/samcoupe.cpp | 171 |
1 files changed, 0 insertions, 171 deletions
diff --git a/src/mame/video/samcoupe.cpp b/src/mame/video/samcoupe.cpp deleted file mode 100644 index 780f93ed1f1..00000000000 --- a/src/mame/video/samcoupe.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Lee Hammerton, Dirk Best -/*************************************************************************** - - Miles Gordon Technology SAM Coupe - -***************************************************************************/ - -#include "emu.h" -#include "includes/samcoupe.h" - - -/*************************************************************************** - MACROS -***************************************************************************/ - -/* border color from border register */ -#define BORDER_COLOR(x) ((x & 0x20) >> 2 | (x & 0x07)) - -/* foreground and background color from attribute byte in mode 1 and 2 */ -#define ATTR_BG(x) ((x >> 3) & 0x0f) -#define ATTR_FG(x) (((x >> 3) & 0x08) | (x & 0x07)) - - -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - -void samcoupe_state::video_start() -{ - m_screen->register_screen_bitmap(m_bitmap); -} - -uint32_t samcoupe_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); - return 0; -} - -void samcoupe_state::draw_mode4_line(int y, int hpos) -{ - uint8_t *videoram = m_videoram; - - /* get start address */ - uint8_t *vram = videoram + ((y - SAM_BORDER_TOP) * 128) + ((hpos - SAM_BORDER_LEFT) / 4); - - for (int i = 0; i < (SAM_BLOCK*2)/4; i++) - { - /* draw 2 pixels (doublewidth) */ - m_bitmap.pix16(y, hpos + i * 4 + 0) = m_clut[(*vram >> 4) & 0x0f]; - m_bitmap.pix16(y, hpos + i * 4 + 1) = m_clut[(*vram >> 4) & 0x0f]; - m_bitmap.pix16(y, hpos + i * 4 + 2) = m_clut[(*vram >> 0) & 0x0f]; - m_bitmap.pix16(y, hpos + i * 4 + 3) = m_clut[(*vram >> 0) & 0x0f]; - - /* move to next address */ - vram++; - - /* attribute register contains the third displayed byte */ - if (i == 2) - m_attribute = *vram; - } -} - -void samcoupe_state::draw_mode3_line(int y, int hpos) -{ - uint8_t *videoram = m_videoram; - - /* get start address */ - uint8_t *vram = videoram + ((y - SAM_BORDER_TOP) * 128) + ((hpos - SAM_BORDER_LEFT) / 4); - - for (int i = 0; i < (SAM_BLOCK*2)/4; i++) - { - /* draw 4 pixels */ - m_bitmap.pix16(y, hpos + i * 4 + 0) = m_clut[(*vram >> 6) & 0x03]; - m_bitmap.pix16(y, hpos + i * 4 + 1) = m_clut[(*vram >> 4) & 0x03]; - m_bitmap.pix16(y, hpos + i * 4 + 2) = m_clut[(*vram >> 2) & 0x03]; - m_bitmap.pix16(y, hpos + i * 4 + 3) = m_clut[(*vram >> 0) & 0x03]; - - /* move to next address */ - vram++; - - /* attribute register contains the third displayed byte */ - if (i == 2) - m_attribute = *vram; - } -} - -void samcoupe_state::draw_mode12_block(bitmap_ind16 &bitmap, int vpos, int hpos, uint8_t mask) -{ - /* extract colors from attribute */ - uint8_t ink = m_clut[ATTR_FG(m_attribute)]; - uint8_t pap = m_clut[ATTR_BG(m_attribute)]; - - /* draw block of 8 pixels (doubled to 16) */ - for (int i = 0; i < SAM_BLOCK; i++) - { - bitmap.pix16(vpos, hpos + i*2 + 0) = BIT(mask, 7 - i) ? ink : pap; - bitmap.pix16(vpos, hpos + i*2 + 1) = BIT(mask, 7 - i) ? ink : pap; - } -} - -void samcoupe_state::draw_mode2_line(int y, int hpos) -{ - uint8_t *videoram = m_videoram; - - int cell = (y - SAM_BORDER_TOP) * 32 + (hpos - SAM_BORDER_LEFT) / SAM_BLOCK / 2; - - uint8_t mask = videoram[cell]; - m_attribute = videoram[cell + 0x2000]; - - draw_mode12_block(m_bitmap, y, hpos, mask); -} - -void samcoupe_state::draw_mode1_line(int y, int hpos) -{ - uint8_t *videoram = m_videoram; - - uint8_t mask = videoram[((((y - SAM_BORDER_TOP) & 0xc0) << 5) | (((y - SAM_BORDER_TOP) & 0x07) << 8) | (((y - SAM_BORDER_TOP) & 0x38) << 2)) + (hpos - SAM_BORDER_LEFT) / SAM_BLOCK / 2]; - m_attribute = videoram[32*192 + (((y - SAM_BORDER_TOP) & 0xf8) << 2) + (hpos - SAM_BORDER_LEFT) / SAM_BLOCK / 2]; - - draw_mode12_block(m_bitmap, y, hpos, mask); -} - -TIMER_CALLBACK_MEMBER(samcoupe_state::sam_video_update_callback) -{ - int vpos = m_screen->vpos(); - int hpos = m_screen->hpos(); - - int next_vpos = vpos; - int next_hpos = hpos + SAM_BLOCK*2; - - /* next scanline? */ - if (next_hpos >= SAM_BORDER_LEFT + SAM_SCREEN_WIDTH + SAM_BORDER_RIGHT) - { - next_vpos = (vpos + 1) % (SAM_BORDER_TOP + SAM_SCREEN_HEIGHT + SAM_BORDER_BOTTOM); - next_hpos = 0; - } - - /* display disabled? (only in mode 3 or 4) */ - if (BIT(m_vmpr, 6) && BIT(m_border, 7)) - { - m_bitmap.plot_box(hpos, vpos, SAM_BLOCK*2, 1, 0); - } - else - { - /* border area? */ - if (vpos < SAM_BORDER_TOP || vpos >= SAM_BORDER_TOP + SAM_SCREEN_HEIGHT || hpos < SAM_BORDER_LEFT || hpos >= SAM_BORDER_LEFT + SAM_SCREEN_WIDTH) - { - m_attribute = 0xff; - m_bitmap.plot_box(hpos, vpos, SAM_BLOCK*2, 1, m_clut[BORDER_COLOR(m_border)]); - } - else - { - /* main screen area */ - switch ((m_vmpr & 0x60) >> 5) - { - case 0: draw_mode1_line(vpos, hpos); break; - case 1: draw_mode2_line(vpos, hpos); break; - case 2: draw_mode3_line(vpos, hpos); break; - case 3: draw_mode4_line(vpos, hpos); break; - } - } - } - - /* do we need to trigger the scanline interrupt (interrupt happens at the start of the right border before the specified line)? */ - if (m_line_int < SAM_SCREEN_HEIGHT && hpos == SAM_BORDER_LEFT + SAM_SCREEN_WIDTH && vpos == (m_line_int + SAM_BORDER_TOP - 1)) - samcoupe_irq(SAM_LINE_INT); - - /* schedule next update */ - m_video_update_timer->adjust(m_screen->time_until_pos(next_vpos, next_hpos)); -} |