diff --git a/loaders.cpp b/loaders.cpp index 74fadf8..9f618b3 100644 --- a/loaders.cpp +++ b/loaders.cpp @@ -137,12 +137,12 @@ void setBootLoader(bus *const b, const bootloader_t which) c -> setRegister(7, start); } -uint16_t loadTape(bus *const b, const std::string & file) +std::optional loadTape(bus *const b, const std::string & file) { FILE *fh = fopen(file.c_str(), "rb"); if (!fh) { DOLOG(ll_error, true, "Cannot open %s", file.c_str()); - return -1; + return { }; } uint16_t start = 0, end = 0; @@ -154,12 +154,15 @@ uint16_t loadTape(bus *const b, const std::string & file) break; int count = (buffer[3] << 8) | buffer[2]; - int p = (buffer[5] << 8) | buffer[4]; + int p = (buffer[5] << 8) | buffer[4]; uint8_t csum = 0; for(int i=2; i<6; i++) csum += buffer[i]; + if (count == 0 || p == 1) + break; + if (count == 6) { // eg no data if (p != 1) { DOLOG(info, true, "Setting start address to %o", p); diff --git a/loaders.h b/loaders.h index 89241ad..d14ba86 100644 --- a/loaders.h +++ b/loaders.h @@ -1,3 +1,4 @@ +#include #include #include @@ -6,7 +7,7 @@ typedef enum { BL_NONE, BL_RK05, BL_RL02 } bootloader_t; -void loadbin(bus *const b, uint16_t base, const char *const file); -void setBootLoader(bus *const b, const bootloader_t which); -uint16_t loadTape(bus *const b, const std::string & file); -void load_p11_x11(bus *const b, const std::string & file); +void loadbin(bus *const b, uint16_t base, const char *const file); +void setBootLoader(bus *const b, const bootloader_t which); +std::optional loadTape(bus *const b, const std::string & file); +void load_p11_x11(bus *const b, const std::string & file); diff --git a/main.cpp b/main.cpp index bc3fc00..a93c8dc 100644 --- a/main.cpp +++ b/main.cpp @@ -206,8 +206,14 @@ int main(int argc, char *argv[]) std::atomic_bool interrupt_emulation { false }; - if (tape.empty() == false) - c->setRegister(7, loadTape(b, tape)); + if (tape.empty() == false) { + auto addr = loadTape(b, tape); + + if (addr.has_value() == false) + return 1; // fail + + c->setRegister(7, addr.value()); + } if (sa_set) c->setRegister(7, start_addr);