diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-01-23 22:02:11 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-01-23 22:02:11 +0100 |
| commit | b1d1573702f21e3104606d6ade5f5d39ec86a33a (patch) | |
| tree | d703be130a5d6f9ff2626313d3380ed34de44dd7 /lib/nes/util/address.hh | |
| parent | 6512dd599d13035f6a90b2009344e02c488f5aae (diff) | |
restructure project
Diffstat (limited to 'lib/nes/util/address.hh')
| -rw-r--r-- | lib/nes/util/address.hh | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/nes/util/address.hh b/lib/nes/util/address.hh new file mode 100644 index 0000000..7987d07 --- /dev/null +++ b/lib/nes/util/address.hh @@ -0,0 +1,73 @@ +#pragma once + +#include <cstdint> + +namespace nes +{ + /// An address on the NES. + class address + { + std::uint16_t absolute_{ 0 }; + + public: + /// Create a zero address. + constexpr explicit address() = default; + + /// Create an address from its absolute value. + constexpr explicit address(std::uint16_t const absolute) + : absolute_{ absolute } + { + } + + /// Create an address from its page and offset combination. + constexpr explicit address(std::uint8_t const page, std::uint8_t const offset) + : address{ static_cast<std::uint16_t>((page << 8) | (offset << 0)) } + { + } + + /// Get the absolute address value. + constexpr auto get_absolute() const -> std::uint16_t + { + return absolute_; + } + + /// Get the address page (the first 8 bits). + constexpr auto get_page() const -> std::uint8_t + { + return static_cast<std::uint8_t>((get_absolute() & 0xFF00) >> 8); + } + + /// Get the offset within the page (the last 8 bits). + constexpr auto get_offset() const -> std::uint8_t + { + return static_cast<std::uint8_t>((get_absolute() & 0x00FF) >> 0); + } + }; + + constexpr auto operator==(address const a, address const b) -> bool { return a.get_absolute() == b.get_absolute(); } + constexpr auto operator!=(address const a, address const b) -> bool { return a.get_absolute() != b.get_absolute(); } + constexpr auto operator<(address const a, address const b) -> bool { return a.get_absolute() < b.get_absolute(); } + constexpr auto operator>(address const a, address const b) -> bool { return a.get_absolute() > b.get_absolute(); } + constexpr auto operator<=(address const a, address const b) -> bool { return a.get_absolute() <= b.get_absolute(); } + constexpr auto operator>=(address const a, address const b) -> bool { return a.get_absolute() >= b.get_absolute(); } + + constexpr auto operator+(address const a, std::uint16_t const b) -> address + { + return address{ static_cast<std::uint16_t>(a.get_absolute() + b) }; + } + + constexpr auto operator+(std::uint16_t const a, address const b) -> address + { + return address{ static_cast<std::uint16_t>(a + b.get_absolute()) }; + } + + constexpr auto operator-(address const a, std::uint16_t const b) -> address + { + return address{ static_cast<std::uint16_t>(a.get_absolute() - b) }; + } + + constexpr auto operator%(address const a, std::uint16_t const b) -> address + { + return address{ static_cast<std::uint16_t>(a.get_absolute() % b) }; + } +} // namespace nes
\ No newline at end of file |
