summaryrefslogtreecommitdiff
path: root/sim/ucsim/stm8.src/timer.cc
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/stm8.src/timer.cc
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/stm8.src/timer.cc')
-rw-r--r--sim/ucsim/stm8.src/timer.cc1435
1 files changed, 1435 insertions, 0 deletions
diff --git a/sim/ucsim/stm8.src/timer.cc b/sim/ucsim/stm8.src/timer.cc
new file mode 100644
index 0000000..ad511c2
--- /dev/null
+++ b/sim/ucsim/stm8.src/timer.cc
@@ -0,0 +1,1435 @@
+/*
+ * Simulator of microcontrollers (stm8.src/timer.cc)
+ *
+ * Copyright (C) 2016,16 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "itsrccl.h"
+
+#include "clkcl.h"
+#include "timercl.h"
+
+
+enum tim_cr1_bits {
+ cen = 0x01,
+ udis = 0x02,
+ urs = 0x04,
+ opm = 0x08,
+ dir = 0x10,
+ cms = 0x60,
+ cms0 = 0x00, // edge aligned mode
+ cms1 = 0x20, // center aligned 1 (irq during downcount)
+ cms2 = 0x40, // center aligned 2 (irq during upcount)
+ cms3 = 0x60, // center aligned 3 (irq in both counting dir)
+ arpe = 0x80
+};
+
+enum tim_sr1_bits {
+ uif = 0x01
+};
+
+enum tim_ier_bits {
+ uie = 0x01
+};
+
+enum tim_egr_bits {
+ ug = 0x01
+};
+
+cl_tim::cl_tim(class cl_uc *auc, int aid, t_addr abase):
+ cl_hw(auc, HW_TIMER, aid, "tim")
+{
+ base= abase;
+ int i;
+ for (i= 0; i<32+6; i++)
+ regs[i]= 0;
+ memset(&idx, 0xff, sizeof(idx));
+}
+
+int
+cl_tim::init(void)
+{
+ int i;
+ chars s("tim");
+ s.append("%d", id);
+ set_name(s);
+ id_string= strdup(s);
+ cl_hw::init();
+ for (i= 0; i < 32+6; i++)
+ {
+ regs[i]= register_cell(uc->rom, base+i);
+ }
+
+ switch (id)
+ {
+ case 2:
+ bits= 16; mask= 0xffff;
+ break;
+ case 3:
+ bits= 16; mask= 0xffff;
+ break;
+ case 5:
+ bits= 16; mask= 0xffff;
+ break;
+ case 4:
+ bits= 8; mask= 0xff;
+ break;
+ case 6:
+ bits= 8; mask= 0xff;
+ break;
+ default: // 1
+ bits= 16; mask= 0xffff;
+ break;
+ }
+ pbits= 16;
+ bidir= true;
+ clk_enabled= false;
+
+ return 0;
+}
+
+char *
+cl_tim::cfg_help(t_addr addr)
+{
+ switch (addr)
+ {
+ case stm8_tim_on: return (char*)"Turn simulation of timer on/off (bool, RW)";
+ }
+ return (char*)"Not used";
+}
+
+int
+cl_tim::tick(int cycles)
+{
+ if (!on ||
+ !clk_enabled)
+ return resGO;
+
+ while (cycles--)
+ {
+ // count prescaler
+ if (prescaler_cnt)
+ prescaler_cnt--;
+ if (prescaler_cnt == 0)
+ {
+ prescaler_cnt= calc_prescaler() - 1;
+ // count
+ if (regs[idx.cr1]->get() & cen)
+ {
+ count();
+ }
+ }
+ }
+
+ return resGO;
+}
+
+void
+cl_tim::reset(void)
+{
+ int i;
+
+ cnt= 0;
+ prescaler_cnt= 0;
+ prescaler_preload= 0;
+
+ for (i= 0; i<32+6; i++)
+ regs[i]->set(0);
+ if (bits > 8)
+ regs[idx.arrh]->set(0xff);
+ regs[idx.arrl]->set(0xff);
+
+ update_event();
+ regs[idx.sr1]->set_bit0(uif);
+}
+
+void
+cl_tim::happen(class cl_hw *where, enum hw_event he,
+ void *params)
+{
+ if ((he == EV_CLK_ON) ||
+ (he == EV_CLK_OFF))
+ {
+ cl_clk_event *e= (cl_clk_event *)params;
+ if ((e->cath == HW_TIMER) &&
+ (e->id == id))
+ clk_enabled= he == EV_CLK_ON;
+ }
+}
+
+t_mem
+cl_tim::read(class cl_memory_cell *cell)
+{
+ t_mem v= cell->get();
+ t_addr a;
+
+ if (conf(cell, NULL))
+ return v;
+ if (!uc->rom->is_owned(cell, &a))
+ return v;
+ if ((a < base) ||
+ (a >= base+32+6))
+ return v;
+
+ a-= base;
+
+ if (a == idx.pscrl)
+ v= prescaler_preload && 0xff;
+ else if (a == idx.pscrh)
+ v= (prescaler_preload >> 8) & 0xff;
+
+ else if (a == idx.cntrh)
+ timer_ls_buffer= regs[idx.cntrl]->get();
+ else if (a == idx.cntrl)
+ {
+ if (bits > 8)
+ v= timer_ls_buffer;
+ }
+
+ return v;
+}
+
+void
+cl_tim::write(class cl_memory_cell *cell, t_mem *val)
+{
+ t_addr a;
+
+ if (conf(cell, val))
+ return;
+
+ if (conf(cell, NULL))
+ return;
+
+ *val&= 0xff;
+ if (!uc->rom->is_owned(cell, &a))
+ return;
+ if ((a < base) ||
+ (a >= base+32+6))
+ return;
+
+ a-= base;
+ if (a == idx.cr1)
+ {
+ u8_t v= cell->get();
+ if (!bidir)
+ *val&= 0x1f;
+ else
+ {
+ if ((v & cms))
+ {
+ *val&= ~dir;
+ if (v & dir)
+ *val|= dir;
+ }
+ }
+ }
+ else if (a == idx.egr)
+ {
+ if (*val & ug)
+ {
+ update_event();
+ prescaler_cnt= calc_prescaler() - 1;
+ //*val&= ~0x01;
+ }
+ *val= 0;
+ }
+ else if (a == idx.pscrh)
+ {
+ prescaler_ms_buffer= *val;
+ //*val= cell->get();
+ }
+ else if (a == idx.pscrl)
+ {
+ prescaler_preload= *val;
+ if (idx.pscrh > 0)
+ prescaler_preload+= prescaler_ms_buffer * 256;
+ }
+
+ else if (a == idx.arrh)
+ {
+ if ((regs[idx.cr1]->get() & arpe) != 0)
+ {
+ arr_ms_buffer= *val;
+ //*val= cell->get();
+ }
+ }
+ else if (a == idx.arrl)
+ {
+ u8_t l, h= 0;
+ if ((regs[idx.cr1]->get() & arpe) != 0)
+ {
+ regs[idx.arrl]->set(l= *val);
+ if (idx.arrh > 0)
+ regs[idx.arrh]->set(h= arr_ms_buffer);
+ if ((regs[idx.cr1]->get() & arpe) == 0)
+ set_counter(h*256 + l);
+ }
+ }
+}
+
+t_mem
+cl_tim::conf_op(cl_memory_cell *cell, t_addr addr, t_mem *val)
+{
+ switch ((enum stm8_tim_cfg)addr)
+ {
+ case stm8_tim_on:
+ if (val)
+ {
+ if (*val)
+ on= true;
+ else
+ on= false;
+ }
+ else
+ cell->set(on?1:0);
+ break;
+ case stm8_tim_nuof_cfg:
+ break;
+ }
+ return cell->get();
+}
+
+
+void
+cl_tim::count(void)
+{
+ u8_t c1= regs[idx.cr1]->get();
+ if (get_dir())
+ {
+ // up
+ u16_t arr= get_arr();
+ set_counter(cnt+1);
+ if (cnt == arr)
+ {
+ if ((c1 & cms) == cms0)
+ // edge aligned
+ set_counter(0);
+ else
+ // center aligned
+ regs[idx.cr1]->set(c1|= dir);
+ if ((c1 & udis) == 0)
+ update_event();
+ }
+ }
+ else
+ {
+ // down
+ set_counter(cnt-1);
+ if (cnt == 0)
+ {
+ if ((c1 & cms) == cms0)
+ // edge aligned
+ set_counter(get_arr());
+ else
+ // center aligned
+ regs[idx.cr1]->set(c1&= ~dir);
+ if ((c1 & udis) == 0)
+ update_event();
+ }
+ }
+}
+
+u16_t
+cl_tim::get_counter()
+{
+ if (bits > 8)
+ return regs[idx.cntrh]->get()*256 + regs[idx.cntrl]->get();
+ return regs[idx.cntrl]->get();
+}
+
+u16_t
+cl_tim::set_counter(u16_t val)
+{
+ cnt= val & mask;
+ regs[idx.cntrl]->set(val&0xff);
+ if (bits > 8)
+ regs[idx.cntrh]->set(val>>8);
+ return val;
+}
+
+void
+cl_tim::update_event(void)
+{
+ u8_t c1= regs[idx.cr1]->get();
+
+ if (c1 & opm)
+ regs[idx.cr1]->set_bit0(cen);
+ else
+ {
+ if (get_dir())
+ {
+ // up
+ set_counter(0);
+ }
+ else
+ {
+ // down
+ u16_t ar= get_arr();
+ set_counter(ar);
+ }
+ }
+ regs[idx.sr1]->write_bit1(uif);
+}
+
+// true: UP, false: down
+bool
+cl_tim::get_dir()
+{
+ return !(regs[idx.cr1]->get() & dir);
+}
+
+u16_t
+cl_tim::get_arr()
+{
+ u16_t arr= regs[idx.arrl]->get();
+ if (bits > 8)
+ arr+= regs[idx.arrh]->get() * 256;
+ return arr;
+}
+
+u16_t
+cl_tim::calc_prescaler()
+{
+ u16_t v;
+ switch (pbits)
+ {
+ case 3:
+ v= (1 << (prescaler_preload & 0x07));
+ break;
+ case 4:
+ v= (1 << (prescaler_preload & 0x0f));
+ break;
+ default: // 16
+ v= prescaler_preload + 1;
+ break;
+ }
+ return v;
+}
+
+void
+cl_tim::print_info(class cl_console_base *con)
+{
+ u8_t c1= regs[idx.cr1]->get();
+ // features
+ con->dd_printf("Simulation of %s is %s\n", get_name(), on?"ON":"OFF");
+ con->dd_printf("%s %d bit %s counter at 0x%06x\n", get_name(), bits,
+ bidir?"Up/Down":"Up", base);
+ // actual values
+ con->dd_printf("clk= %s\n", clk_enabled?"enabled":"disabled");
+ con->dd_printf("cnt= 0x%04x %d %s\n", cnt, cnt, (c1&cen)?"on":"off");
+ con->dd_printf("dir= %s\n", (c1&dir)?"down":"up");
+ con->dd_printf("prs= 0x%04x %d of 0x%04x %d\n",
+ prescaler_cnt, prescaler_cnt,
+ calc_prescaler(), calc_prescaler());
+ con->dd_printf("arr= 0x%04x %d\n", get_arr(), get_arr());
+ print_cfg_info(con);
+}
+
+
+/************************************************************************ 1 */
+
+cl_tim1::cl_tim1(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim(auc, aid, abase)
+{
+}
+
+int
+cl_tim1::init(void)
+{
+ cl_tim::init();
+ return 0;
+}
+
+cl_tim1_saf::cl_tim1_saf(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim1(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ idx.ier = 4;
+ idx.sr1 = 5;
+ idx.sr2 = 6;
+ idx.egr = 7;
+ idx.ccmr1 = 8;
+ idx.ccmr2 = 9;
+ idx.ccmr3 = 10;
+ idx.ccmr4 = 11;
+ idx.ccer1 = 12;
+ idx.ccer2 = 13;
+ idx.cntrh = 14;
+ idx.cntrl = 15;
+ idx.pscrh = 16;
+ idx.pscrl = 17;
+ idx.arrh = 18;
+ idx.arrl = 19;
+ idx.rcr = 20;
+ idx.ccr1h = 21;
+ idx.ccr1l = 22;
+ idx.ccr2h = 23;
+ idx.ccr2l = 24;
+ idx.ccr3h = 25;
+ idx.ccr3l = 26;
+ idx.ccr4h = 27;
+ idx.ccr4l = 28;
+ idx.bkr = 29;
+ idx.dtr = 30;
+ idx.oisr = 31;
+}
+
+int
+cl_tim1_saf::init(void)
+{
+ class cl_it_src *is;
+ cl_tim1::init();
+ uc->it_sources->add(is= new cl_it_src(uc, 11,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+11*4, false, false,
+ "timer1 update",
+ 30*10+1));
+ is->init();
+ return 0;
+}
+
+cl_tim1_all::cl_tim1_all(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim1(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ idx.der = 4;
+ idx.ier = 5;
+ idx.sr1 = 6;
+ idx.sr2 = 7;
+ idx.egr = 8;
+ idx.ccmr1 = 9;
+ idx.ccmr2 = 10;
+ idx.ccmr3 = 11;
+ idx.ccmr4 = 12;
+ idx.ccer1 = 13;
+ idx.ccer2 = 14;
+ idx.cntrh = 15;
+ idx.cntrl = 16;
+ idx.pscrh = 17;
+ idx.pscrl = 18;
+ idx.arrh = 19;
+ idx.arrl = 20;
+ idx.rcr = 21;
+ idx.ccr1h = 22;
+ idx.ccr1l = 23;
+ idx.ccr2h = 24;
+ idx.ccr2l = 25;
+ idx.ccr3h = 26;
+ idx.ccr3l = 27;
+ idx.ccr4h = 28;
+ idx.ccr4l = 29;
+ idx.bkr = 30;
+ idx.dtr = 31;
+ idx.oisr = 32;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim1_all::init(void)
+{
+ class cl_it_src *is;
+ cl_tim1::init();
+ uc->it_sources->add(is= new cl_it_src(uc, 23,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+23*4, false, false,
+ "timer1 update",
+ 30*10+1));
+ is->init();
+ return 0;
+}
+
+
+/********************************************************************** 235 */
+
+cl_tim235::cl_tim235(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim(auc, aid, abase)
+{
+}
+
+int
+cl_tim235::init(void)
+{
+ cl_tim::init();
+ return 0;
+}
+
+
+/****** TIM 2 */
+
+cl_tim2_saf_a::cl_tim2_saf_a(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ //idx.cr2 = 1;
+ //idx.smcr = 2;
+ //idx.etr = 3;
+ //der=4
+ idx.ier = 1;
+ idx.sr1 = 2;
+ idx.sr2 = 3;
+ idx.egr = 4;
+ idx.ccmr1 = 5;
+ idx.ccmr2 = 6;
+ idx.ccmr3 = 7;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 8;
+ idx.ccer2 = 9;
+ idx.cntrh = 10;
+ idx.cntrl = 11;
+ //idx.pscrh = 14;
+ idx.pscrl = 12;
+ idx.arrh = 13;
+ idx.arrl = 14;
+ //idx.rcr = 21;
+ idx.ccr1h = 15;
+ idx.ccr1l = 0x10;
+ idx.ccr2h = 0x11;
+ idx.ccr2l = 0x12;
+ idx.ccr3h = 0x13;
+ idx.ccr3l = 0x14;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 30;
+ //idx.dtr = 31;
+ //idx.oisr = 32;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim2_saf_a::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 13,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+13*4, false, false,
+ "timer2 update",
+ 30*10+2));
+ is->init();
+ return 0;
+}
+
+
+cl_tim2_saf_b::cl_tim2_saf_b(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ //idx.cr2 = 1;
+ //idx.smcr = 2;
+ //idx.etr = 3;
+ //der=4
+ idx.ier = 3;
+ idx.sr1 = 4;
+ idx.sr2 = 5;
+ idx.egr = 6;
+ idx.ccmr1 = 7;
+ idx.ccmr2 = 8;
+ idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 10;
+ idx.ccer2 = 11;
+ idx.cntrh = 12;
+ idx.cntrl = 13;
+ //idx.pscrh = 14;
+ idx.pscrl = 14;
+ idx.arrh = 15;
+ idx.arrl = 16;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x11;
+ idx.ccr1l = 0x12;
+ idx.ccr2h = 0x13;
+ idx.ccr2l = 0x14;
+ idx.ccr3h = 0x15;
+ idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 30;
+ //idx.dtr = 31;
+ //idx.oisr = 32;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim2_saf_b::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 13,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+13*4, false, false,
+ "timer2 update",
+ 30*10+2));
+ is->init();
+ return 0;
+}
+
+
+cl_tim2_all::cl_tim2_all(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ idx.der = 4;
+ idx.ier = 5;
+ idx.sr1 = 6;
+ idx.sr2 = 7;
+ idx.egr = 8;
+ idx.ccmr1 = 9;
+ idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ idx.cntrh = 0x0c;
+ idx.cntrl = 0x0d;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x0e;
+ idx.arrh = 0x0f;
+ idx.arrl = 0x10;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x11;
+ idx.ccr1l = 0x12;
+ idx.ccr2h = 0x13;
+ idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ idx.bkr = 0x15;
+ //idx.dtr = 31;
+ idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim2_all::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 3;
+ uc->it_sources->add(is= new cl_it_src(uc, 19,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+19*4, false, false,
+ "timer2 update",
+ 30*10+2));
+ is->init();
+ return 0;
+}
+
+
+cl_tim2_l101::cl_tim2_l101(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ //idx.der = 4;
+ idx.ier = 4;
+ idx.sr1 = 5;
+ idx.sr2 = 6;
+ idx.egr = 7;
+ idx.ccmr1 = 8;
+ idx.ccmr2 = 0x09;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0x0a;
+ //idx.ccer2 = 11;
+ idx.cntrh = 0x0b;
+ idx.cntrl = 0x0c;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x0d;
+ idx.arrh = 0x0e;
+ idx.arrl = 0x0f;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x10;
+ idx.ccr1l = 0x11;
+ idx.ccr2h = 0x12;
+ idx.ccr2l = 0x13;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ idx.bkr = 0x14;
+ //idx.dtr = 31;
+ idx.oisr = 0x15;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim2_l101::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 3;
+ uc->it_sources->add(is= new cl_it_src(uc, 19,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+19*4, false, false,
+ "timer2 update",
+ 30*10+2));
+ is->init();
+ return 0;
+}
+
+
+/****** TIM 3 */
+
+cl_tim3_saf::cl_tim3_saf(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ //idx.cr2 = 1;
+ //idx.smcr = 2;
+ //idx.etr = 3;
+ //der=4
+ idx.ier = 1;
+ idx.sr1 = 2;
+ idx.sr2 = 3;
+ idx.egr = 4;
+ idx.ccmr1 = 5;
+ idx.ccmr2 = 6;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 7;
+ //idx.ccer2 = 8;
+ idx.cntrh = 8;
+ idx.cntrl = 9;
+ //idx.pscrh = 14;
+ idx.pscrl = 0xa;
+ idx.arrh = 0xb;
+ idx.arrl = 0xc;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x0d;
+ idx.ccr1l = 0x0c;
+ idx.ccr2h = 0x0f;
+ idx.ccr2l = 0x10;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 30;
+ //idx.dtr = 31;
+ //idx.oisr = 32;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim3_saf::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 15,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+15*4, false, false,
+ "timer3 update",
+ 30*10+3));
+ is->init();
+ return 0;
+}
+
+
+cl_tim3_all::cl_tim3_all(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ idx.der = 4;
+ idx.ier = 5;
+ idx.sr1 = 6;
+ idx.sr2 = 7;
+ idx.egr = 8;
+ idx.ccmr1 = 9;
+ idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ idx.cntrh = 0x0c;
+ idx.cntrl = 0x0d;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x0e;
+ idx.arrh = 0x0f;
+ idx.arrl = 0x10;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x11;
+ idx.ccr1l = 0x12;
+ idx.ccr2h = 0x13;
+ idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ idx.bkr = 0x15;
+ //idx.dtr = 31;
+ idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim3_all::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 3;
+ uc->it_sources->add(is= new cl_it_src(uc, 21,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+21*4, false, false,
+ "timer3 update",
+ 30*10+3));
+ is->init();
+ return 0;
+}
+
+
+cl_tim3_l101::cl_tim3_l101(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ //idx.der = 4;
+ idx.ier = 4;
+ idx.sr1 = 5;
+ idx.sr2 = 6;
+ idx.egr = 7;
+ idx.ccmr1 = 8;
+ idx.ccmr2 = 0x09;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0x0a;
+ //idx.ccer2 = 11;
+ idx.cntrh = 0x0b;
+ idx.cntrl = 0x0c;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x0d;
+ idx.arrh = 0x0e;
+ idx.arrl = 0x0f;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x10;
+ idx.ccr1l = 0x11;
+ idx.ccr2h = 0x12;
+ idx.ccr2l = 0x13;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ idx.bkr = 0x14;
+ //idx.dtr = 31;
+ idx.oisr = 0x15;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim3_l101::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 3;
+ uc->it_sources->add(is= new cl_it_src(uc, 21,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+21*4, false, false,
+ "timer3 update",
+ 30*10+3));
+ is->init();
+ return 0;
+}
+
+
+/****** TIM 5 */
+
+cl_tim5_saf::cl_tim5_saf(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ //idx.etr = 3;
+ //der=4
+ idx.ier = 3;
+ idx.sr1 = 4;
+ idx.sr2 = 5;
+ idx.egr = 6;
+ idx.ccmr1 = 7;
+ idx.ccmr2 = 8;
+ idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0xa;
+ idx.ccer2 = 0xb;
+ idx.cntrh = 0xc;
+ idx.cntrl = 0xd;
+ //idx.pscrh = 14;
+ idx.pscrl = 0xe;
+ idx.arrh = 0xf;
+ idx.arrl = 0x10;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x11;
+ idx.ccr1l = 0x12;
+ idx.ccr2h = 0x13;
+ idx.ccr2l = 0x14;
+ idx.ccr3h = 0x15;
+ idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 30;
+ //idx.dtr = 31;
+ //idx.oisr = 32;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim5_saf::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 13,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+13*4, false, false,
+ "timer5 update",
+ 30*10+5));
+ is->init();
+ return 0;
+}
+
+
+cl_tim5_all::cl_tim5_all(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim235(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ idx.etr = 3;
+ idx.der = 4;
+ idx.ier = 5;
+ idx.sr1 = 6;
+ idx.sr2 = 7;
+ idx.egr = 8;
+ idx.ccmr1 = 9;
+ idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ idx.cntrh = 0x0c;
+ idx.cntrl = 0x0d;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x0e;
+ idx.arrh = 0x0f;
+ idx.arrl = 0x10;
+ //idx.rcr = 21;
+ idx.ccr1h = 0x11;
+ idx.ccr1l = 0x12;
+ idx.ccr2h = 0x13;
+ idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ idx.bkr = 0x15;
+ //idx.dtr = 31;
+ idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim5_all::init(void)
+{
+ class cl_it_src *is;
+ cl_tim235::init();
+ pbits= 3;
+ uc->it_sources->add(is= new cl_it_src(uc, 27,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+27*4, false, false,
+ "timer5 update",
+ 30*10+5));
+ is->init();
+ return 0;
+}
+
+
+/*********************************************************************** 46 */
+
+cl_tim46::cl_tim46(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim(auc, aid, abase)
+{
+}
+
+int
+cl_tim46::init(void)
+{
+ cl_tim::init();
+ pbits= 4;
+ return 0;
+}
+
+
+/********* TIM 4 */
+
+cl_tim4_saf_a::cl_tim4_saf_a(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim46(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ //idx.cr2 = 1;
+ //idx.smcr = 2;
+ //idx.etr = 3;
+ //idx.der = 4;
+ idx.ier = 1;
+ idx.sr1 = 2;
+ //idx.sr2 = 7;
+ idx.egr = 3;
+ //idx.ccmr1 = 9;
+ //idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ //idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ //idx.cntrh = 0x0c;
+ idx.cntrl = 0x04;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x05;
+ //idx.arrh = 0x0f;
+ idx.arrl = 0x06;
+ //idx.rcr = 21;
+ //idx.ccr1h = 0x11;
+ //idx.ccr1l = 0x12;
+ //idx.ccr2h = 0x13;
+ //idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 0x15;
+ //idx.dtr = 31;
+ //idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim4_saf_a::init(void)
+{
+ class cl_it_src *is;
+ cl_tim46::init();
+ pbits= 3;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 23,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+23*4, false, false,
+ "timer4 update",
+ 30*10+4));
+ is->init();
+ return 0;
+}
+
+
+cl_tim4_saf_b::cl_tim4_saf_b(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim46(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ //idx.cr2 = 1;
+ //idx.smcr = 2;
+ //idx.etr = 3;
+ //idx.der = 4;
+ idx.ier = 3;
+ idx.sr1 = 4;
+ //idx.sr2 = 7;
+ idx.egr = 5;
+ //idx.ccmr1 = 9;
+ //idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ //idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ //idx.cntrh = 0x0c;
+ idx.cntrl = 0x06;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x07;
+ //idx.arrh = 0x0f;
+ idx.arrl = 0x08;
+ //idx.rcr = 21;
+ //idx.ccr1h = 0x11;
+ //idx.ccr1l = 0x12;
+ //idx.ccr2h = 0x13;
+ //idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 0x15;
+ //idx.dtr = 31;
+ //idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim4_saf_b::init(void)
+{
+ class cl_it_src *is;
+ cl_tim46::init();
+ pbits= 3;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 23,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+23*4, false, false,
+ "timer4 update",
+ 30*10+4));
+ is->init();
+ return 0;
+}
+
+
+cl_tim4_all::cl_tim4_all(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim46(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ //idx.etr = 3;
+ idx.der = 3;
+ idx.ier = 4;
+ idx.sr1 = 5;
+ //idx.sr2 = 7;
+ idx.egr = 6;
+ //idx.ccmr1 = 9;
+ //idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ //idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ //idx.cntrh = 0x0c;
+ idx.cntrl = 0x07;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x08;
+ //idx.arrh = 0x0f;
+ idx.arrl = 0x09;
+ //idx.rcr = 21;
+ //idx.ccr1h = 0x11;
+ //idx.ccr1l = 0x12;
+ //idx.ccr2h = 0x13;
+ //idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 0x15;
+ //idx.dtr = 31;
+ //idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim4_all::init(void)
+{
+ class cl_it_src *is;
+ cl_tim46::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 25,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+25*4, false, false,
+ "timer4 update",
+ 30*10+4));
+ is->init();
+ return 0;
+}
+
+
+cl_tim4_l101::cl_tim4_l101(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim46(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ //idx.etr = 3;
+ //idx.der = 3;
+ idx.ier = 3;
+ idx.sr1 = 4;
+ //idx.sr2 = 7;
+ idx.egr = 5;
+ //idx.ccmr1 = 9;
+ //idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ //idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ //idx.cntrh = 0x0c;
+ idx.cntrl = 0x06;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x07;
+ //idx.arrh = 0x0f;
+ idx.arrl = 0x08;
+ //idx.rcr = 21;
+ //idx.ccr1h = 0x11;
+ //idx.ccr1l = 0x12;
+ //idx.ccr2h = 0x13;
+ //idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 0x15;
+ //idx.dtr = 31;
+ //idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim4_l101::init(void)
+{
+ class cl_it_src *is;
+ cl_tim46::init();
+ pbits= 4;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 25,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+25*4, false, false,
+ "timer4 update",
+ 30*10+4));
+ is->init();
+ return 0;
+}
+
+
+/*********** TIM6 */
+
+cl_tim6_saf::cl_tim6_saf(class cl_uc *auc, int aid, t_addr abase):
+ cl_tim46(auc, aid, abase)
+{
+ idx.cr1 = 0;
+ idx.cr2 = 1;
+ idx.smcr = 2;
+ //idx.etr = 3;
+ //idx.der = 4;
+ idx.ier = 3;
+ idx.sr1 = 4;
+ //idx.sr2 = 7;
+ idx.egr = 5;
+ //idx.ccmr1 = 9;
+ //idx.ccmr2 = 0x0a;
+ //idx.ccmr3 = 9;
+ //idx.ccmr4 = 10;
+ //idx.ccer1 = 0x0b;
+ //idx.ccer2 = 11;
+ //idx.cntrh = 0x0c;
+ idx.cntrl = 0x06;
+ //idx.pscrh = 14;
+ idx.pscrl = 0x07;
+ //idx.arrh = 0x0f;
+ idx.arrl = 0x08;
+ //idx.rcr = 21;
+ //idx.ccr1h = 0x11;
+ //idx.ccr1l = 0x12;
+ //idx.ccr2h = 0x13;
+ //idx.ccr2l = 0x14;
+ //idx.ccr3h = 0x15;
+ //idx.ccr3l = 0x16;
+ //idx.ccr4h = 28;
+ //idx.ccr4l = 29;
+ //idx.bkr = 0x15;
+ //idx.dtr = 31;
+ //idx.oisr = 0x16;
+ //dcr1=33
+ //dcr2=34
+ //dmar=35
+}
+
+int
+cl_tim6_saf::init(void)
+{
+ class cl_it_src *is;
+ cl_tim46::init();
+ pbits= 3;
+ bidir= false;
+ uc->it_sources->add(is= new cl_it_src(uc, 23,
+ regs[idx.ier], uie,
+ regs[idx.sr1], uif,
+ 0x8008+23*4, false, false,
+ "timer6 update",
+ 30*10+6));
+ is->init();
+ return 0;
+}
+
+
+/* End of stm8.src/timer.cc */