// Copyright (c) 2002 - 2021 kio@little-bat.de
// BSD-2-Clause license
// https://opensource.org/licenses/BSD-2-Clause

#pragma once
#include <math.h>
#include "kio/kio.h"
#include "cpp/cppthreads.h"
#include "Templates/RCPtr.h"
#include "IsaObject.h"
#include "Item.h"
#include "Cpu.h"
#include "Templates/Array.h"

class Machine
{
public:
	char*	memory;
	Item*	firstitem;
	Item*	lastitem;		// list of all items
	Cpu*	cpu;			// cpu = first item

	bool	is_power_on;
	bool	is_suspended;


// ---- P U B L I C ----------------------------------------------------

public:
	Machine (char* mem);
	~Machine();

	void	loadBinaryFile ();

// Components:
	void	addItem (Item*);
	void	removeItem (Item*);

	Item*	findItem	(isa_id isa) {for(Item*i=lastitem;i;i=i->prev){if(i->isaId()==isa)return i;} return nullptr;}
	Item*	findIsaItem	(isa_id isa) {for(Item*i=lastitem;i;i=i->prev){if(i->isA(isa))return i;} return nullptr;}
	Item*	firstItem	()			 {return firstitem;}
	Item*	lastItem	()			 {return lastitem;}

// Control & Run the Machine:
	void	powerOn		();
	bool	powerOff	();
	void	powerCycle	();
	void	reset		();
	void	nmi			() { cpu->setNmi(); }
	void	run			() { cpu->run(0); }

	void	stepIn		() {}
	void	stepOver	() {}
	void	stepOut		() {}
	void	suspend		() { is_suspended = true; }
	void	resume		() { is_suspended = false; }
};























