diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2017-10-12 16:16:54 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2017-10-12 16:16:54 -0700 |
commit | 2af68cc8189434998d3177229add49960133e87f (patch) | |
tree | d90f51e2a2b1e8118da2605ada4755b68aba9ed4 | |
parent | 68893f1115bc0c0693d37743eda44ca624990ae3 (diff) | |
download | mu-2af68cc8189434998d3177229add49960133e87f.tar.gz |
4031
No, go back to a vector for `Memory`. We need it to be contiguously laid out in memory so that we can write words all at once rather than a byte at a time.
-rw-r--r-- | subx/010core.cc | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/subx/010core.cc b/subx/010core.cc index cbdd4ad0..06f04b69 100644 --- a/subx/010core.cc +++ b/subx/010core.cc @@ -56,10 +56,10 @@ SF = ZF = OF = false; //:: simulated RAM :(before "End Globals") -map<uint32_t, uint8_t> Memory; +vector<uint8_t> Memory; uint32_t End_of_program = 0; :(before "End Reset") -Memory.clear(); +Memory.resize(1024); End_of_program = 0; //:: core interpreter loop @@ -95,7 +95,7 @@ void run(const string& text_bytes) { // skeleton of how x86 instructions are decoded void run_one_instruction() { uint8_t op=0, op2=0, op3=0; - switch(op = next()) { + switch (op = next()) { // our first opcode case 0xf4: // hlt EIP = End_of_program; @@ -154,8 +154,8 @@ void load_program(const string& text_bytes) { raise << "input program truncated mid-byte\n" << end(); return; } - put(Memory, addr, to_byte(c1, c2)); - trace(99, "load") << addr << " -> " << HEXBYTE << static_cast<int>(get_or_insert(Memory, addr)) << end(); // ugly that iostream doesn't print uint8_t as an integer + Memory.at(addr) = to_byte(c1, c2); + trace(99, "load") << addr << " -> " << HEXBYTE << static_cast<int>(Memory.at(addr)) << end(); // ugly that iostream doesn't print uint8_t as an integer addr++; } End_of_program = addr; @@ -197,8 +197,8 @@ uint8_t to_hex_num(char c) { return 0; } -uint8_t next() { - return get_or_insert(Memory, EIP++); +inline uint8_t next() { + return Memory.at(EIP++); } // read a 32-bit immediate in little-endian order from the instruction stream |