source: Deliverables/D4.1/ASMInterpret.ml @ 46

Last change on this file since 46 was 46, checked in by mulligan, 9 years ago

MOV done.

File size: 29.9 KB
Line 
1open Physical;;
2open ASM;;
3open Pretty;;
4
5exception Fetch_exception of string
6
7type time = int;;
8
9type foo
10
11(* no differentiation between internal and external code memory *)
12type status =
13 { code_memory: byte WordMap.t;        (* can be reduced *)
14   low_internal_ram: byte Byte7Map.t;
15   high_internal_ram: byte Byte7Map.t;
16   external_ram: byte WordMap.t;
17
18   pc: word;
19
20   (* sfr *)
21   p0: byte;
22   sp: byte;
23   dpl: byte;
24   dph: byte;
25   pcon: byte;
26   tcon: byte;
27   tmod: byte;
28   tl0: byte;
29   tl1: byte;
30   th0: byte;
31   th1: byte;
32   p1: byte;
33   scon: byte;
34   sbuf: byte;
35   p2: byte;
36   ie: byte;
37   p3: byte;
38   ip: byte;
39   psw: byte;
40   acc: byte;
41   b: byte;
42
43   clock: time;
44   timer0: word;
45   timer1: word;
46   timer2: word;  (* can be missing *)
47   io: foo (*(time * ?line? -> ?val?)*)
48 }
49
50let carr status = let (c,_,_,_),_ = status.psw in c
51
52(* timings taken from SIEMENS *)
53
54let fetch pmem pc =
55 let next pc = pc ++ 1, WordMap.find pc pmem in
56 let instr = WordMap.find pc pmem in
57 let pc = pc ++ 1 in
58 try
59  match instr with
60     (a10,a9,a8,true),(false,false,false,true) ->
61      let pc,b1 = next pc in
62       ACALL (`ADDR11 (a10,a9,a8,b1)), pc, 2
63   | (false,false,true,false),(true,r1,r2,r3) ->
64      ADD (`A,`REG (r1,r2,r3)), pc, 1
65   | (false,false,true,false),(false,true,false,true) ->
66      let pc,b1 = next pc in
67       ADD (`A,`DIRECT b1), pc, 1
68   | (false,false,true,false),(false,true,true,i1) ->
69       ADD (`A,`INDIRECT i1), pc, 1
70   | (false,false,true,false),(false,true,false,false) ->
71      let pc,b1 = next pc in
72       ADD (`A,`DATA b1), pc, 1
73   | (false,false,true,true),(true,r1,r2,r3) ->
74       ADDC (`A,`REG (r1,r2,r3)), pc, 1
75   | (false,false,true,true),(false,true,false,true) ->
76      let pc,b1 = next pc in
77       ADDC (`A,`DIRECT b1), pc, 1
78   | (false,false,true,true),(false,true,true,i1) ->
79       ADDC (`A,`INDIRECT i1), pc, 1
80   | (false,false,true,true),(false,true,false,false) ->
81      let pc,b1 = next pc in
82       ADDC (`A,`DATA b1), pc, 1
83   | (a10,a9,a8,false),(false,false,false,true) ->
84      let pc,b1 = next pc in
85       AJMP (`ADDR11 (a10,a9,a8,b1)), pc, 2
86   | (false,true,false,true),(true,r1,r2,r3) ->
87      ANL (`U1 (`A, `REG (r1,r2,r3))), pc, 1
88   | (false,true,false,true),(false,true,false,true) ->
89      let pc,b1 = next pc in
90       ANL (`U1 (`A, `DIRECT b1)), pc, 1
91   | (false,true,false,true),(false,true,true,i1) ->
92       ANL (`U1 (`A, `INDIRECT i1)), pc, 1
93   | (false,true,false,true),(false,true,false,false) ->
94      let pc,b1 = next pc in
95       ANL (`U1 (`A, `DATA b1)), pc, 1
96   | (false,true,false,true),(false,false,true,false) ->
97      let pc,b1 = next pc in
98       ANL (`U2 (`DIRECT b1,`A)), pc, 1
99   | (false,true,false,true),(false,false,true,true) ->
100      let pc,b1 = next pc in
101      let pc,b2 = next pc in
102       ANL (`U2 (`DIRECT b1,`DATA b2)), pc, 2
103   | (true,false,false,false),(false,false,true,false) ->
104      let pc,b1 = next pc in
105       ANL (`U3 (`C,`BIT b1)), pc, 2
106   | (true,false,true,true),(false,false,false,false) ->
107      let pc,b1 = next pc in
108       ANL (`U3 (`C,`NBIT b1)), pc, 2
109   | (true,false,true,true),(false,true,false,true) ->
110      let       pc,b1 = next pc in
111      let pc,b2 = next pc in
112        CJNE (`U1 (`A, `DIRECT b1), `REL b2), pc, 2
113   | (true,false,true,true),(false,true,false,false) ->
114       let pc,b1 = next pc in
115       let pc,b2 = next pc in
116         CJNE (`U1 (`A, `DATA b1), `REL b2), pc, 2
117   | (true,false,true,true),(true,r1,r2,r3) ->
118       let pc,b1 = next pc in
119       let pc,b2 = next pc in
120         CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2), pc, 2
121   | (true,false,true,true),(false,true,true,i1) ->
122       let pc,b1 = next pc in
123       let pc,b2 = next pc in
124         CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2), pc, 2
125   | (true,true,true,false),(false,true,false,false) ->
126         CLR `A, pc, 1
127   | (true,true,false,false),(false,false,true,true) ->
128         CLR `C, pc, 1
129   | (true,true,false,false),(false,false,true,false) ->
130       let pc,b1 = next pc in
131         CLR (`BIT b1), pc, 1
132   | (true,true,false,true),(false,true,false,false) ->
133         DA `A, pc, 1
134   | (false,false,false,true),(false,true,false,false) ->
135         DEC `A, pc, 1
136   | (false,false,false,true),(true,r1,r2,r3) ->
137         DEC (`REG(r1,r2,r3)), pc, 1
138   | (false,false,false,true),(false,true,false,true) ->
139       let pc,b1 = next pc in
140         DEC (`DIRECT b1), pc, 1
141   | (false,false,false,true),(false,true,true,i1) ->
142         DEC (`INDIRECT i1), pc, 1
143   | (true,false,false,false),(false,true,false,false) ->
144         DIV (`A, `B), pc, 4
145   | (true,true,false,true),(true,r1,r2,r3) ->
146       let pc,b1 = next pc in
147         DJNZ (`REG(r1,r2,r3), `REL b1), pc, 2
148   | (true,true,false,true),(false,true,false,true) ->
149       let pc,b1 = next pc in
150       let pc,b2 = next pc in
151         DJNZ (`DIRECT b1, `REL b2), pc, 2
152   | (false,false,false,false),(false,true,false,false) ->
153         INC `A, pc, 1
154   | (false,false,false,false),(true,r1,r2,r3) ->
155         INC (`REG(r1,r2,r3)), pc, 1
156   | (false,false,false,false),(false,true,false,true) ->
157       let pc,b1 = next pc in
158         INC (`DIRECT b1), pc, 1
159   | (false,false,false,false),(false,true,true,i1) ->
160         INC (`INDIRECT i1), pc, 1
161   | (true,false,true,false),(false,false,true,true) ->
162         INC `DPTR, pc, 2
163   | (false,false,true,false),(false,false,false,false) ->
164       let pc,b1 = next pc in
165       let pc,b2 = next pc in
166         JB (`BIT b1, `REL b2), pc, 2
167   | (false,false,false,true),(false,false,false,false) ->
168       let pc,b1 = next pc in
169       let pc,b2 = next pc in
170         JBC (`BIT b1, `REL b2), pc, 2
171   | (false,true,false,false),(false,false,false,false) ->
172       let pc,b1 = next pc in
173         JC (`REL b1), pc, 2
174   | (false,true,true,true),(false,false,true,true) ->
175         JMP `IND_DPTR, pc, 2
176   | (false,false,true,true),(false,false,false,false) ->
177       let pc,b1 = next pc in
178       let pc,b2 = next pc in
179         JNB (`BIT b1, `REL b2), pc, 2
180   | (false,true,false,true),(false,false,false,false) ->
181       let pc,b1 = next pc in
182         JNC (`REL b1), pc, 2
183   | (false,true,true,true),(false,false,false,false) ->
184       let pc,b1 = next pc in
185         JNZ (`REL b1), pc, 2
186   | (false,true,true,false),(false,false,false,false) ->
187       let pc,b1 = next pc in
188         JZ (`REL b1), pc, 2
189   | (false,false,false,true),(false,false,true,false) ->
190       let pc,b1 = next pc in
191       let pc,b2 = next pc in
192         LCALL (`ADDR16 (b1,b2)), pc, 2
193   | (false,false,false,false),(false,false,true,false) ->
194       let pc,b1 = next pc in
195       let pc,b2 = next pc in
196         LJMP (`ADDR16 (b1,b2)), pc, 2
197   | (true,true,true,false),(true,r1,r2,r3) ->
198         MOV (`U1 (`A, `REG(r1,r2,r3))), pc, 1
199   | (true,true,true,false),(false,true,false,true) ->
200       let pc,b1 = next pc in
201         MOV (`U1 (`A, `DIRECT b1)), pc, 1
202   | (true,true,true,false),(false,true,true,i1) ->
203         MOV (`U1 (`A, `INDIRECT i1)), pc, 1
204   | (false,true,true,true),(false,true,false,false) ->
205       let pc,b1 = next pc in
206         MOV (`U1 (`A, `DATA b1)), pc, 1
207   | (true,true,true,true),(true,r1,r2,r3) ->
208         MOV (`U2 (`REG(r1,r2,r3), `A)), pc, 1
209   | (true,false,true,false),(true,r1,r2,r3) ->
210       let pc,b1 = next pc in
211         MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))), pc, 2
212   | (false,true,true,true),(true,r1,r2,r3) ->
213       let pc,b1 = next pc in
214         MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))), pc, 1
215   | (true,true,true,true),(false,true,false,true) ->
216       let pc,b1 = next pc in
217         MOV (`U3 (`DIRECT b1, `A)), pc, 1
218   | (true,false,false,false),(true,r1,r2,r3) ->
219       let pc,b1 = next pc in
220         MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))), pc, 2
221   | (true,false,false,false),(false,true,false,true) ->
222       let pc,b1 = next pc in
223       let pc,b2 = next pc in
224         MOV (`U3 (`DIRECT b1, `DIRECT b2)), pc, 2
225   | (true,false,false,false),(false,true,true,i1) ->
226       let pc,b1 = next pc in
227         MOV (`U3 (`DIRECT b1, `INDIRECT i1)), pc, 2
228   | (false,true,true,true),(false,true,false,true) ->
229       let pc,b1 = next pc in
230       let pc,b2 = next pc in
231         MOV (`U3 (`DIRECT b1, `DATA b2)), pc, 2
232   | (true,true,true,true),(false,true,true,i1) ->
233         MOV (`U2 (`INDIRECT i1, `A)), pc, 1
234   | (true,false,true,false),(false,true,true,i1) ->
235       let pc,b1 = next pc in
236         MOV (`U2 (`INDIRECT i1, `DIRECT b1)), pc, 2
237   | (false,true,true,true),(false,true,true,i1) ->
238       let pc,b1 = next pc in
239         MOV (`U2 (`INDIRECT i1, `DATA b1)), pc, 1
240   | (true,false,true,false),(false,false,true,false) ->
241       let pc,b1 = next pc in
242         MOV (`U5 (`C, `BIT b1)), pc, 1
243   | (true,false,false,true),(false,false,true,false) ->
244       let pc,b1 = next pc in
245         MOV (`U6 (`BIT b1, `C)), pc, 2
246   | (true,false,false,true),(false,false,false,false) ->
247       let pc,b1 = next pc in
248       let pc,b2 = next pc in
249         MOV (`U4 (`DPTR, `DATA16(b1,b2))), pc, 2
250   | (true,false,false,true),(false,false,true,true) ->
251         MOVC (`A, `A_DPTR), pc, 2
252   | (true,false,false,false),(false,false,true,true) ->
253         MOVC (`A, `A_PC), pc, 2
254   | (true,true,true,false),(false,false,true,i1) ->
255         MOVX (`U1 (`A, `EXT_INDIRECT i1)), pc, 2
256   | (true,true,true,false),(false,false,false,false) ->
257         MOVX (`U1 (`A, `EXT_IND_DPTR)), pc, 2
258   | (true,true,true,true),(false,false,true,i1) ->
259         MOVX (`U2 (`EXT_INDIRECT i1, `A)), pc, 2
260   | (true,true,true,true),(false,false,false,false) ->
261         MOVX (`U2 (`EXT_IND_DPTR, `A)), pc, 2
262   | (true,false,true,false),(false,true,false,false) ->
263         MUL(`A, `B), pc, 4
264   | (false,false,false,false),(false,false,false,false) ->
265         NOP, pc, 1
266   | (false,true,false,false),(true,r1,r2,r3) ->
267         ORL (`U1(`A, `REG(r1,r2,r3))), pc, 1
268   | (false,true,false,false),(false,true,false,true) ->
269       let pc,b1 = next pc in
270         ORL (`U1(`A, `DIRECT b1)), pc, 1
271   | (false,true,false,false),(false,true,true,i1) ->
272         ORL (`U1(`A, `INDIRECT i1)), pc, 1
273   | (false,true,false,false),(false,true,false,false) ->
274       let pc,b1 = next pc in
275         ORL (`U1(`A, `DATA b1)), pc, 1
276   | (false,true,false,false),(false,false,true,false) ->
277       let pc,b1 = next pc in
278         ORL (`U2(`DIRECT b1, `A)), pc, 1
279   | (false,true,false,false),(false,false,true,true) ->
280       let pc,b1 = next pc in
281       let pc,b2 = next pc in
282         ORL (`U2 (`DIRECT b1, `DATA b2)), pc, 2
283   | (false,true,true,true),(false,false,true,false) ->
284       let pc,b1 = next pc in
285         ORL (`U3 (`C, `BIT b1)), pc, 2
286   | (true,false,true,false),(false,false,false,false) ->
287       let pc,b1 = next pc in
288         ORL (`U3 (`C, `NBIT b1)), pc, 2
289   | (true,true,false,true),(false,false,false,false) ->
290       let pc,b1 = next pc in
291         POP (`DIRECT b1), pc, 2
292   | (true,true,false,false),(false,false,false,false) ->
293       let pc,b1 = next pc in
294         PUSH (`DIRECT b1), pc, 2
295   | (false,false,true,false),(false,false,true,false) ->
296         RET, pc, 2
297   | (false,false,true,true),(false,false,true,false) ->
298         RETI, pc, 2
299   | (false,false,true,false),(false,false,true,true) ->
300         RL `A, pc, 1
301   | (false,false,true,true),(false,false,true,true) ->
302         RLC `A, pc, 1
303   | (false,false,false,false),(false,false,true,true) ->
304         RR `A, pc, 1
305   | (false,false,false,true),(false,false,true,true) ->
306         RRC `A, pc, 1
307   | (true,true,false,true),(false,false,true,true) ->
308         SETB `C, pc, 1
309   | (true,true,false,true),(false,false,true,false) ->
310       let pc,b1 = next pc in
311         SETB (`BIT b1), pc, 1
312   | (true,false,false,false),(false,false,false,false) ->
313       let pc,b1 = next pc in
314         SJMP (`REL b1), pc, 2
315   | (true,false,false,true),(false,true,false,true) ->
316       let pc,b1 = next pc in
317         SUBB (`A, `DIRECT b1), pc, 1
318   | (true,false,false,true),(false,true,true,i1) ->
319         SUBB (`A, `INDIRECT i1), pc, 1
320   | (true,false,false,true),(false,true,false,false) ->
321       let pc,b1 = next pc in
322         SUBB (`A, `DATA b1), pc, 1
323   | (true,true,false,false),(false,true,false,false) ->
324         SWAP `A, pc, 1
325   | (true,true,false,false),(true,r1,r2,r3) ->
326         XCH (`A, `REG(r1,r2,r3)), pc, 1
327   | (true,true,false,false),(false,true,false,true) ->
328       let pc,b1 = next pc in
329         XCH (`A, `DIRECT b1), pc, 1
330   | (true,true,false,false),(false,true,true,i1) ->
331         XCH (`A, `INDIRECT i1), pc, 1
332   | (true,true,false,true),(false,true,true,i1) ->
333         XCHD(`A, `INDIRECT i1), pc, 1
334   | (false,true,true,false),(true,r1,r2,r3) ->
335         XRL(`U1(`A, `REG(r1,r2,r3))), pc, 1
336   | (false,true,true,false),(false,true,false,true) ->
337       let pc,b1 = next pc in
338         XRL(`U1(`A, `DIRECT b1)), pc, 1
339   | (false,true,true,false),(false,true,true,i1) ->
340         XRL(`U1(`A, `INDIRECT i1)), pc, 1
341   | (false,true,true,false),(false,true,false,false) ->
342       let pc,b1 = next pc in
343         XRL(`U1(`A, `DATA b1)), pc, 1
344   | (false,true,true,false),(false,false,true,false) ->
345       let pc,b1 = next pc in
346         XRL(`U2(`DIRECT b1, `A)), pc, 1
347   | (false,true,true,false),(false,false,true,true) ->
348       let pc,b1 = next pc in
349       let pc,b2 = next pc in
350         XRL(`U2(`DIRECT b1, `DATA b2)), pc, 2
351 with
352  Not_found -> raise (Fetch_exception "Key not found")
353;;
354
355let assembly1 =
356 function
357    ACALL (`ADDR11 (a10,a9,a8,b1)) ->
358     [(a10,a9,a8,true),(false,false,false,true); b1]
359  | ADD (`A,`REG (r1,r2,r3)) ->
360     [(false,false,true,false),(true,r1,r2,r3)]
361  | ADD (`A, `DIRECT b1) ->
362     [(false,false,true,false),(false,true,false,true); b1]
363  | ADD (`A, `INDIRECT i1) ->
364     [(false,false,true,false),(false,true,true,i1)]
365  | ADD (`A, `DATA b1) ->
366     [(false,false,true,false),(false,true,false,false); b1]
367  | ADDC (`A, `REG(r1,r2,r3)) ->
368     [(false,false,true,true),(true,r1,r2,r3)]
369  | ADDC (`A, `DIRECT b1) ->
370     [(false,false,true,true),(false,true,false,true); b1]
371  | ADDC (`A,`INDIRECT i1) ->
372     [(false,false,true,true),(false,true,true,i1)]
373  | ADDC (`A,`DATA b1) ->
374     [(false,false,true,true),(false,true,false,false); b1]
375  | AJMP (`ADDR11 (a10,a9,a8,b1)) ->
376     [(a10,a9,a8,false),(false,false,false,true)]
377  | ANL (`U1 (`A, `REG (r1,r2,r3))) ->
378     [(false,true,false,true),(true,r1,r2,r3)]
379  | ANL (`U1 (`A, `DIRECT b1)) ->
380     [(false,true,false,true),(false,true,false,true); b1]
381  | ANL (`U1 (`A, `INDIRECT i1)) ->
382     [(false,true,false,true),(false,true,true,i1)]
383  | ANL (`U1 (`A, `DATA b1)) ->
384     [(false,true,false,true),(false,true,false,false); b1]
385  | ANL (`U2 (`DIRECT b1,`A)) ->
386     [(false,true,false,true),(false,false,true,false); b1]
387  | ANL (`U2 (`DIRECT b1,`DATA b2)) ->
388     [(false,true,false,true),(false,false,true,true); b1; b2]
389  | ANL (`U3 (`C,`BIT b1)) ->
390     [(true,false,false,false),(false,false,true,false);  b1]
391  | ANL (`U3 (`C,`NBIT b1)) ->
392    [(true,false,true,true),(false,false,false,false);  b1]
393  | CJNE (`U1 (`A, `DIRECT b1), `REL b2) ->
394    [(true,false,true,true),(false,true,false,true); b1; b2]
395  | CJNE (`U1 (`A, `DATA b1), `REL b2) ->
396    [(true,false,true,true),(false,true,false,false); b1; b2]
397  | CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2) ->
398    [(true,false,true,true),(true,r1,r2,r3); b1; b2]
399  | CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2) ->
400    [(true,false,true,true),(false,true,true,i1); b1; b2]
401  | CLR `A ->
402    [(true,true,true,false),(false,true,false,false)]
403  | CLR `C ->
404    [(true,true,false,false),(false,false,true,true)]
405  | CLR (`BIT b1) ->
406    [(true,true,false,false),(false,false,true,false);  b1]
407  | DA `A ->
408    [(true,true,false,true),(false,true,false,false)]
409  | DEC `A ->
410    [(false,false,false,true),(false,true,false,false)]
411  | DEC (`REG(r1,r2,r3)) ->
412    [(false,false,false,true),(true,r1,r2,r3)]
413  | DEC (`DIRECT b1) ->
414    [(false,false,false,true),(false,true,false,true); b1]
415  | DEC (`INDIRECT i1) ->
416    [(false,false,false,true),(false,true,true,i1)]
417  | DIV (`A, `B) ->
418    [(true,false,false,false),(false,true,false,false)]
419  | DJNZ (`REG(r1,r2,r3), `REL b1) ->
420    [(true,true,false,true),(true,r1,r2,r3); b1]
421  | DJNZ (`DIRECT b1, `REL b2) ->
422    [(true,true,false,true),(false,true,false,true); b1; b2]
423  | INC `A ->
424    [(false,false,false,false),(false,true,false,false)]
425  | INC (`REG(r1,r2,r3)) ->
426    [(false,false,false,false),(true,r1,r2,r3)]
427  | INC (`DIRECT b1) ->
428    [(false,false,false,false),(false,true,false,true); b1]
429  | INC (`INDIRECT i1) ->
430    [(false,false,false,false),(false,true,true,i1)]
431  | INC `DPTR ->
432    [(true,false,true,false),(false,false,true,true)]
433  | JB (`BIT b1, `REL b2) ->
434    [(false,false,true,false),(false,false,false,false);  b1; b2]
435  | JBC (`BIT b1, `REL b2) ->
436    [(false,false,false,true),(false,false,false,false);  b1; b2]
437  | JC (`REL b1) ->
438    [(false,true,false,false),(false,false,false,false); b1]
439  | JMP `IND_DPTR ->
440    [(false,true,true,true),(false,false,true,true)]
441  | JNB (`BIT b1, `REL b2) ->
442    [(false,false,true,true),(false,false,false,false);  b1; b2]
443  | JNC (`REL b1) ->
444    [(false,true,false,true),(false,false,false,false); b1]
445  | JNZ (`REL b1) ->
446    [(false,true,true,true),(false,false,false,false); b1]
447  | JZ (`REL b1) ->
448    [(false,true,true,false),(false,false,false,false); b1]
449  | LCALL (`ADDR16 (b1,b2)) ->
450    [(false,false,false,true),(false,false,true,false); b1; b2]
451  | LJMP (`ADDR16 (b1,b2)) ->
452    [(false,false,false,false),(false,false,true,false); b1; b2]
453  | MOV (`U1 (`A, `REG(r1,r2,r3))) ->
454    [(true,true,true,false),(true,r1,r2,r3)]
455  | MOV (`U1 (`A, `DIRECT b1)) ->
456    [(true,true,true,false),(false,true,false,true); b1]
457  | MOV (`U1 (`A, `INDIRECT i1)) ->
458    [(true,true,true,false),(false,true,true,i1)]
459  | MOV (`U1 (`A, `DATA b1)) ->
460    [(false,true,true,true),(false,true,false,false); b1]
461  | MOV (`U2 (`REG(r1,r2,r3), `A)) ->
462    [(true,true,true,true),(true,r1,r2,r3)]
463  | MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))) ->
464    [(true,false,true,false),(true,r1,r2,r3); b1]
465  | MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))) ->
466    [(false,true,true,true),(true,r1,r2,r3); b1]
467  | MOV (`U3 (`DIRECT b1, `A)) ->
468    [(true,true,true,true),(false,true,false,true); b1]
469  | MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))) ->
470    [(true,false,false,false),(true,r1,r2,r3); b1]
471  | MOV (`U3 (`DIRECT b1, `DIRECT b2)) ->
472    [(true,false,false,false),(false,true,false,true); b1; b2]
473  | MOV (`U3 (`DIRECT b1, `INDIRECT i1)) ->
474    [(true,false,false,false),(false,true,true,i1); b1]
475  | MOV (`U3 (`DIRECT b1, `DATA b2)) ->
476    [(false,true,true,true),(false,true,false,true); b1; b2]
477  | MOV (`U2 (`INDIRECT i1, `A)) ->
478    [(true,true,true,true),(false,true,true,i1)]
479  | MOV (`U2 (`INDIRECT i1, `DIRECT b1)) ->
480    [(true,false,true,false),(false,true,true,i1); b1]
481  | MOV (`U2 (`INDIRECT i1, `DATA b1)) ->
482    [(false,true,true,true),(false,true,true,i1); b1]
483  | MOV (`U5 (`C, `BIT b1)) ->
484    [(true,false,true,false),(false,false,true,false);  b1]
485  | MOV (`U6 (`BIT b1, `C)) ->
486    [(true,false,false,true),(false,false,true,false);  b1]
487  | MOV (`U4 (`DPTR, `DATA16(b1,b2))) ->
488    [(true,false,false,true),(false,false,false,false); b1; b2]
489  | MOVC (`A, `A_DPTR) ->
490    [(true,false,false,true),(false,false,true,true)]
491  | MOVC (`A, `A_PC) ->
492    [(true,false,false,false),(false,false,true,true)]
493  | MOVX (`U1 (`A, `EXT_INDIRECT i1)) ->
494    [(true,true,true,false),(false,false,true,i1)]
495  | MOVX (`U1 (`A, `EXT_IND_DPTR)) ->
496    [(true,true,true,false),(false,false,false,false)]
497  | MOVX (`U2 (`EXT_INDIRECT i1, `A)) ->
498    [(true,true,true,true),(false,false,true,i1)]
499  | MOVX (`U2 (`EXT_IND_DPTR, `A)) ->
500    [(true,true,true,true),(false,false,false,false)]
501  | MUL(`A, `B) ->
502    [(true,false,true,false),(false,true,false,false)]
503  | NOP ->
504    [(false,false,false,false),(false,false,false,false)]
505  | ORL (`U1(`A, `REG(r1,r2,r3))) ->
506    [(false,true,false,false),(true,r1,r2,r3)]
507  | ORL (`U1(`A, `DIRECT b1)) ->
508    [(false,true,false,false),(false,true,false,true); b1]
509  | ORL (`U1(`A, `INDIRECT i1)) ->
510    [(false,true,false,false),(false,true,true,i1)]
511  | ORL (`U1(`A, `DATA b1)) ->
512    [(false,true,false,false),(false,true,false,false); b1]
513  | ORL (`U2(`DIRECT b1, `A)) ->
514    [(false,true,false,false),(false,false,true,false); b1]
515  | ORL (`U2 (`DIRECT b1, `DATA b2)) ->
516    [(false,true,false,false),(false,false,true,true); b1; b2]
517  | ORL (`U3 (`C, `BIT b1)) ->
518    [(false,true,true,true),(false,false,true,false);  b1]
519  | ORL (`U3 (`C, `NBIT b1)) ->
520    [(true,false,true,false),(false,false,false,false);  b1]
521  | POP (`DIRECT b1) ->
522    [(true,true,false,true),(false,false,false,false); b1]
523  | PUSH (`DIRECT b1) ->
524    [(true,true,false,false),(false,false,false,false); b1]
525  | RET ->
526    [(false,false,true,false),(false,false,true,false)]
527  | RETI ->
528    [(false,false,true,true),(false,false,true,false)]
529  | RL `A ->
530    [(false,false,true,false),(false,false,true,true)]
531  | RLC `A ->
532    [(false,false,true,true),(false,false,true,true)]
533  | RR `A ->
534    [(false,false,false,false),(false,false,true,true)]
535  | RRC `A ->
536    [(false,false,false,true),(false,false,true,true)]
537  | SETB `C ->
538    [(true,true,false,true),(false,false,true,true)]
539  | SETB (`BIT b1) ->
540    [(true,true,false,true),(false,false,true,false);  b1]
541  | SJMP (`REL b1) ->
542    [(true,false,false,false),(false,false,false,false); b1]
543  | SUBB (`A, `DIRECT b1) ->
544    [(true,false,false,true),(false,true,false,true); b1]
545  | SUBB (`A, `INDIRECT i1) ->
546    [(true,false,false,true),(false,true,true,i1)]
547  | SUBB (`A, `DATA b1) ->
548    [(true,false,false,true),(false,true,false,false); b1]
549  | SWAP `A ->
550    [(true,true,false,false),(false,true,false,false)]
551  | XCH (`A, `REG(r1,r2,r3)) ->
552    [(true,true,false,false),(true,r1,r2,r3)]
553  | XCH (`A, `DIRECT b1) ->
554    [(true,true,false,false),(false,true,false,true); b1]
555  | XCH (`A, `INDIRECT i1) ->
556    [(true,true,false,false),(false,true,true,i1)]
557  | XCHD(`A, `INDIRECT i1) ->
558    [(true,true,false,true),(false,true,true,i1)]
559  | XRL(`U1(`A, `REG(r1,r2,r3))) ->
560    [(false,true,true,false),(true,r1,r2,r3)]
561  | XRL(`U1(`A, `DIRECT b1)) ->
562    [(false,true,true,false),(false,true,false,true); b1]
563  | XRL(`U1(`A, `INDIRECT i1)) ->
564    [(false,true,true,false),(false,true,true,i1)]
565  | XRL(`U1(`A, `DATA b1)) ->
566    [(false,true,true,false),(false,true,false,false); b1]
567  | XRL(`U2(`DIRECT b1, `A)) ->
568    [(false,true,true,false),(false,false,true,false); b1]
569  | XRL(`U2(`DIRECT b1, `DATA b2)) ->
570    [(false,true,true,false),(false,false,true,true); b1; b2]
571;;
572
573let address_of_register status (b1,b2,b3) =
574 let (_,_,rs1,rs0),_ = status.psw in
575 let base =
576  match rs1,rs0 with
577     false,false -> 0x00
578   | false,true  -> 0x08
579   | true,false  -> 0x10
580   | true,true   -> 0x18
581 in
582  byte7_of_int (base + int_of_nibble (false,b1,b2,b3))
583;;
584
585let fetch_register status reg =
586 let addr = address_of_register status reg in
587  Byte7Map.find addr status.low_internal_ram
588;;
589
590let set_register status v reg =
591 let addr = address_of_register status reg in
592  { status with low_internal_ram =
593     Byte7Map.add addr v status.low_internal_ram }
594;;
595
596let fetch_arg8 status = 
597 function
598    `DIRECT addr ->
599      (match addr with
600         (false,r1,r2,r3),n1 ->
601           Byte7Map.find (r1,r2,r3,n1) status.low_internal_ram
602       | (true,r1,r2,r3),n1 ->
603           (*CSC: SFR access, TO BE IMPLEMENTED *)
604           assert false)
605  | `INDIRECT b ->
606     let addr = fetch_register status (false,false,b) in
607     (match addr with 
608         (false,r1,r2,r3),n1 ->
609           Byte7Map.find (r1,r2,r3,n1) status.low_internal_ram
610       | (true,r1,r2,r3),n1 ->
611           Byte7Map.find (r1,r2,r3,n1) status.high_internal_ram)
612  | `REG (b1,b2,b3) ->
613      fetch_register status (b1,b2,b3)
614  | `A -> status.acc
615  | `B -> status.b
616  | `DATA b -> b
617  | `A_DPTR ->
618     let dpr = status.dph,status.dpl in
619     (* CSC: what is the right behaviour in case of overflow?
620        assert false for now. Try to understand what DEC really does *)
621     let addr = dpr ++ (int_of_byte status.acc) in
622      WordMap.find addr status.external_ram
623  | `A_PC ->
624     (* CSC: what is the right behaviour in case of overflow?
625        assert false for now *)
626     let addr = status.pc ++ (int_of_byte status.acc) in
627      WordMap.find addr status.external_ram
628  | `IND_DPTR ->
629     let dpr = status.dph,status.dpl in
630      WordMap.find dpr status.external_ram
631;;
632
633let fetch_arg16 status =
634  function
635                `DATA16 w -> w
636
637let fetch_arg1 status =
638  function
639    `BIT addr
640  | `NBIT addr as x ->
641     let res =
642      (match addr with
643         (false,r1,r2,r3),n1 ->
644           let addr = (int_of_byte7 (r1,r2,r3,n1)) in
645           let addr' = byte7_of_int ((addr / 8) + 32) in
646            nth_bit (addr mod 8) (Byte7Map.find addr' status.low_internal_ram)
647       | (true,r1,r2,r3),n1 ->
648           (*CSC: SFR access, TO BE IMPLEMENTED *)
649           assert false)
650    in (match x with `BIT _ -> res | _ -> not res)
651  | `C ->
652       let ((b1,_,_,_),_) = status.psw in
653         b1
654
655let set_arg1 status v =
656  function
657    `BIT addr ->
658      (match addr with
659         (false,r1,r2,r3),n1 ->
660           let addr = (int_of_byte7 (r1,r2,r3,n1)) in
661           let addr' = byte7_of_int ((addr / 8) + 32) in
662            { status with low_internal_ram =
663                Byte7Map.add addr' (set_nth_bit (addr mod 8) v (Byte7Map.find addr' status.low_internal_ram)) status.low_internal_ram }
664                        | (true,r1,r2,r3),n1 ->
665           (*CSC: SFR access, TO BE IMPLEMENTED *)
666           (* assert false for now. Try to understand what DEC really does *)
667           assert false)
668    | `C ->
669       let ((_,b2,b3,b4),n2) = status.psw in
670         { status with psw = (v,b2,b3,b4),n2 }
671
672let set_arg8 status v =
673 function
674    `DIRECT addr ->
675      (match addr with
676         (false,r1,r2,r3),n1 ->
677           { status with low_internal_ram =
678              Byte7Map.add (r1,r2,r3,n1) v status.low_internal_ram }
679       | (true,r1,r2,r3),n1 ->
680           (*CSC: SFR access, TO BE IMPLEMENTED *)
681           (* assert false for now. Try to understand what DEC really does *)
682           assert false)
683  | `INDIRECT b ->
684     let addr = fetch_register status (false,false,b) in
685     (match addr with 
686         (false,r1,r2,r3),n1 ->
687           { status with low_internal_ram =
688              Byte7Map.add (r1,r2,r3,n1) v status.low_internal_ram }
689       | (true,r1,r2,r3),n1 ->
690           { status with high_internal_ram =
691              Byte7Map.add (r1,r2,r3,n1) v status.high_internal_ram })
692  | `REG (b1,b2,b3) ->
693      set_register status v (b1,b2,b3)
694  | `A -> { status with acc = v }
695  | `B -> { status with b = v }
696  | `IND_DPTR ->
697     let dpr = status.dph,status.dpl in
698      { status with external_ram =
699        WordMap.add dpr v status.external_ram }
700;;
701
702let set_arg16 status (dh, dl) =
703        function
704                `DPTR ->
705                        { status with dph = dh; dpl = dl }
706
707let set_flags status c ac ov =
708 { status with psw =
709    let (_c,oac,fo,rs1),(rs0,_ov,ud,p) = status.psw in
710    let ac = match ac with None -> oac | Some v -> v in
711     (c,ac,fo,rs1),(rs0,ov,ud,p)
712 }
713;;
714
715let execute1 status =
716 let instr,pc,ticks = fetch status.code_memory status.pc in
717 let status = { status with clock = status.clock + ticks; pc = pc } in
718  match instr with
719     ADD (`A,d1) ->
720      let v,c,ac,ov =
721       add8_with_c (fetch_arg8 status `A) (fetch_arg8 status d1) false
722      in
723       set_flags (set_arg8 status v `A) c (Some ac) ov
724   | ADDC (`A,d1) ->
725      let v,c,ac,ov =
726       add8_with_c (fetch_arg8 status `A) (fetch_arg8 status d1) (carr status)
727      in
728       set_flags (set_arg8 status v `A) c (Some ac) ov
729   | SUBB (`A,d1) ->
730      let v,c,ac,ov =
731       subb8_with_c (fetch_arg8 status `A) (fetch_arg8 status d1) (carr status)
732      in
733       set_flags (set_arg8 status v `A) c (Some ac) ov
734(*
735   | INC `DPTR -> assert false
736*)
737   | INC ((`A | `REG _ | `DIRECT _ | `INDIRECT _) as d) ->
738      let b = fetch_arg8 status d in
739      let res = inc b in
740       set_arg8 status res d
741   | DEC d ->
742      let b = fetch_arg8 status d in
743      let res = dec b in
744       set_arg8 status res d
745 | MUL (`A,`B) ->
746    let acc = int_of_byte status.acc in
747    let b = int_of_byte status.b in
748    let prod = acc * b in
749    let ov = prod > 255 in
750    let l = byte_of_int (prod mod 256) in
751    let h = byte_of_int (prod / 256) in
752    let status = { status with acc = l ; b = h } in
753     set_flags status false None ov
754 | DIV (`A,`B) ->
755    let acc = int_of_byte status.acc in
756    let b = int_of_byte status.b in
757     if b = 0 then
758      (* CSC: acc and b undefined! we leave them as they are... *)
759      set_flags status false None true
760     else
761      let q = byte_of_int (acc / b) in
762      let r = byte_of_int (acc mod b) in
763      let status = { status with acc = q ; b = r } in
764       set_flags status false None false
765
766(*
767 | DA  of acc
768
769 (* logical operations *)
770 | ANL of
771    (acc * [ reg | direct | indirect | data ],
772     direct * [ acc | data ],
773     carry * [ bit | nbit]) union3
774 | ORL of
775    (acc * [ reg | direct | indirect ],
776     direct * [ acc | data ],
777     carry * [ bit | nbit]) union3
778 | XRL of
779    (acc * [ reg | direct | indirect ],
780     direct * [ acc | data ]) union2
781 | CLR of [ acc | carry | bit ]
782 | CPL of [ acc | carry | bit ]
783 | RL of acc
784 | RLC of acc
785 | RR of acc
786 | RRC of acc
787 | SWAP of acc
788*)
789
790 | MOV(`U1(b1, b2)) ->
791                let arg = fetch_arg8 status b2 in
792      set_arg8 status arg b1
793 | MOV(`U2(b1, b2)) ->
794                let arg = fetch_arg8 status b2 in
795      set_arg8 status arg b1
796 | MOV(`U3(b1, b2)) ->
797                let arg = fetch_arg8 status b2 in
798      set_arg8 status arg b1
799 | MOV(`U4(b1,b2)) ->
800    let arg = fetch_arg16 status b2 in
801      set_arg16 status arg b1
802 | MOV(`U5(b1,b2))->
803    let arg = fetch_arg1 status b2 in
804      set_arg1 status arg b1
805 | MOV(`U6(b1,b2))->
806    let arg = fetch_arg1 status b2 in
807      set_arg1 status arg b1
808
809 (* data transfer *)
810(*
811 | MOVC of acc * [ acc_dptr | acc_pc ]
812 | MOVX of (acc * [ indirect | indirect_dptr ],
813            [ indirect | indirect_dptr ] * acc) union2
814 | SETB of [ carry | bit ]
815 | PUSH of direct
816 | POP of direct
817 | XCH of acc * [ reg | direct | indirect ]
818 | XCHD of acc * indirect
819
820 (* program branching *)
821 | JC of rel
822 | JNC of rel
823 | JB of rel
824 | JNB of rel
825 | JBC of bit * rel
826 | ACALL of addr11
827 | LCALL of addr16
828 | RET
829 | RETI
830 | AJMP of addr11
831 | LJMP of addr16
832 | SJMP of rel
833 | JMP of indirect_dptr
834 | JZ of rel
835 | JNZ of rel
836 | CJNE of (acc * [ direct | data ], [ reg | indirect ] * data) union2 * rel
837 | DJNZ of [ reg | direct ] * rel
838 | NOP
839*)
840;;
Note: See TracBrowser for help on using the repository browser.