//
//  CartridgeParkerBros.h
//  Clock Signal
//
//  Created by Thomas Harte on 18/03/2017.
//  Copyright 2017 Thomas Harte. All rights reserved.
//

#ifndef Atari2600_CartridgeParkerBros_hpp
#define Atari2600_CartridgeParkerBros_hpp

#include "Cartridge.hpp"

namespace Atari2600::Cartridge {

class ParkerBros: public BusExtender {
	public:
		ParkerBros(uint8_t *rom_base, std::size_t rom_size) :
			BusExtender(rom_base, rom_size) {
			rom_ptr_[0] = rom_base + 4096;
			rom_ptr_[1] = rom_ptr_[0] + 1024;
			rom_ptr_[2] = rom_ptr_[1] + 1024;
			rom_ptr_[3] = rom_ptr_[2] + 1024;
		}

		void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) {
			address &= 0x1fff;
			if(!(address & 0x1000)) return;

			if(address >= 0x1fe0 && address < 0x1ff8) {
				int slot = (address >> 3)&3;
				rom_ptr_[slot] = rom_base_ + ((address & 7) * 1024);
			}

			if(isReadOperation(operation)) {
				*value = rom_ptr_[(address >> 10)&3][address & 1023];
			}
		}

	private:
		uint8_t *rom_ptr_[4];
};

}

#endif /* Atari2600_CartridgeParkerBros_hpp */
