1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder 3 #ifndef MAME_INCLUDES_TRS80M2_H 4 #define MAME_INCLUDES_TRS80M2_H 5 6 #pragma once 7 8 9 #include "cpu/z80/z80.h" 10 #include "machine/z80daisy.h" 11 #include "cpu/mcs48/mcs48.h" 12 #include "cpu/m68000/m68000.h" 13 #include "bus/centronics/ctronics.h" 14 #include "imagedev/floppy.h" 15 #include "machine/am9519.h" 16 #include "machine/keyboard.h" 17 #include "machine/ram.h" 18 #include "machine/trs80m2kb.h" 19 #include "machine/wd_fdc.h" 20 #include "machine/z80ctc.h" 21 #include "machine/z80dma.h" 22 #include "machine/z80pio.h" 23 #include "machine/z80sio.h" 24 #include "video/mc6845.h" 25 #include "emupal.h" 26 27 #define SCREEN_TAG "screen" 28 #define Z80_TAG "u12" 29 #define Z80CTC_TAG "u19" 30 #define Z80DMA_TAG "u20" 31 #define Z80PIO_TAG "u22" 32 #define Z80SIO_TAG "u18" 33 #define FD1791_TAG "u6" 34 #define MC6845_TAG "u11" 35 #define CENTRONICS_TAG "j2" 36 #define M68000_TAG "m16_u22" 37 #define AM9519A_TAG "m16_u11" 38 39 class trs80m2_state : public driver_device 40 { 41 public: trs80m2_state(const machine_config & mconfig,device_type type,const char * tag)42 trs80m2_state(const machine_config &mconfig, device_type type, const char *tag) : 43 driver_device(mconfig, type, tag), 44 m_maincpu(*this, Z80_TAG), 45 m_ctc(*this, Z80CTC_TAG), 46 m_dmac(*this, Z80DMA_TAG), 47 m_pio(*this, Z80PIO_TAG), 48 m_crtc(*this, MC6845_TAG), 49 m_palette(*this, "palette"), 50 m_fdc(*this, FD1791_TAG), 51 m_centronics(*this, CENTRONICS_TAG), 52 m_floppy0(*this, FD1791_TAG":0"), 53 m_floppy1(*this, FD1791_TAG":1"), 54 m_floppy2(*this, FD1791_TAG":2"), 55 m_floppy3(*this, FD1791_TAG":3"), 56 m_floppy(nullptr), 57 m_ram(*this, RAM_TAG), 58 m_kb(*this, TRS80M2_KEYBOARD_TAG), 59 m_rom(*this, Z80_TAG), 60 m_char_rom(*this, MC6845_TAG), 61 m_video_ram(*this, "video_ram") 62 { 63 } 64 imperfect_features()65 static constexpr feature_type imperfect_features() { return feature::KEYBOARD; } 66 67 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 68 69 uint8_t read(offs_t offset); 70 void write(offs_t offset, uint8_t data); 71 void drvslt_w(uint8_t data); 72 void rom_enable_w(uint8_t data); 73 uint8_t keyboard_r(); 74 uint8_t rtc_r(); 75 uint8_t nmi_r(); 76 void nmi_w(uint8_t data); 77 uint8_t fdc_r(offs_t offset); 78 void fdc_w(offs_t offset, uint8_t data); 79 DECLARE_WRITE_LINE_MEMBER( de_w ); 80 DECLARE_WRITE_LINE_MEMBER( vsync_w ); 81 uint8_t pio_pa_r(); 82 void pio_pa_w(uint8_t data); 83 DECLARE_WRITE_LINE_MEMBER( strobe_w ); 84 DECLARE_WRITE_LINE_MEMBER( kb_clock_w ); 85 void kbd_w(u8 data); 86 87 MC6845_UPDATE_ROW( crtc_update_row ); 88 89 uint8_t io_read_byte(offs_t offset); 90 void io_write_byte(offs_t offset, uint8_t data); 91 92 DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); 93 DECLARE_WRITE_LINE_MEMBER(write_centronics_fault); 94 DECLARE_WRITE_LINE_MEMBER(write_centronics_perror); 95 96 void trs80m2(machine_config &config); 97 void m68000_mem(address_map &map); 98 void z80_io(address_map &map); 99 void z80_mem(address_map &map); 100 protected: 101 virtual void machine_start() override; 102 virtual void machine_reset() override; 103 104 virtual void video_start() override; 105 106 required_device<z80_device> m_maincpu; 107 required_device<z80ctc_device> m_ctc; 108 required_device<z80dma_device> m_dmac; 109 required_device<z80pio_device> m_pio; 110 required_device<mc6845_device> m_crtc; 111 required_device<palette_device> m_palette; 112 required_device<fd1791_device> m_fdc; 113 required_device<centronics_device> m_centronics; 114 required_device<floppy_connector> m_floppy0; 115 required_device<floppy_connector> m_floppy1; 116 required_device<floppy_connector> m_floppy2; 117 required_device<floppy_connector> m_floppy3; 118 floppy_image_device *m_floppy; 119 required_device<ram_device> m_ram; 120 required_device<trs80m2_keyboard_device> m_kb; 121 required_memory_region m_rom; 122 required_memory_region m_char_rom; 123 optional_shared_ptr<uint8_t> m_video_ram; 124 125 // memory state 126 int m_boot_rom; 127 int m_bank; 128 int m_msel; 129 130 // keyboard state 131 uint8_t m_key_latch; 132 uint8_t m_key_data; 133 int m_key_bit; 134 int m_kbclk; 135 int m_kbdata; 136 int m_kbirq; 137 138 // video state 139 int m_blnkvid; 140 int m_80_40_char_en; 141 int m_de; 142 int m_rtc_int; 143 int m_enable_rtc_int; 144 145 int m_centronics_busy; 146 int m_centronics_fault; 147 int m_centronics_perror; 148 }; 149 150 class trs80m16_state : public trs80m2_state 151 { 152 public: trs80m16_state(const machine_config & mconfig,device_type type,const char * tag)153 trs80m16_state(const machine_config &mconfig, device_type type, const char *tag) 154 : trs80m2_state(mconfig, type, tag) 155 , m_subcpu(*this, M68000_TAG) 156 , m_uic(*this, AM9519A_TAG) 157 { 158 } 159 160 void ual_w(uint8_t data); 161 void tcl_w(uint8_t data); 162 163 void trs80m16(machine_config &config); 164 void m16_z80_io(address_map &map); 165 protected: 166 virtual void machine_start() override; 167 168 required_device<cpu_device> m_subcpu; 169 required_device<am9519_device> m_uic; 170 171 uint16_t m_ual; 172 uint8_t m_limit[2]; 173 uint8_t m_offset[2]; 174 }; 175 176 #endif // MAME_INCLUDES_TRS80M2_H 177