ucsim-0.2.37-pre3 into cvs
[fw/sdcc] / sim / ucsim / s51.src / bit.cc
1 /*
2  * Simulator of microcontrollers (bit.cc)
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 #include "ddconfig.h"
29
30 // local
31 #include "uc51cl.h"
32 #include "regs51.h"
33
34
35 /*
36  * 0x72 2 24 ORL C,bit
37  *____________________________________________________________________________
38  *
39  */
40
41 int
42 t_uc51::inst_orl_c_bit(uchar code)
43 {
44   uchar *addr, bitaddr;
45
46   addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
47   SET_C(GET_C ||
48         (read(addr) & BIT_MASK(bitaddr)));
49   event_at.ws= PSW;
50   tick(1);
51   return(resGO);
52 }
53
54
55 /*
56  * 0x82 2 24 ANL C,bit
57  *____________________________________________________________________________
58  *
59  */
60
61 int
62 t_uc51::inst_anl_c_bit(uchar code)
63 {
64   uchar *addr, bitaddr;
65
66   addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
67   SET_C(GET_C &&
68         (read(addr) & BIT_MASK(bitaddr)));
69   event_at.ws= PSW;
70   tick(1);
71   return(resGO);
72 }
73
74
75 /*
76  * 0x92 2 24 MOV bit,C
77  *____________________________________________________________________________
78  *
79  */
80
81 int
82 t_uc51::inst_mov_bit_c(uchar code)
83 {
84   uchar *addr, bitaddr;
85
86   addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
87   if (GET_C)
88     (*addr)|= BIT_MASK(bitaddr);
89   else
90     (*addr)&= ~BIT_MASK(bitaddr);
91   event_at.rs= PSW;
92   proc_write(addr);
93   tick(1);
94   return(resGO);
95 }
96
97
98 /*
99  * 0xa2 2 12 MOV C,bit
100  *____________________________________________________________________________
101  *
102  */
103
104 int
105 t_uc51::inst_mov_c_bit(uchar code)
106 {
107   uchar *addr, bitaddr;
108
109   addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
110   SET_C(read(addr) & BIT_MASK(bitaddr));
111   event_at.ws= PSW;
112   return(resGO);
113 }
114
115
116 /*
117  * 0xb0 2 24 ANL C,/bit
118  *____________________________________________________________________________
119  *
120  */
121
122 int
123 t_uc51::inst_anl_c_$bit(uchar code)
124 {
125   uchar *addr, bitaddr;
126
127   addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
128   SET_C(GET_C &&
129         !(read(addr) & BIT_MASK(bitaddr)));
130   event_at.ws= PSW;
131   tick(1);
132   return(resGO);
133 }
134
135
136 /*
137  * 0xb2 2 12 CPL bit
138  *____________________________________________________________________________
139  *
140  */
141
142 int
143 t_uc51::inst_cpl_bit(uchar code)
144 {
145   uchar *addr, bitaddr;
146
147   addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
148   (*addr)^= BIT_MASK(bitaddr);
149   proc_write(addr);
150   return(resGO);
151 }
152
153
154 /*
155  * 0xb3 1 12 CPL C
156  *____________________________________________________________________________
157  *
158  */
159
160 int
161 t_uc51::inst_cpl_c(uchar code)
162 {
163   sfr->set(PSW, sfr->get(PSW) ^ bmCY);
164   event_at.ws= PSW;
165   return(resGO);
166 }
167
168
169 /*
170  * 0xc2 2 12 CLR bit
171  *____________________________________________________________________________
172  *
173  */
174
175 int
176 t_uc51::inst_clr_bit(uchar code)
177 {
178   uchar *addr, bitaddr;
179
180   addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
181   (*addr)&= ~BIT_MASK(bitaddr);
182   proc_write(addr);
183   return(resGO);
184 }
185
186
187 /*
188  * 0xc3 1 12 CLR C
189  *____________________________________________________________________________
190  *
191  */
192
193 int
194 t_uc51::inst_clr_c(uchar code)
195 {
196   sfr->set(PSW, sfr->get(PSW) & ~bmCY);
197   event_at.ws= PSW;
198   return(resGO);
199 }
200
201
202 /*
203  * 0xd2 2 12 SETB bit
204  *____________________________________________________________________________
205  *
206  */
207
208 int
209 t_uc51::inst_setb_bit(uchar code)
210 {
211   uchar *addr, bitaddr;
212
213   addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
214   (*addr)|= BIT_MASK(bitaddr);
215   proc_write(addr);
216   return(resGO);
217 }
218
219
220 /*
221  * 0xd3 1 12 SETB C
222  *____________________________________________________________________________
223  *
224  */
225
226 int
227 t_uc51::inst_setb_c(uchar code)
228 {
229   sfr->set(PSW, sfr->get(PSW) | bmCY);
230   event_at.ws= PSW;
231   return(resGO);
232 }
233
234
235 /* End of s51.src/bit.cc */