summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/machine.lua22
-rw-r--r--src/mame/sinclair/atm.cpp478
-rw-r--r--src/mame/sinclair/glukrs.cpp (renamed from src/devices/machine/glukrs.cpp)0
-rw-r--r--src/mame/sinclair/glukrs.h (renamed from src/devices/machine/glukrs.h)6
-rw-r--r--src/mame/sinclair/tsconf.h4
-rw-r--r--src/mame/sinclair/tsconf_m.cpp32
-rw-r--r--src/mame/sinclair/tsconfdma.cpp (renamed from src/devices/machine/tsconfdma.cpp)0
-rw-r--r--src/mame/sinclair/tsconfdma.h (renamed from src/devices/machine/tsconfdma.h)6
8 files changed, 412 insertions, 136 deletions
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua
index a36480d2077..fd039000531 100644
--- a/scripts/src/machine.lua
+++ b/scripts/src/machine.lua
@@ -4944,28 +4944,6 @@ end
---------------------------------------------------
--
---@src/devices/machine/tsconfdma.h,MACHINES["TSCONF_DMA"] = true
----------------------------------------------------
-if (MACHINES["TSCONF_DMA"]~=null) then
- files {
- MAME_DIR .. "src/devices/machine/tsconfdma.cpp",
- MAME_DIR .. "src/devices/machine/tsconfdma.h",
- }
-end
-
----------------------------------------------------
---
---@src/devices/machine/glukrs.h,MACHINES["GLUKRS"] = true
----------------------------------------------------
-if (MACHINES["GLUKRS"]~=null) then
- files {
- MAME_DIR .. "src/devices/machine/glukrs.cpp",
- MAME_DIR .. "src/devices/machine/glukrs.h",
- }
-end
-
----------------------------------------------------
---
--@src/devices/machine/bitmap_printer.h,MACHINES["BITMAP_PRINTER"] = true
---------------------------------------------------
if (MACHINES["BITMAP_PRINTER"]~=null) then
diff --git a/src/mame/sinclair/atm.cpp b/src/mame/sinclair/atm.cpp
index f4a36e54f36..a1eb960ffa9 100644
--- a/src/mame/sinclair/atm.cpp
+++ b/src/mame/sinclair/atm.cpp
@@ -4,7 +4,17 @@
MicroART ATM (clone of Spectrum)
-Not working because of banking issues.
+NOTES:
+ Current implementation based on ATM Turbo 2+. If anybody wants to validate ATM1, existing
+ code must be moved to atmtb2_state not modified.
+
+TODO:
+ * ports read
+ * ATM2+ (compare to ATM2) has only 1M RAM vs 512K
+ * Mem masks are hardcoded to 1M RAM, 64K ROM
+ * CMOS
+ * better handling of SHADOW ports
+ * validate screen timings
*******************************************************************************************/
@@ -13,118 +23,379 @@ Not working because of banking issues.
#include "specpls3.h"
#include "beta_m.h"
-
+#include "bus/centronics/ctronics.h"
#include "sound/ay8910.h"
-
namespace {
+#define LOG_MEM (1U << 1)
+#define LOG_VIDEO (1U << 2)
+#define LOG_WARN (1U << 3)
+
+#define VERBOSE ( /*LOG_MEM | LOG_VIDEO |*/ LOG_WARN )
+#include "logmacro.h"
+
+#define LOGMEM(...) LOGMASKED(LOG_MEM, __VA_ARGS__)
+#define LOGVIDEO(...) LOGMASKED(LOG_VIDEO, __VA_ARGS__)
+#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
+
+static constexpr u8 RAM_MASK = 0x40;
+static constexpr u8 DOS7FFD_MASK = 0x80;
+
class atm_state : public spectrum_128_state
{
public:
atm_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_128_state(mconfig, type, tag)
- , m_bank1(*this, "bank1")
- , m_bank2(*this, "bank2")
- , m_bank3(*this, "bank3")
- , m_bank4(*this, "bank4")
+ , m_bank_view0(*this, "bank_view0")
+ , m_bank_view1(*this, "bank_view1")
+ , m_bank_view2(*this, "bank_view2")
+ , m_bank_view3(*this, "bank_view3")
+ , m_bank_rom(*this, "bank_rom%u", 0U)
+ , m_char_rom(*this, "charrom")
, m_beta(*this, BETA_DISK_TAG)
+ , m_centronics(*this, "centronics")
+ , m_palette(*this, "palette")
{ }
void atm(machine_config &config);
void atmtb2(machine_config &config);
protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ void machine_start() override;
+ void machine_reset() override;
+ void video_start() override;
+
+ rectangle get_screen_area() override;
+ u8 get_border_color(u16 hpos, u16 vpos) override;
+ void spectrum_update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
private:
- void atm_port_7ffd_w(uint8_t data);
- uint8_t beta_neutral_r(offs_t offset);
- uint8_t beta_enable_r(offs_t offset);
- uint8_t beta_disable_r(offs_t offset);
+ u8 beta_neutral_r(offs_t offset);
+ u8 beta_enable_r(offs_t offset);
+ u8 beta_disable_r(offs_t offset);
+
+ void atm_ula_w(offs_t offset, u8 data);
+ void atm_port_ffff_w(offs_t offset, u8 data);
+ void atm_port_ff77_w(offs_t offset, u8 data);
+ void atm_port_fff7_w(offs_t offset, u8 data);
+ void atm_port_7ffd_w(offs_t offset, u8 data);
void atm_io(address_map &map);
void atm_mem(address_map &map);
void atm_switch(address_map &map);
+ void atm_update_video_mode();
+ void atm_update_screen_lo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void atm_update_screen_hi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void atm_update_screen_tx(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void atm_update_memory();
- required_memory_bank m_bank1;
- required_memory_bank m_bank2;
- required_memory_bank m_bank3;
- required_memory_bank m_bank4;
+ memory_view m_bank_view0;
+ memory_view m_bank_view1;
+ memory_view m_bank_view2;
+ memory_view m_bank_view3;
+ required_memory_bank_array<4> m_bank_rom;
+ optional_region_ptr<u8> m_char_rom; // required for ATM2, absent in ATM1
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+
required_device<beta_disk_device> m_beta;
+ required_device<centronics_device> m_centronics;
+ required_device<device_palette_interface> m_palette;
+
+ bool is_shadow_active() { return m_beta->is_active(); }
+ u8 &pen_page(u8 bank) { return m_pages_map[BIT(m_port_7ffd_data, 4)][bank]; }
+
+ bool m_pen; // PEN - extended memory manager
+ bool m_cpm;
+ u8 m_pages_map[2][4]; // map: 0,1
- address_space *m_program;
- uint8_t *m_p_ram;
- uint16_t m_rom_selection;
+ bool m_pen2; // palette selector
+ u8 m_rg = 0b011; // 0:320x200lo, 2:640:200hi, 3:256x192zx, 6:80x25txt
+ u8 m_br3;
};
void atm_state::atm_update_memory()
{
- uint8_t *messram = m_ram->pointer();
+ using views_link = std::reference_wrapper<memory_view>;
+ views_link views[] = { m_bank_view0, m_bank_view1, m_bank_view2, m_bank_view3 };
+ LOGMEM("7FFD.%d = %X:", BIT(m_port_7ffd_data, 4), (m_port_7ffd_data & 0x07));
+ for (auto bank = 0; bank < 4 ; bank++)
+ {
+ u8 page = pen_page(bank);
+ if (!m_pen)
+ page = 3;
+
+ if (page & RAM_MASK)
+ {
+ if (page & DOS7FFD_MASK)
+ page = (page & 0xf8) | (m_port_7ffd_data & 0x07);
+ page = page & 0x3f; // TODO size dependent
+ m_bank_ram[bank]->set_entry(page);
+ views[bank].get().disable();
+ LOGMEM(" RA(%X>%X)", m_bank_ram[bank]->entry(), page);
+ }
+ else
+ {
+ if ((page & DOS7FFD_MASK) && !BIT(page, 1))
+ page = (page & ~1) | is_shadow_active();
+ page = page & 0x03; // TODO size dependent
+ m_bank_rom[bank]->set_entry(page);
+ views[bank].get().select(0);
+ LOGMEM(" RO(%X>%X)", m_bank_rom[bank]->entry(), page);
+ }
+ }
+ LOGMEM("\n");
+}
- m_screen_location = messram + ((m_port_7ffd_data & 8) ? (7<<14) : (5<<14));
+void atm_state::atm_ula_w(offs_t offset, u8 data)
+{
+ m_br3 = ~offset & 0x08;
+ spectrum_128_state::spectrum_ula_w(offset, data);
+}
- m_bank4->set_base(messram + ((m_port_7ffd_data & 0x07) * 0x4000));
+void atm_state::atm_port_ffff_w(offs_t offset, u8 data)
+{
+ if(!is_shadow_active())
+ return;
- if (m_beta->started() && m_beta->is_active() && !( m_port_7ffd_data & 0x10 ) )
- m_rom_selection = 3;
+ if (m_pen2)
+ {
+ m_beta->param_w(data);
+ }
else
- /* ROM switching */
- m_rom_selection = BIT(m_port_7ffd_data, 4) ;
-
- /* rom 0 is 128K rom, rom 1 is 48 BASIC */
- m_bank1->set_base(&m_p_ram[0x10000 + (m_rom_selection<<14)]);
+ {
+ // Must read current ULA value (which is doesn't work now) from the BUS.
+ // Good enough as non-border case is too complicated and possibly no software uses it.
+ u8 pen = get_border_color(m_screen->hpos(), m_screen->vpos());
+ m_palette->set_pen_color(pen,
+ (BIT(~data, 1) * 0xaa) | (BIT(~data, 6) * 0x55),
+ (BIT(~data, 4) * 0xaa) | (BIT(~data, 7) * 0x55),
+ (BIT(~data, 0) * 0xaa) | (BIT(~data, 5) * 0x55));
+ }
}
-void atm_state::atm_port_7ffd_w(uint8_t data)
+void atm_state::atm_port_7ffd_w(offs_t offset, u8 data)
{
/* disable paging */
- if (m_port_7ffd_data & 0x20)
+ if (BIT(m_port_7ffd_data, 5))
return;
- /* store new state */
m_port_7ffd_data = data;
+ atm_update_memory();
+
+ m_screen->update_now();
+ m_screen_location = m_ram->pointer() + ((BIT(m_port_7ffd_data, 3) ? 7 : 5) << 14);
+}
+
+void atm_state::atm_port_ff77_w(offs_t offset, u8 data)
+{
+ if (!is_shadow_active())
+ return;
+
+ m_pen = BIT(offset, 8);
+ m_cpm = BIT(offset, 9);
+ m_pen2 = BIT(offset, 14);
+ LOGMASKED(LOG_VIDEO | LOG_MEM, "PEN %s, CPM %s, PEN2 %s\n", m_pen ? "on" : "off", m_cpm ? "off" : "on", m_pen2 ? "off" : "on");
+ atm_update_memory();
+
+ m_maincpu->set_clock(X1_128_SINCLAIR / 10 * (1 << BIT(data, 3))); // 0 - 3.5MHz, 1 - 7MHz
+
+ int rg = data & 0x07;
+ if ( m_rg ^ rg )
+ {
+ m_rg = rg;
+ atm_update_video_mode();
+ }
+}
+
+void atm_state::atm_port_fff7_w(offs_t offset, u8 data)
+{
+ if (!is_shadow_active())
+ return;
+
+ u8 bank = offset >> 14;
+ u8 page = (data & 0xc0) | (~data & 0x3f);
- /* update memory */
+ LOGMEM("PEN%s.%s = %X %s%d: %02X\n", (page | DOS7FFD_MASK) ? "+" : "!", BIT(m_port_7ffd_data, 4), data, (page & RAM_MASK) ? "RAM" : "ROM", bank, page & 0x3f);
+ pen_page(bank) = page;
atm_update_memory();
}
-uint8_t atm_state::beta_neutral_r(offs_t offset)
+rectangle atm_state::get_screen_area()
+{
+ switch (m_rg)
+ {
+ case 0b110: // 80x25txt
+ case 0b010: // 640x200
+ return rectangle { 208, 208 + 639, 76, 76 + 199 };
+ break;
+ case 0b000: // 320x200
+ return rectangle { 104, 104 + 319, 76, 76 + 199 };
+ break;
+ case 0b011: // 256x192
+ default:
+ return rectangle { 136, 136 + 255, 80, 80 + 191 };
+ break;
+ }
+}
+
+u8 atm_state::get_border_color(u16 hpos, u16 vpos)
+{
+ return m_br3 | (m_port_fe_data & 0x07);
+}
+
+void atm_state::atm_update_video_mode()
+{
+ bool zx_scale = BIT(m_rg, 0);
+ bool double_width = BIT(m_rg, 1) && !zx_scale;
+ u8 border_x = (40 - (32 * !zx_scale)) << double_width;
+ u8 border_y = (40 - (4 * !zx_scale));
+ rectangle scr = get_screen_area();
+ m_screen->configure(448 << double_width, 312, {scr.left() - border_x, scr.right() + border_x, scr.top() - border_y, scr.bottom() + border_y}, m_screen->frame_period().as_attoseconds());
+ LOGVIDEO("Video mode: %d\n", m_rg);
+
+ //spectrum_palette(m_palette);
+}
+
+void atm_state::spectrum_update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ switch (m_rg)
+ {
+ case 0b110: // txt
+ atm_update_screen_tx(screen, bitmap, cliprect);
+ break;
+ case 0b010: // 640x200
+ atm_update_screen_hi(screen, bitmap, cliprect);
+ break;
+ case 0b000: // 320x200
+ atm_update_screen_lo(screen, bitmap, cliprect);
+ break;
+ case 0b011: // 256x192
+ default: // + unsupported
+ spectrum_128_state::spectrum_update_screen(screen, bitmap, cliprect);
+ break;
+ }
+}
+
+void atm_state::atm_update_screen_lo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
+ {
+ u16 y = vpos - get_screen_area().top();
+ for (u16 hpos = cliprect.left(); hpos <= cliprect.right(); hpos++)
+ {
+ u16 x = hpos - get_screen_area().left();
+ u8 *scr = m_screen_location;
+ if (!BIT(x, 1)) scr -= 4 << 14;
+ if (BIT(x, 2)) scr += 0x2000;
+ scr += (x >> 3) + y * 40;
+ u8 pix_pair = *scr;
+ pix_pair = x & 1
+ ? (((pix_pair & 0x80) >> 1) | (pix_pair & 0x38)) >> 3
+ : ((pix_pair & 0x40) >> 3) | (pix_pair & 0x07);
+ bitmap.pix(vpos, hpos) = pix_pair;
+ }
+ }
+}
+
+void atm_state::atm_update_screen_hi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
+ {
+ u16 y = vpos - get_screen_area().top();
+ for (u16 hpos = cliprect.left() & 0xfff8; hpos <= cliprect.right();)
+ {
+ u16 x = hpos - get_screen_area().left();
+ u8 *scr = m_screen_location + (x >> 4) + y * 40;
+ if (BIT(x, 3)) scr += 0x2000;
+
+ u8 attr = *(scr - (4 << 14));
+ u8 fg = ((attr & 0x40) >> 3) | (attr & 0x07);
+ u8 bg = (((attr & 0x80) >> 1) | (attr & 0x38)) >> 3;
+
+ u8 chunk = *scr;
+ for (u8 i = 0x80; i; i >>= 1)
+ {
+ bitmap.pix(vpos, hpos++) = (chunk & i) ? fg : bg;
+ }
+ }
+ }
+}
+
+void atm_state::atm_update_screen_tx(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
+ {
+ u16 y = vpos - get_screen_area().top();
+ for (u16 hpos = cliprect.left() & 0xfff8; hpos <= cliprect.right();)
+ {
+ u16 x = hpos - get_screen_area().left();
+ u8 *symb_location = m_screen_location + 0x1c0 + (x >> 4) + ((y >> 3) * 64);
+ u8 *attr_location = symb_location - (4 << 14) + BIT(x, 3);
+ if (BIT(x, 3))
+ symb_location += 0x2000;
+ else
+ attr_location += 0x2000;
+
+ u8 attr = *attr_location;
+ u8 fg = ((attr & 0x40) >> 3) | (attr & 0x07);
+ u8 bg = (((attr & 0x80) >> 1) | (attr & 0x38)) >> 3;
+
+ u8 chunk = *(m_char_rom + (*symb_location << 3) + (y & 0x07));
+ for (u8 i = 0x80; i; i >>= 1)
+ {
+ bitmap.pix(vpos, hpos++) = (chunk & i) ? fg : bg;
+ }
+ }
+ }
+}
+
+u8 atm_state::beta_neutral_r(offs_t offset)
{
- return m_program->read_byte(offset);
+ return m_program.read_byte(offset);
}
-uint8_t atm_state::beta_enable_r(offs_t offset)
+u8 atm_state::beta_enable_r(offs_t offset)
{
- if (m_rom_selection == 1) {
- m_rom_selection = 3;
- if (m_beta->started()) {
+ if (!machine().side_effects_disabled()) {
+ u8 page = pen_page(0);
+ if (!(page & RAM_MASK) && !is_shadow_active()) {
m_beta->enable();
- m_bank1->set_base(&m_p_ram[0x18000]);
+ atm_update_memory();
}
}
- return m_program->read_byte(offset + 0x3d00);
+ return m_program.read_byte(offset + 0x3d00);
}
-uint8_t atm_state::beta_disable_r(offs_t offset)
+u8 atm_state::beta_disable_r(offs_t offset)
{
- if (m_beta->started() && m_beta->is_active()) {
- m_rom_selection = BIT(m_port_7ffd_data, 4);
- m_beta->disable();
- m_bank1->set_base(&m_p_ram[0x10000 + (m_rom_selection<<14)]);
+ if (!machine().side_effects_disabled()) {
+ if (is_shadow_active() && m_cpm) {
+ m_beta->disable();
+ atm_update_memory();
+ }
}
- return m_program->read_byte(offset + 0x4000);
+ return m_program.read_byte(offset + 0x4000);
}
void atm_state::atm_mem(address_map &map)
{
- map(0x0000, 0x3fff).bankr("bank1");
- map(0x4000, 0x7fff).bankrw("bank2");
- map(0x8000, 0xbfff).bankrw("bank3");
- map(0xc000, 0xffff).bankrw("bank4");
+ map(0x0000, 0x3fff).bankrw(m_bank_ram[0]);
+ map(0x0000, 0x3fff).view(m_bank_view0);
+ m_bank_view0[0](0x0000, 0x3fff).bankr(m_bank_rom[0]);
+
+ map(0x4000, 0x7fff).bankrw(m_bank_ram[1]);
+ map(0x4000, 0x7fff).view(m_bank_view1);
+ m_bank_view1[0](0x4000, 0x7fff).bankr(m_bank_rom[1]);
+
+ map(0x8000, 0xbfff).bankrw(m_bank_ram[2]);
+ map(0x8000, 0xbfff).view(m_bank_view2);
+ m_bank_view2[0](0x8000, 0xbfff).bankr(m_bank_rom[2]);
+
+ map(0xc000, 0xffff).bankrw(m_bank_ram[3]);
+ map(0xc000, 0xffff).view(m_bank_view3);
+ m_bank_view3[0](0xc000, 0xffff).bankr(m_bank_rom[3]);
}
void atm_state::atm_io(address_map &map)
@@ -134,9 +405,13 @@ void atm_state::atm_io(address_map &map)
map(0x003f, 0x003f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w));
map(0x005f, 0x005f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w));
map(0x007f, 0x007f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w));
- map(0x00fe, 0x00fe).select(0xff00).rw(FUNC(atm_state::spectrum_ula_r), FUNC(atm_state::spectrum_ula_w));
- map(0x00ff, 0x00ff).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w));
- map(0x4000, 0x4000).mirror(0x3ffd).w(FUNC(atm_state::atm_port_7ffd_w));
+ map(0x00ff, 0x00ff).mirror(0xff00).r(m_beta, FUNC(beta_disk_device::state_r));
+ map(0x00ff, 0x00ff).mirror(0xff00).w(FUNC(atm_state::atm_port_ffff_w));
+ map(0x00f6, 0x00f6).select(0xff08).rw(FUNC(atm_state::spectrum_ula_r), FUNC(atm_state::atm_ula_w));
+ map(0x00fb, 0x00fb).mirror(0xff00).w("cent_data_out", FUNC(output_latch_device::write));
+ map(0x00fd, 0x00fd).mirror(0xff00).w(FUNC(atm_state::atm_port_7ffd_w));
+ map(0x0077, 0x0077).select(0xff00).w(FUNC(atm_state::atm_port_ff77_w));
+ map(0x00f7, 0x00f7).select(0xff00).w(FUNC(atm_state::atm_port_fff7_w));
map(0x8000, 0x8000).mirror(0x3ffd).w("ay8912", FUNC(ay8910_device::data_w));
map(0xc000, 0xc000).mirror(0x3ffd).rw("ay8912", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w));
}
@@ -153,57 +428,72 @@ void atm_state::machine_start()
{
spectrum_128_state::machine_start();
- m_rom_selection = 0;
+ save_item(NAME(m_pen));
+ save_item(NAME(m_cpm));
+ save_item(NAME(m_pages_map));
+ save_item(NAME(m_pen2));
+ save_item(NAME(m_rg));
+ save_item(NAME(m_br3));
+
+ // reconfigure ROMs
+ memory_region *rom = memregion("maincpu");
+ for (auto i = 0; i < 4; i++)
+ m_bank_rom[i]->configure_entries(0, 4*8, rom->base() + 0x10000, 0x4000);
+ m_bank_ram[0]->configure_entries(0, m_ram->size() / 0x4000, m_ram->pointer(), 0x4000);
- save_item(NAME(m_rom_selection));
+ m_maincpu->space(AS_PROGRAM).specific(m_program);
}
void atm_state::machine_reset()
{
- uint8_t *messram = m_ram->pointer();
- m_program = &m_maincpu->space(AS_PROGRAM);
- m_p_ram = memregion("maincpu")->base();
-
- if (m_beta->started())
- m_beta->enable();
-
- memset(messram,0,128*1024);
-
- /* Bank 5 is always in 0x4000 - 0x7fff */
- m_bank2->set_base(messram + (5<<14));
-
- /* Bank 2 is always in 0x8000 - 0xbfff */
- m_bank3->set_base(messram + (2<<14));
+ m_beta->enable();
m_port_7ffd_data = 0;
m_port_1ffd_data = -1;
- atm_update_memory();
+ m_br3 = 0;
+ atm_port_ff77_w(0x4000, 3); // CPM=0(on), PEN=0(off), PEN2=1(off); vmode: zx
+}
+
+void atm_state::video_start()
+{
+ spectrum_state::video_start();
+ m_screen_location = m_ram->pointer() + (5 << 14);
+ m_contention_pattern = {};
}
/* F4 Character Displayer */
static const gfx_layout spectrum_charlayout =
{
- 8, 8, /* 8 x 8 characters */
- 96, /* 96 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 bytes */
+ 8, 8, // 8 x 8 characters
+ 96, // 96 characters
+ 1, // 1 bits per pixel
+ { 0 }, // no bitplanes
+ { STEP8(0, 1) }, // x offsets
+ { STEP8(0, 8) }, // y offsets
+ 8 * 8 // every char takes 8 bytes
+};
+
+static const gfx_layout atm_charlayout =
+{
+ 8, 8, // 8 x 8 characters
+ 256, // 96 characters
+ 1, // 1 bits per pixel
+ { 0 }, // no bitplanes
+ { STEP8(0, 1) }, // x offsets
+ { STEP8(0, 8) }, // y offsets
+ 8 * 8 // every char takes 8 bytes
};
static GFXDECODE_START( gfx_atm )
- GFXDECODE_ENTRY( "maincpu", 0x1fd00, spectrum_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "maincpu", 0x1fd00, spectrum_charlayout, 7, 1 )
GFXDECODE_END
static GFXDECODE_START( gfx_atmtb2 )
- GFXDECODE_ENTRY( "maincpu", 0x13d00, spectrum_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "charrom", 0, atm_charlayout, 7, 1 )
+ GFXDECODE_ENTRY( "maincpu", 0x13d00, spectrum_charlayout, 7, 1 )
GFXDECODE_END
-
void atm_state::atm(machine_config &config)
{
spectrum_128(config);
@@ -211,10 +501,16 @@ void atm_state::atm(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &atm_state::atm_mem);
m_maincpu->set_addrmap(AS_IO, &atm_state::atm_io);
m_maincpu->set_addrmap(AS_OPCODES, &atm_state::atm_switch);
+ m_maincpu->nomreq_cb().set_nop();
+
+ m_screen->set_raw(X1_128_SINCLAIR / 5, 448, 312, {get_screen_area().left() - 40, get_screen_area().right() + 40, get_screen_area().top() - 40, get_screen_area().bottom() + 40});
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atm);
BETA_DISK(config, m_beta, 0);
- subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atm);
+ CENTRONICS(config, m_centronics, centronics_devices, "covox");
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
config.device_remove("exp");
}
@@ -222,6 +518,9 @@ void atm_state::atm(machine_config &config)
void atm_state::atmtb2(machine_config &config)
{
atm(config);
+
+ // 1M in ATM2+ only. TODO mem masks for custom size
+ m_ram->set_default_size("1M");//.set_extra_options("128K,256K,512K,1M");
subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atmtb2);
}
@@ -272,8 +571,7 @@ ROM_END
} // Anonymous namespace
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1991, atm, spec128, 0, atm, spec_plus, atm_state, empty_init, "MicroART", "ATM", MACHINE_NOT_WORKING)
-//COMP( 1991, atmtb1, spec128, 0, atm, spec_plus, atm_state, empty_init, "MicroART", "ATM-turbo1", MACHINE_NOT_WORKING)
-COMP( 1993, atmtb2, spec128, 0, atmtb2, spec_plus, atm_state, empty_init, "MicroART", "ATM-turbo2", MACHINE_NOT_WORKING)
-//COMP( 1994, turbo2, spec128, 0, atm, spec_plus, atm_state, empty_init, "MicroART", "TURBO 2+", MACHINE_NOT_WORKING)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1991, atm, spec128, 0, atm, spec_plus, atm_state, empty_init, "MicroART", "ATM-Turbo (ATM-CP)", MACHINE_NOT_WORKING)
+COMP( 1992, atmtb2, spec128, 0, atmtb2, spec_plus, atm_state, empty_init, "MicroART", "ATM-Turbo 2", MACHINE_SUPPORTS_SAVE)
+//COMP( 1993, atmtb2p, spec128, 0, atmtb2p, spec_plus, atm_state, empty_init, "MicroART", "ATM-Turbo 2+", MACHINE_NOT_WORKING) // only supports 1M RAM vs. 512K in atmtb2
diff --git a/src/devices/machine/glukrs.cpp b/src/mame/sinclair/glukrs.cpp
index aee7348b3e0..aee7348b3e0 100644
--- a/src/devices/machine/glukrs.cpp
+++ b/src/mame/sinclair/glukrs.cpp
diff --git a/src/devices/machine/glukrs.h b/src/mame/sinclair/glukrs.h
index 74c581ff068..7953f0b0a34 100644
--- a/src/devices/machine/glukrs.h
+++ b/src/mame/sinclair/glukrs.h
@@ -1,8 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:Andrei I. Holub
-#ifndef MAME_MACHINE_GLUKRS_H
-#define MAME_MACHINE_GLUKRS_H
+#ifndef MAME_SINCLAIR_GLUKRS_H
+#define MAME_SINCLAIR_GLUKRS_H
#pragma once
@@ -32,4 +32,4 @@ private:
};
DECLARE_DEVICE_TYPE(GLUKRS, glukrs_device)
-#endif // MAME_MACHINE_GLUKRS_H
+#endif // MAME_SINCLAIR_GLUKRS_H
diff --git a/src/mame/sinclair/tsconf.h b/src/mame/sinclair/tsconf.h
index 22bcfbfa5b7..13dde4afca1 100644
--- a/src/mame/sinclair/tsconf.h
+++ b/src/mame/sinclair/tsconf.h
@@ -14,10 +14,10 @@
#include "beta_m.h"
-#include "machine/glukrs.h"
+#include "glukrs.h"
#include "machine/pckeybrd.h"
#include "machine/spi_sdcard.h"
-#include "machine/tsconfdma.h"
+#include "tsconfdma.h"
#include "tilemap.h"
diff --git a/src/mame/sinclair/tsconf_m.cpp b/src/mame/sinclair/tsconf_m.cpp
index fa6e956569e..e02c26abdfd 100644
--- a/src/mame/sinclair/tsconf_m.cpp
+++ b/src/mame/sinclair/tsconf_m.cpp
@@ -154,27 +154,27 @@ void tsconf_state::spectrum_update_screen(screen_device &screen, bitmap_ind16 &b
}
}
-void tsconf_state::tsconf_UpdateZxScreenBitmap(screen_device &screen_d, bitmap_ind16 &bitmap, const rectangle &screen)
+void tsconf_state::tsconf_UpdateZxScreenBitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 pal_offset = m_regs[PAL_SEL] << 4;
u8 *screen_location = m_ram->pointer() + PAGE4K(m_regs[V_PAGE]);
u8 *attrs_location = m_ram->pointer() + PAGE4K(m_regs[V_PAGE]) + 0x1800;
- bool invert_attrs = u64(screen_d.frame_number() / m_frame_invert_count) & 1;
- for (u16 vpos = screen.top(); vpos <= screen.bottom(); vpos++)
+ bool invert_attrs = u64(screen.frame_number() / m_frame_invert_count) & 1;
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
{
- u16 hpos = screen.left();
+ u16 hpos = cliprect.left();
u16 x = hpos - get_screen_area().left();
u16 y = vpos - get_screen_area().top();
u8 *scr = &screen_location[((y & 7) << 8) | ((y & 0x38) << 2) | ((y & 0xc0) << 5) | (x >> 3)];
u8 *attr = &attrs_location[((y & 0xf8) << 2) | (x >> 3)];
u16 *pix = &(bitmap.pix(vpos, hpos));
- while (hpos <= screen.right())
+ while (hpos <= cliprect.right())
{
u16 ink = pal_offset | ((*attr >> 3) & 0x08) | (*attr & 0x07);
u16 pap = pal_offset | ((*attr >> 3) & 0x0f);
u8 pix8 = (invert_attrs && (*attr & 0x80)) ? ~*scr : *scr;
- for (u8 b = 0x80 >> (x & 0x07); b != 0 && hpos <= screen.right(); b >>= 1, x++, hpos++)
+ for (u8 b = 0x80 >> (x & 0x07); b != 0 && hpos <= cliprect.right(); b >>= 1, x++, hpos++)
*pix++ = (pix8 & b) ? ink : pap;
scr++;
attr++;
@@ -182,13 +182,13 @@ void tsconf_state::tsconf_UpdateZxScreenBitmap(screen_device &screen_d, bitmap_i
}
}
-void tsconf_state::tsconf_UpdateTxtBitmap(bitmap_ind16 &bitmap, const rectangle &screen)
+void tsconf_state::tsconf_UpdateTxtBitmap(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 *font_location = m_ram->pointer() + PAGE4K(m_regs[V_PAGE] ^ 0x01);
u8 pal_offset = m_regs[PAL_SEL] << 4;
- for (u16 vpos = screen.top(); vpos <= screen.bottom(); vpos++)
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
{
- u16 hpos = screen.left();
+ u16 hpos = cliprect.left();
u16 x = hpos - get_screen_area().left();
u16 y = vpos - get_screen_area().top();
u16 y_offset = (OFFS_512(G_Y_OFFS_L) + y) & 0x1ff;
@@ -196,28 +196,28 @@ void tsconf_state::tsconf_UpdateTxtBitmap(bitmap_ind16 &bitmap, const rectangle
// TODO? u16 x_offset = OFFS_512(G_X_OFFS_L);
u8 *text_location = m_ram->pointer() + PAGE4K(m_regs[V_PAGE]) + (y_offset / 8 * 256 + x / 8);
u16 *pix = &(bitmap.pix(vpos, hpos));
- while (hpos <= screen.right())
+ while (hpos <= cliprect.right())
{
u8 font_color = *(text_location + 128) & 0x0f;
u8 bg_color = (*(text_location + 128) & 0xf0) >> 4;
u8 char_x = *(font_location + (*text_location * 8) + (y_offset % 8));
- for (u8 b = 0x80 >> (x & 0x07); b != 0 && hpos <= screen.right(); b >>= 1, x++, hpos++)
+ for (u8 b = 0x80 >> (x & 0x07); b != 0 && hpos <= cliprect.right(); b >>= 1, x++, hpos++)
*pix++ = pal_offset | ((char_x & b) ? font_color : bg_color);
text_location++;
}
}
}
-void tsconf_state::tsconf_UpdateGfxBitmap(bitmap_ind16 &bitmap, const rectangle &screen)
+void tsconf_state::tsconf_UpdateGfxBitmap(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 pal_offset = m_regs[PAL_SEL] << 4;
- for (u16 vpos = screen.top(); vpos <= screen.bottom(); vpos++)
+ for (u16 vpos = cliprect.top(); vpos <= cliprect.bottom(); vpos++)
{
u16 y_offset = (0x200 + OFFS_512(G_Y_OFFS_L) + m_gfx_y_frame_offset + vpos) & 0x1ff;
- u16 x_offset = (OFFS_512(G_X_OFFS_L) + (screen.left() - get_screen_area().left())) & 0x1ff;
+ u16 x_offset = (OFFS_512(G_X_OFFS_L) + (cliprect.left() - get_screen_area().left())) & 0x1ff;
u8 *video_location = m_ram->pointer() + PAGE4K(m_regs[V_PAGE]) + ((y_offset * 512 + x_offset) >> (2 - VM));
- u16 *bm = &(bitmap.pix(vpos, screen.left()));
- s16 width = screen.width();
+ u16 *bm = &(bitmap.pix(vpos, cliprect.left()));
+ s16 width = cliprect.width();
if (VM == VM_16C)
{
if (x_offset & 1)
diff --git a/src/devices/machine/tsconfdma.cpp b/src/mame/sinclair/tsconfdma.cpp
index 79ef8bc2d50..79ef8bc2d50 100644
--- a/src/devices/machine/tsconfdma.cpp
+++ b/src/mame/sinclair/tsconfdma.cpp
diff --git a/src/devices/machine/tsconfdma.h b/src/mame/sinclair/tsconfdma.h
index 49929d3c3ae..582017fdfff 100644
--- a/src/devices/machine/tsconfdma.h
+++ b/src/mame/sinclair/tsconfdma.h
@@ -6,8 +6,8 @@
***************************************************************************/
-#ifndef MAME_MACHINE_TSCONF_DMA_H
-#define MAME_MACHINE_TSCONF_DMA_H
+#ifndef MAME_SINCLAIR_TSCONF_DMA_H
+#define MAME_SINCLAIR_TSCONF_DMA_H
#pragma once
@@ -59,4 +59,4 @@ private:
};
DECLARE_DEVICE_TYPE(TSCONF_DMA, tsconfdma_device)
-#endif // MAME_MACHINE_TSCONF_DMA_H
+#endif // MAME_SINCLAIR_TSCONF_DMA_H