diff options
Diffstat (limited to 'main.cpp')
-rw-r--r-- | main.cpp | 74 |
1 files changed, 60 insertions, 14 deletions
@@ -1,4 +1,4 @@ -#include <iostream> /* src, dest, instr, padding */ +#include <iostream> #include "main.hpp" using namespace std; using namespace ov; @@ -20,8 +20,15 @@ namespace ov { if (val) ov->pc |= 1 << addr; } /* we fall through */ - if (addr >= (unsigned int) 1 << ov->ras) + if (addr >= ov->rs) { ov->opts[addr-ov->rs] = val; + if (val && addr-ov->rs == BUFINCLR) + while (!ov->inbuf.empty()) + ov->inbuf.pop(); + if (val && addr-ov->rs == BUFOUTCLR) + while (!ov->outbuf.empty()) + ov->outbuf.pop(); + } if (addr >= ov->pas && addr-ov->pas < IOLEN) { if (ov->opts[BUFIN] && addr-ov->pas == INA && val == 0) { /* machine read */ if (!ov->inbuf.empty()) { /* and wants more. oh, it looks like we */ @@ -38,19 +45,17 @@ namespace ov { } ov->io[addr-ov->pas] = val; } /* we fall through, but only if !BUF__ */ - storage[addr] = val; + storage.at(addr) = val; } template<typename value_type, typename index_type> Ram<value_type, index_type>::Ram (Ov * ov) { this->ov = ov; - storage.reserve(ov->rs+ov->pas); - for (unsigned int i = 0; i <= ov->rs+ov->pas; i++) - poke(i, 0); + storage.resize(ov->rs+ov->pas, 0); } template<typename value_type, typename index_type> // inventor did not say about Program<value_type, index_type>::Program (Ov * ov) { // initializing program memory, so I this->ov = ov; // do not do that. but by "spec", ram - storage.reserve(ov->ps); // is set to zero and code starts at + storage.resize(ov->ps); // is set to zero and code starts at } // pc == 0, unless of course set with struct NotImplemented : public exception { // Ov::pc. const char * what () const throw () { @@ -76,8 +81,12 @@ namespace ov { bool b[pas]; // buffer. you have to first read all and then write for COPY switch (pm(pc++).i) { // predstavljaj si, da so oklepaji okoli pc++ oglati (; case COPY: - for (int i = 0; i < pas; i++) - b[i] = ram[pm(pc).s+i]; + /* if (pm(pc++).p) // reading from progmem + for (int i = 0; i < pas; i++) + b[i] = [pm[pc].serialized]; + else */ + for (int i = 0; i < pas; i++) + b[i] = ram[pm(pc).s+i]; for (int i = 0; i < pas; i++) ram[pm(pc).d+i] = b[i]; break; @@ -132,11 +141,10 @@ namespace ov { throw BufferingRequired; if (inbuf.size() < 8) throw NotAvailable; - for (int x = 7; x >= 0; x--) { + for (int x = 7; x >= 0; x--) in(i & 1 << x); - } } // buffering must be enabled for this to work. - struct instr Ov::deserialize (const char * c) { // treats i as array of is size + struct instr Ov::deserialize (const char * c) { // treats c as array of is size struct instr r; for (int i = 0; i < ras; i++) if (c[i/8] & 1 << (i%8-8)) @@ -150,14 +158,48 @@ namespace ov { r.p = c[is-1] & 1 << 7; return r; } + string Ov::serialize (struct instr * š, unsigned int n) { + char r[sizeof(š)*n]; + for (unsigned int i = 0; i < n; i++) { + for (int j = 0; j < ras; j++) { + r[i*is+j/8] &= ~(1 << ((ras-1)-j)); + if (š[i].s & 1 << ((ras-1)-j)) + r[i*is+j/8] |= 1 << ((ras-1)-j); + } + for (int j = 0; j < ras; j++) { + int k = j+ras; + r[i*is+k/8] &= ~(1 << ((ras-1)-j)); + if (š[i].d & 1 << ((ras-1)-j)) + r[i*is+k/8] |= 1 << ((ras-1)-j); + } + r[i*is+(2*ras)/8] &= 1 << (ras-2); + if (š[i].i) + r[i*is+(2*ras)/8] |= 1 << (ras-2); + r[i*is+(2*ras)/8] &= 1 << (ras-1); + if (š[i].p) + r[i*is+(2*ras)/8] |= 1 << (ras-1); + } + return string(r); // ugly hack, C/C++ in 2022 still can't return arrays from function + } // serialize(&pstor.storage[0], pstor.storage.size) is valid, because pm has no special MMU void Ov::deserialize (istream & v = cin, unsigned int o = 0) { string c((istreambuf_iterator<char>(v)), istreambuf_iterator<char>()); // eof unsigned int s = c.size(); - if (s % 2) + if ((o+s) % is) throw NotAligned; - for (unsigned int i = 0; i < s; i += is) { + for (unsigned int i = 0; i < s; i += is) pm[o+i/s] = deserialize(c.c_str()+i); + } + void Ov::pd (ostream & o) { + o << "pc: " << pc << "\t" << "opts:" << (opts[BUFOUT] ? " BUFOUT" : "") + << (opts[BUFIN] ? " BUFIN" : "") << endl; + o << "ram:"; + for (unsigned int i = 0; i < rs; i++) { + if (i % 8 == 0) + o << " "; + o << "" << ram[i]; +#pragma message typeof(ram[i]) } + o << endl; } } int main (void /* int argc, char ** argv */) { @@ -165,5 +207,9 @@ int main (void /* int argc, char ** argv */) { << "Stanard input is ready to accept a binary." << endl; Ov ov; ov.deserialize(); + while (1) { + ov.pd(cout); + ov.step(); + } return 0; } |