/*
   Copyright (C) 1998,1999,2000,2001
   T. Scott Dattalo and Ralf Forsberg

This file is part of gpsim.

gpsim 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, or (at your option)
any later version.

gpsim 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 gpsim; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#include "../config.h"

#ifdef HAVE_GUI

#include <unistd.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <glib.h>
#include <string.h>

#include <gtkextra/gtkbordercombo.h>
#include <gtkextra/gtkcolorcombo.h>
#include <gtkextra/gtksheet.h>

#include "gui.h"
#include "gui_breadboard.h"
#include "gui_processor.h"
#include "gui_profile.h"
#include "gui_register.h"
#include "gui_regwin.h"
#include "gui_scope.h"
#include "gui_src.h"
#include "gui_stack.h"
#include "gui_stopwatch.h"
#include "gui_symbols.h"
#include "gui_trace.h"
#include "gui_watch.h"
#include "gui_statusbar.h"

class linkXREF : public CrossReferenceToGUI
{
public:

  GUI_Processor *gp;
  
  void Update(int new_value)
  {
    int address;

    if(!gp) { printf("gp == null in linkXREF\n"); return;}

    address = *(int *)data;

    if(gp->source_browser)
      gp->source_browser->UpdateLine(address);

    if(gp->program_memory)
      gp->program_memory->UpdateLine(address);

  }
};

/*
 * link_src_to_gpsim
 *
 * After a new program has been loaded by gpsim, this routine is called
 * so that the gui can create links to it. This consists of creating
 * a 'cross_reference' structure and attaching it to each pic instruction.
 * The information in the cross_reference structure is a pointer to the
 * gp.
 */

void link_src_to_gpsim(GUI_Processor *gp)
{
  int i,*address,pm_size;
  linkXREF *cross_reference;


  if(gp) {

    // Create a cross reference between the pic's program memory and the gui.
    pm_size =  gp->cpu->program_memory_size();

    if(verbose) {
      printf("link_src_to_gpsim\n");
      printf(" processor pma = %d\n",pm_size);
    }

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

      cross_reference = new linkXREF();
      //cross_reference->parent_window_type = WT_asm_source_window;
      //cross_reference->parent_window = (gpointer) gp;
      cross_reference-> gp = gp;
      address = (int *) malloc(sizeof(int *));
      *address = gp->cpu->map_pm_index2address(i);

      cross_reference->data = (gpointer) address;
      gp->cpu->pma->assign_xref(*address,(gpointer) cross_reference);
    }
  }
}

#endif //HAVE_GUI


syntax highlighted by Code2HTML, v. 0.9.1