summaryrefslogblamecommitdiffstatshomepage
path: root/src/mess/includes/compis.h
blob: 01816c631ad21f4d72f11db30343276b385bebfa (plain) (tree)
























                                                                              
                             
















































































































































































                                                                                                          
/*****************************************************************************
 *
 * includes/compis.h
 *
 * machine driver header
 *
 * Per Ola Ingvarsson
 * Tomas Karlsson
 *
 ****************************************************************************/

#ifndef COMPIS_H_
#define COMPIS_H_

#include "emu.h"
#include "cpu/i86/i86.h"
#include "cpu/mcs48/mcs48.h"
#include "video/upd7220.h"
#include "machine/ctronics.h"
#include "machine/i8251.h"
#include "machine/pit8253.h"
#include "machine/i8255.h"
#include "machine/pic8259.h"
#include "machine/mm58274c.h"
#include "machine/upd765.h"
#include "machine/compiskb.h"
#include "imagedev/flopdrv.h"
#include "formats/cpis_dsk.h"


struct mem_state
{
	UINT16	lower;
	UINT16	upper;
	UINT16	middle;
	UINT16	middle_size;
	UINT16	peripheral;
};

struct timer_state
{
	UINT16	control;
	UINT16	maxA;
	UINT16	maxB;
	UINT16	count;
	emu_timer *	int_timer;
	emu_timer *	time_timer;
	UINT8	time_timer_active;
	attotime	last_time;
};

struct dma_state
{
	UINT32	source;
	UINT32	dest;
	UINT16	count;
	UINT16	control;
	UINT8	finished;
	emu_timer *	finish_timer;
};

struct intr_state
{
	UINT8	pending;
	UINT16	ack_mask;
	UINT16	priority_mask;
	UINT16	in_service;
	UINT16	request;
	UINT16	status;
	UINT16	poll_status;
	UINT16	timer;
	UINT16	dma[2];
	UINT16	ext[4];
};

typedef struct
{
	struct timer_state	timer[3];
	struct dma_state	dma[2];
	struct intr_state	intr;
	struct mem_state	mem;
} i186_state;


/* Keyboard */
typedef struct
{
	UINT8 nationality;   /* Character set, keyboard layout (Swedish) */
	UINT8 release_time;  /* Autorepeat release time (0.8)   */
	UINT8 speed;	     /* Transmission speed (14)     */
	UINT8 roll_over;     /* Key roll-over (MKEY)        */
	UINT8 click;	     /* Key click (NO)          */
	UINT8 break_nmi;     /* Keyboard break (NMI)        */
	UINT8 beep_freq;     /* Beep frequency (low)        */
	UINT8 beep_dura;     /* Beep duration (short)       */
	UINT8 password[8];   /* Password            */
	UINT8 owner[16];     /* Owner               */
	UINT8 network_id;    /* Network workstation number (1)  */
	UINT8 boot_order[4]; /* Boot device order (FD HD NW PD) */
	UINT8 key_code;
	UINT8 key_status;
} TYP_COMPIS_KEYBOARD;

/* USART 8251 */
typedef struct
{
	UINT8 status;
	UINT8 bytes_sent;
} TYP_COMPIS_USART;

/* Printer */
typedef struct
{
	UINT8 data;
	UINT8 strobe;
} TYP_COMPIS_PRINTER;


/* Main emulation */
typedef struct
{
	TYP_COMPIS_PRINTER	printer;	/* Printer */
	TYP_COMPIS_USART	usart;		/* USART 8251 */
	TYP_COMPIS_KEYBOARD	keyboard;	/* Keyboard  */
} TYP_COMPIS;


class compis_state : public driver_device
{
public:
	compis_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
	m_maincpu(*this, "maincpu"),
	m_8253(*this, "pit8253"),
	m_8254(*this, "pit8254"),
	m_8259m(*this, "pic8259_master"),
	m_8259s(*this, "pic8259_slave"),
	m_8255(*this, "ppi8255"),
	m_centronics(*this, "centronics"),
	m_uart(*this, "uart"),
	m_rtc(*this, "mm58274c"),
	m_fdc(*this, "upd765"),
	m_crtc(*this, "upd7220"),
	m_video_ram(*this, "video_ram") { }

	required_device<cpu_device> m_maincpu;
	required_device<device_t> m_8253;
	required_device<device_t> m_8254;
	required_device<device_t> m_8259m;
	required_device<device_t> m_8259s;
	required_device<i8255_device> m_8255;
	required_device<centronics_device> m_centronics;
	required_device<i8251_device> m_uart;
	required_device<device_t> m_rtc;
	required_device<device_t> m_fdc;
	required_device<upd7220_device> m_crtc;
	DECLARE_READ16_MEMBER(compis_fdc_dack_r);
	DECLARE_READ16_MEMBER(compis_usart_r);
	DECLARE_WRITE16_MEMBER(compis_usart_w);
	DECLARE_READ16_MEMBER(compis_i186_internal_port_r);
	DECLARE_WRITE16_MEMBER(compis_i186_internal_port_w);
	DECLARE_WRITE8_MEMBER(vram_w);
	DECLARE_WRITE8_MEMBER(compis_fdc_w);
	DECLARE_READ8_MEMBER(compis_fdc_r);
	DECLARE_WRITE_LINE_MEMBER(compis_fdc_int);
	DECLARE_WRITE_LINE_MEMBER(compis_fdc_dma_drq);
	DECLARE_READ8_MEMBER(compis_ppi_port_b_r);
	DECLARE_WRITE8_MEMBER(compis_ppi_port_c_w);
	DECLARE_READ16_MEMBER(compis_osp_pit_r);
	DECLARE_WRITE16_MEMBER(compis_osp_pit_w);
	DECLARE_WRITE_LINE_MEMBER(compis_usart_rxready);
	DECLARE_WRITE_LINE_MEMBER(compis_pic8259_master_set_int_line);
	DECLARE_WRITE_LINE_MEMBER(compis_pic8259_slave_set_int_line);
	DECLARE_READ8_MEMBER(get_slave_ack);
	i186_state m_i186;
	TYP_COMPIS m_compis;
	UINT8 *m_p_videoram;
	void update_dma_control(int which, int new_control);
	void internal_timer_update(int which, int new_count, int new_maxA, int new_maxB, int new_control);
	void internal_timer_sync(int which);
	void handle_eoi(int data);
	void compis_fdc_tc(int state);

	required_shared_ptr<UINT8> m_video_ram;
	DECLARE_DRIVER_INIT(compis);
};


/*----------- defined in machine/compis.c -----------*/

extern const i8255_interface compis_ppi_interface;
extern const struct pit8253_config compis_pit8253_config;
extern const struct pit8253_config compis_pit8254_config;
extern const struct pic8259_interface compis_pic8259_master_config;
extern const struct pic8259_interface compis_pic8259_slave_config;
extern const i8251_interface compis_usart_interface;
extern const upd765_interface compis_fdc_interface;

MACHINE_START(compis);
MACHINE_RESET(compis);
INTERRUPT_GEN(compis_vblank_int);

#endif /* COMPIS_H_ */