Updated link in README file.
[Hack-Assembler.git] / code.c
blobfe0e6fea4d497bc783992d436721eeb8029cb9f5
1 #include <string.h>
2 #include <stdio.h>
3 #include <stdlib.h>
5 #include "asm.h"
6 #include "code.h"
7 #include "error.h"
8 #include "parse.h"
10 FILE *pOutfile;
12 int init_coder(const char *FilenameBuff)
14 if((pOutfile = fopen(FilenameBuff, "w")) == NULL)
15 exit_error(6, "Cannot Open Output (Destination) File");
16 return 1;
19 void advance_ouptut_file()
21 fprintf(pOutfile,"\n");
24 void enc_symbol(int number)
26 int i, j;
27 i = j = 0;
29 for(j = 15; j >= 0; j--)
31 i = number / (1 << j);
32 number = number - i * (1 << j);
33 fprintf(pOutfile,"%d", i);
34 if(settings.code != 0) { printf("%d", i); }
38 int enc_dest(const char mnemonic[])
41 if(strcmp(mnemonic, "") == 0) {
42 fprintf(pOutfile,"000");
43 if(settings.code != 0) { printf("000"); }
44 return 1;
45 } else if (strcmp(mnemonic, "M") == 0) {
46 fprintf(pOutfile,"001");
47 if(settings.code != 0) { printf("001"); }
48 return 1;
49 } else if(strcmp(mnemonic, "D") == 0) {
50 fprintf(pOutfile,"010");
51 if(settings.code != 0) { printf("010"); }
52 return 1;
53 } else if(strcmp(mnemonic, "MD") == 0) {
54 fprintf(pOutfile,"011");
55 if(settings.code != 0) { printf("011"); }
56 return 1;
57 } else if(strcmp(mnemonic, "A") == 0) {
58 fprintf(pOutfile,"100");
59 if(settings.code != 0) { printf("100"); }
60 return 1;
61 } else if(strcmp(mnemonic, "AM") == 0) {
62 fprintf(pOutfile,"101");
63 if(settings.code != 0) { printf("101"); }
64 return 1;
65 } else if(strcmp(mnemonic, "AD") == 0) {
66 fprintf(pOutfile,"110");
67 if(settings.code != 0) { printf("110"); }
68 return 1;
69 } else if(strcmp(mnemonic, "AMD") == 0) {
70 fprintf(pOutfile,"111");
71 if(settings.code != 0) { printf("111"); }
72 return 1;
73 } else {
74 line_notification(find_line_num());
75 exit_error(10, "Symbol Not Found In Dest Lookup Table.");
77 return 0;
80 int enc_comp(const char mnemonic[])
82 if(strcmp(mnemonic, "0") == 0) {
83 fprintf(pOutfile,"1110101010");
84 if(settings.code != 0) { printf("1110101010"); }
85 return 1;
86 } else if(strcmp(mnemonic, "1") == 0) {
87 fprintf(pOutfile,"1110111111");
88 if(settings.code != 0) { printf("1110111111"); }
89 return 1;
90 } else if(strcmp(mnemonic, "-1") == 0) {
91 fprintf(pOutfile,"1110111010");
92 if(settings.code != 0) { printf("1110111010"); }
93 return 1;
94 } else if(strcmp(mnemonic, "D") == 0) {
95 fprintf(pOutfile,"1110001100");
96 if(settings.code != 0) { printf("1110001100"); }
97 return 1;
98 } else if(strcmp(mnemonic, "A") == 0) {
99 fprintf(pOutfile,"1110110000");
100 if(settings.code != 0) { printf("1110110000"); }
101 return 1;
102 } else if(strcmp(mnemonic, "!D") == 0) {
103 fprintf(pOutfile,"1110001101");
104 if(settings.code != 0) { printf("1110001101"); }
105 return 1;
106 } else if(strcmp(mnemonic, "!A") == 0) {
107 fprintf(pOutfile,"1110110001");
108 if(settings.code != 0) { printf("1110110001"); }
109 return 1;
110 } else if(strcmp(mnemonic, "-D") == 0) {
111 fprintf(pOutfile,"1110001111");
112 if(settings.code != 0) { printf("1110001111"); }
113 return 1;
114 } else if(strcmp(mnemonic, "-A") == 0) {
115 fprintf(pOutfile,"1110110011");
116 if(settings.code != 0) { printf("1110110011"); }
117 return 1;
118 } else if(strcmp(mnemonic, "D+1") == 0) {
119 fprintf(pOutfile,"1110011111");
120 if(settings.code != 0) { printf("1110011111"); }
121 return 1;
122 } else if(strcmp(mnemonic, "A+1") == 0) {
123 fprintf(pOutfile,"1110110111");
124 if(settings.code != 0) { printf("1110110111"); }
125 return 1;
126 } else if(strcmp(mnemonic, "D-1") == 0) {
127 fprintf(pOutfile,"1110001110");
128 if(settings.code != 0) { printf("1110001110"); }
129 return 1;
130 } else if(strcmp(mnemonic, "A-1") == 0) {
131 fprintf(pOutfile,"1110110010");
132 if(settings.code != 0) { printf("1110110010"); }
133 return 1;
134 } else if(strcmp(mnemonic, "D+A") == 0) {
135 fprintf(pOutfile,"1110000010");
136 if(settings.code != 0) { printf("1110000010"); }
137 return 1;
138 } else if(strcmp(mnemonic, "D-A") == 0) {
139 fprintf(pOutfile,"1110010011");
140 if(settings.code != 0) { printf("1110010011"); }
141 return 1;
142 } else if(strcmp(mnemonic, "A-D") == 0) {
143 fprintf(pOutfile,"1110000111");
144 if(settings.code != 0) { printf("1110000111"); }
145 return 1;
146 } else if(strcmp(mnemonic, "D&A") == 0) {
147 fprintf(pOutfile,"1110000000");
148 if(settings.code != 0) { printf("1110000000"); }
149 return 1;
150 } else if(strcmp(mnemonic, "D|A") == 0) {
151 fprintf(pOutfile,"1110010101");
152 if(settings.code != 0) { printf("1110010101"); }
153 return 1;
154 } else if(strcmp(mnemonic, "M") == 0) {
155 fprintf(pOutfile,"1111110000");
156 if(settings.code != 0) { printf("1111110000"); }
157 return 1;
158 } else if(strcmp(mnemonic, "!M") == 0) {
159 fprintf(pOutfile,"1111110001");
160 if(settings.code != 0) { printf("1111110001"); }
161 return 1;
162 } else if(strcmp(mnemonic, "-M") == 0) {
163 fprintf(pOutfile,"1111110011");
164 if(settings.code != 0) { printf("1111110011"); }
165 return 1;
166 } else if(strcmp(mnemonic, "M+1") == 0) {
167 fprintf(pOutfile,"1111110111");
168 if(settings.code != 0) { printf("1111110111"); }
169 return 1;
170 } else if(strcmp(mnemonic, "M-1") == 0) {
171 fprintf(pOutfile,"1111110010");
172 if(settings.code != 0) { printf("1111110010"); }
173 return 1;
174 } else if(strcmp(mnemonic, "D+M") == 0) {
175 fprintf(pOutfile,"1111000010");
176 if(settings.code != 0) { printf("1111000010"); }
177 return 1;
178 } else if(strcmp(mnemonic, "D-M") == 0) {
179 fprintf(pOutfile,"1111010011");
180 if(settings.code != 0) { printf("1111010011"); }
181 return 1;
182 } else if(strcmp(mnemonic, "M-D") == 0) {
183 fprintf(pOutfile,"1111000111");
184 if(settings.code != 0) { printf("1111000111"); }
185 return 1;
186 } else if(strcmp(mnemonic, "D&M") == 0) {
187 fprintf(pOutfile,"1111000000");
188 if(settings.code != 0) { printf("1111000000"); }
189 return 1;
190 } else if(strcmp(mnemonic, "D|M") == 0) {
191 fprintf(pOutfile,"1111010101");
192 if(settings.code != 0) { printf("1111010101"); }
193 return 1;
195 line_notification(find_line_num());
196 exit_error(11, "Symbol Not Found In Encode Lookup Table.");
197 return 0;
200 int enc_jump(const char mnemonic[])
202 if(strcmp(mnemonic, "") == 0) {
203 fprintf(pOutfile,"000");
204 if(settings.code != 0) { printf("000"); }
205 return 1;
206 } else if(strcmp(mnemonic, "JGT") == 0) {
207 fprintf(pOutfile,"001");
208 if(settings.code != 0) { printf("001"); }
209 return 1;
210 } else if(strcmp(mnemonic, "JEQ") == 0) {
211 fprintf(pOutfile,"010");
212 if(settings.code != 0) { printf("010"); }
213 return 1;
214 } else if(strcmp(mnemonic, "JGE") == 0) {
215 fprintf(pOutfile,"011");
216 if(settings.code != 0) { printf("011"); }
217 return 1;
218 } else if(strcmp(mnemonic, "JLT") == 0) {
219 fprintf(pOutfile,"100");
220 if(settings.code != 0) { printf("100"); }
221 return 1;
222 } else if(strcmp(mnemonic, "JNE") == 0) {
223 fprintf(pOutfile,"101");
224 if(settings.code != 0) { printf("101"); }
225 return 1;
226 } else if(strcmp(mnemonic, "JLE") == 0) {
227 fprintf(pOutfile,"110");
228 if(settings.code != 0) { printf("110"); }
229 return 1;
230 } else if(strcmp(mnemonic, "JMP") == 0) {
231 fprintf(pOutfile,"111");
232 if(settings.code != 0) { printf("111"); }
233 return 1;
234 } else {
235 int i = find_line_num();
236 line_notification(i);
237 exit_error(11, "Symbol Not Found In Jump Lookup Table.");
239 return 0;