summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/sinclair/atm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/sinclair/atm.cpp')
-rw-r--r--src/mame/sinclair/atm.cpp409
1 files changed, 207 insertions, 202 deletions
diff --git a/src/mame/sinclair/atm.cpp b/src/mame/sinclair/atm.cpp
index 3be353b43ee..ea2e3ce5307 100644
--- a/src/mame/sinclair/atm.cpp
+++ b/src/mame/sinclair/atm.cpp
@@ -8,160 +8,87 @@ 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
- * better handling of SHADOW ports
- * validate screen timings
-
*******************************************************************************************/
#include "emu.h"
-#include "spec128.h"
-#include "specpls3.h"
+#include "atm.h"
-#include "beta_m.h"
-#include "glukrs.h"
-#include "bus/centronics/ctronics.h"
+#include "bus/ata/atapicdr.h"
+#include "bus/ata/hdd.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 )
+#define VERBOSE ( /*LOG_GENERAL | 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 ROM_MASK = 0x7;
-static constexpr u8 PEN_RAM_MASK = 0x40;
-static constexpr u8 PEN_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_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_glukrs(*this, "glukrs")
- , m_palette(*this, "palette")
- { }
-
- void atm(machine_config &config);
- void atmtb2(machine_config &config);
-
-protected:
- 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:
- 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_eff7_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();
-
- 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<glukrs_device> m_glukrs;
- 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
-
- 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_cpu()
+{
+ m_maincpu->set_clock(X1_128_SINCLAIR / 10 * (1 << BIT(m_port_77_data, 3))); // 0 - 3.5MHz, 1 - 7MHz
+}
+
+void atm_state::atm_update_io()
+{
+ if (is_dos_active())
+ m_io_view.select(0);
+ else
+ m_io_view.disable();
+}
void atm_state::atm_update_memory()
{
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));
+ LOGMEM("PEN%d.%X ", BIT(m_port_7ffd_data, 4), (m_port_7ffd_data & 0x07));
for (auto bank = 0; bank < 4 ; bank++)
{
- u8 page = m_pen ? pen_page(bank) : ROM_MASK;
- if (page & PEN_RAM_MASK)
+ u16 page = atm_update_memory_get_page(bank);
+ const char* is_dos7ffd = page & PEN_DOS7FFD_MASK ? "+" : " ";
+ if (page & PEN_RAMNROM_MASK)
{
if (page & PEN_DOS7FFD_MASK)
- page = (page & 0xf8) | (m_port_7ffd_data & 0x07);
- 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);
+ page = merge_ram_with_7ffd(page);
+ LOGMEM("RA%s%X ", is_dos7ffd, page & ram_pages_mask);
+ m_bank_ram[bank]->set_entry(page & ram_pages_mask);
+ if (page & PEN_WRDISBL_MASK)
+ views[bank].get().select(1);
+ else
+ views[bank].get().disable();
}
else
{
- if ((page & PEN_DOS7FFD_MASK) && !BIT(page, 1))
- page = (page & ~1) | is_shadow_active();
- page &= ROM_MASK;
- m_bank_rom[bank]->set_entry(page);
+ if (page & PEN_DOS7FFD_MASK)
+ page = (page & ~1) | is_dos_active();
+ LOGMEM("RO%s%X ", is_dos7ffd, page & rom_pages_mask);
+ m_bank_rom[bank]->set_entry(page & rom_pages_mask);
views[bank].get().select(0);
- LOGMEM(" RO(%X>%X)", m_bank_rom[bank]->entry(), page);
}
}
LOGMEM("\n");
}
+u16 atm_state::atm_update_memory_get_page(u8 bank)
+{
+ return m_pen ? pen_page(bank) : (u16) (~PEN_RAMNROM_MASK & ~PEN_DOS7FFD_MASK);
+}
+
void atm_state::atm_ula_w(offs_t offset, u8 data)
{
m_br3 = ~offset & 0x08;
spectrum_128_state::spectrum_ula_w(offset, data);
}
-void atm_state::atm_port_ffff_w(offs_t offset, u8 data)
+void atm_state::atm_port_ff_w(offs_t offset, u8 data)
{
- if(!is_shadow_active())
- return;
-
if (m_pen2)
{
+ m_beta_drive_selected = data;
m_beta->param_w(data);
}
else
@@ -169,6 +96,7 @@ void atm_state::atm_port_ffff_w(offs_t offset, u8 data)
// 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_data[pen] = data;
m_palette->set_pen_color(pen,
(BIT(~data, 1) * 0xaa) | (BIT(~data, 6) * 0x55),
(BIT(~data, 4) * 0xaa) | (BIT(~data, 7) * 0x55),
@@ -178,8 +106,7 @@ void atm_state::atm_port_ffff_w(offs_t offset, u8 data)
void atm_state::atm_port_7ffd_w(offs_t offset, u8 data)
{
- /* disable paging */
- if (BIT(m_port_7ffd_data, 5))
+ if (is_port_7ffd_locked())
return;
m_port_7ffd_data = data;
@@ -189,18 +116,19 @@ void atm_state::atm_port_7ffd_w(offs_t offset, u8 data)
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)
+void atm_state::atm_port_77_w(offs_t offset, u8 data)
{
- if (!is_shadow_active())
- return;
+ m_port_77_data = data;
m_pen = BIT(offset, 8);
- m_cpm = BIT(offset, 9);
+ m_cpm_n = BIT(offset, 9);
+ atm_update_io();
+
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");
+ LOGMASKED(LOG_VIDEO | LOG_MEM, "PEN %s, CPM %s, PEN2 %s\n", m_pen ? "on" : "off", m_cpm_n ? "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
+ atm_update_cpu();
int rg = data & 0x07;
if ( m_rg ^ rg )
@@ -210,42 +138,38 @@ void atm_state::atm_port_ff77_w(offs_t offset, u8 data)
}
}
-void atm_state::atm_port_eff7_w(offs_t offset, u8 data)
-{
- m_maincpu->set_clock(X1_128_SINCLAIR / 10 * (1 << BIT(data, 4))); // 0 - 3.5MHz, 1 - 7MHz
- if (BIT(data, 7))
- m_glukrs->enable();
- else
- m_glukrs->disable();
-}
-
-void atm_state::atm_port_fff7_w(offs_t offset, u8 data)
+void atm_state::atm_port_f7_w(offs_t offset, u8 data)
{
- if(!is_shadow_active())
- return;
-
u8 bank = offset >> 14;
- u8 page = (data & 0xc0) | (~data & 0x3f);
+ u16 page = (u16(data & 0xc0) << 8) | u8(~data & 0x3f);
- LOGMEM("PEN%s.%s = %X %s%d: %02X\n", (page | PEN_DOS7FFD_MASK) ? "+" : "!", BIT(m_port_7ffd_data, 4), data, (page & PEN_RAM_MASK) ? "RAM" : "ROM", bank, page & 0x3f);
+ LOGMEM("ATM%s=%X %s%d%s%02X\n", BIT(m_port_7ffd_data, 4), data, (page & PEN_RAMNROM_MASK) ? "RAM" : "ROM", bank, (page & PEN_DOS7FFD_MASK) ? "+" : " ", page & 0x3f);
pen_page(bank) = page;
atm_update_memory();
+ atm_update_io();
+}
+
+INTERRUPT_GEN_MEMBER(atm_state::atm_interrupt)
+{
+ // 14395=64*224+59 z80(3.5Hz) clocks between INT and screen paper begins. Screen clock is 7Hz.
+ m_irq_on_timer->adjust(m_screen->time_until_pos(80 - 64, 80) - m_screen->clocks_to_attotime(118));
}
rectangle atm_state::get_screen_area()
{
switch (m_rg)
{
+ case 0b111:
case 0b110: // 80x25txt
case 0b010: // 640x200
- return rectangle { 208, 208 + 639, 76, 76 + 199 };
+ return rectangle { 80, 80 + 639, 80, 80 + 199 };
break;
case 0b000: // 320x200
- return rectangle { 104, 104 + 319, 76, 76 + 199 };
+ return rectangle { 80, 80 + 319, 80, 80 + 199 };
break;
- case 0b011: // 256x192
+ case 0b011: // 256x192zx
default:
- return rectangle { 136, 136 + 255, 80, 80 + 191 };
+ return rectangle { 80, 80 + 255, 80, 80 + 191 };
break;
}
}
@@ -257,12 +181,12 @@ u8 atm_state::get_border_color(u16 hpos, u16 vpos)
void atm_state::atm_update_video_mode()
{
- bool zx_scale = BIT(m_rg, 0);
+ bool zx_scale = m_rg == 0b011;
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());
+ m_screen->configure(448 << double_width, m_screen->height(), {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);
@@ -352,7 +276,7 @@ void atm_state::atm_update_screen_tx(screen_device &screen, bitmap_ind16 &bitmap
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));
+ u8 chunk = *(m_char_location + (*symb_location << 3) + (y & 0x07));
for (u8 i = 0x80; i; i >>= 1)
{
bitmap.pix(vpos, hpos++) = (chunk & i) ? fg : bg;
@@ -368,67 +292,114 @@ u8 atm_state::beta_neutral_r(offs_t offset)
u8 atm_state::beta_enable_r(offs_t offset)
{
- if (!machine().side_effects_disabled()) {
- u8 page = pen_page(0);
- if (!(page & PEN_RAM_MASK) && !is_shadow_active()) {
+ if (!machine().side_effects_disabled() && !m_beta->is_active())
+ {
+ bool is_rom0 = !(atm_update_memory_get_page(0) & PEN_RAMNROM_MASK);
+ if (is_rom0 || !m_cpm_n)
+ {
m_beta->enable();
atm_update_memory();
+ atm_update_io();
}
}
- return m_program.read_byte(offset + 0x3d00);
+ return beta_neutral_r(offset + 0x3d00);
}
u8 atm_state::beta_disable_r(offs_t offset)
{
- if (!machine().side_effects_disabled()) {
- if (is_shadow_active() && m_cpm) {
+ if (!machine().side_effects_disabled() && m_beta->is_active())
+ {
+ if (m_cpm_n)
+ {
m_beta->disable();
atm_update_memory();
+ atm_update_io();
}
}
- return m_program.read_byte(offset + 0x4000);
+ return beta_neutral_r(offset + 0x4000);
+}
+
+u8 atm_state::ata_r(offs_t offset)
+{
+ u8 ata_offset = BIT(offset, 5, 3);
+ u16 data = m_ata->cs0_r(ata_offset);
+
+ if (!machine().side_effects_disabled() && !ata_offset)
+ m_ata_data_latch = data >> 8;
+
+ return data & 0xff;
+}
+
+void atm_state::ata_w(offs_t offset, u8 data)
+{
+ u8 ata_offset = BIT(offset, 5, 3);
+ u16 ata_data = data;
+ if (!ata_offset)
+ ata_data |= m_ata_data_latch << 8;
+
+ m_ata->cs0_w(ata_offset, ata_data);
+}
+
+template <u8 Bank> void atm_state::atm_ram_w(offs_t offset, u8 data)
+{
+ if (m_rg == 0b011 && (m_bank_ram[Bank]->entry() == (BIT(m_port_7ffd_data, 3) ? 7 : 5)) && offset < 0x1b00)
+ m_screen->update_now();
+
+ ((u8*)m_bank_ram[Bank]->base())[offset] = data;
}
void atm_state::atm_mem(address_map &map)
{
- map(0x0000, 0x3fff).bankrw(m_bank_ram[0]);
+ map(0x0000, 0x3fff).bankr(m_bank_ram[0]).w(FUNC(atm_state::atm_ram_w<0>));
map(0x0000, 0x3fff).view(m_bank_view0);
m_bank_view0[0](0x0000, 0x3fff).bankr(m_bank_rom[0]).nopw();
+ m_bank_view0[1](0x0000, 0x3fff).nopw(); // RO RAM
- map(0x4000, 0x7fff).bankrw(m_bank_ram[1]);
+ map(0x4000, 0x7fff).bankr(m_bank_ram[1]).w(FUNC(atm_state::atm_ram_w<1>));
map(0x4000, 0x7fff).view(m_bank_view1);
m_bank_view1[0](0x4000, 0x7fff).bankr(m_bank_rom[1]).nopw();
+ m_bank_view1[1](0x4000, 0x7fff).nopw();
- map(0x8000, 0xbfff).bankrw(m_bank_ram[2]);
+ map(0x8000, 0xbfff).bankr(m_bank_ram[2]).w(FUNC(atm_state::atm_ram_w<2>));
map(0x8000, 0xbfff).view(m_bank_view2);
m_bank_view2[0](0x8000, 0xbfff).bankr(m_bank_rom[2]).nopw();
+ m_bank_view2[1](0x8000, 0xbfff).nopw();
- map(0xc000, 0xffff).bankrw(m_bank_ram[3]);
+ map(0xc000, 0xffff).bankr(m_bank_ram[3]).w(FUNC(atm_state::atm_ram_w<3>));
map(0xc000, 0xffff).view(m_bank_view3);
m_bank_view3[0](0xc000, 0xffff).bankr(m_bank_rom[3]).nopw();
+ m_bank_view3[1](0xc000, 0xffff).nopw();
}
void atm_state::atm_io(address_map &map)
{
map.unmap_value_high();
- map(0x001f, 0x001f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w));
- 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(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));
+
+ // PORTS: Always
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(0xeff7, 0xeff7).w(FUNC(atm_state::atm_port_eff7_w));
- map(0xdef7, 0xdef7).mirror(0x0100).w(m_glukrs, FUNC(glukrs_device::address_w));
- map(0xbff7, 0xbff7).r(m_glukrs, FUNC(glukrs_device::data_r));
- map(0xbef7, 0xbef7).rw(m_glukrs, FUNC(glukrs_device::data_r), FUNC(glukrs_device::data_w));
+
map(0xfadf, 0xfadf).mirror(0x0500).nopr(); // TODO 0xfadf, 0xfbdf, 0xffdf Kempston Mouse
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));
+
+ // PORTS: Shadow
+ map(0x0000, 0xffff).view(m_io_view);
+ m_io_view[0](0x001f, 0x001f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w));
+ m_io_view[0](0x003f, 0x003f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w));
+ m_io_view[0](0x005f, 0x005f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w));
+ m_io_view[0](0x007f, 0x007f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w));
+ m_io_view[0](0x00ff, 0x00ff).mirror(0xff00).r(m_beta, FUNC(beta_disk_device::state_r)).w(FUNC(atm_state::atm_port_ff_w));
+
+ m_io_view[0](0x0077, 0x0077).select(0xff00).w(FUNC(atm_state::atm_port_77_w));
+ m_io_view[0](0x00f7, 0x00f7).select(0xff00).w(FUNC(atm_state::atm_port_f7_w));
+
+ // A: .... .... nnn0 1111
+ m_io_view[0](0x000f, 0x000f).select(0xffe0).rw(FUNC(atm_state::ata_r), FUNC(atm_state::ata_w));
+ // A: .... ...1 0000 1111
+ m_io_view[0](0x010f, 0x010f).mirror(0xfe00).lrw8(NAME([this](offs_t offset) { return m_ata_data_latch; })
+ , NAME([this](offs_t offset, u8 data) { m_ata_data_latch = data; }));
}
void atm_state::atm_switch(address_map &map)
@@ -443,18 +414,23 @@ void atm_state::machine_start()
{
spectrum_128_state::machine_start();
+ save_item(NAME(m_port_77_data));
save_item(NAME(m_pen));
- save_item(NAME(m_cpm));
+ save_item(NAME(m_cpm_n));
save_item(NAME(m_pages_map));
save_item(NAME(m_pen2));
save_item(NAME(m_rg));
save_item(NAME(m_br3));
+ save_item(NAME(m_beta_drive_selected));
// reconfigure ROMs
memory_region *rom = memregion("maincpu");
+ rom_pages_mask = (rom->bytes() - 0x10001) / 0x4000;
for (auto i = 0; i < 4; i++)
- m_bank_rom[i]->configure_entries(0, 8, rom->base() + 0x10000, 0x4000);
- m_bank_ram[0]->configure_entries(0, m_ram->size() / 0x4000, m_ram->pointer(), 0x4000);
+ m_bank_rom[i]->configure_entries(0, rom_pages_mask + 1, rom->base() + 0x10000, 0x4000); // todo dyn
+
+ ram_pages_mask = (m_ram->size() - 1) / 0x4000;
+ m_bank_ram[0]->configure_entries(0, ram_pages_mask + 1, m_ram->pointer(), 0x4000);
m_maincpu->space(AS_PROGRAM).specific(m_program);
}
@@ -462,19 +438,23 @@ void atm_state::machine_start()
void atm_state::machine_reset()
{
m_beta->enable();
- m_glukrs->disable();
+ m_beta_drive_selected = 0;
m_port_7ffd_data = 0;
m_port_1ffd_data = -1;
+ m_port_77_data = 0;
m_br3 = 0;
- atm_port_ff77_w(0x4000, 3); // CPM=0(on), PEN=0(off), PEN2=1(off); vmode: zx
+ m_palette_data = { 0xff };
+ atm_port_77_w(0x4000, 3); // m_port_77_data: 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_char_location = m_char_rom;
+ subdevice<gfxdecode_device>("gfxdecode")->gfx(0)->set_source(m_char_location);
m_contention_pattern = {};
}
@@ -493,7 +473,7 @@ static const gfx_layout spectrum_charlayout =
static const gfx_layout atm_charlayout =
{
8, 8, // 8 x 8 characters
- 256, // 96 characters
+ 256, // 256 characters
1, // 1 bits per pixel
{ 0 }, // no bitplanes
{ STEP8(0, 1) }, // x offsets
@@ -502,14 +482,21 @@ static const gfx_layout atm_charlayout =
};
static GFXDECODE_START( gfx_atm )
+ GFXDECODE_ENTRY( "maincpu", 0, atm_charlayout, 7, 1 ) // charrom
GFXDECODE_ENTRY( "maincpu", 0x1fd00, spectrum_charlayout, 7, 1 )
GFXDECODE_END
static GFXDECODE_START( gfx_atmtb2 )
- GFXDECODE_ENTRY( "charrom", 0, atm_charlayout, 7, 1 )
+ GFXDECODE_ENTRY( "maincpu", 0, atm_charlayout, 7, 1 ) // charrom
GFXDECODE_ENTRY( "maincpu", 0x13d00, spectrum_charlayout, 7, 1 )
GFXDECODE_END
+static void atm_ata_devices(device_slot_interface &device)
+{
+ device.option_add("hdd", IDE_HARDDISK);
+ device.option_add("cdrom", ATAPI_CDROM);
+}
+
void atm_state::atm(machine_config &config)
{
spectrum_128(config);
@@ -517,13 +504,14 @@ 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->set_vblank_int("screen", FUNC(atm_state::atm_interrupt));
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);
- GLUKRS(config, m_glukrs);
+ ATA_INTERFACE(config, m_ata).options(atm_ata_devices, nullptr, nullptr, false);
CENTRONICS(config, m_centronics, centronics_devices, "covox");
output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
@@ -532,40 +520,63 @@ void atm_state::atm(machine_config &config)
config.device_remove("exp");
}
+
+/******************************************************************************
+ * ATM Turbo 2
+ * ***************************************************************************/
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");
+ m_ram->set_default_size("512K").set_extra_options("128K,256K");
+
subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atmtb2);
}
-/***************************************************************************
+/******************************************************************************
+ * ATM Turbo 2+
+ * ***************************************************************************/
+void atm_state::atmtb2plus(machine_config &config)
+{
+ atmtb2(config);
- Game driver(s)
+ m_ram->set_default_size("1M").set_extra_options("128K,256K,512K");
+}
-***************************************************************************/
+/***************************************************************************
+ * Game driver(s)
+ * ************************************************************************/
ROM_START( atm )
- ROM_REGION(0x030000, "maincpu", ROMREGION_ERASEFF)
+ ROM_REGION(0x020000, "maincpu", ROMREGION_ERASEFF)
ROM_SYSTEM_BIOS(0, "v1", "v.1.03")
- ROMX_LOAD( "atm103.rom", 0x020000, 0x10000, CRC(4912e249) SHA1(a4adff05bb215dd126c47201b36956115b8fed76), ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "v2", "v.1.06 joined")
- ROMX_LOAD( "atm106.rom", 0x020000, 0x10000, CRC(75350b37) SHA1(2afc9994f026645c74b6c4b35bcee2e0bc0d6edc), ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "v3", "v.1.06")
- ROMX_LOAD( "atm106-1.rom", 0x020000, 0x4000, CRC(658c98f1) SHA1(1ec694795aa6cac10147e58f38a9db0bdf7ed89b), ROM_BIOS(2))
- ROMX_LOAD( "atm106-2.rom", 0x024000, 0x4000, CRC(8fe367f9) SHA1(56de8fd39061663b9c315b74fd3c31acddae279c), ROM_BIOS(2))
- ROMX_LOAD( "atm106-3.rom", 0x028000, 0x4000, CRC(124ad9e0) SHA1(d07fcdeca892ee80494d286ea9ea5bf3928a1aca), ROM_BIOS(2))
- ROMX_LOAD( "atm106-4.rom", 0x02c000, 0x4000, CRC(f352f2ab) SHA1(6045500ab01be708cef62327e9821b4a358a4673), ROM_BIOS(2))
- ROM_SYSTEM_BIOS(3, "v4", "v.1.03rs")
- ROMX_LOAD( "atm103rs.rom", 0x020000, 0x10000, CRC(cdec1dfb) SHA1(08190807c6b110cb2e657d8e7d0ad18668915375), ROM_BIOS(3))
+ ROMX_LOAD( "atm103.rom", 0x010000, 0x10000, CRC(4912e249) SHA1(a4adff05bb215dd126c47201b36956115b8fed76), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v2", "v.1.03rs")
+ ROMX_LOAD( "atm103rs.rom", 0x010000, 0x10000, CRC(cdec1dfb) SHA1(08190807c6b110cb2e657d8e7d0ad18668915375), ROM_BIOS(1))
ROM_END
ROM_START( atmtb2 )
+ ROM_REGION(0x020000, "maincpu", ROMREGION_ERASEFF)
+ ROM_SYSTEM_BIOS(0, "v1.06", "BIOS v1.06") // joined dump
+ ROMX_LOAD( "atm106.rom", 0x010000, 0x10000, CRC(75350b37) SHA1(2afc9994f026645c74b6c4b35bcee2e0bc0d6edc), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v1.06a", "BIOS v1.06 (split)")
+ ROMX_LOAD( "atm106-1.rom", 0x010000, 0x4000, CRC(658c98f1) SHA1(1ec694795aa6cac10147e58f38a9db0bdf7ed89b), ROM_BIOS(1))
+ ROMX_LOAD( "atm106-2.rom", 0x014000, 0x4000, CRC(8fe367f9) SHA1(56de8fd39061663b9c315b74fd3c31acddae279c), ROM_BIOS(1))
+ ROMX_LOAD( "atm106-3.rom", 0x018000, 0x4000, CRC(124ad9e0) SHA1(d07fcdeca892ee80494d286ea9ea5bf3928a1aca), ROM_BIOS(1))
+ ROMX_LOAD( "atm106-4.rom", 0x01c000, 0x4000, CRC(f352f2ab) SHA1(6045500ab01be708cef62327e9821b4a358a4673), ROM_BIOS(1))
+
+ ROM_REGION(0x01000, "keyboard", ROMREGION_ERASEFF)
+ ROM_LOAD( "rf2ve3.rom", 0x0000, 0x0580, CRC(35e0f9ec) SHA1(adcf14758fab8472cfa0167af7e8326c66416416)) // XT Keyboard
+ ROM_LOAD( "rfat710.rom", 0x0600, 0x0680, CRC(03734365) SHA1(6cb6311727fad9bc4ccb18919c3c39b37529b8e6)) // AT Keyboard
+
+ ROM_REGION(0x08000, "charrom", ROMREGION_ERASEFF) // Char gen rom
+ ROM_LOAD( "sgen.rom", 0x0000, 0x0800, CRC(1f4387d6) SHA1(93b3774dc8a486643a1bdd48c606b0c84fa0e22b))
+ROM_END
+
+ROM_START( atmtb2plus )
ROM_REGION(0x030000, "maincpu", ROMREGION_ERASEFF)
- ROM_DEFAULT_BIOS("v1.07.13")
+ ROM_DEFAULT_BIOS("v1.37")
ROM_SYSTEM_BIOS(0, "v1.07.12", "BIOS v1.07.12, CP/M v2.2, TR-DOS v5.03") // joined dump
ROMX_LOAD( "atmtb2.rom", 0x020000, 0x10000,CRC(05218c26) SHA1(71ed9864e7aa85131de97cf1e53dc152e7c79488), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "v1.07.12a", "BIOS v1.07.12, CP/M v2.2, TR-DOS v5.03 (split)")
@@ -579,20 +590,14 @@ ROM_START( atmtb2 )
ROMX_LOAD( "atmtb2x37xt.rom", 0x010000, 0x20000, CRC(e5ef44d9) SHA1(3fbb9ace7cb031e7365c19e4f8b67ed366e24064), ROM_BIOS(3))
ROM_REGION(0x01000, "keyboard", ROMREGION_ERASEFF)
- // XT Keyboard
- ROM_LOAD( "rf2ve3.rom", 0x0000, 0x0580, CRC(35e0f9ec) SHA1(adcf14758fab8472cfa0167af7e8326c66416416))
- // AT Keyboard
- ROM_LOAD( "rfat710.rom", 0x0600, 0x0680, CRC(03734365) SHA1(6cb6311727fad9bc4ccb18919c3c39b37529b8e6))
+ ROM_LOAD( "rf2ve3.rom", 0x0000, 0x0580, CRC(35e0f9ec) SHA1(adcf14758fab8472cfa0167af7e8326c66416416)) // XT Keyboard
+ ROM_LOAD( "rfat710.rom", 0x0600, 0x0680, CRC(03734365) SHA1(6cb6311727fad9bc4ccb18919c3c39b37529b8e6)) // AT Keyboard
- ROM_REGION(0x08000, "charrom", ROMREGION_ERASEFF)
- // Char gen rom
+ ROM_REGION(0x08000, "charrom", ROMREGION_ERASEFF) // Char gen rom
ROM_LOAD( "sgen.rom", 0x0000, 0x0800, CRC(1f4387d6) SHA1(93b3774dc8a486643a1bdd48c606b0c84fa0e22b))
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-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
+/* 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, atmtb2plus, spec128, 0, atmtb2plus, spec_plus, atm_state, empty_init, "MicroART", "ATM-Turbo 2+", MACHINE_SUPPORTS_SAVE)