mirror of
https://github.com/holub/mame
synced 2025-07-04 01:18:59 +03:00
hnayayoi.cpp: Use HD6845 CRTC for video; improve screen parameters
This commit is contained in:
parent
09f7a2e5af
commit
146f9fffe4
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
const pen_t *pal = &m_palette->pens()[palbase * 16];
|
||||
|
||||
for (county = 255; county >= 0; county--, dstbase += bitmap.rowpixels())
|
||||
if (transp)
|
||||
{
|
||||
uint16_t *dst = dstbase;
|
||||
|
||||
if (transp)
|
||||
for (int countx = x_count * 2 - 1; countx >= 0; countx--, dst += 2)
|
||||
{
|
||||
for (countx = 255; countx >= 0; countx--, dst += 2)
|
||||
{
|
||||
pen = *(src1++);
|
||||
if (pen) *dst = palbase + pen;
|
||||
pen = *(src2++);
|
||||
if (pen) *(dst + 1) = palbase + pen;
|
||||
}
|
||||
int pen = *(src1++);
|
||||
if (pen) *dst = pal[pen];
|
||||
pen = *(src2++);
|
||||
if (pen) *(dst + 1) = pal[pen];
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int countx = x_count * 2 - 1; countx >= 0; countx--, dst += 2)
|
||||
{
|
||||
for (countx = 255; 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user