1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 (* ********************************************************************** *)
16 (* Progetto FreeScale *)
18 (* Sviluppato da: Cosimo Oliboni, oliboni@cs.unibo.it *)
19 (* Cosimo Oliboni, oliboni@cs.unibo.it *)
21 (* ********************************************************************** *)
23 include "freescale/table_HC05.ma".
24 include "freescale/table_HC08.ma".
25 include "freescale/table_HCS08.ma".
26 include "freescale/table_RS08.ma".
27 include "freescale/option.ma".
29 (* ***************************** *)
30 (* TRADUZIONE ESADECIMALE → INFO *)
31 (* ***************************** *)
33 (* accesso alla tabella della ALU prescelta *)
34 ndefinition opcode_table ≝
37 return λm:mcu_type.list (Prod4T (any_opcode m) instr_mode byte8_or_word16 byte8)
39 [ HC05 ⇒ opcode_table_HC05
40 | HC08 ⇒ opcode_table_HC08
41 | HCS08 ⇒ opcode_table_HCS08
42 | RS08 ⇒ opcode_table_RS08
45 (* traduzione mcu+esadecimale → info *)
46 (* NB: la ricerca per byte non matcha con una word con lo stesso byte superiore uguale *)
47 (* NB: per matchare una word (precode+code) bisogna passare una word *)
48 (* NB: il risultato e' sempre un'opzione, NON esiste un dummy opcode tipo UNKNOWN/ILLEGAL *)
49 nlet rec full_info_of_word16_aux (m:mcu_type) (borw:byte8_or_word16)
50 (param:list (Prod4T (any_opcode m) instr_mode byte8_or_word16 byte8)) on param ≝
54 match thd4T ???? hd with
55 [ Byte b ⇒ match borw with
56 [ Byte borw' ⇒ match eq_b8 borw' b with
58 | false ⇒ full_info_of_word16_aux m borw tl ]
59 | Word _ ⇒ full_info_of_word16_aux m borw tl ]
60 | Word w ⇒ match borw with
61 [ Byte _ ⇒ full_info_of_word16_aux m borw tl
62 | Word borw' ⇒ match eq_w16 borw' w with
64 | false ⇒ full_info_of_word16_aux m borw tl ]
67 ndefinition full_info_of_word16 ≝
68 λm:mcu_type.λborw:byte8_or_word16.
69 full_info_of_word16_aux m borw (opcode_table m).
71 (* ******************************************************* *)
72 (* TRADUZIONE MCU+OPCODE+MODALITA'+ARGOMENTI → ESADECIMALE *)
73 (* ******************************************************* *)
75 (* introduzione di un tipo byte8 dipendente dall'mcu_type (phantom type) *)
76 ninductive t_byte8 (m:mcu_type) : Type ≝
77 TByte : byte8 → t_byte8 m.
79 (*ndefinition t_byte8_ind
80 : Πm:mcu_type.ΠP:t_byte8 m → Prop.(Πb:byte8.P (TByte m b)) → Πt:t_byte8 m.P t ≝
81 λm:mcu_type.λP:t_byte8 m → Prop.λf:Πb:byte8.P (TByte m b).λt:t_byte8 m.
82 match t with [ TByte (b:byte8) ⇒ f b ].
84 ndefinition t_byte8_rec
85 : Πm:mcu_type.ΠP:t_byte8 m → Set.(Πb:byte8.P (TByte m b)) → Πt:t_byte8 m.P t ≝
86 λm:mcu_type.λP:t_byte8 m → Set.λf:Πb:byte8.P (TByte m b).λt:t_byte8 m.
87 match t with [ TByte (b:byte8) ⇒ f b ].
89 ndefinition t_byte8_rect
90 : Πm:mcu_type.ΠP:t_byte8 m → Type.(Πb:byte8.P (TByte m b)) → Πt:t_byte8 m.P t ≝
91 λm:mcu_type.λP:t_byte8 m → Type.λf:Πb:byte8.P (TByte m b).λt:t_byte8 m.
92 match t with [ TByte (b:byte8) ⇒ f b ].*)
94 nlemma tbyte8_destruct : ∀m,b1,b2.TByte m b1 = TByte m b2 → b1 = b2.
96 nchange with (match TByte m b2 with [ TByte a ⇒ b1 = a ]);
102 (* introduzione di un tipo dipendente (dalla modalita') per gli argomenti *)
103 ninductive MA_check : instr_mode → Type ≝
104 maINH : MA_check MODE_INH
105 | maINHA : MA_check MODE_INHA
106 | maINHX : MA_check MODE_INHX
107 | maINHH : MA_check MODE_INHH
108 | maINHX0ADD : MA_check MODE_INHX0ADD
109 | maINHX1ADD : byte8 → MA_check MODE_INHX1ADD
110 | maINHX2ADD : word16 → MA_check MODE_INHX2ADD
111 | maIMM1 : byte8 → MA_check MODE_IMM1
112 | maIMM1EXT : byte8 → MA_check MODE_IMM1EXT
113 | maIMM2 : word16 → MA_check MODE_IMM2
114 | maDIR1 : byte8 → MA_check MODE_DIR1
115 | maDIR2 : word16 → MA_check MODE_DIR2
116 | maIX0 : MA_check MODE_IX0
117 | maIX1 : byte8 → MA_check MODE_IX1
118 | maIX2 : word16 → MA_check MODE_IX2
119 | maSP1 : byte8 → MA_check MODE_SP1
120 | maSP2 : word16 → MA_check MODE_SP2
121 | maDIR1_to_DIR1 : byte8 → byte8 → MA_check MODE_DIR1_to_DIR1
122 | maIMM1_to_DIR1 : byte8 → byte8 → MA_check MODE_IMM1_to_DIR1
123 | maIX0p_to_DIR1 : byte8 → MA_check MODE_IX0p_to_DIR1
124 | maDIR1_to_IX0p : byte8 → MA_check MODE_DIR1_to_IX0p
125 | maINHA_and_IMM1 : byte8 → MA_check MODE_INHA_and_IMM1
126 | maINHX_and_IMM1 : byte8 → MA_check MODE_INHX_and_IMM1
127 | maIMM1_and_IMM1 : byte8 → byte8 → MA_check MODE_IMM1_and_IMM1
128 | maDIR1_and_IMM1 : byte8 → byte8 → MA_check MODE_DIR1_and_IMM1
129 | maIX0_and_IMM1 : byte8 → MA_check MODE_IX0_and_IMM1
130 | maIX0p_and_IMM1 : byte8 → MA_check MODE_IX0p_and_IMM1
131 | maIX1_and_IMM1 : byte8 → byte8 → MA_check MODE_IX1_and_IMM1
132 | maIX1p_and_IMM1 : byte8 → byte8 → MA_check MODE_IX1p_and_IMM1
133 | maSP1_and_IMM1 : byte8 → byte8 → MA_check MODE_SP1_and_IMM1
134 | maDIRn : ∀n.byte8 → MA_check (MODE_DIRn n)
135 | maDIRn_and_IMM1 : ∀n.byte8 → byte8 → MA_check (MODE_DIRn_and_IMM1 n)
136 | maTNY : ∀e.MA_check (MODE_TNY e)
137 | maSRT : ∀t.MA_check (MODE_SRT t)
140 ndefinition instr_mode_ind
141 : Πi:instr_mode.ΠP:Πj.MA_check j → Prop.
142 P ? maINH → P ? maINHA → P ? maINHX → P ? maINHH → P ? maINHX0ADD → (Πb.P ? (maINHX1ADD b)) →
143 (Πw.P ? (maINHX2ADD w)) → (Πb.P ? (maIMM1 b)) → (Πb.P ? (maIMM1EXT b)) → (Πw.P ? (maIMM2 w)) →
144 (Πb.P ? (maDIR1 b)) → (Πw.P ? (maDIR2 w)) → P ? maIX0 → (Πb.P ? (maIX1 b)) → (Πw.P ? (maIX2 w)) →
145 (Πb.P ? (maSP1 b)) → (Πw.P ? (maSP2 w)) → (Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2)) →
146 (Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2)) → (Πb.P ? (maIX0p_to_DIR1 b)) → (Πb.P ? (maDIR1_to_IX0p b)) →
147 (Πb.P ? (maINHA_and_IMM1 b)) → (Πb.P ? (maINHX_and_IMM1 b)) → (Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2)) →
148 (Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2)) → (Πb.P ? (maIX0_and_IMM1 b)) → (Πb.P ? (maIX0p_and_IMM1 b)) →
149 (Πb1,b2.P ? (maIX1_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maSP1_and_IMM1 b1 b2)) →
150 (Πn,b.P ? ((maDIRn n) b)) → (Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2)) → (Πe.P ? (maTNY e)) → (Πt.P ? (maSRT t)) →
151 Πma:MA_check i.P i ma ≝
152 λi:instr_mode.λP:Πj.MA_check j → Prop.
153 λp:P ? maINH.λp1:P ? maINHA.λp2:P ? maINHX.λp3:P ? maINHH.λp4:P ? maINHX0ADD.
154 λf:Πb.P ? (maINHX1ADD b).λf1:Πw.P ? (maINHX2ADD w).λf2:Πb.P ? (maIMM1 b).λf3:Πb.P ? (maIMM1EXT b).
155 λf4:Πw.P ? (maIMM2 w).λf5:Πb.P ? (maDIR1 b).λf6:Πw.P ? (maDIR2 w).λp5:P ? maIX0.
156 λf7:Πb.P ? (maIX1 b).λf8:Πw.P ? (maIX2 w).λf9:Πb.P ? (maSP1 b).λf10:Πw.P ? (maSP2 w).
157 λf11:Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2).λf12:Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2).
158 λf13:Πb.P ? (maIX0p_to_DIR1 b).λf14:Πb.P ? (maDIR1_to_IX0p b).λf15:Πb.P ? (maINHA_and_IMM1 b).
159 λf16:Πb.P ? (maINHX_and_IMM1 b).λf17:Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2).
160 λf18:Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2).λf19:Πb.P ? (maIX0_and_IMM1 b).
161 λf20:Πb.P ? (maIX0p_and_IMM1 b).λf21:Πb1,b2.P ? (maIX1_and_IMM1 b1 b2).
162 λf22:Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2).λf23:Πb1,b2.P ? (maSP1_and_IMM1 b1 b2).
163 λf24:Πn,b.P ? ((maDIRn n) b).λf25:Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2).
164 λf26:Πe.P ? (maTNY e).λf27:Πt.P ? (maSRT t).λma:MA_check i.
166 [ maINH ⇒ p | maINHA ⇒ p1 | maINHX ⇒ p2 | maINHH ⇒ p3 | maINHX0ADD ⇒ p4
167 | maINHX1ADD b ⇒ f b | maINHX2ADD w ⇒ f1 w | maIMM1 b ⇒ f2 b | maIMM1EXT b ⇒ f3 b
168 | maIMM2 w ⇒ f4 w | maDIR1 b ⇒ f5 b | maDIR2 w ⇒ f6 w | maIX0 ⇒ p5 | maIX1 b ⇒ f7 b
169 | maIX2 w ⇒ f8 w | maSP1 b ⇒ f9 b | maSP2 w ⇒ f10 w | maDIR1_to_DIR1 b1 b2 ⇒ f11 b1 b2
170 | maIMM1_to_DIR1 b1 b2 ⇒ f12 b1 b2 | maIX0p_to_DIR1 b ⇒ f13 b | maDIR1_to_IX0p b ⇒ f14 b
171 | maINHA_and_IMM1 b ⇒ f15 b | maINHX_and_IMM1 b ⇒ f16 b | maIMM1_and_IMM1 b1 b2 ⇒ f17 b1 b2
172 | maDIR1_and_IMM1 b1 b2 ⇒ f18 b1 b2 | maIX0_and_IMM1 b ⇒ f19 b | maIX0p_and_IMM1 b ⇒ f20 b
173 | maIX1_and_IMM1 b1 b2 ⇒ f21 b1 b2 | maIX1p_and_IMM1 b1 b2 ⇒ f22 b1 b2 | maSP1_and_IMM1 b1 b2 ⇒ f23 b1 b2
174 | maDIRn n b ⇒ f24 n b | maDIRn_and_IMM1 n b1 b2 ⇒ f25 n b1 b2 | maTNY e ⇒ f26 e | maSRT t ⇒ f27 t ].
176 (*ndefinition instr_mode_rec
177 : Πi:instr_mode.ΠP:Πj.MA_check j → Set.
178 P ? maINH → P ? maINHA → P ? maINHX → P ? maINHH → P ? maINHX0ADD → (Πb.P ? (maINHX1ADD b)) →
179 (Πw.P ? (maINHX2ADD w)) → (Πb.P ? (maIMM1 b)) → (Πb.P ? (maIMM1EXT b)) → (Πw.P ? (maIMM2 w)) →
180 (Πb.P ? (maDIR1 b)) → (Πw.P ? (maDIR2 w)) → P ? maIX0 → (Πb.P ? (maIX1 b)) → (Πw.P ? (maIX2 w)) →
181 (Πb.P ? (maSP1 b)) → (Πw.P ? (maSP2 w)) → (Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2)) →
182 (Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2)) → (Πb.P ? (maIX0p_to_DIR1 b)) → (Πb.P ? (maDIR1_to_IX0p b)) →
183 (Πb.P ? (maINHA_and_IMM1 b)) → (Πb.P ? (maINHX_and_IMM1 b)) → (Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2)) →
184 (Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2)) → (Πb.P ? (maIX0_and_IMM1 b)) → (Πb.P ? (maIX0p_and_IMM1 b)) →
185 (Πb1,b2.P ? (maIX1_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maSP1_and_IMM1 b1 b2)) →
186 (Πn,b.P ? ((maDIRn n) b)) → (Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2)) → (Πe.P ? (maTNY e)) → (Πt.P ? (maSRT t)) →
187 Πma:MA_check i.P i ma ≝
188 λi:instr_mode.λP:Πj.MA_check j → Set.
189 λp:P ? maINH.λp1:P ? maINHA.λp2:P ? maINHX.λp3:P ? maINHH.λp4:P ? maINHX0ADD.
190 λf:Πb.P ? (maINHX1ADD b).λf1:Πw.P ? (maINHX2ADD w).λf2:Πb.P ? (maIMM1 b).λf3:Πb.P ? (maIMM1EXT b).
191 λf4:Πw.P ? (maIMM2 w).λf5:Πb.P ? (maDIR1 b).λf6:Πw.P ? (maDIR2 w).λp5:P ? maIX0.
192 λf7:Πb.P ? (maIX1 b).λf8:Πw.P ? (maIX2 w).λf9:Πb.P ? (maSP1 b).λf10:Πw.P ? (maSP2 w).
193 λf11:Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2).λf12:Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2).
194 λf13:Πb.P ? (maIX0p_to_DIR1 b).λf14:Πb.P ? (maDIR1_to_IX0p b).λf15:Πb.P ? (maINHA_and_IMM1 b).
195 λf16:Πb.P ? (maINHX_and_IMM1 b).λf17:Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2).
196 λf18:Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2).λf19:Πb.P ? (maIX0_and_IMM1 b).
197 λf20:Πb.P ? (maIX0p_and_IMM1 b).λf21:Πb1,b2.P ? (maIX1_and_IMM1 b1 b2).
198 λf22:Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2).λf23:Πb1,b2.P ? (maSP1_and_IMM1 b1 b2).
199 λf24:Πn,b.P ? ((maDIRn n) b).λf25:Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2).
200 λf26:Πe.P ? (maTNY e).λf27:Πt.P ? (maSRT t).λma:MA_check i.
202 [ maINH ⇒ p | maINHA ⇒ p1 | maINHX ⇒ p2 | maINHH ⇒ p3 | maINHX0ADD ⇒ p4
203 | maINHX1ADD b ⇒ f b | maINHX2ADD w ⇒ f1 w | maIMM1 b ⇒ f2 b | maIMM1EXT b ⇒ f3 b
204 | maIMM2 w ⇒ f4 w | maDIR1 b ⇒ f5 b | maDIR2 w ⇒ f6 w | maIX0 ⇒ p5 | maIX1 b ⇒ f7 b
205 | maIX2 w ⇒ f8 w | maSP1 b ⇒ f9 b | maSP2 w ⇒ f10 w | maDIR1_to_DIR1 b1 b2 ⇒ f11 b1 b2
206 | maIMM1_to_DIR1 b1 b2 ⇒ f12 b1 b2 | maIX0p_to_DIR1 b ⇒ f13 b | maDIR1_to_IX0p b ⇒ f14 b
207 | maINHA_and_IMM1 b ⇒ f15 b | maINHX_and_IMM1 b ⇒ f16 b | maIMM1_and_IMM1 b1 b2 ⇒ f17 b1 b2
208 | maDIR1_and_IMM1 b1 b2 ⇒ f18 b1 b2 | maIX0_and_IMM1 b ⇒ f19 b | maIX0p_and_IMM1 b ⇒ f20 b
209 | maIX1_and_IMM1 b1 b2 ⇒ f21 b1 b2 | maIX1p_and_IMM1 b1 b2 ⇒ f22 b1 b2 | maSP1_and_IMM1 b1 b2 ⇒ f23 b1 b2
210 | maDIRn n b ⇒ f24 n b | maDIRn_and_IMM1 n b1 b2 ⇒ f25 n b1 b2 | maTNY e ⇒ f26 e | maSRT t ⇒ f27 t ].
212 ndefinition instr_mode_rect
213 : Πi:instr_mode.ΠP:Πj.MA_check j → Type.
214 P ? maINH → P ? maINHA → P ? maINHX → P ? maINHH → P ? maINHX0ADD → (Πb.P ? (maINHX1ADD b)) →
215 (Πw.P ? (maINHX2ADD w)) → (Πb.P ? (maIMM1 b)) → (Πb.P ? (maIMM1EXT b)) → (Πw.P ? (maIMM2 w)) →
216 (Πb.P ? (maDIR1 b)) → (Πw.P ? (maDIR2 w)) → P ? maIX0 → (Πb.P ? (maIX1 b)) → (Πw.P ? (maIX2 w)) →
217 (Πb.P ? (maSP1 b)) → (Πw.P ? (maSP2 w)) → (Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2)) →
218 (Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2)) → (Πb.P ? (maIX0p_to_DIR1 b)) → (Πb.P ? (maDIR1_to_IX0p b)) →
219 (Πb.P ? (maINHA_and_IMM1 b)) → (Πb.P ? (maINHX_and_IMM1 b)) → (Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2)) →
220 (Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2)) → (Πb.P ? (maIX0_and_IMM1 b)) → (Πb.P ? (maIX0p_and_IMM1 b)) →
221 (Πb1,b2.P ? (maIX1_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2)) → (Πb1,b2.P ? (maSP1_and_IMM1 b1 b2)) →
222 (Πn,b.P ? ((maDIRn n) b)) → (Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2)) → (Πe.P ? (maTNY e)) → (Πt.P ? (maSRT t)) →
223 Πma:MA_check i.P i ma ≝
224 λi:instr_mode.λP:Πj.MA_check j → Type.
225 λp:P ? maINH.λp1:P ? maINHA.λp2:P ? maINHX.λp3:P ? maINHH.λp4:P ? maINHX0ADD.
226 λf:Πb.P ? (maINHX1ADD b).λf1:Πw.P ? (maINHX2ADD w).λf2:Πb.P ? (maIMM1 b).λf3:Πb.P ? (maIMM1EXT b).
227 λf4:Πw.P ? (maIMM2 w).λf5:Πb.P ? (maDIR1 b).λf6:Πw.P ? (maDIR2 w).λp5:P ? maIX0.
228 λf7:Πb.P ? (maIX1 b).λf8:Πw.P ? (maIX2 w).λf9:Πb.P ? (maSP1 b).λf10:Πw.P ? (maSP2 w).
229 λf11:Πb1,b2.P ? (maDIR1_to_DIR1 b1 b2).λf12:Πb1,b2.P ? (maIMM1_to_DIR1 b1 b2).
230 λf13:Πb.P ? (maIX0p_to_DIR1 b).λf14:Πb.P ? (maDIR1_to_IX0p b).λf15:Πb.P ? (maINHA_and_IMM1 b).
231 λf16:Πb.P ? (maINHX_and_IMM1 b).λf17:Πb1,b2.P ? (maIMM1_and_IMM1 b1 b2).
232 λf18:Πb1,b2.P ? (maDIR1_and_IMM1 b1 b2).λf19:Πb.P ? (maIX0_and_IMM1 b).
233 λf20:Πb.P ? (maIX0p_and_IMM1 b).λf21:Πb1,b2.P ? (maIX1_and_IMM1 b1 b2).
234 λf22:Πb1,b2.P ? (maIX1p_and_IMM1 b1 b2).λf23:Πb1,b2.P ? (maSP1_and_IMM1 b1 b2).
235 λf24:Πn,b.P ? ((maDIRn n) b).λf25:Πn,b1,b2.P ? ((maDIRn_and_IMM1 n) b1 b2).
236 λf26:Πe.P ? (maTNY e).λf27:Πt.P ? (maSRT t).λma:MA_check i.
238 [ maINH ⇒ p | maINHA ⇒ p1 | maINHX ⇒ p2 | maINHH ⇒ p3 | maINHX0ADD ⇒ p4
239 | maINHX1ADD b ⇒ f b | maINHX2ADD w ⇒ f1 w | maIMM1 b ⇒ f2 b | maIMM1EXT b ⇒ f3 b
240 | maIMM2 w ⇒ f4 w | maDIR1 b ⇒ f5 b | maDIR2 w ⇒ f6 w | maIX0 ⇒ p5 | maIX1 b ⇒ f7 b
241 | maIX2 w ⇒ f8 w | maSP1 b ⇒ f9 b | maSP2 w ⇒ f10 w | maDIR1_to_DIR1 b1 b2 ⇒ f11 b1 b2
242 | maIMM1_to_DIR1 b1 b2 ⇒ f12 b1 b2 | maIX0p_to_DIR1 b ⇒ f13 b | maDIR1_to_IX0p b ⇒ f14 b
243 | maINHA_and_IMM1 b ⇒ f15 b | maINHX_and_IMM1 b ⇒ f16 b | maIMM1_and_IMM1 b1 b2 ⇒ f17 b1 b2
244 | maDIR1_and_IMM1 b1 b2 ⇒ f18 b1 b2 | maIX0_and_IMM1 b ⇒ f19 b | maIX0p_and_IMM1 b ⇒ f20 b
245 | maIX1_and_IMM1 b1 b2 ⇒ f21 b1 b2 | maIX1p_and_IMM1 b1 b2 ⇒ f22 b1 b2 | maSP1_and_IMM1 b1 b2 ⇒ f23 b1 b2
246 | maDIRn n b ⇒ f24 n b | maDIRn_and_IMM1 n b1 b2 ⇒ f25 n b1 b2 | maTNY e ⇒ f26 e | maSRT t ⇒ f27 t ].
248 (* picker: trasforma l'argomento necessario in input a bytes_of_pseudo_instr_mode_param:
249 MA_check i → list (t_byte8 m) *)
250 ndefinition args_picker ≝
251 λm:mcu_type.λi:instr_mode.λargs:MA_check i.
253 (* inherent: legale se nessun operando *)
258 (* inherent address: legale se nessun operando/1 byte/1 word *)
260 | maINHX1ADD b ⇒ [ TByte m b ]
261 | maINHX2ADD w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
262 (* _0/1/2: legale se nessun operando/1 byte/1 word *)
263 | maIMM1 b ⇒ [ TByte m b ]
264 | maIMM1EXT b ⇒ [ TByte m b ]
265 | maIMM2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
266 | maDIR1 b ⇒ [ TByte m b ]
267 | maDIR2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
269 | maIX1 b ⇒ [ TByte m b ]
270 | maIX2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
271 | maSP1 b ⇒ [ TByte m b ]
272 | maSP2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
273 (* movimento: legale se 2 operandi byte *)
274 | maDIR1_to_DIR1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
275 | maIMM1_to_DIR1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
276 | maIX0p_to_DIR1 b ⇒ [ TByte m b]
277 | maDIR1_to_IX0p b ⇒ [ TByte m b]
278 (* cbeq/dbnz: legale se 1/2 operandi byte *)
279 | maINHA_and_IMM1 b ⇒ [ TByte m b]
280 | maINHX_and_IMM1 b ⇒ [ TByte m b]
281 | maIMM1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
282 | maDIR1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
283 | maIX0_and_IMM1 b ⇒ [ TByte m b]
284 | maIX0p_and_IMM1 b ⇒ [ TByte m b]
285 | maIX1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
286 | maIX1p_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
287 | maSP1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
288 (* DIRn: legale se 1 operando byte *)
289 | maDIRn _ b ⇒ [ TByte m b]
290 (* DIRn_and_IMM1: legale se 2 operandi byte *)
291 | maDIRn_and_IMM1 _ b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
292 (* TNY: legale se nessun operando *)
294 (* SRT: legale se nessun operando *)
298 (* trasformatore finale: mcu+opcode+instr_mode+args → list (t_byte8 m) *)
299 nlet rec bytes_of_pseudo_instr_mode_param_aux (m:mcu_type) (o:any_opcode m) (i:instr_mode) (p:MA_check i)
300 (param:list (Prod4T (any_opcode m) instr_mode byte8_or_word16 byte8)) on param ≝
302 [ nil ⇒ None ? | cons hd tl ⇒
303 match (eq_anyop m o (fst4T ???? hd)) ⊗ (eq_instrmode i (snd4T ???? hd)) with
304 [ true ⇒ match thd4T ???? hd with
306 Some ? ([ (TByte m isab) ]@(args_picker m i p))
308 Some ? ([ (TByte m (w16h isaw)) ; (TByte m (w16l isaw)) ]@(args_picker m i p))
310 | false ⇒ bytes_of_pseudo_instr_mode_param_aux m o i p tl ]].
312 ndefinition bytes_of_pseudo_instr_mode_param ≝
313 λm:mcu_type.λo:any_opcode m.λi:instr_mode.λp:MA_check i.
314 bytes_of_pseudo_instr_mode_param_aux m o i p (opcode_table m).
316 (* ****************************** *)
317 (* APPROCCIO COMPILAZIONE AL VOLO *)
318 (* ****************************** *)
320 (* ausiliario di compile *)
321 ndefinition defined_option ≝
328 (* compila solo se l'intera istruzione+modalita'+argomenti ha riscontro nelle tabelle *)
329 ndefinition compile ≝
330 λmcu:mcu_type.λi:instr_mode.λop:opcode.λarg:MA_check i.
331 match bytes_of_pseudo_instr_mode_param mcu (anyOP mcu op) i arg
332 return λres:option (list (t_byte8 mcu)).defined_option (list (t_byte8 mcu)) res → (list (t_byte8 mcu))
334 [ None ⇒ λp:defined_option (list (t_byte8 mcu)) (None ?).False_rect ? p
335 | Some x ⇒ λp:defined_option (list (t_byte8 mcu)) (Some ? x).x
338 (* detipatore del compilato: (t_byte8 m) → byte8 *)
339 nlet rec source_to_byte8_HC05_aux (p1:list (t_byte8 HC05)) (p2:list byte8) ≝
342 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HC05_aux tl (p2@[b]) ]
345 nlet rec source_to_byte8_HC08_aux (p1:list (t_byte8 HC08)) (p2:list byte8) ≝
348 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HC08_aux tl (p2@[b]) ]
351 nlet rec source_to_byte8_HCS08_aux (p1:list (t_byte8 HCS08)) (p2:list byte8) ≝
354 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HCS08_aux tl (p2@[b]) ]
357 nlet rec source_to_byte8_RS08_aux (p1:list (t_byte8 RS08)) (p2:list byte8) ≝
360 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_RS08_aux tl (p2@[b]) ]
363 ndefinition source_to_byte8 ≝
366 return λm:mcu_type.list (t_byte8 m) → list byte8
368 [ HC05 ⇒ λl:list (t_byte8 HC05).source_to_byte8_HC05_aux l []
369 | HC08 ⇒ λl:list (t_byte8 HC08).source_to_byte8_HC08_aux l []
370 | HCS08 ⇒ λl:list (t_byte8 HCS08).source_to_byte8_HCS08_aux l []
371 | RS08 ⇒ λl:list (t_byte8 RS08).source_to_byte8_RS08_aux l []