summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/sinclair/tsconf.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/sinclair/tsconf.h')
-rw-r--r--src/mame/sinclair/tsconf.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/src/mame/sinclair/tsconf.h b/src/mame/sinclair/tsconf.h
new file mode 100644
index 00000000000..8810cc6aacf
--- /dev/null
+++ b/src/mame/sinclair/tsconf.h
@@ -0,0 +1,251 @@
+// license:BSD-3-Clause
+// copyright-holders:Andrei I. Holub
+/*****************************************************************************
+ *
+ * includes/tsconfig.h
+ *
+ ****************************************************************************/
+#ifndef MAME_SINCLAIR_TSCONF_H
+#define MAME_SINCLAIR_TSCONF_H
+
+#pragma once
+
+#include "spec128.h"
+
+#include "glukrs.h"
+#include "tsconfdma.h"
+
+#include "beta_m.h"
+#include "machine/pckeybrd.h"
+#include "machine/spi_sdcard.h"
+#include "sound/ay8910.h"
+#include "sound/dac.h"
+#include "tilemap.h"
+
+
+class tsconf_state : public spectrum_128_state
+{
+public:
+ tsconf_state(const machine_config &mconfig, device_type type, const char *tag)
+ : spectrum_128_state(mconfig, type, tag)
+ , m_bank0_rom(*this, "bank0_rom")
+ , m_tiles_raw(*this, "tiles%u_raw", 0U, 64U * 64 * 8 * 8, ENDIANNESS_LITTLE)
+ , m_sprites_raw(*this, "sprites_raw", 64U * 64 * 8 * 8, ENDIANNESS_LITTLE)
+ , m_keyboard(*this, "pc_keyboard")
+ , m_io_mouse(*this, "mouse_input%u", 1U)
+ , m_beta(*this, BETA_DISK_TAG)
+ , m_dma(*this, "dma")
+ , m_sdcard(*this, "sdcard")
+ , m_glukrs(*this, "glukrs")
+ , m_palette(*this, "palette")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_cram(*this, "cram")
+ , m_sfile(*this, "sfile")
+ , m_dac(*this, "dac")
+ , m_ay(*this, "ay%u", 0U)
+ , m_mod_ay(*this, "MOD_AY")
+ {
+ }
+
+ void tsconf(machine_config &config);
+
+ static constexpr u16 with_hblank(u16 pixclocks) { return 88 + pixclocks; }
+ static constexpr u16 with_vblank(u16 pixclocks) { return 32 + pixclocks; }
+
+protected:
+ virtual void video_start() override ATTR_COLD;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+ virtual void device_post_load() override ATTR_COLD;
+
+ virtual TIMER_CALLBACK_MEMBER(irq_off) override;
+ TIMER_CALLBACK_MEMBER(irq_frame);
+ TIMER_CALLBACK_MEMBER(irq_scanline);
+
+private:
+ enum gluk_ext : u8
+ {
+ CONF_VERSION = 0x00,
+ BOOTLOADER_VERSION = 0x01,
+ PS2KEYBOARDS_LOG = 0x02,
+ RDCFG = 0x03,
+ CONFIG = 0x0e,
+ SPIFL = 0x10,
+ };
+
+ enum tilemaps : u8
+ {
+ TM_TS_CHAR = 0x00,
+ TM_TILES0,
+ TM_TILES1,
+ TM_SPRITES,
+ TM_ZX_CHAR,
+ };
+
+ enum tsconf_regs : u8
+ {
+ V_CONFIG = 0x00,
+ V_PAGE = 0x01,
+
+ G_X_OFFS_L = 0x02,
+ G_X_OFFS_H = 0x03,
+ G_Y_OFFS_L = 0x04,
+ G_Y_OFFS_H = 0x05,
+
+ TS_CONFIG = 0x06,
+ PAL_SEL = 0x07,
+
+ BORDER = 0x0f,
+ PAGE0 = 0x10,
+ PAGE1 = 0x11,
+ PAGE2 = 0x12,
+ PAGE3 = 0x13,
+
+ FMAPS = 0x15,
+ T_MAP_PAGE = 0x16,
+ T0_G_PAGE = 0x17,
+ T1_G_PAGE = 0x18,
+ SG_PAGE = 0x19,
+
+ DMAS_ADDRESS_L = 0x1a,
+ DMAS_ADDRESS_H = 0x1b,
+ DMAS_ADDRESS_X = 0x1c,
+ DMAD_ADDRESS_L = 0x1d,
+ DMAD_ADDRESS_H = 0x1e,
+ DMAD_ADDRESS_X = 0x1f,
+
+ SYS_CONFIG = 0x20,
+ MEM_CONFIG = 0x21,
+ HS_INT = 0x22,
+ VS_INT_L = 0x23,
+ VS_INT_H = 0x24,
+
+ DMA_WAIT_PORT_DEV = 0x25,
+ DMA_LEN = 0x26,
+ DMA_CTRL = 0x27,
+ DMA_NUM_L = 0x28,
+ FDD_VIRT = 0x29,
+ INT_MASK = 0x2a,
+ CACHE_CONFIG = 0x2b,
+ DMA_NUM_H = 0x2c,
+
+ T0_X_OFFSET_L = 0x40,
+ T0_X_OFFSET_H = 0x41,
+ T0_Y_OFFSET_L = 0x42,
+ T0_Y_OFFSET_H = 0x43,
+ T1_X_OFFSET_L = 0x44,
+ T1_X_OFFSET_H = 0x45,
+ T1_Y_OFFSET_L = 0x46,
+ T1_Y_OFFSET_H = 0x47
+ };
+
+ struct sprite_data
+ {
+ u32 code;
+ u32 color;
+ int flipx;
+ int flipy;
+ s32 destx;
+ s32 desty;
+ u32 pmask;
+ };
+
+ void update_frame_timer();
+ emu_timer *m_frame_irq_timer = nullptr;
+ emu_timer *m_scanline_irq_timer = nullptr;
+
+ INTERRUPT_GEN_MEMBER(tsconf_vblank_interrupt);
+ IRQ_CALLBACK_MEMBER(irq_vector);
+ u8 m_int_mask;
+
+ DECLARE_VIDEO_START(tsconf);
+ TILE_GET_INFO_MEMBER(get_tile_info_txt);
+ template <u8 Layer>
+ TILE_GET_INFO_MEMBER(get_tile_info_16c);
+
+ virtual u8 get_border_color(u16 hpos = ~0, u16 vpos = ~0) override;
+ u32 get_vpage_offset();
+ virtual rectangle get_screen_area() override;
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void tsconf_update_screen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void tsconf_draw_zx(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void tsconf_draw_txt(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void tsconf_draw_gfx(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void tsconf_update_video_mode();
+ void copy_tiles_to_raw(const u8 *tiles_src, u8 *raw_target);
+
+ u8 tsconf_port_xx1f_r(offs_t offset);
+ void tsconf_port_7ffd_w(u8 data);
+ void tsconf_ula_w(offs_t offset, u8 data);
+ u8 tsconf_port_xxaf_r(offs_t reg);
+ void tsconf_port_xxaf_w(offs_t reg, u8 data);
+ u8 tsconf_port_77_zctr_r();
+ void tsconf_port_77_zctr_w(u8 data);
+ u8 tsconf_port_57_zctr_r();
+ void tsconf_port_57_zctr_w(u8 data);
+ void tsconf_spi_miso_w(u8 data);
+ u8 tsconf_port_f7_r(offs_t offset);
+ void tsconf_port_f7_w(offs_t offset, u8 data);
+ void tsconf_ay_address_w(u8 data);
+
+ void tsconf_update_bank0();
+ u8 beta_neutral_r(offs_t offset);
+ u8 beta_enable_r(offs_t offset);
+ u8 beta_disable_r(offs_t offset);
+
+ void tsconf_io(address_map &map) ATTR_COLD;
+ void tsconf_mem(address_map &map) ATTR_COLD;
+ void tsconf_switch(address_map &map) ATTR_COLD;
+
+ u8 mem_bank_read(u8 bank, offs_t offset);
+ template <u8 Bank>
+ void tsconf_bank_w(offs_t offset, u8 data);
+ void ram_bank_write(u8 bank, offs_t offset, u8 data);
+ void ram_page_write(u8 page, offs_t offset, u8 data);
+ void cram_write(u16 offset, u8 data);
+ void cram_write16(offs_t offset, u16 data);
+ void sfile_write16(offs_t offset, u16 data);
+ void ram_write16(offs_t offset, u16 data);
+ u16 ram_read16(offs_t offset);
+ u16 spi_read16();
+ void dma_ready(int line);
+
+ std::map<tsconf_regs, u8> m_scanline_delayed_regs_update;
+ u8 m_regs[0x100];
+
+ memory_view m_bank0_rom;
+ memory_share_array_creator<u8, 2> m_tiles_raw;
+ memory_share_creator<u8> m_sprites_raw;
+
+ required_device<at_keyboard_device> m_keyboard;
+ required_ioport_array<3> m_io_mouse;
+
+ required_device<beta_disk_device> m_beta;
+ required_device<tsconfdma_device> m_dma;
+ required_device<spi_sdcard_device> m_sdcard;
+ u8 m_zctl_di = 0;
+ u8 m_zctl_cs = 0;
+
+ required_device<glukrs_device> m_glukrs;
+ gluk_ext m_port_f7_ext{};
+
+ s16 m_gfx_y_frame_offset = 0;
+ required_device<device_palette_interface> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+ tilemap_t *m_ts_tilemap[3]{};
+ required_device<ram_device> m_cram;
+ required_device<ram_device> m_sfile;
+ std::vector<sprite_data> m_sprites_cache;
+
+ required_device<dac_byte_interface> m_dac;
+ required_device_array<ym2149_device, 2> m_ay;
+ u8 m_ay_selected;
+ required_ioport m_mod_ay;
+};
+
+/*----------- defined in drivers/tsconf.c -----------*/
+
+INPUT_PORTS_EXTERN(tsconf);
+
+#endif // MAME_SINCLAIR_TSCONF_H