diff options
Diffstat (limited to 'src/mame/kaypro/kaypro_m.cpp')
-rw-r--r-- | src/mame/kaypro/kaypro_m.cpp | 24 |
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()); } |