diff --git a/main.cpp b/main.cpp index 5c90c4b..125f92d 100644 --- a/main.cpp +++ b/main.cpp @@ -164,7 +164,7 @@ int main(int argc, char *argv[]) c -> setEmulateMFPT(true); - std::string rk05_file; + std::vector rk05_files; bool testCases = false; int opt = -1; while((opt = getopt(argc, argv, "hm:T:R:p:ndL:")) != -1) @@ -196,7 +196,7 @@ int main(int argc, char *argv[]) break; case 'R': - rk05_file = optarg; + rk05_files.push_back(optarg); break; case 'p': @@ -220,8 +220,8 @@ int main(int argc, char *argv[]) else cnsl = new console_posix(&terminate, b); - if (rk05_file.empty() == false) { - b->add_rk05(new rk05(rk05_file, b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); + if (rk05_files.empty() == false) { + b->add_rk05(new rk05(rk05_files, b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); setBootLoader(b); } @@ -262,26 +262,8 @@ int main(int argc, char *argv[]) for(;;) { c->step(); - if (event) { -#if !defined(ESP32) - FILE *fh = fopen("halt.mac", "wb"); - if (fh) { - uint16_t pc = 024320; - fprintf(fh, "\t.LINK %06o\n", pc); - - for(int i=0; i<4096; i += 2) - fprintf(fh, "\t.DW %06o\n", b->readWord((pc + i) & 0xffff)); - - fprintf(fh, "\tmake_raw\n"); - - fclose(fh); - } -#endif - - //c->setRegister(7, 01000); - //c->resetHalt(); + if (event) break; - } icount++; @@ -301,12 +283,6 @@ int main(int argc, char *argv[]) D(fprintf(stderr, "instructions_executed: %u, took_ms: %lu, new refresh_interval: %u\n", icount, took_ms, refresh_interval);) -// if (withUI) { -// mvwprintw(w_main_b -> win, 0, 24, "%.1f/s ", icount * 1000.0 / took_ms); -// mvwprintw(w_main_b -> win, 0, 42, "%06o", b->get_switch_register()); -// mydoupdate(); -// } - if (terminate) event = 1; diff --git a/rk05.cpp b/rk05.cpp index 9d89f14..0cb168f 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -1,4 +1,4 @@ -// (C) 2018 by Folkert van Heusden +// (C) 2018-2022 by Folkert van Heusden // Released under Apache License v2.0 #include #include @@ -24,7 +24,7 @@ const char * const regnames[] = { "RK05_DATABUF " }; -rk05::rk05(const std::string & file, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity) : +rk05::rk05(const std::vector & files, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity) : b(b), disk_read_acitivity(disk_read_acitivity), disk_write_acitivity(disk_write_acitivity) @@ -64,9 +64,13 @@ rk05::rk05(const std::string & file, bus *const b, std::atomic_bool *const disk_ Serial.println(F("rk05: open failed")); } #else - fh = fopen(file.c_str(), "rb"); - if (!fh) - error_exit(true, "rk05: cannot open \"%s\"", file.c_str()); + for(auto file : files) { + FILE *fh = fopen(file.c_str(), "rb"); + if (!fh) + error_exit(true, "rk05: cannot open \"%s\"", file.c_str()); + + fhs.push_back(fh); + } #endif } @@ -75,7 +79,8 @@ rk05::~rk05() #if defined(ESP32) fh.close(); #else - fclose(fh); + for(auto fh : fhs) + fclose(fh); #endif } @@ -146,15 +151,16 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) if (addr == RK05_CS) { if (v & 1) { // GO - const int func = (v >> 1) & 7; // FUNCTION - int16_t wc = registers[(RK05_WC - RK05_BASE) / 2]; + const int func = (v >> 1) & 7; // FUNCTION + int16_t wc = registers[(RK05_WC - RK05_BASE) / 2]; const size_t reclen = wc < 0 ? (-wc * 2) : wc * 2; - uint16_t dummy = registers[(RK05_DA - RK05_BASE) / 2]; - uint8_t sector = dummy & 0b1111; - uint8_t surface = (dummy >> 4) & 1; - int track = (dummy >> 4) & 511; - uint16_t cylinder = (dummy >> 5) & 255; + uint16_t temp = registers[(RK05_DA - RK05_BASE) / 2]; + uint8_t sector = temp & 0b1111; + uint8_t surface = (temp >> 4) & 1; + int track = (temp >> 4) & 511; + uint16_t cylinder = (temp >> 5) & 255; + uint8_t device = temp >> 13; const int diskoff = track * 12 + sector; @@ -168,7 +174,7 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) else if (func == 1) { // write *disk_write_acitivity = true; - D(fprintf(stderr, "RK05 position sec %d surf %d cyl %d, reclen %zo, WRITE to %o, mem: %o\n", sector, surface, cylinder, reclen, diskoffb, memoff);) + D(fprintf(stderr, "RK05 drive %d position sec %d surf %d cyl %d, reclen %zo, WRITE to %o, mem: %o\n", device, sector, surface, cylinder, reclen, diskoffb, memoff);) uint32_t p = reclen; // FIXME for(size_t i=0; igetCpu()->queue_interrupt(5, 0220); + } } } diff --git a/rk05.h b/rk05.h index a34b47c..3196b45 100644 --- a/rk05.h +++ b/rk05.h @@ -1,4 +1,4 @@ -// (C) 2018 by Folkert van Heusden +// (C) 2018-2022 by Folkert van Heusden // Released under Apache License v2.0 #pragma once @@ -6,6 +6,7 @@ #include #include #include +#include #if defined(ESP32) #include @@ -37,13 +38,13 @@ private: SdFat32 sd; File32 fh; #else - FILE *fh; + std::vector fhs; #endif std::atomic_bool *const disk_read_acitivity { nullptr }; std::atomic_bool *const disk_write_acitivity { nullptr }; public: - rk05(const std::string & file, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity); + rk05(const std::vector & files, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity); virtual ~rk05(); uint8_t readByte(const uint16_t addr);