1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder, Ales Dlabac 3 #ifndef MAME_INCLUDES_M5_H 4 #define MAME_INCLUDES_M5_H 5 6 #include "imagedev/cassette.h" 7 #include "imagedev/floppy.h" 8 #include "imagedev/snapquik.h" 9 10 #include "cpu/z80/z80.h" 11 #include "machine/i8255.h" 12 #include "machine/ram.h" 13 #include "machine/upd765.h" 14 #include "machine/wd_fdc.h" //brno mod 15 #include "machine/z80ctc.h" 16 17 #include "bus/centronics/ctronics.h" 18 #include "bus/m5/slot.h" 19 20 21 #define Z80_TAG "ic17" 22 #define Z80CTC_TAG "ic19" 23 #define SN76489AN_TAG "ic15" 24 #define TMS9918A_TAG "ic10" 25 #define TMS9929A_TAG "ic10" 26 #define I8255A_TAG "i8255a" 27 #define Z80_FD5_TAG "z80fd5" 28 #define UPD765_TAG "upd765" 29 #define CENTRONICS_TAG "centronics" 30 #define SCREEN_TAG "screen" 31 //brno mod 32 #define WD2797_TAG "5f" 33 #define RAMDISK "ramdisk" 34 35 36 class m5_state : public driver_device 37 { 38 public: m5_state(const machine_config & mconfig,device_type type,const char * tag)39 m5_state(const machine_config &mconfig, device_type type, const char *tag) 40 : driver_device(mconfig, type, tag) 41 , m_maincpu(*this, Z80_TAG) 42 , m_ctc(*this, Z80CTC_TAG) 43 , m_fd5cpu(*this, Z80_FD5_TAG) 44 , m_ppi(*this, I8255A_TAG) 45 , m_fdc(*this, UPD765_TAG) 46 , m_floppy0(*this, UPD765_TAG ":0:525dd") 47 , m_cassette(*this, "cassette") 48 , m_cart1(*this, "cartslot1") 49 , m_cart2(*this, "cartslot2") 50 , m_centronics(*this, CENTRONICS_TAG) 51 , m_ram(*this, RAM_TAG) 52 , m_reset(*this, "RESET") 53 , m_DIPS(*this, "DIPS") 54 { } 55 56 void m5(machine_config &config); 57 void pal(machine_config &config); 58 void ntsc(machine_config &config); 59 60 void init_pal(); 61 void init_ntsc(); 62 63 DECLARE_WRITE_LINE_MEMBER(sordm5_video_interrupt_callback); 64 65 protected: 66 required_device<z80_device> m_maincpu; 67 required_device<z80ctc_device> m_ctc; 68 //I've changed following devices to optional since we have to remove them in BRNO mod (I don't know better solution) 69 optional_device<cpu_device> m_fd5cpu; 70 optional_device<i8255_device> m_ppi; 71 optional_device<upd765a_device> m_fdc; 72 optional_device<floppy_image_device> m_floppy0; 73 required_device<cassette_image_device> m_cassette; 74 optional_device<m5_cart_slot_device> m_cart1; 75 optional_device<m5_cart_slot_device> m_cart2; 76 required_device<centronics_device> m_centronics; 77 required_device<ram_device> m_ram; 78 required_ioport m_reset; 79 optional_ioport m_DIPS; 80 m5_cart_slot_device *m_cart_ram, *m_cart; 81 82 uint8_t sts_r(); 83 void com_w(uint8_t data); 84 85 virtual void machine_start() override; 86 virtual void machine_reset() override; 87 private: 88 uint8_t ppi_pa_r(); 89 void ppi_pa_w(uint8_t data); 90 void ppi_pb_w(uint8_t data); 91 uint8_t ppi_pc_r(); 92 void ppi_pc_w(uint8_t data); 93 94 uint8_t fd5_data_r(); 95 void fd5_data_w(uint8_t data); 96 uint8_t fd5_com_r(); 97 void fd5_com_w(uint8_t data); 98 void fd5_ctrl_w(uint8_t data); 99 void fd5_tc_w(uint8_t data); 100 101 DECLARE_FLOPPY_FORMATS( floppy_formats ); 102 103 DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); 104 105 // memory 106 uint8_t mem64KBI_r(); 107 void mem64KBI_w(offs_t offset, uint8_t data); 108 void mem64KBF_w(uint8_t data); 109 void mem64KRX_w(offs_t offset, uint8_t data); 110 111 void fd5_io(address_map &map); 112 void fd5_mem(address_map &map); 113 void m5_io(address_map &map); 114 void m5_mem(address_map &map); 115 116 // video state 117 // const TMS9928a_interface *m_vdp_intf; 118 119 int m_centronics_busy; 120 121 uint8_t m_ram_mode; 122 uint8_t m_ram_type; 123 memory_region *m_cart_rom; 124 125 // floppy state for fd5 126 uint8_t m_fd5_data; 127 uint8_t m_fd5_com; 128 int m_intra; 129 int m_ibfa; 130 int m_obfa; 131 }; 132 133 134 class brno_state : public m5_state 135 { 136 public: brno_state(const machine_config & mconfig,device_type type,const char * tag)137 brno_state(const machine_config &mconfig, device_type type, const char *tag) 138 : m5_state(mconfig, type, tag) 139 , m_fdc(*this, WD2797_TAG) 140 , m_floppy0(*this, WD2797_TAG":0") 141 , m_floppy1(*this, WD2797_TAG":1") 142 //, m_ramdisk(*this, RAMDISK) 143 { } 144 145 void brno(machine_config &config); 146 147 void init_brno(); 148 149 private: 150 uint8_t mmu_r(); 151 void mmu_w(uint8_t data); 152 uint8_t ramsel_r(); 153 void ramsel_w(uint8_t data); 154 uint8_t romsel_r(); 155 void romsel_w(uint8_t data); 156 157 uint8_t fd_r(); 158 void fd_w(uint8_t data); 159 DECLARE_FLOPPY_FORMATS(floppy_formats); 160 161 162 // DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w ); 163 // DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w ); 164 // DECLARE_WRITE_LINE_MEMBER( wd2797_index_callback); 165 166 //required_device<ram_device> m_ramdisk; 167 DECLARE_SNAPSHOT_LOAD_MEMBER(brno); 168 // DECLARE_DEVICE_IMAGE_LOAD_MEMBER(m5_cart); 169 170 void brno_io(address_map &map); 171 void m5_mem_brno(address_map &map); 172 173 virtual void machine_start() override; 174 virtual void machine_reset() override; 175 176 required_device<wd2797_device> m_fdc; 177 required_device<floppy_connector> m_floppy0; 178 optional_device<floppy_connector> m_floppy1; 179 floppy_image_device *m_floppy; 180 181 uint8_t m_rambank; // bank # 182 uint8_t m_ramcpu; //where Ramdisk bank is mapped 183 bool m_romen; 184 bool m_ramen; 185 186 uint8_t m_rammap[16]; // memory map 187 }; 188 189 #endif // MAME_INCLUDES_M5_H 190