diff --git a/makefile b/makefile index 500b13a..9ce8ebf 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,8 @@ #-------------Makro-Part------------------ CC = gcc -CFLAGS = -Wall -std=c99 +CFLAGS = -Wall -pedantic -std=c99 LDFLAGs = -DEBUG = +DEBUG = -DNDEBUG VPATH = src src/debug @@ -21,5 +21,4 @@ debug.o : debug.c debug.h $(CC) $(DEBUG) $(CFLAGS) -o $@ -c $< clean : - rm -f *.o - + rm -f *.o coredump*.toy diff --git a/src/.main.c.swp b/src/.main.c.swp new file mode 100644 index 0000000..c26b609 Binary files /dev/null and b/src/.main.c.swp differ diff --git a/src/.toy.h.swp b/src/.toy.h.swp new file mode 100644 index 0000000..16bf9ea Binary files /dev/null and b/src/.toy.h.swp differ diff --git a/src/main.c b/src/main.c index 3ce68fc..7b11a7d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,31 +1,40 @@ #include "toy.h" #include "./debug/debug.h" +#include + +#ifndef NDEBUG + #define DEBUG +#endif + + int main(int argc, char *argv[]) { uint16_t ram[RAM_SIZE]; - uint16_t ir; + uint16_t ir=0; uint8_t op_code; uint16_t pc = 0; - uint16_t accu = 0; int data_addr=0; bool run = true; if(initialise_ram(ram,argc,argv)==-1) return 1; -// makeHexDump(true,ram); // while(run && pc<(RAM_SIZE-1)) // { - ir = ram[2]; - pc++; + ir = ram[pc]; op_code = get_opcode(ir); - printf("OP Code: %u\n",op_code); data_addr=find_data(ir); - printf("Adresse: %d\n",data_addr); + #ifdef DEBUG + printf("OP Code: %u\n",op_code); + printf("Adresse: %d\n",data_addr); + makeHexDump(true,ram); + #endif + if(execute(op_code,data_addr,*ram)) + pc=data_addr(ram[pc]); + else pc++; // } - return 0; } diff --git a/src/toy.c b/src/toy.c index 0b2dd72..e85843f 100644 --- a/src/toy.c +++ b/src/toy.c @@ -5,7 +5,6 @@ int initialise_ram(uint16_t *ram, int argc, char **argv ) { //open Input Stream - FILE *fp; int j=0; char tempS[CPU_WORD_SIZE+1]; //+1 for "\0" @@ -66,4 +65,29 @@ int find_data(uint16_t instruction) return instr; } - +bool execute(uint8_t op_code, int data_addr, uint16_t *ram) // jump when 1 +{ + + //vorsicht uint16 und Zweierkomplement noch nicht stringent !!! + //Vorsicht bool ops bei sigend int typs sind undefiniert ! + static uint16_t accu; + switch(op_code) + { + case 0: ram[data_addr]=accu; break; + case 1: accu=ram[data_addr]; break; +// case 2: if(!accu) break; + case 3: accu=accu + ram[data_addr]; break; + case 4: accu=accu - ram[data_addr]; break; + case 5: accu=accu | ram[data_addr]; break; + case 6: accu=accu & ram[data_addr]; break; + case 7: accu=accu & ram[data_addr]; break; + case 8: break; + case 9: break; + case 10: break; + case 11: break; + case 12: break; + case 13: break; + case 14: break; + case 15: break; +} + diff --git a/src/toy.h b/src/toy.h index d76c427..ac0f288 100644 --- a/src/toy.h +++ b/src/toy.h @@ -13,5 +13,6 @@ int initialise_ram(uint16_t *ram, int argc, char **argv ); uint8_t get_opcode(uint16_t instruction); int find_data(uint16_t instruction); +bool execute(uint8_t op_code, int data_addr,uint16_t *ram); #endif