text: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   * 
   *  http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */
  
  #include "hw/cpu/commands/cpu/arithmetics/c8xy5.hpp"
  #include "hw/cpu/cpu.hpp"
  
  namespace hw::cpu::commands::cpu::arithmetics {
  C8XY5::C8XY5( const std::shared_ptr< HardwareMediator >& mediator )
  	: Command{ mediator } {}
  
  void C8XY5::execute( uint16_t value ) const {
  	// Check if the mediator is present
  	if( !mediator_ ) return;
  
  	// Check if CPU is OK
  	auto cpu = mediator_->getCPU();
  	if( !cpu ) return;
  
  	// Get the registers
  	auto& registers = cpu->getRegisters();
  
  	// Make changes to according to the opcode role
  	const auto vx_index = ( value & 0x0F00 ) >> 8;
  	const auto vx		= registers.getRegister( vx_index );
  	const auto vy		= registers.getRegister( ( value & 0x00F0 ) >> 4 );
  
  	// Update the register
  	registers.setRegister( vx_index, vx - vy );
  
  	// Set VF to borrow flag
  	registers.setRegister( 0xF, vx > vy );
  }
  } // namespace hw::cpu::commands::cpu::arithmetics