1 // license:BSD-3-Clause 2 // copyright-holders:Phill Harvey-Smith, Carl 3 /* 4 rmnimbus.c 5 Machine driver for the Research Machines Nimbus. 6 7 Phill Harvey-Smith 8 2009-11-29. 9 */ 10 #ifndef MAME_INCLUDES_RMNIMBUS_H 11 #define MAME_INCLUDES_RMNIMBUS_H 12 13 #pragma once 14 15 #include "cpu/i86/i186.h" 16 #include "cpu/mcs51/mcs51.h" 17 #include "machine/z80sio.h" 18 #include "machine/wd_fdc.h" 19 #include "bus/scsi/scsi.h" 20 #include "machine/6522via.h" 21 #include "machine/ram.h" 22 #include "machine/eepromser.h" 23 #include "sound/ay8910.h" 24 #include "sound/msm5205.h" 25 #include "bus/centronics/ctronics.h" 26 #include "emupal.h" 27 #include "screen.h" 28 29 #define MAINCPU_TAG "maincpu" 30 #define IOCPU_TAG "iocpu" 31 #define Z80SIO_TAG "z80sio" 32 #define FDC_TAG "wd2793" 33 #define SCSIBUS_TAG "scsibus" 34 #define ER59256_TAG "er59256" 35 #define AY8910_TAG "ay8910" 36 #define MONO_TAG "mono" 37 #define MSM5205_TAG "msm5205" 38 #define VIA_TAG "via6522" 39 #define CENTRONICS_TAG "centronics" 40 41 /* Mouse / Joystick */ 42 43 #define JOYSTICK0_TAG "joystick0" 44 #define MOUSE_BUTTON_TAG "mousebtn" 45 #define MOUSEX_TAG "mousex" 46 #define MOUSEY_TAG "mousey" 47 48 /* Memory controller */ 49 #define RAM_BANK00_TAG "bank0" 50 #define RAM_BANK01_TAG "bank1" 51 #define RAM_BANK02_TAG "bank2" 52 #define RAM_BANK03_TAG "bank3" 53 #define RAM_BANK04_TAG "bank4" 54 #define RAM_BANK05_TAG "bank5" 55 #define RAM_BANK06_TAG "bank6" 56 #define RAM_BANK07_TAG "bank7" 57 58 class rmnimbus_state : public driver_device 59 { 60 public: rmnimbus_state(const machine_config & mconfig,device_type type,const char * tag)61 rmnimbus_state(const machine_config &mconfig, device_type type, const char *tag) : 62 driver_device(mconfig, type, tag), 63 m_maincpu(*this, MAINCPU_TAG), 64 m_iocpu(*this, IOCPU_TAG), 65 m_msm(*this, MSM5205_TAG), 66 m_scsibus(*this, SCSIBUS_TAG), 67 m_ram(*this, RAM_TAG), 68 m_eeprom(*this, ER59256_TAG), 69 m_via(*this, VIA_TAG), 70 m_centronics(*this, CENTRONICS_TAG), 71 m_palette(*this, "palette"), 72 m_scsi_data_out(*this, "scsi_data_out"), 73 m_scsi_data_in(*this, "scsi_data_in"), 74 m_scsi_ctrl_out(*this, "scsi_ctrl_out"), 75 m_fdc(*this, FDC_TAG), 76 m_z80sio(*this, Z80SIO_TAG), 77 m_screen(*this, "screen"), 78 m_io_config(*this, "config"), 79 m_io_joystick0(*this, JOYSTICK0_TAG), 80 m_io_mouse_button(*this, MOUSE_BUTTON_TAG), 81 m_io_mousex(*this, MOUSEX_TAG), 82 m_io_mousey(*this, MOUSEY_TAG) 83 { 84 } 85 imperfect_features()86 static constexpr feature_type imperfect_features() { return feature::MOUSE; } 87 88 void nimbus(machine_config &config); 89 90 uint32_t m_debug_machine; 91 92 void decode_subbios(device_t *device, offs_t pc, uint8_t raw_flag); 93 void decode_dos21(device_t *device, offs_t pc); 94 95 private: 96 required_device<i80186_cpu_device> m_maincpu; 97 required_device<i8031_device> m_iocpu; 98 required_device<msm5205_device> m_msm; 99 required_device<scsi_port_device> m_scsibus; 100 required_device<ram_device> m_ram; 101 required_device<eeprom_serial_93cxx_device> m_eeprom; 102 required_device<via6522_device> m_via; 103 required_device<centronics_device> m_centronics; 104 required_device<palette_device> m_palette; 105 required_device<output_latch_device> m_scsi_data_out; 106 required_device<input_buffer_device> m_scsi_data_in; 107 required_device<output_latch_device> m_scsi_ctrl_out; 108 required_device<wd2793_device> m_fdc; 109 required_device<z80sio_device> m_z80sio; 110 required_device<screen_device> m_screen; 111 required_ioport m_io_config; 112 required_ioport m_io_joystick0; 113 required_ioport m_io_mouse_button; 114 required_ioport m_io_mousex; 115 required_ioport m_io_mousey; 116 117 bitmap_ind16 m_video_mem; 118 119 uint8_t m_mcu_reg080; 120 uint8_t m_iou_reg092; 121 uint8_t m_last_playmode; 122 uint8_t m_ay8910_a; 123 uint16_t m_x, m_y, m_yline; 124 uint8_t m_colours, m_mode, m_op; 125 uint32_t m_debug_video; 126 uint8_t m_vector; 127 uint8_t m_eeprom_bits; 128 uint8_t m_eeprom_state; 129 130 uint8_t nimbus_mcu_r(); 131 void nimbus_mcu_w(uint8_t data); 132 uint8_t scsi_r(offs_t offset); 133 void scsi_w(offs_t offset, uint8_t data); 134 void fdc_ctl_w(uint8_t data); 135 uint8_t nimbus_pc8031_r(offs_t offset); 136 void nimbus_pc8031_w(offs_t offset, uint8_t data); 137 uint8_t nimbus_pc8031_iou_r(offs_t offset); 138 void nimbus_pc8031_iou_w(offs_t offset, uint8_t data); 139 uint8_t nimbus_pc8031_port1_r(); 140 void nimbus_pc8031_port1_w(uint8_t data); 141 uint8_t nimbus_pc8031_port3_r(); 142 void nimbus_pc8031_port3_w(uint8_t data); 143 uint8_t nimbus_iou_r(offs_t offset); 144 void nimbus_iou_w(offs_t offset, uint8_t data); 145 void nimbus_sound_ay8910_porta_w(uint8_t data); 146 void nimbus_sound_ay8910_portb_w(uint8_t data); 147 uint8_t nimbus_mouse_js_r(); 148 void nimbus_mouse_js_w(uint8_t data); 149 uint16_t nimbus_video_io_r(offs_t offset, uint16_t mem_mask = ~0); 150 void nimbus_video_io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 151 virtual void machine_start() override; 152 virtual void machine_reset() override; 153 virtual void video_start() override; 154 virtual void video_reset() override; 155 uint32_t screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 156 DECLARE_WRITE_LINE_MEMBER(sio_interrupt); 157 DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w); 158 DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_drq_w); 159 void nimbus_via_write_portb(uint8_t data); 160 DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy); 161 DECLARE_WRITE_LINE_MEMBER(write_scsi_cd); 162 DECLARE_WRITE_LINE_MEMBER(write_scsi_io); 163 DECLARE_WRITE_LINE_MEMBER(write_scsi_msg); 164 DECLARE_WRITE_LINE_MEMBER(write_scsi_req); 165 DECLARE_WRITE_LINE_MEMBER(nimbus_msm5205_vck); 166 DECLARE_WRITE_LINE_MEMBER(write_scsi_iena); 167 168 uint8_t get_pixel(uint16_t x, uint16_t y); 169 uint16_t read_pixel_line(uint16_t x, uint16_t y, uint8_t pixels, uint8_t bpp); 170 uint16_t read_pixel_data(uint16_t x, uint16_t y); 171 void set_pixel(uint16_t x, uint16_t y, uint8_t colour); 172 void set_pixel40(uint16_t x, uint16_t y, uint8_t colour); 173 void write_pixel_line(uint16_t x, uint16_t y, uint16_t, uint8_t pixels, uint8_t bpp); 174 void move_pixel_line(uint16_t x, uint16_t y, uint8_t width); 175 void write_pixel_data(uint16_t x, uint16_t y, uint16_t data); 176 void change_palette(uint8_t bank, uint16_t colours); 177 void external_int(uint8_t vector, bool state); 178 uint8_t cascade_callback(); 179 void nimbus_bank_memory(); 180 void memory_reset(); 181 void fdc_reset(); 182 uint8_t fdc_driveno(uint8_t drivesel); 183 void hdc_reset(); 184 void hdc_post_rw(); 185 void hdc_drq(bool state); 186 void pc8031_reset(); 187 //void ipc_dumpregs(); 188 void iou_reset(); 189 void rmni_sound_reset(); 190 void mouse_js_reset(); 191 void check_scsi_irq(); 192 193 int m_scsi_iena; 194 int m_scsi_msg; 195 int m_scsi_bsy; 196 int m_scsi_io; 197 int m_scsi_cd; 198 int m_scsi_req; 199 200 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 201 202 enum 203 { 204 TIMER_MOUSE 205 }; 206 207 // Static data related to Floppy and SCSI hard disks 208 struct 209 { 210 uint8_t reg400; 211 } m_nimbus_drives; 212 213 /* 8031 Peripheral controller */ 214 struct 215 { 216 uint8_t ipc_in; 217 uint8_t ipc_out; 218 uint8_t status_in; 219 uint8_t status_out; 220 } m_ipc_interface; 221 222 /* Mouse/Joystick */ 223 struct 224 { 225 uint8_t m_mouse_px; 226 uint8_t m_mouse_py; 227 228 uint8_t m_mouse_x; 229 uint8_t m_mouse_y; 230 uint8_t m_mouse_pc; 231 uint8_t m_mouse_pcx; 232 uint8_t m_mouse_pcy; 233 234 uint8_t m_intstate_x; 235 uint8_t m_intstate_y; 236 237 uint8_t m_reg0a4; 238 239 emu_timer *m_mouse_timer; 240 } m_nimbus_mouse; 241 242 void nimbus_io(address_map &map); 243 void nimbus_iocpu_io(address_map &map); 244 void nimbus_iocpu_mem(address_map &map); 245 void nimbus_mem(address_map &map); 246 247 void decode_dssi_none(uint16_t ds, uint16_t si, uint8_t raw_flag); 248 void decode_dssi_generic(uint16_t ds, uint16_t si, uint8_t raw_flag); 249 void decode_dssi_f_fill_area(uint16_t ds, uint16_t si, uint8_t raw_flag); 250 void decode_dssi_f_plot_character_string(uint16_t ds, uint16_t si, uint8_t raw_flag); 251 void decode_dssi_f_set_new_clt(uint16_t ds, uint16_t si, uint8_t raw_flag); 252 void decode_dssi_f_plonk_char(uint16_t ds, uint16_t si, uint8_t raw_flag); 253 void decode_dssi_f_rw_sectors(uint16_t ds, uint16_t si, uint8_t raw_flag); 254 255 void debug_command(int ref, const std::vector<std::string> ¶ms); 256 void video_debug(int ref, const std::vector<std::string> ¶ms); 257 }; 258 259 #endif // MAME_INCLUDES_RMNIMBUS_H 260