1 // license:GPL-2.0+ 2 // copyright-holders:Kevin Thacker, Robbbert 3 /***************************************************************************** 4 * 5 * includes/sorcerer.h 6 * 7 ****************************************************************************/ 8 #ifndef MAME_INCLUDES_SORCERER_H 9 #define MAME_INCLUDES_SORCERER_H 10 11 #pragma once 12 13 #include "cpu/z80/z80.h" 14 #include "machine/ay31015.h" 15 #include "machine/clock.h" 16 #include "bus/centronics/ctronics.h" 17 #include "bus/rs232/rs232.h" 18 #include "machine/ram.h" 19 #include "imagedev/cassette.h" 20 #include "imagedev/snapquik.h" 21 #include "imagedev/floppy.h" 22 #include "formats/sorc_dsk.h" 23 #include "formats/sorc_cas.h" 24 #include "machine/micropolis.h" 25 #include "machine/wd_fdc.h" 26 #include "machine/z80dma.h" 27 #include "bus/generic/slot.h" 28 #include "bus/generic/carts.h" 29 30 #define ES_CPU_CLOCK (12638000 / 6) 31 #define ES_UART_CLOCK (ES_CPU_CLOCK / 440) 32 33 struct cass_data_t { 34 struct { 35 int length; // time cassette level is at input.level 36 int level; // cassette level 37 int bit; // bit being read 38 } input; 39 struct { 40 int length; // time cassette level is at output.level 41 int level; // cassette level 42 int bit; // bit to output 43 } output; 44 }; 45 46 47 class sorcerer_state : public driver_device 48 { 49 public: sorcerer_state(const machine_config & mconfig,device_type type,const char * tag)50 sorcerer_state(const machine_config &mconfig, device_type type, const char *tag) 51 : driver_device(mconfig, type, tag) 52 , m_maincpu(*this, "maincpu") 53 , m_rom(*this, "maincpu") 54 , m_pcg(*this, "pcg") 55 , m_cassette1(*this, "cassette1") 56 , m_cassette2(*this, "cassette2") 57 , m_uart(*this, "uart") 58 , m_uart_clock(*this, "uart_clock") 59 , m_rs232(*this, "rs232") 60 , m_centronics(*this, "centronics") 61 , m_cart(*this, "cartslot") 62 , m_ram(*this, RAM_TAG) 63 , m_dma(*this, "dma") 64 , m_fdc3(*this, "fdc3") 65 , m_fdc4(*this, "fdc4") 66 , m_floppy20(*this, "fdc2:0") 67 , m_floppy21(*this, "fdc2:1") 68 , m_floppy30(*this, "fdc3:0") 69 , m_floppy31(*this, "fdc3:1") 70 , m_floppy32(*this, "fdc3:2") 71 , m_floppy33(*this, "fdc3:3") 72 , m_floppy40(*this, "fdc4:0") 73 , m_floppy41(*this, "fdc4:1") 74 , m_floppy42(*this, "fdc4:2") 75 , m_floppy43(*this, "fdc4:3") 76 , m_iop_config(*this, "CONFIG") 77 , m_iop_vs(*this, "VS") 78 , m_iop_x(*this, "X.%u", 0) 79 { } 80 81 void sorcerer(machine_config &config); 82 void sorcerera(machine_config &config); 83 void sorcererb(machine_config &config); 84 85 protected: 86 enum 87 { 88 TIMER_SERIAL, 89 TIMER_CASSETTE, 90 }; 91 92 u8 portfd_r(); 93 u8 portfe_r(); 94 void portfd_w(u8 data); 95 void portfe_w(u8 data); 96 void portff_w(u8 data); 97 TIMER_CALLBACK_MEMBER(cassette_tc); 98 TIMER_CALLBACK_MEMBER(serial_tc); 99 DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb); 100 DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); 101 void machine_start_common(offs_t endmem); 102 void machine_reset_common(); 103 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 104 105 void sorcerer_mem(address_map &map); 106 void sorcererb_mem(address_map &map); 107 void sorcerer_io(address_map &map); 108 void sorcerera_io(address_map &map); 109 void sorcererb_io(address_map &map); 110 111 u8 m_portfe; 112 u8 m_keyboard_line; 113 emu_timer *m_serial_timer; 114 emu_timer *m_cassette_timer; 115 cass_data_t m_cass_data; 116 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 117 required_device<z80_device> m_maincpu; 118 required_region_ptr<u8> m_rom; 119 required_shared_ptr<u8> m_pcg; 120 required_device<cassette_image_device> m_cassette1; 121 required_device<cassette_image_device> m_cassette2; 122 required_device<ay31015_device> m_uart; 123 required_device<clock_device> m_uart_clock; 124 required_device<rs232_port_device> m_rs232; 125 required_device<centronics_device> m_centronics; 126 optional_device<generic_slot_device> m_cart; 127 required_device<ram_device> m_ram; 128 optional_device<z80dma_device> m_dma; 129 optional_device<fd1793_device> m_fdc3; 130 optional_device<wd2793_device> m_fdc4; 131 optional_device<floppy_connector> m_floppy20; 132 optional_device<floppy_connector> m_floppy21; 133 optional_device<floppy_connector> m_floppy30; 134 optional_device<floppy_connector> m_floppy31; 135 optional_device<floppy_connector> m_floppy32; 136 optional_device<floppy_connector> m_floppy33; 137 optional_device<floppy_connector> m_floppy40; 138 optional_device<floppy_connector> m_floppy41; 139 optional_device<floppy_connector> m_floppy42; 140 optional_device<floppy_connector> m_floppy43; 141 required_ioport m_iop_config; 142 required_ioport m_iop_vs; 143 required_ioport_array<16> m_iop_x; 144 memory_passthrough_handler *m_rom_shadow_tap; 145 146 private: 147 u8 m_port48; 148 u8 m_port34; 149 u8 port34_r(); 150 u8 port48_r(); 151 void port34_w(u8 data); 152 void port48_w(u8 data); 153 void intrq4_w(bool state); 154 bool m_halt; 155 virtual void machine_start() override; 156 virtual void machine_reset() override; 157 void busreq_w(bool state); 158 u8 memory_read_byte(offs_t offset); 159 void memory_write_byte(offs_t offset, u8 data); 160 u8 io_read_byte(offs_t offset); 161 void io_write_byte(offs_t offset, u8 data); 162 }; 163 164 class sorcererd_state : public sorcerer_state 165 { 166 public: sorcererd_state(const machine_config & mconfig,device_type type,const char * tag)167 sorcererd_state(const machine_config &mconfig, device_type type, const char *tag) 168 : sorcerer_state(mconfig, type, tag) 169 , m_fdc(*this, "fdc") 170 , m_fdc2(*this, "fdc2") 171 { } 172 173 void sorcererd(machine_config &config); 174 175 private: 176 void sorcererd_mem(address_map &map); 177 void sorcererd_io(address_map &map); 178 void port2c_w(u8 data); 179 void intrq2_w(bool state); 180 void drq2_w(bool state); 181 u8 m_port2c; 182 bool m_wait; 183 bool m_drq_off; 184 bool m_intrq_off; 185 virtual void machine_start() override; 186 virtual void machine_reset() override; 187 optional_device<micropolis_device> m_fdc; 188 optional_device<fd1793_device> m_fdc2; 189 }; 190 191 192 #endif // MAME_INCLUDES_SORCERER_H 193