2 * Simulator of microcontrollers (jmp.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 * relative<->absolute jump in "jmp @a+dptr"
43 * 0x[02468ace]1 2 24 AJMP addr
44 *____________________________________________________________________________
49 t_uc51::inst_ajmp_addr(uchar code)
53 h= (code >> 5) & 0x07;
56 PC= (PC & 0xf800) | (h*256 + l);
62 * 0x10 3 12 JBC bit,addr
63 *____________________________________________________________________________
68 t_uc51::inst_jbc_bit_addr(uchar code)
70 uchar bitaddr, *addr, jaddr;
74 addr = get_bit(bitaddr, &event_at.ri, &event_at.rs);
75 if (*addr & BIT_MASK(bitaddr))
77 (*addr)&= ~BIT_MASK(bitaddr);
78 PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
87 *____________________________________________________________________________
92 t_uc51::inst_ljmp(uchar code)
94 PC= fetch()*256 + fetch();
101 * 0x[13579bdf]1 2 24 ACALL addr
102 *____________________________________________________________________________
107 t_uc51::inst_acall_addr(uchar code)
109 uchar h, l, *sp, *aof_SP;
112 h= (code >> 5) & 0x07;
114 aof_SP= &((sfr->umem8)[SP]);
115 //MEM(MEM_SFR)[SP]++;
117 proc_write_sp(*aof_SP);
118 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
121 (*sp)= PC & 0xff; // push low byte
124 //MEM(MEM_SFR)[SP]++;
126 proc_write_sp(*aof_SP);
127 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
130 (*sp)= (PC >> 8) & 0xff; // push high byte
131 PC= (PC & 0xf800) | (h*256 + l);
137 * 0x12 3 24 LCALL addr
138 *____________________________________________________________________________
143 t_uc51::inst_lcall(uchar code, uint addr)
145 uchar h= 0, l= 0, *sp, *aof_SP;
153 aof_SP= &((sfr->umem8)[SP]);
154 //MEM(MEM_SFR)[SP]++;
156 proc_write_sp(*aof_SP);
157 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
160 (*sp)= PC & 0xff; // push low byte
164 //MEM(MEM_SFR)[SP]++;
166 proc_write_sp(*aof_SP);
167 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
170 (*sp)= (PC >> 8) & 0xff; // push high byte
180 * 0x20 3 24 JB bit,addr
181 *____________________________________________________________________________
186 t_uc51::inst_jb_bit_addr(uchar code)
188 uchar *addr, bitaddr, jaddr;
190 addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
193 if (read(addr) & BIT_MASK(bitaddr))
194 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
201 *____________________________________________________________________________
206 t_uc51::inst_ret(uchar code)
208 uchar h, l, *sp, *aof_SP;
211 aof_SP= &((sfr->umem8)[SP]);
212 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
216 //MEM(MEM_SFR)[SP]--;
218 proc_write_sp(*aof_SP);
221 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
225 //MEM(MEM_SFR)[SP]--;
227 proc_write_sp(*aof_SP);
234 * 0x30 3 24 JNB bit,addr
235 *____________________________________________________________________________
240 t_uc51::inst_jnb_bit_addr(uchar code)
242 uchar *addr, bitaddr, jaddr;
244 addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
247 if (!(read(addr) & BIT_MASK(bitaddr)))
248 PC= (PC + (signed char)jaddr) & (get_mem_size(MEM_ROM)-1);
255 *____________________________________________________________________________
260 t_uc51::inst_reti(uchar code)
262 uchar h, l, *sp, *aof_SP;
265 aof_SP= &((sfr->umem8)[SP]);
266 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
270 //MEM(MEM_SFR)[SP]--;
272 proc_write_sp(*aof_SP);
275 sp= get_indirect(*aof_SP/*sfr->get(SP)*/, &res);
279 //MEM(MEM_SFR)[SP]--;
281 proc_write_sp(*aof_SP);
285 class it_level *il= (class it_level *)(it_levels->top());
289 il= (class it_level *)(it_levels->pop());
298 *____________________________________________________________________________
303 t_uc51::inst_jc_addr(uchar code)
310 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
318 *____________________________________________________________________________
323 t_uc51::inst_jnc_addr(uchar code)
330 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
338 *____________________________________________________________________________
343 t_uc51::inst_jz_addr(uchar code)
350 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
357 *____________________________________________________________________________
362 t_uc51::inst_jnz_addr(uchar code)
369 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
375 * 0x73 1 24 JMP @A+DPTR
376 *____________________________________________________________________________
381 t_uc51::inst_jmp_$a_dptr(uchar code)
383 PC= (sfr->get(DPH)*256 + sfr->get(DPL) +
384 read_mem(MEM_SFR, ACC)) &
392 * 0x80 2 24 SJMP addr
393 *____________________________________________________________________________
398 t_uc51::inst_sjmp(uchar code)
400 signed char target= fetch();
401 PC= (PC + target) & (EROM_SIZE -1);
408 * 0xb4 3 24 CJNE A,#data,addr
409 *____________________________________________________________________________
414 t_uc51::inst_cjne_a_$data_addr(uchar code)
421 SET_C(sfr->get(ACC) < data);
422 if (read_mem(MEM_SFR, event_at.rs= ACC) != data)
423 PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
429 * 0xb5 3 24 CJNE A,addr,addr
430 *____________________________________________________________________________
435 t_uc51::inst_cjne_a_addr_addr(uchar code)
437 uchar data, *addr, jaddr;
439 addr = get_direct(fetch(), &event_at.ri, &event_at.rs);
443 SET_C(sfr->get(ACC) < data);
444 if (sfr->get(event_at.rs= ACC) != data)
445 PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
451 * 0xb6-0xb7 3 24 CJNE @Ri,#data,addr
452 *____________________________________________________________________________
457 t_uc51::inst_cjne_$ri_$data_addr(uchar code)
459 uchar *addr, data, jaddr;
462 addr = get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
468 PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
474 * 0xb8-0xbf 3 24 CJNE Rn,#data,addr
475 *____________________________________________________________________________
480 t_uc51::inst_cjne_rn_$data_addr(uchar code)
482 uchar *reg, data, jaddr;
484 reg = get_reg(code & 0x07, &event_at.ri);
490 PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
496 * 0xd5 3 24 DJNZ addr,addr
497 *____________________________________________________________________________
502 t_uc51::inst_djnz_addr_addr(uchar code)
506 addr = get_direct(fetch(), &event_at.wi, &event_at.ws);
510 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
516 * 0xd8-0xdf 2 24 DJNZ Rn,addr
517 *____________________________________________________________________________
522 t_uc51::inst_djnz_rn_addr(uchar code)
526 reg = get_reg(code & 0x07, &event_at.wi);
530 PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
535 /* End of s51.src/jmp.cc */