-
Notifications
You must be signed in to change notification settings - Fork 0
/
main2.c
138 lines (128 loc) · 4.05 KB
/
main2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "label.h"
#include "DifInstruc.h"
#include "regDecode.h"
#include "opcode.h"
char *binario(int n,int tamanho,int len){
int c, d, count;
char *pointer;
count = 0;
pointer = (char*)malloc(tamanho+1);
if (pointer == NULL)
exit(EXIT_FAILURE);
for (c = tamanho-2 ; c >= 0 ; c--){
d = n >> c;
if (c > len) {
*(pointer+count) = 0 + '0';
}
else {
if (d & 1)
*(pointer+count) = 1 + '0';
else
*(pointer+count) = 0 + '0';
}
count++;
}
return pointer;
}
int main(int argc, char const *argv[]) {
TipoLista lista;
inicializa_lista(&lista);
FILE *in,*out;
in = fopen("entrada.a","r");
out = fopen("saida.mif","w");
int PC=0,constante,opcode,flag,i,j;
char *aux,*data,*label,*buf,*op;
buf=(char*)malloc(100*sizeof(int));
//PRIMEIRA PASSADA = PEGAR LABELS
while(fscanf(in,"%[^\n]",buf) != EOF){
while (buf[i] == ' ') {
i++;
}
if(strncmp(buf,"_",1)==0){ //caso leia uma label
aux = buf + 1; //desconsidera o primeiro caracter
label = strtok(aux,":"); //salva a label correspondente
data = strtok(NULL," ");
if(strcmp(data,".data")==0){ //caso seja uma linha de dados
data = strtok(NULL," ");
constante = atoi(data);
data = strtok(NULL," \n;");
insere_lista(&lista,PC,label);
PC+= constante;
}
else{
insere_lista(&lista,PC,label); //insere a label e seu endereço correspondente na lista de labels
PC+=2; //incrementa o PC
}
}
else PC+=2;
getc(in);
}
//SEGUNDA PASSADA = TRADUZIR PROGRAMA
PC=0; //reseta PC
rewind(in); //reseta ponteiro do arquivo
fprintf(out,"DEPTH = 128;\nWIDTH = 8;\nADDRESS_RADIX = HEX;\nDATA_RADIX = BIN;\nCONTENT\nBEGIN\n\n");
while(fscanf(in,"%[^\n]",buf) != EOF){
char* c = malloc(50*sizeof(char));
strcpy(c,buf);
if(strncmp(buf,";",1)!=0){
if(strncmp(buf,"_",1)==0){
data = strtok(buf,":"); //desconsidera a label
data = strtok(NULL," ");
}
else {
data = strtok(buf," "); //desconsidera a label
}
if(strcmp(data,".data")!=0){ //CASO SEJA INSTRUÇÃO
flag = opcodeDecode(data,&opcode);//salva a flag da instrução em "flag" e armazena o opcode em "opcode"
op = IntToBinOP(&opcode); //converte o opCode para binário
data = strtok(NULL,";\n"); //salva em data todo o resto da linha, reg + reg ou reg + end
DifInstruction(flag,data,&lista,label); //passa a flag e uma string contendo os 2 regs ou 1 reg + label
if(label != NULL)strcat(op,label); //concatena o opcode com o restante da instrução
char* imprimir;
char* imprimir2;
imprimir = malloc(9*sizeof(char));
imprimir2 = malloc(9*sizeof(char));
for(i = 0; i<8;i++){
imprimir[i] = op[i];
}
fprintf(out,"%02X: ",PC++);
fprintf(out,"%s ; -- %s\n",imprimir,c);
j = 0;
for(i = 8; i<16;i++){
imprimir2[j] = op[i];
j++;
}
fprintf(out,"%02X: ",PC++);
fprintf(out,"%s ;\n",imprimir2);
}
else{
int Daniel;
int Carlos;
char* bytes;
char* numero;
char* bin;
bytes = strtok(NULL," ");
numero = strtok(NULL," \n;");
Daniel = atoi(bytes);
bin = malloc(Daniel*8*sizeof(char));
Carlos = atoi(numero);
bin = binario(Carlos,(Daniel*8)+1,strlen(numero));
char* imprimir3;
imprimir3 = malloc(9*sizeof(char));
while (Daniel) {
snprintf(imprimir3,9,"%s",bin);
fprintf(out,"%02X: ",PC++);
fprintf(out,"%s ;\n",imprimir3);
bin +=8;
Daniel--;
}
}
}
getc(in);
}
fprintf(out,"[%02X..7F]: 00000000 ;\nEND;",PC++);
return 0;
}