From ae8ba5d80beec27c9d2024cbd441820afee59d84 Mon Sep 17 00:00:00 2001 From: g1n Date: Tue, 10 May 2022 17:28:29 +0300 Subject: [PATCH] common and ocpu: Implemented stack, added PUSH and POP instructions --- src/include/yemu/ocpu.h | 2 ++ src/include/yemu/stack.h | 10 ++++++++++ src/ocpu/ocpu.c | 16 ++++++++++++++++ src/stack.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 src/include/yemu/stack.h create mode 100644 src/stack.c diff --git a/src/include/yemu/ocpu.h b/src/include/yemu/ocpu.h index 89daeef..d2d47ff 100644 --- a/src/include/yemu/ocpu.h +++ b/src/include/yemu/ocpu.h @@ -61,6 +61,8 @@ #define INS_NAND_REG 0xC5 #define INS_CMP_IM 0x26 #define INS_CMP_REG 0xC6 +#define INS_PUSH_IM 0x30 +#define INS_POP 0x31 #define INS_OCPU_NOP 0x90 #define INS_OCPU_SEC 0x61 #define INS_OCPU_CLC 0x62 diff --git a/src/include/yemu/stack.h b/src/include/yemu/stack.h new file mode 100644 index 0000000..afeb1b0 --- /dev/null +++ b/src/include/yemu/stack.h @@ -0,0 +1,10 @@ +#ifndef YEMU_STACK_H +#define YEMU_STACK_H + +typedef int stack_t; + +int get_last_item_from_stack(); +int pop(); +void push(int value); + +#endif diff --git a/src/ocpu/ocpu.c b/src/ocpu/ocpu.c index c4a4fb5..c677d0d 100644 --- a/src/ocpu/ocpu.c +++ b/src/ocpu/ocpu.c @@ -1,8 +1,13 @@ #include +#include #include +#include struct OCPU ocpu; struct OCPU_MEMORY ocpu_mem; +int stack_size = 64000; +stack_t *stack; +byte *sp; void ocpu_memory_init () { for (int i = 0; i < MAX_MEMORY; i++){ @@ -448,6 +453,13 @@ void ocpu_execute() { ocpu.CF = 0; } break; + case INS_PUSH_IM: + push(ocpu_fetch_byte()); + printf("STACK: push 0x%x to stack address 0x%x\n", get_last_item_from_stack(), ocpu.SP); + break; + case INS_POP: + printf("STACK: pop 0x%x from stack address 0x%x\n", pop(), ocpu.SP); + break; case INS_OCPU_NOP: break; case INS_OCPU_SEC: @@ -469,6 +481,9 @@ void initOCPU(FILE *infile) { ocpu_reset(); int ch; int pos = 0; + stack = malloc(stack_size*sizeof(byte)); + ocpu.SP = 0; + sp = &ocpu.SP; while (1) { // FIXME ch = fgetc(infile); if (ch == EOF) @@ -479,5 +494,6 @@ void initOCPU(FILE *infile) { ocpu_execute(); ocpu_dump_ocpu(ocpu); + free(stack); return; } diff --git a/src/stack.c b/src/stack.c new file mode 100644 index 0000000..fbbb669 --- /dev/null +++ b/src/stack.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +extern stack_t *stack; +extern unsigned int stack_size; +extern byte *sp; + +int get_last_item_from_stack() { + if ((int)(*sp) <= 0) { + printf("Stack Underflow\n"); + return -1; + } + return stack[(*sp)]; +} + +void push(int value) { + if (*sp >= stack_size-1) { + printf("Stack Overflow\n"); + } else { + (*sp)++; + stack[*sp] = value; + } +} + +int pop() { + int value = -1; + if ((int)(*sp) <= 0) { + printf("Stack Underflow\n"); + } else { + value = stack[*sp]; + (*sp)--; + } + return value; +}