summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/kaypro/kaypro_m.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/kaypro/kaypro_m.cpp')
-rw-r--r--src/mame/kaypro/kaypro_m.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/mame/kaypro/kaypro_m.cpp b/src/mame/kaypro/kaypro_m.cpp
index 2bda040f82f..dfc11add8b6 100644
--- a/src/mame/kaypro/kaypro_m.cpp
+++ b/src/mame/kaypro/kaypro_m.cpp
@@ -300,27 +300,31 @@ QUICKLOAD_LOAD_MEMBER(kaypro_state::quickload_cb)
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
- /* Avoid loading a program if CP/M-80 is not in memory */
+ // Avoid loading a program if CP/M-80 is not in memory
if ((prog_space.read_byte(0) != 0xc3) || (prog_space.read_byte(5) != 0xc3))
- return std::make_pair(image_error::UNSUPPORTED, std::string());
+ return std::make_pair(image_error::UNSUPPORTED, "CP/M must already be running");
- if (image.length() >= 0xfd00)
- return std::make_pair(image_error::INVALIDLENGTH, std::string());
+ // Check for sufficient RAM based on position of CPM
+ const int mem_avail = 256 * prog_space.read_byte(7) + prog_space.read_byte(6) - 512;
+ if (mem_avail < image.length())
+ return std::make_pair(image_error::UNSPECIFIED, "Insufficient memory available");
- /* Load image to the TPA (Transient Program Area) */
+ // Load image to the TPA (Transient Program Area)
u16 quickload_size = image.length();
for (u16 i = 0; i < quickload_size; i++)
{
u8 data;
if (image.fread(&data, 1) != 1)
- return std::make_pair(image_error::UNSPECIFIED, std::string());
- prog_space.write_byte(i+0x100, data);
+ return std::make_pair(image_error::UNSPECIFIED, "Problem reading the image at offset " + std::to_string(i));
+ prog_space.write_byte(i + 0x100, data);
}
- prog_space.write_byte(0x80, 0); prog_space.write_byte(0x81, 0); // clear out command tail
+ // clear out command tail
+ prog_space.write_byte(0x80, 0);
+ prog_space.write_byte(0x81, 0);
- m_maincpu->set_pc(0x100); // start program
- m_maincpu->set_state_int(Z80_SP, 256 * prog_space.read_byte(7) - 300); // put the stack a bit before BDOS
+ m_maincpu->set_state_int(Z80_SP, mem_avail + 384); // put the stack a bit before BDOS
+ m_maincpu->set_pc(0x100); // start program
return std::make_pair(std::error_condition(), std::string());
}