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

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

Fixed bug in ASMInterpret functions: CPL functions were not implemented.
More work on pretty printing.

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