/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/disassem.c,v 1.4 90/09/28 12:20:26 rearl Exp $ */

/*
 * $Log:	disassem.c,v $
 * Revision 1.4  90/09/28  12:20:26  rearl
 * Added shared program strings.
 * 
 * Revision 1.3  90/09/16  04:42:01  rearl
 * Preparation code added for disk-based MUCK.
 * 
 * Revision 1.2  90/07/29  17:31:43  rearl
 * Added debugging patches from lpb@csadfa.cs.adfa.oz.au.
 * 
 * Revision 1.1  90/07/19  23:03:29  casie
 * Initial revision
 * 
 *
 */
 
#include "copyright.h"
#include "config.h"

#include "db.h"
#include "externs.h"
#include "interface.h"
#include "inst.h"

void
disassemble(dbref player, dbref program)
{
  struct inst *curr;
  struct inst *codestart;
  int    i;
  char   buf[BUFFER_LEN];

  codestart = curr = DBFETCH(program)->sp.program.code;
  if (!DBFETCH(program)->sp.program.siz)
    {
      notify(player, "Nothing to disassemble!");
      return;
    }
  for (i = 0; i < DBFETCH(program)->sp.program.siz; i++, curr++)
    {
      switch(curr -> type)
	{
	case PROG_PRIMITIVE:
	  if (curr->data.number >= BASE_MIN && curr->data.number <= BASE_MAX)
	        sprintf(buf, "%d: PRIMITIVE: %s",
		    i, base_inst[curr->data.number-BASE_MIN]);
	  else sprintf(buf, "%d: PRIMITIVE: %d", i, curr->data.number);
	  break;
	case PROG_STRING:
	  sprintf(buf, "%d: STRING: \"%s\"", i, curr -> data.string ?
		  curr -> data.string->data : "");
	  break;
	case PROG_INTEGER:
	  sprintf(buf, "%d: INTEGER: %d", i, curr -> data.number);
	  break;
	case PROG_ADD:
	  sprintf(buf, "%d: ADDRESS: %d", i, curr-> data.call - codestart);
	  break;
	case PROG_OBJECT:
	  sprintf(buf, "%d: OBJECT REF: %d", i, curr -> data.number);
	  break;
	case PROG_VAR:
	  sprintf(buf, "%d: VARIABLE: %d", i, curr -> data.number);
	}
      notify(player, buf);
    }
}