Skip to content

Commit

Permalink
Add read prefix to PROGMEM entry accessors
Browse files Browse the repository at this point in the history
  • Loading branch information
tgtakaoka committed Sep 26, 2024
1 parent ac22f97 commit dc0ad21
Show file tree
Hide file tree
Showing 53 changed files with 839 additions and 825 deletions.
10 changes: 5 additions & 5 deletions src/entry_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,23 @@ namespace entry {
template <typename OPCODE>
struct Base {
constexpr Base(const /* PROGMEM */ char *name_P, OPCODE opCode)
: _name_P(name_P), _opCode(opCode) {}
: _name_P(name_P), _opCode_P(opCode) {}

const /* PROGMEM */ char *name_P() const {
return reinterpret_cast<const char *>(pgm_read_ptr(&_name_P));
}

OPCODE opCode() const {
OPCODE readOpCode() const {
if (sizeof(OPCODE) == 1) {
return pgm_read_byte(&_opCode);
return pgm_read_byte(&_opCode_P);
} else {
return pgm_read_word(&_opCode);
return pgm_read_word(&_opCode_P);
}
}

private:
const /* PROGMEM */ char *const _name_P;
const OPCODE _opCode;
const OPCODE _opCode_P;
};

} // namespace entry
Expand Down
18 changes: 9 additions & 9 deletions src/entry_cdp1802.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,22 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint8_t>(opr2) << opr2_gp))};
}

Flags read() const { return Flags{pgm_read_byte(&_attr)}; }
AddrMode mode1() const { return AddrMode((_attr >> opr1_gp) & mode_gm); }
AddrMode mode2() const { return AddrMode((_attr >> opr2_gp) & mode_gm); }

private:
static constexpr int opr1_gp = 0;
static constexpr int opr2_gp = 4;
static constexpr uint8_t mode_gm = 0xF;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_byte(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr int opr1_gp = 0;
static constexpr int opr2_gp = 4;
static constexpr uint8_t mode_gm = 0xF;
const Flags _flags_P;
};

} // namespace cdp1802
Expand Down
18 changes: 9 additions & 9 deletions src/entry_f3850.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,22 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint8_t>(opr2) << opr2_gp))};
}

Flags read() const { return Flags{pgm_read_word(&_attr)}; }
AddrMode mode1() const { return AddrMode((_attr >> opr1_gp) & mode_gm); }
AddrMode mode2() const { return AddrMode((_attr >> opr2_gp) & mode_gm); }

private:
static constexpr int opr1_gp = 0;
static constexpr int opr2_gp = 8;
static constexpr uint8_t mode_gm = 0xFF;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_word(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr int opr1_gp = 0;
static constexpr int opr2_gp = 8;
static constexpr uint8_t mode_gm = 0xFF;
const Flags _flags_P;
};

} // namespace f3850
Expand Down
18 changes: 9 additions & 9 deletions src/entry_i8048.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,22 +66,22 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint16_t>(src) << src_gp))};
}

Flags read() const { return Flags{pgm_read_word(&_attr)}; }
AddrMode dst() const { return AddrMode((_attr >> dst_gp) & mode_gm); }
AddrMode src() const { return AddrMode((_attr >> src_gp) & mode_gm); }

private:
static constexpr uint8_t dst_gp = 0;
static constexpr uint8_t src_gp = 5;
static constexpr uint8_t mode_gm = 0x1f;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_word(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr uint8_t dst_gp = 0;
static constexpr uint8_t src_gp = 5;
static constexpr uint8_t mode_gm = 0x1f;
const Flags _flags_P;
};

} // namespace i8048
Expand Down
20 changes: 10 additions & 10 deletions src/entry_i8051.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,24 +56,24 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint16_t>(ext) << ext_gp))};
}

Flags read() const { return Flags{pgm_read_word(&_attr)}; }
AddrMode dst() const { return AddrMode((_attr >> dst_gp) & mode_gm); }
AddrMode src() const { return AddrMode((_attr >> src_gp) & mode_gm); }
AddrMode ext() const { return AddrMode((_attr >> ext_gp) & mode_gm); }

private:
static constexpr uint8_t dst_gp = 0;
static constexpr uint8_t src_gp = 5;
static constexpr uint8_t ext_gp = 10;
static constexpr uint8_t mode_gm = 0x1f;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_word(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr uint8_t dst_gp = 0;
static constexpr uint8_t src_gp = 5;
static constexpr uint8_t ext_gp = 10;
static constexpr uint8_t mode_gm = 0x1f;
const Flags _flags_P;
};

} // namespace i8051
Expand Down
18 changes: 9 additions & 9 deletions src/entry_i8080.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,22 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint8_t>(dst) << dst_gp) | (static_cast<uint8_t>(src) << src_gp))};
}

Flags read() const { return Flags{pgm_read_byte(&_attr)}; }
AddrMode dst() const { return AddrMode((_attr >> dst_gp) & mode_gm); }
AddrMode src() const { return AddrMode((_attr >> src_gp) & mode_gm); }

private:
static constexpr int dst_gp = 0;
static constexpr int src_gp = 4;
static constexpr uint8_t mode_gm = 0xF;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_byte(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr int dst_gp = 0;
static constexpr int src_gp = 4;
static constexpr uint8_t mode_gm = 0xF;
const Flags _flags_P;
};

} // namespace i8080
Expand Down
78 changes: 39 additions & 39 deletions src/entry_i8086.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ enum OprSize : uint8_t {
SZ_WORD = Size::SZ_WORD,
SZ_DWORD = Size::SZ_QUAD,
SZ_QWORD = Size::SZ_OCTA,
SZ_TBYTE = Size::SZ_DATA, // 10 byte
SZ_TBYTE = Size::SZ_DATA, // 10 byte
};

enum OprPos : uint8_t {
Expand All @@ -99,68 +99,68 @@ struct Entry final : entry::Base<Config::opcode_t> {
uint8_t _dst;
uint8_t _src;
uint8_t _ext;
uint8_t _size;
uint8_t _attr;

static constexpr Flags create(AddrMode dst, AddrMode src, AddrMode ext, OprPos dstPos,
OprPos srcPos, OprPos extPos, OprSize size) {
return Entry::Flags{Entry::_opr(dst, dstPos), Entry::_opr(src, srcPos),
Entry::_opr(ext, extPos), Entry::_size(size, false, false)};
return Flags{_opr(dst, dstPos), _opr(src, srcPos), _opr(ext, extPos),
_size(size, false, false)};
}

static constexpr Flags fpuInst(
AddrMode dst, AddrMode src, OprPos dstPos, OprPos srcPos, OprSize size) {
return Entry::Flags{Entry::_opr(dst, dstPos), Entry::_opr(src, srcPos),
Entry::_opr(M_NONE, P_NONE), Entry::_size(size, false, true)};
return Flags{_opr(dst, dstPos), _opr(src, srcPos), _opr(M_NONE, P_NONE),
_size(size, false, true)};
}

static constexpr Flags strInst(AddrMode dst, AddrMode src, OprSize size) {
return Entry::Flags{Entry::_opr(dst, P_NONE), Entry::_opr(src, P_NONE),
Entry::_opr(M_NONE, P_NONE), Entry::_size(size, true, false)};
return Flags{_opr(dst, P_NONE), _opr(src, P_NONE), _opr(M_NONE, P_NONE),
_size(size, true, false)};
}

Flags read() const {
return Flags{pgm_read_byte(&_dst), pgm_read_byte(&_src), pgm_read_byte(&_ext),
pgm_read_byte(&_size)};
}
AddrMode dst() const { return AddrMode((_dst >> mode_gp) & mode_gm); }
AddrMode src() const { return AddrMode((_src >> mode_gp) & mode_gm); }
AddrMode ext() const { return AddrMode((_ext >> mode_gp) & mode_gm); }
OprPos dstPos() const { return OprPos((_dst >> pos_gp) & pos_gm); }
OprPos srcPos() const { return OprPos((_src >> pos_gp) & pos_gm); }
OprPos extPos() const { return OprPos((_ext >> pos_gp) & pos_gm); }
OprSize size() const { return OprSize((_size >> size_gp) & size_gm); }
bool stringInst() const { return _size & strInst_bm; }
bool fpuInst() const { return _size & fpuInst_bm; }
};
OprSize size() const { return OprSize((_attr >> size_gp) & size_gm); }
bool stringInst() const { return _attr & strInst_bm; }
bool fpuInst() const { return _attr & fpuInst_bm; }

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
private:
static constexpr uint8_t _opr(AddrMode mode, OprPos pos) {
return (static_cast<uint8_t>(mode) << mode_gp) | (static_cast<uint8_t>(pos) << pos_gp);
}
static constexpr uint8_t _size(OprSize size, bool strInst, bool fpuInst) {
return (static_cast<uint8_t>(size) << size_gp) | (strInst ? strInst_bm : 0) |
(fpuInst ? fpuInst_bm : 0);
}

Flags flags() const { return _flags.read(); }
// |_dst|, |_src|, |_ext|
static constexpr int mode_gp = 0;
static constexpr int pos_gp = 5;
static constexpr uint8_t mode_gm = 0x1F;
static constexpr uint8_t pos_gm = 0x07;
// |_size|
static constexpr int size_gp = 0;
static constexpr int strInst_bp = 3;
static constexpr int fpuInst_bp = 4;
static constexpr uint8_t size_gm = 0x07;
static constexpr uint8_t strInst_bm = (1 << strInst_bp);
static constexpr uint8_t fpuInst_bm = (1 << fpuInst_bp);
};

private:
const Flags _flags;
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

static constexpr uint8_t _opr(AddrMode mode, OprPos pos) {
return (static_cast<uint8_t>(mode) << mode_gp) | (static_cast<uint8_t>(pos) << pos_gp);
}
static constexpr uint8_t _size(OprSize size, bool strInst, bool fpuInst) {
return (static_cast<uint8_t>(size) << size_gp) | (strInst ? strInst_bm : 0) |
(fpuInst ? fpuInst_bm : 0);
Flags readFlags() const {
return Flags{pgm_read_byte(&_flags_P._dst), pgm_read_byte(&_flags_P._src),
pgm_read_byte(&_flags_P._ext), pgm_read_byte(&_flags_P._attr)};
}

// |dst|, |src|, |ext|
static constexpr int mode_gp = 0;
static constexpr int pos_gp = 5;
static constexpr uint8_t mode_gm = 0x1F;
static constexpr uint8_t pos_gm = 0x07;
// |size|
static constexpr int size_gp = 0;
static constexpr int strInst_bp = 3;
static constexpr int fpuInst_bp = 4;
static constexpr uint8_t size_gm = 0x07;
static constexpr uint8_t strInst_bm = (1 << strInst_bp);
static constexpr uint8_t fpuInst_bm = (1 << fpuInst_bp);
private:
const Flags _flags_P;
};

} // namespace i8086
Expand Down
24 changes: 12 additions & 12 deletions src/entry_i8096.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,27 @@ struct Entry final : entry::Base<Config::opcode_t> {
(static_cast<uint16_t>(M_NONE) << src2_gp) | undef_bm)};
}

Flags read() const { return Flags{pgm_read_word(&_attr)}; }
AddrMode dst() const { return AddrMode((_attr >> dst_gp) & mode_gm); }
AddrMode src1() const { return AddrMode((_attr >> src1_gp) & mode_gm); }
AddrMode src2() const { return AddrMode((_attr >> src2_gp) & mode_gm); }
bool undefined() const { return _attr & undef_bm; }

private:
static constexpr int dst_gp = 0;
static constexpr int src1_gp = 5;
static constexpr int src2_gp = 10;
static constexpr int undef_bp = 15;
static constexpr uint8_t mode_gm = 0x1f;
static constexpr uint16_t undef_bm = (1 << undef_bp);
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_word(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr int dst_gp = 0;
static constexpr int src1_gp = 5;
static constexpr int src2_gp = 10;
static constexpr int undef_bp = 15;
static constexpr uint8_t mode_gm = 0x1f;
static constexpr uint16_t undef_bm = (1 << undef_bp);
const Flags _flags_P;
};

} // namespace i8096
Expand Down
16 changes: 8 additions & 8 deletions src/entry_ins8060.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,20 @@ struct Entry final : entry::Base<Config::opcode_t> {
return Flags{static_cast<uint8_t>(static_cast<uint8_t>(mode) << mode_gp)};
}

Flags read() const { return Flags{pgm_read_byte(&_attr)}; }
AddrMode mode() const { return AddrMode(_attr); }

private:
static constexpr int mode_gp = 0;
static constexpr uint8_t mode_gm = 0x07;
};

constexpr Entry(Config::opcode_t opCode, Flags flags, const char *name)
: Base(name, opCode), _flags(flags) {}
constexpr Entry(Config::opcode_t opCode, Flags flags, const /* PROGMEM */ char *name_P)
: Base(name_P, opCode), _flags_P(flags) {}

Flags flags() const { return _flags.read(); }
Flags readFlags() const { return Flags{pgm_read_byte(&_flags_P._attr)}; }

private:
const Flags _flags;

static constexpr int mode_gp = 0;
static constexpr uint8_t mode_gm = 0x07;
const Flags _flags_P;
};

} // namespace ins8060
Expand Down
Loading

0 comments on commit dc0ad21

Please sign in to comment.