1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder, Olivier Galibert 3 #ifndef MAME_INCLUDES_ATARI_ST_H 4 #define MAME_INCLUDES_ATARI_ST_H 5 6 #pragma once 7 8 #include "bus/rs232/rs232.h" 9 #include "cpu/m68000/m68000.h" 10 #include "cpu/m6800/m6801.h" 11 #include "machine/6850acia.h" 12 #include "machine/8530scc.h" 13 #include "bus/centronics/ctronics.h" 14 #include "bus/generic/slot.h" 15 #include "bus/generic/carts.h" 16 #include "imagedev/floppy.h" 17 #include "machine/mc68901.h" 18 #include "machine/ram.h" 19 #include "machine/rescap.h" 20 #include "machine/rp5c15.h" 21 #include "machine/wd_fdc.h" 22 #include "sound/ay8910.h" 23 #include "sound/lmc1992.h" 24 #include "emupal.h" 25 #include "screen.h" 26 27 #define M68000_TAG "m68000" 28 #define HD6301V1_TAG "hd6301" 29 #define YM2149_TAG "ym2149" 30 #define MC6850_0_TAG "mc6850_0" 31 #define MC6850_1_TAG "mc6850_1" 32 #define Z8530_TAG "z8530" 33 #define COP888_TAG "u703" 34 #define RP5C15_TAG "rp5c15" 35 #define YM3439_TAG "ym3439" 36 #define MC68901_TAG "mc68901" 37 #define LMC1992_TAG "lmc1992" 38 #define WD1772_TAG "wd1772" 39 #define SCREEN_TAG "screen" 40 #define CENTRONICS_TAG "centronics" 41 #define RS232_TAG "rs232" 42 43 // Atari ST 44 45 #define Y1 XTAL(2'457'600) 46 47 // STBook 48 49 #define U517 XTAL(16'000'000) 50 #define Y200 XTAL(2'457'600) 51 #define Y700 XTAL(10'000'000) 52 53 #define DMA_STATUS_DRQ 0x04 54 #define DMA_STATUS_SECTOR_COUNT 0x02 55 #define DMA_STATUS_ERROR 0x01 56 57 #define DMA_MODE_READ_WRITE 0x100 58 #define DMA_MODE_FDC_HDC_ACK 0x080 59 #define DMA_MODE_ENABLED 0x040 60 #define DMA_MODE_SECTOR_COUNT 0x010 61 #define DMA_MODE_FDC_HDC_CS 0x008 62 #define DMA_MODE_A1 0x004 63 #define DMA_MODE_A0 0x002 64 #define DMA_MODE_ADDRESS_MASK 0x006 65 66 #define DMA_SECTOR_SIZE 512 67 68 enum 69 { 70 IKBD_MOUSE_PHASE_STATIC = 0, 71 IKBD_MOUSE_PHASE_POSITIVE, 72 IKBD_MOUSE_PHASE_NEGATIVE 73 }; 74 75 class st_state : public driver_device 76 { 77 public: 78 enum 79 { 80 TIMER_MOUSE_TICK, 81 TIMER_SHIFTER_TICK, 82 TIMER_GLUE_TICK, 83 TIMER_BLITTER_TICK 84 }; 85 st_state(const machine_config & mconfig,device_type type,const char * tag)86 st_state(const machine_config &mconfig, device_type type, const char *tag) 87 : driver_device(mconfig, type, tag), 88 m_maincpu(*this, M68000_TAG), 89 m_ikbd(*this, HD6301V1_TAG), 90 m_fdc(*this, WD1772_TAG), 91 m_floppy(*this, WD1772_TAG ":%u", 0U), 92 m_mfp(*this, MC68901_TAG), 93 m_acia(*this, {MC6850_0_TAG, MC6850_1_TAG}), 94 m_centronics(*this, CENTRONICS_TAG), 95 m_cart(*this, "cartslot"), 96 m_ram(*this, RAM_TAG), 97 m_rs232(*this, RS232_TAG), 98 m_ymsnd(*this, YM2149_TAG), 99 m_p31(*this, "P31"), 100 m_p32(*this, "P32"), 101 m_p33(*this, "P33"), 102 m_p34(*this, "P34"), 103 m_p35(*this, "P35"), 104 m_p36(*this, "P36"), 105 m_p37(*this, "P37"), 106 m_p40(*this, "P40"), 107 m_p41(*this, "P41"), 108 m_p42(*this, "P42"), 109 m_p43(*this, "P43"), 110 m_p44(*this, "P44"), 111 m_p45(*this, "P45"), 112 m_p46(*this, "P46"), 113 m_p47(*this, "P47"), 114 m_joy0(*this, "IKBD_JOY0"), 115 m_joy1(*this, "IKBD_JOY1"), 116 m_mousex(*this, "IKBD_MOUSEX"), 117 m_mousey(*this, "IKBD_MOUSEY"), 118 m_config(*this, "config"), 119 m_ikbd_mouse_x(0), 120 m_ikbd_mouse_y(0), 121 m_ikbd_mouse_px(IKBD_MOUSE_PHASE_STATIC), 122 m_ikbd_mouse_py(IKBD_MOUSE_PHASE_STATIC), 123 m_ikbd_mouse_pc(0), 124 m_ikbd_joy(1), 125 m_monochrome(1), 126 m_palette(*this, "palette"), 127 m_screen(*this, "screen"), 128 m_led(*this, "led1") 129 { } 130 131 DECLARE_WRITE_LINE_MEMBER( write_monochrome ); 132 133 void st(machine_config &config); 134 135 protected: 136 required_device<m68000_base_device> m_maincpu; 137 required_device<cpu_device> m_ikbd; 138 required_device<wd1772_device> m_fdc; 139 required_device_array<floppy_connector, 2> m_floppy; 140 required_device<mc68901_device> m_mfp; 141 required_device_array<acia6850_device, 2> m_acia; 142 required_device<centronics_device> m_centronics; 143 required_device<generic_slot_device> m_cart; 144 required_device<ram_device> m_ram; 145 required_device<rs232_port_device> m_rs232; 146 required_device<ym2149_device> m_ymsnd; 147 required_ioport m_p31; 148 required_ioport m_p32; 149 required_ioport m_p33; 150 required_ioport m_p34; 151 required_ioport m_p35; 152 required_ioport m_p36; 153 required_ioport m_p37; 154 required_ioport m_p40; 155 required_ioport m_p41; 156 required_ioport m_p42; 157 required_ioport m_p43; 158 required_ioport m_p44; 159 required_ioport m_p45; 160 required_ioport m_p46; 161 required_ioport m_p47; 162 optional_ioport m_joy0; 163 optional_ioport m_joy1; 164 optional_ioport m_mousex; 165 optional_ioport m_mousey; 166 optional_ioport m_config; 167 168 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 169 170 // video 171 uint8_t shifter_base_r(offs_t offset); 172 uint8_t shifter_counter_r(offs_t offset); 173 uint8_t shifter_sync_r(); 174 uint16_t shifter_palette_r(offs_t offset); 175 uint8_t shifter_mode_r(); 176 177 void shifter_base_w(offs_t offset, uint8_t data); 178 void shifter_sync_w(uint8_t data); 179 void shifter_palette_w(offs_t offset, uint16_t data); 180 void shifter_mode_w(uint8_t data); 181 182 uint16_t blitter_halftone_r(offs_t offset); 183 uint16_t blitter_src_inc_x_r(); 184 uint16_t blitter_src_inc_y_r(); 185 uint16_t blitter_src_r(offs_t offset); 186 uint16_t blitter_end_mask_r(offs_t offset); 187 uint16_t blitter_dst_inc_x_r(); 188 uint16_t blitter_dst_inc_y_r(); 189 uint16_t blitter_dst_r(offs_t offset); 190 uint16_t blitter_count_x_r(); 191 uint16_t blitter_count_y_r(); 192 uint16_t blitter_op_r(offs_t offset, uint16_t mem_mask = ~0); 193 uint16_t blitter_ctrl_r(offs_t offset, uint16_t mem_mask = ~0); 194 195 void blitter_halftone_w(offs_t offset, uint16_t data); 196 void blitter_src_inc_x_w(uint16_t data); 197 void blitter_src_inc_y_w(uint16_t data); 198 void blitter_src_w(offs_t offset, uint16_t data); 199 void blitter_end_mask_w(offs_t offset, uint16_t data); 200 void blitter_dst_inc_x_w(uint16_t data); 201 void blitter_dst_inc_y_w(uint16_t data); 202 void blitter_dst_w(offs_t offset, uint16_t data); 203 void blitter_count_x_w(uint16_t data); 204 void blitter_count_y_w(uint16_t data); 205 void blitter_op_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 206 void blitter_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 207 208 void mouse_tick(); 209 inline pen_t shift_mode_0(); 210 inline pen_t shift_mode_1(); 211 inline pen_t shift_mode_2(); 212 void shifter_tick(); 213 inline void shifter_load(); 214 inline void draw_pixel(int x, int y, u32 pen); 215 void glue_tick(); 216 void set_screen_parameters(); 217 void blitter_source(); 218 uint16_t blitter_hop(); 219 void blitter_op(uint16_t s, uint32_t dstaddr, uint16_t mask); 220 void blitter_tick(); 221 222 // driver 223 uint16_t fdc_data_r(offs_t offset); 224 void fdc_data_w(offs_t offset, uint16_t data); 225 uint16_t dma_status_r(); 226 void dma_mode_w(uint16_t data); 227 uint8_t dma_counter_r(offs_t offset); 228 void dma_base_w(offs_t offset, uint8_t data); 229 uint8_t mmu_r(); 230 void mmu_w(uint8_t data); 231 uint16_t berr_r(); 232 void berr_w(uint16_t data); 233 uint8_t ikbd_port1_r(); 234 uint8_t ikbd_port2_r(); 235 void ikbd_port2_w(uint8_t data); 236 void ikbd_port3_w(uint8_t data); 237 uint8_t ikbd_port4_r(); 238 void ikbd_port4_w(uint8_t data); 239 240 DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); 241 242 void psg_pa_w(uint8_t data); 243 244 DECLARE_WRITE_LINE_MEMBER( ikbd_tx_w ); 245 246 DECLARE_WRITE_LINE_MEMBER( reset_w ); 247 248 void toggle_dma_fifo(); 249 void flush_dma_fifo(); 250 void fill_dma_fifo(); 251 void fdc_dma_transfer(); 252 253 void configure_memory(); 254 void state_save(); 255 256 /* memory state */ 257 uint8_t m_mmu; 258 259 /* keyboard state */ 260 uint16_t m_ikbd_keylatch; 261 uint8_t m_ikbd_mouse; 262 uint8_t m_ikbd_mouse_x; 263 uint8_t m_ikbd_mouse_y; 264 uint8_t m_ikbd_mouse_px; 265 uint8_t m_ikbd_mouse_py; 266 uint8_t m_ikbd_mouse_pc; 267 int m_ikbd_tx; 268 int m_ikbd_joy; 269 int m_midi_tx; 270 271 /* floppy state */ 272 uint32_t m_dma_base; 273 uint16_t m_dma_error; 274 uint16_t m_fdc_mode; 275 uint8_t m_fdc_sectors; 276 uint16_t m_fdc_fifo[2][8]; 277 int m_fdc_fifo_sel; 278 int m_fdc_fifo_index; 279 int m_fdc_fifo_msb; 280 int m_fdc_fifo_empty[2]; 281 int m_fdc_dmabytes; 282 283 /* shifter state */ 284 uint32_t m_shifter_base; 285 uint32_t m_shifter_ofs; 286 uint8_t m_shifter_sync; 287 uint8_t m_shifter_mode; 288 uint16_t m_shifter_palette[16]; 289 uint16_t m_shifter_rr[4]; 290 uint16_t m_shifter_ir[4]; 291 int m_shifter_bitplane; 292 int m_shifter_shift; 293 int m_shifter_h; 294 int m_shifter_v; 295 int m_shifter_de; 296 int m_shifter_x_start; 297 int m_shifter_x_end; 298 int m_shifter_y_start; 299 int m_shifter_y_end; 300 int m_shifter_hblank_start; 301 int m_shifter_vblank_start; 302 303 /* blitter state */ 304 uint16_t m_blitter_halftone[16]; 305 int16_t m_blitter_src_inc_x; 306 int16_t m_blitter_src_inc_y; 307 int16_t m_blitter_dst_inc_x; 308 int16_t m_blitter_dst_inc_y; 309 uint32_t m_blitter_src; 310 uint32_t m_blitter_dst; 311 uint16_t m_blitter_endmask1; 312 uint16_t m_blitter_endmask2; 313 uint16_t m_blitter_endmask3; 314 uint16_t m_blitter_xcount; 315 uint16_t m_blitter_ycount; 316 uint16_t m_blitter_xcountl; 317 uint8_t m_blitter_hop; 318 uint8_t m_blitter_op; 319 uint8_t m_blitter_ctrl; 320 uint8_t m_blitter_skew; 321 uint32_t m_blitter_srcbuf; 322 323 /* timers */ 324 emu_timer *m_mouse_timer; 325 emu_timer *m_glue_timer; 326 emu_timer *m_shifter_timer; 327 328 bitmap_rgb32 m_bitmap; 329 330 DECLARE_FLOPPY_FORMATS(floppy_formats); 331 332 int m_monochrome; 333 required_device<palette_device> m_palette; 334 required_device<screen_device> m_screen; 335 336 void common(machine_config &config); 337 void ikbd_map(address_map &map); 338 void cpu_space_map(address_map &map); 339 void st_map(address_map &map); 340 void keyboard(machine_config &config); 341 342 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 343 virtual void machine_start() override; 344 virtual void video_start() override; 345 346 output_finder<> m_led; 347 }; 348 349 class megast_state : public st_state 350 { 351 public: megast_state(const machine_config & mconfig,device_type type,const char * tag)352 megast_state(const machine_config &mconfig, device_type type, const char *tag) 353 : st_state(mconfig, type, tag) 354 { } 355 356 uint16_t fpu_r(); 357 void fpu_w(uint16_t data); 358 void megast(machine_config &config); 359 void megast_map(address_map &map); 360 }; 361 362 class ste_state : public st_state 363 { 364 public: 365 enum 366 { 367 TIMER_DMASOUND_TICK, 368 TIMER_MICROWIRE_TICK 369 }; 370 ste_state(const machine_config & mconfig,device_type type,const char * tag)371 ste_state(const machine_config &mconfig, device_type type, const char *tag) 372 : st_state(mconfig, type, tag), 373 m_lmc1992(*this, LMC1992_TAG) 374 { } 375 376 optional_device<lmc1992_device> m_lmc1992; 377 378 uint8_t shifter_base_low_r(); 379 void shifter_base_low_w(uint8_t data); 380 uint8_t shifter_counter_r(offs_t offset); 381 void shifter_counter_w(offs_t offset, uint8_t data); 382 void shifter_palette_w(offs_t offset, uint16_t data); 383 uint8_t shifter_lineofs_r(); 384 void shifter_lineofs_w(uint8_t data); 385 uint8_t shifter_pixelofs_r(); 386 void shifter_pixelofs_w(uint8_t data); 387 388 uint8_t sound_dma_control_r(); 389 uint8_t sound_dma_base_r(offs_t offset); 390 uint8_t sound_dma_counter_r(offs_t offset); 391 uint8_t sound_dma_end_r(offs_t offset); 392 uint8_t sound_mode_r(); 393 void sound_dma_control_w(uint8_t data); 394 void sound_dma_base_w(offs_t offset, uint8_t data); 395 void sound_dma_end_w(offs_t offset, uint8_t data); 396 void sound_mode_w(uint8_t data); 397 uint16_t microwire_data_r(); 398 void microwire_data_w(uint16_t data); 399 uint16_t microwire_mask_r(); 400 void microwire_mask_w(uint16_t data); 401 402 DECLARE_WRITE_LINE_MEMBER( write_monochrome ); 403 404 void dmasound_set_state(int level); 405 void dmasound_tick(); 406 void microwire_shift(); 407 void microwire_tick(); 408 void state_save(); 409 410 // shifter state 411 uint8_t m_shifter_lineofs; 412 uint8_t m_shifter_pixelofs; 413 414 /* microwire state */ 415 uint16_t m_mw_data; 416 uint16_t m_mw_mask; 417 int m_mw_shift; 418 419 /* DMA sound state */ 420 uint32_t m_dmasnd_base; 421 uint32_t m_dmasnd_end; 422 uint32_t m_dmasnd_cntr; 423 uint32_t m_dmasnd_baselatch; 424 uint32_t m_dmasnd_endlatch; 425 uint8_t m_dmasnd_ctrl; 426 uint8_t m_dmasnd_mode; 427 uint8_t m_dmasnd_fifo[8]; 428 uint8_t m_dmasnd_samples; 429 int m_dmasnd_active; 430 431 // timers 432 emu_timer *m_microwire_timer; 433 emu_timer *m_dmasound_timer; 434 435 void falcon40(machine_config &config); 436 void tt030(machine_config &config); 437 void falcon(machine_config &config); 438 void ste(machine_config &config); 439 void ste_map(address_map &map); 440 protected: 441 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 442 virtual void machine_start() override; 443 virtual void video_start() override; 444 }; 445 446 class megaste_state : public ste_state 447 { 448 public: megaste_state(const machine_config & mconfig,device_type type,const char * tag)449 megaste_state(const machine_config &mconfig, device_type type, const char *tag) 450 : ste_state(mconfig, type, tag) 451 { } 452 453 uint16_t cache_r(); 454 void cache_w(uint16_t data); 455 456 uint16_t m_cache; 457 void megaste(machine_config &config); 458 void megaste_map(address_map &map); 459 460 protected: 461 virtual void machine_start() override; 462 }; 463 464 class stbook_state : public ste_state 465 { 466 public: stbook_state(const machine_config & mconfig,device_type type,const char * tag)467 stbook_state(const machine_config &mconfig, device_type type, const char *tag) 468 : ste_state(mconfig, type, tag), 469 m_sw400(*this, "SW400") 470 { } 471 472 required_ioport m_sw400; 473 474 uint16_t config_r(); 475 void lcd_control_w(uint16_t data); 476 477 void psg_pa_w(uint8_t data); 478 uint8_t mfp_gpio_r(); 479 void stbook_map(address_map &map); 480 protected: 481 virtual void machine_start() override; 482 virtual void video_start() override; 483 }; 484 485 #endif // MAME_INCLUDES_ATARI_ST_H 486