diff options
Diffstat (limited to 'src/ymh15/test_mips.cpp')
-rw-r--r-- | src/ymh15/test_mips.cpp | 101 |
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); +} + |