summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/hp98x5_io_sys.h
blob: 3254393d80d2eb7041a7a0eead38cc90cb795983 (plain) (tree)


































































                                                                                                              
// License:BSD-3-Clause
// copyright-holders:F. Ulivi
/*********************************************************************

    hp98x5_io_sys.h

    HP98x5 I/O sub-system

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

#ifndef MAME_MACHINE_HP98X5_IO_SYS_H
#define MAME_MACHINE_HP98X5_IO_SYS_H

#pragma once

class hp98x5_io_sys_device : public device_t
{
public:
	// construction/destruction
	hp98x5_io_sys_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	auto irl() { return m_irl_handler.bind(); }
	auto irh() { return m_irh_handler.bind(); }
	auto sts() { return m_sts_handler.bind(); }
	auto flg() { return m_flg_handler.bind(); }
	auto dmar() { return m_dmar_handler.bind(); }

	IRQ_CALLBACK_MEMBER(irq_callback);
	DECLARE_WRITE8_MEMBER(pa_w);

	void set_irq(uint8_t sc , int state);
	void set_sts(uint8_t sc , int state);
	void set_flg(uint8_t sc , int state);
	void set_dmar(uint8_t sc , int state);

	bool is_irq_pending(uint8_t sc) const;
private:
	devcb_write_line m_irl_handler;
	devcb_write_line m_irh_handler;
	devcb_write_line m_flg_handler;
	devcb_write_line m_sts_handler;
	devcb_write_line m_dmar_handler;

	// Interrupt handling
	uint16_t m_irq_pending;

	// FLG/STS handling
	uint8_t m_pa;
	uint16_t m_flg_status;
	uint16_t m_sts_status;

	// DMAR handling
	uint16_t m_dmar_status;

	void update_irq();
	void update_flg_sts();
	void update_dmar();
};

// device type definition
DECLARE_DEVICE_TYPE(HP98X5_IO_SYS, hp98x5_io_sys_device)

#endif // MAME_MACHINE_HP98X5_IO_SYS_H