// // LoadStore.hpp // Clock Signal // // Created by Thomas Harte on 08/11/2023. // Copyright © 2023 Thomas Harte. All rights reserved. // #pragma once #include "../AccessType.hpp" #include namespace InstructionSet::x86::Primitive { template void xchg( modify_t destination, modify_t source ) { /* TEMP ← DEST DEST ← SRC SRC ← TEMP */ std::swap(destination, source); } template void ld( const InstructionT &instruction, write_t destination, ContextT &context ) { const auto pointer = instruction.source(); uint16_t source_address = uint16_t(address(instruction, pointer, context)); const Source source_segment = instruction.data_segment(); context.memory.preauthorise_read(source_segment, source_address, 4); destination = context.memory.template access(source_segment, source_address); source_address += 2; switch(selector) { case Source::DS: context.registers.ds() = context.memory.template access(source_segment, source_address); break; case Source::ES: context.registers.es() = context.memory.template access(source_segment, source_address); break; } } template void lea( const InstructionT &instruction, write_t destination, ContextT &context ) { // TODO: address size. destination = IntT(address(instruction, instruction.source(), context)); } template void xlat( const InstructionT &instruction, ContextT &context ) { AddressT address; if constexpr (std::is_same_v) { address = context.registers.bx() + context.registers.al(); } context.registers.al() = context.memory.template access(instruction.data_segment(), address); } template void mov( write_t destination, read_t source ) { destination = source; } }