summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/newbrain.cpp6
-rw-r--r--src/mame/video/newbrain.cpp81
2 files changed, 45 insertions, 42 deletions
diff --git a/src/mame/drivers/newbrain.cpp b/src/mame/drivers/newbrain.cpp
index e1a775cb407..c48a77c7997 100644
--- a/src/mame/drivers/newbrain.cpp
+++ b/src/mame/drivers/newbrain.cpp
@@ -862,8 +862,8 @@ ROM_START( newbrain )
ROM_REGION( 0x400, COP420_TAG, 0 )
ROM_LOAD( "cop420.419", 0x000, 0x400, CRC(a1388ee7) SHA1(5822e16aa794545600bf7a9dbee2ef467ca2a3e0) )
- ROM_REGION( 0x1000, "chargen", ROMREGION_ERASE00 )
- ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x0a01, CRC(46ecbc65) SHA1(3fe064d49a4de5e3b7383752e98ad35a674e26dd) ) // 8248R7 bad dump!
+ ROM_REGION( 0x1000, "chargen", 0 )
+ ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x1000, CRC(6a38b7a2) SHA1(29f3e672fc41792ac2f2b405e571d79235193561) ) // 8248R7
ROM_END
@@ -887,7 +887,7 @@ ROM_START( newbrainmd )
ROM_LOAD( "cop420.419", 0x000, 0x400, CRC(a1388ee7) SHA1(5822e16aa794545600bf7a9dbee2ef467ca2a3e0) )
ROM_REGION( 0x1000, "chargen", 0 )
- ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x0a01, BAD_DUMP CRC(46ecbc65) SHA1(3fe064d49a4de5e3b7383752e98ad35a674e26dd) ) // 8248R7
+ ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x1000, CRC(6a38b7a2) SHA1(29f3e672fc41792ac2f2b405e571d79235193561) ) // 8248R7
ROM_END
diff --git a/src/mame/video/newbrain.cpp b/src/mame/video/newbrain.cpp
index f16a73a7901..eaec573a907 100644
--- a/src/mame/video/newbrain.cpp
+++ b/src/mame/video/newbrain.cpp
@@ -1,5 +1,13 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
+/*
+
+ TODO:
+
+ - GR is always 0
+
+*/
+
#include "includes/newbrain.h"
#include "rendlay.h"
#include "newbrain.lh"
@@ -70,72 +78,68 @@ void newbrain_state::screen_update(bitmap_rgb32 &bitmap, const rectangle &clipre
int gr = 0;
uint16_t videoram_addr = m_tvl;
- uint8_t rc = 0;
+ int rc = 0;
+ uint8_t vsr = 0;
+ uint8_t grsr = 0;
- for (int y = 0; y < 200; y++)
- {
+ for (int y = 0; y < 240; y++) {
int x = 0;
- for (int sx = 0; sx < columns; sx++)
- {
- uint8_t videoram_data = m_ram->pointer()[(videoram_addr + sx) & 0x7fff];
- uint8_t charrom_data;
+ for (int sx = 0; sx < columns; sx++) {
+ uint8_t rd = m_ram->pointer()[(videoram_addr + sx) & 0x7fff];
- if (gr)
- {
- /* render video ram data */
- charrom_data = videoram_data;
+ bool rc3 = BIT(rc, 3);
+ bool txt = !(BIT(rd, 6) || BIT(rd, 5));
+ bool txtq = m_ucr || txt;
+
+ int rc_ = rc & 0x07;
+ if (rc3 && txt) {
+ rc_ = 7;
}
- else
- {
- /* render character rom data */
- uint16_t charrom_addr = (rc << 8) | ((BIT(videoram_data, 7) && m_fs) << 7) | (videoram_data & 0x7f);
- charrom_data = m_char_rom->base()[charrom_addr & 0xfff];
-
- if ((videoram_data & 0x80) && !m_fs)
- {
- /* invert character */
- charrom_data ^= 0xff;
- }
+
+ uint16_t charrom_addr = (m_ucr << 11) | (rc_ << 8) | ((BIT(rd, 7) && m_fs) << 7) | (rd & 0x7f);
+ uint8_t crd = m_char_rom->base()[charrom_addr & 0xfff];
+ bool crd0 = BIT(crd, 0);
- if ((videoram_data & 0x60) && !m_ucr)
- {
- /* strip bit D0 */
- charrom_data &= 0xfe;
- }
+ bool ldvsr = !(((!rc3 ^ crd0) || gr) || txtq);
+
+ if (!ldvsr && !gr) {
+ vsr = (crd & 0xfe) | (crd0 && txtq);
+ }
+
+ if (!ldvsr && gr) {
+ grsr = rd;
}
- for (int bit = 0; bit < 8; bit++)
- {
- int color = BIT(charrom_data, 7) ^ m_rv;
+ for (int i = 0; i < 8; i++) {
+ uint8_t sr = gr ? grsr : vsr;
+ int color = BIT(sr, 7) ^ m_rv;
bitmap.pix32(y, x++) = m_palette->pen(color);
- if (columns == 40)
- {
+ if (columns == 40) {
bitmap.pix32(y, x++) = m_palette->pen(color);
}
- charrom_data <<= 1;
+ grsr <<= 1;
+ vsr <<= 1;
}
}
if (gr)
{
- /* get new data for each line */
+ // get new data for each line
videoram_addr += columns;
videoram_addr += excess;
}
else
{
- /* increase row counter */
rc++;
- if (rc == (m_ucr ? 8 : 10))
- {
- /* reset row counter */
+ if (rc == (m_ucr ? 8 : 10)) {
rc = 0;
+ // get new data after each character row
videoram_addr += columns;
videoram_addr += excess;
}
@@ -183,7 +187,6 @@ MACHINE_CONFIG_FRAGMENT( newbrain_video )
MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
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)