#include	<stdio.h>
#include	<stdlib.h>
#ifdef ATARIST
#include	<osbind.h>
#endif

#include "atari.h"
#include "cpu_asm.h"
#include "pia.h"
#include "gtia.h"
#include "sio.h"
#include "pokey.h"
#include "antic.h"
#include "memory.h"
#include "statesav.h"

extern UBYTE IRQ;
extern int wsync_halt;
extern UWORD break_addr;
UBYTE N,Z,V,C;
#ifdef PAGED_MEM
ERROR: cpu_m68k.s cannot work with paged memory
#endif

/*
   ==========================================================
   Emulated Registers and Flags are kept local to this module
   ==========================================================
 */

int instruction_count[256];

/*
   ===============================================================
   Z flag: This actually contains the result of an operation which
   would modify the Z flag. The value is tested for
   equality by the BEQ and BNE instruction.
   ===============================================================
 */



void CPU_Reset(void)
{
	int i;

	for (i = 0; i < 256; i++) {
#ifdef PROFILE
		instruction_count[i] = 0;
#endif
	}

	IRQ = 0x00;

	regP = 0x20;				/* The unused bit is always 1 */
	regS = 0xff;
	regPC = (GetByte(0xfffd) << 8) | GetByte(0xfffc);
}


void CPU_GetStatus(void)
{
	CPUGET();
}

void GenerateIRQ(void)
{
	IRQ = 1;
	GO(0);						/* does not execute any instruction */
}

void CpuStateSave( UBYTE SaveVerbose )
{
	SaveUBYTE( &regA, 1 );
	SaveUBYTE( &regP, 1 );
	SaveUBYTE( &regS, 1 );
	SaveUBYTE( &regX, 1 );
	SaveUBYTE( &regY, 1 );
	SaveUBYTE( &N, 1 );
	SaveUBYTE( &Z, 1 );
	SaveUBYTE( &V, 1 );
	SaveUBYTE( &C, 1 );
	SaveUBYTE( &IRQ, 1 );

	MemStateSave( SaveVerbose );
	
	SaveUWORD( &regPC, 1 );
}

void CpuStateRead( UBYTE SaveVerbose )
{
	ReadUBYTE( &regA, 1 );
	ReadUBYTE( &regP, 1 );
	ReadUBYTE( &regS, 1 );
	ReadUBYTE( &regX, 1 );
	ReadUBYTE( &regY, 1 );
	ReadUBYTE( &N, 1 );
	ReadUBYTE( &Z, 1 );
	ReadUBYTE( &V, 1 );
	ReadUBYTE( &C, 1 );
	ReadUBYTE( &IRQ, 1 );

	MemStateRead( SaveVerbose );
	
	ReadUWORD( &regPC, 1 );
}
