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