>From 98fad9ff5e430a4cb03dad2e4703661098de66e4 Mon Sep 17 00:00:00 2001
From: panic
Date: Sun, 18 Jun 2017 00:10:51 +0200
Subject: [PATCH 3/3] use std::function instead of template class for IOReg
---
src/flashprog.cpp | 3 ++-
src/flashprog.h | 2 +-
src/hwacomp.cpp | 2 +-
src/hwacomp.h | 2 +-
src/hwad.cpp | 10 +++----
src/hwad.h | 10 +++----
src/hweeprom.cpp | 8 +++---
src/hweeprom.h | 2 +-
src/hwpinchange.cpp | 14 +++++-----
src/hwpinchange.h | 4 +--
src/hwport.cpp | 9 ++++---
src/hwport.h | 2 +-
src/hwspi.cpp | 6 ++---
src/hwspi.h | 6 ++---
src/hwstack.cpp | 4 +--
src/hwstack.h | 4 +--
src/hwtimer/hwtimer.cpp | 70 ++++++++++++++++++++++++-------------------------
src/hwtimer/hwtimer.h | 70 ++++++++++++++++++++++++-------------------------
src/hwuart.cpp | 27 ++++++++++++-------
src/hwuart.h | 8 +++---
src/hwusi.cpp | 8 +++---
src/hwusi.h | 8 +++---
src/hwwado.cpp | 2 +-
src/hwwado.h | 2 +-
src/ioregs.cpp | 3 ++-
src/ioregs.h | 2 +-
src/rwmem.h | 23 +++++++---------
27 files changed, 160 insertions(+), 151 deletions(-)
diff --git a/src/flashprog.cpp b/src/flashprog.cpp
index 9f98e5e..8dd562a 100644
--- a/src/flashprog.cpp
+++ b/src/flashprog.cpp
@@ -58,7 +58,8 @@ FlashProgramming::FlashProgramming(AvrDevice *c,
nrww_addr(nrww),
core(c),
spmcr_reg(c, "SPMCR",
- this, &FlashProgramming::GetSpmcr, &FlashProgramming::SetSpmcr)
+ std::bind(&FlashProgramming::GetSpmcr, this),
+ std::bind(&FlashProgramming::SetSpmcr, this, std::placeholders::_1))
{
// initialize hidden buffer
tempBuffer = avr_new(unsigned char, pgsz * 2);
diff --git a/src/flashprog.h b/src/flashprog.h
index 595358c..5eec49a 100644
--- a/src/flashprog.h
+++ b/src/flashprog.h
@@ -92,7 +92,7 @@ class FlashProgramming: public Hardware {
void SetSpmcr(unsigned char v);
unsigned char GetSpmcr() { return spmcr_val; }
- IOReg spmcr_reg;
+ IOReg spmcr_reg;
};
diff --git a/src/hwacomp.cpp b/src/hwacomp.cpp
index 9ed3271..cd343c6 100644
--- a/src/hwacomp.cpp
+++ b/src/hwacomp.cpp
@@ -52,7 +52,7 @@ HWAcomp::HWAcomp(AvrDevice *core,
timerB(_timerB),
ad(_ad),
sfior(_sfior),
- acsr_reg(this, "ACSR", this, &HWAcomp::GetAcsr, &HWAcomp::SetAcsr)
+ acsr_reg(this, "ACSR", std::bind(&HWAcomp::GetAcsr, this), std::bind(&HWAcomp::SetAcsr, this, std::placeholders::_1))
{
// just check right assignment of IRQ vector number
irqSystem->DebugVerifyInterruptVector(irqVec, this);
diff --git a/src/hwacomp.h b/src/hwacomp.h
index 8b387fc..c7456bc 100644
--- a/src/hwacomp.h
+++ b/src/hwacomp.h
@@ -79,7 +79,7 @@ class HWAcomp: public Hardware,
ACIS0 = 0x01
};
- IOReg acsr_reg; //!< ACSR IO register
+ IOReg acsr_reg; //!< ACSR IO register
//! constructor to instantiate a analog comparator peripheral
HWAcomp(AvrDevice *core,
diff --git a/src/hwad.cpp b/src/hwad.cpp
index cd45a40..968e68c 100644
--- a/src/hwad.cpp
+++ b/src/hwad.cpp
@@ -308,11 +308,11 @@ HWAd::HWAd(AvrDevice *c, int _typ, HWIrqSystem *i, unsigned int iv, HWAdmux *a,
irqSystem(i),
irqVec(iv),
notifyClient(NULL),
- adch_reg(this, "ADCH", this, &HWAd::GetAdch, 0),
- adcl_reg(this, "ADCL", this, &HWAd::GetAdcl, 0),
- adcsra_reg(this, "ADCSRA", this, &HWAd::GetAdcsrA, &HWAd::SetAdcsrA),
- adcsrb_reg(this, "ADCSRB", this, &HWAd::GetAdcsrB, &HWAd::SetAdcsrB),
- admux_reg(this, "ADMUX", this, &HWAd::GetAdmux, &HWAd::SetAdmux) {
+ adch_reg(this, "ADCH", std::bind(&HWAd::GetAdch, this)),
+ adcl_reg(this, "ADCL", std::bind(&HWAd::GetAdcl, this)),
+ adcsra_reg(this, "ADCSRA", std::bind(&HWAd::GetAdcsrA, this), std::bind(&HWAd::SetAdcsrA, this, std::placeholders::_1)),
+ adcsrb_reg(this, "ADCSRB", std::bind(&HWAd::GetAdcsrB, this), std::bind(&HWAd::SetAdcsrB, this, std::placeholders::_1)),
+ admux_reg(this, "ADMUX", std::bind(&HWAd::GetAdmux, this), std::bind(&HWAd::SetAdmux, this, std::placeholders::_1)) {
mux->RegisterNotifyClient(this);
irqSystem->DebugVerifyInterruptVector(irqVec, this);
core->AddToCycleList(this);
diff --git a/src/hwad.h b/src/hwad.h
index c0a4a1e..6e85604 100644
--- a/src/hwad.h
+++ b/src/hwad.h
@@ -240,11 +240,11 @@ class HWAd: public Hardware, public TraceValueRegister, public AnalogSignalChang
AD_T25 //!< ADC type T25: ADC on attiny25/45/85
};
- IOReg adch_reg,
- adcl_reg,
- adcsra_reg,
- adcsrb_reg,
- admux_reg;
+ IOReg adch_reg,
+ adcl_reg,
+ adcsra_reg,
+ adcsrb_reg,
+ admux_reg;
HWAd(AvrDevice *c, int _typ, HWIrqSystem *i, unsigned int iv, HWAdmux *a, HWARef *r);
virtual ~HWAd() { mux->UnregisterNotifyClient(); }
diff --git a/src/hweeprom.cpp b/src/hweeprom.cpp
index cd34d76..bb938c5 100644
--- a/src/hweeprom.cpp
+++ b/src/hweeprom.cpp
@@ -44,13 +44,13 @@ HWEeprom::HWEeprom(AvrDevice *_core,
irqSystem(_irqSystem),
irqVectorNo(irqVec),
eearh_reg(this, "EEARH",
- this, &HWEeprom::GetEearh, &HWEeprom::SetEearh),
+ std::bind(&HWEeprom::GetEearh, this), std::bind(&HWEeprom::SetEearh, this, std::placeholders::_1)),
eearl_reg(this, "EEARL",
- this, &HWEeprom::GetEearl, &HWEeprom::SetEearl),
+ std::bind(&HWEeprom::GetEearl, this), std::bind(&HWEeprom::SetEearl, this, std::placeholders::_1)),
eedr_reg(this, "EEDR",
- this, &HWEeprom::GetEedr, &HWEeprom::SetEedr),
+ std::bind(&HWEeprom::GetEedr, this), std::bind(&HWEeprom::SetEedr, this, std::placeholders::_1)),
eecr_reg(this, "EECR",
- this, &HWEeprom::GetEecr, &HWEeprom::SetEecr)
+ std::bind(&HWEeprom::GetEecr, this), std::bind(&HWEeprom::SetEecr, this, std::placeholders::_1))
{
if(irqSystem)
irqSystem->DebugVerifyInterruptVector(irqVectorNo, this);
diff --git a/src/hweeprom.h b/src/hweeprom.h
index df50308..de7b4cb 100644
--- a/src/hweeprom.h
+++ b/src/hweeprom.h
@@ -97,7 +97,7 @@ class HWEeprom: public Hardware, public Memory, public TraceValueRegister {
unsigned char GetEecr() { return eecr; }
unsigned char GetEedr() { return eedr; }
- IOReg
+ IOReg
eearh_reg,
eearl_reg,
eedr_reg,
diff --git a/src/hwpinchange.cpp b/src/hwpinchange.cpp
index 43e4e3a..be398c2 100644
--- a/src/hwpinchange.cpp
+++ b/src/hwpinchange.cpp
@@ -28,10 +28,12 @@ HWPcir::HWPcir( AvrDevice* avr,
_vector5(vector5),
_vector6(vector6),
_vector7(vector7),
- pcicr_reg(avr, "PINCHANGE.PCICR", this, &HWPcir::getPcicrMask,
- &HWPcir::setPcicrMask),
- pcifr_reg(avr, "PINCHANGE.PCIFR", this, &HWPcir::getPcifrMask,
- &HWPcir::setPcifrMask)
+ pcicr_reg(avr, "PINCHANGE.PCICR",
+ std::bind(&HWPcir::getPcicrMask, this),
+ std::bind(&HWPcir::setPcicrMask, this, std::placeholders::_1)),
+ pcifr_reg(avr, "PINCHANGE.PCIFR",
+ std::bind(&HWPcir::getPcifrMask, this),
+ std::bind(&HWPcir::setPcifrMask, this, std::placeholders::_1))
{
assert(false); // Unreachable. No code ever constructs this class.
irqSystem.DebugVerifyInterruptVector(_vector0, this);
@@ -211,8 +213,8 @@ HWPcmsk::HWPcmsk(
_pcmsk(0),
_pcifrBit(pcifrBit),
pcmsk_reg(core, "PINCHANGE.PCMSK",
- this, &HWPcmsk::getPcmskMask,
- &HWPcmsk::setPcmskMask)
+ std::bind(&HWPcmsk::getPcmskMask, this),
+ std::bind(&HWPcmsk::setPcmskMask, this, std::placeholders::_1))
{
assert(false); // Unreachable. No code ever constructs this class.
}
diff --git a/src/hwpinchange.h b/src/hwpinchange.h
index 0ab86d7..288a7c0 100644
--- a/src/hwpinchange.h
+++ b/src/hwpinchange.h
@@ -95,7 +95,7 @@ class HWPcir : public HWPcifrApi , public HWPcirMaskApi , public Hardware {
unsigned char getPcicrMask() throw();
- IOReg
+ IOReg
pcicr_reg,
pcifr_reg;
@@ -128,7 +128,7 @@ class HWPcmsk : public HWPcmskApi , public HWPcmskPinApi {
public: // HWPcmskPinApi
void pinChanged(unsigned bit) throw();
- IOReg pcmsk_reg;
+ IOReg pcmsk_reg;
};
// This class monitors a single pin for changes
diff --git a/src/hwport.cpp b/src/hwport.cpp
index 662a47a..3f7e5a0 100644
--- a/src/hwport.cpp
+++ b/src/hwport.cpp
@@ -38,11 +38,14 @@ HWPort::HWPort(AvrDevice *core, const string &name, bool portToggle, int size):
portSize(size),
portToggleFeature(portToggle),
port_reg(this, "PORT",
- this, &HWPort::GetPort, &HWPort::SetPort),
+ std::bind(&HWPort::GetPort, this),
+ std::bind(&HWPort::SetPort, this, std::placeholders::_1)),
pin_reg(this, "PIN",
- this, &HWPort::GetPin, &HWPort::SetPin),
+ std::bind(static_cast(&HWPort::GetPin), this),
+ std::bind(&HWPort::SetPin, this, std::placeholders::_1)),
ddr_reg(this, "DDR",
- this, &HWPort::GetDdr, &HWPort::SetDdr)
+ std::bind(&HWPort::GetDdr, this),
+ std::bind(&HWPort::SetDdr, this, std::placeholders::_1))
{
assert((portSize >= 1) && (portSize <= sizeof(p)/sizeof(p[0])));
portMask = (unsigned char)((1 << portSize) - 1);
diff --git a/src/hwport.h b/src/hwport.h
index eeeebd8..595f2a5 100644
--- a/src/hwport.h
+++ b/src/hwport.h
@@ -75,7 +75,7 @@ class HWPort: public Hardware, public TraceValueRegister {
friend class PinAtPort;
- IOReg
+ IOReg
port_reg,
pin_reg,
ddr_reg;
diff --git a/src/hwspi.cpp b/src/hwspi.cpp
index 450e2e6..15a5bb2 100644
--- a/src/hwspi.cpp
+++ b/src/hwspi.cpp
@@ -175,9 +175,9 @@ HWSpi::HWSpi(AvrDevice *_c,
core(_c), irq(_irq),
MOSI(mosi), MISO(miso), SCK(sck), SS(ss),
irq_vector(ivec), mega_mode(mm),
- spdr_reg(this, "SPDR", this, &HWSpi::GetSPDR, &HWSpi::SetSPDR),
- spsr_reg(this, "SPSR", this, &HWSpi::GetSPSR, &HWSpi::SetSPSR),
- spcr_reg(this, "SPCR", this, &HWSpi::GetSPCR, &HWSpi::SetSPCR)
+ spdr_reg(this, "SPDR", std::bind(&HWSpi::GetSPDR, this), std::bind(&HWSpi::SetSPDR, this, std::placeholders::_1)),
+ spsr_reg(this, "SPSR", std::bind(&HWSpi::GetSPSR, this), std::bind(&HWSpi::SetSPSR, this, std::placeholders::_1)),
+ spcr_reg(this, "SPCR", std::bind(&HWSpi::GetSPCR, this), std::bind(&HWSpi::SetSPCR, this, std::placeholders::_1))
{
irq->DebugVerifyInterruptVector(ivec, this);
bitcnt=8;
diff --git a/src/hwspi.h b/src/hwspi.h
index d0487cf..3cb3015 100644
--- a/src/hwspi.h
+++ b/src/hwspi.h
@@ -121,9 +121,9 @@ class HWSpi: public Hardware, public TraceValueRegister {
void ClearIrqFlag(unsigned int);
- IOReg spdr_reg,
- spsr_reg,
- spcr_reg;
+ IOReg spdr_reg,
+ spsr_reg,
+ spcr_reg;
};
#endif
diff --git a/src/hwstack.cpp b/src/hwstack.cpp
index 892f4c6..de23eae 100644
--- a/src/hwstack.cpp
+++ b/src/hwstack.cpp
@@ -65,9 +65,9 @@ HWStackSram::HWStackSram(AvrDevice *c, int bs, bool initRE):
TraceValueRegister(c, "STACK"),
initRAMEND(initRE),
sph_reg(this, "SPH",
- this, &HWStackSram::GetSph, &HWStackSram::SetSph),
+ std::bind(&HWStackSram::GetSph, this), std::bind(&HWStackSram::SetSph, this, std::placeholders::_1)),
spl_reg(this, "SPL",
- this, &HWStackSram::GetSpl, &HWStackSram::SetSpl)
+ std::bind(&HWStackSram::GetSpl, this), std::bind(&HWStackSram::SetSpl, this, std::placeholders::_1))
{
stackCeil = 1 << bs; // TODO: The number of bits is unable to acurately represent 0x460 ceiling of ATmega8: has 1024 B RAM (0x400) and 32+64 (0x60) registers.
Reset();
diff --git a/src/hwstack.h b/src/hwstack.h
index a9db9e1..dbafe17 100644
--- a/src/hwstack.h
+++ b/src/hwstack.h
@@ -151,8 +151,8 @@ class HWStackSram: public HWStack, public TraceValueRegister {
virtual void Reset();
- IOReg sph_reg;
- IOReg spl_reg;
+ IOReg sph_reg;
+ IOReg spl_reg;
};
//! Implements a stack with 3 levels deep (used as returnstack by ATtiny15 an other)
diff --git a/src/hwtimer/hwtimer.cpp b/src/hwtimer/hwtimer.cpp
index 4db1342..ce2a523 100644
--- a/src/hwtimer/hwtimer.cpp
+++ b/src/hwtimer/hwtimer.cpp
@@ -590,11 +590,11 @@ HWTimer8::HWTimer8(AvrDevice *core,
PinAtPort* outB):
BasicTimerUnit(core, p, unit, tov, NULL, NULL, 8),
tcnt_reg(this, "TCNT",
- this, &HWTimer8::Get_TCNT, &HWTimer8::Set_TCNT),
+ std::bind(&HWTimer8::Get_TCNT, this), std::bind(&HWTimer8::Set_TCNT, this, std::placeholders::_1)),
ocra_reg(this, "OCRA",
- this, &HWTimer8::Get_OCRA, &HWTimer8::Set_OCRA),
+ std::bind(&HWTimer8::Get_OCRA, this), std::bind(&HWTimer8::Set_OCRA, this, std::placeholders::_1)),
ocrb_reg(this, "OCRB",
- this, &HWTimer8::Get_OCRB, &HWTimer8::Set_OCRB)
+ std::bind(&HWTimer8::Get_OCRB, this), std::bind(&HWTimer8::Set_OCRB, this, std::placeholders::_1))
{
// enable OC units and disable registers
if(tcompA) {
@@ -699,25 +699,25 @@ HWTimer16::HWTimer16(AvrDevice *core,
ICaptureSource* icapsrc):
BasicTimerUnit(core, p, unit, tov, ticap, icapsrc, 16),
tcnt_h_reg(this, "TCNTH",
- this, &HWTimer16::Get_TCNTH, &HWTimer16::Set_TCNTH),
+ std::bind(&HWTimer16::Get_TCNTH, this), std::bind(&HWTimer16::Set_TCNTH, this, std::placeholders::_1)),
tcnt_l_reg(this, "TCNTL",
- this, &HWTimer16::Get_TCNTL, &HWTimer16::Set_TCNTL),
+ std::bind(&HWTimer16::Get_TCNTL, this), std::bind(&HWTimer16::Set_TCNTL, this, std::placeholders::_1)),
ocra_h_reg(this, "OCRAH",
- this, &HWTimer16::Get_OCRAH, &HWTimer16::Set_OCRAH),
+ std::bind(&HWTimer16::Get_OCRAH, this), std::bind(&HWTimer16::Set_OCRAH, this, std::placeholders::_1)),
ocra_l_reg(this, "OCRAL",
- this, &HWTimer16::Get_OCRAL, &HWTimer16::Set_OCRAL),
+ std::bind(&HWTimer16::Get_OCRAL, this), std::bind(&HWTimer16::Set_OCRAL, this, std::placeholders::_1)),
ocrb_h_reg(this, "OCRBH",
- this, &HWTimer16::Get_OCRBH, &HWTimer16::Set_OCRBH),
+ std::bind(&HWTimer16::Get_OCRBH, this), std::bind(&HWTimer16::Set_OCRBH, this, std::placeholders::_1)),
ocrb_l_reg(this, "OCRBL",
- this, &HWTimer16::Get_OCRBL, &HWTimer16::Set_OCRBL),
+ std::bind(&HWTimer16::Get_OCRBL, this), std::bind(&HWTimer16::Set_OCRBL, this, std::placeholders::_1)),
ocrc_h_reg(this, "OCRCH",
- this, &HWTimer16::Get_OCRCH, &HWTimer16::Set_OCRCH),
+ std::bind(&HWTimer16::Get_OCRCH, this), std::bind(&HWTimer16::Set_OCRCH, this, std::placeholders::_1)),
ocrc_l_reg(this, "OCRCL",
- this, &HWTimer16::Get_OCRCL, &HWTimer16::Set_OCRCL),
+ std::bind(&HWTimer16::Get_OCRCL, this), std::bind(&HWTimer16::Set_OCRCL, this, std::placeholders::_1)),
icr_h_reg(this, "ICRH",
- this, &HWTimer16::Get_ICRH, &HWTimer16::Set_ICRH),
+ std::bind(&HWTimer16::Get_ICRH, this), std::bind(&HWTimer16::Set_ICRH, this, std::placeholders::_1)),
icr_l_reg(this, "ICRL",
- this, &HWTimer16::Get_ICRL, &HWTimer16::Set_ICRL)
+ std::bind(&HWTimer16::Get_ICRL, this), std::bind(&HWTimer16::Set_ICRL, this, std::placeholders::_1))
{
// enable OC units and disable registers
if(tcompA) {
@@ -923,7 +923,7 @@ HWTimer8_0C::HWTimer8_0C(AvrDevice *core,
IRQLine* tov):
HWTimer8(core, p, unit, tov, NULL, NULL, NULL, NULL),
tccr_reg(this, "TCCR",
- this, &HWTimer8_0C::Get_TCCR, &HWTimer8_0C::Set_TCCR)
+ std::bind(&HWTimer8_0C::Get_TCCR, this), std::bind(&HWTimer8_0C::Set_TCCR, this, std::placeholders::_1))
{
ChangeWGM(WGM_NORMAL);
}
@@ -946,7 +946,7 @@ HWTimer8_1C::HWTimer8_1C(AvrDevice *core,
PinAtPort* outA):
HWTimer8(core, p, unit, tov, tcompA, outA, NULL, NULL),
tccr_reg(this, "TCCR",
- this, &HWTimer8_1C::Get_TCCR, &HWTimer8_1C::Set_TCCR) {}
+ std::bind(&HWTimer8_1C::Get_TCCR, this), std::bind(&HWTimer8_1C::Set_TCCR, this, std::placeholders::_1)) {}
void HWTimer8_1C::Set_TCCR(unsigned char val) {
WGMtype temp;
@@ -983,9 +983,9 @@ HWTimer8_2C::HWTimer8_2C(AvrDevice *core,
PinAtPort* outB):
HWTimer8(core, p, unit, tov, tcompA, outA, tcompB, outB),
tccra_reg(this, "TCCRA",
- this, &HWTimer8_2C::Get_TCCRA, &HWTimer8_2C::Set_TCCRA),
+ std::bind(&HWTimer8_2C::Get_TCCRA, this), std::bind(&HWTimer8_2C::Set_TCCRA, this, std::placeholders::_1)),
tccrb_reg(this, "TCCRB",
- this, &HWTimer8_2C::Get_TCCRB, &HWTimer8_2C::Set_TCCRB) {}
+ std::bind(&HWTimer8_2C::Get_TCCRB, this), std::bind(&HWTimer8_2C::Set_TCCRB, this, std::placeholders::_1)) {}
void HWTimer8_2C::Set_WGM(int val) {
WGMtype w;
@@ -1053,9 +1053,9 @@ HWTimer16_1C::HWTimer16_1C(AvrDevice *core,
ICaptureSource* icapsrc):
HWTimer16(core, p, unit, tov, tcompA, outA, NULL, NULL, NULL, NULL, ticap, icapsrc),
tccra_reg(this, "TCCRA",
- this, &HWTimer16_1C::Get_TCCRA, &HWTimer16_1C::Set_TCCRA),
+ std::bind(&HWTimer16_1C::Get_TCCRA, this), std::bind(&HWTimer16_1C::Set_TCCRA, this, std::placeholders::_1)),
tccrb_reg(this, "TCCRB",
- this, &HWTimer16_1C::Get_TCCRB, &HWTimer16_1C::Set_TCCRB) {}
+ std::bind(&HWTimer16_1C::Get_TCCRB, this), std::bind(&HWTimer16_1C::Set_TCCRB, this, std::placeholders::_1)) {}
void HWTimer16_1C::Set_WGM(int val) {
WGMtype w;
@@ -1120,9 +1120,9 @@ HWTimer16_2C2::HWTimer16_2C2(AvrDevice *core,
HWTimer16(core, p, unit, tov, tcompA, outA, tcompB, outB, NULL, NULL, ticap, icapsrc),
at8515_mode(is_at8515),
tccra_reg(this, "TCCRA",
- this, &HWTimer16_2C2::Get_TCCRA, &HWTimer16_2C2::Set_TCCRA),
+ std::bind(&HWTimer16_2C2::Get_TCCRA, this), std::bind(&HWTimer16_2C2::Set_TCCRA, this, std::placeholders::_1)),
tccrb_reg(this, "TCCRB",
- this, &HWTimer16_2C2::Get_TCCRB, &HWTimer16_2C2::Set_TCCRB)
+ std::bind(&HWTimer16_2C2::Get_TCCRB, this), std::bind(&HWTimer16_2C2::Set_TCCRB, this, std::placeholders::_1))
{}
void HWTimer16_2C2::Set_WGM(int val) {
@@ -1199,11 +1199,11 @@ HWTimer16_2C3::HWTimer16_2C3(AvrDevice *core,
ICaptureSource* icapsrc):
HWTimer16(core, p, unit, tov, tcompA, outA, tcompB, outB, NULL, NULL, ticap, icapsrc),
tccra_reg(this, "TCCRA",
- this, &HWTimer16_2C3::Get_TCCRA, &HWTimer16_2C3::Set_TCCRA),
+ std::bind(&HWTimer16_2C3::Get_TCCRA, this), std::bind(&HWTimer16_2C3::Set_TCCRA, this, std::placeholders::_1)),
tccrb_reg(this, "TCCRB",
- this, &HWTimer16_2C3::Get_TCCRB, &HWTimer16_2C3::Set_TCCRB),
+ std::bind(&HWTimer16_2C3::Get_TCCRB, this), std::bind(&HWTimer16_2C3::Set_TCCRB, this, std::placeholders::_1)),
tccrc_reg(this, "TCCRC",
- this, &HWTimer16_2C3::Get_TCCRC, &HWTimer16_2C3::Set_TCCRC) {}
+ std::bind(&HWTimer16_2C3::Get_TCCRC, this), std::bind(&HWTimer16_2C3::Set_TCCRC, this, std::placeholders::_1)) {}
void HWTimer16_2C3::Set_TCCRA(unsigned char val) {
int temp = (int)wgm;
@@ -1261,11 +1261,11 @@ HWTimer16_3C::HWTimer16_3C(AvrDevice *core,
ICaptureSource* icapsrc):
HWTimer16(core, p, unit, tov, tcompA, outA, tcompB, outB, tcompC, outC, ticap, icapsrc),
tccra_reg(this, "TCCRA",
- this, &HWTimer16_3C::Get_TCCRA, &HWTimer16_3C::Set_TCCRA),
+ std::bind(&HWTimer16_3C::Get_TCCRA, this), std::bind(&HWTimer16_3C::Set_TCCRA, this, std::placeholders::_1)),
tccrb_reg(this, "TCCRB",
- this, &HWTimer16_3C::Get_TCCRB, &HWTimer16_3C::Set_TCCRB),
+ std::bind(&HWTimer16_3C::Get_TCCRB, this), std::bind(&HWTimer16_3C::Set_TCCRB, this, std::placeholders::_1)),
tccrc_reg(this, "TCCRC",
- this, &HWTimer16_3C::Get_TCCRC, &HWTimer16_3C::Set_TCCRC) {}
+ std::bind(&HWTimer16_3C::Get_TCCRC, this), std::bind(&HWTimer16_3C::Set_TCCRC, this, std::placeholders::_1)) {}
void HWTimer16_3C::Set_TCCRA(unsigned char val) {
int temp = (int)wgm;
@@ -1340,21 +1340,21 @@ HWTimerTinyX5::HWTimerTinyX5(AvrDevice *core,
timerOCRAInt(tocra),
timerOCRBInt(tocrb),
tccr_reg(this, "TCCR1",
- this, &HWTimerTinyX5::Get_TCCR, &HWTimerTinyX5::Set_TCCR),
+ std::bind(&HWTimerTinyX5::Get_TCCR, this), std::bind(&HWTimerTinyX5::Set_TCCR, this, std::placeholders::_1)),
tcnt_reg(this, "TCNT1",
- this, &HWTimerTinyX5::Get_TCNT, &HWTimerTinyX5::Set_TCNT),
+ std::bind(&HWTimerTinyX5::Get_TCNT, this), std::bind(&HWTimerTinyX5::Set_TCNT, this, std::placeholders::_1)),
tocra_reg(this, "OCR1A",
- this, &HWTimerTinyX5::Get_OCRA, &HWTimerTinyX5::Set_OCRA),
+ std::bind(&HWTimerTinyX5::Get_OCRA, this), std::bind(&HWTimerTinyX5::Set_OCRA, this, std::placeholders::_1)),
tocrb_reg(this, "OCR1B",
- this, &HWTimerTinyX5::Get_OCRB, &HWTimerTinyX5::Set_OCRB),
+ std::bind(&HWTimerTinyX5::Get_OCRB, this), std::bind(&HWTimerTinyX5::Set_OCRB, this, std::placeholders::_1)),
tocrc_reg(this, "OCR1C",
- this, &HWTimerTinyX5::Get_OCRC, &HWTimerTinyX5::Set_OCRC),
+ std::bind(&HWTimerTinyX5::Get_OCRC, this), std::bind(&HWTimerTinyX5::Set_OCRC, this, std::placeholders::_1)),
dtps1_reg(this, "DTPS1",
- this, &HWTimerTinyX5::Get_DTPS1, &HWTimerTinyX5::Set_DTPS1),
+ std::bind(&HWTimerTinyX5::Get_DTPS1, this), std::bind(&HWTimerTinyX5::Set_DTPS1, this, std::placeholders::_1)),
dt1a_reg(this, "DT1A",
- this, &HWTimerTinyX5::Get_DT1A, &HWTimerTinyX5::Set_DT1A),
+ std::bind(&HWTimerTinyX5::Get_DT1A, this), std::bind(&HWTimerTinyX5::Set_DT1A, this, std::placeholders::_1)),
dt1b_reg(this, "DT1B",
- this, &HWTimerTinyX5::Get_DT1B, &HWTimerTinyX5::Set_DT1B)
+ std::bind(&HWTimerTinyX5::Get_DT1B, this), std::bind(&HWTimerTinyX5::Set_DT1B, this, std::placeholders::_1))
{
// gtccr and pllcsr register
gtccrRegister = gtccr;
diff --git a/src/hwtimer/hwtimer.h b/src/hwtimer/hwtimer.h
index 8596e74..36e6b2d 100644
--- a/src/hwtimer/hwtimer.h
+++ b/src/hwtimer/hwtimer.h
@@ -226,9 +226,9 @@ class HWTimer8: public BasicTimerUnit {
unsigned char Get_OCRB() { return GetCompareRegister(1); }
public:
- IOReg tcnt_reg; //!< counter register
- IOReg ocra_reg; //!< output compare A register
- IOReg ocrb_reg; //!< output compare B register
+ IOReg tcnt_reg; //!< counter register
+ IOReg ocra_reg; //!< output compare A register
+ IOReg ocrb_reg; //!< output compare B register
HWTimer8(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -307,16 +307,16 @@ class HWTimer16: public BasicTimerUnit {
unsigned char Get_ICRL() { return GetComplexRegister(true, false); }
public:
- IOReg tcnt_h_reg; //!< counter register, high byte
- IOReg tcnt_l_reg; //!< counter register, low byte
- IOReg ocra_h_reg; //!< output compare A register, high byte
- IOReg ocra_l_reg; //!< output compare A register, low byte
- IOReg ocrb_h_reg; //!< output compare B register, high byte
- IOReg ocrb_l_reg; //!< output compare B register, low byte
- IOReg ocrc_h_reg; //!< output compare C register, high byte
- IOReg ocrc_l_reg; //!< output compare C register, low byte
- IOReg icr_h_reg; //!< input capture register, high byte
- IOReg icr_l_reg; //!< input capture register, low byte
+ IOReg tcnt_h_reg; //!< counter register, high byte
+ IOReg tcnt_l_reg; //!< counter register, low byte
+ IOReg ocra_h_reg; //!< output compare A register, high byte
+ IOReg ocra_l_reg; //!< output compare A register, low byte
+ IOReg ocrb_h_reg; //!< output compare B register, high byte
+ IOReg ocrb_l_reg; //!< output compare B register, low byte
+ IOReg ocrc_h_reg; //!< output compare C register, high byte
+ IOReg ocrc_l_reg; //!< output compare C register, low byte
+ IOReg icr_h_reg; //!< input capture register, high byte
+ IOReg icr_l_reg; //!< input capture register, low byte
HWTimer16(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -355,7 +355,7 @@ class HWTimer8_0C: public HWTimer8 {
unsigned char Get_TCCR() { return tccr_val; }
public:
- IOReg tccr_reg; //!< control register
+ IOReg tccr_reg; //!< control register
HWTimer8_0C(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -385,7 +385,7 @@ class HWTimer8_1C: public HWTimer8 {
unsigned char Get_TCCR() { return tccr_val; }
public:
- IOReg tccr_reg; //!< control register
+ IOReg tccr_reg; //!< control register
HWTimer8_1C(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -436,8 +436,8 @@ class HWTimer8_2C: public HWTimer8 {
unsigned char Get_TCCRB() { return tccrb_val; }
public:
- IOReg tccra_reg; //!< control register A
- IOReg tccrb_reg; //!< control register B
+ IOReg tccra_reg; //!< control register A
+ IOReg tccrb_reg; //!< control register B
HWTimer8_2C(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -490,8 +490,8 @@ class HWTimer16_1C: public HWTimer16 {
unsigned char Get_TCCRB() { return tccrb_val; }
public:
- IOReg tccra_reg; //!< control register A
- IOReg tccrb_reg; //!< control register B
+ IOReg tccra_reg; //!< control register A
+ IOReg tccrb_reg; //!< control register B
HWTimer16_1C(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -549,8 +549,8 @@ class HWTimer16_2C2: public HWTimer16 {
unsigned char Get_TCCRB() { return tccrb_val; }
public:
- IOReg tccra_reg; //!< control register A
- IOReg tccrb_reg; //!< control register B
+ IOReg tccra_reg; //!< control register A
+ IOReg tccrb_reg; //!< control register B
HWTimer16_2C2(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -612,9 +612,9 @@ class HWTimer16_2C3: public HWTimer16 {
unsigned char Get_TCCRC() { return 0; } // will be read allways 0!
public:
- IOReg tccra_reg; //!< control register A
- IOReg tccrb_reg; //!< control register B
- IOReg tccrc_reg; //!< control register C
+ IOReg tccra_reg; //!< control register A
+ IOReg tccrb_reg; //!< control register B
+ IOReg tccrc_reg; //!< control register C
HWTimer16_2C3(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -675,9 +675,9 @@ class HWTimer16_3C: public HWTimer16 {
unsigned char Get_TCCRC() { return 0; } // will be read allways 0!
public:
- IOReg tccra_reg; //!< control register A
- IOReg tccrb_reg; //!< control register B
- IOReg tccrc_reg; //!< control register C
+ IOReg tccra_reg; //!< control register A
+ IOReg tccrb_reg; //!< control register B
+ IOReg tccrc_reg; //!< control register C
HWTimer16_3C(AvrDevice *core,
PrescalerMultiplexer *p,
@@ -910,14 +910,14 @@ class HWTimerTinyX5: public Hardware,
void TransferOutputValues(void);
public:
- IOReg tccr_reg; //!< control register
- IOReg tcnt_reg; //!< counter register
- IOReg tocra_reg; //!< OCR register channel A
- IOReg tocrb_reg; //!< OCR register channel B
- IOReg tocrc_reg; //!< OCR register channel C
- IOReg dtps1_reg; //!< dead time generator prescaler register
- IOReg dt1a_reg; //!< dead time generator register channel A
- IOReg dt1b_reg; //!< dead time generator register channel B
+ IOReg tccr_reg; //!< control register
+ IOReg tcnt_reg; //!< counter register
+ IOReg tocra_reg; //!< OCR register channel A
+ IOReg tocrb_reg; //!< OCR register channel B
+ IOReg tocrc_reg; //!< OCR register channel C
+ IOReg dtps1_reg; //!< dead time generator prescaler register
+ IOReg dt1a_reg; //!< dead time generator register channel A
+ IOReg dt1b_reg; //!< dead time generator register channel B
HWTimerTinyX5(AvrDevice *core,
IOSpecialReg *gtccr,
diff --git a/src/hwuart.cpp b/src/hwuart.cpp
index acd2eb9..79f327d 100644
--- a/src/hwuart.cpp
+++ b/src/hwuart.cpp
@@ -539,19 +539,26 @@ HWUart::HWUart(AvrDevice *core,
vectorUdre(udre_interrupt),
vectorTx(tx_interrupt),
udr_reg(this, "UDR",
- this, &HWUart::GetUdr, &HWUart::SetUdr),
+ std::bind(&HWUart::GetUdr, this),
+ std::bind(&HWUart::SetUdr, this, std::placeholders::_1)),
usr_reg(this, "USR",
- this, &HWUart::GetUsr, &HWUart::SetUsr),
+ std::bind(&HWUart::GetUsr, this),
+ std::bind(&HWUart::SetUsr, this, std::placeholders::_1)),
ucr_reg(this, "UCR",
- this, &HWUart::GetUcr, &HWUart::SetUcr),
+ std::bind(&HWUart::GetUcr, this),
+ std::bind(&HWUart::SetUcr, this, std::placeholders::_1)),
ucsra_reg(this, "UCSRA",
- this, &HWUart::GetUsr, &HWUart::SetUsr),
+ std::bind(&HWUart::GetUsr, this),
+ std::bind(&HWUart::SetUsr, this, std::placeholders::_1)),
ucsrb_reg(this, "UCSRB",
- this, &HWUart::GetUcr, &HWUart::SetUcr),
+ std::bind(&HWUart::GetUcr, this),
+ std::bind(&HWUart::SetUcr, this, std::placeholders::_1)),
ubrr_reg(this, "UBRR",
- this, &HWUart::GetUbrr, &HWUart::SetUbrr),
+ std::bind(&HWUart::GetUbrr, this),
+ std::bind(&HWUart::SetUbrr, this, std::placeholders::_1)),
ubrrhi_reg(this, "UBRRHI",
- this, &HWUart::GetUbrrhi, &HWUart::SetUbrrhi)
+ std::bind(&HWUart::GetUbrrhi, this),
+ std::bind(&HWUart::SetUbrrhi, this, std::placeholders::_1))
{
irqSystem->DebugVerifyInterruptVector(vectorRx, this);
irqSystem->DebugVerifyInterruptVector(vectorUdre, this);
@@ -661,11 +668,11 @@ HWUsart::HWUsart(AvrDevice *core,
HWUart(core, s, tx, rx, vrx, vudre, vtx, instance_id),
pinXck(xck),
ucsrc_reg(this, "UCSRC",
- this, &HWUsart::GetUcsrc, &HWUsart::SetUcsrc),
+ std::bind(&HWUsart::GetUcsrc, this), std::bind(&HWUsart::SetUcsrc, this, std::placeholders::_1)),
ubrrh_reg(this, "UBRRH",
- this, &HWUsart::GetUbrrhi, &HWUsart::SetUbrrhi),
+ std::bind(&HWUsart::GetUbrrhi, this), std::bind(&HWUsart::SetUbrrhi, this, std::placeholders::_1)),
ucsrc_ubrrh_reg(this, "UCSRC_UBRRH",
- this, &HWUsart::GetUcsrcUbrrh, &HWUsart::SetUcsrcUbrrh)
+ std::bind(&HWUsart::GetUcsrcUbrrh, this), std::bind(&HWUsart::SetUcsrcUbrrh, this, std::placeholders::_1))
{
if(mxReg) {
ucsrc_reg.releaseTraceValue();
diff --git a/src/hwuart.h b/src/hwuart.h
index 2ce2674..ad83726 100644
--- a/src/hwuart.h
+++ b/src/hwuart.h
@@ -132,7 +132,7 @@ class HWUart: public Hardware, public TraceValueRegister {
void CheckForNewSetIrq(unsigned char);
void CheckForNewClearIrq(unsigned char);
- IOReg
+ IOReg
udr_reg,
usr_reg,
ucr_reg,
@@ -170,9 +170,9 @@ class HWUsart: public HWUart {
unsigned char GetUcsrc();
unsigned char GetUcsrcUbrrh();
- IOReg ucsrc_reg,
- ubrrh_reg,
- ucsrc_ubrrh_reg;
+ IOReg ucsrc_reg,
+ ubrrh_reg,
+ ucsrc_ubrrh_reg;
};
#endif
diff --git a/src/hwusi.cpp b/src/hwusi.cpp
index 06880d2..7a95ac9 100644
--- a/src/hwusi.cpp
+++ b/src/hwusi.cpp
@@ -212,9 +212,9 @@ HWUSI::HWUSI(AvrDevice *_c,
core(_c), irq(_irq),
DI(din), DO(dout), SCK(sck),
irq_start(ivec_start), irq_ovr(ivec_ovr),
- usidr_reg(this, "USIDR", this, &HWUSI::GetUSIDR, &HWUSI::SetUSIDR),
- usisr_reg(this, "USISR", this, &HWUSI::GetUSISR, &HWUSI::SetUSISR),
- usicr_reg(this, "USICR", this, &HWUSI::GetUSICR, &HWUSI::SetUSICR)
+ usidr_reg(this, "USIDR", std::bind(&HWUSI::GetUSIDR, this), std::bind(&HWUSI::SetUSIDR, this, std::placeholders::_1)),
+ usisr_reg(this, "USISR", std::bind(&HWUSI::GetUSISR, this), std::bind(&HWUSI::SetUSISR, this, std::placeholders::_1)),
+ usicr_reg(this, "USICR", std::bind(&HWUSI::GetUSICR, this), std::bind(&HWUSI::SetUSICR, this, std::placeholders::_1))
{
irq->DebugVerifyInterruptVector(ivec_start, this);
irq->DebugVerifyInterruptVector(ivec_ovr, this);
@@ -366,7 +366,7 @@ HWUSI_BR::HWUSI_BR(AvrDevice *_c,
unsigned int ivec_start,
unsigned int ivec_ovr):
HWUSI(_c, _irq, din, dout, sck, ivec_start, ivec_ovr),
- usibr_reg(this, "USIBR", this, &HWUSI_BR::GetUSIBR, &HWUSI_BR::SetUSIBR)
+ usibr_reg(this, "USIBR", std::bind(&HWUSI_BR::GetUSIBR, this), std::bind(&HWUSI_BR::SetUSIBR, this, std::placeholders::_1))
{
Reset();
}
diff --git a/src/hwusi.h b/src/hwusi.h
index b8c5573..231a9ac 100644
--- a/src/hwusi.h
+++ b/src/hwusi.h
@@ -167,9 +167,9 @@ class HWUSI: public Hardware, public SimulationMember, public TraceValueRegister
unsigned char GetUSICR(void) { return control_data; }
/* IO registers connected with USI */
- IOReg usidr_reg,
- usisr_reg,
- usicr_reg;
+ IOReg usidr_reg,
+ usisr_reg,
+ usicr_reg;
};
class HWUSI_BR: public HWUSI {
@@ -200,7 +200,7 @@ class HWUSI_BR: public HWUSI {
unsigned char GetUSIBR(void) { return buffer_data; }
/* IO registers connected with USI */
- IOReg usibr_reg;
+ IOReg usibr_reg;
};
#endif
diff --git a/src/hwwado.cpp b/src/hwwado.cpp
index 3057553..20ac725 100644
--- a/src/hwwado.cpp
+++ b/src/hwwado.cpp
@@ -70,7 +70,7 @@ HWWado::HWWado(AvrDevice *c):
TraceValueRegister(c, "WADO"),
core(c),
wdtcr_reg(this, "WDTCR",
- this, &HWWado::GetWdtcr, &HWWado::SetWdtcr) {
+ std::bind(&HWWado::GetWdtcr, this), std::bind(&HWWado::SetWdtcr, this, std::placeholders::_1)) {
core->AddToCycleList(this);
Reset();
}
diff --git a/src/hwwado.h b/src/hwwado.h
index 8f7a170..ae7dc16 100644
--- a/src/hwwado.h
+++ b/src/hwwado.h
@@ -51,7 +51,7 @@ class HWWado: public Hardware, public TraceValueRegister {
void Wdr(); //reset the wado counter
void Reset();
- IOReg wdtcr_reg;
+ IOReg wdtcr_reg;
};
diff --git a/src/ioregs.cpp b/src/ioregs.cpp
index dae40f4..24be530 100644
--- a/src/ioregs.cpp
+++ b/src/ioregs.cpp
@@ -32,7 +32,8 @@ AddressExtensionRegister::AddressExtensionRegister(AvrDevice *core,
TraceValueRegister(core, regname),
reg_mask((1 << bitsize) - 1),
ext_reg(this, regname,
- this, &AddressExtensionRegister::GetRegVal, &AddressExtensionRegister::SetRegVal)
+ std::bind(&AddressExtensionRegister::GetRegVal, this),
+ std::bind(&AddressExtensionRegister::SetRegVal, this, std::placeholders::_1))
{
Reset();
}
diff --git a/src/ioregs.h b/src/ioregs.h
index d684765..391b0e4 100644
--- a/src/ioregs.h
+++ b/src/ioregs.h
@@ -42,7 +42,7 @@ class AddressExtensionRegister: public Hardware, public TraceValueRegister {
unsigned char GetRegVal() { return reg_val; }
void SetRegVal(unsigned char val) { reg_val = val & reg_mask; }
- IOReg ext_reg;
+ IOReg ext_reg;
};
#endif
diff --git a/src/rwmem.h b/src/rwmem.h
index c948d7a..52e2f5c 100644
--- a/src/rwmem.h
+++ b/src/rwmem.h
@@ -29,6 +29,7 @@
#include // std::string
#include
+#include
#include "traceval.h"
#include "avrerror.h"
@@ -224,26 +225,21 @@ class NotSimulatedRegister : public RWMemoryMember {
void set(unsigned char);
};
-//! IO register to be specialized for a certain class/hardware
-/*! The template parameter class P specifies the class type in which
- the io register resides. */
-template
+//! IO register to be owned by a certain class/hardware
class IOReg: public RWMemoryMember {
public:
- typedef unsigned char(P::*getter_t)();
- typedef void (P::*setter_t)(unsigned char);
+ typedef std::function getter_t;
+ typedef std::function setter_t;
/*! Creates an IO control register for controlling hardware units
- \param _p: pointer to object this will be part of
+ \param _o: pointer to object this will be part of
\param _g: pointer to get method
\param _s: pointer to set method */
IOReg(TraceValueRegister *registry,
const std::string &tracename,
- P *_p,
- getter_t _g=0,
- setter_t _s=0):
+ getter_t _g=nullptr,
+ setter_t _s=nullptr):
RWMemoryMember(registry, tracename),
- p(_p),
g(_g),
s(_s)
{
@@ -267,7 +263,7 @@ class IOReg: public RWMemoryMember {
protected:
unsigned char get() const {
if (g)
- return (p->*g)();
+ return g();
else if (tv) {
avr_warning("Reading of '%s' is not supported.", tv->name().c_str());
}
@@ -275,14 +271,13 @@ class IOReg: public RWMemoryMember {
}
void set(unsigned char val) {
if (s)
- (p->*s)(val);
+ s(val);
else if (tv) {
avr_warning("Writing of '%s' (with %d) is not supported.", tv->name().c_str(), val);
}
}
private:
- P *p;
getter_t g;
setter_t s;
};
--
2.11.0