#include "stdafx.h"
#include "Emu/SysCalls/SysCalls.h"
#include "Emu/GS/GCM.h"

extern Module cellGcmSys;
extern gcmInfo gcm_info;

int cellGcmCallback(u32 context_addr, u32 count)
{
	GSLockCurrent gslock(GS_LOCK_WAIT_FLUSH);

	CellGcmContextData& ctx = (CellGcmContextData&)Memory[context_addr];
	CellGcmControl& ctrl = (CellGcmControl&)Memory[gcm_info.control_addr];

	const s32 res = re(ctx.current) - re(ctx.begin) - re(ctrl.put);

	if(res > 0) memcpy(&Memory[re(ctx.begin)], &Memory[re(ctx.current) - res], res);

	ctx.current = re(re(ctx.begin) + res);

	ctrl.put = re(res);
	ctrl.get = 0;
	
	return CELL_OK;
}
