From fa6988ac359bc00d04436ef3a2f5efc845a7ca8d Mon Sep 17 00:00:00 2001 From: MarkMango21 Date: Tue, 24 Sep 2024 16:05:34 -0700 Subject: [PATCH 1/2] Implementing Jmp format instructions --- vm.c | 248 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 149 insertions(+), 99 deletions(-) diff --git a/vm.c b/vm.c index 31f369a..af8d5f7 100644 --- a/vm.c +++ b/vm.c @@ -6,7 +6,8 @@ #include "instruction.h" #include "bof.h" -void vm_init(VM *vm) { +void vm_init(VM *vm) +{ memset(vm->memory, 0, sizeof(vm->memory)); memset(vm->registers, 0, sizeof(vm->registers)); vm->pc = 0; @@ -14,19 +15,22 @@ void vm_init(VM *vm) { vm->lo = 0; } -void vm_load_program(VM *vm, BOFFILE bf) { +void vm_load_program(VM *vm, BOFFILE bf) +{ BOFHeader header = bof_read_header(bf); - + // Load instructions - for (int i = 0; i < header.text_length; i++) { + for (int i = 0; i < header.text_length; i++) + { vm->memory[header.text_start_address + i] = bof_read_word(bf); } - + // Load data - for (int i = 0; i < header.data_length; i++) { + for (int i = 0; i < header.data_length; i++) + { vm->memory[header.data_start_address + i] = bof_read_word(bf); } - + // Set initial register values vm->pc = header.text_start_address; vm->registers[0] = header.data_start_address; // $gp @@ -34,151 +38,194 @@ void vm_load_program(VM *vm, BOFFILE bf) { vm->registers[2] = header.stack_bottom_addr; // $fp } -void vm_print_state(VM *vm) { +void vm_print_state(VM *vm) +{ printf("PC: %u\n", vm->pc); - for (int i = 0; i < NUM_REGISTERS; i++) { + for (int i = 0; i < NUM_REGISTERS; i++) + { printf("GPR[$%s]: %d ", regname_get(i), vm->registers[i]); - if ((i + 1) % 4 == 0) printf("\n"); + if ((i + 1) % 4 == 0) + printf("\n"); } printf("\n"); // Print memory contents (you may want to limit this to relevant sections) // ... } -void vm_run(VM *vm) { +void vm_run(VM *vm) +{ bool tracing = true; - while (1) { - if (tracing) vm_print_state(vm); + while (1) + { + if (tracing) + vm_print_state(vm); // Fetch instruction - bin_instr_t instr = *(bin_instr_t*)&vm->memory[vm->pc]; - + bin_instr_t instr = *(bin_instr_t *)&vm->memory[vm->pc]; + // Print the current instruction printf("==> %u: %s\n", vm->pc, instruction_assembly_form(vm->pc, instr)); // Increment PC vm->pc++; - + // Decode and execute instruction - switch (instruction_type(instr)) { - case comp_instr_type: - vm_execute_comp_instr(vm, instr.comp); - break; - case other_comp_instr_type: - vm_execute_other_comp_instr(vm, instr.othc); - break; - case immed_instr_type: - vm_execute_immed_instr(vm, instr.immed); - break; - case jump_instr_type: - vm_execute_jump_instr(vm, instr.jump); - break; - case syscall_instr_type: - if (vm_execute_syscall(vm, instr.syscall) == 1) { - return; // Exit the VM - } - break; - default: - bail_with_error("Unknown instruction type"); + switch (instruction_type(instr)) + { + case comp_instr_type: + vm_execute_comp_instr(vm, instr.comp); + break; + case other_comp_instr_type: + vm_execute_other_comp_instr(vm, instr.othc); + break; + case immed_instr_type: + vm_execute_immed_instr(vm, instr.immed); + break; + case jump_instr_type: + vm_execute_jump_instr(vm, instr.jump); + break; + case syscall_instr_type: + if (vm_execute_syscall(vm, instr.syscall) == 1) + { + return; // Exit the VM + } + break; + default: + bail_with_error("Unknown instruction type"); } } } // Helper function to get memory address -static inline word_type* get_memory_address(VM *vm, reg_num_type reg, offset_type offset) { +static inline word_type *get_memory_address(VM *vm, reg_num_type reg, offset_type offset) +{ return &vm->memory[vm->registers[reg] + machine_types_formOffset(offset)]; } // Implement these functions next -void vm_execute_comp_instr(VM *vm, comp_instr_t instr) { +void vm_execute_comp_instr(VM *vm, comp_instr_t instr) +{ // TODO: Implement computational instructions } -void vm_execute_other_comp_instr(VM *vm, other_comp_instr_t instr) { +void vm_execute_other_comp_instr(VM *vm, other_comp_instr_t instr) +{ // TODO: Implement other computational instructions } -void vm_execute_immed_instr(VM *vm, immed_instr_t instr) { +void vm_execute_immed_instr(VM *vm, immed_instr_t instr) +{ word_type *target = get_memory_address(vm, instr.reg, instr.offset); - switch (instr.op) { - case ADDI_O: - *target += machine_types_sgnExt(instr.immed); - break; - case ANDI_O: - *target &= machine_types_zeroExt(instr.immed); - break; - case BORI_O: - *target |= machine_types_zeroExt(instr.immed); - break; - case NORI_O: - *target = ~(*target | machine_types_zeroExt(instr.immed)); - break; - case XORI_O: - *target ^= machine_types_zeroExt(instr.immed); - break; - case BEQ_O: - if (*get_memory_address(vm, SP, 0) == *target) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - case BGEZ_O: - if ((int)*target >= 0) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - case BGTZ_O: - if ((int)*target > 0) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - case BLEZ_O: - if ((int)*target <= 0) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - case BLTZ_O: - if ((int)*target < 0) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - case BNE_O: - if (*get_memory_address(vm, SP, 0) != *target) { - vm->pc += machine_types_formOffset(instr.immed); - } - break; - default: - bail_with_error("Unknown immediate instruction opcode: %d", instr.op); + switch (instr.op) + { + case ADDI_O: + *target += machine_types_sgnExt(instr.immed); + break; + case ANDI_O: + *target &= machine_types_zeroExt(instr.immed); + break; + case BORI_O: + *target |= machine_types_zeroExt(instr.immed); + break; + case NORI_O: + *target = ~(*target | machine_types_zeroExt(instr.immed)); + break; + case XORI_O: + *target ^= machine_types_zeroExt(instr.immed); + break; + case BEQ_O: + if (*get_memory_address(vm, SP, 0) == *target) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + case BGEZ_O: + if ((int)*target >= 0) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + case BGTZ_O: + if ((int)*target > 0) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + case BLEZ_O: + if ((int)*target <= 0) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + case BLTZ_O: + if ((int)*target < 0) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + case BNE_O: + if (*get_memory_address(vm, SP, 0) != *target) + { + vm->pc += machine_types_formOffset(instr.immed); + } + break; + default: + bail_with_error("Unknown immediate instruction opcode: %d", instr.op); } } -void vm_execute_jump_instr(VM *vm, jump_instr_t instr) { +void vm_execute_jump_instr(VM *vm, jump_instr_t instr) +{ + switch (instr.op) + { + case JMPA_O: + vm->pc += machine_types_formAddress(vm->pc, instr.op); + break; + case CALL_O: + vm->registers[RA] = vm->pc; + vm->pc += machine_types_formAddress(vm->pc, instr.op); + break; + case RTN_O: + vm->pc = vm->registers[RA]; + break; + default: + bail_with_error("Unknown immediate instruction opcode: %d", instr.op); + } + // TODO: Implement jump instructions } -int vm_execute_syscall(VM *vm, syscall_instr_t instr) { +int vm_execute_syscall(VM *vm, syscall_instr_t instr) +{ // TODO: Implement system calls return 0; } -void vm_print_program(VM *vm) { +void vm_print_program(VM *vm) +{ printf("Address Instruction\n"); - for (unsigned int i = 0; i < MEMORY_SIZE_IN_WORDS; i++) { - bin_instr_t instr = *(bin_instr_t*)&vm->memory[i]; - if (instruction_type(instr) == error_instr_type) break; + for (unsigned int i = 0; i < MEMORY_SIZE_IN_WORDS; i++) + { + bin_instr_t instr = *(bin_instr_t *)&vm->memory[i]; + if (instruction_type(instr) == error_instr_type) + break; printf("%u: %s\n", i, instruction_assembly_form(i, instr)); } } -int main(int argc, char *argv[]) { - if (argc < 2) { +int main(int argc, char *argv[]) +{ + if (argc < 2) + { bail_with_error("Usage: %s [-p] ", argv[0]); } bool print_mode = false; char *filename = argv[1]; - if (argc == 3 && strcmp(argv[1], "-p") == 0) { + if (argc == 3 && strcmp(argv[1], "-p") == 0) + { print_mode = true; filename = argv[2]; } @@ -188,9 +235,12 @@ int main(int argc, char *argv[]) { vm_init(&vm); vm_load_program(&vm, bf); - if (print_mode) { + if (print_mode) + { vm_print_program(&vm); - } else { + } + else + { vm_run(&vm); } From c5fd71d3af07cd45c27ba1d8c42a63fdaa1dab61 Mon Sep 17 00:00:00 2001 From: MarkMango21 Date: Wed, 25 Sep 2024 12:54:23 -0700 Subject: [PATCH 2/2] Big changes Hi, I fixed the jump instructions format, I tried to take a look at the printing process and there was some process. Plus I change the makefile by removing from the VM line: mchine_main.o and machine.o --- Makefile | 2 +- bof.o | Bin 0 -> 16560 bytes instruction.c | 921 +++++++++++++++++++++++++----------------------- instruction.o | Bin 0 -> 35936 bytes machine_types.o | Bin 0 -> 7968 bytes regname.o | Bin 0 -> 4224 bytes utilities.o | Bin 0 -> 10984 bytes vm | Bin 0 -> 62272 bytes vm.c | 328 +++++++++++++---- vm.h | 13 +- vm.o | Bin 0 -> 28176 bytes vm_test0.myp | 4 + vm_test1.myp | 13 + vm_test2.myp | 10 + vm_test3.myp | 21 ++ vm_test4.myp | 41 +++ vm_test5.myp | 35 ++ vm_test6.myp | 25 ++ vm_test7.myp | 39 ++ vm_test8.myp | 10 + vm_test9.myp | 17 + vm_testA.myp | 14 + vm_testB.myp | 15 + 23 files changed, 1008 insertions(+), 500 deletions(-) create mode 100644 bof.o create mode 100644 instruction.o create mode 100644 machine_types.o create mode 100644 regname.o create mode 100644 utilities.o create mode 100644 vm create mode 100644 vm.o create mode 100644 vm_test0.myp create mode 100644 vm_test1.myp create mode 100644 vm_test2.myp create mode 100644 vm_test3.myp create mode 100644 vm_test4.myp create mode 100644 vm_test5.myp create mode 100644 vm_test6.myp create mode 100644 vm_test7.myp create mode 100644 vm_test8.myp create mode 100644 vm_test9.myp create mode 100644 vm_testA.myp create mode 100644 vm_testB.myp diff --git a/Makefile b/Makefile index d4cde18..a443d17 100755 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ RM = rm -f SUBMISSIONZIPFILE = submission.zip ZIP = zip -9 # Add the names of your own files with a .o suffix to link them into the VM -VM_OBJECTS = vm.o machine_main.o machine.o \ +VM_OBJECTS = vm.o \ machine_types.o instruction.o bof.o \ regname.o utilities.o TESTS = vm_test0.bof vm_test1.bof vm_test2.bof vm_test3.bof \ diff --git a/bof.o b/bof.o new file mode 100644 index 0000000000000000000000000000000000000000..d44853ee63433600d15b756cd96586fd2a35f848 GIT binary patch literal 16560 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

lBnHtQ(MqcqQgG0KS>%2I6 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 A;s5{u literal 0 HcmV?d00001 diff --git a/machine_types.o b/machine_types.o new file mode 100644 index 0000000000000000000000000000000000000000..24a68ce6cc20099a84634faaa637f3f7a26da48b GIT binary patch literal 7968 zcmcIpYitzP6~42}m^JGsZZWP&y+k}yyv7eG5JQbD2b_{Xp-z#&TGqSc-4(kt?mT!E z0u60~Lm$vb)T$O~()MSfwyIjBwh|&yQ~IZoDm8!lBR`7NC{(3QBca5td(NG6yfc?s zOcM1-o_p_izH{!G`#AT``s~P_M`D^LSTwOiR9lP+aipVKAClD}(Jq#WcbY%>-q`Nx zo6~1zFOJNPzf!Bc`~0nh&zXMhZ)krbNS*fXfc0vCZ%<#pIC5w8+}xa~f4%As%v-?x z%V%cifb?W1u%~~w`|CP-+CBZ+RV=03w;u$K`0w1@nU0#AOVz#ueiz?|-#Z_|Z!`G) zps~OV{9oP?2JZvMGB?+J?7rfkK6C5h$gT5l#-~SS&%-2mIyB!-UL1p!aclkS=dUdq ze?{z_oOBE~RdQ0UWu?klyI^cftv_$w$HuE3)aLIydcW7jMjsG`mM8)}*<4sF5! zVwVp$*+xZZL@V+)JK7;!BP>U{YQe- zL8cz0iZzG*ed4s!Ow=v{%e)6i+e<9Tp56s6YhpxQ| z-;iY$RkWFIm~3s|uxQ^zBcNqP`y+n6C?LUrx;1%(_*isOU7Iw@M_FJCgAx zSSe}kGad0JU%j$!ZAYuNbn(#g(;ZqHtjA>nRWaWZ)_#zjT-!0)=Ce;pb{+IXj;No- zt=j6Qwq(4kvkQqW?XdQ#YuH2eYs4sYvZNV;!Ag?6C$YP=9fQ(ogDy#p5VdF;z!#Bf z|2>++795Trd`qjDP8O7*AqAO z*kxTyJgql>%CCK8=e@yz{(|28kZ<(Ws!>1>)z+8v`awNW(CZ6&@{q2*9E-u*%%{kV zdveMUPSLULE0X- z?7VM?Uc|1)$5O++pHB7mrU%j+Q{5HUGmY&9!!+zt4w_jzSKNML%jWLQ1F7yps@rk% z+jGG0p3FKY&0Nv8Ov`h+J@a_U%y+xliL&8<(s8r7quo=sfmXqFl@^+^BHd{<60RUWv6t?@W(yWd-!E0ExY2M`68-Ur(oi2hHb(F;6>S?TRJ`O zX^e-#y`0N6;#Jp7PsMb5ay?(L?4!<9HfQt<@7>owu(5C7&fcB_rOH&(LVL?)7A|_sPD#^u~ep z1ap$WtbzF(PXX8)n4GR5CQn}|KL&p&+Nu3QJJF(bHY`qDf~2zoF#JQ2`G2IT<>}aP zW8E$w0ERj|2vBP25BqBWaAN!YRr}MVmj@r~4^{Ouq?gAi>tlN*VFl=Zvw;3Dq?boK z+aIm^pIyLyg-pJ5H;J$xTtI)A^zu%`_Bp?Q>iVt%O%{oN;#bdI5|8{+!?~1ad<0+K zqayI|;lzZvf5+qId>MzUUX;WIob!sbLVIZ-PQE*=A)MP>4icV%5``}^c-cWe4@*=C zxkjLF5uPEOuUL3bWuK&y#f$JnKX_|JVg7ZfBiuVQ1moyij_LI!3}CqLO=< z5t;wP6q&`taYi0iFqfO)4+V2xJ^anWFAXSX5d^{M!Cc7r*AN6jKCW)Ye}o_i^Eq$+ z)Q9ilzd<Hf4X@?+C@cCBVmc3h(qLlqYa6A|2 zB~B_hud{Os{wnqRjDl|<{2L0shuYs&@PowviGpLEN4e@3^KrgF{Og2cQ?6->|6PS& zApAXr&-u5N{P8&OIgwKECFEx{;oL9h_s=T)acb{V_jPs$FZ){{E5LFoG_c@~ADQcfnaE{}L3eNL>O~HBnys6;4 z4&mw|h2!CM&ijaQ-Y-K6pV!|J1?T&aNINGh@OcfTYx`x9Yqn9&rd)Rr#Dr}e0~#6=WM|ESfu>cg3_mTf3G~NRgfp_8v*3qZ z_|8t7@U5SQPbT=*hc7^C7fde=zXD7dwtJHN8pX_{ovj!&kRP!~fjtgc@T@_XL-+tu ze@LR?^_B4Kgg@LDL+}@r+q9tgJjVMA+VZ)&oXEIe5$Eqif`x?>9wBP~xUbOXhqcH3 zhd$NrrU+Q0bjb08iIg4iR45XEjsp6n;#lQw1$NZ*&+9*`Z?wEX7xg>T|HlD~T7QVCxdZLb(M7tV#IH0( RYYqDg6yTrGSwK|#{{i?t!yo_v literal 0 HcmV?d00001 diff --git a/regname.o b/regname.o new file mode 100644 index 0000000000000000000000000000000000000000..42dab6ef22c0cf001e43bb385b3d245fe4edcce2 GIT binary patch literal 4224 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 OyRQhvrz3(W>i!F;pYB%x literal 0 HcmV?d00001 diff --git a/vm.c b/vm.c index af8d5f7..9863956 100644 --- a/vm.c +++ b/vm.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "vm.h" #include "utilities.h" #include "instruction.h" @@ -18,11 +19,13 @@ void vm_init(VM *vm) void vm_load_program(VM *vm, BOFFILE bf) { BOFHeader header = bof_read_header(bf); - + vm->text_length = header.text_length; + vm->data_length = header.data_length; // Load instructions for (int i = 0; i < header.text_length; i++) { - vm->memory[header.text_start_address + i] = bof_read_word(bf); + vm->instructions[i] = instruction_read(bf); + // printf(" \n 1 \n"); } // Load data @@ -38,80 +41,125 @@ void vm_load_program(VM *vm, BOFFILE bf) vm->registers[2] = header.stack_bottom_addr; // $fp } -void vm_print_state(VM *vm) +void vm_print_words(VM *vm) { - printf("PC: %u\n", vm->pc); - for (int i = 0; i < NUM_REGISTERS; i++) - { - printf("GPR[$%s]: %d ", regname_get(i), vm->registers[i]); - if ((i + 1) % 4 == 0) - printf("\n"); - } - printf("\n"); - // Print memory contents (you may want to limit this to relevant sections) - // ... -} + word_type address = vm->registers[0]; // Correct access to registers array + int count = 0; // Use a counter for formatting + printf(" "); -void vm_run(VM *vm) -{ - bool tracing = true; - while (1) + // Loop through memory up to the stack pointer (registers[1] = $sp) + while (address <= vm->registers[2]) { - if (tracing) - vm_print_state(vm); - - // Fetch instruction - bin_instr_t instr = *(bin_instr_t *)&vm->memory[vm->pc]; - - // Print the current instruction - printf("==> %u: %s\n", vm->pc, instruction_assembly_form(vm->pc, instr)); + // Print memory address and value + printf("%6d: %d ", address, vm->memory[address]); + count++; - // Increment PC - vm->pc++; + // Print a newline every 4 values for readability + if (count % 5 == 0) + printf("\n"); - // Decode and execute instruction - switch (instruction_type(instr)) + // Detect blocks of zeros and print "..." + if (address < vm->registers[2] - 2 && vm->memory[address] == 0 && vm->memory[address + 1] == 0) { - case comp_instr_type: - vm_execute_comp_instr(vm, instr.comp); - break; - case other_comp_instr_type: - vm_execute_other_comp_instr(vm, instr.othc); - break; - case immed_instr_type: - vm_execute_immed_instr(vm, instr.immed); - break; - case jump_instr_type: - vm_execute_jump_instr(vm, instr.jump); - break; - case syscall_instr_type: - if (vm_execute_syscall(vm, instr.syscall) == 1) + printf("\t...\t"); + // Skip over consecutive zeros + while (vm->memory[address] == 0 && vm->memory[address + 1] == 0 && address < vm->registers[2] - 1) { - return; // Exit the VM + address++; } - break; - default: - bail_with_error("Unknown instruction type"); } + + // Move to the next memory address + address++; } + printf("\n"); +} + +void vm_print_state(VM *vm) +{ + + printf(" PC: %u\n", vm->pc); + for (int i = 0; i < NUM_REGISTERS; i++) + { + printf("GPR[$%s]: %-6d\t", regname_get(i), vm->registers[i]); + if ((i + 1) % 5 == 0) + printf("\n"); + } + printf("\n"); + // Print memory contents (you may want to limit this to relevant sections) + // ... + vm_print_words(vm); } -// Helper function to get memory address static inline word_type *get_memory_address(VM *vm, reg_num_type reg, offset_type offset) { return &vm->memory[vm->registers[reg] + machine_types_formOffset(offset)]; } -// Implement these functions next -void vm_execute_comp_instr(VM *vm, comp_instr_t instr) +static inline word_type *get_p(VM *vm, reg_num_type reg) { - // TODO: Implement computational instructions + return &vm->memory[vm->registers[reg]]; } -void vm_execute_other_comp_instr(VM *vm, other_comp_instr_t instr) +void vm_execute_comp_instr(VM *vm, comp_instr_t instr) { - // TODO: Implement other computational instructions + word_type *target = get_memory_address(vm, instr.rt, instr.ot); + word_type *sp = get_p(vm, 1); + word_type *s_os = get_memory_address(vm, instr.rs, instr.os); + word_type *rt = get_p(vm, instr.rt); + word_type *rs = get_p(vm, instr.rs); + + switch (instr.func) + { + case NOP_F: + break; + case ADD_F: + *target = *sp + *s_os; + break; + case SUB_F: + *target = *sp - *s_os; + break; + case CPW_F: + *target = *s_os; + break; + case AND_F: + *target = *sp & *s_os; + break; + + case BOR_F: + *target = *sp | *s_os; + break; + case NOR_F: + *target = ~(*sp | *s_os); + break; + case XOR_F: + *target = *sp ^ *s_os; + break; + case LWR_F: + vm->registers[instr.rt] = *s_os; + break; + + case SWR_F: + *target = vm->registers[instr.rs]; + break; + case SCA_F: + *target = vm->registers[instr.rs] + machine_types_formOffset(instr.os); + break; + case LWI_F: + *target = vm->memory[*s_os]; + break; + + case NEG_F: + *target = -(*s_os); + break; + + default: + bail_with_error("Unknown immediate instruction opcode: %d", instr.op); + } + + // TODO: Implement computational instructions } +// Implement these functions next void vm_execute_immed_instr(VM *vm, immed_instr_t instr) { @@ -175,16 +223,90 @@ void vm_execute_immed_instr(VM *vm, immed_instr_t instr) } } +void vm_execute_other_comp_instr(VM *vm, other_comp_instr_t instr) +{ + // TODO: Implement other computational instructions + word_type *target = get_memory_address(vm, instr.reg, instr.offset); + + word_type *sp = get_p(vm, 1); + word_type *ra = get_p(vm, 7); + // word_type *s_os = get_memory_address(vm, instr.rs, instr.os); + word_type *r = get_p(vm, instr.reg); + int64_t temp; + // printf("\n\n\n\\n\n\n %d \n\n\n\n\n\n", instr.op); + switch (instr.func) + { + case LIT_F: + *target = machine_types_sgnExt(instr.arg); + break; + + case ARI_F: + vm->registers[instr.reg] += machine_types_sgnExt(instr.arg); + break; + + case SRI_F: + // printf(" I am here \n\n\n"); + vm->registers[instr.reg] -= machine_types_sgnExt(instr.arg); + break; + + case MUL_F: + + temp = (int32_t)*sp * (int32_t)*target; + + vm->hi = ((temp >> 32) & 0xFFFFFFFF); + vm->lo = (temp & 0xFFFFFFFF); + + break; + + case DIV_F: + vm->hi = *sp % *target; + vm->lo = *sp / *target; + break; + + case CFHI_F: + *target = vm->hi; + break; + + case CFLO_F: + *target = vm->lo; + break; + + case SLL_F: + *target = *sp << instr.arg; + break; + + case SRL_F: + *target = *sp >> instr.arg; + break; + + case JMP_F: + vm->pc = *target; + break; + + case CSI_F: + vm->registers[7] = vm->pc; + vm->pc = *target; + break; + + case JREL_F: + vm->pc = ((vm->pc - 1) + machine_types_formOffset(instr.arg)); + break; + + default: + bail_with_error("Unknown immediate instruction opcode: %d", instr.op); + } +} + void vm_execute_jump_instr(VM *vm, jump_instr_t instr) { switch (instr.op) { case JMPA_O: - vm->pc += machine_types_formAddress(vm->pc, instr.op); + vm->pc = machine_types_formAddress(vm->pc, instr.op); break; case CALL_O: vm->registers[RA] = vm->pc; - vm->pc += machine_types_formAddress(vm->pc, instr.op); + vm->pc = machine_types_formAddress(vm->pc, instr.op); break; case RTN_O: vm->pc = vm->registers[RA]; @@ -196,18 +318,102 @@ void vm_execute_jump_instr(VM *vm, jump_instr_t instr) // TODO: Implement jump instructions } -int vm_execute_syscall(VM *vm, syscall_instr_t instr) +void vm_run(VM *vm) { - // TODO: Implement system calls - return 0; + bool tracing; + bool execute = true; + vm_print_state(vm); + while (execute == true) + { + // Increment PC + vm->pc++; + bin_instr_t instr = *(bin_instr_t *)&vm->instructions[vm->pc]; + + if (tracing) + { + printf("\n==> %u: %s\n", vm->pc, instruction_assembly_form(vm->pc, instr)); + vm_print_state(vm); + } + + if (instruction_type(instr) == syscall_instr_type && instr.syscall.code == 1) + { + // Terminate VM if it's an exit syscall (code == 1) + execute = false; + return; // Exit the VM + } + // Fetch instruction + + // Print the current instruction + + // Decode and execute instruction + switch (instruction_type(instr)) + { + case comp_instr_type: + + vm_execute_comp_instr(vm, instr.comp); + break; + case other_comp_instr_type: + vm_execute_other_comp_instr(vm, instr.othc); + break; + case immed_instr_type: + + vm_execute_immed_instr(vm, instr.immed); + break; + case jump_instr_type: + vm_execute_jump_instr(vm, instr.jump); + break; + case syscall_instr_type: + + // printf("\n\n\n\n %d \n\n\n\n\n", instr.syscall.code); + + if (instr.syscall.code == 1) + { + + execute = false; + return; // Exit the VM + } + else if (instr.syscall.code == 2) + { + word_type *sp = get_p(vm, 1); + char *str = (char *)get_memory_address(vm, instr.syscall.reg, instr.syscall.offset); + *sp = printf("%s", str); + } + else if (instr.syscall.code == 4) + { + + word_type *sp = get_p(vm, 1); + int ch = *(get_memory_address(vm, instr.syscall.reg, instr.syscall.offset)); + *sp = fputc(ch, stdout); + } + else if (instr.syscall.code == 5) + { + word_type *target = get_memory_address(vm, instr.syscall.reg, instr.syscall.offset); + *target = getc(stdin); + } + else if (instr.syscall.code == 2046) + { + tracing = true; + } + else if (instr.syscall.code == 2047) + { + tracing = false; + } + break; + default: + bail_with_error("Unknown instruction type"); + } + } } +// Helper function to get memory address + void vm_print_program(VM *vm) { printf("Address Instruction\n"); - for (unsigned int i = 0; i < MEMORY_SIZE_IN_WORDS; i++) + for (unsigned int i = 0; i < vm->text_length; i++) { - bin_instr_t instr = *(bin_instr_t *)&vm->memory[i]; + bin_instr_t instr = *(bin_instr_t *)&vm->instructions[i]; + if (instruction_type(instr) == error_instr_type) break; printf("%u: %s\n", i, instruction_assembly_form(i, instr)); diff --git a/vm.h b/vm.h index 97df824..4bbf060 100644 --- a/vm.h +++ b/vm.h @@ -3,22 +3,23 @@ #include "machine_types.h" #include "instruction.h" +#include "regname.h" #include "bof.h" #define MEMORY_SIZE_IN_WORDS 32768 #define NUM_REGISTERS 8 -#define GP 0 // Global Pointer -#define SP 1 // Stack Pointer -#define FP 2 // Frame Pointer -#define RA 7 // Return Address - -typedef struct { +typedef struct +{ word_type memory[MEMORY_SIZE_IN_WORDS]; word_type registers[NUM_REGISTERS]; + bin_instr_t instructions[MEMORY_SIZE_IN_WORDS]; word_type pc; word_type hi; word_type lo; + word_type data_length; + word_type text_length; + word_type memory_index; } VM; void vm_init(VM *vm); diff --git a/vm.o b/vm.o new file mode 100644 index 0000000000000000000000000000000000000000..d6c5d0ab1575088bfa0cbe197f965f0ed1ea28ff GIT binary patch literal 28176 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 d4+7+W3@adU(A*K