aboutsummaryrefslogtreecommitdiffstats
path: root/src/ymh15/test_mips.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ymh15/test_mips.cpp')
-rw-r--r--src/ymh15/test_mips.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/ymh15/test_mips.cpp b/src/ymh15/test_mips.cpp
new file mode 100644
index 0000000..3523844
--- /dev/null
+++ b/src/ymh15/test_mips.cpp
@@ -0,0 +1,101 @@
+#include "../../include/mips.h"
+#include "test_mips_ymh15.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+int main() {
+ mips_mem_h ram = mips_mem_create_ram(4096);
+ mips_cpu_h cpu = mips_cpu_create(ram);
+
+ uint32_t inst = gen_instruction(9, 10, 8, 0, 0x21);
+ uint32_t inst2 = gen_instruction(12, 13, 11, 0, 0x20);
+ uint32_t ans;
+ uint32_t ans2;
+
+ mips_mem_write(ram, 0, 4, (uint8_t*)&inst);
+ mips_mem_write(ram, 4, 4, (uint8_t*)&inst2);
+
+ mips_cpu_set_register(cpu, 9, 4);
+ mips_cpu_set_register(cpu, 10, 5);
+ mips_cpu_set_register(cpu, 12, 232);
+ mips_cpu_set_register(cpu, 13, 2356);
+
+ mips_cpu_step(cpu);
+ mips_cpu_step(cpu);
+
+ mips_cpu_get_register(cpu, 8, &ans);
+ mips_cpu_get_register(cpu, 11, &ans2);
+
+ if(!ans || !ans2) {
+ printf("failed\n");
+ } else {
+ printf("4 + 5 = %d\n", ans);
+ printf("232 + 2356 = %d\n", ans2);
+ }
+ return 0;
+}
+
+// R Type
+uint32_t gen_instruction(uint32_t src1, uint32_t src2, uint32_t dest,
+ uint32_t shift, uint32_t function) {
+ uint32_t inst = 0;
+ inst = inst | src1 << 21 | src2 << 16 | dest << 11 | shift << 6 |
+ function;
+ return inst;
+}
+
+// I Type
+uint32_t gen_instruction(uint32_t opcode, uint32_t src, uint32_t dest,
+ uint32_t Astart) {
+ uint32_t inst = 0;
+ inst = inst | opcode << 26 | src << 21 | dest << 16 | Astart;
+ return inst;
+}
+
+// J Type
+uint32_t gen_instruction(uint32_t opcode, uint32_t memory) {
+ uint32_t inst = 0;
+ inst = inst | opcode << 26 | memory;
+ return inst;
+}
+
+uint32_t change_endianness(uint32_t inst) {
+ inst = (inst << 24 | ((inst << 8)&0x00ff0000) |
+ ((inst >> 8)&0x0000ff00) |inst >> 24);
+ return inst;
+}
+
+void test_endian(mips_mem_h ram) {
+ uint32_t address, length, data, data0, data1, data2, data3, dataf;
+ address = 0;
+ length = 4;
+ data = 0x01234567;
+ data0 = 0;
+ data1 = 0;
+ data2 = 0;
+ data3 = 0;
+ dataf = 0;
+
+ printf("Data in: %#010x\n", data);
+
+ //data = (data << 24 | ((data << 8)&0x00ff0000) |
+ // ((data >> 8)&0x0000ff00) |data >> 24);
+
+ mips_mem_write(ram, address, length, (uint8_t*)&data);
+ mips_mem_read(ram, address, 1, (uint8_t*)&data0);
+ mips_mem_read(ram, address+1, 1, (uint8_t*)&data1);
+ mips_mem_read(ram, address+2, 1, (uint8_t*)&data2);
+ mips_mem_read(ram, address+3, 1, (uint8_t*)&data3);
+
+ mips_mem_read(ram, address, 4, (uint8_t*)&dataf);
+
+ cout << "Data at " << address << ": " << data0 << endl;
+ cout << "Data at " << address+1 << ": " << data1 << endl;
+ cout << "Data at " << address+2 << ": " << data2 << endl;
+ cout << "Data at " << address+3 << ": " << data3 << endl;
+
+ printf("Dataf: %#010x\n", dataf);
+}
+