// license:GPL-2.0+ // copyright-holders:Kevin Thacker /***************************************************************************** * * includes/spectrum.h * ****************************************************************************/ #ifndef __SPECTRUM_H__ #define __SPECTRUM_H__ #include "machine/upd765.h" #include "sound/speaker.h" #include "machine/ram.h" #include "imagedev/snapquik.h" #include "imagedev/cassette.h" #include "bus/generic/slot.h" #include "bus/generic/carts.h" #include "machine/spec_snqk.h" /* Spectrum crystals */ #define X1 XTAL_14MHz // Main clock (48k Spectrum) #define X1_128_AMSTRAD 35469000 // Main clock (Amstrad 128K model, +2A?) #define X1_128_SINCLAIR 17734475 // Main clock (Sinclair 128K model) #define X2 XTAL_4_433619MHz // PAL color subcarrier /* Spectrum screen size in pixels */ #define SPEC_UNSEEN_LINES 16 /* Non-visible scanlines before first border line. Some of these may be vertical retrace. */ #define SPEC_TOP_BORDER 48 /* Number of border lines before actual screen */ #define SPEC_DISPLAY_YSIZE 192 /* Vertical screen resolution */ #define SPEC_BOTTOM_BORDER 56 /* Number of border lines at bottom of screen */ #define SPEC_SCREEN_HEIGHT (SPEC_TOP_BORDER + SPEC_DISPLAY_YSIZE + SPEC_BOTTOM_BORDER) #define SPEC_LEFT_BORDER 48 /* Number of left hand border pixels */ #define SPEC_DISPLAY_XSIZE 256 /* Horizontal screen resolution */ #define SPEC_RIGHT_BORDER 48 /* Number of right hand border pixels */ #define SPEC_SCREEN_WIDTH (SPEC_LEFT_BORDER + SPEC_DISPLAY_XSIZE + SPEC_RIGHT_BORDER) #define SPEC_LEFT_BORDER_CYCLES 24 /* Cycles to display left hand border */ #define SPEC_DISPLAY_XSIZE_CYCLES 128 /* Horizontal screen resolution */ #define SPEC_RIGHT_BORDER_CYCLES 24 /* Cycles to display right hand border */ #define SPEC_RETRACE_CYCLES 48 /* Cycles taken for horizonal retrace */ #define SPEC_CYCLES_PER_LINE 224 /* Number of cycles to display a single line */ struct EVENT_LIST_ITEM { /* driver defined ID for this write */ int Event_ID; /* driver defined data for this write */ int Event_Data; /* time at which this write occurred */ int Event_Time; }; class spectrum_state : public driver_device { public: spectrum_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_video_ram(*this, "video_ram"), m_maincpu(*this, "maincpu"), m_cassette(*this, "cassette"), m_ram(*this, RAM_TAG), m_speaker(*this, "speaker"), m_cart(*this, "cartslot"), m_dock(*this, "dockslot"), m_upd765(*this, "upd765"), m_upd765_0(*this, "upd765:0"), m_upd765_1(*this, "upd765:1"), m_io_line0(*this, "LINE0"), m_io_line1(*this, "LINE1"), m_io_line2(*this, "LINE2"), m_io_line3(*this, "LINE3"), m_io_line4(*this, "LINE4"), m_io_line5(*this, "LINE5"), m_io_line6(*this, "LINE6"), m_io_line7(*this, "LINE7"), m_io_nmi(*this, "NMI"), m_io_config(*this, "CONFIG"), m_io_joy_intf(*this, "JOY_INTF"), m_io_kempston(*this, "KEMPSTON"), m_io_fuller(*this, "FULLER"), m_io_mikrogen(*this, "MIKROGEN"), m_io_plus0(*this, "PLUS0"), m_io_plus1(*this, "PLUS1"), m_io_plus2(*this, "PLUS2"), m_io_plus3(*this, "PLUS3"), m_io_plus4(*this, "PLUS4") { } int m_port_fe_data; int m_port_7ffd_data; int m_port_1ffd_data; /* scorpion and plus3 */ int m_port_ff_data; /* Display enhancement control */ int m_port_f4_data; /* Horizontal Select Register */ int m_floppy; /* video support */ int m_frame_invert_count; int m_frame_number; /* Used for handling FLASH 1 */ int m_flash_invert; optional_shared_ptr m_video_ram; UINT8 *m_screen_location; int m_ROMSelection; EVENT_LIST_ITEM *m_pCurrentItem; int m_NumEvents; int m_TotalEvents; char *m_pEventListBuffer; int m_LastFrameStartTime; int m_CyclesPerFrame; UINT8 *m_ram_0000; UINT8 m_ram_disabled_by_beta; DECLARE_WRITE8_MEMBER(spectrum_port_fe_w); DECLARE_READ8_MEMBER(spectrum_port_fe_r); DECLARE_READ8_MEMBER(spectrum_port_1f_r); DECLARE_READ8_MEMBER(spectrum_port_7f_r); DECLARE_READ8_MEMBER(spectrum_port_df_r); DECLARE_READ8_MEMBER(spectrum_port_ula_r); DECLARE_WRITE8_MEMBER(spectrum_128_port_7ffd_w); DECLARE_READ8_MEMBER(spectrum_128_ula_r); DECLARE_WRITE8_MEMBER(spectrum_plus3_port_3ffd_w); DECLARE_READ8_MEMBER(spectrum_plus3_port_3ffd_r); DECLARE_READ8_MEMBER(spectrum_plus3_port_2ffd_r); DECLARE_WRITE8_MEMBER(spectrum_plus3_port_7ffd_w); DECLARE_WRITE8_MEMBER(spectrum_plus3_port_1ffd_w); DECLARE_READ8_MEMBER(ts2068_port_f4_r); DECLARE_WRITE8_MEMBER(ts2068_port_f4_w); DECLARE_READ8_MEMBER(ts2068_port_ff_r); DECLARE_WRITE8_MEMBER(ts2068_port_ff_w); DECLARE_WRITE8_MEMBER(tc2048_port_ff_w); DECLARE_DRIVER_INIT(spectrum); DECLARE_DRIVER_INIT(plus2); DECLARE_DRIVER_INIT(plus3); DECLARE_MACHINE_RESET(spectrum); DECLARE_VIDEO_START(spectrum); DECLARE_PALETTE_INIT(spectrum); DECLARE_MACHINE_RESET(tc2048); DECLARE_VIDEO_START(spectrum_128); DECLARE_MACHINE_RESET(spectrum_128); DECLARE_MACHINE_RESET(spectrum_plus3); DECLARE_MACHINE_RESET(ts2068); DECLARE_VIDEO_START(ts2068); UINT32 screen_update_spectrum(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_tc2048(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_ts2068(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void screen_eof_spectrum(screen_device &screen, bool state); void screen_eof_timex(screen_device &screen, bool state); INTERRUPT_GEN_MEMBER(spec_interrupt); DECLARE_DEVICE_IMAGE_LOAD_MEMBER( spectrum_cart ); // for timex cart only DECLARE_DEVICE_IMAGE_LOAD_MEMBER( timex_cart ); int m_dock_cart_type, m_ram_chunks; memory_region *m_dock_crt; unsigned int m_previous_border_x, m_previous_border_y; bitmap_ind16 m_border_bitmap; unsigned int m_previous_screen_x, m_previous_screen_y; bitmap_ind16 m_screen_bitmap; DECLARE_FLOPPY_FORMATS( floppy_formats ); void spectrum_128_update_memory(); void spectrum_plus3_update_memory(); void ts2068_update_memory(); DECLARE_SNAPSHOT_LOAD_MEMBER( spectrum ); DECLARE_QUICKLOAD_LOAD_MEMBER( spectrum ); required_device m_maincpu; protected: required_device m_cassette; required_device m_ram; required_device m_speaker; optional_device m_cart; optional_device m_dock; optional_device m_upd765; optional_device m_upd765_0; optional_device m_upd765_1; // Regular spectrum ports; marked as optional because of other subclasses optional_ioport m_io_line0; optional_ioport m_io_line1; optional_ioport m_io_line2; optional_ioport m_io_line3; optional_ioport m_io_line4; optional_ioport m_io_line5; optional_ioport m_io_line6; optional_ioport m_io_line7; optional_ioport m_io_nmi; optional_ioport m_io_config; optional_ioport m_io_joy_intf; optional_ioport m_io_kempston; optional_ioport m_io_fuller; optional_ioport m_io_mikrogen; // Plus ports optional_ioport m_io_plus0; optional_ioport m_io_plus1; optional_ioport m_io_plus2; optional_ioport m_io_plus3; optional_ioport m_io_plus4; void spectrum_UpdateBorderBitmap(); void spectrum_UpdateScreenBitmap(bool eof = false); inline unsigned char get_display_color(unsigned char color, int invert); inline void spectrum_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color); void ts2068_hires_scanline(bitmap_ind16 &bitmap, int y, int borderlines); void ts2068_64col_scanline(bitmap_ind16 &bitmap, int y, int borderlines, unsigned short inkcolor); void ts2068_lores_scanline(bitmap_ind16 &bitmap, int y, int borderlines, int screen); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; /*----------- defined in drivers/spectrum.c -----------*/ INPUT_PORTS_EXTERN( spectrum ); INPUT_PORTS_EXTERN( spec_plus ); MACHINE_CONFIG_EXTERN( spectrum ); #endif /* __SPECTRUM_H__ */