ucsim-0.2.37-pre3 into cvs
[fw/sdcc] / sim / ucsim / s51.src / uc51cl.h
1 /*
2  * Simulator of microcontrollers (uc51cl.h)
3  *
4  * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
5  * 
6  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
7  *
8  */
9
10 /* This file is part of microcontroller simulator: ucsim.
11
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING.  If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 02111-1307, USA. */
26 /*@1@*/
27
28 #ifndef UC51CL_HEADER
29 #define UC51CL_HEADER
30
31 #include <stdio.h>
32 #include <termios.h>
33
34 #include "pobjcl.h"
35
36 #include "simcl.h"
37 #include "memcl.h"
38 #include "uccl.h"
39 #include "itsrccl.h"
40 #include "brkcl.h"
41 #include "stypes.h"
42
43
44 class t_uc51: public cl_uc
45 {
46 public:
47   // Options
48   bool debug;
49   bool stop_at_it;
50 int jaj;
51   // Data for breakpoint handling
52   struct event_rec event_at;
53
54   FILE *serial_in;      // Serial line input
55   FILE *serial_out;     // Serial line output
56
57   class cl_mem *sfr, *iram;
58
59 protected:
60   struct termios saved_attributes_in; // Attributes of serial interface
61   struct termios saved_attributes_out;
62
63   // Help to detect external it requests (falling edge)
64   uchar prev_p1;        // Prev state of P1
65   uchar prev_p3;        // Prev state of P3
66   
67   // Seral line simulation
68   uchar s_in;           // Serial channel input reg
69   uchar s_out;          // Serial channel output reg
70   bool  s_sending;      // Transmitter is working
71   bool  s_receiving;    // Receiver is working
72   int   s_rec_bit;      // Bit counter of receiver
73   int   s_tr_bit;       // Bit counter of transmitter
74   int   s_rec_t1;       // T1 overflows for receiving
75   int   s_tr_t1;        // T1 overflows for sending
76   int   s_rec_tick;     // Machine cycles for receiving
77   int   s_tr_tick;      // Machine cycles for sending
78
79   // Simulation of interrupt system
80   bool  was_reti;       // Instruction had an effect on IE
81
82 public:
83   int result;           // result of instruction execution
84
85   t_uc51(int Itype, int Itech,
86          class cl_sim *asim);
87   ~t_uc51(void);
88   virtual int    init(void);
89   virtual char  *id_string(void);
90   virtual void mk_hw_elements(void);
91   virtual class cl_mem *mk_mem(enum mem_class type);
92
93           void   write_rom(uint addr, ulong data);
94   virtual int clock_per_cycle(void) { return(12); }
95   virtual struct dis_entry *dis_tbl(void);
96   virtual struct name_entry *sfr_tbl(void);
97   virtual struct name_entry *bit_tbl(void);
98   //virtual char   *disass(uint addr, char *sep);
99   virtual char *disass(uint addr, char *sep);
100   virtual void   print_disass(uint addr, class cl_console *con);
101   virtual void   print_regs(class cl_console *con);
102   virtual void   reset(void);
103   virtual void   clear_sfr(void);
104   virtual void   analyze(uint addr);
105   virtual void   set_p_flag(void);
106   virtual void   proc_write(uchar *addr);
107   virtual void   proc_write_sp(uchar val);
108   virtual uchar  *get_bit(uchar bitaddr);
109   virtual uchar  *get_bit(uchar bitaddr, t_addr *ev_i, t_addr *ev_s);
110   virtual int    it_priority(uchar ie_mask);
111
112   virtual int    do_inst(int step);
113
114 protected:
115   virtual int  do_hardware(int cycles);
116   virtual int  do_interrupt(void);
117   virtual int  accept_it(class it_level *il);
118   virtual int  serial_bit_cnt(int mode);
119   virtual int  do_serial(int cycles);
120   virtual void received(int c);
121   virtual int  do_timers(int cycles);
122   virtual int  do_timer0(int cycles);
123   virtual int  t0_overflow(void);
124   virtual int  do_timer1(int cycles);
125   virtual int  do_wdt(int cycles);
126   virtual int  idle_pd(void);
127   virtual int  tick(int cycles);
128   virtual int  check_events(void);
129
130   virtual uchar *get_direct(t_mem addr, t_addr *ev_i, t_addr *ev_s);
131   virtual uchar *get_indirect(uchar addr, int *res);
132   virtual uchar *get_reg(uchar regnum);
133   virtual uchar *get_reg(uchar regnum, t_addr *event);
134   virtual uchar get_bitidx(uchar bitaddr);
135   virtual uchar read(uchar *addr);
136   virtual void  pre_inst(void);
137   virtual int   exec_inst(void);
138   virtual void  post_inst(void);
139
140   virtual int inst_unknown(uchar code);
141   virtual int inst_nop(uchar code);                     /* 00 */
142   virtual int inst_ajmp_addr(uchar code);               /* [02468ace]1 */
143   virtual int inst_ljmp(uchar code);                    /* 02 */
144   virtual int inst_rr(uchar code);                      /* 03 */
145   virtual int inst_inc_a(uchar code);                   /* 04 */
146   virtual int inst_inc_addr(uchar code);                /* 05 */
147   virtual int inst_inc_$ri(uchar code);                 /* 06,07 */
148   virtual int inst_inc_rn(uchar code);                  /* 08-0f */
149   virtual int inst_jbc_bit_addr(uchar code);            /* 10 */
150   virtual int inst_acall_addr(uchar code);              /* [13579bdf]1 */
151   virtual int inst_lcall(uchar code, uint addr);        /* 12 */
152   virtual int inst_rrc(uchar code);                     /* 13 */
153   virtual int inst_dec_a(uchar code);                   /* 14 */
154   virtual int inst_dec_addr(uchar code);                /* 15 */
155   virtual int inst_dec_$ri(uchar code);                 /* 16,17 */
156   virtual int inst_dec_rn(uchar code);                  /* 18-1f */
157   virtual int inst_jb_bit_addr(uchar code);             /* 20 */
158   virtual int inst_ret(uchar code);                     /* 22 */
159   virtual int inst_rl(uchar code);                      /* 23 */
160   virtual int inst_add_a_$data(uchar code);             /* 24 */
161   virtual int inst_add_a_addr(uchar code);              /* 25 */
162   virtual int inst_add_a_$ri(uchar code);               /* 26,27 */
163   virtual int inst_add_a_rn(uchar code);                /* 28-2f */
164   virtual int inst_jnb_bit_addr(uchar code);            /* 30 */
165   virtual int inst_reti(uchar code);                    /* 32 */
166   virtual int inst_rlc(uchar code);                     /* 33 */
167   virtual int inst_addc_a_$data(uchar code);            /* 34 */
168   virtual int inst_addc_a_addr(uchar code);             /* 35 */
169   virtual int inst_addc_a_$ri(uchar code);              /* 36,37 */
170   virtual int inst_addc_a_rn(uchar code);               /* 38-3f */
171   virtual int inst_jc_addr(uchar code);                 /* 40 */
172   virtual int inst_orl_addr_a(uchar code);              /* 42 */
173   virtual int inst_orl_addr_$data(uchar code);          /* 43 */
174   virtual int inst_orl_a_$data(uchar code);             /* 44 */
175   virtual int inst_orl_a_addr(uchar code);              /* 45 */
176   virtual int inst_orl_a_$ri(uchar code);               /* 46,47 */
177   virtual int inst_orl_a_rn(uchar code);                /* 48-4f */
178   virtual int inst_jnc_addr(uchar code);                /* 50 */
179   virtual int inst_anl_addr_a(uchar code);              /* 52 */
180   virtual int inst_anl_addr_$data(uchar code);          /* 53 */
181   virtual int inst_anl_a_$data(uchar code);             /* 54 */
182   virtual int inst_anl_a_addr(uchar code);              /* 55 */
183   virtual int inst_anl_a_$ri(uchar code);               /* 56,57 */
184   virtual int inst_anl_a_rn(uchar code);                /* 58-5f */
185   virtual int inst_jz_addr(uchar code);                 /* 60 */
186   virtual int inst_xrl_addr_a(uchar code);              /* 62 */
187   virtual int inst_xrl_addr_$data(uchar code);          /* 63 */
188   virtual int inst_xrl_a_$data(uchar code);             /* 64 */
189   virtual int inst_xrl_a_addr(uchar code);              /* 65 */
190   virtual int inst_xrl_a_$ri(uchar code);               /* 66,67 */
191   virtual int inst_xrl_a_rn(uchar code);                /* 68-6f */
192   virtual int inst_jnz_addr(uchar code);                /* 70 */
193   virtual int inst_orl_c_bit(uchar code);               /* 72 */
194   virtual int inst_jmp_$a_dptr(uchar code);             /* 73 */
195   virtual int inst_mov_a_$data(uchar code);             /* 74 */
196   virtual int inst_mov_addr_$data(uchar code);          /* 75 */
197   virtual int inst_mov_$ri_$data(uchar code);           /* 76,77 */
198   virtual int inst_mov_rn_$data(uchar code);            /* 78-7f */
199   virtual int inst_sjmp(uchar code);                    /* 80 */
200   virtual int inst_anl_c_bit(uchar code);               /* 82 */
201   virtual int inst_movc_a_$a_pc(uchar code);            /* 83 */
202   virtual int inst_div_ab(uchar code);                  /* 84 */
203   virtual int inst_mov_addr_addr(uchar code);           /* 85 */
204   virtual int inst_mov_addr_$ri(uchar code);            /* 86,87 */
205   virtual int inst_mov_addr_rn(uchar code);             /* 88-8f */
206   virtual int inst_mov_dptr_$data(uchar code);          /* 90 */
207   virtual int inst_mov_bit_c(uchar code);               /* 92 */
208   virtual int inst_movc_a_$a_dptr(uchar code);          /* 93 */
209   virtual int inst_subb_a_$data(uchar code);            /* 94 */
210   virtual int inst_subb_a_addr(uchar code);             /* 95 */
211   virtual int inst_subb_a_$ri(uchar code);              /* 96,97 */
212   virtual int inst_subb_a_rn(uchar code);               /* 98-9f */
213   virtual int inst_mov_c_bit(uchar code);               /* a2 */
214   virtual int inst_inc_dptr(uchar code);                /* a3 */
215   virtual int inst_mul_ab(uchar code);                  /* a4 */
216   virtual int inst_mov_$ri_addr(uchar code);            /* a6,a7 */
217   virtual int inst_mov_rn_addr(uchar code);             /* a8-af */
218   virtual int inst_anl_c_$bit(uchar code);              /* b0 */
219   virtual int inst_cpl_bit(uchar code);                 /* b2 */
220   virtual int inst_cpl_c(uchar code);                   /* b3 */
221   virtual int inst_cjne_a_$data_addr(uchar code);       /* b4 */
222   virtual int inst_cjne_a_addr_addr(uchar code);        /* b5 */
223   virtual int inst_cjne_$ri_$data_addr(uchar code);     /* b6,b7 */
224   virtual int inst_cjne_rn_$data_addr(uchar code);      /* b8-bf */
225   virtual int inst_push(uchar code);                    /* c0 */
226   virtual int inst_clr_bit(uchar code);                 /* c2 */
227   virtual int inst_clr_c(uchar code);                   /* c3*/
228   virtual int inst_swap(uchar code);                    /* c4 */
229   virtual int inst_xch_a_addr(uchar code);              /* c5 */
230   virtual int inst_xch_a_$ri(uchar code);               /* c6,c7 */
231   virtual int inst_xch_a_rn(uchar code);                /* c8-cf */
232   virtual int inst_pop(uchar code);                     /* d0 */
233   virtual int inst_setb_bit(uchar code);                /* d2 */
234   virtual int inst_setb_c(uchar code);                  /* d3 */
235   virtual int inst_da_a(uchar code);                    /* d4 */
236   virtual int inst_djnz_addr_addr(uchar code);          /* d5 */
237   virtual int inst_xchd_a_$ri(uchar code);              /* d6,d7 */
238   virtual int inst_djnz_rn_addr(uchar code);            /* d8-df */
239   virtual int inst_movx_a_$dptr(uchar code);            /* e0 */
240   virtual int inst_movx_a_$ri(uchar code);              /* e2,e3 */
241   virtual int inst_clr_a(uchar code);                   /* e4 */
242   virtual int inst_mov_a_addr(uchar code);              /* e5 */
243   virtual int inst_mov_a_$ri(uchar code);               /* e6,e7 */
244   virtual int inst_mov_a_rn(uchar code);                /* e8-ef */
245   virtual int inst_movx_$dptr_a(uchar code);            /* f0 */
246   virtual int inst_movx_$ri_a(uchar code);              /* f2,f3 */
247   virtual int inst_cpl_a(uchar code);                   /* f4 */
248   virtual int inst_mov_addr_a(uchar code);              /* f5 */
249   virtual int inst_mov_$ri_a(uchar code);               /* f6,f7 */
250   virtual int inst_mov_rn_a(uchar code);                /* f8-ff */
251 };
252
253
254 #endif
255
256 /* End of s51.src/uc51cl.h */