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 (* Sviluppo: 2008-2010 *)
21 (* ********************************************************************** *)
23 include "num/word16.ma".
25 (* *********************************** *)
26 (* STATUS INTERNO DEL PROCESSORE (ALU) *)
27 (* *********************************** *)
30 nrecord alu_RS08: Type ≝
32 (* A: registo accumulatore *)
33 acc_low_reg_RS08 : byte8;
34 (* PC: registro program counter *)
36 (* modificatore di PC: per esempio e' definito come 00xxxxxxxxxxxxxxb *)
37 (* la logica della sua costruzione e' quindi (PC∧mask) *)
38 (* totalmente racchiusa nella ALU, bastera' fare get(set(PC)) *)
39 pc_mask_RS08 : word16;
40 (* SPC: registro shadow program counter *)
41 (* NB: il suo modificatore e' lo stesso di PC *)
42 spc_reg_RS08 : word16;
44 (* X: registro indice parte bassa *)
45 (* NB: in realta' e' mappato in memoria e non risiede nella ALU *)
46 (* la lettura/scrittura avviene tramite la locazione [0x000F] *)
48 (* PS: registro selezione di pagina *)
49 (* serve a indirizzare la finestra RAM di 64b [0x00C0-0x00FF] *)
50 (* su tutta la memoria installata [0x0000-0x3FFF]: [00pp pppp ppxx xxxx] *)
51 (* NB: in realta' e' mappato in memoria e non risiede nella ALU *)
52 (* la lettura/scrittura avviene tramite la locazione [0x001F] *)
61 notation "{hvbox('A_Reg' ≝ acclow ; break 'Pc_Reg' ≝ pc ; break 'Pc_Mask' ≝ pcm ; break 'Spc_Reg' ≝ spc ; break 'X_Map' ≝ xm ; break 'Ps_Map' ≝ psm ; break 'Z_Flag' ≝ zfl ; break 'C_Flag' ≝ cfl)}"
62 non associative with precedence 80 for
63 @{ 'mk_alu_RS08 $acclow $pc $pcm $spc $xm $psm $zfl $cfl }.
64 interpretation "mk_alu_RS08" 'mk_alu_RS08 acclow pc pcm spc xm psm zfl cfl =
65 (mk_alu_RS08 acclow pc pcm spc xm psm zfl cfl).
71 (* setter specifico RS08 di A *)
72 ndefinition set_acc_8_low_reg_RS08 ≝
84 (* setter specifico RS08 di PC, effettua PC∧mask *)
85 ndefinition set_pc_reg_RS08 ≝
88 (acc_low_reg_RS08 alu)
89 (and_w16 pc' (pc_mask_RS08 alu))
97 (* setter specifico RS08 di SPC, effettua SPC∧mask *)
98 ndefinition set_spc_reg_RS08 ≝
101 (acc_low_reg_RS08 alu)
104 (and_w16 spc' (pc_mask_RS08 alu))
110 (* setter specifico RS08 di memory mapped X *)
111 ndefinition set_x_map_RS08 ≝
114 (acc_low_reg_RS08 alu)
123 (* setter specifico RS08 di memory mapped PS *)
124 ndefinition set_ps_map_RS08 ≝
127 (acc_low_reg_RS08 alu)
136 (* setter sprcifico RS08 di Z *)
137 ndefinition set_z_flag_RS08 ≝
140 (acc_low_reg_RS08 alu)
149 (* setter specifico RS08 di C *)
150 ndefinition set_c_flag_RS08 ≝
153 (acc_low_reg_RS08 alu)
162 (* ***************** *)
163 (* CONFRONTO FRA ALU *)
164 (* ***************** *)
166 (* confronto registro per registro dell'RS08 *)
167 ndefinition eq_RS08_alu ≝
169 (eq_b8 (acc_low_reg_RS08 alu1) (acc_low_reg_RS08 alu2)) ⊗
170 (eq_w16 (pc_reg_RS08 alu1) (pc_reg_RS08 alu2)) ⊗
171 (eq_w16 (pc_mask_RS08 alu1) (pc_mask_RS08 alu2)) ⊗
172 (eq_w16 (spc_reg_RS08 alu1) (spc_reg_RS08 alu2)) ⊗
173 (eq_b8 (x_map_RS08 alu1) (x_map_RS08 alu2)) ⊗
174 (eq_b8 (ps_map_RS08 alu1) (ps_map_RS08 alu2)) ⊗
175 (eq_bool (z_flag_RS08 alu1) (z_flag_RS08 alu2)) ⊗
176 (eq_bool (c_flag_RS08 alu1) (c_flag_RS08 alu2)).