2 * Simulator of microcontrollers (uc51cl.h)
4 * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
6 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
11 This file is part of microcontroller simulator: ucsim.
13 UCSIM is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 UCSIM is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with UCSIM; see the file COPYING. If not, write to the Free
25 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
47 #include "interruptcl.h"
52 class cl_irq_stop_option: public cl_optref
55 class cl_51core *uc51;
57 cl_irq_stop_option(class cl_51core *the_uc51);
58 virtual int init(void);
59 virtual void option_changed(void);
62 class cl_51core: public cl_uc
67 class cl_irq_stop_option *irq_stop_option;
70 // memories and cells for faster access
71 class cl_address_space *sfr, *iram, *xram;
72 class cl_memory_cell *acc, *psw;
75 // Help to detect external it requests (falling edge)
76 uchar prev_p1; // Prev state of P1
77 uchar prev_p3; // Prev state of P3
78 int p3_int0_edge, p3_int1_edge;
81 // Simulation of interrupt system
82 class cl_interrupt *interrupt;
83 //bool was_reti; // Instruction had an effect on IE
86 int result; // result of instruction execution
88 cl_51core(int Itype, int Itech, class cl_sim *asim);
89 virtual ~cl_51core(void);
90 virtual int init(void);
91 virtual char *id_string(void);
92 virtual void mk_hw_elements(void);
93 virtual void build_cmdset(class cl_cmdset *cmdset);
94 //virtual class cl_m *mk_mem(enum mem_class type, char *class_name);
95 virtual void make_memories(void);
97 virtual int clock_per_cycle(void) { return(12); }
98 virtual struct dis_entry *dis_tbl(void);
99 virtual struct name_entry *sfr_tbl(void);
100 virtual struct name_entry *bit_tbl(void);
101 virtual char *disass(t_addr addr, char *sep);
102 virtual void print_regs(class cl_console_base *con);
103 virtual class cl_address_space *bit2mem(t_addr bitaddr,
104 t_addr *memaddr, t_mem *bitmask);
105 virtual t_addr bit_address(class cl_memory *mem,
108 virtual void reset(void);
109 virtual void clear_sfr(void);
110 virtual void analyze(t_addr addr);
111 virtual int it_priority(uchar ie_mask);
113 virtual int do_inst(int step);
115 //virtual void mem_cell_changed(class cl_m *mem, t_addr addr);
118 virtual int do_interrupt(void);
119 virtual int accept_it(class it_level *il);
121 virtual int idle_pd(void);
123 virtual class cl_memory_cell *get_direct(t_mem addr);
124 virtual class cl_memory_cell *get_reg(uchar regnum);
126 virtual int exec_inst(void);
127 //virtual void post_inst(void);
129 virtual int inst_unknown(void);
130 virtual int inst_nop(uchar code); /* 00 */
131 virtual int inst_ajmp_addr(uchar code); /* [02468ace]1 */
132 virtual int inst_ljmp(uchar code); /* 02 */
133 virtual int inst_rr(uchar code); /* 03 */
134 virtual int inst_inc_a(uchar code); /* 04 */
135 virtual int inst_inc_addr(uchar code); /* 05 */
136 virtual int inst_inc_Sri(uchar code); /* 06,07 */
137 virtual int inst_inc_rn(uchar code); /* 08-0f */
138 virtual int inst_jbc_bit_addr(uchar code); /* 10 */
139 virtual int inst_acall_addr(uchar code); /* [13579bdf]1 */
140 virtual int inst_lcall(uchar code, uint addr, bool intr);/* 12 */
141 virtual int inst_rrc(uchar code); /* 13 */
142 virtual int inst_dec_a(uchar code); /* 14 */
143 virtual int inst_dec_addr(uchar code); /* 15 */
144 virtual int inst_dec_Sri(uchar code); /* 16,17 */
145 virtual int inst_dec_rn(uchar code); /* 18-1f */
146 virtual int inst_jb_bit_addr(uchar code); /* 20 */
147 virtual int inst_ret(uchar code); /* 22 */
148 virtual int inst_rl(uchar code); /* 23 */
149 virtual int inst_add_a_Sdata(uchar code); /* 24 */
150 virtual int inst_add_a_addr(uchar code); /* 25 */
151 virtual int inst_add_a_Sri(uchar code); /* 26,27 */
152 virtual int inst_add_a_rn(uchar code); /* 28-2f */
153 virtual int inst_jnb_bit_addr(uchar code); /* 30 */
154 virtual int inst_reti(uchar code); /* 32 */
155 virtual int inst_rlc(uchar code); /* 33 */
156 virtual int inst_addc_a_Sdata(uchar code); /* 34 */
157 virtual int inst_addc_a_addr(uchar code); /* 35 */
158 virtual int inst_addc_a_Sri(uchar code); /* 36,37 */
159 virtual int inst_addc_a_rn(uchar code); /* 38-3f */
160 virtual int inst_jc_addr(uchar code); /* 40 */
161 virtual int inst_orl_addr_a(uchar code); /* 42 */
162 virtual int inst_orl_addr_Sdata(uchar code); /* 43 */
163 virtual int inst_orl_a_Sdata(uchar code); /* 44 */
164 virtual int inst_orl_a_addr(uchar code); /* 45 */
165 virtual int inst_orl_a_Sri(uchar code); /* 46,47 */
166 virtual int inst_orl_a_rn(uchar code); /* 48-4f */
167 virtual int inst_jnc_addr(uchar code); /* 50 */
168 virtual int inst_anl_addr_a(uchar code); /* 52 */
169 virtual int inst_anl_addr_Sdata(uchar code); /* 53 */
170 virtual int inst_anl_a_Sdata(uchar code); /* 54 */
171 virtual int inst_anl_a_addr(uchar code); /* 55 */
172 virtual int inst_anl_a_Sri(uchar code); /* 56,57 */
173 virtual int inst_anl_a_rn(uchar code); /* 58-5f */
174 virtual int inst_jz_addr(uchar code); /* 60 */
175 virtual int inst_xrl_addr_a(uchar code); /* 62 */
176 virtual int inst_xrl_addr_Sdata(uchar code); /* 63 */
177 virtual int inst_xrl_a_Sdata(uchar code); /* 64 */
178 virtual int inst_xrl_a_addr(uchar code); /* 65 */
179 virtual int inst_xrl_a_Sri(uchar code); /* 66,67 */
180 virtual int inst_xrl_a_rn(uchar code); /* 68-6f */
181 virtual int inst_jnz_addr(uchar code); /* 70 */
182 virtual int inst_orl_c_bit(uchar code); /* 72 */
183 virtual int inst_jmp_Sa_dptr(uchar code); /* 73 */
184 virtual int inst_mov_a_Sdata(uchar code); /* 74 */
185 virtual int inst_mov_addr_Sdata(uchar code); /* 75 */
186 virtual int inst_mov_Sri_Sdata(uchar code); /* 76,77 */
187 virtual int inst_mov_rn_Sdata(uchar code); /* 78-7f */
188 virtual int inst_sjmp(uchar code); /* 80 */
189 virtual int inst_anl_c_bit(uchar code); /* 82 */
190 virtual int inst_movc_a_Sa_pc(uchar code); /* 83 */
191 virtual int inst_div_ab(uchar code); /* 84 */
192 virtual int inst_mov_addr_addr(uchar code); /* 85 */
193 virtual int inst_mov_addr_Sri(uchar code); /* 86,87 */
194 virtual int inst_mov_addr_rn(uchar code); /* 88-8f */
195 virtual int inst_mov_dptr_Sdata(uchar code); /* 90 */
196 virtual int inst_mov_bit_c(uchar code); /* 92 */
197 virtual int inst_movc_a_Sa_dptr(uchar code); /* 93 */
198 virtual int inst_subb_a_Sdata(uchar code); /* 94 */
199 virtual int inst_subb_a_addr(uchar code); /* 95 */
200 virtual int inst_subb_a_Sri(uchar code); /* 96,97 */
201 virtual int inst_subb_a_rn(uchar code); /* 98-9f */
202 virtual int inst_orl_c_Sbit(uchar code); /* a0 */
203 virtual int inst_mov_c_bit(uchar code); /* a2 */
204 virtual int inst_inc_dptr(uchar code); /* a3 */
205 virtual int inst_mul_ab(uchar code); /* a4 */
206 virtual int inst_mov_Sri_addr(uchar code); /* a6,a7 */
207 virtual int inst_mov_rn_addr(uchar code); /* a8-af */
208 virtual int inst_anl_c_Sbit(uchar code); /* b0 */
209 virtual int inst_cpl_bit(uchar code); /* b2 */
210 virtual int inst_cpl_c(uchar code); /* b3 */
211 virtual int inst_cjne_a_Sdata_addr(uchar code); /* b4 */
212 virtual int inst_cjne_a_addr_addr(uchar code); /* b5 */
213 virtual int inst_cjne_Sri_Sdata_addr(uchar code); /* b6,b7 */
214 virtual int inst_cjne_rn_Sdata_addr(uchar code); /* b8-bf */
215 virtual int inst_push(uchar code); /* c0 */
216 virtual int inst_clr_bit(uchar code); /* c2 */
217 virtual int inst_clr_c(uchar code); /* c3*/
218 virtual int inst_swap(uchar code); /* c4 */
219 virtual int inst_xch_a_addr(uchar code); /* c5 */
220 virtual int inst_xch_a_Sri(uchar code); /* c6,c7 */
221 virtual int inst_xch_a_rn(uchar code); /* c8-cf */
222 virtual int inst_pop(uchar code); /* d0 */
223 virtual int inst_setb_bit(uchar code); /* d2 */
224 virtual int inst_setb_c(uchar code); /* d3 */
225 virtual int inst_da_a(uchar code); /* d4 */
226 virtual int inst_djnz_addr_addr(uchar code); /* d5 */
227 virtual int inst_xchd_a_Sri(uchar code); /* d6,d7 */
228 virtual int inst_djnz_rn_addr(uchar code); /* d8-df */
229 virtual int inst_movx_a_Sdptr(uchar code); /* e0 */
230 virtual int inst_movx_a_Sri(uchar code); /* e2,e3 */
231 virtual int inst_clr_a(uchar code); /* e4 */
232 virtual int inst_mov_a_addr(uchar code); /* e5 */
233 virtual int inst_mov_a_Sri(uchar code); /* e6,e7 */
234 virtual int inst_mov_a_rn(uchar code); /* e8-ef */
235 virtual int inst_movx_Sdptr_a(uchar code); /* f0 */
236 virtual int inst_movx_Sri_a(uchar code); /* f2,f3 */
237 virtual int inst_cpl_a(uchar code); /* f4 */
238 virtual int inst_mov_addr_a(uchar code); /* f5 */
239 virtual int inst_mov_Sri_a(uchar code); /* f6,f7 */
240 virtual int inst_mov_rn_a(uchar code); /* f8-ff */
244 class cl_uc51_dummy_hw: public cl_hw
247 //class t_uc51 *uc51;
248 class cl_memory_cell *cell_acc, *cell_sp, *cell_psw/*, *cell_pcon*/;
250 cl_uc51_dummy_hw(class cl_uc *auc);
251 virtual int init(void);
253 virtual void write(class cl_memory_cell *cell, t_mem *val);
254 //virtual void happen(class cl_hw *where, enum hw_event he, void *params);
260 /* End of s51.src/uc51cl.h */