diff options
Diffstat (limited to 'src/mame/video/newbrain.c')
-rw-r--r-- | src/mame/video/newbrain.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/mame/video/newbrain.c b/src/mame/video/newbrain.c new file mode 100644 index 00000000000..ae010c0b15c --- /dev/null +++ b/src/mame/video/newbrain.c @@ -0,0 +1,130 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +#include "includes/newbrain.h" +#include "newbrain.lh" + +void newbrain_state::video_start() +{ + /* register for state saving */ + save_item(NAME(m_tvcnsl)); + save_item(NAME(m_tvctl)); + save_item(NAME(m_tvram)); + save_item(NAME(m_segment_data)); +} + +void newbrain_state::screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + int y, sx; + int columns = (m_tvctl & NEWBRAIN_VIDEO_80L) ? 80 : 40; + int excess = (m_tvctl & NEWBRAIN_VIDEO_32_40) ? 24 : 4; + int ucr = (m_tvctl & NEWBRAIN_VIDEO_UCR) ? 1 : 0; + int fs = (m_tvctl & NEWBRAIN_VIDEO_FS) ? 1 : 0; + int rv = (m_tvctl & NEWBRAIN_VIDEO_RV) ? 1 : 0; + int gr = 0; + + UINT16 videoram_addr = m_tvram; + UINT8 rc = 0; + + for (y = 0; y < 250; y++) + { + int x = 0; + + for (sx = 0; sx < columns; sx++) + { + int bit; + + UINT8 videoram_data = program.read_byte(videoram_addr + sx); + UINT8 charrom_data; + + if (gr) + { + /* render video ram data */ + charrom_data = videoram_data; + } + else + { + /* render character rom data */ + UINT16 charrom_addr = (rc << 8) | ((BIT(videoram_data, 7) & fs) << 7) | (videoram_data & 0x7f); + charrom_data = m_char_rom->base()[charrom_addr & 0xfff]; + + if ((videoram_data & 0x80) && !fs) + { + /* invert character */ + charrom_data ^= 0xff; + } + + if ((videoram_data & 0x60) && !ucr) + { + /* strip bit D0 */ + charrom_data &= 0xfe; + } + } + + for (bit = 0; bit < 8; bit++) + { + int color = BIT(charrom_data, 7) ^ rv; + + bitmap.pix32(y, x++) = m_palette->pen(color); + + if (columns == 40) + { + bitmap.pix32(y, x++) = m_palette->pen(color); + } + + charrom_data <<= 1; + } + } + + if (gr) + { + /* get new data for each line */ + videoram_addr += columns; + videoram_addr += excess; + } + else + { + /* increase row counter */ + rc++; + + if (rc == (ucr ? 8 : 10)) + { + /* reset row counter */ + rc = 0; + + videoram_addr += columns; + videoram_addr += excess; + } + } + } +} + +UINT32 newbrain_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + if (m_enrg1 & NEWBRAIN_ENRG1_TVP) + { + screen_update(bitmap, cliprect); + } + else + { + bitmap.fill(rgb_t::black, cliprect); + } + + return 0; +} + +/* Machine Drivers */ + +MACHINE_CONFIG_FRAGMENT( newbrain_video ) + MCFG_DEFAULT_LAYOUT(layout_newbrain) + + MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) + MCFG_SCREEN_UPDATE_DRIVER(newbrain_state, screen_update) + MCFG_SCREEN_REFRESH_RATE(50) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_SIZE(640, 250) + MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249) + + MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") +MACHINE_CONFIG_END |