summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/bus/isa/3c505.h
blob: 115c0c9978e186ee0d90d7b0828cd3bf8982ac12 (plain) (tree)
1
2
3
4
5
6
7
8
                       
                                      
 

                            
 
            
 



                           
                        
 






                                                                                                       









                                                                         
                                       




































































                                                                     


                                                          
                             

                                                                     
                            
 



                                       

                                                    






                                                                                     




















                                                 

                                                 
 
                         


                           
                                
                                
                                
                                

  
                         
                                                    
 
                              
// license:BSD-3-Clause
// copyright-holders:Patrick Mackinlay

#ifndef MAME_BUS_ISA_3C505_H
#define MAME_BUS_ISA_3C505_H

#pragma once

#include "cpu/i86/i186.h"
#include "machine/i82586.h"
#include "machine/ram.h"

#include "bus/isa/isa.h"

class isa16_3c505_device
	: public device_t
	, public device_isa16_card_interface
{
public:
	isa16_3c505_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

protected:
	// device_t overrides
	virtual const tiny_rom_entry *device_rom_region() const override;
	virtual void device_add_mconfig(machine_config &config) override;
	virtual ioport_constructor device_input_ports() const override;
	virtual void device_start() override;
	virtual void device_reset() override;

	void map_main(address_map &map);
	void map_io(address_map &map);
	void map_isa(address_map &map);

	enum acr_mask : u8
	{
		ACR_ASF1 = 0x01, // adapter status flag 1
		ACR_ASF2 = 0x02, // adapter status flag 2
		ACR_ASF3 = 0x04, // adapter status flag 3
		ACR_LED1 = 0x08, // led control 1
		ACR_LED2 = 0x10, // led control 2
		ACR_R586 = 0x20, // reset 82586
		ACR_FLSH = 0x40, // flush data register
		ACR_LPBK = 0x80, // loopback control

		ACR_ASF  = 0x07,
	};
	enum asr_mask : u8
	{
		ASR_HSF1 = 0x01, // host status flag 1
		ASR_HSF2 = 0x02, // host status flag 2
		ASR_SWTC = 0x04, // external switch
		ASR_8_16 = 0x08, // 8/16 bit
		ASR_DIR  = 0x10, // direction flag
		ASR_HCRF = 0x20, // host command register full
		ASR_ACRE = 0x40, // adapter command register empty
		ASR_ARDY = 0x80, // data register ready

		ASR_HSF  = 0x03,
	};
	enum hcr_mask : u8
	{
		HCR_HSF1 = 0x01, // host status flag 1
		HCR_HSF2 = 0x02, // host status flag 2
		HCR_CMDE = 0x04, // command register interrupt enable
		HCR_TCEN = 0x08, // terminal count interrupt enable
		HCR_DIR  = 0x10, // direction flag
		HCR_DMAE = 0x20, // dma enable
		HCR_FLSH = 0x40, // flush data register
		HCR_ATTN = 0x80, // attention

		HCR_HSF  = 0x03,
	};
	enum hsr_mask : u8
	{
		HSR_ASF1 = 0x01, // adapter status flag 1
		HSR_ASF2 = 0x02, // adapter status flag 2
		HSR_ASF3 = 0x04, // adapter status flag 3
		HSR_DONE = 0x08, // dma done
		HSR_DIR  = 0x10, // direction
		HSR_ACRF = 0x20, // adapter command register full
		HSR_HCRE = 0x40, // host command register empty
		HSR_HRDY = 0x80, // data register ready

		HSR_ASF  = 0x07,
	};
	enum hdr_mask : u8
	{
		HDR_BRST = 0x01, // dma burst
	};

	// adapter register helpers
	u8 acmd_r();
	u8 acr_r() { return m_acr; };
	u8 asr_r() { return m_asr; };
	u16 adata_r();
	void acmd_w(u8 data);
	void acr_w(u8 data);
	void adata_w(u16 data);

	// host register helpers
	u8 hcmd_r();
	u8 hsr_r() { return m_hsr; }
	u16 hdata_r(offs_t offset, u16 mem_mask = 0xffff);
	u8 hcr_r() { return m_hcr; }
	void hcmd_w(u8 data);
	void hdr_w(u8 data) { m_hdr = data & HDR_BRST; }
	void hdata_w(offs_t offset, u16 data, u16 mem_mask = 0xffff);
	void hcr_w(u8 data);

	void update_cpu_drq(int state);
	void update_cpu_irq(int state);
	void update_isa_drq(int state);
	void update_isa_irq(int state);
	void update_rdy(u8 const acr, u8 const hcr);

	// dma helpers
	virtual u8 dack_r(int line) override { return hdata_r(0, 0x00ff); }
	virtual void dack_w(int line, u8 data) override { hdata_w(0, data, 0x00ff); }
	virtual void eop_w(int state) override;
	virtual u16 dack16_r(int line) override { return hdata_r(0); }
	virtual void dack16_w(int line, u16 data) override { hdata_w(0, data); }

private:
	required_device<i80186_cpu_device> m_cpu;
	required_device<i82586_device> m_net;
	required_device<ram_device> m_ram;

	output_finder<2> m_led;

	required_ioport m_iobase;
	required_ioport m_irqdrq;
	required_ioport m_romopts;
	required_ioport m_test;

	u8 m_acmdr; // adapter command register
	u8 m_acr;   // adapter control register
	u8 m_asr;   // adapter status register

	u8 m_hcmdr; // host command register
	u8 m_hcr;   // host control register
	u8 m_hsr;   // host status register
	u8 m_hdr;   // host aux dma register

	static constexpr unsigned FIFO_SIZE = 20;
	util::fifo<u8, FIFO_SIZE> m_data;

	bool m_installed;
	unsigned m_isa_irq;
	unsigned m_isa_drq;

	bool m_cpu_drq_asserted;
	bool m_cpu_irq_asserted;
	bool m_isa_drq_asserted;
	bool m_isa_irq_asserted;
};

// device type definition
DECLARE_DEVICE_TYPE(ISA16_3C505, isa16_3c505_device)

#endif // MAME_BUS_ISA_3C505_H