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: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *)
19 (* Ultima modifica: 05/08/2009 *)
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 "common/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 ≝
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 eq_tbyte8 ≝
80 λm.λtb1,tb2:t_byte8 m.
82 [ TByte b1 ⇒ match tb2 with
83 [ TByte b2 ⇒ eq_b8 b1 b2 ]].
85 (* introduzione di un tipo dipendente (dalla modalita') per gli argomenti *)
86 ninductive MA_check : instr_mode → Type ≝
87 maINH : MA_check MODE_INH
88 | maINHA : MA_check MODE_INHA
89 | maINHX : MA_check MODE_INHX
90 | maINHH : MA_check MODE_INHH
91 | maINHX0ADD : MA_check MODE_INHX0ADD
92 | maINHX1ADD : byte8 → MA_check MODE_INHX1ADD
93 | maINHX2ADD : word16 → MA_check MODE_INHX2ADD
94 | maIMM1 : byte8 → MA_check MODE_IMM1
95 | maIMM1EXT : byte8 → MA_check MODE_IMM1EXT
96 | maIMM2 : word16 → MA_check MODE_IMM2
97 | maDIR1 : byte8 → MA_check MODE_DIR1
98 | maDIR2 : word16 → MA_check MODE_DIR2
99 | maIX0 : MA_check MODE_IX0
100 | maIX1 : byte8 → MA_check MODE_IX1
101 | maIX2 : word16 → MA_check MODE_IX2
102 | maSP1 : byte8 → MA_check MODE_SP1
103 | maSP2 : word16 → MA_check MODE_SP2
104 | maDIR1_to_DIR1 : byte8 → byte8 → MA_check MODE_DIR1_to_DIR1
105 | maIMM1_to_DIR1 : byte8 → byte8 → MA_check MODE_IMM1_to_DIR1
106 | maIX0p_to_DIR1 : byte8 → MA_check MODE_IX0p_to_DIR1
107 | maDIR1_to_IX0p : byte8 → MA_check MODE_DIR1_to_IX0p
108 | maINHA_and_IMM1 : byte8 → MA_check MODE_INHA_and_IMM1
109 | maINHX_and_IMM1 : byte8 → MA_check MODE_INHX_and_IMM1
110 | maIMM1_and_IMM1 : byte8 → byte8 → MA_check MODE_IMM1_and_IMM1
111 | maDIR1_and_IMM1 : byte8 → byte8 → MA_check MODE_DIR1_and_IMM1
112 | maIX0_and_IMM1 : byte8 → MA_check MODE_IX0_and_IMM1
113 | maIX0p_and_IMM1 : byte8 → MA_check MODE_IX0p_and_IMM1
114 | maIX1_and_IMM1 : byte8 → byte8 → MA_check MODE_IX1_and_IMM1
115 | maIX1p_and_IMM1 : byte8 → byte8 → MA_check MODE_IX1p_and_IMM1
116 | maSP1_and_IMM1 : byte8 → byte8 → MA_check MODE_SP1_and_IMM1
117 | maDIRn : ∀n.byte8 → MA_check (MODE_DIRn n)
118 | maDIRn_and_IMM1 : ∀n.byte8 → byte8 → MA_check (MODE_DIRn_and_IMM1 n)
119 | maTNY : ∀e.MA_check (MODE_TNY e)
120 | maSRT : ∀t.MA_check (MODE_SRT t)
123 (* picker: trasforma l'argomento necessario in input a bytes_of_pseudo_instr_mode_param:
124 MA_check i → list (t_byte8 m) *)
125 ndefinition args_picker ≝
126 λm:mcu_type.λi:instr_mode.λargs:MA_check i.
128 (* inherent: legale se nessun operando *)
133 (* inherent address: legale se nessun operando/1 byte/1 word *)
135 | maINHX1ADD b ⇒ [ TByte m b ]
136 | maINHX2ADD w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
137 (* _0/1/2: legale se nessun operando/1 byte/1 word *)
138 | maIMM1 b ⇒ [ TByte m b ]
139 | maIMM1EXT b ⇒ [ TByte m b ]
140 | maIMM2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
141 | maDIR1 b ⇒ [ TByte m b ]
142 | maDIR2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
144 | maIX1 b ⇒ [ TByte m b ]
145 | maIX2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
146 | maSP1 b ⇒ [ TByte m b ]
147 | maSP2 w ⇒ [ TByte m (w16h w); TByte m (w16l w) ]
148 (* movimento: legale se 2 operandi byte *)
149 | maDIR1_to_DIR1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
150 | maIMM1_to_DIR1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
151 | maIX0p_to_DIR1 b ⇒ [ TByte m b]
152 | maDIR1_to_IX0p b ⇒ [ TByte m b]
153 (* cbeq/dbnz: legale se 1/2 operandi byte *)
154 | maINHA_and_IMM1 b ⇒ [ TByte m b]
155 | maINHX_and_IMM1 b ⇒ [ TByte m b]
156 | maIMM1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
157 | maDIR1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
158 | maIX0_and_IMM1 b ⇒ [ TByte m b]
159 | maIX0p_and_IMM1 b ⇒ [ TByte m b]
160 | maIX1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
161 | maIX1p_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
162 | maSP1_and_IMM1 b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
163 (* DIRn: legale se 1 operando byte *)
164 | maDIRn _ b ⇒ [ TByte m b]
165 (* DIRn_and_IMM1: legale se 2 operandi byte *)
166 | maDIRn_and_IMM1 _ b1 b2 ⇒ [ TByte m b1 ; TByte m b2 ]
167 (* TNY: legale se nessun operando *)
169 (* SRT: legale se nessun operando *)
173 (* trasformatore finale: mcu+opcode+instr_mode+args → list (t_byte8 m) *)
174 nlet rec bytes_of_pseudo_instr_mode_param_aux (m:mcu_type) (o:any_opcode m) (i:instr_mode) (p:MA_check i)
175 (param:list (Prod4T (any_opcode m) instr_mode byte8_or_word16 byte8)) on param ≝
177 [ nil ⇒ None ? | cons hd tl ⇒
178 match (eq_anyop m o (fst4T … hd)) ⊗ (eq_im i (snd4T … hd)) with
179 [ true ⇒ match thd4T … hd with
181 Some ? ([ (TByte m isab) ]@(args_picker m i p))
183 Some ? ([ (TByte m (w16h isaw)) ; (TByte m (w16l isaw)) ]@(args_picker m i p))
185 | false ⇒ bytes_of_pseudo_instr_mode_param_aux m o i p tl ]].
187 ndefinition bytes_of_pseudo_instr_mode_param ≝
188 λm:mcu_type.λo:any_opcode m.λi:instr_mode.λp:MA_check i.
189 bytes_of_pseudo_instr_mode_param_aux m o i p (opcode_table m).
191 (* ****************************** *)
192 (* APPROCCIO COMPILAZIONE AL VOLO *)
193 (* ****************************** *)
195 (* ausiliario di compile *)
196 ndefinition defined_option ≝
203 (* compila solo se l'intera istruzione+modalita'+argomenti ha riscontro nelle tabelle *)
204 ndefinition compile ≝
205 λmcu:mcu_type.λi:instr_mode.λop:opcode.λarg:MA_check i.
206 match bytes_of_pseudo_instr_mode_param mcu (anyOP mcu op) i arg
207 return λres:option ?.defined_option ? res → ?
209 [ None ⇒ λp:defined_option ? (None ?).False_rect_Type0 ? p
210 | Some x ⇒ λp:defined_option ? (Some ? x).x
213 (* detipatore del compilato: (t_byte8 m) → byte8 *)
214 nlet rec source_to_byte8_HC05_aux (p1:list (t_byte8 HC05)) (p2:list byte8) ≝
217 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HC05_aux tl (p2@[b]) ]
220 nlet rec source_to_byte8_HC08_aux (p1:list (t_byte8 HC08)) (p2:list byte8) ≝
223 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HC08_aux tl (p2@[b]) ]
226 nlet rec source_to_byte8_HCS08_aux (p1:list (t_byte8 HCS08)) (p2:list byte8) ≝
229 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_HCS08_aux tl (p2@[b]) ]
232 nlet rec source_to_byte8_RS08_aux (p1:list (t_byte8 RS08)) (p2:list byte8) ≝
235 | cons hd tl ⇒ match hd with [ TByte b ⇒ source_to_byte8_RS08_aux tl (p2@[b]) ]
238 ndefinition source_to_byte8 ≝
241 return λm:mcu_type.list (t_byte8 m) → list byte8
243 [ HC05 ⇒ λl:list (t_byte8 HC05).source_to_byte8_HC05_aux l []
244 | HC08 ⇒ λl:list (t_byte8 HC08).source_to_byte8_HC08_aux l []
245 | HCS08 ⇒ λl:list (t_byte8 HCS08).source_to_byte8_HCS08_aux l []
246 | RS08 ⇒ λl:list (t_byte8 RS08).source_to_byte8_RS08_aux l []