1 /*
2  * Simulator of microcontrollers (s51.src/mducl.h)
3  *
4  * Copyright (C) 2016,16 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 MDUCL_HEADER
29 #define MDUCL_HEADER
30 
31 #include "hwcl.h"
32 
33 
34 class cl_mdu: public cl_hw
35 {
36  protected:
37   u8_t v[6]; // values written to MDx data regs
38   class cl_memory_cell *regs[6]; // result (MRx in xc88x)
39   class cl_memory_cell *con; // CONTROL register
40  public:
41   cl_mdu(class cl_uc *auc, int aid);
42 
43   virtual void op_32udiv16(void);
44   virtual void op_16udiv16(void);
45   virtual void op_16umul16(void);
46   virtual void op_norm(void);
47   virtual void op_lshift(void);
48 
dir_right(void)49   virtual bool dir_right(void) { return false; }
set_steps(int steps)50   virtual void set_steps(int steps) {}
get_steps(void)51   virtual int get_steps(void) { return 0; }
set_ovr(bool val)52   virtual void set_ovr(bool val) {}
set_err(bool val)53   virtual void set_err(bool val) {}
54 };
55 
56 class cl_mdu517: public cl_mdu
57 {
58  protected:
59   u64_t writes;
60   int nuof_writes;
61   //bool calcing;
62  public:
63   cl_mdu517(class cl_uc *auc, int aid);
64   virtual int init(void);
65 
66   virtual t_mem read(class cl_memory_cell *cell);
67   virtual void write(class cl_memory_cell *cell, t_mem *val);
68   virtual t_mem conf_op(cl_memory_cell *cell, t_addr addr, t_mem *val);
69 
70   virtual bool dir_right(void);
71   virtual void set_steps(int steps);
72   virtual int get_steps(void);
73   virtual void set_ovr(bool val);
74   virtual void set_err(bool val);
75 };
76 
77 class cl_mdu88x: public cl_mdu
78 {
79  protected:
80   class cl_memory_cell *stat; // STATUS register
81   int ticks; // ticks to count down
82  public:
83   cl_mdu88x(class cl_uc *auc, int aid);
84   virtual int init(void);
85 
86   virtual t_mem read(class cl_memory_cell *cell);
87   virtual void write(class cl_memory_cell *cell, t_mem *val);
88   virtual t_mem conf_op(cl_memory_cell *cell, t_addr addr, t_mem *val);
89 
90   virtual int tick(int cycles);
91 
92   virtual void op_32sdiv16(void);
93   virtual void op_16sdiv16(void);
94   virtual void op_16smul16(void);
95   virtual void op_ashift(void);
96 
97   virtual bool dir_right(void);
98   virtual void set_steps(int steps);
99   virtual int get_steps(void);
100   virtual void set_ovr(bool val);
101   virtual void set_err(bool val);
102   virtual void set_bsy(bool val);
103   virtual bool busy(void);
104 };
105 
106 
107 #endif
108 
109 /* End of s51.src/mducl.h */
110