// license:BSD-3-Clause // copyright-holders:Curt Coder, Olivier Galibert #ifndef MAME_INCLUDES_ATARI_ST_H #define MAME_INCLUDES_ATARI_ST_H #pragma once #include "bus/rs232/rs232.h" #include "cpu/m68000/m68000.h" #include "cpu/m6800/m6801.h" #include "machine/6850acia.h" #include "machine/8530scc.h" #include "bus/centronics/ctronics.h" #include "bus/generic/slot.h" #include "bus/generic/carts.h" #include "machine/mc68901.h" #include "machine/ram.h" #include "machine/rescap.h" #include "machine/rp5c15.h" #include "machine/wd_fdc.h" #include "sound/ay8910.h" #include "sound/lmc1992.h" #include "screen.h" #define M68000_TAG "m68000" #define HD6301V1_TAG "hd6301" #define YM2149_TAG "ym2149" #define MC6850_0_TAG "mc6850_0" #define MC6850_1_TAG "mc6850_1" #define Z8530_TAG "z8530" #define COP888_TAG "u703" #define RP5C15_TAG "rp5c15" #define YM3439_TAG "ym3439" #define MC68901_TAG "mc68901" #define LMC1992_TAG "lmc1992" #define WD1772_TAG "wd1772" #define SCREEN_TAG "screen" #define CENTRONICS_TAG "centronics" #define RS232_TAG "rs232" // Atari ST #define Y1 XTAL(2'457'600) // STBook #define U517 XTAL(16'000'000) #define Y200 XTAL(2'457'600) #define Y700 XTAL(10'000'000) #define DMA_STATUS_DRQ 0x04 #define DMA_STATUS_SECTOR_COUNT 0x02 #define DMA_STATUS_ERROR 0x01 #define DMA_MODE_READ_WRITE 0x100 #define DMA_MODE_FDC_HDC_ACK 0x080 #define DMA_MODE_ENABLED 0x040 #define DMA_MODE_SECTOR_COUNT 0x010 #define DMA_MODE_FDC_HDC_CS 0x008 #define DMA_MODE_A1 0x004 #define DMA_MODE_A0 0x002 #define DMA_MODE_ADDRESS_MASK 0x006 #define DMA_SECTOR_SIZE 512 enum { IKBD_MOUSE_PHASE_STATIC = 0, IKBD_MOUSE_PHASE_POSITIVE, IKBD_MOUSE_PHASE_NEGATIVE }; class st_state : public driver_device { public: enum { TIMER_MOUSE_TICK, TIMER_SHIFTER_TICK, TIMER_GLUE_TICK, TIMER_BLITTER_TICK }; st_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, M68000_TAG), m_fdc(*this, WD1772_TAG), m_floppy(*this, WD1772_TAG ":%u", 0U), m_mfp(*this, MC68901_TAG), m_acia0(*this, MC6850_0_TAG), m_acia1(*this, MC6850_1_TAG), m_centronics(*this, CENTRONICS_TAG), m_cart(*this, "cartslot"), m_ram(*this, RAM_TAG), m_rs232(*this, RS232_TAG), m_p31(*this, "P31"), m_p32(*this, "P32"), m_p33(*this, "P33"), m_p34(*this, "P34"), m_p35(*this, "P35"), m_p36(*this, "P36"), m_p37(*this, "P37"), m_p40(*this, "P40"), m_p41(*this, "P41"), m_p42(*this, "P42"), m_p43(*this, "P43"), m_p44(*this, "P44"), m_p45(*this, "P45"), m_p46(*this, "P46"), m_p47(*this, "P47"), m_joy0(*this, "IKBD_JOY0"), m_joy1(*this, "IKBD_JOY1"), m_mousex(*this, "IKBD_MOUSEX"), m_mousey(*this, "IKBD_MOUSEY"), m_config(*this, "config"), m_acia_ikbd_irq(1), m_acia_midi_irq(1), m_ikbd_mouse_x(0), m_ikbd_mouse_y(0), m_ikbd_mouse_px(IKBD_MOUSE_PHASE_STATIC), m_ikbd_mouse_py(IKBD_MOUSE_PHASE_STATIC), m_ikbd_mouse_pc(0), m_ikbd_joy(1), m_monochrome(1), m_palette(*this, "palette"), m_screen(*this, "screen"), m_led(*this, "led1") { } required_device m_maincpu; required_device m_fdc; required_device_array m_floppy; required_device m_mfp; required_device m_acia0; required_device m_acia1; required_device m_centronics; required_device m_cart; required_device m_ram; required_device m_rs232; required_ioport m_p31; required_ioport m_p32; required_ioport m_p33; required_ioport m_p34; required_ioport m_p35; required_ioport m_p36; required_ioport m_p37; required_ioport m_p40; required_ioport m_p41; required_ioport m_p42; required_ioport m_p43; required_ioport m_p44; required_ioport m_p45; required_ioport m_p46; required_ioport m_p47; optional_ioport m_joy0; optional_ioport m_joy1; optional_ioport m_mousex; optional_ioport m_mousey; optional_ioport m_config; uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); // video DECLARE_READ8_MEMBER( shifter_base_r ); DECLARE_READ8_MEMBER( shifter_counter_r ); DECLARE_READ8_MEMBER( shifter_sync_r ); DECLARE_READ16_MEMBER( shifter_palette_r ); DECLARE_READ8_MEMBER( shifter_mode_r ); DECLARE_WRITE8_MEMBER( shifter_base_w ); DECLARE_WRITE8_MEMBER( shifter_sync_w ); DECLARE_WRITE16_MEMBER( shifter_palette_w ); DECLARE_WRITE8_MEMBER( shifter_mode_w ); DECLARE_READ16_MEMBER( blitter_halftone_r ); DECLARE_READ16_MEMBER( blitter_src_inc_x_r ); DECLARE_READ16_MEMBER( blitter_src_inc_y_r ); DECLARE_READ16_MEMBER( blitter_src_r ); DECLARE_READ16_MEMBER( blitter_end_mask_r ); DECLARE_READ16_MEMBER( blitter_dst_inc_x_r ); DECLARE_READ16_MEMBER( blitter_dst_inc_y_r ); DECLARE_READ16_MEMBER( blitter_dst_r ); DECLARE_READ16_MEMBER( blitter_count_x_r ); DECLARE_READ16_MEMBER( blitter_count_y_r ); DECLARE_READ16_MEMBER( blitter_op_r ); DECLARE_READ16_MEMBER( blitter_ctrl_r ); DECLARE_WRITE16_MEMBER( blitter_halftone_w ); DECLARE_WRITE16_MEMBER( blitter_src_inc_x_w ); DECLARE_WRITE16_MEMBER( blitter_src_inc_y_w ); DECLARE_WRITE16_MEMBER( blitter_src_w ); DECLARE_WRITE16_MEMBER( blitter_end_mask_w ); DECLARE_WRITE16_MEMBER( blitter_dst_inc_x_w ); DECLARE_WRITE16_MEMBER( blitter_dst_inc_y_w ); DECLARE_WRITE16_MEMBER( blitter_dst_w ); DECLARE_WRITE16_MEMBER( blitter_count_x_w ); DECLARE_WRITE16_MEMBER( blitter_count_y_w ); DECLARE_WRITE16_MEMBER( blitter_op_w ); DECLARE_WRITE16_MEMBER( blitter_ctrl_w ); void mouse_tick(); inline pen_t shift_mode_0(); inline pen_t shift_mode_1(); inline pen_t shift_mode_2(); void shifter_tick(); inline void shifter_load(); inline void draw_pixel(int x, int y, u32 pen); void glue_tick(); void set_screen_parameters(); void blitter_source(); uint16_t blitter_hop(); void blitter_op(uint16_t s, uint32_t dstaddr, uint16_t mask); void blitter_tick(); // driver DECLARE_READ16_MEMBER( fdc_data_r ); DECLARE_WRITE16_MEMBER( fdc_data_w ); DECLARE_READ16_MEMBER( dma_status_r ); DECLARE_WRITE16_MEMBER( dma_mode_w ); DECLARE_READ8_MEMBER( dma_counter_r ); DECLARE_WRITE8_MEMBER( dma_base_w ); DECLARE_READ8_MEMBER( mmu_r ); DECLARE_WRITE8_MEMBER( mmu_w ); DECLARE_READ16_MEMBER( berr_r ); DECLARE_WRITE16_MEMBER( berr_w ); DECLARE_READ8_MEMBER( ikbd_port1_r ); DECLARE_READ8_MEMBER( ikbd_port2_r ); DECLARE_WRITE8_MEMBER( ikbd_port2_w ); DECLARE_WRITE8_MEMBER( ikbd_port3_w ); DECLARE_READ8_MEMBER( ikbd_port4_r ); DECLARE_WRITE8_MEMBER( ikbd_port4_w ); DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); DECLARE_WRITE8_MEMBER( psg_pa_w ); DECLARE_WRITE_LINE_MEMBER( ikbd_tx_w ); DECLARE_WRITE_LINE_MEMBER( acia_ikbd_irq_w ); DECLARE_WRITE_LINE_MEMBER( acia_midi_irq_w ); DECLARE_READ8_MEMBER( mfp_gpio_r ); DECLARE_WRITE_LINE_MEMBER( mfp_tdo_w ); DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); void toggle_dma_fifo(); void flush_dma_fifo(); void fill_dma_fifo(); void fdc_dma_transfer(); void configure_memory(); void state_save(); /* memory state */ uint8_t m_mmu; /* keyboard state */ int m_acia_ikbd_irq; int m_acia_midi_irq; uint16_t m_ikbd_keylatch; uint8_t m_ikbd_mouse; uint8_t m_ikbd_mouse_x; uint8_t m_ikbd_mouse_y; uint8_t m_ikbd_mouse_px; uint8_t m_ikbd_mouse_py; uint8_t m_ikbd_mouse_pc; int m_ikbd_tx; int m_ikbd_joy; int m_midi_tx; /* floppy state */ uint32_t m_dma_base; uint16_t m_dma_error; uint16_t m_fdc_mode; uint8_t m_fdc_sectors; uint16_t m_fdc_fifo[2][8]; int m_fdc_fifo_sel; int m_fdc_fifo_index; int m_fdc_fifo_msb; int m_fdc_fifo_empty[2]; int m_fdc_dmabytes; /* shifter state */ uint32_t m_shifter_base; uint32_t m_shifter_ofs; uint8_t m_shifter_sync; uint8_t m_shifter_mode; uint16_t m_shifter_palette[16]; uint16_t m_shifter_rr[4]; uint16_t m_shifter_ir[4]; int m_shifter_bitplane; int m_shifter_shift; int m_shifter_h; int m_shifter_v; int m_shifter_de; int m_shifter_x_start; int m_shifter_x_end; int m_shifter_y_start; int m_shifter_y_end; int m_shifter_hblank_start; int m_shifter_vblank_start; /* blitter state */ uint16_t m_blitter_halftone[16]; int16_t m_blitter_src_inc_x; int16_t m_blitter_src_inc_y; int16_t m_blitter_dst_inc_x; int16_t m_blitter_dst_inc_y; uint32_t m_blitter_src; uint32_t m_blitter_dst; uint16_t m_blitter_endmask1; uint16_t m_blitter_endmask2; uint16_t m_blitter_endmask3; uint16_t m_blitter_xcount; uint16_t m_blitter_ycount; uint16_t m_blitter_xcountl; uint8_t m_blitter_hop; uint8_t m_blitter_op; uint8_t m_blitter_ctrl; uint8_t m_blitter_skew; uint32_t m_blitter_srcbuf; /* timers */ emu_timer *m_mouse_timer; emu_timer *m_glue_timer; emu_timer *m_shifter_timer; bitmap_rgb32 m_bitmap; DECLARE_FLOPPY_FORMATS(floppy_formats); IRQ_CALLBACK_MEMBER(atarist_int_ack); int m_monochrome; required_device m_palette; required_device m_screen; DECLARE_WRITE_LINE_MEMBER( write_monochrome ); void st(machine_config &config); void ikbd_io_map(address_map &map); void ikbd_map(address_map &map); void st_map(address_map &map); protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void machine_start() override; virtual void video_start() override; output_finder<> m_led; }; class megast_state : public st_state { public: megast_state(const machine_config &mconfig, device_type type, const char *tag) : st_state(mconfig, type, tag) { } DECLARE_READ16_MEMBER( fpu_r ); DECLARE_WRITE16_MEMBER( fpu_w ); void megast(machine_config &config); void megast_map(address_map &map); }; class ste_state : public st_state { public: enum { TIMER_DMASOUND_TICK, TIMER_MICROWIRE_TICK }; ste_state(const machine_config &mconfig, device_type type, const char *tag) : st_state(mconfig, type, tag), m_lmc1992(*this, LMC1992_TAG) { } optional_device m_lmc1992; DECLARE_READ8_MEMBER( shifter_base_low_r ); DECLARE_WRITE8_MEMBER( shifter_base_low_w ); DECLARE_READ8_MEMBER( shifter_counter_r ); DECLARE_WRITE8_MEMBER( shifter_counter_w ); DECLARE_WRITE16_MEMBER( shifter_palette_w ); DECLARE_READ8_MEMBER( shifter_lineofs_r ); DECLARE_WRITE8_MEMBER( shifter_lineofs_w ); DECLARE_READ8_MEMBER( shifter_pixelofs_r ); DECLARE_WRITE8_MEMBER( shifter_pixelofs_w ); DECLARE_READ8_MEMBER( sound_dma_control_r ); DECLARE_READ8_MEMBER( sound_dma_base_r ); DECLARE_READ8_MEMBER( sound_dma_counter_r ); DECLARE_READ8_MEMBER( sound_dma_end_r ); DECLARE_READ8_MEMBER( sound_mode_r ); DECLARE_WRITE8_MEMBER( sound_dma_control_w ); DECLARE_WRITE8_MEMBER( sound_dma_base_w ); DECLARE_WRITE8_MEMBER( sound_dma_end_w ); DECLARE_WRITE8_MEMBER( sound_mode_w ); DECLARE_READ16_MEMBER( microwire_data_r ); DECLARE_WRITE16_MEMBER( microwire_data_w ); DECLARE_READ16_MEMBER( microwire_mask_r ); DECLARE_WRITE16_MEMBER( microwire_mask_w ); DECLARE_WRITE_LINE_MEMBER( write_monochrome ); void dmasound_set_state(int level); void dmasound_tick(); void microwire_shift(); void microwire_tick(); void state_save(); // shifter state uint8_t m_shifter_lineofs; uint8_t m_shifter_pixelofs; /* microwire state */ uint16_t m_mw_data; uint16_t m_mw_mask; int m_mw_shift; /* DMA sound state */ uint32_t m_dmasnd_base; uint32_t m_dmasnd_end; uint32_t m_dmasnd_cntr; uint32_t m_dmasnd_baselatch; uint32_t m_dmasnd_endlatch; uint8_t m_dmasnd_ctrl; uint8_t m_dmasnd_mode; uint8_t m_dmasnd_fifo[8]; uint8_t m_dmasnd_samples; int m_dmasnd_active; // timers emu_timer *m_microwire_timer; emu_timer *m_dmasound_timer; void falcon40(machine_config &config); void tt030(machine_config &config); void falcon(machine_config &config); void ste(machine_config &config); void ste_map(address_map &map); protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void machine_start() override; virtual void video_start() override; }; class megaste_state : public ste_state { public: megaste_state(const machine_config &mconfig, device_type type, const char *tag) : ste_state(mconfig, type, tag) { } DECLARE_READ16_MEMBER( cache_r ); DECLARE_WRITE16_MEMBER( cache_w ); uint16_t m_cache; void megaste(machine_config &config); void megaste_map(address_map &map); protected: virtual void machine_start() override; }; class stbook_state : public ste_state { public: stbook_state(const machine_config &mconfig, device_type type, const char *tag) : ste_state(mconfig, type, tag), m_sw400(*this, "SW400") { } required_ioport m_sw400; DECLARE_READ16_MEMBER( config_r ); DECLARE_WRITE16_MEMBER( lcd_control_w ); DECLARE_WRITE8_MEMBER( psg_pa_w ); DECLARE_READ8_MEMBER( mfp_gpio_r ); void stbook_map(address_map &map); protected: virtual void machine_start() override; virtual void video_start() override; }; #endif // MAME_INCLUDES_ATARI_ST_H