hnayayoi.cpp: Use HD6845 CRTC for video; improve screen parameters

This commit is contained in:
AJR 2018-03-09 00:20:26 -05:00
parent 09f7a2e5af
commit 146f9fffe4
3 changed files with 63 additions and 81 deletions

View File

@ -47,6 +47,7 @@ TODO:
#include "machine/74259.h"
#include "machine/clock.h"
#include "machine/nvram.h"
#include "video/mc6845.h"
#include "screen.h"
#include "speaker.h"
@ -117,8 +118,8 @@ ADDRESS_MAP_START(hnayayoi_state::hnayayoi_io_map)
AM_RANGE(0x02, 0x03) AM_DEVREAD("ymsnd", ym2203_device, read)
AM_RANGE(0x04, 0x04) AM_READ_PORT("DSW3")
AM_RANGE(0x06, 0x06) AM_WRITE(adpcm_data_w)
// AM_RANGE(0x08, 0x08) AM_WRITENOP // CRT Controller
// AM_RANGE(0x09, 0x09) AM_WRITENOP // CRT Controller
AM_RANGE(0x08, 0x08) AM_DEVWRITE("crtc", hd6845_device, address_w)
AM_RANGE(0x09, 0x09) AM_DEVWRITE("crtc", hd6845_device, register_w)
AM_RANGE(0x0a, 0x0a) AM_WRITE(dynax_blitter_rev1_start_w)
AM_RANGE(0x0c, 0x0c) AM_WRITE(dynax_blitter_rev1_clear_w)
AM_RANGE(0x20, 0x27) AM_DEVWRITE("mainlatch", ls259_device, write_d0)
@ -138,8 +139,8 @@ ADDRESS_MAP_START(hnayayoi_state::hnfubuki_map)
AM_RANGE(0xff02, 0xff03) AM_DEVREAD("ymsnd", ym2203_device, read)
AM_RANGE(0xff04, 0xff04) AM_READ_PORT("DSW3")
AM_RANGE(0xff06, 0xff06) AM_WRITE(adpcm_data_w)
// AM_RANGE(0xff08, 0xff08) AM_WRITENOP // CRT Controller
// AM_RANGE(0xff09, 0xff09) AM_WRITENOP // CRT Controller
AM_RANGE(0xff08, 0xff08) AM_DEVWRITE("crtc", hd6845_device, address_w)
AM_RANGE(0xff09, 0xff09) AM_DEVWRITE("crtc", hd6845_device, register_w)
AM_RANGE(0xff0a, 0xff0a) AM_WRITE(dynax_blitter_rev1_start_w)
AM_RANGE(0xff0c, 0xff0c) AM_WRITE(dynax_blitter_rev1_clear_w)
AM_RANGE(0xff20, 0xff27) AM_DEVWRITE("mainlatch", ls259_device, write_d0)
@ -161,7 +162,7 @@ ADDRESS_MAP_START(hnayayoi_state::untoucha_io_map)
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x10, 0x10) AM_DEVWRITE("ymsnd", ym2203_device, control_port_w)
AM_RANGE(0x11, 0x11) AM_DEVREAD("ymsnd", ym2203_device, status_port_r)
// AM_RANGE(0x12, 0x12) AM_WRITENOP // CRT Controller
AM_RANGE(0x12, 0x12) AM_DEVWRITE("crtc", hd6845_device, address_w)
AM_RANGE(0x13, 0x13) AM_WRITE(adpcm_data_w)
AM_RANGE(0x14, 0x14) AM_READ_PORT("COIN")
AM_RANGE(0x15, 0x15) AM_READ(keyboard_1_r)
@ -174,7 +175,7 @@ ADDRESS_MAP_START(hnayayoi_state::untoucha_io_map)
AM_RANGE(0x30, 0x37) AM_DEVWRITE("mainlatch", ls259_device, write_d0)
AM_RANGE(0x50, 0x50) AM_DEVWRITE("ymsnd", ym2203_device, write_port_w)
AM_RANGE(0x51, 0x51) AM_DEVREAD("ymsnd", ym2203_device, read_port_r)
// AM_RANGE(0x52, 0x52) AM_WRITENOP // CRT Controller
AM_RANGE(0x52, 0x52) AM_DEVWRITE("crtc", hd6845_device, register_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( hf_keyboard )
@ -543,7 +544,6 @@ MACHINE_CONFIG_START(hnayayoi_state::hnayayoi)
MCFG_CPU_ADD("maincpu", Z80, 20000000/4 ) /* 5 MHz ???? */
MCFG_CPU_PROGRAM_MAP(hnayayoi_map)
MCFG_CPU_IO_MAP(hnayayoi_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", hnayayoi_state, irq0_line_hold)
MCFG_DEVICE_ADD("nmiclock", CLOCK, 8000)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(hnayayoi_state, nmi_clock_w))
@ -558,15 +558,18 @@ MACHINE_CONFIG_START(hnayayoi_state::hnayayoi)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(512, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
MCFG_SCREEN_UPDATE_DRIVER(hnayayoi_state, screen_update_hnayayoi)
MCFG_SCREEN_PALETTE("palette")
MCFG_SCREEN_RAW_PARAMS(20_MHz_XTAL / 2, 632, 0, 512, 263, 0, 243)
MCFG_SCREEN_UPDATE_DEVICE("crtc", hd6845_device, screen_update)
MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 256)
MCFG_DEVICE_ADD("crtc", HD6845, 20_MHz_XTAL / 8)
MCFG_VIDEO_SET_SCREEN("screen")
MCFG_MC6845_CHAR_WIDTH(4)
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_OUT_VSYNC_CB(INPUTLINE("maincpu", 0))
MCFG_MC6845_UPDATE_ROW_CB(hnayayoi_state, hnayayoi_update_row)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@ -606,6 +609,9 @@ MACHINE_CONFIG_START(hnayayoi_state::untoucha)
MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(DEVWRITELINE("msm", msm5205_device, reset_w)) MCFG_DEVCB_INVERT
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(NOOP) // ?
MCFG_DEVICE_MODIFY("crtc")
MCFG_MC6845_UPDATE_ROW_CB(hnayayoi_state, untoucha_update_row)
MCFG_VIDEO_START_OVERRIDE(hnayayoi_state,untoucha)
MACHINE_CONFIG_END

View File

@ -6,6 +6,7 @@
*************************************************************************/
#include "sound/msm5205.h"
#include "video/mc6845.h"
class hnayayoi_state : public driver_device
{
@ -13,12 +14,12 @@ public:
hnayayoi_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) ,
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm") { }
m_msm(*this, "msm"),
m_palette(*this, "palette") { }
/* video-related */
uint8_t *m_pixmap[8];
std::unique_ptr<uint8_t[]> m_pixmap[8];
int m_palbank;
int m_total_pixmaps;
uint8_t m_blit_layer;
uint16_t m_blit_dest;
uint32_t m_blit_src;
@ -43,13 +44,15 @@ public:
virtual void machine_reset() override;
virtual void video_start() override;
DECLARE_VIDEO_START(untoucha);
uint32_t screen_update_hnayayoi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
MC6845_UPDATE_ROW(hnayayoi_update_row);
MC6845_UPDATE_ROW(untoucha_update_row);
void common_vh_start( int num_pixmaps );
void copy_pixel( int x, int y, int pen );
void draw_layer_interleaved( bitmap_ind16 &bitmap, const rectangle &cliprect, int left_pixmap, int right_pixmap, int palbase, int transp );
void draw_layer_interleaved(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint16_t row, uint16_t y, uint8_t x_count, int left_pixmap, int right_pixmap, int palbase, bool transp);
DECLARE_WRITE_LINE_MEMBER(irqhandler);
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
required_device<palette_device> m_palette;
void untoucha(machine_config &config);
void hnayayoi(machine_config &config);
void hnfubuki(machine_config &config);

View File

@ -16,43 +16,21 @@ The blitter reads compressed data from ROM and copies it to the bitmap RAM.
void hnayayoi_state::common_vh_start( int num_pixmaps )
{
int i;
m_total_pixmaps = num_pixmaps;
for (i = 0; i < 8; i++)
for (int i = 0; i < num_pixmaps; i++)
{
if (i < m_total_pixmaps)
{
m_pixmap[i] = auto_alloc_array(machine(), uint8_t, 256 * 256);
}
else
m_pixmap[i] = nullptr;
m_pixmap[i] = make_unique_clear<uint8_t[]>(256 * 256);
save_pointer(NAME(m_pixmap[i].get()), 256 * 256, i);
}
}
void hnayayoi_state::video_start()
{
common_vh_start(4); /* 4 bitmaps -> 2 layers */
save_pointer(NAME(m_pixmap[0]), 256 * 256);
save_pointer(NAME(m_pixmap[1]), 256 * 256);
save_pointer(NAME(m_pixmap[2]), 256 * 256);
save_pointer(NAME(m_pixmap[3]), 256 * 256);
}
VIDEO_START_MEMBER(hnayayoi_state,untoucha)
{
common_vh_start(8); /* 8 bitmaps -> 4 layers */
save_pointer(NAME(m_pixmap[0]), 256 * 256);
save_pointer(NAME(m_pixmap[1]), 256 * 256);
save_pointer(NAME(m_pixmap[2]), 256 * 256);
save_pointer(NAME(m_pixmap[3]), 256 * 256);
save_pointer(NAME(m_pixmap[4]), 256 * 256);
save_pointer(NAME(m_pixmap[5]), 256 * 256);
save_pointer(NAME(m_pixmap[6]), 256 * 256);
save_pointer(NAME(m_pixmap[7]), 256 * 256);
}
@ -209,7 +187,7 @@ WRITE8_MEMBER(hnayayoi_state::dynax_blitter_rev1_clear_w)
for (i = 0; i < 8; i++)
{
if ((~m_blit_layer & (1 << i)) && (m_pixmap[i]))
memset(m_pixmap[i] + m_blit_dest, pen, 0x10000 - m_blit_dest);
std::fill(&m_pixmap[i][m_blit_dest], &m_pixmap[i][0x10000], pen);
}
}
@ -221,59 +199,54 @@ WRITE8_MEMBER(hnayayoi_state::hnayayoi_palbank_w)
}
void hnayayoi_state::draw_layer_interleaved( bitmap_ind16 &bitmap, const rectangle &cliprect, int left_pixmap, int right_pixmap, int palbase, int transp )
void hnayayoi_state::draw_layer_interleaved(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint16_t row, uint16_t y, uint8_t x_count, int left_pixmap, int right_pixmap, int palbase, bool transp)
{
int county, countx, pen;
uint8_t *src1 = m_pixmap[left_pixmap];
uint8_t *src2 = m_pixmap[right_pixmap];
uint16_t *dstbase = &bitmap.pix16(0);
uint8_t *src1 = &m_pixmap[left_pixmap][(row & 255) * 256];
uint8_t *src2 = &m_pixmap[right_pixmap][(row & 255) * 256];
uint32_t *dst = &bitmap.pix32(y);
palbase *= 16;
for (county = 255; county >= 0; county--, dstbase += bitmap.rowpixels())
{
uint16_t *dst = dstbase;
const pen_t *pal = &m_palette->pens()[palbase * 16];
if (transp)
{
for (countx = 255; countx >= 0; countx--, dst += 2)
for (int countx = x_count * 2 - 1; countx >= 0; countx--, dst += 2)
{
pen = *(src1++);
if (pen) *dst = palbase + pen;
int pen = *(src1++);
if (pen) *dst = pal[pen];
pen = *(src2++);
if (pen) *(dst + 1) = palbase + pen;
if (pen) *(dst + 1) = pal[pen];
}
}
else
{
for (countx = 255; countx >= 0; countx--, dst += 2)
for (int countx = x_count * 2 - 1; countx >= 0; countx--, dst += 2)
{
*dst = palbase + *(src1++);
*(dst + 1) = palbase + *(src2++);
}
*dst = pal[*(src1++)];
*(dst + 1) = pal[*(src2++)];
}
}
}
uint32_t hnayayoi_state::screen_update_hnayayoi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
MC6845_UPDATE_ROW(hnayayoi_state::hnayayoi_update_row)
{
int col0 = (m_palbank >> 0) & 0x0f;
int col1 = (m_palbank >> 4) & 0x0f;
draw_layer_interleaved(bitmap, cliprect, y, y, x_count, 3, 2, col1, false);
draw_layer_interleaved(bitmap, cliprect, y, y, x_count, 1, 0, col0, true);
}
MC6845_UPDATE_ROW(hnayayoi_state::untoucha_update_row)
{
int col0 = (m_palbank >> 0) & 0x0f;
int col1 = (m_palbank >> 4) & 0x0f;
int col2 = (m_palbank >> 8) & 0x0f;
int col3 = (m_palbank >> 12) & 0x0f;
if (m_total_pixmaps == 4)
{
draw_layer_interleaved(bitmap, cliprect, 3, 2, col1, 0);
draw_layer_interleaved(bitmap, cliprect, 1, 0, col0, 1);
}
else /* total_pixmaps == 8 */
{
draw_layer_interleaved(bitmap, cliprect, 7, 6, col3, 0);
draw_layer_interleaved(bitmap, cliprect, 5, 4, col2, 1);
draw_layer_interleaved(bitmap, cliprect, 3, 2, col1, 1);
draw_layer_interleaved(bitmap, cliprect, 1, 0, col0, 1);
}
return 0;
draw_layer_interleaved(bitmap, cliprect, y + 16, y, x_count, 7, 6, col3, false);
draw_layer_interleaved(bitmap, cliprect, y + 16, y, x_count, 5, 4, col2, true);
draw_layer_interleaved(bitmap, cliprect, y + 16, y, x_count, 3, 2, col1, true);
draw_layer_interleaved(bitmap, cliprect, y + 16, y, x_count, 1, 0, col0, true);
}