summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/video/hd61202.cpp
blob: 50bbc91d0b37d3d31805a82fc43a2c230957d54c (plain) (tree)



































































































































                                                                                                              
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
/**********************************************************************

        Hitachi HD61202 LCD Driver

**********************************************************************/

#include "emu.h"
#include "hd61202.h"
#include "screen.h"


DEFINE_DEVICE_TYPE(HD61202, hd61202_device, "hd61202", "Hitachi HD61202 LCD Driver")

//**************************************************************************
//  LIVE DEVICE
//**************************************************************************

//-------------------------------------------------
//  hd61202_device - constructor
//-------------------------------------------------

hd61202_device::hd61202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
	: device_t(mconfig, HD61202, tag, owner, clock)
	, m_screen_update_cb(*this)
{
}

void hd61202_device::device_resolve_objects()
{
	m_screen_update_cb.resolve();
}

//-------------------------------------------------
//  device_start - device-specific startup
//-------------------------------------------------

void hd61202_device::device_start()
{
	save_item(NAME(m_bf));
	save_item(NAME(m_lcd_on));
	save_item(NAME(m_out_data));
	save_item(NAME(m_page));
	save_item(NAME(m_addr));
	save_item(NAME(m_start_line));
	save_item(NAME(m_ddr));
}

//-------------------------------------------------
//  device_reset - device-specific reset
//-------------------------------------------------

void hd61202_device::device_reset()
{
	m_bf = 0;
	m_lcd_on = 0;
	m_out_data = 0;
	m_page = 0;
	m_addr = 0;
	m_start_line = 0;
	std::fill(std::begin(m_ddr), std::end(m_ddr), 0);
}


//-------------------------------------------------
//  status_r - status register read
//-------------------------------------------------

uint8_t hd61202_device::status_r()
{
	// x--- ---- Busy
	// --x- ---- LCD on/off

	uint8_t data = 0;

	data |= (m_lcd_on << 5);
	data |= (m_bf << 7);

	return data;
}


//-------------------------------------------------
//  control_w - instruction register write
//-------------------------------------------------

void hd61202_device::control_w(uint8_t data)
{
	if ((data & 0xfe) == 0x3e)            // Display on/off
		m_lcd_on = data & 0x01;
	else if ((data & 0xf8) == 0xb8)       // Set page
		m_page = data & 0x07;
	else if ((data & 0xc0) == 0x40)       // Set address
		m_addr = data & 0x3f;
	else if ((data & 0xc0) == 0xc0)       // Set display start line
		m_start_line = data & 0x3f;
}


//-------------------------------------------------
//  data_r - data register read
//-------------------------------------------------

uint8_t hd61202_device::data_r()
{
	uint8_t data = m_out_data;
	m_out_data = m_ddr[(m_page * 0x40 + m_addr) & 0x1ff];
	m_addr++;

	return data;
}


//-------------------------------------------------
//  data_w - data register write
//-------------------------------------------------

void hd61202_device::data_w(uint8_t data)
{
	m_ddr[(m_page * 0x40 + m_addr) & 0x1ff] = data;
	m_addr++;
}

//-------------------------------------------------
//  update_screen - update screen
//-------------------------------------------------

uint32_t hd61202_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	return m_screen_update_cb(bitmap, cliprect, m_lcd_on, m_start_line, m_ddr);
}