1 // license:BSD-3-Clause
2 // copyright-holders:Nathan Woods
3 #ifndef MAME_INCLUDES_ATOM_H
4 #define MAME_INCLUDES_ATOM_H
5 
6 #pragma once
7 
8 
9 #include "cpu/m6502/m6502.h"
10 #include "imagedev/cassette.h"
11 #include "imagedev/floppy.h"
12 #include "imagedev/snapquik.h"
13 #include "machine/6522via.h"
14 #include "machine/i8255.h"
15 #include "machine/i8271.h"
16 #include "machine/ram.h"
17 #include "machine/timer.h"
18 #include "sound/spkrdev.h"
19 #include "video/mc6847.h"
20 
21 #include "bus/centronics/ctronics.h"
22 #include "bus/generic/carts.h"
23 #include "bus/generic/slot.h"
24 
25 #include "formats/atom_dsk.h"
26 #include "formats/atom_tap.h"
27 #include "formats/uef_cas.h"
28 
29 
30 #define SY6502_TAG      "ic22"
31 #define INS8255_TAG     "ic25"
32 #define MC6847_TAG      "ic31"
33 #define R6522_TAG       "ic1"
34 #define I8271_TAG       "ic13"
35 #define MC6854_TAG      "econet_ic1"
36 #define CENTRONICS_TAG  "centronics"
37 #define BASERAM_TAG     "baseram"
38 
39 
40 #define X1  XTAL(3'579'545)    // MC6847 Clock
41 #define X2  XTAL(4'000'000)           // CPU Clock - a divider reduces it to 1MHz
42 
43 class atom_state : public driver_device
44 {
45 public:
atom_state(const machine_config & mconfig,device_type type,const char * tag)46 	atom_state(const machine_config &mconfig, device_type type, const char *tag)
47 		: driver_device(mconfig, type, tag)
48 		, m_maincpu(*this, SY6502_TAG)
49 		, m_vdg(*this, MC6847_TAG)
50 		, m_cassette(*this, "cassette")
51 		, m_fdc(*this, I8271_TAG)
52 		, m_centronics(*this, CENTRONICS_TAG)
53 		, m_speaker(*this, "speaker")
54 		, m_cart(*this, "cartslot")
55 		, m_vram(*this, "videoram")
56 		, m_io_keyboard(*this, "Y%u", 0U)
57 		, m_ppi(*this, INS8255_TAG)
58 		, m_via(*this, R6522_TAG)
59 	{ }
60 
61 	void atombb(machine_config &config);
62 	void atom(machine_config &config);
63 	void atom_common(machine_config &config);
64 	DECLARE_INPUT_CHANGED_MEMBER( trigger_reset );
65 
66 protected:
67 	required_device<cpu_device> m_maincpu;
68 	required_device<mc6847_base_device> m_vdg;
69 	required_device<cassette_image_device> m_cassette;
70 	optional_device<i8271_device> m_fdc;
71 	required_device<centronics_device> m_centronics;
72 	required_device<speaker_sound_device> m_speaker;
73 	optional_device<generic_slot_device> m_cart;
74 	required_shared_ptr<uint8_t> m_vram;
75 	required_ioport_array<12> m_io_keyboard;
76 	required_device<i8255_device> m_ppi;
77 	required_device<via6522_device> m_via;
78 
79 	virtual void machine_start() override;
80 	virtual void machine_reset() override;
81 
82 	void ppi_pa_w(uint8_t data);
83 	uint8_t ppi_pb_r();
84 	uint8_t ppi_pc_r();
85 	void ppi_pc_w(uint8_t data);
86 	uint8_t vdg_videoram_r(offs_t offset);
87 	DECLARE_WRITE_LINE_MEMBER( atom_8271_interrupt_callback );
88 	DECLARE_WRITE_LINE_MEMBER( motor_w );
89 
90 	/* keyboard state */
91 	u8 m_keylatch;
92 
93 	/* cassette state */
94 	bool m_hz2400;
95 	bool m_pc0;
96 	bool m_pc1;
97 
98 	/* devices */
99 	bool m_previous_i8271_int_state;
100 	DECLARE_FLOPPY_FORMATS(floppy_formats);
101 	DECLARE_WRITE_LINE_MEMBER(cassette_output_tick);
102 
103 	image_init_result load_cart(device_image_interface &image, generic_slot_device &slot);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load)104 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load) { return load_cart(image, *m_cart); }
105 	DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
106 	void atom_mem(address_map &map);
107 	void atombb_mem(address_map &map);
108 	void prophet_mem(address_map &map);
109 };
110 
111 class atomeb_state : public atom_state
112 {
113 public:
atomeb_state(const machine_config & mconfig,device_type type,const char * tag)114 	atomeb_state(const machine_config &mconfig, device_type type, const char *tag)
115 		: atom_state(mconfig, type, tag)
116 		, m_ext(*this, "rom_a%x", 0)
117 		, m_e0(*this, "rom_e0")
118 		, m_e1(*this, "rom_e1")
119 	{
120 	}
121 
122 	void atomeb(machine_config &config);
123 
124 private:
125 	void machine_start() override;
126 	void machine_reset() override;
127 
128 	uint8_t eprom_r();
129 	void eprom_w(uint8_t data);
130 	uint8_t ext_r(offs_t offset);
131 	uint8_t dos_r(offs_t offset);
132 
133 	/* eprom state */
134 	u8 m_eprom;
135 
136 	required_device_array<generic_slot_device, 16> m_ext;
137 	required_device<generic_slot_device> m_e0;
138 	required_device<generic_slot_device> m_e1;
139 
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ext_load)140 	template<int I> DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ext_load) { return load_cart(image, *m_ext[I]); }
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(e0_load)141 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(e0_load) { return load_cart(image, *m_e0); }
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(e1_load)142 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(e1_load) { return load_cart(image, *m_e1); }
143 	void atomeb_mem(address_map &map);
144 };
145 
146 #endif // MAME_INCLUDES_ATOM_H
147