X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fs51.src%2Fpca.cc;h=b9eeef394d8f6a46988f7c834bb6592604d7206f;hb=90f4aedaef8a2310573eef905f95c671f84e5cde;hp=173893aa140d9fb0da9900ab2788e12aba792bcc;hpb=8c8f34ff4281a55d2f535335c02999246e9e12f2;p=fw%2Fsdcc diff --git a/sim/ucsim/s51.src/pca.cc b/sim/ucsim/s51.src/pca.cc index 173893aa..b9eeef39 100644 --- a/sim/ucsim/s51.src/pca.cc +++ b/sim/ucsim/s51.src/pca.cc @@ -47,10 +47,13 @@ cl_pca::cl_pca(class cl_uc *auc, int aid): int cl_pca::init(void) { - class cl_mem *sfr= uc->mem(MEM_SFR); - t_addr CCAPL[5]= {CCAPL[0], CCAPL[1], CCAPL[2], CCAPL[3], CCAPL[4]}; - t_addr CCAPH[5]= {CCAPH[0], CCAPH[1], CCAPH[2], CCAPH[3], CCAPH[4]}; - t_addr CCAPM[5]= {CCAPM[0], CCAPM[1], CCAPM[2], CCAPM[3], CCAPM[4]}; + sfr= uc->address_space(MEM_SFR_ID); + //t_addr CCAPL[5]= {CCAPL[0], CCAPL[1], CCAPL[2], CCAPL[3], CCAPL[4]}; + //t_addr CCAPH[5]= {CCAPH[0], CCAPH[1], CCAPH[2], CCAPH[3], CCAPH[4]}; + //t_addr CCAPM[5]= {CCAPM[0], CCAPM[1], CCAPM[2], CCAPM[3], CCAPM[4]}; + t_addr CCAPL[5]= {CCAP0L, CCAP1L, CCAP2L, CCAP3L, CCAP4L}; + t_addr CCAPH[5]= {CCAP0H, CCAP1H, CCAP2H, CCAP3H, CCAP4H}; + t_addr CCAPM[5]= {CCAPM0, CCAPM1, CCAPM2, CCAPM3, CCAPM4}; int i; if (!sfr) @@ -74,21 +77,21 @@ void cl_pca::added_to_uc(void) { uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCCF4, 0x0033, false, - "PCA module #4", 5)); + "PCA module #4", 5)); uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCCF3, 0x0033, false, - "PCA module #3", 5)); + "PCA module #3", 5)); uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCCF2, 0x0033, false, - "PCA module #2", 5)); + "PCA module #2", 5)); uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCCF1, 0x0033, false, - "PCA module #1", 5)); + "PCA module #1", 5)); uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCCF0, 0x0033, false, - "PCA module #0", 5)); + "PCA module #0", 5)); uc->it_sources->add_at(4, new cl_it_src(bmEC, CCON, bmCF, 0x0033, false, - "PCA counter", 5)); + "PCA counter", 5)); } void -cl_pca::write(class cl_cell *cell, t_mem *val) +cl_pca::write(class cl_memory_cell *cell, t_mem *val) { //uchar bmCEX[5]= {bmCEX0, bmCEX1, bmCEX2, bmCEX3, bmCEX4}; //uchar bmCCF[5]= {bmCCF0, bmCCF1, bmCCF2, bmCCF3, bmCCF4}; @@ -100,7 +103,7 @@ cl_pca::write(class cl_cell *cell, t_mem *val) bit_ECF = *val & bmECF; t_mem o= clk_source; if ((clk_source= *val & (bmCPS1|bmCPS0)) != o) - t0_overflows= ECI_edge= 0; + t0_overflows= ECI_edge= 0; } else if (cell == cell_ccon) { @@ -110,47 +113,47 @@ cl_pca::write(class cl_cell *cell, t_mem *val) { int i; for (i= 0; i < 5; i++) - { - if (cell == cell_ccapm[i]) - { - t_mem o= ccapm[i]; - ccapm[i]= *val & 0xff; - if (o != ccapm[i]) - cex_neg[i]= cex_pos[i]= DD_FALSE; - } - else - { - if (ccapm[i] & (bmMAT|bmTOG)) - { - if (cell == cell_ccapl[i]) - { - cell_ccapm[i]->set_bit0(bmECOM); - ccapm[i]= cell_ccapm[i]->get(); - } - else if (cell == cell_ccaph[i]) - { - cell_ccapm[i]->set_bit1(bmECOM); - ccapm[i]= cell_ccapm[i]->get(); - } - } - } - } + { + if (cell == cell_ccapm[i]) + { + t_mem o= ccapm[i]; + ccapm[i]= *val & 0xff; + if (o != ccapm[i]) + cex_neg[i]= cex_pos[i]= DD_FALSE; + } + else + { + if (ccapm[i] & (bmMAT|bmTOG)) + { + if (cell == cell_ccapl[i]) + { + cell_ccapm[i]->set_bit0(bmECOM); + ccapm[i]= cell_ccapm[i]->get(); + } + else if (cell == cell_ccaph[i]) + { + cell_ccapm[i]->set_bit1(bmECOM); + ccapm[i]= cell_ccapm[i]->get(); + } + } + } + } } } /*void -cl_pca::mem_cell_changed(class cl_mem *mem, t_addr addr) +cl_pca::mem_cell_changed(class cl_m *mem, t_addr addr) { - class cl_mem *sfr= uc->mem(MEM_SFR); + class cl_m *sfr= uc->mem(MEM_SFR); if (mem && sfr && mem == sfr) { if (addr == addr_ccapXl) - ccapXl= sfr->get_cell(addr_ccapXl); + ccapXl= sfr->get_cell(addr_ccapXl); else if (addr == addr_ccapXh) - ccapXh= sfr->get_cell(addr_ccapXh); + ccapXh= sfr->get_cell(addr_ccapXh); else if (addr == addr_ccapmX) - ccapmX= sfr->get_cell(addr_ccapmX); + ccapmX= sfr->get_cell(addr_ccapmX); } }*/ @@ -188,35 +191,33 @@ cl_pca::tick(int cycles) void cl_pca::do_pca_counter(int cycles) { - //class cl_mem *sfr= uc->mem(MEM_SFR); + //class cl_m *sfr= uc->mem(MEM_SFR); while (cycles--) { if (cell_cl->add(1) == 0) - { - int i; - for (i= 0; i < 5; i++) - if (ccapm[i] & bmPWM) - cell_ccapl[i]->set(cell_ccaph[i]->get()); - if (cell_ch->add(1) == 0) - { - // CH,CL overflow - cell_ccon->set_bit1(bmCF); - do_pca_module(0); - do_pca_module(1); - do_pca_module(2); - do_pca_module(3); - do_pca_module(4); - } - } + { + int i; + for (i= 0; i < 5; i++) + if (ccapm[i] & bmPWM) + cell_ccapl[i]->set(cell_ccaph[i]->get()); + if (cell_ch->add(1) == 0) + { + // CH,CL overflow + cell_ccon->set_bit1(bmCF); + do_pca_module(0); + do_pca_module(1); + do_pca_module(2); + do_pca_module(3); + do_pca_module(4); + } + } } } void cl_pca::do_pca_module(int nr) { - class cl_mem *sfr= uc->mem(MEM_SFR); - uchar bmCEX[5]= {bmCEX0, bmCEX1, bmCEX2, bmCEX3, bmCEX4}; uchar bmCCF[5]= {bmCCF0, bmCCF1, bmCCF2, bmCCF3, bmCCF4}; //uint p1= sfr->get(P1); @@ -246,33 +247,33 @@ cl_pca::do_pca_module(int nr) { // Comparator enabled if (cell_cl->get() == cell_ccapl[nr]->get() && - cell_ch->get() == cell_ccaph[nr]->get()) - { - // Match - if (nr == 4 && - (bit_WDTE)) - { - reset(); - return; - } - cell_ccon->set_bit1(bmCCF[nr]); - if (ccapm[nr] & bmTOG) - { - // Toggle - sfr->set(P1, sfr->get(P1) ^ bmCEX[nr]); - } - } + cell_ch->get() == cell_ccaph[nr]->get()) + { + // Match + if (nr == 4 && + (bit_WDTE)) + { + reset(); + return; + } + cell_ccon->set_bit1(bmCCF[nr]); + if (ccapm[nr] & bmTOG) + { + // Toggle + sfr->set(P1, sfr->get(P1) ^ bmCEX[nr]); + } + } if (ccapm[nr] & bmPWM) - { - // PWM - /*if (cell_cl->get() == 0) - cell_ccapl[nr]->set(cell_ccaph[nr]->get());*/ - if (cell_cl->get() < cell_ccapl[nr]->get()) - //sfr->set(P1, sfr->get(P1) & ~(bmCEX[nr])); - sfr->set_bit1(P1, bmCEX[nr]); - else - sfr->set_bit1(P1, bmCEX[nr]); - } + { + // PWM + /*if (cell_cl->get() == 0) + cell_ccapl[nr]->set(cell_ccaph[nr]->get());*/ + if (cell_cl->get() < cell_ccapl[nr]->get()) + //sfr->set(P1, sfr->get(P1) & ~(bmCEX[nr])); + sfr->set_bit1(P1, bmCEX[nr]); + else + sfr->set_bit1(P1, bmCEX[nr]); + } } } @@ -297,22 +298,22 @@ cl_pca::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 & bmECI) && - (p1o & bmECI)) - ECI_edge++; + (p1o & bmECI)) + ECI_edge++; int i; for (i= 0; i < 5; i++) - { - if (!(p1n & bmCEX[i]) && - (p1o & bmCEX[i])) - cex_neg[i]= DD_TRUE; - else if ((p1n & bmCEX[i]) && - !(p1o & bmCEX[i])) - cex_pos[i]= DD_TRUE; - } + { + if (!(p1n & bmCEX[i]) && + (p1o & bmCEX[i])) + cex_neg[i]= DD_TRUE; + else if ((p1n & bmCEX[i]) && + !(p1o & bmCEX[i])) + cex_pos[i]= DD_TRUE; + } } else if (where->cathegory == HW_TIMER && - he == EV_OVERFLOW && - where->id == 0) + he == EV_OVERFLOW && + where->id == 0) { t0_overflows++; } @@ -320,7 +321,7 @@ cl_pca::happen(class cl_hw *where, enum hw_event he, void *params) void -cl_pca::print_info(class cl_console *con) +cl_pca::print_info(class cl_console_base *con) { con->dd_printf("%s[%d] FIXME\n", id_string, id); }