2 * Simulator of microcontrollers (mov.cc)
4 * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
6 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
10 /* This file is part of microcontroller simulator: ucsim.
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.
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.
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
28 /* Bugs fixed by Sandeep Dutta:
29 * source<->dest bug in "mov direct,direct"
30 * get register in "mov @ri,address"
46 * 0x74 2 12 MOV A,#data
47 *____________________________________________________________________________
52 t_uc51::inst_mov_a_$data(uchar code)
54 sfr->set(event_at.ws= ACC, fetch());
60 * 0x75 3 24 MOV addr,#data
61 *____________________________________________________________________________
66 t_uc51::inst_mov_addr_$data(uchar code)
70 addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
79 * 0x76-0x77 2 12 MOV @Ri,#data
80 *____________________________________________________________________________
85 t_uc51::inst_mov_$ri_$data(uchar code)
90 addr= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
98 * 0x78-0x7f 2 12 MOV Rn,#data
99 *____________________________________________________________________________
104 t_uc51::inst_mov_rn_$data(uchar code)
108 reg= get_reg(code & 0x07, &event_at.wi);
115 * 0x93 1 24 MOVC A,@A+DPTR
116 *____________________________________________________________________________
121 t_uc51::inst_movc_a_$a_pc(uchar code)
123 //SFR[ACC]= EROM[event_at.rc= (PC + SFR[ACC]) & (EROM_SIZE - 1)];
125 mem(MEM_ROM)->get(event_at.rc=
126 (PC + sfr->get(ACC)))&(EROM_SIZE - 1));
133 * 0x85 3 24 MOV addr,addr
134 *____________________________________________________________________________
139 t_uc51::inst_mov_addr_addr(uchar code)
143 /* SD reversed s & d here */
144 s= get_direct(fetch(), &event_at.ri, &event_at.rs);
145 d= get_direct(fetch(), &event_at.wi, &event_at.ws);
154 * 0x86-0x87 2 24 MOV addr,@Ri
155 *____________________________________________________________________________
160 t_uc51::inst_mov_addr_$ri(uchar code)
165 d= get_direct(fetch(), &event_at.wi, &event_at.ws);
166 s= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
175 * 0x88-0x8f 2 24 MOV addr,Rn
176 *____________________________________________________________________________
181 t_uc51::inst_mov_addr_rn(uchar code)
185 addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
186 (*addr)= *(get_reg(code & 0x07, &event_at.ri));
194 * 0x90 3 24 MOV DPTR,#data
195 *____________________________________________________________________________
200 t_uc51::inst_mov_dptr_$data(uchar code)
202 sfr->set(event_at.ws= DPH, fetch());
203 sfr->set(DPL, fetch());
210 * 0x93 1 24 MOVC A,@A+DPTR
211 *____________________________________________________________________________
216 t_uc51::inst_movc_a_$a_dptr(uchar code)
218 //SFR[ACC]= EROM[event_at.rc= (SFR[DPH]*256+SFR[DPL]+SFR[ACC])&(EROM_SIZE-1)];
219 sfr->set(ACC, get_mem(MEM_ROM, event_at.rc=
220 (sfr->get(DPH)*256+sfr->get(DPL) +
221 sfr->get(ACC)) & (EROM_SIZE-1)));
228 * 0xa6-0xa7 2 24 MOV @Ri,addr
229 *____________________________________________________________________________
234 t_uc51::inst_mov_$ri_addr(uchar code)
239 d= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
240 s= get_direct(fetch(), &event_at.ri, &event_at.rs);
248 * 0xa8-0xaf 2 24 MOV Rn,addr
249 *____________________________________________________________________________
254 t_uc51::inst_mov_rn_addr(uchar code)
258 reg = get_reg(code & 0x07, &event_at.wi);
259 addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
267 * 0xc0 2 24 PUSH addr
268 *____________________________________________________________________________
273 t_uc51::inst_push(uchar code)
278 addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
280 sp= get_indirect(sfr->get(SP), &res);
290 * 0xc5 2 12 XCH A,addr
291 *____________________________________________________________________________
296 t_uc51::inst_xch_a_addr(uchar code)
300 addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
302 sfr->set(event_at.ws= ACC, read(addr));
310 * 0xc6-0xc7 1 12 XCH A,@Ri
311 *____________________________________________________________________________
316 t_uc51::inst_xch_a_$ri(uchar code)
321 addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
323 sfr->set(event_at.ws= ACC, *addr);
330 * 0xc8-0xcf 1 12 XCH A,Rn
331 *____________________________________________________________________________
336 t_uc51::inst_xch_a_rn(uchar code)
340 reg = get_reg(code & 0x07, &event_at.ri);
342 sfr->set(event_at.wi= ACC, *reg);
350 *____________________________________________________________________________
355 t_uc51::inst_pop(uchar code)
360 addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
361 sp= get_indirect(get_mem(MEM_SFR, SP), &res);
373 * 0xd6-0xd7 1 12 XCHD A,@Ri
374 *____________________________________________________________________________
379 t_uc51::inst_xchd_a_$ri(uchar code)
384 addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
386 (*addr) = (*addr & 0xf0) | (sfr->get(ACC) & 0x0f);
387 sfr->set(event_at.ws= ACC, (sfr->get(ACC) & 0xf0) | temp);
393 * 0xe0 1 24 MOVX A,@DPTR
394 *____________________________________________________________________________
399 t_uc51::inst_movx_a_$dptr(uchar code)
401 sfr->set(event_at.ws= ACC,
402 get_mem(MEM_XRAM, event_at.rx=sfr->get(DPH)*256+sfr->get(DPL)));
409 * 0xe2-0xe3 1 24 MOVX A,@Ri
410 *____________________________________________________________________________
415 t_uc51::inst_movx_a_$ri(uchar code)
419 addr= get_reg(code & 0x01);
420 sfr->set(event_at.ws= ACC,
422 event_at.rx= (sfr->get(P2)&port_pins[2])*256+*addr));
429 * 0xe5 2 12 MOV A,addr
430 *____________________________________________________________________________
435 t_uc51::inst_mov_a_addr(uchar code)
439 addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
440 sfr->set(event_at.ws= ACC, read(addr));
446 * 0xe6-0xe7 1 12 MOV A,@Ri
447 *____________________________________________________________________________
452 t_uc51::inst_mov_a_$ri(uchar code)
457 addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
458 sfr->set(event_at.ws= ACC, *addr);
464 * 0xe8-0xef 1 12 MOV A,Rn
465 *____________________________________________________________________________
470 t_uc51::inst_mov_a_rn(uchar code)
472 sfr->set(event_at.ws= ACC, *(get_reg(code & 0x07, &event_at.ri)));
478 * 0xf0 1 24 MOVX @DPTR,A
479 *____________________________________________________________________________
484 t_uc51::inst_movx_$dptr_a(uchar code)
486 set_mem(MEM_XRAM, event_at.wx= sfr->get(DPH)*256+sfr->get(DPL),
487 sfr->get(event_at.rs= ACC));
493 * 0xf2-0xf3 1 24 MOVX @Ri,A
494 *____________________________________________________________________________
499 t_uc51::inst_movx_$ri_a(uchar code)
503 addr= get_reg(code & 0x01);
505 event_at.wx= (sfr->get(P2) & port_pins[2])*256 + *addr,
513 * 0xf5 2 12 MOV addr,A
514 *____________________________________________________________________________
519 t_uc51::inst_mov_addr_a(uchar code)
523 addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
524 (*addr)= sfr->get(event_at.rs= ACC);
531 * 0xf6-0xf7 1 12 MOV @Ri,A
532 *____________________________________________________________________________
537 t_uc51::inst_mov_$ri_a(uchar code)
542 addr= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
543 (*addr)= sfr->get(event_at.rs= ACC);
549 * 0xf8-0xff 1 12 MOV Rn,A
550 *____________________________________________________________________________
555 t_uc51::inst_mov_rn_a(uchar code)
559 reg= get_reg(code &0x07, &event_at.wi);
560 (*reg)= sfr->get(event_at.rs= ACC);
565 /* End of s51.src/mov.cc */