/* slt.c: SLT data handling routines
   Copyright (c) 2004 Philip Kendall

   $Id: slt.c,v 1.4 2007/02/02 16:21:52 pak21 Exp $

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

   Author contact information:

   E-mail: philip-fuse@shadowmagic.org.uk

*/

#include <config.h>

#include <string.h>

#include <libspectrum.h>

#include "settings.h"
#include "slt.h"
#include "spectrum.h"
#include "ui/ui.h"

/* .slt level data */

static libspectrum_byte *slt[256];
static size_t slt_length[256];

static libspectrum_byte *slt_screen;	/* The screenshot from the .slt file */
static int slt_screen_level;		/* The level of the screenshot.
					   Not used for anything AFAIK */

int
slt_trap( libspectrum_word address, libspectrum_byte level )
{
  size_t length;
  libspectrum_byte *data;

  if( !settings_current.slt_traps ) return 0;

  if( slt_length[ level ] ) {
    
    length = slt_length[ level ];
    data = slt[ level ];

    while( length-- ) writebyte( address++, *data++ );

  }

  return 0;
}

int
slt_from_snapshot( libspectrum_snap *snap )
{
  size_t i;

  for( i=0; i<256; i++ ) {

    slt_length[i] = libspectrum_snap_slt_length( snap, i );

    if( slt_length[i] ) {

      slt[i] = memory_pool_allocate( slt_length[i] *
				     sizeof( libspectrum_byte ) );
      if( !slt[i] ) {
	ui_error( UI_ERROR_ERROR, "Out of memory at %s:%d", __FILE__,
		  __LINE__ );
	return 1;
      }

      memcpy( slt[i], libspectrum_snap_slt( snap, i ),
	      libspectrum_snap_slt_length( snap, i ) );
    }
  }

  if( libspectrum_snap_slt_screen( snap ) ) {

    slt_screen = memory_pool_allocate( 6912 * sizeof( libspectrum_byte ) );
    if( !slt_screen ) {
      ui_error( UI_ERROR_ERROR, "Out of memory at %s:%d", __FILE__, __LINE__ );
      return 1;
    }

    memcpy( slt_screen, libspectrum_snap_slt_screen( snap ), 6912 );
    slt_screen_level = libspectrum_snap_slt_screen_level( snap );
  }

  return 0;
}

int
slt_to_snapshot( libspectrum_snap *snap )
{
  size_t i;
  libspectrum_byte *buffer;

  for( i=0; i<256; i++ ) {

    libspectrum_snap_set_slt_length( snap, i, slt_length[i] );

    if( slt_length[i] ) {

      libspectrum_byte *buffer;

      buffer = malloc( slt_length[i] * sizeof(libspectrum_byte) );
      if( !buffer ) {
	ui_error( UI_ERROR_ERROR, "Out of memory at %s:%d", __FILE__,
		  __LINE__ );
	return 1;
      }

      memcpy( buffer, slt[i], slt_length[i] );
      libspectrum_snap_set_slt( snap, i, buffer );
    }
  }

  if( slt_screen ) {
 
    buffer = malloc( 6912 * sizeof( libspectrum_byte ) );

    if( !buffer ) {
      ui_error( UI_ERROR_ERROR, "Out of memory at %s:%d", __FILE__, __LINE__ );
      return 1;
    }

    memcpy( buffer, slt_screen, 6912 );
    libspectrum_snap_set_slt_screen( snap, buffer );
    libspectrum_snap_set_slt_screen_level( snap, slt_screen_level );
  }

  return 0;
}
