]> matita.cs.unibo.it Git - pkg-cerco/acc-trusted.git/blob - extracted/interpret.ml
Imported Upstream version 0.1
[pkg-cerco/acc-trusted.git] / extracted / interpret.ml
1 open Preamble
2
3 open BitVectorTrie
4
5 open String
6
7 open Exp
8
9 open Arithmetic
10
11 open Vector
12
13 open FoldStuff
14
15 open BitVector
16
17 open Extranat
18
19 open Integers
20
21 open AST
22
23 open LabelledObjects
24
25 open Proper
26
27 open PositiveMap
28
29 open Deqsets
30
31 open ErrorMessages
32
33 open PreIdentifiers
34
35 open Errors
36
37 open Extralib
38
39 open Setoids
40
41 open Monad
42
43 open Option
44
45 open Div_and_mod
46
47 open Util
48
49 open List
50
51 open Lists
52
53 open Bool
54
55 open Relations
56
57 open Nat
58
59 open Positive
60
61 open Identifiers
62
63 open CostLabel
64
65 open ASM
66
67 open Types
68
69 open Hints_declaration
70
71 open Core_notation
72
73 open Pts
74
75 open Logic
76
77 open Jmeq
78
79 open Russell
80
81 open Status
82
83 open StatusProofs
84
85 open Fetch
86
87 open Hide
88
89 open Division
90
91 open Z
92
93 open BitVectorZ
94
95 open Pointers
96
97 open Coqlib
98
99 open Values
100
101 open Events
102
103 open IOMonad
104
105 open IO
106
107 open Sets
108
109 open Listb
110
111 open StructuredTraces
112
113 open AbstractStatus
114
115 (** val execute_1_preinstruction :
116     (Nat.nat, Nat.nat) Types.prod -> 'a2 -> ('a1 -> 'a2 Status.preStatus ->
117     BitVector.word) -> 'a1 ASM.preinstruction -> 'a2 Status.preStatus -> 'a2
118     Status.preStatus **)
119 let execute_1_preinstruction ticks cm addr_of instr s =
120   let add_ticks1 = fun s0 ->
121     Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
122   in
123   let add_ticks2 = fun s0 ->
124     Status.set_clock cm s0 (Nat.plus ticks.Types.snd s0.Status.clock)
125   in
126   (match instr with
127    | ASM.ADD (addr1, addr2) ->
128      (fun _ ->
129        let s0 = add_ticks1 s in
130        let { Types.fst = result; Types.snd = flags } =
131          Arithmetic.add_8_with_carry
132            (Status.get_arg_8 cm s0 Bool.False
133              (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
134                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
135                Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
136                Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
137                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
138                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
139                (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
140                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
141                Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
142                (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons
143                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
144                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
145                ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
146                ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
147                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
148                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
149                Vector.VEmpty)))))))))))))))))))) addr1))
150            (Status.get_arg_8 cm s0 Bool.False
151              (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
152                (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
153                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
154                ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
155                ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
156                Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
157                Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
158                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
159                ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
160                (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
161                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
162                (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
163                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
164                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
165                ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
166                Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
167                Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
168                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
169                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
170                Vector.VEmpty)))))))))))))))))))) addr2)) Bool.False
171        in
172        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
173        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
174        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
175        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
176        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)
177    | ASM.ADDC (addr1, addr2) ->
178      (fun _ ->
179        let s0 = add_ticks1 s in
180        let old_cy_flag = Status.get_cy_flag cm s0 in
181        let { Types.fst = result; Types.snd = flags } =
182          Arithmetic.add_8_with_carry
183            (Status.get_arg_8 cm s0 Bool.False
184              (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
185                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
186                Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
187                Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
188                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
189                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
190                (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
191                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
192                Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
193                (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons
194                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
195                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
196                ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
197                ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
198                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
199                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
200                Vector.VEmpty)))))))))))))))))))) addr1))
201            (Status.get_arg_8 cm s0 Bool.False
202              (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
203                (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
204                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
205                ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
206                ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
207                Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
208                Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
209                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
210                ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
211                (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
212                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
213                (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
214                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
215                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
216                ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
217                Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
218                Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
219                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
220                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
221                Vector.VEmpty)))))))))))))))))))) addr2)) old_cy_flag
222        in
223        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
224        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
225        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
226        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
227        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)
228    | ASM.SUBB (addr1, addr2) ->
229      (fun _ ->
230        let s0 = add_ticks1 s in
231        let old_cy_flag = Status.get_cy_flag cm s0 in
232        let { Types.fst = result; Types.snd = flags } =
233          Arithmetic.sub_8_with_carry
234            (Status.get_arg_8 cm s0 Bool.False
235              (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
236                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
237                Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
238                Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
239                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
240                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
241                (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
242                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
243                Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
244                (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons
245                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
246                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
247                ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
248                ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
249                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
250                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
251                Vector.VEmpty)))))))))))))))))))) addr1))
252            (Status.get_arg_8 cm s0 Bool.False
253              (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
254                (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
255                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
256                ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
257                ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
258                Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
259                Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
260                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
261                ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
262                (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
263                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
264                (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
265                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
266                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
267                ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
268                Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
269                Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
270                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
271                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
272                Vector.VEmpty)))))))))))))))))))) addr2)) old_cy_flag
273        in
274        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
275        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
276        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
277        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
278        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)
279    | ASM.INC addr ->
280      (fun _ ->
281        (match ASM.subaddressing_modeel (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))
282                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
283                 ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
284                 ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
285                 ASM.Direct, (Vector.VCons ((Nat.S Nat.O), ASM.Indirect,
286                 (Vector.VCons (Nat.O, ASM.Dptr, Vector.VEmpty)))))))))) addr with
287         | ASM.DIRECT d ->
288           (fun _ ->
289             let s' = add_ticks1 s in
290             let result =
291               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
292                 (Nat.S Nat.O))))))))
293                 (Status.get_arg_8 cm s' Bool.True (ASM.DIRECT d))
294                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
295                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
296             in
297             Status.set_arg_8 cm s' (ASM.DIRECT d) result)
298         | ASM.INDIRECT i ->
299           (fun _ ->
300             let s' = add_ticks1 s in
301             let result =
302               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
303                 (Nat.S Nat.O))))))))
304                 (Status.get_arg_8 cm s' Bool.True (ASM.INDIRECT i))
305                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
306                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
307             in
308             Status.set_arg_8 cm s' (ASM.INDIRECT i) result)
309         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
310         | ASM.REGISTER r ->
311           (fun _ ->
312             let s' = add_ticks1 s in
313             let result =
314               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
315                 (Nat.S Nat.O))))))))
316                 (Status.get_arg_8 cm s' Bool.True (ASM.REGISTER r))
317                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
318                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
319             in
320             Status.set_arg_8 cm s' (ASM.REGISTER r) result)
321         | ASM.ACC_A ->
322           (fun _ ->
323             let s' = add_ticks1 s in
324             let result =
325               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
326                 (Nat.S Nat.O))))))))
327                 (Status.get_arg_8 cm s' Bool.True ASM.ACC_A)
328                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
329                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
330             in
331             Status.set_arg_8 cm s' ASM.ACC_A result)
332         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
333         | ASM.DPTR ->
334           (fun _ ->
335             let s' = add_ticks1 s in
336             let { Types.fst = carry; Types.snd = bl } =
337               Arithmetic.half_add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
338                 (Nat.S (Nat.S Nat.O))))))))
339                 (Status.get_8051_sfr cm s' Status.SFR_DPL)
340                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
341                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
342             in
343             let { Types.fst = carry0; Types.snd = bu } =
344               Arithmetic.full_add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
345                 (Nat.S (Nat.S Nat.O))))))))
346                 (Status.get_8051_sfr cm s' Status.SFR_DPH)
347                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
348                   (Nat.S (Nat.S Nat.O))))))))) carry
349             in
350             let s'' = Status.set_8051_sfr cm s' Status.SFR_DPL bl in
351             Status.set_8051_sfr cm s'' Status.SFR_DPH bu)
352         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
353         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
354         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
355         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
356         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
357         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
358         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
359         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
360         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
361         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
362         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
363         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
364    | ASM.DEC addr ->
365      (fun _ ->
366        let s0 = add_ticks1 s in
367        let { Types.fst = result; Types.snd = flags } =
368          Arithmetic.sub_8_with_carry
369            (Status.get_arg_8 cm s0 Bool.True
370              (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
371                (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
372                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
373                ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons
374                ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons ((Nat.S
375                Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
376                Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
377                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
378                ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
379                (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
380                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
381                (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
382                (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
383                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
384                ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
385                Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
386                Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
387                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
388                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
389                Vector.VEmpty)))))))))))))))))))) addr))
390            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
391              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
392        in
393        Status.set_arg_8 cm s0
394          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
395            (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
396            Nat.O)))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
397            ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Registr,
398            (Vector.VCons ((Nat.S Nat.O), ASM.Direct, (Vector.VCons (Nat.O,
399            ASM.Indirect, Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S
400            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
401            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
402            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
403            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
404            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
405            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
406            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr) result)
407    | ASM.MUL (addr1, addr2) ->
408      (fun _ ->
409        let s0 = add_ticks1 s in
410        let acc_a_nat =
411          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
412            (Nat.S (Nat.S (Nat.S Nat.O))))))))
413            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
414        in
415        let acc_b_nat =
416          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
417            (Nat.S (Nat.S (Nat.S Nat.O))))))))
418            (Status.get_8051_sfr cm s0 Status.SFR_ACC_B)
419        in
420        let product = Nat.times acc_a_nat acc_b_nat in
421        let low =
422          Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
423            (Nat.S (Nat.S (Nat.S Nat.O))))))))
424            (Util.modulus product (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
425              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
426              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
427              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
428              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
429              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
430              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
431              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
432              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
433              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
434              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
435              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
436              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
437              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
438              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
439              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
440              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
441              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
442              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
443              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
444              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
445              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
446              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
447              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
448              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
449              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
450              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
451              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
452              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
453              Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
454        in
455        let high =
456          Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
457            (Nat.S (Nat.S (Nat.S Nat.O))))))))
458            (Util.division product (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
459              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
460              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
461              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
462              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
463              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
464              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
465              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
466              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
467              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
468              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
469              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
470              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
471              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
472              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
473              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
474              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
475              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
476              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
477              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
478              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
479              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
480              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
481              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
482              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
483              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
484              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
485              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
486              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
487              Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
488        in
489        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A low in
490        Status.set_8051_sfr cm s1 Status.SFR_ACC_B high)
491    | ASM.DIV (addr1, addr2) ->
492      (fun _ ->
493        let s0 = add_ticks1 s in
494        let acc_a_nat =
495          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
496            (Nat.S (Nat.S (Nat.S Nat.O))))))))
497            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
498        in
499        let acc_b_nat =
500          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
501            (Nat.S (Nat.S (Nat.S Nat.O))))))))
502            (Status.get_8051_sfr cm s0 Status.SFR_ACC_B)
503        in
504        (match acc_b_nat with
505         | Nat.O -> Status.set_flags cm s0 Bool.False Types.None Bool.True
506         | Nat.S o ->
507           let q =
508             Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
509               (Nat.S (Nat.S (Nat.S Nat.O))))))))
510               (Util.division acc_a_nat (Nat.S o))
511           in
512           let r =
513             Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
514               (Nat.S (Nat.S (Nat.S Nat.O))))))))
515               (Util.modulus acc_a_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
516                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
517                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
518                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
519                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
520                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
521                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
522                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
523                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
524                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
525                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
526                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
527                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
528                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
529                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
530                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
531                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
532                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
533                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
534                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
535                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
536                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
537                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
538                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
539                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
540                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
541                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
542                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
543                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
544                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
545                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
546                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
547                 (Nat.S (Nat.S (Nat.S
548                 Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
549           in
550           let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A q in
551           let s2 = Status.set_8051_sfr cm s1 Status.SFR_ACC_B r in
552           Status.set_flags cm s2 Bool.False Types.None Bool.False))
553    | ASM.DA addr ->
554      (fun _ ->
555        let s0 = add_ticks1 s in
556        let { Types.fst = acc_nu; Types.snd = acc_nl } =
557          Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
558            (Nat.S (Nat.S Nat.O))))
559            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
560        in
561        (match Bool.orb
562                 (Util.gtb
563                   (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S
564                     Nat.O)))) acc_nl) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
565                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))))
566                 (Status.get_ac_flag cm s0) with
567         | Bool.True ->
568           let { Types.fst = result; Types.snd = flags } =
569             Arithmetic.add_8_with_carry
570               (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
571               (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
572                 (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S
573                 (Nat.S (Nat.S (Nat.S Nat.O))))))) Bool.False
574           in
575           let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags
576           in
577           let { Types.fst = acc_nu'; Types.snd = acc_nl' } =
578             Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
579               (Nat.S (Nat.S Nat.O)))) result
580           in
581           (match Bool.orb
582                    (Util.gtb
583                      (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S
584                        Nat.O)))) acc_nu') (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
585                      (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))) cy_flag with
586            | Bool.True ->
587              let nu =
588                Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) acc_nu'
589                  (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
590                    Nat.O)))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
591                    Nat.O)))))))
592              in
593              let new_acc =
594                Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S
595                  (Nat.S (Nat.S (Nat.S Nat.O)))) nu acc_nl'
596              in
597              let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc in
598              Status.set_flags cm s1 cy_flag (Types.Some
599                (Status.get_ac_flag cm s1)) (Status.get_ov_flag cm s1)
600            | Bool.False -> s0)
601         | Bool.False -> s0))
602    | ASM.JC addr ->
603      (fun _ ->
604        match Status.get_cy_flag cm s with
605        | Bool.True ->
606          let s0 = add_ticks1 s in
607          Status.set_program_counter cm s0 (addr_of addr s0)
608        | Bool.False -> let s0 = add_ticks2 s in s0)
609    | ASM.JNC addr ->
610      (fun _ ->
611        match Bool.notb (Status.get_cy_flag cm s) with
612        | Bool.True ->
613          let s0 = add_ticks1 s in
614          Status.set_program_counter cm s0 (addr_of addr s0)
615        | Bool.False -> let s0 = add_ticks2 s in s0)
616    | ASM.JB (addr1, addr2) ->
617      (fun _ ->
618        match Status.get_arg_1 cm s
619                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
620                  (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
621                  Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
622                  ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
623                  (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr1)
624                Bool.False with
625        | Bool.True ->
626          let s0 = add_ticks1 s in
627          Status.set_program_counter cm s0 (addr_of addr2 s0)
628        | Bool.False -> let s0 = add_ticks2 s in s0)
629    | ASM.JNB (addr1, addr2) ->
630      (fun _ ->
631        match Bool.notb
632                (Status.get_arg_1 cm s
633                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
634                    (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
635                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
636                    ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O),
637                    ASM.N_bit_addr, (Vector.VCons (Nat.O, ASM.Carry,
638                    Vector.VEmpty)))))) addr1) Bool.False) with
639        | Bool.True ->
640          let s0 = add_ticks1 s in
641          Status.set_program_counter cm s0 (addr_of addr2 s0)
642        | Bool.False -> let s0 = add_ticks2 s in s0)
643    | ASM.JBC (addr1, addr2) ->
644      (fun _ ->
645        let s0 =
646          Status.set_arg_1 cm s
647            (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
648              Nat.O) (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))
649              (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons
650              (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1) Bool.False
651        in
652        (match Status.get_arg_1 cm s0
653                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
654                   (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
655                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
656                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
657                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr1)
658                 Bool.False with
659         | Bool.True ->
660           let s1 = add_ticks1 s0 in
661           Status.set_program_counter cm s1 (addr_of addr2 s1)
662         | Bool.False -> let s1 = add_ticks2 s0 in s1))
663    | ASM.JZ addr ->
664      (fun _ ->
665        match BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
666                (Nat.S Nat.O))))))))
667                (Status.get_8051_sfr cm s Status.SFR_ACC_A)
668                (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
669                  (Nat.S (Nat.S Nat.O))))))))) with
670        | Bool.True ->
671          let s0 = add_ticks1 s in
672          Status.set_program_counter cm s0 (addr_of addr s0)
673        | Bool.False -> let s0 = add_ticks2 s in s0)
674    | ASM.JNZ addr ->
675      (fun _ ->
676        match Bool.notb
677                (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
678                  (Nat.S (Nat.S Nat.O))))))))
679                  (Status.get_8051_sfr cm s Status.SFR_ACC_A)
680                  (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
681                    (Nat.S (Nat.S Nat.O)))))))))) with
682        | Bool.True ->
683          let s0 = add_ticks1 s in
684          Status.set_program_counter cm s0 (addr_of addr s0)
685        | Bool.False -> let s0 = add_ticks2 s in s0)
686    | ASM.CJNE (addr1, addr2) ->
687      (fun _ ->
688        match addr1 with
689        | Types.Inl l ->
690          let { Types.fst = addr10; Types.snd = addr2' } = l in
691          let new_cy =
692            Util.ltb
693              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
694                (Nat.S (Nat.S (Nat.S Nat.O))))))))
695                (Status.get_arg_8 cm s Bool.False
696                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
697                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
698                    (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
699                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
700                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
701                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
702                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
703                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
704                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
705                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
706                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
707                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
708                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
709                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
710                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
711                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
712                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
713                    addr10)))
714              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
715                (Nat.S (Nat.S (Nat.S Nat.O))))))))
716                (Status.get_arg_8 cm s Bool.False
717                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
718                    Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
719                    (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
720                    ASM.Direct, (Vector.VCons (Nat.O, ASM.Data,
721                    Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
722                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
723                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
724                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
725                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
726                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
727                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
728                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
729                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
730                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
731                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
732                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
733                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
734                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
735                    addr2')))
736          in
737          (match Bool.notb
738                   (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
739                     (Nat.S (Nat.S Nat.O))))))))
740                     (Status.get_arg_8 cm s Bool.False
741                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
742                         Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
743                         (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
744                         (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons
745                         ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
746                         (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
747                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
748                         (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
749                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
750                         (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
751                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
752                         (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
753                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
754                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
755                         ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
756                         Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
757                         Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
758                         ASM.Ext_indirect, (Vector.VCons (Nat.O,
759                         ASM.Ext_indirect_dptr,
760                         Vector.VEmpty)))))))))))))))))))) addr10))
761                     (Status.get_arg_8 cm s Bool.False
762                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
763                         (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
764                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
765                         (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
766                         (Vector.VCons (Nat.O, ASM.Data, Vector.VEmpty))))
767                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
768                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
769                         ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
770                         (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
771                         ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
772                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
773                         ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
774                         (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
775                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
776                         Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
777                         (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
778                         ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr,
779                         (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
780                         (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
781                         (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
782                         Vector.VEmpty)))))))))))))))))))) addr2'))) with
783           | Bool.True ->
784             let s0 = add_ticks1 s in
785             let s1 = Status.set_program_counter cm s0 (addr_of addr2 s0) in
786             Status.set_flags cm s1 new_cy Types.None
787               (Status.get_ov_flag cm s1)
788           | Bool.False ->
789             let s0 = add_ticks2 s in
790             Status.set_flags cm s0 new_cy Types.None
791               (Status.get_ov_flag cm s0))
792        | Types.Inr r' ->
793          let { Types.fst = addr10; Types.snd = addr2' } = r' in
794          let new_cy =
795            Util.ltb
796              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
797                (Nat.S (Nat.S (Nat.S Nat.O))))))))
798                (Status.get_arg_8 cm s Bool.False
799                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
800                    Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
801                    (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
802                    ASM.Registr, (Vector.VCons (Nat.O, ASM.Indirect,
803                    Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
804                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
805                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
806                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
807                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
808                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
809                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
810                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
811                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
812                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
813                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
814                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
815                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
816                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
817                    addr10)))
818              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
819                (Nat.S (Nat.S (Nat.S Nat.O))))))))
820                (Status.get_arg_8 cm s Bool.False
821                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
822                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
823                    (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Data,
824                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
825                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
826                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
827                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
828                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
829                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
830                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
831                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
832                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
833                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
834                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
835                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
836                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
837                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
838                    addr2')))
839          in
840          (match Bool.notb
841                   (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
842                     (Nat.S (Nat.S Nat.O))))))))
843                     (Status.get_arg_8 cm s Bool.False
844                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
845                         (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
846                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
847                         (Vector.VCons ((Nat.S Nat.O), ASM.Registr,
848                         (Vector.VCons (Nat.O, ASM.Indirect, Vector.VEmpty))))
849                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
850                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
851                         ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
852                         (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
853                         ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
854                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
855                         ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
856                         (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
857                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
858                         Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
859                         (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
860                         ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr,
861                         (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
862                         (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
863                         (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
864                         Vector.VEmpty)))))))))))))))))))) addr10))
865                     (Status.get_arg_8 cm s Bool.False
866                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
867                         Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
868                         (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
869                         (Nat.O, ASM.Data, Vector.VEmpty)) (Vector.VCons
870                         ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
871                         (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
872                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
873                         (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
874                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
875                         (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
876                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
877                         (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
878                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
879                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
880                         ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
881                         Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
882                         Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
883                         ASM.Ext_indirect, (Vector.VCons (Nat.O,
884                         ASM.Ext_indirect_dptr,
885                         Vector.VEmpty)))))))))))))))))))) addr2'))) with
886           | Bool.True ->
887             let s0 = add_ticks1 s in
888             let s1 = Status.set_program_counter cm s0 (addr_of addr2 s0) in
889             Status.set_flags cm s1 new_cy Types.None
890               (Status.get_ov_flag cm s1)
891           | Bool.False ->
892             let s0 = add_ticks2 s in
893             Status.set_flags cm s0 new_cy Types.None
894               (Status.get_ov_flag cm s0)))
895    | ASM.DJNZ (addr1, addr2) ->
896      (fun _ ->
897        let { Types.fst = result; Types.snd = flags } =
898          Arithmetic.sub_8_with_carry
899            (Status.get_arg_8 cm s Bool.True
900              (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
901                Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
902                (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
903                ASM.Registr, (Vector.VCons (Nat.O, ASM.Direct,
904                Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
905                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
906                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
907                (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
908                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
909                Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
910                (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons
911                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
912                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
913                ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
914                ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
915                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
916                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
917                Vector.VEmpty)))))))))))))))))))) addr1))
918            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
919              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
920        in
921        let s0 =
922          Status.set_arg_8 cm s
923            (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
924              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
925              (Vector.VCons ((Nat.S Nat.O), ASM.Registr, (Vector.VCons (Nat.O,
926              ASM.Direct, Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S
927              (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
928              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
929              ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
930              Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
931              Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
932              ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
933              (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
934              Vector.VEmpty)))))))))))))) addr1) result
935        in
936        (match Bool.notb
937                 (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
938                   (Nat.S (Nat.S Nat.O)))))))) result
939                   (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
940                     (Nat.S (Nat.S Nat.O)))))))))) with
941         | Bool.True ->
942           let s1 = add_ticks1 s0 in
943           Status.set_program_counter cm s1 (addr_of addr2 s1)
944         | Bool.False -> let s1 = add_ticks2 s0 in s1))
945    | ASM.ANL addr ->
946      (fun _ ->
947        let s0 = add_ticks1 s in
948        (match addr with
949         | Types.Inl l ->
950           (match l with
951            | Types.Inl l' ->
952              let { Types.fst = addr1; Types.snd = addr2 } = l' in
953              let and_val =
954                BitVector.conjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
955                  (Nat.S (Nat.S (Nat.S Nat.O))))))))
956                  (Status.get_arg_8 cm s0 Bool.True
957                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
958                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
959                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
960                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
961                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
962                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
963                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
964                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
965                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
966                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
967                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
968                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
969                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
970                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
971                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
972                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
973                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
974                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
975                      addr1))
976                  (Status.get_arg_8 cm s0 Bool.True
977                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
978                      (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S
979                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
980                      (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
981                      ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
982                      ASM.Direct, (Vector.VCons ((Nat.S Nat.O), ASM.Indirect,
983                      (Vector.VCons (Nat.O, ASM.Data, Vector.VEmpty))))))))
984                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
985                      (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
986                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
987                      (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
988                      ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
989                      Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
990                      (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
991                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
992                      Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
993                      (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S
994                      (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
995                      ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons
996                      ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
997                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
998                      addr2))
999              in
1000              Status.set_arg_8 cm s0
1001                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1002                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1003                  (Vector.VCons (Nat.O, ASM.Acc_a, Vector.VEmpty))
1004                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1005                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1006                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
1007                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1008                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1009                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
1010                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1011                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1012                  Vector.VEmpty)))))))))))))) addr1) and_val
1013            | Types.Inr r ->
1014              let { Types.fst = addr1; Types.snd = addr2 } = r in
1015              let and_val =
1016                BitVector.conjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1017                  (Nat.S (Nat.S (Nat.S Nat.O))))))))
1018                  (Status.get_arg_8 cm s0 Bool.True
1019                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1020                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1021                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
1022                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1023                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1024                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1025                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1026                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1027                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1028                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1029                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1030                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1031                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1032                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1033                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1034                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1035                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1036                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1037                      addr1))
1038                  (Status.get_arg_8 cm s0 Bool.True
1039                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1040                      Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1041                      (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S
1042                      Nat.O), ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
1043                      Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1044                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1045                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1046                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1047                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1048                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1049                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1050                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1051                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1052                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1053                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1054                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1055                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1056                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1057                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1058                      addr2))
1059              in
1060              Status.set_arg_8 cm s0
1061                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1062                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1063                  (Vector.VCons (Nat.O, ASM.Direct, Vector.VEmpty))
1064                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1065                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1066                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
1067                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1068                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1069                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
1070                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1071                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1072                  Vector.VEmpty)))))))))))))) addr1) and_val)
1073         | Types.Inr r ->
1074           let { Types.fst = addr1; Types.snd = addr2 } = r in
1075           let and_val =
1076             Bool.andb (Status.get_cy_flag cm s0)
1077               (Status.get_arg_1 cm s0
1078                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1079                   Nat.O) (Nat.S (Nat.S Nat.O)) (Vector.VCons ((Nat.S Nat.O),
1080                   ASM.Bit_addr, (Vector.VCons (Nat.O, ASM.N_bit_addr,
1081                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1082                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
1083                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
1084                 Bool.True)
1085           in
1086           Status.set_flags cm s0 and_val Types.None
1087             (Status.get_ov_flag cm s0)))
1088    | ASM.ORL addr ->
1089      (fun _ ->
1090        let s0 = add_ticks1 s in
1091        (match addr with
1092         | Types.Inl l ->
1093           (match l with
1094            | Types.Inl l' ->
1095              let { Types.fst = addr1; Types.snd = addr2 } = l' in
1096              let or_val =
1097                BitVector.inclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
1098                  (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
1099                  (Status.get_arg_8 cm s0 Bool.True
1100                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1101                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1102                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
1103                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1104                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1105                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1106                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1107                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1108                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1109                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1110                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1111                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1112                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1113                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1114                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1115                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1116                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1117                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1118                      addr1))
1119                  (Status.get_arg_8 cm s0 Bool.True
1120                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1121                      (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S
1122                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
1123                      (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1124                      ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1125                      ASM.Data, (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
1126                      (Vector.VCons (Nat.O, ASM.Indirect,
1127                      Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S
1128                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1129                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1130                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1131                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1132                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1133                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1134                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1135                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1136                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1137                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1138                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1139                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1140                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1141                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1142                      addr2))
1143              in
1144              Status.set_arg_8 cm s0
1145                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1146                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1147                  (Vector.VCons (Nat.O, ASM.Acc_a, Vector.VEmpty))
1148                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1149                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1150                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
1151                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1152                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1153                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
1154                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1155                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1156                  Vector.VEmpty)))))))))))))) addr1) or_val
1157            | Types.Inr r ->
1158              let { Types.fst = addr1; Types.snd = addr2 } = r in
1159              let or_val =
1160                BitVector.inclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
1161                  (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
1162                  (Status.get_arg_8 cm s0 Bool.True
1163                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1164                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1165                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
1166                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1167                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1168                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1169                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1170                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1171                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1172                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1173                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1174                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1175                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1176                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1177                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1178                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1179                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1180                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1181                      addr1))
1182                  (Status.get_arg_8 cm s0 Bool.True
1183                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1184                      Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1185                      (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S
1186                      Nat.O), ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
1187                      Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1188                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1189                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
1190                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1191                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1192                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1193                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1194                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1195                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1196                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1197                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1198                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1199                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1200                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
1201                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1202                      addr2))
1203              in
1204              Status.set_arg_8 cm s0
1205                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1206                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1207                  (Vector.VCons (Nat.O, ASM.Direct, Vector.VEmpty))
1208                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1209                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1210                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
1211                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1212                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1213                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
1214                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1215                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1216                  Vector.VEmpty)))))))))))))) addr1) or_val)
1217         | Types.Inr r ->
1218           let { Types.fst = addr1; Types.snd = addr2 } = r in
1219           let or_val =
1220             Bool.orb (Status.get_cy_flag cm s0)
1221               (Status.get_arg_1 cm s0
1222                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1223                   Nat.O) (Nat.S (Nat.S Nat.O)) (Vector.VCons ((Nat.S Nat.O),
1224                   ASM.Bit_addr, (Vector.VCons (Nat.O, ASM.N_bit_addr,
1225                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1226                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
1227                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
1228                 Bool.True)
1229           in
1230           Status.set_flags cm s0 or_val Types.None (Status.get_ov_flag cm s0)))
1231    | ASM.XRL addr ->
1232      (fun _ ->
1233        let s0 = add_ticks1 s in
1234        (match addr with
1235         | Types.Inl l' ->
1236           let { Types.fst = addr1; Types.snd = addr2 } = l' in
1237           let xor_val =
1238             BitVector.exclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
1239               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
1240               (Status.get_arg_8 cm s0 Bool.True
1241                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1242                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1243                   (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
1244                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1245                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1246                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1247                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1248                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1249                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1250                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1251                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1252                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1253                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1254                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
1255                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1256                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
1257                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1258                   addr1))
1259               (Status.get_arg_8 cm s0 Bool.True
1260                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1261                   (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1262                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
1263                   ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Data, (Vector.VCons
1264                   ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons ((Nat.S
1265                   Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
1266                   Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1267                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1268                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1269                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1270                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1271                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1272                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1273                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1274                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1275                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1276                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
1277                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1278                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
1279                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1280                   addr2))
1281           in
1282           Status.set_arg_8 cm s0
1283             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1284               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
1285               (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
1286               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
1287               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1288               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1289               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1290               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1291               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1292               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1293               Vector.VEmpty)))))))))))))) addr1) xor_val
1294         | Types.Inr r ->
1295           let { Types.fst = addr1; Types.snd = addr2 } = r in
1296           let xor_val =
1297             BitVector.exclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
1298               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
1299               (Status.get_arg_8 cm s0 Bool.True
1300                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1301                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1302                   (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
1303                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1304                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1305                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1306                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1307                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1308                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1309                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1310                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1311                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1312                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1313                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
1314                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1315                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
1316                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1317                   addr1))
1318               (Status.get_arg_8 cm s0 Bool.True
1319                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1320                   Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1321                   (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
1322                   ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
1323                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1324                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1325                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1326                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1327                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1328                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1329                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1330                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1331                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1332                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1333                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
1334                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
1335                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
1336                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1337                   addr2))
1338           in
1339           Status.set_arg_8 cm s0
1340             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1341               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
1342               (Nat.O, ASM.Direct, Vector.VEmpty)) (Vector.VCons ((Nat.S
1343               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
1344               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1345               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1346               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1347               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1348               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1349               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1350               Vector.VEmpty)))))))))))))) addr1) xor_val))
1351    | ASM.CLR addr ->
1352      (fun _ ->
1353        (match ASM.subaddressing_modeel (Nat.S (Nat.S Nat.O)) (Vector.VCons
1354                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_a, (Vector.VCons ((Nat.S
1355                 Nat.O), ASM.Carry, (Vector.VCons (Nat.O, ASM.Bit_addr,
1356                 Vector.VEmpty)))))) addr with
1357         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
1358         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
1359         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
1360         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
1361         | ASM.ACC_A ->
1362           (fun _ ->
1363             let s0 = add_ticks1 s in
1364             Status.set_arg_8 cm s0 ASM.ACC_A
1365               (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1366                 (Nat.S (Nat.S Nat.O))))))))))
1367         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
1368         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
1369         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
1370         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
1371         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
1372         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
1373         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
1374         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
1375         | ASM.CARRY ->
1376           (fun _ ->
1377             let s0 = add_ticks1 s in
1378             Status.set_arg_1 cm s0 ASM.CARRY Bool.False)
1379         | ASM.BIT_ADDR b ->
1380           (fun _ ->
1381             let s0 = add_ticks1 s in
1382             Status.set_arg_1 cm s0 (ASM.BIT_ADDR b) Bool.False)
1383         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
1384         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
1385         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
1386         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
1387    | ASM.CPL addr ->
1388      (fun _ ->
1389        (match ASM.subaddressing_modeel (Nat.S (Nat.S Nat.O)) (Vector.VCons
1390                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_a, (Vector.VCons ((Nat.S
1391                 Nat.O), ASM.Carry, (Vector.VCons (Nat.O, ASM.Bit_addr,
1392                 Vector.VEmpty)))))) addr with
1393         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
1394         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
1395         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
1396         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
1397         | ASM.ACC_A ->
1398           (fun _ ->
1399             let s0 = add_ticks1 s in
1400             let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1401             let new_acc =
1402               BitVector.negation_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1403                 (Nat.S (Nat.S Nat.O)))))))) old_acc
1404             in
1405             Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
1406         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
1407         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
1408         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
1409         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
1410         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
1411         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
1412         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
1413         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
1414         | ASM.CARRY ->
1415           (fun _ ->
1416             let s0 = add_ticks1 s in
1417             let old_cy_flag = Status.get_arg_1 cm s0 ASM.CARRY Bool.True in
1418             let new_cy_flag = Bool.notb old_cy_flag in
1419             Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag)
1420         | ASM.BIT_ADDR b ->
1421           (fun _ ->
1422             let s0 = add_ticks1 s in
1423             let old_bit = Status.get_arg_1 cm s0 (ASM.BIT_ADDR b) Bool.True
1424             in
1425             let new_bit = Bool.notb old_bit in
1426             Status.set_arg_1 cm s0 (ASM.BIT_ADDR b) new_bit)
1427         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
1428         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
1429         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
1430         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
1431    | ASM.RL x ->
1432      (fun _ ->
1433        let s0 = add_ticks1 s in
1434        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1435        let new_acc =
1436          Vector.rotate_left (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1437            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc
1438        in
1439        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
1440    | ASM.RLC x ->
1441      (fun _ ->
1442        let s0 = add_ticks1 s in
1443        let old_cy_flag = Status.get_cy_flag cm s0 in
1444        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1445        let new_cy_flag =
1446          Vector.get_index' Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1447            (Nat.S Nat.O))))))) old_acc
1448        in
1449        let new_acc =
1450          Vector.shift_left (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1451            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc old_cy_flag
1452        in
1453        let s1 = Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag in
1454        Status.set_8051_sfr cm s1 Status.SFR_ACC_A new_acc)
1455    | ASM.RR x ->
1456      (fun _ ->
1457        let s0 = add_ticks1 s in
1458        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1459        let new_acc =
1460          Vector.rotate_right (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1461            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc
1462        in
1463        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
1464    | ASM.RRC x ->
1465      (fun _ ->
1466        let s0 = add_ticks1 s in
1467        let old_cy_flag = Status.get_cy_flag cm s0 in
1468        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1469        let new_cy_flag =
1470          Vector.get_index' (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1471            Nat.O))))))) Nat.O old_acc
1472        in
1473        let new_acc =
1474          Vector.shift_right (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1475            Nat.O))))))) (Nat.S Nat.O) old_acc old_cy_flag
1476        in
1477        let s1 = Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag in
1478        Status.set_8051_sfr cm s1 Status.SFR_ACC_A new_acc)
1479    | ASM.SWAP x ->
1480      (fun _ ->
1481        let s0 = add_ticks1 s in
1482        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1483        let { Types.fst = nu; Types.snd = nl } =
1484          Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1485            (Nat.S (Nat.S Nat.O)))) old_acc
1486        in
1487        let new_acc =
1488          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1489            (Nat.S (Nat.S Nat.O)))) nl nu
1490        in
1491        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
1492    | ASM.MOV addr ->
1493      (fun _ ->
1494        let s0 = add_ticks1 s in
1495        (match addr with
1496         | Types.Inl l ->
1497           (match l with
1498            | Types.Inl l' ->
1499              (match l' with
1500               | Types.Inl l'' ->
1501                 (match l'' with
1502                  | Types.Inl l''' ->
1503                    (match l''' with
1504                     | Types.Inl l'''' ->
1505                       let { Types.fst = addr1; Types.snd = addr2 } = l'''' in
1506                       Status.set_arg_8 cm s0
1507                         (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1508                           Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1509                           Nat.O)))))) (Vector.VCons (Nat.O, ASM.Acc_a,
1510                           Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1511                           (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
1512                           (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1513                           Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S
1514                           (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1515                           (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1516                           ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1517                           ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O),
1518                           ASM.Ext_indirect, (Vector.VCons (Nat.O,
1519                           ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))
1520                           addr1)
1521                         (Status.get_arg_8 cm s0 Bool.False
1522                           (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1523                             (Nat.S (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S
1524                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1525                             Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S
1526                             (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
1527                             ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons
1528                             ((Nat.S Nat.O), ASM.Indirect, (Vector.VCons
1529                             (Nat.O, ASM.Data, Vector.VEmpty))))))))
1530                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1531                             (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1532                             ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1533                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1534                             ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1535                             (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
1536                             ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1537                             (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1538                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1539                             Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S
1540                             (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Data,
1541                             (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1542                             ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
1543                             Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
1544                             Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1545                             ASM.Ext_indirect_dptr,
1546                             Vector.VEmpty)))))))))))))))))))) addr2))
1547                     | Types.Inr r'''' ->
1548                       let { Types.fst = addr1; Types.snd = addr2 } = r'''' in
1549                       Status.set_arg_8 cm s0
1550                         (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1551                           (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1552                           (Nat.S Nat.O)))))) (Vector.VCons ((Nat.S Nat.O),
1553                           ASM.Registr, (Vector.VCons (Nat.O, ASM.Indirect,
1554                           Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S
1555                           (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
1556                           ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1557                           (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
1558                           (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1559                           Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S
1560                           (Nat.S (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons
1561                           ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
1562                           ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
1563                           (Nat.O, ASM.Ext_indirect_dptr,
1564                           Vector.VEmpty)))))))))))))) addr1)
1565                         (Status.get_arg_8 cm s0 Bool.False
1566                           (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1567                             (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S
1568                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
1569                             (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_a,
1570                             (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
1571                             (Vector.VCons (Nat.O, ASM.Data,
1572                             Vector.VEmpty)))))) (Vector.VCons ((Nat.S (Nat.S
1573                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1574                             Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
1575                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1576                             Nat.O)))))))), ASM.Indirect, (Vector.VCons
1577                             ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1578                             Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1579                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
1580                             ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1581                             (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1582                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1583                             Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1584                             (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
1585                             ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons
1586                             ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
1587                             (Nat.O, ASM.Ext_indirect_dptr,
1588                             Vector.VEmpty)))))))))))))))))))) addr2)))
1589                  | Types.Inr r''' ->
1590                    let { Types.fst = addr1; Types.snd = addr2 } = r''' in
1591                    Status.set_arg_8 cm s0
1592                      (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1593                        Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1594                        Nat.O)))))) (Vector.VCons (Nat.O, ASM.Direct,
1595                        Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1596                        (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
1597                        (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1598                        Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S
1599                        (Nat.S (Nat.S Nat.O)))), ASM.Registr, (Vector.VCons
1600                        ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1601                        (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
1602                        (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1603                        (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1604                        Vector.VEmpty)))))))))))))) addr1)
1605                      (Status.get_arg_8 cm s0 Bool.False
1606                        (ASM.subaddressing_modeel__o__mk_subaddressing_mode
1607                          (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1608                          (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1609                          Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1610                          (Nat.S Nat.O)))), ASM.Acc_a, (Vector.VCons ((Nat.S
1611                          (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
1612                          ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons
1613                          ((Nat.S Nat.O), ASM.Indirect, (Vector.VCons (Nat.O,
1614                          ASM.Data, Vector.VEmpty)))))))))) (Vector.VCons
1615                          ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1616                          (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
1617                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1618                          (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1619                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1620                          (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1621                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1622                          (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
1623                          (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1624                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1625                          Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
1626                          (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
1627                          (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
1628                          Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1629                          ASM.Ext_indirect_dptr,
1630                          Vector.VEmpty)))))))))))))))))))) addr2)))
1631               | Types.Inr r'' ->
1632                 let { Types.fst = addr1; Types.snd = addr2 } = r'' in
1633                 Status.set_arg_16 cm s0
1634                   (Status.get_arg_16 cm s0
1635                     (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1636                       (Nat.S Nat.O) (Vector.VCons (Nat.O, ASM.Data16,
1637                       Vector.VEmpty)) (Vector.VCons ((Nat.S Nat.O),
1638                       ASM.Data16, (Vector.VCons (Nat.O, ASM.Acc_dptr,
1639                       Vector.VEmpty)))) addr2)) addr1)
1640            | Types.Inr r ->
1641              let { Types.fst = addr1; Types.snd = addr2 } = r in
1642              Status.set_arg_1 cm s0
1643                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1644                  (Nat.S Nat.O) (Vector.VCons (Nat.O, ASM.Carry,
1645                  Vector.VEmpty)) (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr,
1646                  (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1)
1647                (Status.get_arg_1 cm s0
1648                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1649                    (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
1650                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1651                    ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O),
1652                    ASM.N_bit_addr, (Vector.VCons (Nat.O, ASM.Carry,
1653                    Vector.VEmpty)))))) addr2) Bool.False))
1654         | Types.Inr r ->
1655           let { Types.fst = addr1; Types.snd = addr2 } = r in
1656           Status.set_arg_1 cm s0
1657             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1658               Nat.O) (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))
1659               (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons
1660               (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1)
1661             (Status.get_arg_1 cm s0
1662               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1663                 (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Carry,
1664                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1665                 ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
1666                 (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
1667               Bool.False)))
1668    | ASM.MOVX addr ->
1669      (fun _ ->
1670        let s0 = add_ticks1 s in
1671        (match addr with
1672         | Types.Inl l ->
1673           let { Types.fst = addr1; Types.snd = addr2 } = l in
1674           Status.set_arg_8 cm s0
1675             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1676               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
1677               (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
1678               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
1679               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1680               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1681               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1682               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1683               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1684               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1685               Vector.VEmpty)))))))))))))) addr1)
1686             (Status.get_arg_8 cm s0 Bool.False
1687               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1688                 Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1689                 (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
1690                 ASM.Ext_indirect, (Vector.VCons (Nat.O,
1691                 ASM.Ext_indirect_dptr, Vector.VEmpty)))) (Vector.VCons
1692                 ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1693                 (Nat.S Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
1694                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1695                 Nat.O)))))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S
1696                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
1697                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1698                 Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1699                 (Nat.S (Nat.S Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S
1700                 (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
1701                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
1702                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
1703                 Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1704                 ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1705                 addr2))
1706         | Types.Inr r ->
1707           let { Types.fst = addr1; Types.snd = addr2 } = r in
1708           Status.set_arg_8 cm s0
1709             (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
1710               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1711               (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
1712               (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty)))) (Vector.VCons
1713               ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
1714               ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1715               Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1716               (Nat.S Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
1717               (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
1718               Nat.O)), ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O),
1719               ASM.Ext_indirect, (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1720               Vector.VEmpty)))))))))))))) addr1)
1721             (Status.get_arg_8 cm s0 Bool.False
1722               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1723                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1724                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
1725                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1726                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1727                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1728                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1729                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1730                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1731                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1732                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1733                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1734                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1735                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1736                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1737                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1738                 Vector.VEmpty)))))))))))))))))))) addr2))))
1739    | ASM.SETB b ->
1740      (fun _ ->
1741        let s0 = add_ticks1 s in
1742        Status.set_arg_1 cm s0
1743          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
1744            (Nat.S Nat.O) (Vector.VCons ((Nat.S Nat.O), ASM.Carry,
1745            (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))))
1746            (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons (Nat.O,
1747            ASM.Carry, Vector.VEmpty)))) b) Bool.False)
1748    | ASM.PUSH addr ->
1749      (fun _ ->
1750        let s0 = add_ticks1 s in
1751        let new_sp =
1752          Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1753            (Nat.S Nat.O)))))))) (Status.get_8051_sfr cm s0 Status.SFR_SP)
1754            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1755              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
1756        in
1757        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
1758        Status.write_at_stack_pointer cm s1
1759          (Status.get_arg_8 cm s1 Bool.False
1760            (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1761              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1762              Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct, Vector.VEmpty))
1763              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1764              (Nat.S (Nat.S Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
1765              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1766              ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1767              (Nat.S (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1768              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1769              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1770              ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1771              ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1772              ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
1773              (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
1774              (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1775              addr)))
1776    | ASM.POP addr ->
1777      (fun _ ->
1778        let s0 = add_ticks1 s in
1779        let contents = Status.read_at_stack_pointer cm s0 in
1780        let { Types.fst = new_sp; Types.snd = flags } =
1781          Arithmetic.sub_8_with_carry
1782            (Status.get_8051_sfr cm s0 Status.SFR_SP)
1783            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1784              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
1785        in
1786        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
1787        Status.set_arg_8 cm s1
1788          (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1789            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
1790            (Nat.O, ASM.Direct, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
1791            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
1792            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
1793            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1794            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1795            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
1796            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1797            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr) contents)
1798    | ASM.XCH (addr1, addr2) ->
1799      (fun _ ->
1800        let s0 = add_ticks1 s in
1801        let old_addr =
1802          Status.get_arg_8 cm s0 Bool.False
1803            (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
1804              Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1805              (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1806              ASM.Registr, (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
1807              (Vector.VCons (Nat.O, ASM.Indirect, Vector.VEmpty))))))
1808              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1809              (Nat.S (Nat.S Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
1810              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
1811              ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1812              (Nat.S (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1813              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1814              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1815              ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1816              ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1817              ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
1818              (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
1819              (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
1820              addr2)
1821        in
1822        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
1823        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A old_addr in
1824        Status.set_arg_8 cm s1
1825          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
1826            Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
1827            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons
1828            ((Nat.S Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
1829            Vector.VEmpty)))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1830            (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S
1831            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
1832            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1833            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1834            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
1835            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1836            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr2) old_acc)
1837    | ASM.XCHD (addr1, addr2) ->
1838      (fun _ ->
1839        let s0 = add_ticks1 s in
1840        let { Types.fst = acc_nu; Types.snd = acc_nl } =
1841          Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1842            (Nat.S (Nat.S Nat.O))))
1843            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
1844        in
1845        let { Types.fst = arg_nu; Types.snd = arg_nl } =
1846          Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1847            (Nat.S (Nat.S Nat.O))))
1848            (Status.get_arg_8 cm s0 Bool.False
1849              (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1850                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1851                Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Indirect,
1852                Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1853                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
1854                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1855                (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
1856                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1857                Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1858                (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons
1859                ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
1860                (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
1861                ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
1862                ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1863                ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1864                (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1865                Vector.VEmpty)))))))))))))))))))) addr2))
1866        in
1867        let new_acc =
1868          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1869            (Nat.S (Nat.S Nat.O)))) acc_nu arg_nl
1870        in
1871        let new_arg =
1872          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
1873            (Nat.S (Nat.S Nat.O)))) arg_nu acc_nl
1874        in
1875        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc in
1876        Status.set_arg_8 cm s1
1877          (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1878            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
1879            (Nat.O, ASM.Indirect, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
1880            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
1881            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
1882            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
1883            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
1884            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
1885            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
1886            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr2) new_arg)
1887    | ASM.RET ->
1888      (fun _ ->
1889        let s0 = add_ticks1 s in
1890        let high_bits = Status.read_at_stack_pointer cm s0 in
1891        let { Types.fst = new_sp; Types.snd = flags } =
1892          Arithmetic.sub_8_with_carry
1893            (Status.get_8051_sfr cm s0 Status.SFR_SP)
1894            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1895              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
1896        in
1897        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
1898        let low_bits = Status.read_at_stack_pointer cm s1 in
1899        let { Types.fst = new_sp0; Types.snd = flags0 } =
1900          Arithmetic.sub_8_with_carry
1901            (Status.get_8051_sfr cm s1 Status.SFR_SP)
1902            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1903              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
1904        in
1905        let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp0 in
1906        let new_pc =
1907          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1908            (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1909            (Nat.S (Nat.S Nat.O)))))))) high_bits low_bits
1910        in
1911        Status.set_program_counter cm s2 new_pc)
1912    | ASM.RETI ->
1913      (fun _ ->
1914        let s0 = add_ticks1 s in
1915        let high_bits = Status.read_at_stack_pointer cm s0 in
1916        let { Types.fst = new_sp; Types.snd = flags } =
1917          Arithmetic.sub_8_with_carry
1918            (Status.get_8051_sfr cm s0 Status.SFR_SP)
1919            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1920              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
1921        in
1922        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
1923        let low_bits = Status.read_at_stack_pointer cm s1 in
1924        let { Types.fst = new_sp0; Types.snd = flags0 } =
1925          Arithmetic.sub_8_with_carry
1926            (Status.get_8051_sfr cm s1 Status.SFR_SP)
1927            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1928              (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
1929        in
1930        let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp0 in
1931        let new_pc =
1932          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1933            (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1934            (Nat.S (Nat.S Nat.O)))))))) high_bits low_bits
1935        in
1936        Status.set_program_counter cm s2 new_pc)
1937    | ASM.NOP -> (fun _ -> let s0 = add_ticks1 s in s0)
1938    | ASM.JMP acc_dptr ->
1939      (fun _ ->
1940        let s0 = add_ticks1 s in
1941        let jmp_addr =
1942          Status.get_arg_16 cm s0
1943            (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
1944              Nat.O) (Vector.VCons (Nat.O, ASM.Acc_dptr, Vector.VEmpty))
1945              (Vector.VCons ((Nat.S Nat.O), ASM.Data16, (Vector.VCons (Nat.O,
1946              ASM.Acc_dptr, Vector.VEmpty)))) acc_dptr)
1947        in
1948        Status.set_program_counter cm s0 jmp_addr)) __
1949
1950 (** val execute_1_preinstruction_ok' :
1951     (Nat.nat, Nat.nat) Types.prod -> 'a2 -> ('a1 -> 'a2 Status.preStatus ->
1952     BitVector.word) -> 'a1 ASM.preinstruction -> 'a2 Status.preStatus -> 'a2
1953     Status.preStatus Types.sig0 **)
1954 let execute_1_preinstruction_ok' ticks cm addr_of instr s =
1955   let add_ticks1 = fun s0 ->
1956     Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
1957   in
1958   let add_ticks2 = fun s0 ->
1959     Status.set_clock cm s0 (Nat.plus ticks.Types.snd s0.Status.clock)
1960   in
1961   (match instr with
1962    | ASM.ADD (addr1, addr2) ->
1963      (fun _ ->
1964        let s0 = add_ticks1 s in
1965        (let { Types.fst = result; Types.snd = flags } =
1966           Arithmetic.add_8_with_carry
1967             (Status.get_arg_8 cm s0 Bool.False
1968               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
1969                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1970                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
1971                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1972                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1973                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1974                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1975                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1976                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1977                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1978                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
1979                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
1980                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
1981                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
1982                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
1983                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
1984                 Vector.VEmpty)))))))))))))))))))) addr1))
1985             (Status.get_arg_8 cm s0 Bool.False
1986               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
1987                 (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1988                 (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
1989                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
1990                 ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
1991                 Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
1992                 Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
1993                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
1994                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1995                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
1996                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
1997                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
1998                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
1999                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2000                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2001                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2002                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2003                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2004                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2005                 Vector.VEmpty)))))))))))))))))))) addr2)) Bool.False
2006         in
2007        (fun _ ->
2008        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
2009        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
2010        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
2011        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
2012        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)) __)
2013    | ASM.ADDC (addr1, addr2) ->
2014      (fun _ ->
2015        let s0 = add_ticks1 s in
2016        let old_cy_flag = Status.get_cy_flag cm s0 in
2017        (let { Types.fst = result; Types.snd = flags } =
2018           Arithmetic.add_8_with_carry
2019             (Status.get_arg_8 cm s0 Bool.False
2020               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2021                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2022                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
2023                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2024                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2025                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2026                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2027                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2028                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2029                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2030                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2031                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2032                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2033                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2034                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2035                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2036                 Vector.VEmpty)))))))))))))))))))) addr1))
2037             (Status.get_arg_8 cm s0 Bool.False
2038               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2039                 (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2040                 (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
2041                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
2042                 ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
2043                 Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
2044                 Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2045                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2046                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2047                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2048                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2049                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2050                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2051                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2052                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2053                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2054                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2055                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2056                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2057                 Vector.VEmpty)))))))))))))))))))) addr2)) old_cy_flag
2058         in
2059        (fun _ ->
2060        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
2061        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
2062        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
2063        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
2064        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)) __)
2065    | ASM.SUBB (addr1, addr2) ->
2066      (fun _ ->
2067        let s0 = add_ticks1 s in
2068        let old_cy_flag = Status.get_cy_flag cm s0 in
2069        (let { Types.fst = result; Types.snd = flags } =
2070           Arithmetic.sub_8_with_carry
2071             (Status.get_arg_8 cm s0 Bool.False
2072               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2073                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2074                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
2075                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2076                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2077                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2078                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2079                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2080                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2081                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2082                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2083                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2084                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2085                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2086                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2087                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2088                 Vector.VEmpty)))))))))))))))))))) addr1))
2089             (Status.get_arg_8 cm s0 Bool.False
2090               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2091                 (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2092                 (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
2093                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
2094                 ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons ((Nat.S
2095                 Nat.O), ASM.Indirect, (Vector.VCons (Nat.O, ASM.Data,
2096                 Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2097                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2098                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2099                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2100                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2101                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2102                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2103                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2104                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2105                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2106                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2107                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2108                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2109                 Vector.VEmpty)))))))))))))))))))) addr2)) old_cy_flag
2110         in
2111        (fun _ ->
2112        let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags in
2113        let ac_flag = Vector.get_index' (Nat.S Nat.O) (Nat.S Nat.O) flags in
2114        let ov_flag = Vector.get_index' (Nat.S (Nat.S Nat.O)) Nat.O flags in
2115        let s1 = Status.set_arg_8 cm s0 ASM.ACC_A result in
2116        Status.set_flags cm s1 cy_flag (Types.Some ac_flag) ov_flag)) __)
2117    | ASM.INC addr ->
2118      (fun _ ->
2119        (match ASM.subaddressing_modeel (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))
2120                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2121                 ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2122                 ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2123                 ASM.Direct, (Vector.VCons ((Nat.S Nat.O), ASM.Indirect,
2124                 (Vector.VCons (Nat.O, ASM.Dptr, Vector.VEmpty)))))))))) addr with
2125         | ASM.DIRECT d ->
2126           (fun _ _ ->
2127             let s' = add_ticks1 s in
2128             let result =
2129               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2130                 (Nat.S Nat.O))))))))
2131                 (Status.get_arg_8 cm s' Bool.True (ASM.DIRECT d))
2132                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2133                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
2134             in
2135             Status.set_arg_8 cm s' (ASM.DIRECT d) result)
2136         | ASM.INDIRECT i ->
2137           (fun _ _ ->
2138             let s' = add_ticks1 s in
2139             let result =
2140               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2141                 (Nat.S Nat.O))))))))
2142                 (Status.get_arg_8 cm s' Bool.True (ASM.INDIRECT i))
2143                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2144                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
2145             in
2146             Status.set_arg_8 cm s' (ASM.INDIRECT i) result)
2147         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
2148         | ASM.REGISTER r ->
2149           (fun _ _ ->
2150             let s' = add_ticks1 s in
2151             let result =
2152               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2153                 (Nat.S Nat.O))))))))
2154                 (Status.get_arg_8 cm s' Bool.True (ASM.REGISTER r))
2155                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2156                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
2157             in
2158             Status.set_arg_8 cm s' (ASM.REGISTER r) result)
2159         | ASM.ACC_A ->
2160           (fun _ _ ->
2161             let s' = add_ticks1 s in
2162             let result =
2163               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2164                 (Nat.S Nat.O))))))))
2165                 (Status.get_arg_8 cm s' Bool.True ASM.ACC_A)
2166                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2167                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
2168             in
2169             Status.set_arg_8 cm s' ASM.ACC_A result)
2170         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
2171         | ASM.DPTR ->
2172           (fun _ _ ->
2173             let s' = add_ticks1 s in
2174             (let { Types.fst = carry; Types.snd = bl } =
2175                Arithmetic.half_add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2176                  (Nat.S (Nat.S Nat.O))))))))
2177                  (Status.get_8051_sfr cm s' Status.SFR_DPL)
2178                  (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2179                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
2180              in
2181             (fun _ ->
2182             (let { Types.fst = carry0; Types.snd = bu } =
2183                Arithmetic.full_add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2184                  (Nat.S (Nat.S Nat.O))))))))
2185                  (Status.get_8051_sfr cm s' Status.SFR_DPH)
2186                  (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2187                    (Nat.S (Nat.S Nat.O))))))))) carry
2188              in
2189             (fun _ ->
2190             let s1 = Status.set_8051_sfr cm s' Status.SFR_DPL bl in
2191             Status.set_8051_sfr cm s1 Status.SFR_DPH bu)) __)) __)
2192         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
2193         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
2194         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
2195         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
2196         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
2197         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
2198         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
2199         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
2200         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
2201         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
2202         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
2203         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __ __)
2204    | ASM.DEC addr ->
2205      (fun _ ->
2206        let s0 = add_ticks1 s in
2207        (let { Types.fst = result; Types.snd = flags } =
2208           Arithmetic.sub_8_with_carry
2209             (Status.get_arg_8 cm s0 Bool.True
2210               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2211                 (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2212                 (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
2213                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons
2214                 ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons ((Nat.S
2215                 Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
2216                 Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2217                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2218                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2219                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2220                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2221                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2222                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2223                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2224                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2225                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2226                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2227                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2228                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2229                 Vector.VEmpty)))))))))))))))))))) addr))
2230             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2231               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
2232         in
2233        (fun _ ->
2234        Status.set_arg_8 cm s0
2235          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
2236            (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2237            Nat.O)))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2238            ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Registr,
2239            (Vector.VCons ((Nat.S Nat.O), ASM.Direct, (Vector.VCons (Nat.O,
2240            ASM.Indirect, Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S
2241            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
2242            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
2243            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
2244            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
2245            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
2246            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
2247            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr) result))
2248          __)
2249    | ASM.MUL (addr1, addr2) ->
2250      (fun _ ->
2251        let s0 = add_ticks1 s in
2252        let acc_a_nat =
2253          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2254            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2255            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
2256        in
2257        let acc_b_nat =
2258          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2259            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2260            (Status.get_8051_sfr cm s0 Status.SFR_ACC_B)
2261        in
2262        let product = Nat.times acc_a_nat acc_b_nat in
2263        let low =
2264          Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2265            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2266            (Util.modulus product (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2267              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2268              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2269              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2270              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2271              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2272              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2273              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2274              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2275              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2276              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2277              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2278              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2279              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2280              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2281              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2282              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2283              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2284              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2285              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2286              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2287              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2288              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2289              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2290              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2291              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2292              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2293              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2294              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2295              Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
2296        in
2297        let high =
2298          Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2299            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2300            (Util.division product (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2301              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2302              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2303              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2304              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2305              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2306              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2307              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2308              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2309              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2310              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2311              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2312              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2313              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2314              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2315              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2316              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2317              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2318              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2319              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2320              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2321              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2322              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2323              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2324              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2325              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2326              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2327              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2328              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2329              Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
2330        in
2331        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A low in
2332        Status.set_8051_sfr cm s1 Status.SFR_ACC_B high)
2333    | ASM.DIV (addr1, addr2) ->
2334      (fun _ ->
2335        let s0 = add_ticks1 s in
2336        let acc_a_nat =
2337          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2338            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2339            (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
2340        in
2341        let acc_b_nat =
2342          Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2343            (Nat.S (Nat.S (Nat.S Nat.O))))))))
2344            (Status.get_8051_sfr cm s0 Status.SFR_ACC_B)
2345        in
2346        (match acc_b_nat with
2347         | Nat.O ->
2348           (fun _ -> Status.set_flags cm s0 Bool.False Types.None Bool.True)
2349         | Nat.S o ->
2350           (fun _ ->
2351             let q =
2352               Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2353                 (Nat.S (Nat.S (Nat.S Nat.O))))))))
2354                 (Util.division acc_a_nat (Nat.S o))
2355             in
2356             let r =
2357               Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2358                 (Nat.S (Nat.S (Nat.S Nat.O))))))))
2359                 (Util.modulus acc_a_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2360                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2361                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2362                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2363                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2364                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2365                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2366                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2367                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2368                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2369                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2370                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2371                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2372                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2373                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2374                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2375                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2376                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2377                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2378                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2379                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2380                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2381                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2382                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2383                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2384                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2385                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2386                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2387                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2388                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2389                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2390                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2391                   (Nat.S (Nat.S (Nat.S
2392                   Nat.O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
2393             in
2394             let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A q in
2395             let s2 = Status.set_8051_sfr cm s1 Status.SFR_ACC_B r in
2396             Status.set_flags cm s2 Bool.False Types.None Bool.False)) __)
2397    | ASM.DA addr ->
2398      (fun _ ->
2399        let s0 = add_ticks1 s in
2400        (let { Types.fst = acc_nu; Types.snd = acc_nl } =
2401           Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
2402             (Nat.S (Nat.S Nat.O))))
2403             (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
2404         in
2405        (fun _ ->
2406        (match Bool.orb
2407                 (Util.gtb
2408                   (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S
2409                     Nat.O)))) acc_nl) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2410                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))))
2411                 (Status.get_ac_flag cm s0) with
2412         | Bool.True ->
2413           (fun _ ->
2414             (let { Types.fst = result; Types.snd = flags } =
2415                Arithmetic.add_8_with_carry
2416                  (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
2417                  (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2418                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S (Nat.S
2419                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))) Bool.False
2420              in
2421             (fun _ ->
2422             let cy_flag = Vector.get_index' Nat.O (Nat.S (Nat.S Nat.O)) flags
2423             in
2424             (let { Types.fst = acc_nu'; Types.snd = acc_nl' } =
2425                Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S
2426                  (Nat.S (Nat.S (Nat.S Nat.O)))) result
2427              in
2428             (fun _ ->
2429             (match Bool.orb
2430                      (Util.gtb
2431                        (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S
2432                          (Nat.S Nat.O)))) acc_nu') (Nat.S (Nat.S (Nat.S
2433                        (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2434                        Nat.O)))))))))) cy_flag with
2435              | Bool.True ->
2436                (fun _ ->
2437                  let nu =
2438                    Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))
2439                      acc_nu'
2440                      (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
2441                        Nat.O)))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2442                        Nat.O)))))))
2443                  in
2444                  let new_acc =
2445                    Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S
2446                      (Nat.S (Nat.S (Nat.S Nat.O)))) nu acc_nl'
2447                  in
2448                  let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc
2449                  in
2450                  Status.set_flags cm s1 cy_flag (Types.Some
2451                    (Status.get_ac_flag cm s1)) (Status.get_ov_flag cm s1))
2452              | Bool.False -> (fun _ -> s0)) __)) __)) __)
2453         | Bool.False -> (fun _ -> s0)) __)) __)
2454    | ASM.JC addr ->
2455      (fun _ ->
2456        (match Status.get_cy_flag cm s with
2457         | Bool.True ->
2458           (fun _ ->
2459             let s1 = add_ticks1 s in
2460             Status.set_program_counter cm s1 (addr_of addr s1))
2461         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2462    | ASM.JNC addr ->
2463      (fun _ ->
2464        (match Bool.notb (Status.get_cy_flag cm s) with
2465         | Bool.True ->
2466           (fun _ ->
2467             let s1 = add_ticks1 s in
2468             Status.set_program_counter cm s1 (addr_of addr s1))
2469         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2470    | ASM.JB (addr1, addr2) ->
2471      (fun _ ->
2472        (match Status.get_arg_1 cm s
2473                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2474                   (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
2475                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2476                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
2477                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr1)
2478                 Bool.False with
2479         | Bool.True ->
2480           (fun _ ->
2481             let s1 = add_ticks1 s in
2482             Status.set_program_counter cm s1 (addr_of addr2 s1))
2483         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2484    | ASM.JNB (addr1, addr2) ->
2485      (fun _ ->
2486        (match Bool.notb
2487                 (Status.get_arg_1 cm s
2488                   (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2489                     (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
2490                     Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2491                     ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O),
2492                     ASM.N_bit_addr, (Vector.VCons (Nat.O, ASM.Carry,
2493                     Vector.VEmpty)))))) addr1) Bool.False) with
2494         | Bool.True ->
2495           (fun _ ->
2496             let s1 = add_ticks1 s in
2497             Status.set_program_counter cm s1 (addr_of addr2 s1))
2498         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2499    | ASM.JBC (addr1, addr2) ->
2500      (fun _ ->
2501        let s0 =
2502          Status.set_arg_1 cm s
2503            (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
2504              Nat.O) (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))
2505              (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons
2506              (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1) Bool.False
2507        in
2508        (match Status.get_arg_1 cm s0
2509                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2510                   (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
2511                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2512                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
2513                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr1)
2514                 Bool.False with
2515         | Bool.True ->
2516           (fun _ ->
2517             let s1 = add_ticks1 s0 in
2518             Status.set_program_counter cm s1 (addr_of addr2 s1))
2519         | Bool.False -> (fun _ -> let s1 = add_ticks2 s0 in s1)) __)
2520    | ASM.JZ addr ->
2521      (fun _ ->
2522        (match BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2523                 (Nat.S (Nat.S Nat.O))))))))
2524                 (Status.get_8051_sfr cm s Status.SFR_ACC_A)
2525                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2526                   (Nat.S (Nat.S Nat.O))))))))) with
2527         | Bool.True ->
2528           (fun _ ->
2529             let s1 = add_ticks1 s in
2530             Status.set_program_counter cm s1 (addr_of addr s1))
2531         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2532    | ASM.JNZ addr ->
2533      (fun _ ->
2534        (match Bool.notb
2535                 (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2536                   (Nat.S (Nat.S Nat.O))))))))
2537                   (Status.get_8051_sfr cm s Status.SFR_ACC_A)
2538                   (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2539                     (Nat.S (Nat.S Nat.O)))))))))) with
2540         | Bool.True ->
2541           (fun _ ->
2542             let s1 = add_ticks1 s in
2543             Status.set_program_counter cm s1 (addr_of addr s1))
2544         | Bool.False -> (fun _ -> let s1 = add_ticks2 s in s1)) __)
2545    | ASM.CJNE (addr1, addr2) ->
2546      (fun _ ->
2547        match addr1 with
2548        | Types.Inl l ->
2549          let { Types.fst = addr10; Types.snd = addr2' } = l in
2550          let new_cy =
2551            Util.ltb
2552              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2553                (Nat.S (Nat.S (Nat.S Nat.O))))))))
2554                (Status.get_arg_8 cm s Bool.False
2555                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2556                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2557                    (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
2558                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2559                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2560                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2561                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2562                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2563                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2564                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2565                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2566                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2567                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
2568                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
2569                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2570                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
2571                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2572                    addr10)))
2573              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2574                (Nat.S (Nat.S (Nat.S Nat.O))))))))
2575                (Status.get_arg_8 cm s Bool.False
2576                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2577                    Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2578                    (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
2579                    ASM.Direct, (Vector.VCons (Nat.O, ASM.Data,
2580                    Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2581                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2582                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2583                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2584                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2585                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2586                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2587                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2588                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2589                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
2590                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
2591                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2592                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
2593                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2594                    addr2')))
2595          in
2596          (match Bool.notb
2597                   (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2598                     (Nat.S (Nat.S Nat.O))))))))
2599                     (Status.get_arg_8 cm s Bool.False
2600                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
2601                         Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2602                         (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
2603                         (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons
2604                         ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2605                         (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
2606                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2607                         (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2608                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2609                         (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2610                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2611                         (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
2612                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2613                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2614                         ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2615                         Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
2616                         Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2617                         ASM.Ext_indirect, (Vector.VCons (Nat.O,
2618                         ASM.Ext_indirect_dptr,
2619                         Vector.VEmpty)))))))))))))))))))) addr10))
2620                     (Status.get_arg_8 cm s Bool.False
2621                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
2622                         (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2623                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
2624                         (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
2625                         (Vector.VCons (Nat.O, ASM.Data, Vector.VEmpty))))
2626                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2627                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2628                         ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2629                         (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2630                         ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2631                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
2632                         ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2633                         (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2634                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2635                         Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
2636                         (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
2637                         ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr,
2638                         (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
2639                         (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2640                         (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2641                         Vector.VEmpty)))))))))))))))))))) addr2'))) with
2642           | Bool.True ->
2643             let s0 = add_ticks1 s in
2644             let s1 = Status.set_program_counter cm s0 (addr_of addr2 s0) in
2645             Status.set_flags cm s1 new_cy Types.None
2646               (Status.get_ov_flag cm s1)
2647           | Bool.False ->
2648             let s0 = add_ticks2 s in
2649             Status.set_flags cm s0 new_cy Types.None
2650               (Status.get_ov_flag cm s0))
2651        | Types.Inr r' ->
2652          let { Types.fst = addr10; Types.snd = addr2' } = r' in
2653          let new_cy =
2654            Util.ltb
2655              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2656                (Nat.S (Nat.S (Nat.S Nat.O))))))))
2657                (Status.get_arg_8 cm s Bool.False
2658                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2659                    Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2660                    (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
2661                    ASM.Registr, (Vector.VCons (Nat.O, ASM.Indirect,
2662                    Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2663                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2664                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2665                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2666                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2667                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2668                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2669                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2670                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2671                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
2672                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
2673                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2674                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
2675                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2676                    addr10)))
2677              (Arithmetic.nat_of_bitvector (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2678                (Nat.S (Nat.S (Nat.S Nat.O))))))))
2679                (Status.get_arg_8 cm s Bool.False
2680                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2681                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2682                    (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Data,
2683                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2684                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2685                    ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2686                    (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2687                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2688                    (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2689                    (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2690                    (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2691                    Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2692                    (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
2693                    (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
2694                    (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2695                    ASM.Ext_indirect, (Vector.VCons (Nat.O,
2696                    ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2697                    addr2')))
2698          in
2699          (match Bool.notb
2700                   (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2701                     (Nat.S (Nat.S Nat.O))))))))
2702                     (Status.get_arg_8 cm s Bool.False
2703                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
2704                         (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2705                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
2706                         (Vector.VCons ((Nat.S Nat.O), ASM.Registr,
2707                         (Vector.VCons (Nat.O, ASM.Indirect, Vector.VEmpty))))
2708                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2709                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2710                         ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2711                         (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2712                         ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2713                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
2714                         ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2715                         (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2716                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2717                         Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
2718                         (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
2719                         ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr,
2720                         (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
2721                         (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2722                         (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2723                         Vector.VEmpty)))))))))))))))))))) addr10))
2724                     (Status.get_arg_8 cm s Bool.False
2725                       (ASM.subaddressing_modeel__o__mk_subaddressing_mode
2726                         Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2727                         (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
2728                         (Nat.O, ASM.Data, Vector.VEmpty)) (Vector.VCons
2729                         ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2730                         (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
2731                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2732                         (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2733                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2734                         (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2735                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2736                         (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
2737                         (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2738                         (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2739                         ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2740                         Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
2741                         Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2742                         ASM.Ext_indirect, (Vector.VCons (Nat.O,
2743                         ASM.Ext_indirect_dptr,
2744                         Vector.VEmpty)))))))))))))))))))) addr2'))) with
2745           | Bool.True ->
2746             let s0 = add_ticks1 s in
2747             let s1 = Status.set_program_counter cm s0 (addr_of addr2 s0) in
2748             Status.set_flags cm s1 new_cy Types.None
2749               (Status.get_ov_flag cm s1)
2750           | Bool.False ->
2751             let s0 = add_ticks2 s in
2752             Status.set_flags cm s0 new_cy Types.None
2753               (Status.get_ov_flag cm s0)))
2754    | ASM.DJNZ (addr1, addr2) ->
2755      (fun _ ->
2756        (let { Types.fst = result; Types.snd = flags } =
2757           Arithmetic.sub_8_with_carry
2758             (Status.get_arg_8 cm s Bool.True
2759               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2760                 Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2761                 (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
2762                 ASM.Registr, (Vector.VCons (Nat.O, ASM.Direct,
2763                 Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2764                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
2765                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2766                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
2767                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2768                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
2769                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2770                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2771                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2772                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2773                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2774                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2775                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2776                 Vector.VEmpty)))))))))))))))))))) addr1))
2777             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2778               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
2779         in
2780        (fun _ ->
2781        let s1 =
2782          Status.set_arg_8 cm s
2783            (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
2784              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
2785              (Vector.VCons ((Nat.S Nat.O), ASM.Registr, (Vector.VCons (Nat.O,
2786              ASM.Direct, Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S
2787              (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
2788              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
2789              ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2790              Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2791              Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2792              ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2793              (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2794              Vector.VEmpty)))))))))))))) addr1) result
2795        in
2796        (match Bool.notb
2797                 (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2798                   (Nat.S (Nat.S Nat.O)))))))) result
2799                   (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2800                     (Nat.S (Nat.S Nat.O)))))))))) with
2801         | Bool.True ->
2802           (fun _ ->
2803             let s2 = add_ticks1 s1 in
2804             Status.set_program_counter cm s2 (addr_of addr2 s2))
2805         | Bool.False -> (fun _ -> let s2 = add_ticks2 s1 in s2)) __)) __)
2806    | ASM.ANL addr ->
2807      (fun _ ->
2808        let s0 = add_ticks1 s in
2809        (match addr with
2810         | Types.Inl l ->
2811           (match l with
2812            | Types.Inl l' ->
2813              let { Types.fst = addr1; Types.snd = addr2 } = l' in
2814              let and_val =
2815                BitVector.conjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2816                  (Nat.S (Nat.S (Nat.S Nat.O))))))))
2817                  (Status.get_arg_8 cm s0 Bool.True
2818                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2819                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2820                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
2821                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2822                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2823                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
2824                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2825                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2826                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2827                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2828                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
2829                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2830                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2831                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2832                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2833                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2834                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
2835                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2836                      addr1))
2837                  (Status.get_arg_8 cm s0 Bool.True
2838                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2839                      (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S
2840                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
2841                      (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2842                      ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2843                      ASM.Direct, (Vector.VCons ((Nat.S Nat.O), ASM.Indirect,
2844                      (Vector.VCons (Nat.O, ASM.Data, Vector.VEmpty))))))))
2845                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2846                      (Nat.S (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
2847                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2848                      (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect, (Vector.VCons
2849                      ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2850                      Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
2851                      (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
2852                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2853                      Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S
2854                      (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S
2855                      (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
2856                      ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons
2857                      ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
2858                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2859                      addr2))
2860              in
2861              Status.set_arg_8 cm s0
2862                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2863                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
2864                  (Vector.VCons (Nat.O, ASM.Acc_a, Vector.VEmpty))
2865                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2866                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2867                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
2868                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
2869                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
2870                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
2871                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2872                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2873                  Vector.VEmpty)))))))))))))) addr1) and_val
2874            | Types.Inr r ->
2875              let { Types.fst = addr1; Types.snd = addr2 } = r in
2876              let and_val =
2877                BitVector.conjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2878                  (Nat.S (Nat.S (Nat.S Nat.O))))))))
2879                  (Status.get_arg_8 cm s0 Bool.True
2880                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2881                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2882                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
2883                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2884                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2885                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
2886                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2887                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2888                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2889                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2890                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
2891                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2892                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2893                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2894                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2895                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2896                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
2897                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2898                      addr1))
2899                  (Status.get_arg_8 cm s0 Bool.True
2900                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2901                      Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2902                      (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S
2903                      Nat.O), ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
2904                      Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2905                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2906                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
2907                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2908                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2909                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2910                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2911                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
2912                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2913                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2914                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2915                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2916                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2917                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
2918                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2919                      addr2))
2920              in
2921              Status.set_arg_8 cm s0
2922                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2923                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
2924                  (Vector.VCons (Nat.O, ASM.Direct, Vector.VEmpty))
2925                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2926                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
2927                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
2928                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
2929                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
2930                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
2931                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
2932                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
2933                  Vector.VEmpty)))))))))))))) addr1) and_val)
2934         | Types.Inr r ->
2935           let { Types.fst = addr1; Types.snd = addr2 } = r in
2936           let and_val =
2937             Bool.andb (Status.get_cy_flag cm s0)
2938               (Status.get_arg_1 cm s0
2939                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2940                   Nat.O) (Nat.S (Nat.S Nat.O)) (Vector.VCons ((Nat.S Nat.O),
2941                   ASM.Bit_addr, (Vector.VCons (Nat.O, ASM.N_bit_addr,
2942                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2943                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
2944                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
2945                 Bool.True)
2946           in
2947           Status.set_flags cm s0 and_val Types.None
2948             (Status.get_ov_flag cm s0)))
2949    | ASM.ORL addr ->
2950      (fun _ ->
2951        let s0 = add_ticks1 s in
2952        (match addr with
2953         | Types.Inl l ->
2954           (match l with
2955            | Types.Inl l' ->
2956              let { Types.fst = addr1; Types.snd = addr2 } = l' in
2957              let or_val =
2958                BitVector.inclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
2959                  (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
2960                  (Status.get_arg_8 cm s0 Bool.True
2961                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
2962                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2963                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
2964                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
2965                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2966                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
2967                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2968                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2969                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2970                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2971                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
2972                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2973                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2974                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2975                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2976                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
2977                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
2978                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
2979                      addr1))
2980                  (Status.get_arg_8 cm s0 Bool.True
2981                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
2982                      (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S
2983                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
2984                      (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2985                      ASM.Registr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
2986                      ASM.Data, (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
2987                      (Vector.VCons (Nat.O, ASM.Indirect,
2988                      Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S
2989                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2990                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
2991                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
2992                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
2993                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
2994                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
2995                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
2996                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
2997                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
2998                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
2999                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3000                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3001                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
3002                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3003                      addr2))
3004              in
3005              Status.set_arg_8 cm s0
3006                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3007                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
3008                  (Vector.VCons (Nat.O, ASM.Acc_a, Vector.VEmpty))
3009                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3010                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3011                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
3012                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3013                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3014                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
3015                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3016                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3017                  Vector.VEmpty)))))))))))))) addr1) or_val
3018            | Types.Inr r ->
3019              let { Types.fst = addr1; Types.snd = addr2 } = r in
3020              let or_val =
3021                BitVector.inclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
3022                  (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
3023                  (Status.get_arg_8 cm s0 Bool.True
3024                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3025                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3026                      (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
3027                      Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3028                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3029                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
3030                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
3031                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3032                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
3033                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3034                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
3035                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
3036                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
3037                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
3038                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3039                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3040                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
3041                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3042                      addr1))
3043                  (Status.get_arg_8 cm s0 Bool.True
3044                    (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
3045                      Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3046                      (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S
3047                      Nat.O), ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
3048                      Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3049                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3050                      Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S
3051                      (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
3052                      ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3053                      (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
3054                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3055                      Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
3056                      (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
3057                      (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
3058                      ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
3059                      ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3060                      ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3061                      ASM.Ext_indirect, (Vector.VCons (Nat.O,
3062                      ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3063                      addr2))
3064              in
3065              Status.set_arg_8 cm s0
3066                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3067                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
3068                  (Vector.VCons (Nat.O, ASM.Direct, Vector.VEmpty))
3069                  (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3070                  Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3071                  (Nat.S (Nat.S Nat.O))))), ASM.Indirect, (Vector.VCons
3072                  ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3073                  (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3074                  (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
3075                  (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3076                  (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3077                  Vector.VEmpty)))))))))))))) addr1) or_val)
3078         | Types.Inr r ->
3079           let { Types.fst = addr1; Types.snd = addr2 } = r in
3080           let or_val =
3081             Bool.orb (Status.get_cy_flag cm s0)
3082               (Status.get_arg_1 cm s0
3083                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
3084                   Nat.O) (Nat.S (Nat.S Nat.O)) (Vector.VCons ((Nat.S Nat.O),
3085                   ASM.Bit_addr, (Vector.VCons (Nat.O, ASM.N_bit_addr,
3086                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3087                   ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
3088                   (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
3089                 Bool.True)
3090           in
3091           Status.set_flags cm s0 or_val Types.None (Status.get_ov_flag cm s0)))
3092    | ASM.XRL addr ->
3093      (fun _ ->
3094        let s0 = add_ticks1 s in
3095        (match addr with
3096         | Types.Inl l' ->
3097           let { Types.fst = addr1; Types.snd = addr2 } = l' in
3098           let xor_val =
3099             BitVector.exclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
3100               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
3101               (Status.get_arg_8 cm s0 Bool.True
3102                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3103                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3104                   (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
3105                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3106                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3107                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3108                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3109                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3110                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3111                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3112                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3113                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3114                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3115                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
3116                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3117                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
3118                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3119                   addr1))
3120               (Status.get_arg_8 cm s0 Bool.True
3121                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
3122                   (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3123                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons
3124                   ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Data, (Vector.VCons
3125                   ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons ((Nat.S
3126                   Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
3127                   Vector.VEmpty)))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3128                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3129                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3130                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3131                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3132                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3133                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3134                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3135                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3136                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3137                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
3138                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3139                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
3140                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3141                   addr2))
3142           in
3143           Status.set_arg_8 cm s0
3144             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3145               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
3146               (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
3147               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
3148               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3149               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3150               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3151               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3152               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3153               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3154               Vector.VEmpty)))))))))))))) addr1) xor_val
3155         | Types.Inr r ->
3156           let { Types.fst = addr1; Types.snd = addr2 } = r in
3157           let xor_val =
3158             BitVector.exclusive_disjunction_bv (Nat.S (Nat.S (Nat.S (Nat.S
3159               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))
3160               (Status.get_arg_8 cm s0 Bool.True
3161                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3162                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3163                   (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Direct,
3164                   Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3165                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3166                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3167                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3168                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3169                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3170                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3171                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3172                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3173                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3174                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
3175                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3176                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
3177                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3178                   addr1))
3179               (Status.get_arg_8 cm s0 Bool.True
3180                 (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
3181                   Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3182                   (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
3183                   ASM.Acc_a, (Vector.VCons (Nat.O, ASM.Data,
3184                   Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3185                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3186                   ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3187                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3188                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3189                   (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3190                   (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3191                   (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3192                   Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3193                   (Nat.S Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3194                   (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
3195                   Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O),
3196                   ASM.Ext_indirect, (Vector.VCons (Nat.O,
3197                   ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3198                   addr2))
3199           in
3200           Status.set_arg_8 cm s0
3201             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3202               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
3203               (Nat.O, ASM.Direct, Vector.VEmpty)) (Vector.VCons ((Nat.S
3204               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
3205               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3206               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3207               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3208               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3209               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3210               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3211               Vector.VEmpty)))))))))))))) addr1) xor_val))
3212    | ASM.CLR addr ->
3213      (fun _ ->
3214        (match ASM.subaddressing_modeel (Nat.S (Nat.S Nat.O)) (Vector.VCons
3215                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_a, (Vector.VCons ((Nat.S
3216                 Nat.O), ASM.Carry, (Vector.VCons (Nat.O, ASM.Bit_addr,
3217                 Vector.VEmpty)))))) addr with
3218         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
3219         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3220         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3221         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3222         | ASM.ACC_A ->
3223           (fun _ _ ->
3224             let s0 = add_ticks1 s in
3225             Status.set_arg_8 cm s0 ASM.ACC_A
3226               (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3227                 (Nat.S (Nat.S Nat.O))))))))))
3228         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3229         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3230         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3231         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3232         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3233         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3234         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3235         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3236         | ASM.CARRY ->
3237           (fun _ _ ->
3238             let s0 = add_ticks1 s in
3239             Status.set_arg_1 cm s0 ASM.CARRY Bool.False)
3240         | ASM.BIT_ADDR b ->
3241           (fun _ _ ->
3242             let s0 = add_ticks1 s in
3243             Status.set_arg_1 cm s0 (ASM.BIT_ADDR b) Bool.False)
3244         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3245         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
3246         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
3247         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __ __)
3248    | ASM.CPL addr ->
3249      (fun _ ->
3250        (match ASM.subaddressing_modeel (Nat.S (Nat.S Nat.O)) (Vector.VCons
3251                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_a, (Vector.VCons ((Nat.S
3252                 Nat.O), ASM.Carry, (Vector.VCons (Nat.O, ASM.Bit_addr,
3253                 Vector.VEmpty)))))) addr with
3254         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
3255         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3256         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3257         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3258         | ASM.ACC_A ->
3259           (fun _ _ ->
3260             let s0 = add_ticks1 s in
3261             let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3262             let new_acc =
3263               BitVector.negation_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3264                 (Nat.S (Nat.S Nat.O)))))))) old_acc
3265             in
3266             Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
3267         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3268         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3269         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3270         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3271         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3272         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3273         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3274         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3275         | ASM.CARRY ->
3276           (fun _ _ ->
3277             let s0 = add_ticks1 s in
3278             let old_cy_flag = Status.get_arg_1 cm s0 ASM.CARRY Bool.True in
3279             let new_cy_flag = Bool.notb old_cy_flag in
3280             Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag)
3281         | ASM.BIT_ADDR b ->
3282           (fun _ _ ->
3283             let s0 = add_ticks1 s in
3284             let old_bit = Status.get_arg_1 cm s0 (ASM.BIT_ADDR b) Bool.True
3285             in
3286             let new_bit = Bool.notb old_bit in
3287             Status.set_arg_1 cm s0 (ASM.BIT_ADDR b) new_bit)
3288         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3289         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
3290         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
3291         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __ __)
3292    | ASM.RL x ->
3293      (fun _ ->
3294        let s0 = add_ticks1 s in
3295        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3296        let new_acc =
3297          Vector.rotate_left (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3298            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc
3299        in
3300        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
3301    | ASM.RLC x ->
3302      (fun _ ->
3303        let s0 = add_ticks1 s in
3304        let old_cy_flag = Status.get_cy_flag cm s0 in
3305        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3306        let new_cy_flag =
3307          Vector.get_index' Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3308            (Nat.S Nat.O))))))) old_acc
3309        in
3310        let new_acc =
3311          Vector.shift_left (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3312            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc old_cy_flag
3313        in
3314        let s1 = Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag in
3315        Status.set_8051_sfr cm s1 Status.SFR_ACC_A new_acc)
3316    | ASM.RR x ->
3317      (fun _ ->
3318        let s0 = add_ticks1 s in
3319        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3320        let new_acc =
3321          Vector.rotate_right (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3322            (Nat.S Nat.O)))))))) (Nat.S Nat.O) old_acc
3323        in
3324        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)
3325    | ASM.RRC x ->
3326      (fun _ ->
3327        let s0 = add_ticks1 s in
3328        let old_cy_flag = Status.get_cy_flag cm s0 in
3329        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3330        let new_cy_flag =
3331          Vector.get_index' (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3332            Nat.O))))))) Nat.O old_acc
3333        in
3334        let new_acc =
3335          Vector.shift_right (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3336            Nat.O))))))) (Nat.S Nat.O) old_acc old_cy_flag
3337        in
3338        let s1 = Status.set_arg_1 cm s0 ASM.CARRY new_cy_flag in
3339        Status.set_8051_sfr cm s1 Status.SFR_ACC_A new_acc)
3340    | ASM.SWAP x ->
3341      (fun _ ->
3342        let s0 = add_ticks1 s in
3343        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3344        (let { Types.fst = nu; Types.snd = nl } =
3345           Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3346             (Nat.S (Nat.S Nat.O)))) old_acc
3347         in
3348        (fun _ ->
3349        let new_acc =
3350          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3351            (Nat.S (Nat.S Nat.O)))) nl nu
3352        in
3353        Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc)) __)
3354    | ASM.MOV addr ->
3355      (fun _ ->
3356        let s0 = add_ticks1 s in
3357        (match addr with
3358         | Types.Inl l ->
3359           (match l with
3360            | Types.Inl l' ->
3361              (match l' with
3362               | Types.Inl l'' ->
3363                 (match l'' with
3364                  | Types.Inl l''' ->
3365                    (match l''' with
3366                     | Types.Inl l'''' ->
3367                       let { Types.fst = addr1; Types.snd = addr2 } = l'''' in
3368                       Status.set_arg_8 cm s0
3369                         (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3370                           Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3371                           Nat.O)))))) (Vector.VCons (Nat.O, ASM.Acc_a,
3372                           Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3373                           (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
3374                           (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3375                           Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S
3376                           (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3377                           (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
3378                           ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3379                           ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O),
3380                           ASM.Ext_indirect, (Vector.VCons (Nat.O,
3381                           ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))
3382                           addr1)
3383                         (Status.get_arg_8 cm s0 Bool.False
3384                           (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3385                             (Nat.S (Nat.S (Nat.S Nat.O))) (Nat.S (Nat.S
3386                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3387                             Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S
3388                             (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
3389                             ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons
3390                             ((Nat.S Nat.O), ASM.Indirect, (Vector.VCons
3391                             (Nat.O, ASM.Data, Vector.VEmpty))))))))
3392                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3393                             (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3394                             ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3395                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
3396                             ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3397                             (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))),
3398                             ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3399                             (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3400                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3401                             Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S
3402                             (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Data,
3403                             (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
3404                             ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S
3405                             Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
3406                             Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3407                             ASM.Ext_indirect_dptr,
3408                             Vector.VEmpty)))))))))))))))))))) addr2))
3409                     | Types.Inr r'''' ->
3410                       let { Types.fst = addr1; Types.snd = addr2 } = r'''' in
3411                       Status.set_arg_8 cm s0
3412                         (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3413                           (Nat.S Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3414                           (Nat.S Nat.O)))))) (Vector.VCons ((Nat.S Nat.O),
3415                           ASM.Registr, (Vector.VCons (Nat.O, ASM.Indirect,
3416                           Vector.VEmpty)))) (Vector.VCons ((Nat.S (Nat.S
3417                           (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
3418                           ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3419                           (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
3420                           (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3421                           Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S
3422                           (Nat.S (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons
3423                           ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
3424                           ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
3425                           (Nat.O, ASM.Ext_indirect_dptr,
3426                           Vector.VEmpty)))))))))))))) addr1)
3427                         (Status.get_arg_8 cm s0 Bool.False
3428                           (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3429                             (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S
3430                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))
3431                             (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_a,
3432                             (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
3433                             (Vector.VCons (Nat.O, ASM.Data,
3434                             Vector.VEmpty)))))) (Vector.VCons ((Nat.S (Nat.S
3435                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3436                             Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
3437                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3438                             Nat.O)))))))), ASM.Indirect, (Vector.VCons
3439                             ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3440                             Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3441                             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
3442                             ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3443                             (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
3444                             (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3445                             Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3446                             (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
3447                             ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons
3448                             ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
3449                             (Nat.O, ASM.Ext_indirect_dptr,
3450                             Vector.VEmpty)))))))))))))))))))) addr2)))
3451                  | Types.Inr r''' ->
3452                    let { Types.fst = addr1; Types.snd = addr2 } = r''' in
3453                    Status.set_arg_8 cm s0
3454                      (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3455                        Nat.O (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3456                        Nat.O)))))) (Vector.VCons (Nat.O, ASM.Direct,
3457                        Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3458                        (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
3459                        (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3460                        Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S
3461                        (Nat.S (Nat.S Nat.O)))), ASM.Registr, (Vector.VCons
3462                        ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3463                        (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
3464                        (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3465                        (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3466                        Vector.VEmpty)))))))))))))) addr1)
3467                      (Status.get_arg_8 cm s0 Bool.False
3468                        (ASM.subaddressing_modeel__o__mk_subaddressing_mode
3469                          (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3470                          (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3471                          Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S
3472                          (Nat.S Nat.O)))), ASM.Acc_a, (Vector.VCons ((Nat.S
3473                          (Nat.S (Nat.S Nat.O))), ASM.Registr, (Vector.VCons
3474                          ((Nat.S (Nat.S Nat.O)), ASM.Direct, (Vector.VCons
3475                          ((Nat.S Nat.O), ASM.Indirect, (Vector.VCons (Nat.O,
3476                          ASM.Data, Vector.VEmpty)))))))))) (Vector.VCons
3477                          ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3478                          (Nat.S (Nat.S Nat.O))))))))), ASM.Direct,
3479                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3480                          (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3481                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3482                          (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
3483                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3484                          (Nat.S Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S
3485                          (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Acc_b,
3486                          (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3487                          Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S
3488                          (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S
3489                          (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
3490                          Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3491                          ASM.Ext_indirect_dptr,
3492                          Vector.VEmpty)))))))))))))))))))) addr2)))
3493               | Types.Inr r'' ->
3494                 let { Types.fst = addr1; Types.snd = addr2 } = r'' in
3495                 Status.set_arg_16 cm s0
3496                   (Status.get_arg_16 cm s0
3497                     (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3498                       (Nat.S Nat.O) (Vector.VCons (Nat.O, ASM.Data16,
3499                       Vector.VEmpty)) (Vector.VCons ((Nat.S Nat.O),
3500                       ASM.Data16, (Vector.VCons (Nat.O, ASM.Acc_dptr,
3501                       Vector.VEmpty)))) addr2)) addr1)
3502            | Types.Inr r ->
3503              let { Types.fst = addr1; Types.snd = addr2 } = r in
3504              Status.set_arg_1 cm s0
3505                (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3506                  (Nat.S Nat.O) (Vector.VCons (Nat.O, ASM.Carry,
3507                  Vector.VEmpty)) (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr,
3508                  (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1)
3509                (Status.get_arg_1 cm s0
3510                  (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3511                    (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Bit_addr,
3512                    Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3513                    ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O),
3514                    ASM.N_bit_addr, (Vector.VCons (Nat.O, ASM.Carry,
3515                    Vector.VEmpty)))))) addr2) Bool.False))
3516         | Types.Inr r ->
3517           let { Types.fst = addr1; Types.snd = addr2 } = r in
3518           Status.set_arg_1 cm s0
3519             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3520               Nat.O) (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))
3521               (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons
3522               (Nat.O, ASM.Carry, Vector.VEmpty)))) addr1)
3523             (Status.get_arg_1 cm s0
3524               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3525                 (Nat.S (Nat.S Nat.O)) (Vector.VCons (Nat.O, ASM.Carry,
3526                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3527                 ASM.Bit_addr, (Vector.VCons ((Nat.S Nat.O), ASM.N_bit_addr,
3528                 (Vector.VCons (Nat.O, ASM.Carry, Vector.VEmpty)))))) addr2)
3529               Bool.False)))
3530    | ASM.MOVX addr ->
3531      (fun _ ->
3532        let s0 = add_ticks1 s in
3533        (match addr with
3534         | Types.Inl l ->
3535           let { Types.fst = addr1; Types.snd = addr2 } = l in
3536           Status.set_arg_8 cm s0
3537             (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3538               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
3539               (Nat.O, ASM.Acc_a, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
3540               (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct,
3541               (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3542               ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3543               Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3544               Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3545               ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3546               (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3547               Vector.VEmpty)))))))))))))) addr1)
3548             (Status.get_arg_8 cm s0 Bool.False
3549               (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S
3550                 Nat.O) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3551                 (Nat.S (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S Nat.O),
3552                 ASM.Ext_indirect, (Vector.VCons (Nat.O,
3553                 ASM.Ext_indirect_dptr, Vector.VEmpty)))) (Vector.VCons
3554                 ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3555                 (Nat.S Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
3556                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3557                 Nat.O)))))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S
3558                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))), ASM.Registr,
3559                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3560                 Nat.O)))))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3561                 (Nat.S (Nat.S Nat.O))))), ASM.Acc_b, (Vector.VCons ((Nat.S
3562                 (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Data, (Vector.VCons
3563                 ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_dptr, (Vector.VCons
3564                 ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc, (Vector.VCons ((Nat.S
3565                 Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3566                 ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3567                 addr2))
3568         | Types.Inr r ->
3569           let { Types.fst = addr1; Types.snd = addr2 } = r in
3570           Status.set_arg_8 cm s0
3571             (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
3572               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
3573               (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
3574               (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty)))) (Vector.VCons
3575               ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))),
3576               ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3577               Nat.O))))), ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3578               (Nat.S Nat.O)))), ASM.Registr, (Vector.VCons ((Nat.S (Nat.S
3579               (Nat.S Nat.O))), ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S
3580               Nat.O)), ASM.Acc_b, (Vector.VCons ((Nat.S Nat.O),
3581               ASM.Ext_indirect, (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3582               Vector.VEmpty)))))))))))))) addr1)
3583             (Status.get_arg_8 cm s0 Bool.False
3584               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3585                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3586                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Acc_a,
3587                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3588                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3589                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3590                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3591                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3592                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3593                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3594                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3595                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3596                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3597                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3598                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3599                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3600                 Vector.VEmpty)))))))))))))))))))) addr2))))
3601    | ASM.SETB b ->
3602      (fun _ ->
3603        let s0 = add_ticks1 s in
3604        Status.set_arg_1 cm s0
3605          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S Nat.O)
3606            (Nat.S Nat.O) (Vector.VCons ((Nat.S Nat.O), ASM.Carry,
3607            (Vector.VCons (Nat.O, ASM.Bit_addr, Vector.VEmpty))))
3608            (Vector.VCons ((Nat.S Nat.O), ASM.Bit_addr, (Vector.VCons (Nat.O,
3609            ASM.Carry, Vector.VEmpty)))) b) Bool.False)
3610    | ASM.PUSH addr ->
3611      (fun _ ->
3612        (match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O,
3613                 ASM.Direct, Vector.VEmpty)) addr with
3614         | ASM.DIRECT d ->
3615           (fun _ _ ->
3616             let s0 = add_ticks1 s in
3617             let new_sp =
3618               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3619                 (Nat.S Nat.O))))))))
3620                 (Status.get_8051_sfr cm s0 Status.SFR_SP)
3621                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
3622                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
3623             in
3624             let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
3625             Status.write_at_stack_pointer cm s1
3626               (Status.get_arg_8 cm s1 Bool.False (ASM.DIRECT d)))
3627         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3628         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3629         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3630         | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
3631         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3632         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3633         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3634         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3635         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3636         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3637         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3638         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3639         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
3640         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3641         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3642         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
3643         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
3644         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __ __)
3645    | ASM.POP addr ->
3646      (fun _ ->
3647        let s0 = add_ticks1 s in
3648        let contents = Status.read_at_stack_pointer cm s0 in
3649        (let { Types.fst = new_sp; Types.snd = flags } =
3650           Arithmetic.sub_8_with_carry
3651             (Status.get_8051_sfr cm s0 Status.SFR_SP)
3652             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3653               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
3654         in
3655        (fun _ ->
3656        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
3657        Status.set_arg_8 cm s1
3658          (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3659            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
3660            (Nat.O, ASM.Direct, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
3661            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
3662            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
3663            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3664            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3665            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
3666            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3667            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr) contents))
3668          __)
3669    | ASM.XCH (addr1, addr2) ->
3670      (fun _ ->
3671        let s0 = add_ticks1 s in
3672        let old_addr =
3673          Status.get_arg_8 cm s0 Bool.False
3674            (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
3675              Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3676              (Nat.S Nat.O))))))))) (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3677              ASM.Registr, (Vector.VCons ((Nat.S Nat.O), ASM.Direct,
3678              (Vector.VCons (Nat.O, ASM.Indirect, Vector.VEmpty))))))
3679              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3680              (Nat.S (Nat.S Nat.O))))))))), ASM.Direct, (Vector.VCons ((Nat.S
3681              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))),
3682              ASM.Indirect, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3683              (Nat.S (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3684              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3685              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3686              ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
3687              ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
3688              ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_pc,
3689              (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
3690              (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))))))))
3691              addr2)
3692        in
3693        let old_acc = Status.get_8051_sfr cm s0 Status.SFR_ACC_A in
3694        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A old_addr in
3695        Status.set_arg_8 cm s1
3696          (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
3697            Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
3698            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Registr, (Vector.VCons
3699            ((Nat.S Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Indirect,
3700            Vector.VEmpty)))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3701            (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S
3702            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
3703            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3704            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3705            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
3706            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3707            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr2) old_acc)
3708    | ASM.XCHD (addr1, addr2) ->
3709      (fun _ ->
3710        let s0 = add_ticks1 s in
3711        (let { Types.fst = acc_nu; Types.snd = acc_nl } =
3712           Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3713             (Nat.S (Nat.S Nat.O))))
3714             (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
3715         in
3716        (fun _ ->
3717        (let { Types.fst = arg_nu; Types.snd = arg_nl } =
3718           Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3719             (Nat.S (Nat.S Nat.O))))
3720             (Status.get_arg_8 cm s0 Bool.False
3721               (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O
3722                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3723                 (Nat.S Nat.O))))))))) (Vector.VCons (Nat.O, ASM.Indirect,
3724                 Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3725                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))),
3726                 ASM.Direct, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3727                 (Nat.S (Nat.S (Nat.S Nat.O)))))))), ASM.Indirect,
3728                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3729                 (Nat.S Nat.O))))))), ASM.Registr, (Vector.VCons ((Nat.S
3730                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Acc_a,
3731                 (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))),
3732                 ASM.Acc_b, (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
3733                 Nat.O)))), ASM.Data, (Vector.VCons ((Nat.S (Nat.S (Nat.S
3734                 Nat.O))), ASM.Acc_dptr, (Vector.VCons ((Nat.S (Nat.S Nat.O)),
3735                 ASM.Acc_pc, (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect,
3736                 (Vector.VCons (Nat.O, ASM.Ext_indirect_dptr,
3737                 Vector.VEmpty)))))))))))))))))))) addr2))
3738         in
3739        (fun _ ->
3740        let new_acc =
3741          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3742            (Nat.S (Nat.S Nat.O)))) acc_nu arg_nl
3743        in
3744        let new_arg =
3745          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))) (Nat.S (Nat.S
3746            (Nat.S (Nat.S Nat.O)))) arg_nu acc_nl
3747        in
3748        let s1 = Status.set_8051_sfr cm s0 Status.SFR_ACC_A new_acc in
3749        Status.set_arg_8 cm s1
3750          (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3751            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))) (Vector.VCons
3752            (Nat.O, ASM.Indirect, Vector.VEmpty)) (Vector.VCons ((Nat.S (Nat.S
3753            (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons
3754            ((Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
3755            (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))), ASM.Registr,
3756            (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))), ASM.Acc_a,
3757            (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b, (Vector.VCons
3758            ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons (Nat.O,
3759            ASM.Ext_indirect_dptr, Vector.VEmpty)))))))))))))) addr2) new_arg))
3760          __)) __)
3761    | ASM.RET ->
3762      (fun _ ->
3763        let s0 = add_ticks1 s in
3764        let high_bits = Status.read_at_stack_pointer cm s0 in
3765        (let { Types.fst = new_sp; Types.snd = flags } =
3766           Arithmetic.sub_8_with_carry
3767             (Status.get_8051_sfr cm s0 Status.SFR_SP)
3768             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3769               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
3770         in
3771        (fun _ ->
3772        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
3773        let low_bits = Status.read_at_stack_pointer cm s1 in
3774        (let { Types.fst = new_sp0; Types.snd = flags0 } =
3775           Arithmetic.sub_8_with_carry
3776             (Status.get_8051_sfr cm s1 Status.SFR_SP)
3777             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3778               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
3779         in
3780        (fun _ ->
3781        let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp0 in
3782        let new_pc =
3783          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3784            (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3785            (Nat.S (Nat.S Nat.O)))))))) high_bits low_bits
3786        in
3787        Status.set_program_counter cm s2 new_pc)) __)) __)
3788    | ASM.RETI ->
3789      (fun _ ->
3790        let s0 = add_ticks1 s in
3791        let high_bits = Status.read_at_stack_pointer cm s0 in
3792        (let { Types.fst = new_sp; Types.snd = flags } =
3793           Arithmetic.sub_8_with_carry
3794             (Status.get_8051_sfr cm s0 Status.SFR_SP)
3795             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3796               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
3797         in
3798        (fun _ ->
3799        let s1 = Status.set_8051_sfr cm s0 Status.SFR_SP new_sp in
3800        let low_bits = Status.read_at_stack_pointer cm s1 in
3801        (let { Types.fst = new_sp0; Types.snd = flags0 } =
3802           Arithmetic.sub_8_with_carry
3803             (Status.get_8051_sfr cm s1 Status.SFR_SP)
3804             (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3805               (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O)) Bool.False
3806         in
3807        (fun _ ->
3808        let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp0 in
3809        let new_pc =
3810          Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3811            (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3812            (Nat.S (Nat.S Nat.O)))))))) high_bits low_bits
3813        in
3814        Status.set_program_counter cm s2 new_pc)) __)) __)
3815    | ASM.NOP -> (fun _ -> let s0 = add_ticks2 s in s0)
3816    | ASM.JMP acc_dptr ->
3817      (fun _ ->
3818        let s0 = add_ticks1 s in
3819        let jmp_addr =
3820          Status.get_arg_16 cm s0
3821            (ASM.subaddressing_modeel__o__mk_subaddressing_mode Nat.O (Nat.S
3822              Nat.O) (Vector.VCons (Nat.O, ASM.Acc_dptr, Vector.VEmpty))
3823              (Vector.VCons ((Nat.S Nat.O), ASM.Data16, (Vector.VCons (Nat.O,
3824              ASM.Acc_dptr, Vector.VEmpty)))) acc_dptr)
3825        in
3826        Status.set_program_counter cm s0 jmp_addr)) __
3827
3828 (** val compute_target_of_unconditional_jump :
3829     BitVector.word -> ASM.instruction -> BitVector.word **)
3830 let compute_target_of_unconditional_jump program_counter = function
3831 | ASM.ACALL x ->
3832   BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3833     (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3834     Nat.O))))))))))))))))
3835 | ASM.LCALL x ->
3836   BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3837     (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3838     Nat.O))))))))))))))))
3839 | ASM.AJMP addr ->
3840   Types.pi1
3841     ((match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O, ASM.Addr11,
3842               Vector.VEmpty)) addr with
3843       | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
3844       | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3845       | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3846       | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3847       | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
3848       | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3849       | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3850       | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3851       | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3852       | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3853       | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3854       | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3855       | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3856       | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
3857       | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3858       | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3859       | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
3860       | ASM.ADDR11 a ->
3861         (fun _ ->
3862           (let { Types.fst = pc_bu; Types.snd = pc_bl } =
3863              Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))
3864                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3865                (Nat.S (Nat.S Nat.O))))))))))) program_counter
3866            in
3867           (fun _ ->
3868           let new_addr =
3869             Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))
3870               (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3871               (Nat.S (Nat.S Nat.O))))))))))) pc_bu a
3872           in
3873           new_addr)) __)
3874       | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
3875 | ASM.LJMP addr ->
3876   Types.pi1
3877     ((match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O, ASM.Addr16,
3878               Vector.VEmpty)) addr with
3879       | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
3880       | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3881       | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3882       | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3883       | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
3884       | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3885       | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3886       | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3887       | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3888       | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3889       | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3890       | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3891       | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3892       | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
3893       | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3894       | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3895       | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
3896       | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
3897       | ASM.ADDR16 a -> (fun _ -> a)) __)
3898 | ASM.SJMP addr ->
3899   Types.pi1
3900     ((match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O,
3901               ASM.Relative, Vector.VEmpty)) addr with
3902       | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
3903       | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
3904       | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
3905       | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
3906       | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
3907       | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3908       | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3909       | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
3910       | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
3911       | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3912       | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3913       | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3914       | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3915       | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
3916       | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3917       | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
3918       | ASM.RELATIVE r ->
3919         (fun _ ->
3920           Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3921             (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3922             Nat.O)))))))))))))))) program_counter
3923             (Arithmetic.sign_extension r))
3924       | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
3925       | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
3926 | ASM.MOVC (x, x0) ->
3927   BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3928     (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3929     Nat.O))))))))))))))))
3930 | ASM.RealInstruction x ->
3931   BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3932     (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3933     Nat.O))))))))))))))))
3934
3935 (** val is_unconditional_jump : ASM.instruction -> Bool.bool **)
3936 let is_unconditional_jump = function
3937 | ASM.ACALL x -> Bool.False
3938 | ASM.LCALL x -> Bool.False
3939 | ASM.AJMP x -> Bool.True
3940 | ASM.LJMP x -> Bool.True
3941 | ASM.SJMP x -> Bool.True
3942 | ASM.MOVC (x, x0) -> Bool.False
3943 | ASM.RealInstruction x -> Bool.False
3944
3945 (** val program_counter_after_other :
3946     BitVector.word -> ASM.instruction -> BitVector.word **)
3947 let program_counter_after_other program_counter instruction =
3948   match is_unconditional_jump instruction with
3949   | Bool.True ->
3950     compute_target_of_unconditional_jump program_counter instruction
3951   | Bool.False -> program_counter
3952
3953 (** val addr_of_relative :
3954     'a1 -> ASM.subaddressing_mode -> 'a1 Status.preStatus -> BitVector.word **)
3955 let addr_of_relative cm x s =
3956   (match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O, ASM.Relative,
3957            Vector.VEmpty)) x with
3958    | ASM.DIRECT x0 -> (fun _ -> assert false (* absurd case *))
3959    | ASM.INDIRECT x0 -> (fun _ -> assert false (* absurd case *))
3960    | ASM.EXT_INDIRECT x0 -> (fun _ -> assert false (* absurd case *))
3961    | ASM.REGISTER x0 -> (fun _ -> assert false (* absurd case *))
3962    | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
3963    | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
3964    | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
3965    | ASM.DATA x0 -> (fun _ -> assert false (* absurd case *))
3966    | ASM.DATA16 x0 -> (fun _ -> assert false (* absurd case *))
3967    | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
3968    | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
3969    | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3970    | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
3971    | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
3972    | ASM.BIT_ADDR x0 -> (fun _ -> assert false (* absurd case *))
3973    | ASM.N_BIT_ADDR x0 -> (fun _ -> assert false (* absurd case *))
3974    | ASM.RELATIVE r ->
3975      (fun _ ->
3976        Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3977          (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
3978          Nat.O)))))))))))))))) s.Status.program_counter
3979          (Arithmetic.sign_extension r))
3980    | ASM.ADDR11 x0 -> (fun _ -> assert false (* absurd case *))
3981    | ASM.ADDR16 x0 -> (fun _ -> assert false (* absurd case *))) __
3982
3983 (** val execute_1_0 :
3984     BitVector.byte BitVectorTrie.bitVectorTrie -> Status.status ->
3985     ((ASM.instruction, BitVector.word) Types.prod, Nat.nat) Types.prod ->
3986     Status.status Types.sig0 **)
3987 let execute_1_0 cm s0 instr_pc_ticks =
3988   (let { Types.fst = instr_pc; Types.snd = ticks } = instr_pc_ticks in
3989   (fun _ ->
3990   (let { Types.fst = instr; Types.snd = pc } = { Types.fst =
3991      instr_pc.Types.fst; Types.snd = instr_pc.Types.snd }
3992    in
3993   (fun _ ->
3994   let s = Status.set_program_counter cm s0 pc in
3995   (match instr with
3996    | ASM.ACALL addr ->
3997      (fun _ ->
3998        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
3999        (match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O,
4000                 ASM.Addr11, Vector.VEmpty)) addr with
4001         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
4002         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
4003         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
4004         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
4005         | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
4006         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
4007         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
4008         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
4009         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
4010         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
4011         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
4012         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4013         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4014         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
4015         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4016         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4017         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
4018         | ASM.ADDR11 a ->
4019           (fun _ ->
4020             let new_sp =
4021               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4022                 (Nat.S Nat.O))))))))
4023                 (Status.get_8051_sfr cm s1 Status.SFR_SP)
4024                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
4025                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4026             in
4027             let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp in
4028             let { Types.fst = pc_bu; Types.snd = pc_bl } =
4029               Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4030                 (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4031                 (Nat.S (Nat.S (Nat.S Nat.O)))))))) s2.Status.program_counter
4032             in
4033             let s3 = Status.write_at_stack_pointer cm s2 pc_bl in
4034             let new_sp0 =
4035               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4036                 (Nat.S Nat.O))))))))
4037                 (Status.get_8051_sfr cm s3 Status.SFR_SP)
4038                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
4039                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4040             in
4041             let s4 = Status.set_8051_sfr cm s3 Status.SFR_SP new_sp0 in
4042             let s5 = Status.write_at_stack_pointer cm s4 pc_bu in
4043             let { Types.fst = fiv; Types.snd = thr' } =
4044               Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))
4045                 (Nat.S (Nat.S (Nat.S Nat.O))) pc_bu
4046             in
4047             let new_addr =
4048               Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))
4049                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4050                 (Nat.S (Nat.S (Nat.S Nat.O))))))))))) fiv a
4051             in
4052             Status.set_program_counter cm s5 new_addr)
4053         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
4054    | ASM.LCALL addr ->
4055      (fun _ ->
4056        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
4057        (match ASM.subaddressing_modeel Nat.O (Vector.VCons (Nat.O,
4058                 ASM.Addr16, Vector.VEmpty)) addr with
4059         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
4060         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
4061         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
4062         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
4063         | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
4064         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
4065         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
4066         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
4067         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
4068         | ASM.ACC_DPTR -> (fun _ -> assert false (* absurd case *))
4069         | ASM.ACC_PC -> (fun _ -> assert false (* absurd case *))
4070         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4071         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4072         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
4073         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4074         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4075         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
4076         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
4077         | ASM.ADDR16 a ->
4078           (fun _ ->
4079             let new_sp =
4080               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4081                 (Nat.S Nat.O))))))))
4082                 (Status.get_8051_sfr cm s1 Status.SFR_SP)
4083                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
4084                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4085             in
4086             let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp in
4087             let { Types.fst = pc_bu; Types.snd = pc_bl } =
4088               Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4089                 (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4090                 (Nat.S (Nat.S (Nat.S Nat.O)))))))) s2.Status.program_counter
4091             in
4092             let s3 = Status.write_at_stack_pointer cm s2 pc_bl in
4093             let new_sp0 =
4094               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4095                 (Nat.S Nat.O))))))))
4096                 (Status.get_8051_sfr cm s3 Status.SFR_SP)
4097                 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
4098                   (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4099             in
4100             let s4 = Status.set_8051_sfr cm s3 Status.SFR_SP new_sp0 in
4101             let s5 = Status.write_at_stack_pointer cm s4 pc_bu in
4102             Status.set_program_counter cm s5 a)) __)
4103    | ASM.AJMP addr ->
4104      (fun _ ->
4105        let new_pc =
4106          compute_target_of_unconditional_jump s.Status.program_counter instr
4107        in
4108        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
4109        Status.set_program_counter cm s1 new_pc)
4110    | ASM.LJMP addr ->
4111      (fun _ ->
4112        let new_pc =
4113          compute_target_of_unconditional_jump s.Status.program_counter instr
4114        in
4115        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
4116        Status.set_program_counter cm s1 new_pc)
4117    | ASM.SJMP addr ->
4118      (fun _ ->
4119        let new_pc =
4120          compute_target_of_unconditional_jump s.Status.program_counter instr
4121        in
4122        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
4123        Status.set_program_counter cm s1 new_pc)
4124    | ASM.MOVC (addr1, addr2) ->
4125      (fun _ ->
4126        let s1 = Status.set_clock cm s (Nat.plus ticks s.Status.clock) in
4127        (match ASM.subaddressing_modeel (Nat.S Nat.O) (Vector.VCons ((Nat.S
4128                 Nat.O), ASM.Acc_dptr, (Vector.VCons (Nat.O, ASM.Acc_pc,
4129                 Vector.VEmpty)))) addr2 with
4130         | ASM.DIRECT x -> (fun _ -> assert false (* absurd case *))
4131         | ASM.INDIRECT x -> (fun _ -> assert false (* absurd case *))
4132         | ASM.EXT_INDIRECT x -> (fun _ -> assert false (* absurd case *))
4133         | ASM.REGISTER x -> (fun _ -> assert false (* absurd case *))
4134         | ASM.ACC_A -> (fun _ -> assert false (* absurd case *))
4135         | ASM.ACC_B -> (fun _ -> assert false (* absurd case *))
4136         | ASM.DPTR -> (fun _ -> assert false (* absurd case *))
4137         | ASM.DATA x -> (fun _ -> assert false (* absurd case *))
4138         | ASM.DATA16 x -> (fun _ -> assert false (* absurd case *))
4139         | ASM.ACC_DPTR ->
4140           (fun _ ->
4141             let big_acc =
4142               Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4143                 (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4144                 (Nat.S (Nat.S (Nat.S Nat.O))))))))
4145                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4146                   (Nat.S (Nat.S Nat.O)))))))))
4147                 (Status.get_8051_sfr cm s1 Status.SFR_ACC_A)
4148             in
4149             let dptr =
4150               Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4151                 (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4152                 (Nat.S (Nat.S (Nat.S Nat.O))))))))
4153                 (Status.get_8051_sfr cm s1 Status.SFR_DPH)
4154                 (Status.get_8051_sfr cm s1 Status.SFR_DPL)
4155             in
4156             let new_addr =
4157               Arithmetic.add
4158                 (Nat.plus (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4159                   (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4160                   (Nat.S (Nat.S (Nat.S Nat.O))))))))) dptr big_acc
4161             in
4162             let result =
4163               BitVectorTrie.lookup
4164                 (Nat.plus (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4165                   (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4166                   (Nat.S (Nat.S (Nat.S Nat.O))))))))) new_addr cm
4167                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4168                   (Nat.S (Nat.S Nat.O)))))))))
4169             in
4170             Status.set_8051_sfr cm s1 Status.SFR_ACC_A result)
4171         | ASM.ACC_PC ->
4172           (fun _ ->
4173             let big_acc =
4174               Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4175                 (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4176                 (Nat.S (Nat.S (Nat.S Nat.O))))))))
4177                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4178                   (Nat.S (Nat.S Nat.O)))))))))
4179                 (Status.get_8051_sfr cm s1 Status.SFR_ACC_A)
4180             in
4181             let new_addr =
4182               Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4183                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4184                 (Nat.S Nat.O)))))))))))))))) s1.Status.program_counter
4185                 big_acc
4186             in
4187             let result =
4188               BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4189                 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4190                 (Nat.S (Nat.S Nat.O)))))))))))))))) new_addr cm
4191                 (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4192                   (Nat.S (Nat.S Nat.O)))))))))
4193             in
4194             Status.set_8051_sfr cm s1 Status.SFR_ACC_A result)
4195         | ASM.EXT_INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4196         | ASM.INDIRECT_DPTR -> (fun _ -> assert false (* absurd case *))
4197         | ASM.CARRY -> (fun _ -> assert false (* absurd case *))
4198         | ASM.BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4199         | ASM.N_BIT_ADDR x -> (fun _ -> assert false (* absurd case *))
4200         | ASM.RELATIVE x -> (fun _ -> assert false (* absurd case *))
4201         | ASM.ADDR11 x -> (fun _ -> assert false (* absurd case *))
4202         | ASM.ADDR16 x -> (fun _ -> assert false (* absurd case *))) __)
4203    | ASM.RealInstruction instr' ->
4204      (fun _ ->
4205        execute_1_preinstruction { Types.fst = ticks; Types.snd = ticks } cm
4206          (addr_of_relative cm) instr' s)) __)) __)) __
4207
4208 (** val current_instruction_cost :
4209     BitVector.byte BitVectorTrie.bitVectorTrie -> Status.status -> Nat.nat **)
4210 let current_instruction_cost cm s =
4211   (Fetch.fetch cm s.Status.program_counter).Types.snd
4212
4213 (** val execute_1' :
4214     BitVector.byte BitVectorTrie.bitVectorTrie -> Status.status ->
4215     Status.status Types.sig0 **)
4216 let execute_1' cm s =
4217   let instr_pc_ticks = Fetch.fetch cm s.Status.program_counter in
4218   Types.pi1 (execute_1_0 cm s instr_pc_ticks)
4219
4220 (** val execute_1 :
4221     BitVector.byte BitVectorTrie.bitVectorTrie -> Status.status ->
4222     Status.status **)
4223 let execute_1 cm s =
4224   Types.pi1 (execute_1' cm s)
4225
4226 (** val execute_1_pseudo_instruction0 :
4227     (Nat.nat, Nat.nat) Types.prod -> ASM.pseudo_assembly_program ->
4228     (ASM.identifier -> BitVector.word) -> (ASM.identifier -> BitVector.word)
4229     -> Status.pseudoStatus -> ASM.pseudo_instruction -> BitVector.word ->
4230     Status.pseudoStatus **)
4231 let execute_1_pseudo_instruction0 ticks cm addr_of_label addr_of_symbol s instr pc =
4232   let s0 = Status.set_program_counter cm s pc in
4233   let s1 =
4234     match instr with
4235     | ASM.Instruction instr0 ->
4236       execute_1_preinstruction ticks cm (fun x y -> addr_of_label x) instr0
4237         s0
4238     | ASM.Comment cmt ->
4239       Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
4240     | ASM.Cost cst -> s0
4241     | ASM.Jmp jmp ->
4242       let s1 =
4243         Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
4244       in
4245       Status.set_program_counter cm s1 (addr_of_label jmp)
4246     | ASM.Jnz (acc, dst1, dst2) ->
4247       (match Bool.notb
4248                (BitVector.eq_bv (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4249                  (Nat.S (Nat.S Nat.O))))))))
4250                  (Status.get_8051_sfr cm s0 Status.SFR_ACC_A)
4251                  (BitVector.zero (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4252                    (Nat.S (Nat.S Nat.O)))))))))) with
4253        | Bool.True ->
4254          let s1 =
4255            Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
4256          in
4257          Status.set_program_counter cm s1 (addr_of_label dst1)
4258        | Bool.False ->
4259          let s1 =
4260            Status.set_clock cm s0 (Nat.plus ticks.Types.snd s0.Status.clock)
4261          in
4262          Status.set_program_counter cm s1 (addr_of_label dst2))
4263     | ASM.Call call ->
4264       let s1 =
4265         Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
4266       in
4267       let a = addr_of_label call in
4268       let new_sp =
4269         Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4270           (Nat.S Nat.O)))))))) (Status.get_8051_sfr cm s1 Status.SFR_SP)
4271           (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4272             (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4273       in
4274       let s2 = Status.set_8051_sfr cm s1 Status.SFR_SP new_sp in
4275       let { Types.fst = pc_bu; Types.snd = pc_bl } =
4276         Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4277           Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4278           (Nat.S Nat.O)))))))) s2.Status.program_counter
4279       in
4280       let s3 = Status.write_at_stack_pointer cm s2 pc_bl in
4281       let new_sp0 =
4282         Arithmetic.add (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4283           (Nat.S Nat.O)))))))) (Status.get_8051_sfr cm s3 Status.SFR_SP)
4284           (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4285             (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.S Nat.O))
4286       in
4287       let s4 = Status.set_8051_sfr cm s3 Status.SFR_SP new_sp0 in
4288       let s5 = Status.write_at_stack_pointer cm s4 pc_bu in
4289       Status.set_program_counter cm s5 a
4290     | ASM.Mov (dst, ident, off) ->
4291       let s1 =
4292         Status.set_clock cm s0 (Nat.plus ticks.Types.fst s0.Status.clock)
4293       in
4294       let v =
4295         (Arithmetic.add_16_with_carry (addr_of_symbol ident) off Bool.False).Types.fst
4296       in
4297       (match dst with
4298        | Types.Inl dptr -> Status.set_arg_16 cm s1 v dptr
4299        | Types.Inr pr ->
4300          let v' =
4301            match pr.Types.snd with
4302            | ASM.HIGH ->
4303              (Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4304                (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4305                (Nat.S (Nat.S Nat.O)))))))) v).Types.fst
4306            | ASM.LOW ->
4307              (Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4308                (Nat.S Nat.O)))))))) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
4309                (Nat.S (Nat.S Nat.O)))))))) v).Types.snd
4310          in
4311          Status.set_arg_8 cm s1
4312            (ASM.subaddressing_modeel__o__mk_subaddressing_mode (Nat.S (Nat.S
4313              Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))
4314              (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_a, (Vector.VCons
4315              ((Nat.S Nat.O), ASM.Direct, (Vector.VCons (Nat.O, ASM.Registr,
4316              Vector.VEmpty)))))) (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S
4317              (Nat.S (Nat.S Nat.O)))))), ASM.Direct, (Vector.VCons ((Nat.S
4318              (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))), ASM.Indirect,
4319              (Vector.VCons ((Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))),
4320              ASM.Registr, (Vector.VCons ((Nat.S (Nat.S (Nat.S Nat.O))),
4321              ASM.Acc_a, (Vector.VCons ((Nat.S (Nat.S Nat.O)), ASM.Acc_b,
4322              (Vector.VCons ((Nat.S Nat.O), ASM.Ext_indirect, (Vector.VCons
4323              (Nat.O, ASM.Ext_indirect_dptr, Vector.VEmpty))))))))))))))
4324              pr.Types.fst) v')
4325   in
4326   s1
4327
4328 (** val execute_1_pseudo_instruction :
4329     ASM.pseudo_assembly_program -> (BitVector.word -> __ -> (Nat.nat,
4330     Nat.nat) Types.prod) -> (ASM.identifier -> BitVector.word) ->
4331     (ASM.identifier -> BitVector.word) -> Status.pseudoStatus ->
4332     Status.pseudoStatus **)
4333 let execute_1_pseudo_instruction cm ticks_of addr_of_label addr_of_symbol s =
4334   let { Types.fst = instr; Types.snd = pc } =
4335     ASM.fetch_pseudo_instruction cm.ASM.code s.Status.program_counter
4336   in
4337   let ticks = ticks_of s.Status.program_counter __ in
4338   execute_1_pseudo_instruction0 ticks cm addr_of_label addr_of_symbol s instr
4339     pc
4340
4341 (** val execute :
4342     Nat.nat -> BitVector.byte BitVectorTrie.bitVectorTrie -> Status.status ->
4343     Status.status **)
4344 let rec execute n cm s =
4345   match n with
4346   | Nat.O -> s
4347   | Nat.S o -> execute o cm (execute_1 cm s)
4348