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

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

Address1 function completed.

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