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

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

Added pretty printing functions for bits, bytes, words etc.

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