summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mtx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/mtx.cpp')
-rw-r--r--src/mame/machine/mtx.cpp157
1 files changed, 97 insertions, 60 deletions
diff --git a/src/mame/machine/mtx.cpp b/src/mame/machine/mtx.cpp
index 846648b30e8..41960e45398 100644
--- a/src/mame/machine/mtx.cpp
+++ b/src/mame/machine/mtx.cpp
@@ -111,38 +111,20 @@ void mtx_state::bankswitch(uint8_t data)
program.install_readwrite_bank(0x8000, 0xbfff, "rammap_bank3");
/* set ram bank, for invalid pages a nop-handler will be installed */
- switch (ram_page)
- {
- case 0:
- if (ram_page * 0xc000 + 0x10000 <= m_ram->size())
- membank("rammap_bank1")->set_entry(ram_page);
- else
- program.nop_readwrite(0x0000, 0x3fff);
- if (ram_page * 0xc000 + 0xc000 <= m_ram->size())
- membank("rammap_bank2")->set_entry(ram_page);
- else
- program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0xc000 + 0x8000 <= m_ram->size())
- membank("rammap_bank3")->set_entry(ram_page);
- else
- program.nop_readwrite(0x8000, 0xbfff);
- break;
-
- default:
- if (ram_page * 0xc000 + 0x8000 <= m_ram->size())
- membank("rammap_bank1")->set_entry(ram_page);
- else
- program.nop_readwrite(0x0000, 0x3fff);
- if (ram_page * 0xc000 + 0xc000 <= m_ram->size())
- membank("rammap_bank2")->set_entry(ram_page);
- else
- program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0xc000 + 0x10000 <= m_ram->size())
- membank("rammap_bank3")->set_entry(ram_page);
- else
- program.nop_readwrite(0x8000, 0xbfff);
- break;
- }
+ if ((ram_page == 0 && m_ram->size() > 0xc000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0xc000))
+ membank("rammap_bank1")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x0000, 0x3fff);
+ if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x14000 + ram_page * 0xc000))
+
+ membank("rammap_bank2")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x4000, 0x7fff);
+ if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page > 0 && m_ram->size() > 0x18000 + ram_page * 0xc000))
+
+ membank("rammap_bank3")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x8000, 0xbfff);
}
else
{
@@ -158,11 +140,11 @@ void mtx_state::bankswitch(uint8_t data)
membank("rommap_bank1")->set_entry(rom_page);
/* set ram bank, for invalid pages a nop-handler will be installed */
- if (ram_page * 0x8000 + 0xc000 <= m_ram->size())
+ if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0x8000))
membank("rommap_bank2")->set_entry(ram_page);
else
program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0x8000 + 0x8000 <= m_ram->size())
+ if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page == 1 && m_ram->size() > 0xc000) || (ram_page > 1 && m_ram->size() > 0x14000 + ram_page * 0x8000))
membank("rommap_bank3")->set_entry(ram_page);
else
program.nop_readwrite(0x8000, 0xbfff);
@@ -208,7 +190,16 @@ WRITE8_MEMBER(mtx_state::mtx_cst_w)
WRITE8_MEMBER(mtx_state::mtx_cst_motor_w)
{
- m_cassette->change_state(data ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
+ /* supported in the MTX ROM */
+ switch (data)
+ {
+ case 0xaa:
+ m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
+ break;
+ case 0x55:
+ m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
+ break;
+ }
}
/*-------------------------------------------------
@@ -453,14 +444,10 @@ DEVICE_IMAGE_LOAD_MEMBER( mtx_state, rompak_load )
SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- void *ptr;
- uint8_t header[18];
-
- // read header
- image.fread(&header, sizeof(header));
+ uint8_t *data = (uint8_t*)image.ptr();
// verify first byte
- if (header[0] != 0xff)
+ if (data[0] != 0xff)
{
image.seterror(IMAGE_ERROR_INVALIDIMAGE, nullptr);
return image_init_result::FAIL;
@@ -468,37 +455,74 @@ SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
// get tape name
char tape_name[16];
- memcpy(&tape_name, &header[1], 15);
+ memcpy(&tape_name, &data[1], 15);
tape_name[15] = '\0';
image.message("Loading '%s'", tape_name);
+ // reset memory map
+ bankswitch(0);
+
// start of system variables area
- uint16_t system_variables_base = pick_integer_le(header, 16, 2);
+ uint16_t system_variables_base = pick_integer_le(data, 16, 2);
// write system variables
uint16_t system_variables_size = 0;
if (system_variables_base != 0)
{
- ptr = program.get_write_ptr(system_variables_base);
system_variables_size = 0xfb4b - system_variables_base;
- image.fread(ptr, system_variables_size);
+ for (int i = 0; i < system_variables_size; i++)
+ program.write_byte(system_variables_base + i, data[18 + i]);
}
// write actual image data
uint16_t data_size = snapshot_size - 18 - system_variables_size;
+ for (int i = 0; i < data_size; i++)
+ program.write_byte(0x4000 + i, data[18 + system_variables_size + i]);
+
+ logerror("snapshot name = '%s', system_size = 0x%04x, data_size = 0x%04x\n", tape_name, system_variables_size, data_size);
+
+ return image_init_result::PASS;
+}
+
+/***************************************************************************
+ QUICKLOAD
+***************************************************************************/
+
+QUICKLOAD_LOAD_MEMBER(mtx_state, mtx)
+{
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ uint8_t *data = (uint8_t*)image.ptr();
- ptr = program.get_write_ptr(0x4000);
- image.fread(ptr, 0x4000);
+ if (quickload_size < 4)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ return image_init_result::FAIL;
+ }
- // if we cross the page boundary, get a new write pointer and write the rest
- if (data_size > 0x4000)
+ uint16_t code_base = pick_integer_le(data, 0, 2);
+ uint16_t code_length = pick_integer_le(data, 2, 2);
+
+ if (quickload_size < code_length)
{
- ptr = program.get_write_ptr(0x8000);
- image.fread(ptr, 0x4000);
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ return image_init_result::FAIL;
}
- logerror("snapshot name = '%s', system_size = 0x%04x, data_size = 0x%04x\n", tape_name, system_variables_size, data_size);
+ if (code_base < 0x4000 || (code_base + code_length) >= 0x10000)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid code base and length");
+ return image_init_result::FAIL;
+ }
+
+ // reset memory map
+ bankswitch(0);
+
+ // write image data
+ for (int i = 0; i < code_length; i++)
+ program.write_byte(code_base + i, data[4 + i]);
+
+ m_maincpu->set_pc(code_base);
return image_init_result::PASS;
}
@@ -511,7 +535,7 @@ SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
MACHINE_START( mtx512 )
-------------------------------------------------*/
-MACHINE_START_MEMBER(mtx_state, mtx512)
+void mtx_state::machine_start()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
@@ -521,12 +545,11 @@ MACHINE_START_MEMBER(mtx_state, mtx512)
program.install_readwrite_bank(0x8000, 0xbfff, "rommap_bank3");
membank("rommap_bank1")->configure_entries(0, 8, memregion("user2")->base(), 0x2000);
- if (m_extrom->exists())
- membank("rommap_bank1")->configure_entry(2, m_extrom->get_rom_base());
- if (m_rompak->exists())
- membank("rommap_bank1")->configure_entry(7, m_rompak->get_rom_base());
- membank("rommap_bank2")->configure_entries(0, 16, m_ram->pointer() + 0x8000, 0x8000);
- membank("rommap_bank3")->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x8000);
+ membank("rommap_bank2")->configure_entry(0, m_ram->pointer() + 0x8000);
+ membank("rommap_bank2")->configure_entries(1, 15, m_ram->pointer() + 0x10000, 0x8000);
+ membank("rommap_bank3")->configure_entry(0, m_ram->pointer() + 0x4000);
+ membank("rommap_bank3")->configure_entry(1, m_ram->pointer() + 0xc000);
+ membank("rommap_bank3")->configure_entries(2, 14, m_ram->pointer() + 0x14000, 0x8000);
/* setup banks for ram based memory map */
program.install_readwrite_bank(0x0000, 0x3fff, "rammap_bank1");
@@ -542,10 +565,24 @@ MACHINE_START_MEMBER(mtx_state, mtx512)
/* install 4000h bytes common block */
program.install_ram(0xc000, 0xffff, m_ram->pointer());
+
+ /* setup expansion slot */
+ m_exp->set_program_space(&m_maincpu->space(AS_PROGRAM));
+ m_exp->set_io_space(&m_maincpu->space(AS_IO));
}
-MACHINE_RESET_MEMBER(mtx_state, mtx512)
+void mtx_state::machine_reset()
{
+ /* extension board ROMs */
+ if (m_extrom->exists())
+ membank("rommap_bank1")->configure_entry(2, m_extrom->get_rom_base());
+ /* keyboard ROMs */
+ if (ioport("keyboard_rom")->read())
+ membank("rommap_bank1")->configure_entry(7, memregion("keyboard_rom")->base() + (ioport("keyboard_rom")->read() - 1) * 0x2000);
+ /* rompak ROMs */
+ if (m_rompak->exists())
+ membank("rommap_bank1")->configure_entry(7, m_rompak->get_rom_base());
+
/* bank switching */
bankswitch(0);
}