X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fs51.src%2Ftimer2.cc;h=a238179f93d30bc322524b94e4d50e5bb83328cd;hb=90f4aedaef8a2310573eef905f95c671f84e5cde;hp=ea2ab95f23d162f073a02730deb1ef7f8c8b955f;hpb=8c8f34ff4281a55d2f535335c02999246e9e12f2;p=fw%2Fsdcc diff --git a/sim/ucsim/s51.src/timer2.cc b/sim/ucsim/s51.src/timer2.cc index ea2ab95f..a238179f 100644 --- a/sim/ucsim/s51.src/timer2.cc +++ b/sim/ucsim/s51.src/timer2.cc @@ -31,7 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA cl_timer2::cl_timer2(class cl_uc *auc, int aid, char *aid_string, - int afeatures): + int afeatures): cl_timer0(auc, /*2*/aid, /*"timer2"*/aid_string) { features= afeatures; @@ -40,8 +40,12 @@ cl_timer2::cl_timer2(class cl_uc *auc, int aid, char *aid_string, mask_TCLK= bmTCLK; mask_CP_RL2= bmCP_RL2; make_partner(HW_UART, 0); + sfr= uc->address_space(MEM_SFR_ID); if (features & (t2_down|t2_clock_out)) - register_cell(uc->mem(MEM_SFR), T2MOD, &cell_t2mod, wtd_restore_write); + { + register_cell(sfr, T2MOD, &cell_t2mod, + wtd_restore_write); + } } int @@ -50,9 +54,10 @@ cl_timer2::init(void) cl_timer0::init(); //cell_rcap2l= uc->mem(MEM_SFR)->get_cell(RCAP2L); //cell_rcap2h= uc->mem(MEM_SFR)->get_cell(RCAP2H); - use_cell(uc->mem(MEM_SFR), RCAP2L, &cell_rcap2l, wtd_restore); - use_cell(uc->mem(MEM_SFR), RCAP2H, &cell_rcap2h, wtd_restore); - bit_t2ex= uc->read_mem(MEM_SFR, P1) & bmT2EX; + use_cell(sfr, RCAP2L, &cell_rcap2l, wtd_restore); + use_cell(sfr, RCAP2H, &cell_rcap2h, wtd_restore); + if (sfr) + bit_t2ex= sfr->read(P1) & bmT2EX; return(0); } @@ -60,9 +65,9 @@ void cl_timer2::added_to_uc(void) { uc->it_sources->add(new cl_it_src(bmET2, T2CON, bmTF2, 0x002b, false, - "timer #2 TF2", 7)); + "timer #2 TF2", 7)); exf2it= new cl_it_src(bmET2, T2CON, bmEXF2, 0x002b, false, - "timer #2 EXF2", 7); + "timer #2 EXF2", 7); uc->it_sources->add(exf2it); } @@ -75,20 +80,20 @@ cl_timer2::mem_cell_changed(class cl_mem *mem, t_addr addr) if (mem && sfr && mem == sfr) { switch (addr) - { - case T2CON: - c= cell_tcon= sfr->get_cell(T2CON); - break; - } + { + case T2CON: + c= cell_tcon= sfr->get_cell(T2CON); + break; + } if (c) - { - t_mem d= c->get(); - write(c, &d); - } + { + t_mem d= c->get(); + write(c, &d); + } if (addr == addr_tl) - cell_tl= sfr->get_cell(addr_tl); + cell_tl= sfr->get_cell(addr_tl); if (addr == addr_th) - cell_th= sfr->get_cell(addr_th); + cell_th= sfr->get_cell(addr_th); cell_rcap2l= sfr->get_cell(RCAP2L); cell_rcap2h= sfr->get_cell(RCAP2H); } @@ -102,7 +107,7 @@ cl_timer2::added(class cl_hw *new_hw) }*/ void -cl_timer2::write(class cl_cell *cell, t_mem *val) +cl_timer2::write(class cl_memory_cell *cell, t_mem *val) { int oldmode= mode; bool oldtr= TR; @@ -118,33 +123,33 @@ cl_timer2::write(class cl_cell *cell, t_mem *val) CP_RL2= *val & mask_CP_RL2; EXEN2 = *val & bmEXEN2; if (!(RCLK || TCLK) && - !CP_RL2) - mode= T2MODE_RELOAD; + !CP_RL2) + mode= T2MODE_RELOAD; else if (!(RCLK || TCLK) && - CP_RL2) - mode= T2MODE_CAPTURE; + CP_RL2) + mode= T2MODE_CAPTURE; else if (RCLK || TCLK) - mode= T2MODE_BAUDRATE; + mode= T2MODE_BAUDRATE; else - mode= T2MODE_OFF; + mode= T2MODE_OFF; if (mode != oldmode) - inform_partners(EV_T2_MODE_CHANGED, val); + inform_partners(EV_T2_MODE_CHANGED, val); } else if (cell == cell_t2mod) { bit_dcen= (*val & bmDCEN) != 0; bit_t2oe= (*val & bmT2OE) != 0; if ((features & t2_down) && - bit_dcen && - mode == T2MODE_RELOAD) - { - mode= T2MODE_DOWN; - if (exf2it) - exf2it->deactivate(); - } + bit_dcen && + mode == T2MODE_RELOAD) + { + mode= T2MODE_DOWN; + if (exf2it) + exf2it->deactivate(); + } if ((features & t2_clock_out) && - bit_t2oe) - mode= T2MODE_CLKOUT; + bit_t2oe) + mode= T2MODE_CLKOUT; } if (mode != oldmode || TR && !oldtr || @@ -202,12 +207,12 @@ cl_timer2::do_t2_baud(int cycles) while (cycles--) { if (!cell_tl->add(1)) - if (!cell_th->add(1)) - { - cell_th->set(cell_rcap2h->get()); - cell_tl->set(cell_rcap2l->get()); - inform_partners(EV_OVERFLOW, 0); - } + if (!cell_th->add(1)) + { + cell_th->set(cell_rcap2h->get()); + cell_tl->set(cell_rcap2l->get()); + inform_partners(EV_OVERFLOW, 0); + } } return(resGO); } @@ -237,7 +242,7 @@ cl_timer2::do_t2_capture(int cycles) if (!cell_tl->add(1)) { if (!cell_th->add(1)) - cell_tcon->set_bit1(bmTF2); + cell_tcon->set_bit1(bmTF2); } } @@ -266,11 +271,11 @@ cl_timer2::do_t2_reload(int cycles) if (!cell_tl->add(1)) { if (!cell_th->add(1)) - { - cell_tcon->set_bit1(mask_TF); - cell_th->set(cell_rcap2h->get()); - cell_tl->set(cell_rcap2l->get()); - } + { + cell_tcon->set_bit1(mask_TF); + cell_th->set(cell_rcap2h->get()); + cell_tl->set(cell_rcap2l->get()); + } } } @@ -289,37 +294,39 @@ cl_timer2::do_t2_down(int cycles) // UP while (cycles--) if (!cell_tl->add(1)) - { - if (!cell_th->add(1)) - { - cell_tcon->set_bit1(mask_TF); - cell_th->set(cell_rcap2h->get()); - cell_tl->set(cell_rcap2l->get()); - toggle= DD_TRUE; - } - } + { + if (!cell_th->add(1)) + { + cell_tcon->set_bit1(mask_TF); + cell_th->set(cell_rcap2h->get()); + cell_tl->set(cell_rcap2l->get()); + toggle= DD_TRUE; + } + } else // DOWN while (cycles--) { - t_mem l, h; - if ((l= cell_tl->add(-1)) == 0xff) - h= cell_th->add(-1); - else - h= cell_th->get(); - if ((TYPE_UWORD)(h*256+l) < - (TYPE_UWORD)(cell_rcap2h->get()*256+cell_rcap2l->get())) - { - cell_tcon->set_bit1(mask_TF); - cell_th->set(0xff); - cell_tl->set(0xff); - toggle= DD_TRUE; - } + t_mem l, h; + if ((l= cell_tl->add(-1)) == 0xff) + h= cell_th->add(-1); + else + h= cell_th->get(); + if ((TYPE_UWORD)(h*256+l) < + (TYPE_UWORD)(cell_rcap2h->get()*256+cell_rcap2l->get())) + { + cell_tcon->set_bit1(mask_TF); + cell_th->set(0xff); + cell_tl->set(0xff); + toggle= DD_TRUE; + } } - if (toggle) + if (toggle && + sfr) { - class cl_cell *p1= uc->mem(MEM_SFR)->get_cell(P1); - p1->set(p1->get() ^ bmEXF2); + class cl_memory_cell *p1= sfr->get_cell(P1); + if (p1) + p1->set(p1->get() ^ bmEXF2); } } @@ -343,18 +350,20 @@ cl_timer2::do_t2_clock_out(int cycles) while (cycles--) { if (!cell_tl->add(1)) - if (!cell_th->add(1)) - { - cell_th->set(cell_rcap2h->get()); - cell_tl->set(cell_rcap2l->get()); - inform_partners(EV_OVERFLOW, 0); - if (!C_T) - { - // toggle T2 on P1 - class cl_cell *p1= uc->mem(MEM_SFR)->get_cell(P1); - p1->set(p1->get() ^ bmT2); - } - } + if (!cell_th->add(1)) + { + cell_th->set(cell_rcap2h->get()); + cell_tl->set(cell_rcap2l->get()); + inform_partners(EV_OVERFLOW, 0); + if (!C_T && + sfr) + { + // toggle T2 on P1 + class cl_memory_cell *p1= sfr->get_cell(P1); + if (p1) + p1->set(p1->get() ^ bmT2); + } + } } } @@ -370,38 +379,38 @@ cl_timer2::happen(class cl_hw *where, enum hw_event he, void *params) t_mem p1n= ep->new_pins & ep->new_value; t_mem p1o= ep->pins & ep->prev_value; if (!(p1n & mask_T) && - (p1o & mask_T)) - T_edge++; + (p1o & mask_T)) + T_edge++; if (!(p1n & bmT2EX) && - (p1o & bmT2EX)) - t2ex_edge++; + (p1o & bmT2EX)) + t2ex_edge++; bit_t2ex= p1n & bmT2EX; } } void -cl_timer2::print_info(class cl_console *con) +cl_timer2::print_info(class cl_console_base *con) { int t2con= cell_tcon->get(); con->dd_printf("%s[%d] 0x%04x", id_string, id, - 256*cell_th->get()+cell_tl->get()); + 256*cell_th->get()+cell_tl->get()); if (RCLK || TCLK) { con->dd_printf(" baud"); if (RCLK) - con->dd_printf(" RCLK"); + con->dd_printf(" RCLK"); if (TCLK) - con->dd_printf(" TCLK"); + con->dd_printf(" TCLK"); } else con->dd_printf(" %s", (CP_RL2)?"capture":"reload"); con->dd_printf(" 0x%04x", - 256*cell_rcap2h->get()+cell_rcap2l->get()); + 256*cell_rcap2h->get()+cell_rcap2l->get()); con->dd_printf(" %s", (C_T)?"counter":"timer"); con->dd_printf(" %s", (TR)?"ON":"OFF"); con->dd_printf(" irq=%c", (t2con&bmTF2)?'1':'0'); - con->dd_printf(" %s", (uc->get_mem(MEM_SFR, IE)&bmET2)?"en":"dis"); + con->dd_printf(" %s", sfr?"?":((sfr->get(IE)&bmET2)?"en":"dis")); con->dd_printf(" prio=%d", uc->it_priority(bmPT2)); con->dd_printf("\n"); }