diff --git a/src/mame/drivers/hnayayoi.cpp b/src/mame/drivers/hnayayoi.cpp index 34ade4ad1e0..80ed2483ecf 100644 --- a/src/mame/drivers/hnayayoi.cpp +++ b/src/mame/drivers/hnayayoi.cpp @@ -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 diff --git a/src/mame/includes/hnayayoi.h b/src/mame/includes/hnayayoi.h index 296025ba381..af81198631e 100644 --- a/src/mame/includes/hnayayoi.h +++ b/src/mame/includes/hnayayoi.h @@ -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 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 m_maincpu; required_device m_msm; + required_device m_palette; void untoucha(machine_config &config); void hnayayoi(machine_config &config); void hnfubuki(machine_config &config); diff --git a/src/mame/video/hnayayoi.cpp b/src/mame/video/hnayayoi.cpp index 20b4a00ce00..3de4f445f74 100644 --- a/src/mame/video/hnayayoi.cpp +++ b/src/mame/video/hnayayoi.cpp @@ -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(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); }