1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder 3 #ifndef MAME_INCLUDES_V1050_H 4 #define MAME_INCLUDES_V1050_H 5 6 #pragma once 7 8 #include "cpu/z80/z80.h" 9 #include "cpu/m6502/m6502.h" 10 #include "bus/centronics/ctronics.h" 11 #include "bus/scsi/s1410.h" 12 #include "imagedev/floppy.h" 13 #include "machine/clock.h" 14 #include "machine/i8214.h" 15 #include "machine/i8251.h" 16 #include "machine/i8255.h" 17 #include "machine/msm58321.h" 18 #include "machine/ram.h" 19 #include "machine/timer.h" 20 #include "bus/scsi/scsi.h" 21 #include "bus/scsi/scsihd.h" 22 #include "machine/v1050kb.h" 23 #include "machine/wd_fdc.h" 24 #include "video/mc6845.h" 25 #include "emupal.h" 26 27 #define SCREEN_TAG "screen" 28 29 #define Z80_TAG "u80" 30 #define UPB8214_TAG "u38" 31 #define I8255A_DISP_TAG "u79" 32 #define I8255A_MISC_TAG "u10" 33 #define I8255A_RTC_TAG "u36" 34 #define I8251A_KB_TAG "u85" 35 #define I8251A_SIO_TAG "u8" 36 #define MSM58321RS_TAG "u26" 37 #define MB8877_TAG "u13" 38 #define FDC9216_TAG "u25" 39 #define M6502_TAG "u76" 40 #define I8255A_M6502_TAG "u101" 41 #define H46505_TAG "u75" 42 #define CENTRONICS_TAG "centronics" 43 #define CLOCK_KB_TAG "keyboard_clock" 44 #define CLOCK_SIO_TAG "sio_clock" 45 #define TIMER_ACK_TAG "timer_ack" 46 #define TIMER_RST_TAG "timer_rst" 47 #define SASIBUS_TAG "sasi" 48 #define RS232_TAG "rs232" 49 #define V1050_KEYBOARD_TAG "v1050kb" 50 51 #define V1050_VIDEORAM_SIZE 0x8000 52 #define V1050_VIDEORAM_MASK 0x7fff 53 54 #define INT_RS_232 0 55 #define INT_WINCHESTER 1 56 #define INT_KEYBOARD 2 57 #define INT_FLOPPY 3 58 #define INT_VSYNC 4 59 #define INT_DISPLAY 5 60 #define INT_EXPANSION_B 6 61 #define INT_EXPANSION_A 7 62 63 class v1050_state : public driver_device 64 { 65 public: v1050_state(const machine_config & mconfig,device_type type,const char * tag)66 v1050_state(const machine_config &mconfig, device_type type, const char *tag) : 67 driver_device(mconfig, type, tag), 68 m_maincpu(*this, Z80_TAG), 69 m_subcpu(*this, M6502_TAG), 70 m_pic(*this, UPB8214_TAG), 71 m_ppi_disp(*this, I8255A_DISP_TAG), 72 m_ppi_6502(*this, I8255A_M6502_TAG), 73 m_rtc(*this, MSM58321RS_TAG), 74 m_uart_kb(*this, I8251A_KB_TAG), 75 m_uart_sio(*this, I8251A_SIO_TAG), 76 m_fdc(*this, MB8877_TAG), 77 m_crtc(*this, H46505_TAG), 78 m_palette(*this, "palette"), 79 m_centronics(*this, CENTRONICS_TAG), 80 m_ram(*this, RAM_TAG), 81 m_floppy0(*this, MB8877_TAG":0"), 82 m_floppy1(*this, MB8877_TAG":1"), 83 m_floppy2(*this, MB8877_TAG":2"), 84 m_floppy3(*this, MB8877_TAG":3"), 85 m_clock_sio(*this, CLOCK_SIO_TAG), 86 m_timer_ack(*this, TIMER_ACK_TAG), 87 m_timer_rst(*this, TIMER_RST_TAG), 88 m_sasibus(*this, SASIBUS_TAG), 89 m_sasi_data_out(*this, "scsi_data_out"), 90 m_sasi_data_in(*this, "scsi_data_in"), 91 m_sasi_ctrl_in(*this, "scsi_ctrl_in"), 92 m_rom(*this, Z80_TAG), 93 m_video_ram(*this, "video_ram"), 94 m_attr_ram(*this, "attr_ram"), 95 m_int_mask(0), 96 m_int_state(0), 97 m_rtc_ppi_pa(0), 98 m_rtc_ppi_pc(0) 99 { 100 } 101 102 void v1050(machine_config &config); 103 void v1050_video(machine_config &config); 104 105 private: 106 uint8_t kb_data_r(); 107 uint8_t kb_status_r(); 108 void v1050_i8214_w(uint8_t data); 109 uint8_t vint_clr_r(); 110 void vint_clr_w(uint8_t data); 111 uint8_t dint_clr_r(); 112 void dint_clr_w(uint8_t data); 113 void bank_w(uint8_t data); 114 void dint_w(uint8_t data); 115 void dvint_clr_w(uint8_t data); 116 void misc_ppi_pa_w(uint8_t data); 117 void misc_ppi_pc_w(uint8_t data); 118 uint8_t rtc_ppi_pa_r(); 119 void rtc_ppi_pa_w(uint8_t data); 120 void rtc_ppi_pb_w(uint8_t data); 121 uint8_t rtc_ppi_pc_r(); 122 void rtc_ppi_pc_w(uint8_t data); 123 DECLARE_WRITE_LINE_MEMBER( kb_rxrdy_w ); 124 DECLARE_WRITE_LINE_MEMBER( sio_rxrdy_w ); 125 DECLARE_WRITE_LINE_MEMBER( sio_txrdy_w ); 126 DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w ); 127 DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); 128 uint8_t attr_r(); 129 void attr_w(uint8_t data); 130 uint8_t videoram_r(offs_t offset); 131 void videoram_w(offs_t offset, uint8_t data); 132 DECLARE_WRITE_LINE_MEMBER( crtc_vs_w ); 133 void sasi_data_w(uint8_t data); 134 DECLARE_WRITE_LINE_MEMBER(write_sasi_io); 135 void sasi_ctrl_w(uint8_t data); 136 WRITE_LINE_MEMBER(rtc_ppi_pa_0_w)137 WRITE_LINE_MEMBER( rtc_ppi_pa_0_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 0)) | ((state & 1) << 0); } WRITE_LINE_MEMBER(rtc_ppi_pa_1_w)138 WRITE_LINE_MEMBER( rtc_ppi_pa_1_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 1)) | ((state & 1) << 1); } WRITE_LINE_MEMBER(rtc_ppi_pa_2_w)139 WRITE_LINE_MEMBER( rtc_ppi_pa_2_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 2)) | ((state & 1) << 2); } WRITE_LINE_MEMBER(rtc_ppi_pa_3_w)140 WRITE_LINE_MEMBER( rtc_ppi_pa_3_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 3)) | ((state & 1) << 3); } WRITE_LINE_MEMBER(rtc_ppi_pc_3_w)141 WRITE_LINE_MEMBER( rtc_ppi_pc_3_w ){ m_rtc_ppi_pc = (m_rtc_ppi_pc & ~(1 << 3)) | ((state & 1) << 3); } 142 143 TIMER_DEVICE_CALLBACK_MEMBER(v1050_keyboard_tick); 144 TIMER_DEVICE_CALLBACK_MEMBER(sasi_ack_tick); 145 TIMER_DEVICE_CALLBACK_MEMBER(sasi_rst_tick); 146 DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); 147 DECLARE_WRITE_LINE_MEMBER(write_sio_clock); 148 DECLARE_WRITE_LINE_MEMBER(pic_int_w); 149 void disp_ppi_pc_w(uint8_t data); 150 void m6502_ppi_pc_w(uint8_t data); 151 uint8_t misc_ppi_pc_r(); 152 IRQ_CALLBACK_MEMBER(v1050_int_ack); 153 154 DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); 155 DECLARE_WRITE_LINE_MEMBER(write_centronics_perror); 156 157 MC6845_UPDATE_ROW(crtc_update_row); 158 159 void v1050_crt_mem(address_map &map); 160 void v1050_io(address_map &map); 161 void v1050_mem(address_map &map); 162 163 virtual void machine_start() override; 164 virtual void machine_reset() override; 165 166 virtual void video_start() override; 167 168 void bankswitch(); 169 void update_fdc(); 170 void set_interrupt(int line, int state); 171 void scan_keyboard(); 172 void set_baud_sel(int sel); 173 174 required_device<cpu_device> m_maincpu; 175 required_device<cpu_device> m_subcpu; 176 required_device<i8214_device> m_pic; 177 required_device<i8255_device> m_ppi_disp; 178 required_device<i8255_device> m_ppi_6502; 179 required_device<msm58321_device> m_rtc; 180 required_device<i8251_device> m_uart_kb; 181 required_device<i8251_device> m_uart_sio; 182 required_device<mb8877_device> m_fdc; 183 required_device<mc6845_device> m_crtc; 184 required_device<palette_device> m_palette; 185 required_device<centronics_device> m_centronics; 186 required_device<ram_device> m_ram; 187 required_device<floppy_connector> m_floppy0; 188 required_device<floppy_connector> m_floppy1; 189 required_device<floppy_connector> m_floppy2; 190 required_device<floppy_connector> m_floppy3; 191 required_device<clock_device> m_clock_sio; 192 required_device<timer_device> m_timer_ack; 193 required_device<timer_device> m_timer_rst; 194 required_device<scsi_port_device> m_sasibus; 195 required_device<output_latch_device> m_sasi_data_out; 196 required_device<input_buffer_device> m_sasi_data_in; 197 required_device<input_buffer_device> m_sasi_ctrl_in; 198 required_memory_region m_rom; 199 required_shared_ptr<uint8_t> m_video_ram; 200 optional_shared_ptr<uint8_t> m_attr_ram; 201 202 // interrupt state 203 uint8_t m_int_mask; // interrupt mask 204 uint8_t m_int_state; 205 int m_f_int_enb; // floppy interrupt enable 206 bool m_fdc_irq; 207 bool m_fdc_drq; 208 209 // keyboard state 210 uint8_t m_keylatch; // keyboard row select 211 uint8_t m_keydata; 212 int m_keyavail; 213 214 // serial state 215 int m_rxrdy; // receiver ready 216 int m_txrdy; // transmitter ready 217 int m_baud_sel; // baud select 218 219 // memory state 220 uint8_t m_bank; // bank register 221 222 // video state 223 uint8_t m_attr; // attribute latch 224 225 // sasi state 226 uint8_t m_sasi_data; 227 int m_sasi_data_enable; 228 229 uint8_t m_rtc_ppi_pa; 230 uint8_t m_rtc_ppi_pc; 231 232 int m_centronics_busy; 233 int m_centronics_perror; 234 }; 235 236 #endif // MAME_INCLUDES_V1050_H 237