summaryrefslogtreecommitdiffstats
path: root/src/mame/includes/cidelsa.h
blob: 0cf8a12f6a1ccb1b868f535160740c96ad5b6dea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// license:BSD-3-Clause
// copyright-holders:Curt Coder
#ifndef MAME_INCLUDES_CIDELSA_H
#define MAME_INCLUDES_CIDELSA_H

#pragma once


#include "cpu/cosmac/cosmac.h"
#include "cpu/cop400/cop400.h"
#include "sound/cdp1869.h"
#include "sound/ay8910.h"
#include "machine/cdp1852.h"
#include "machine/nvram.h"


#define SCREEN_TAG  "screen"
#define CDP1802_TAG "cdp1802"
#define CDP1869_TAG "cdp1869"
#define COP402N_TAG "cop402n"
#define AY8910_TAG  "ay8910"

#define DESTRYER_CHR1   3579000.0 // unverified
#define DESTRYER_CHR2   XTAL(5'714'300)
#define ALTAIR_CHR1     3579000.0 // unverified
#define ALTAIR_CHR2     cdp1869_device::DOT_CLK_PAL // unverified
#define DRACO_CHR1      XTAL(4'433'610)
#define DRACO_CHR2      cdp1869_device::DOT_CLK_PAL // unverified
#define DRACO_SND_CHR1  XTAL(2'012'160)

#define CIDELSA_PAGERAM_SIZE    0x400
#define DRACO_PAGERAM_SIZE      0x800
#define CIDELSA_CHARRAM_SIZE    0x800

#define CIDELSA_PAGERAM_MASK    0x3ff
#define DRACO_PAGERAM_MASK      0x7ff
#define CIDELSA_CHARRAM_MASK    0x7ff


class cidelsa_state : public driver_device
{
public:
	enum
	{
		TIMER_SET_CPU_MODE
	};

	cidelsa_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, CDP1802_TAG)
		, m_vis(*this, CDP1869_TAG)
		, m_leds(*this, "led%u", 0U)
	{ }

	DECLARE_WRITE8_MEMBER( cdp1869_w );
	DECLARE_WRITE8_MEMBER( destryer_out1_w );
	DECLARE_WRITE8_MEMBER( altair_out1_w );

	DECLARE_READ_LINE_MEMBER( clear_r );

	DECLARE_WRITE_LINE_MEMBER( q_w );
	DECLARE_WRITE_LINE_MEMBER( prd_w );
	DECLARE_READ_LINE_MEMBER( cdp1869_pcb_r );

	CDP1869_CHAR_RAM_READ_MEMBER(cidelsa_charram_r);
	CDP1869_CHAR_RAM_WRITE_MEMBER(cidelsa_charram_w);
	CDP1869_PCB_READ_MEMBER(cidelsa_pcb_r);

	void destryera(machine_config &config);
	void altair(machine_config &config);
	void destryer(machine_config &config);
	void destryer_video(machine_config &config);
	void altair_video(machine_config &config);
	void altair_io_map(address_map &map);
	void altair_map(address_map &map);
	void cidelsa_page_ram(address_map &map);
	void destryer_io_map(address_map &map);
	void destryer_map(address_map &map);
	void destryera_map(address_map &map);

protected:
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
	virtual void machine_start() override;
	virtual void machine_reset() override;

	virtual void video_start() override;

	required_device<cosmac_device> m_maincpu;
	required_device<cdp1869_device> m_vis;
	output_finder<3> m_leds;

	// cpu state
	int m_reset;

	// video state
	int m_cdp1802_q;
	int m_cdp1869_pcb;

	uint8_t *m_pageram;
	std::unique_ptr<uint8_t[]> m_pcbram;
	std::unique_ptr<uint8_t[]> m_charram;
};

class draco_state : public cidelsa_state
{
public:
	draco_state(const machine_config &mconfig, device_type type, const char *tag)
		: cidelsa_state(mconfig, type, tag),
			m_psg(*this, AY8910_TAG)
	{ }

	DECLARE_READ8_MEMBER( sound_in_r );
	DECLARE_READ8_MEMBER( psg_r );
	DECLARE_WRITE8_MEMBER( sound_bankswitch_w );
	DECLARE_WRITE8_MEMBER( sound_g_w );
	DECLARE_WRITE8_MEMBER( psg_w );
	DECLARE_WRITE8_MEMBER( out1_w );
	DECLARE_WRITE8_MEMBER( psg_pb_w );

	CDP1869_CHAR_RAM_READ_MEMBER(draco_charram_r);
	CDP1869_CHAR_RAM_WRITE_MEMBER(draco_charram_w);
	CDP1869_PCB_READ_MEMBER(draco_pcb_r);

	void draco(machine_config &config);
	void draco_video(machine_config &config);
	void draco_io_map(address_map &map);
	void draco_map(address_map &map);
	void draco_page_ram(address_map &map);
	void draco_sound_map(address_map &map);

protected:
	virtual void machine_start() override;

	required_device<ay8910_device> m_psg;
	// sound state
	int m_sound;
	int m_psg_latch;
};

#endif // MAME_INCLUDES_CIDELSA_H