#include #include #include #include #include #define GETAL 0 #define INSTRUCTIE 1 #define ONMIDDELIJK 0 #define DIRECT 1 #define INDIRECT 2 struct registers { unsigned int a: 32; unsigned int b: 32; unsigned int zero: 1; unsigned int nega: 1; unsigned int over: 1; unsigned int teller: 24; }regs; struct regel{ union geheugenCel{ int getal; struct { unsigned int operand: 24; unsigned int adressering: 2; unsigned int operat: 6; } instructie; } cel; int type; int nr; struct regel *volgend; }; char* trim(char *string); int decode(unsigned int getal); void printBin (int oper); int laatsteCel (struct regel *lijst); struct regel * zoekCel (struct regel *lijst, int nummer); void setGeheugen(int operat, int adressering, int operand, struct regel **lijst); void printLijst(struct regel *lijst); char * stringIn(void); void fileToWorkdoc (char * bestandsnaam); void verwijderLijn (int regelnr); void pasLijnAan (int regelnr); void inputToWorkdoc (char * input); void printWorkdoc (void); void zetInA(int getal); int telCommandoRegels(struct regel *lijst); int checkGetal(char *getal); int checkPosGetal(char *getal); int checkHaakjes(char *getal); int setLDA(char* regel); int setLDB(char* regel); int setSTA(char* regel); int setSTB(char* regel); int setINP(char* regel); int setOUT(char* regel); int setNOP(char* regel); int setHLT(char* regel); int setADD(char* regel); int setSUB(char* regel); int setDIV(char* regel); int setMUL(char* regel); int setJMP(char *regel); int setJSP(char *regel); int setJSN(char *regel); int setJIZ(char *regel); int setJOF(char *regel); int setJSB(char *regel); int setRTS(char *regel); int doLDA(struct regel* lijn); int doLDB(struct regel* lijn); int doSTA(struct regel* lijn); int doSTB(struct regel* lijn); int doLDA(struct regel* lijn); int doLDB(struct regel* lijn); int doNOP(struct regel* lijn); int doADD(struct regel* lijn); int doSUB(struct regel* lijn); int doMUL(struct regel* lijn); int doDIV(struct regel* lijn); int doJMP(struct regel* lijn); int doJSP(struct regel* lijn); int doJSN(struct regel* lijn); int doJIZ(struct regel* lijn); int doJOF(struct regel* lijn); int doHLT(struct regel* lijn); void addCel(struct regel * toAdd, struct regel **lijst); int verwerkLijn(char * commando); struct regel *lijst; void zetInA(int getal){ if(getal < 0) regs.nega = 1; if(getal = 0) regs.zero = 1; if(getal > 16777215 || getal < -16777215) regs.over = 1; regs.a = getal; } char* trim(char *string){ int tel=0; int i= strlen(string)-1; char* oplos; // 123456789 \0 while(string[i] == ' '){ tel++; i--; } oplos = (char*) malloc(sizeof(char)*(strlen(string)-tel+1)); oplos[strlen(string)-tel] = '\0'; for(i=0;i>= 1; } printf("\n"); } int laatsteCel (struct regel *lijst) { int teller=0; while (lijst != NULL) { teller++; lijst = lijst->volgend; } return teller; } struct regel * zoekCel (struct regel *lijst, int nummer) { while (lijst != NULL) { if (lijst->nr == nummer) { return lijst; } lijst = lijst->volgend; } return NULL; } void setGeheugen(int operat, int adressering, int operand, struct regel **lijst) { struct regel *nieuw = (struct regel *)malloc(sizeof(struct regel)); struct regel *doorloop = *lijst; nieuw->nr = laatsteCel(*lijst); nieuw->type = 1; nieuw->cel.instructie.adressering = adressering; nieuw->cel.instructie.operand = operand; nieuw->cel.instructie.operat = operat; nieuw->volgend = NULL; if (*lijst == NULL) { *lijst = nieuw; } else { while(doorloop->volgend != NULL) doorloop = doorloop->volgend; doorloop->volgend = nieuw; } } void printLijst(struct regel *lijst) { while (lijst != NULL) { if(1 == 1){ printf("\nNR:%d Operat:%x Adress:%x Operand:\n", lijst->nr, lijst->cel.instructie.operat, lijst->cel.instructie.adressering); printBin(lijst->cel.instructie.operand); printf("bin %d\n",decode(lijst->cel.instructie.operand)); } else { printf("\ngetal\n"); } lijst = lijst->volgend; } } char * stringIn(void) { int i = 0; char buffer[512], opvang; char * resultaat = NULL; /*gets en scanf zorgden voor problemen */ do { opvang = getch(); if (opvang != 13 && opvang != 8) /* backspace moet apart behandeld worden ingelezen worden */ printf("%c",opvang); if (opvang != 13 && opvang == 8) { if (i != 0){ /* Out of bounds voorkomen */ i--; /* Backspace in de buffer nadoen */ printf("%c",opvang); /* Terug gaan in console en backspace effectief nadoen (karakter 'wissen') */ printf(" "); printf("%c",opvang); } } if (opvang != 8) { buffer[i] = opvang; i++; } opvang = ' '; }while(i<512 && buffer[i-1] != 13); buffer[i-1] = '\0'; resultaat = (char*)malloc(strlen(buffer)+1); /* +1 voor de \0 */ strcpy(resultaat,buffer); return resultaat; } void fileToWorkdoc (char * bestandsnaam) { FILE *fptr, *fptr2; char opvang[128]; /*VRAAG BESTANDSNAAM OP */ fptr = fopen(bestandsnaam,"r"); fptr2 = fopen("workdoc.txt","w"); if ( (fptr)==NULL || (fptr2)==NULL) printf("\n\t\tFile bestaat niet, of kan niet geopend worden.."); else { while ((fgets(opvang,128,fptr)) != NULL) fputs(opvang, fptr2); } fclose(fptr); fclose(fptr2); } void verwijderLijn (int regelnr) { FILE *fptr, *fptr2; char opvang[128]; int teller = 0; fptr = fopen("workdoc.txt","r"); fptr2 = fopen("tempor.txt","w"); if ( (fptr)==NULL || (fptr2)==NULL) printf("\n\t\tFile bestaat niet, of kan niet geopend worden.."); else { while ((fgets(opvang,128,fptr)) != NULL) { if(teller != regelnr) fputs(opvang, fptr2); teller++; } } fclose(fptr); fclose(fptr2); fileToWorkdoc("tempor.txt"); if(remove("tempor.txt") == -1) perror("\nFout bij verwijderen temp-bestand:"); } void pasLijnAan (int regelnr) { FILE *fptr, *fptr2; char opvang[128]; char * nieuweregel; int teller = 0; fptr = fopen("workdoc.txt","r"); fptr2 = fopen("tempor.txt","w"); if ( (fptr)==NULL || (fptr2)==NULL) printf("\n\t\tFile bestaat niet, of kan niet geopend worden.."); else { while ((fgets(opvang,128,fptr)) != NULL) { if(teller != regelnr) fputs(opvang, fptr2); else { printf("\nhoeba:"); nieuweregel = stringIn(); fprintf(fptr2,"%s\n",nieuweregel); } teller++; } } free(nieuweregel); /* Geheugen van de string terug vrijgeven */ fclose(fptr); fclose(fptr2); fileToWorkdoc("tempor.txt"); if(remove("tempor.txt") == -1) perror("\nFout bij verwijderen temp-bestand:"); } void inputToWorkdoc (char * input) { FILE *fptr; if ((fptr = fopen("workdoc.txt","a"))==NULL) printf("\n\t\tWorkdoc kan niet geopend worden.."); else { fprintf(fptr,"%s\n",input); } fclose(fptr); } void printWorkdoc (void) { FILE *fptr; char opvang[128]; if ((fptr = fopen("workdoc.txt","r"))==NULL) printf("\n\t\tWorkdoc kan niet geopend worden.."); else { while ((fgets(opvang,128,fptr)) != NULL) printf("%s",opvang); } } int checkGetal(char *getal){ int ok = 1; int loc = 0; if(getal[0] == '-') // negatief getal ook geldig loc++; while(getal[loc] != '\0' && ok){ ok = getal[loc] <= '9' && getal[loc] >= '0'; loc++; } return ok; } int checkPosGetal(char *getal){ int ok = 1; int loc = 0; while(getal[loc] != '\0' && ok){ ok = getal[loc] <= '9' && getal[loc] >= '0'; loc++; } return ok; } int checkHaakjes(char *getal){ int ok = 1; int loc = 1; // starten net na de '(' if(getal[0] != '(') ok = 0; else if(getal[strlen(getal)-1] != ')') ok = 0; while(getal[loc] != ')' && ok){ ok = getal[loc] <= '9' && getal[loc] >= '0'; loc++; } return ok; } int setLDA(char* regel){ if (regel[3] != ' ' ){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=5 )&& regel[4] == '#' && checkGetal(®el[5])){ setGeheugen(4,0,atoi(®el[5]),&lijst); return 1; } else if((strlen(regel) >=4) &&checkGetal(®el[4])){ setGeheugen(4,1,atoi(®el[4]),&lijst); return 1; } else if((strlen(regel) >=4) && checkHaakjes(®el[4])){ setGeheugen(4,2,atoi(®el[5]),&lijst); return 1; } else return -1; } } int setLDB(char* regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=5 )&& regel[4] == '#' && checkGetal(®el[5])){ setGeheugen(5,0,atoi(regel[5]),&lijst); return 1; } else if((strlen(regel) >=4 )&& checkGetal(®el[4])){ setGeheugen(5,1,atoi(®el[4]),&lijst); return 1; } else if((strlen(regel) >=4 )&& checkHaakjes(®el[4])){ setGeheugen(5,2,atoi(®el[5]),&lijst); return 1; } else return -1; } } int setSTA(char* regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if((strlen(regel) >=4 )&& checkGetal(®el[4])){ setGeheugen(8,1,atoi(®el[4]),&lijst); return 1; } else if((strlen(regel) >=4 )&& checkHaakjes(®el[4])){ setGeheugen(8,2,atoi(®el[5]),&lijst); return 1; } else return -1; } } int setSTB(char* regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if((strlen(regel) >=4 )&& checkGetal(®el[4])){ setGeheugen(9,1,atoi(®el[4]),&lijst); return 1; } else if((strlen(regel) >=4 )&& checkHaakjes(®el[4])){ setGeheugen(9,2,atoi(®el[5]),&lijst); return 1; } else return -1; } } int setINP(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(24,0,16777215,&lijst); return 1; } } int setOUT(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(28,0,16777215,&lijst); return 1; } } int setNOP(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(0,0,16777215,&lijst); return 1; } } int setHLT(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(63,0,16777215,&lijst); return 1; } } int setADD(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(32,0,16777215,&lijst); return 1; } } int setSUB(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(36,0,16777215,&lijst); return 1; } } int setDIV(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(44,0,16777215,&lijst); return 1; } } int setMUL(char* regel){ if(strlen(regel) != 3) return -1; else{ setGeheugen(40,0,16777215,&lijst); return 1; } } int setJMP(char *regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=4 )&& checkGetal(regel[4])){ setGeheugen(48,0,atoi(regel[4]),&lijst); return 1; } else return -1; } } int setJSP(char *regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=4 )&& checkGetal(regel[4])){ setGeheugen(50,0,atoi(regel[4]),&lijst); return 1; } else return -1; } } int setJSN(char *regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=4 )&& checkGetal(regel[4])){ setGeheugen(52,0,atoi(regel[4]),&lijst); return 1; } else return -1; } } int setJIZ(char *regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=4 )&& checkGetal(regel[4])){ setGeheugen(54,0,atoi(regel[4]),&lijst); return 1; } else return -1; } } int setJOF(char *regel){ if (regel[3] != ' '){ printf("Ongeldige syntax"); return -1; } else { if ((strlen(regel) >=4 )&& checkGetal(regel[4])){ setGeheugen(56,0,atoi(regel[4]),&lijst); return 1; } else return -1; } } int setJSB(char *regel){ if(strlen(regel) == 3){ printf("Syntaxerror"); return -1; } else { if((strlen(regel) >=4 )&& checkPosGetal(®el[4])){ setGeheugen(1,1,atoi(®el[4]),&lijst); //code staat niet in boek, voor 000001 gekozen return 1; } else return -1; } } int setRTS(char *regel){ if(strlen(regel) != 3) return -1; else { setGeheugen(2,0,16777215,&lijst); return 1; } } int verwerkLijn(char * commando) { char * commandotrimmed = trim(commando); /* De overbodige spaties worden getrimmed */ char test[4]; int i; for (i=0;i<3;i++) test[i]=toupper(commandotrimmed[i]); test[i] = '\0'; if (strcmp(test,"LDA")==0) { setLDA(commandotrimmed); } else if (strcmp(test,"LDB")==0) { setLDB(commandotrimmed); } else if (strcmp(test,"STA")==0) { setSTA(commandotrimmed); } else if (strcmp(test,"STB")==0) { setSTB(commandotrimmed); } else if (strcmp(test,"JSP")==0) { setJSP(commandotrimmed); } else if (strcmp(test,"RTS")==0) { setRTS(commandotrimmed); } else if (strcmp(test,"JSB")==0) { setRTS(commandotrimmed); } else if (strcmp(test,"NOP")==0) { setNOP(commandotrimmed); } else if (strcmp(test,"ADD")==0) { setADD(commandotrimmed); } else if (strcmp(test,"SUB")==0) { setSUB(commandotrimmed); } else if (strcmp(test,"MUL")==0) { setMUL(commandotrimmed); } else if (strcmp(test,"DIV")==0) { setDIV(commandotrimmed); } else if (strcmp(test,"JMP")==0) { setJMP(commandotrimmed); } else if (strcmp(test,"JSP")==0) { setJSP(commandotrimmed); } else if (strcmp(test,"JSN")==0) { setJSN(commandotrimmed); } else if (strcmp(test,"JIZ")==0) { setJIZ(commandotrimmed); } else if (strcmp(test,"JOF")==0) { setJOF(commandotrimmed); } else if (strcmp(test,"INP")==0) { setINP(commandotrimmed); } else if (strcmp(test,"OUT")==0) { setOUT(commandotrimmed); } else if (strcmp(test,"HLT")==0) { setHLT(commandotrimmed); } free(commandotrimmed); return 0; } int doLDA(struct regel *lijn){ struct regel* blok = (struct regel*) malloc (sizeof(struct regel*)); blok->type = GETAL; blok->volgend = NULL; if(lijn->cel.instructie.adressering == ONMIDDELIJK){ //LDA #5 blok->cel.getal = decode(lijn->cel.instructie.operand); regs.a = zetInA(decode(lijn->cel.instructie.operand)); return 1; } else if(lijn->cel.instructie.adressering == DIRECT){//LDA 5 struct regel* opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); regs.a = zetInA(opvang->cel.getal); return 1; } else if(lijn->cel.instructie.adressering == INDIRECT){ //LDA (500) struct regel *opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); opvang = zoekCel(lijst,decode(opvang->cel.instructie.operand)); regs.a = zetInA(opvang->cel.getal); return 1; } else { printf("\nOngeldige adressering..."); return -1; } } int doLDB(struct regel *lijn){ struct regel* blok = (struct regel*) malloc (sizeof(struct regel*)); blok->type = GETAL; blok->volgend = NULL; if(lijn->cel.instructie.adressering == 0){ // onmiddelijk LDB #5 blok->cel.getal = decode(lijn->cel.instructie.operand); regs.b = decode(lijn->cel.instructie.operand); return 1; } else if(lijn->cel.instructie.adressering == 1){// direct adresering vb( LDB 5) struct regel* opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); regs.b = opvang->cel.getal; return 1; } else if(lijn->cel.instructie.adressering == 2){ // LDB (500) struct regel *opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); opvang = zoekCel(lijst,decode(opvang->cel.instructie.operand)); regs.b = opvang->cel.getal; return 1; } else { printf("\nOngeldige adressering..."); return -1; } } int doSTA(struct regel *lijn){ struct regel *blok = (struct regel*) malloc(sizeof(struct regel*)); blok->type = GETAL; blok->volgend = NULL; blok->cel.getal = regs.a; if(lijn->cel.instructie.adressering == DIRECT){ // STA 5 blok->nr = decode(lijn->cel.instructie.operand); addCel(blok,&lijst); return 1; } else if(lijn->cel.instructie.adressering == INDIRECT) { //STA (5) struct regel *opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); blok->nr = opvang->cel.getal; addCel(blok,&lijst); return 1; } else { printf("\nOngeldige adressering"); return -1; } } int doSTB(struct regel *lijn){ struct regel *blok = (struct regel*) malloc(sizeof(struct regel*)); blok->type = GETAL; blok->volgend = NULL; blok->cel.getal = regs.b; if(lijn->cel.instructie.adressering == DIRECT){ // STB 5 blok->nr = decode(lijn->cel.instructie.operand); addCel(blok,&lijst); return 1; } else if(lijn->cel.instructie.adressering == INDIRECT) { //STB (5) struct regel *opvang = zoekCel(lijst,decode(lijn->cel.instructie.operand)); blok->nr = opvang->cel.getal; addCel(blok,&lijst); return 1; } else { printf("\nOngeldige adressering"); return -1; } } int doNOP(struct regel *lijn){ return 1; } int doADD(struct regel *lijn){ zetInA(regs.a+regs.b); return 1; } int doSUB(struct regel *lijn){ zetInA(regs.a - regs.b); return 1; } int doMUL(struct regel *lijn){ zetInA(regs.a * regs.b); return 1; } int doDIV(struct regel *lijn){ if(regs.b != 0){ zetInA(regs.a / regs.b); return 1; } else return -1; } int doJMP(struct regel *lijn){ if(decode(lijn->cel.instructie.operand) < 1 || decode(lijn->cel.instructie.operand > telRegels(lijst)){ printf("\nFoutieve jumpregel"); return -1; } else { regs.teller = decode(lijn->cel.instructie.operand) -1; return 1; } } int doJSP(struct regel *lijn){ if(decode(lijn->cel.instructie.operand) < 1 || decode(lijn->cel.instructie.operand > telRegels(lijst)){ printf("\nFoutieve jumpregel"); return -1; } else if(regs.nega == 0 && regs.zero == 0){ regs.teller = decode(lijn->cel.instructie.operand) -1; return 1; } } int doJSN(struct regel *lijn){ if(decode(lijn->cel.instructie.operand) < 1 || decode(lijn->cel.instructie.operand > telRegels(lijst)){ printf("\nFoutieve jumpregel"); return -1; } else if(regs.nega == 1 && regs.zero == 0){ regs.teller = decode(lijn->cel.instructie.operand); return 1; } } int doJIZ(struct regel *lijn){ if(decode(lijn->cel.instructie.operand) < 1 || decode(lijn->cel.instructie.operand > telRegels(lijst)){ printf("\nFoutieve jumpregel"); return -1; } else if(regs.zero == 1){ regs.teller = decode(lijn->cel.instructie.operand) -1; return 1; } } int doJOF(struct regel *lijn){ if(decode(lijn->cel.instructie.operand) < 1 || decode(lijn->cel.instructie.operand > telRegels(lijst)){ printf("\nFoutieve jumpregel"); return -1; } else if(regs.over == 1){ regs.teller = decode(lijn->cel.instructie.operand) -1; return 1; } } int doHLT(struct regel *lijn){ regs.teller = telCommandoRegels(lijst); // Zet programma teller op laatste regel } void addCel(struct regel * toAdd, struct regel **lijst) { struct regel *opvang, *doorloop = *lijst; if (lijst == NULL) ; else if ((opvang = zoekCel(*lijst,toAdd->nr)) != NULL) { /* De geheugencel "bestond" al en wordt vervangen*/ toAdd->volgend = opvang->volgend; free(opvang); /* We geven de te verwijderen plaats vrij */ opvang = toAdd; } else { /* de nieuwe geheugencel wordt "gesorteerd" aan de lijst toegevoegd */ while (doorloop != NULL && doorloop->nr < toAdd->nr) { opvang = doorloop; doorloop = doorloop->volgend; } opvang->volgend = toAdd; toAdd->volgend = doorloop; } } int telCommandoRegels(struct regel* lijst){ int i=0; struct regel* backup = lijst; while(lijst != NULL){ if(lijst->type = INSTRUCTIE) // Alleen de commandoregels testen i++; lijst->volgend; } lijst = backup; return i; } int main(void ){ struct regel *test = (struct regel *)malloc(sizeof(struct regel)); struct regel *test2 = (struct regel *)malloc(sizeof(struct regel)); struct regel *test3 = (struct regel *)malloc(sizeof(struct regel)); struct regel *test4 = (struct regel *)malloc(sizeof(struct regel)); test->nr = 1; test2->nr = 3; test3->nr = 10; test4->nr = 7; test->cel.instructie.adressering = 0; test2->cel.instructie.adressering = 1; test3->cel.instructie.adressering = 3; test4->cel.instructie.adressering = 2; test->volgend = NULL; test2->volgend = NULL; test3->volgend = NULL; test4->volgend = NULL; lijst = test; addCel(test2,&lijst); addCel(test3,&lijst); addCel(test4,&lijst); printLijst(lijst); /* lijst = NULL; verwerkLijn(""); printLijst(lijst); verwerkLijn("LDA 15"); printLijst(lijst); verwerkLijn("STB 10"); printLijst(lijst); printf("\ndone\n");*/ /* printf("%d\n",opvang); if ((opvang & 0x80000) == 0x80000) { nega = 1; opvang = opvang & 0x7FFFFF; opvang = opvang -1; printf("%d\n",opvang); opvang = opvang ^ 0x7FFFFF; opvang *= -1; } printf("%d\n",nega); printf("%d",opvang); }*/ while(1); return 0; }