1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder 3 #ifndef MAME_INCLUDES_PC1512_H 4 #define MAME_INCLUDES_PC1512_H 5 6 #pragma once 7 8 #include "bus/centronics/ctronics.h" 9 #include "bus/isa/isa.h" 10 #include "bus/isa/isa_cards.h" 11 #include "bus/isa/pc1640_iga.h" 12 #include "bus/pc1512/mouse.h" 13 #include "cpu/i86/i86.h" 14 #include "cpu/mcs48/mcs48.h" 15 #include "imagedev/floppy.h" 16 #include "machine/am9517a.h" 17 #include "machine/buffer.h" 18 #include "machine/ins8250.h" 19 #include "machine/mc146818.h" 20 #include "machine/pic8259.h" 21 #include "machine/pit8253.h" 22 #include "machine/pc1512kb.h" 23 #include "machine/upd765.h" 24 #include "machine/ram.h" 25 #include "sound/spkrdev.h" 26 #include "video/ams40041.h" 27 28 #include "formats/pc_dsk.h" 29 30 #define I8086_TAG "ic120" 31 #define I8087_TAG "ic119" 32 #define I8048_TAG "i8048" 33 #define I8237A5_TAG "ic130" 34 #define I8259A2_TAG "ic109" 35 #define I8253_TAG "ic114" 36 #define MC146818_TAG "ic134" 37 #define UPD765A_TAG "ic112" 38 #define INS8250_TAG "ic106" 39 #define AMS40041_TAG "ic126" 40 #define CENTRONICS_TAG "centronics" 41 #define ISA_BUS_TAG "isa" 42 #define RS232_TAG "rs232" 43 #define SCREEN_TAG "screen" 44 45 class pc1512_base_state : public driver_device 46 { 47 public: pc1512_base_state(const machine_config & mconfig,device_type type,const char * tag)48 pc1512_base_state(const machine_config &mconfig, device_type type, const char *tag) : 49 driver_device(mconfig, type, tag), 50 m_maincpu(*this, I8086_TAG), 51 m_dmac(*this, I8237A5_TAG), 52 m_pic(*this, I8259A2_TAG), 53 m_pit(*this, I8253_TAG), 54 m_rtc(*this, MC146818_TAG), 55 m_fdc(*this, UPD765A_TAG), 56 m_uart(*this, INS8250_TAG), 57 m_centronics(*this, CENTRONICS_TAG), 58 m_cent_data_out(*this, "cent_data_out"), 59 m_speaker(*this, "speaker"), 60 m_kb(*this, PC1512_KEYBOARD_TAG), 61 m_ram(*this, RAM_TAG), 62 m_floppy(*this, UPD765A_TAG ":%u", 0U), 63 m_bus(*this, ISA_BUS_TAG), 64 m_lk(*this, "LK"), 65 m_pit1(0), 66 m_pit2(0), 67 m_status1(0), 68 m_status2(0), 69 m_port61(0), 70 m_nmi_enable(0), 71 m_kb_bits(0), 72 m_kbclk(1), 73 m_kbdata(1), 74 m_dreq0(0), 75 m_nden(1), 76 m_dint(0), 77 m_ddrq(0), 78 m_fdc_dsr(0), 79 m_neop(0), 80 m_ack_int_enable(1), 81 m_centronics_ack(0), 82 m_speaker_drive(0) 83 { } 84 85 required_device<cpu_device> m_maincpu; 86 required_device<am9517a_device> m_dmac; 87 required_device<pic8259_device> m_pic; 88 required_device<pit8253_device> m_pit; 89 required_device<mc146818_device> m_rtc; 90 required_device<upd765a_device> m_fdc; 91 required_device<ins8250_device> m_uart; 92 required_device<centronics_device> m_centronics; 93 required_device<output_latch_device> m_cent_data_out; 94 required_device<speaker_sound_device> m_speaker; 95 required_device<pc1512_keyboard_device> m_kb; 96 required_device<ram_device> m_ram; 97 required_device_array<floppy_connector, 2> m_floppy; 98 required_device<isa8_device> m_bus; 99 required_ioport m_lk; 100 101 virtual void machine_start() override; 102 virtual void machine_reset() override; 103 104 void update_speaker(); 105 void update_fdc_int(); 106 void update_fdc_drq(); 107 void update_fdc_tc(); 108 void update_ack(); 109 110 uint8_t system_r(offs_t offset); 111 void system_w(offs_t offset, uint8_t data); 112 uint8_t mouse_r(offs_t offset); 113 void mouse_w(offs_t offset, uint8_t data); 114 void dma_page_w(offs_t offset, uint8_t data); 115 void nmi_mask_w(uint8_t data); 116 uint8_t printer_r(offs_t offset); 117 void printer_w(offs_t offset, uint8_t data); 118 DECLARE_WRITE_LINE_MEMBER( kbdata_w ); 119 DECLARE_WRITE_LINE_MEMBER( kbclk_w ); 120 DECLARE_WRITE_LINE_MEMBER( pit1_w ); 121 DECLARE_WRITE_LINE_MEMBER( pit2_w ); 122 DECLARE_WRITE_LINE_MEMBER( hrq_w ); 123 DECLARE_WRITE_LINE_MEMBER( eop_w ); 124 uint8_t memr_r(offs_t offset); 125 void memw_w(offs_t offset, uint8_t data); 126 uint8_t ior1_r(); 127 uint8_t ior2_r(); 128 uint8_t ior3_r(); 129 void iow0_w(uint8_t data); 130 void iow1_w(uint8_t data); 131 void iow2_w(uint8_t data); 132 void iow3_w(uint8_t data); 133 DECLARE_WRITE_LINE_MEMBER( dack0_w ); 134 DECLARE_WRITE_LINE_MEMBER( dack1_w ); 135 DECLARE_WRITE_LINE_MEMBER( dack2_w ); 136 DECLARE_WRITE_LINE_MEMBER( dack3_w ); 137 DECLARE_FLOPPY_FORMATS( floppy_formats ); 138 DECLARE_WRITE_LINE_MEMBER( fdc_int_w ); 139 DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); 140 void drive_select_w(uint8_t data); 141 DECLARE_WRITE_LINE_MEMBER( write_centronics_ack ); 142 DECLARE_WRITE_LINE_MEMBER( write_centronics_busy ); 143 DECLARE_WRITE_LINE_MEMBER( write_centronics_perror ); 144 DECLARE_WRITE_LINE_MEMBER( write_centronics_select ); 145 DECLARE_WRITE_LINE_MEMBER( write_centronics_fault ); 146 void mouse_x_w(uint8_t data); 147 void mouse_y_w(uint8_t data); 148 149 // system status register 150 int m_pit1; 151 int m_pit2; 152 uint8_t m_status1; 153 uint8_t m_status2; 154 uint8_t m_port61; 155 156 // interrupt state 157 int m_nmi_enable; 158 159 // keyboard state 160 uint8_t m_kbd; 161 int m_kb_bits; 162 int m_kbclk; 163 int m_kbdata; 164 165 // mouse state 166 uint8_t m_mouse_x_old; 167 uint8_t m_mouse_y_old; 168 uint8_t m_mouse_x; 169 uint8_t m_mouse_y; 170 171 // DMA state 172 uint8_t m_dma_page[4]; 173 int m_dma_channel; 174 int m_dreq0; 175 176 // floppy state 177 int m_nden; 178 int m_dint; 179 int m_ddrq; 180 uint8_t m_fdc_dsr; 181 int m_neop; 182 183 // printer state 184 int m_ack_int_enable; 185 int m_centronics_ack; 186 int m_centronics_busy; 187 int m_centronics_perror; 188 int m_centronics_select; 189 int m_centronics_fault; 190 uint8_t m_printer_data; 191 uint8_t m_printer_control; 192 193 // sound state 194 int m_speaker_drive; 195 }; 196 197 class pc1512_state : public pc1512_base_state 198 { 199 public: pc1512_state(const machine_config & mconfig,device_type type,const char * tag)200 pc1512_state(const machine_config &mconfig, device_type type, const char *tag) 201 : pc1512_base_state(mconfig, type, tag) 202 , m_vdu(*this, AMS40041_TAG) 203 { } 204 205 virtual void machine_start() override; 206 virtual void machine_reset() override; 207 208 void pc1512hd(machine_config &config); 209 void pc1512(machine_config &config); 210 void pc1512dd(machine_config &config); 211 void pc1512_io(address_map &map); 212 void pc1512_mem(address_map &map); 213 214 required_device<ams40041_device> m_vdu; 215 }; 216 217 class pc1640_state : public pc1512_base_state 218 { 219 public: pc1640_state(const machine_config & mconfig,device_type type,const char * tag)220 pc1640_state(const machine_config &mconfig, device_type type, const char *tag) 221 : pc1512_base_state(mconfig, type, tag) 222 , m_sw(*this, "SW") 223 , m_opt(0) 224 { } 225 226 virtual void machine_start() override; 227 228 uint8_t io_r(offs_t offset); 229 uint8_t printer_r(offs_t offset); 230 231 required_ioport m_sw; 232 233 int m_opt; 234 void pc1640hd(machine_config &config); 235 void pc1640(machine_config &config); 236 void pc1640dd(machine_config &config); 237 void pc1640_io(address_map &map); 238 void pc1640_mem(address_map &map); 239 }; 240 241 #endif // MAME_INCLUDES_PC1512_H 242