1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder 3 #ifndef MAME_INCLUDES_TANDY2K_H 4 #define MAME_INCLUDES_TANDY2K_H 5 6 #include "bus/centronics/ctronics.h" 7 #include "bus/rs232/rs232.h" 8 #include "cpu/i86/i186.h" 9 #include "cpu/mcs48/mcs48.h" 10 #include "formats/tandy2k_dsk.h" 11 #include "imagedev/floppy.h" 12 #include "imagedev/harddriv.h" 13 #include "machine/i8255.h" 14 #include "machine/i8251.h" 15 #include "machine/pckeybrd.h" 16 #include "machine/pit8253.h" 17 #include "machine/pic8259.h" 18 #include "machine/ram.h" 19 #include "machine/tandy2kb.h" 20 #include "machine/timer.h" 21 #include "machine/upd765.h" 22 #include "machine/bankdev.h" 23 #include "sound/spkrdev.h" 24 #include "video/crt9007.h" 25 #include "video/crt9021.h" 26 #include "video/crt9212.h" 27 #include "emupal.h" 28 29 #define SCREEN_TAG "screen" 30 #define I80186_TAG "u76" 31 #define I8255A_TAG "u75" 32 #define I8251A_TAG "u41" 33 #define I8253_TAG "u40" 34 #define I8259A_0_TAG "u42" 35 #define I8259A_1_TAG "u43" 36 #define I8272A_TAG "u121" 37 #define CRT9007_TAG "u16" 38 #define CRT9212_0_TAG "u55" 39 #define CRT9212_1_TAG "u15" 40 #define CRT9021B_TAG "u14" 41 #define WD1010_TAG "u18" 42 #define WD1100_11_TAG "u12" 43 #define CENTRONICS_TAG "centronics" 44 #define RS232_TAG "rs232" 45 46 class tandy2k_state : public driver_device 47 { 48 public: tandy2k_state(const machine_config & mconfig,device_type type,const char * tag)49 tandy2k_state(const machine_config &mconfig, device_type type, const char *tag) : 50 driver_device(mconfig, type, tag), 51 m_maincpu(*this, I80186_TAG), 52 m_uart(*this, I8251A_TAG), 53 m_i8255a(*this, I8255A_TAG), 54 m_pit(*this, I8253_TAG), 55 m_fdc(*this, I8272A_TAG), 56 m_pic0(*this, I8259A_0_TAG), 57 m_pic1(*this, I8259A_1_TAG), 58 m_vpac(*this, CRT9007_TAG), 59 m_drb0(*this, CRT9212_0_TAG), 60 m_drb1(*this, CRT9212_1_TAG), 61 m_vac(*this, CRT9021B_TAG), 62 m_colpal(*this, "colpal"), 63 m_vrambank(*this, "vrambank"), 64 m_timer_vidldsh(*this, "vidldsh"), 65 m_centronics(*this, CENTRONICS_TAG), 66 m_speaker(*this, "speaker"), 67 m_ram(*this, RAM_TAG), 68 m_floppy0(*this, I8272A_TAG ":0:525qd"), 69 m_floppy1(*this, I8272A_TAG ":1:525qd"), 70 m_rs232(*this, RS232_TAG), 71 m_kb(*this, TANDY2K_KEYBOARD_TAG), 72 m_hires_ram(*this, "hires_ram"), 73 m_char_ram(*this, "char_ram"), 74 m_pc_keyboard(*this, "pc_keyboard"), 75 m_dma_mux(0), 76 m_kbdclk(0), 77 m_kbddat(0), 78 m_kbdin(0), 79 m_extclk(0), 80 m_rxrdy(0), 81 m_txrdy(0), 82 m_pb_sel(0), 83 m_vram_base(0), 84 m_vidouts(0), 85 m_clkspd(-1), 86 m_clkcnt(-1), 87 m_blc(0), 88 m_bkc(0), 89 m_cblank(0), 90 m_dblc(0), 91 m_dbkc(0), 92 m_dblank(0), 93 m_slg(0), 94 m_sld(0), 95 m_cgra(0), 96 m_vidla(0), 97 m_outspkr(0), 98 m_spkrdata(0), 99 m_centronics_ack(0), 100 m_centronics_fault(0), 101 m_centronics_select(0), 102 m_centronics_perror(0), 103 m_centronics_busy(0), 104 m_buttons(*this, "MOUSEBTN"), 105 m_x_axis(*this, "MOUSEX"), 106 m_y_axis(*this, "MOUSEY") 107 { 108 for (auto & elem : m_busdmarq) 109 { 110 elem = CLEAR_LINE; 111 } 112 } 113 114 void tandy2k_hd(machine_config &config); 115 void tandy2k(machine_config &config); 116 DECLARE_INPUT_CHANGED_MEMBER(input_changed); 117 118 private: 119 required_device<i80186_cpu_device> m_maincpu; 120 required_device<i8251_device> m_uart; 121 required_device<i8255_device> m_i8255a; 122 required_device<pit8253_device> m_pit; 123 required_device<i8272a_device> m_fdc; 124 required_device<pic8259_device> m_pic0; 125 required_device<pic8259_device> m_pic1; 126 required_device<crt9007_device> m_vpac; 127 required_device<crt9212_device> m_drb0; 128 required_device<crt9212_device> m_drb1; 129 required_device<crt9021_device> m_vac; 130 required_device<palette_device> m_colpal; 131 required_device<address_map_bank_device> m_vrambank; 132 required_device<timer_device> m_timer_vidldsh; 133 required_device<centronics_device> m_centronics; 134 required_device<speaker_sound_device> m_speaker; 135 required_device<ram_device> m_ram; 136 required_device<floppy_image_device> m_floppy0; 137 required_device<floppy_image_device> m_floppy1; 138 required_device<rs232_port_device> m_rs232; 139 required_device<tandy2k_keyboard_device> m_kb; 140 required_shared_ptr<uint16_t> m_hires_ram; 141 optional_shared_ptr<uint8_t> m_char_ram; 142 required_device<pc_keyboard_device> m_pc_keyboard; // temporary until the tandy keyboard has a rom dump 143 144 virtual void machine_start() override; 145 virtual void machine_reset() override; 146 virtual void device_reset_after_children() override; 147 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 148 149 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 150 151 void update_drq(); 152 void dma_request(int line, int state); 153 void speaker_update(); 154 155 uint8_t char_ram_r(offs_t offset); 156 void char_ram_w(offs_t offset, uint8_t data); 157 uint8_t videoram_r(offs_t offset); 158 uint8_t enable_r(); 159 void enable_w(uint8_t data); 160 void dma_mux_w(uint8_t data); 161 uint8_t kbint_clr_r(); 162 uint8_t fldtc_r(); 163 void fldtc_w(uint8_t data); 164 void addr_ctrl_w(uint8_t data); 165 DECLARE_WRITE_LINE_MEMBER( rxrdy_w ); 166 DECLARE_WRITE_LINE_MEMBER( txrdy_w ); 167 DECLARE_WRITE_LINE_MEMBER( outspkr_w ); 168 DECLARE_WRITE_LINE_MEMBER( intbrclk_w ); 169 DECLARE_WRITE_LINE_MEMBER( rfrqpulse_w ); 170 uint8_t ppi_pb_r(); 171 void ppi_pc_w(uint8_t data); 172 DECLARE_WRITE_LINE_MEMBER( vpac_vlt_w ); 173 DECLARE_WRITE_LINE_MEMBER( vpac_drb_w ); 174 DECLARE_WRITE_LINE_MEMBER( vpac_wben_w ); 175 DECLARE_WRITE_LINE_MEMBER( vpac_cblank_w ); 176 DECLARE_WRITE_LINE_MEMBER( vpac_slg_w ); 177 DECLARE_WRITE_LINE_MEMBER( vpac_sld_w ); 178 uint8_t hires_status_r(); 179 void hires_plane_w(uint8_t data); 180 void vidla_w(uint8_t data); 181 void drb_attr_w(uint8_t data); 182 DECLARE_WRITE_LINE_MEMBER( kbdclk_w ); 183 DECLARE_WRITE_LINE_MEMBER( kbddat_w ); 184 uint8_t clkmouse_r(offs_t offset); 185 void clkmouse_w(offs_t offset, uint8_t data); 186 uint8_t irq_callback(offs_t offset); 187 DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); 188 DECLARE_WRITE_LINE_MEMBER( fdc_hdl_w ); 189 DECLARE_WRITE_LINE_MEMBER(write_centronics_ack); 190 DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); 191 DECLARE_WRITE_LINE_MEMBER(write_centronics_perror); 192 DECLARE_WRITE_LINE_MEMBER(write_centronics_select); 193 DECLARE_WRITE_LINE_MEMBER(write_centronics_fault); 194 CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character ); 195 TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick ); 196 DECLARE_FLOPPY_FORMATS( floppy_formats ); 197 static rgb_t IRGB(uint32_t raw); 198 199 enum 200 { 201 LPINEN = 0, 202 KBDINEN, 203 PORTINEN 204 }; 205 206 /* DMA state */ 207 uint8_t m_dma_mux; 208 int m_busdmarq[4]; 209 210 /* keyboard state */ 211 int m_kbdclk; 212 int m_kbddat; 213 uint8_t m_kbdin; 214 215 /* serial state */ 216 int m_extclk; 217 int m_rxrdy; 218 int m_txrdy; 219 220 /* PPI state */ 221 int m_pb_sel; 222 223 /* video state */ 224 uint8_t m_vram_base; 225 int m_vidouts; 226 int m_clkspd; 227 int m_clkcnt; 228 int m_blc; 229 int m_bkc; 230 int m_cblank; 231 uint8_t m_dblc; 232 uint8_t m_dbkc; 233 uint8_t m_dblank; 234 int m_slg; 235 int m_sld; 236 uint8_t m_cgra; 237 uint8_t m_vidla; 238 uint8_t m_hires_en; 239 240 /* sound state */ 241 int m_outspkr; 242 int m_spkrdata; 243 244 int m_centronics_ack; 245 int m_centronics_fault; 246 int m_centronics_select; 247 int m_centronics_perror; 248 int m_centronics_busy; 249 250 enum 251 { 252 MO_IRQ = 1, 253 BT_IRQ = 2 254 }; 255 256 enum 257 { 258 MOUS_TIMER, 259 MCU_DELAY 260 }; 261 262 uint8_t m_clkmouse_cmd[8]; 263 int m_clkmouse_cnt; 264 uint8_t m_clkmouse_irq; 265 uint16_t m_mouse_x, m_mouse_y; 266 emu_timer *m_mouse_timer; 267 emu_timer *m_mcu_delay; 268 269 void tandy2k_hd_io(address_map &map); 270 void tandy2k_io(address_map &map); 271 void tandy2k_mem(address_map &map); 272 void vpac_mem(address_map &map); 273 void vrambank_mem(address_map &map); 274 275 required_ioport m_buttons, m_x_axis, m_y_axis; 276 }; 277 278 #endif // MAME_INCLUDES_TANDY2K_H 279