//Pass the task structure you
//wish to spy upon.

U0 SpyStkRep(CTask *task)
{
  CDoc *doc=DocDblBufStart;
  while (!ScanChar && TaskValidate(task)) {
    StkRep(task);
    '\n';
    "$$BK,1$$PRESS A KEY$$BK,0$$\n";
    DocDblBufSwap;
    Refresh;
  }
  if (DocPut==doc) DocDblBufSwap;
  DocDblBufEnd;
}

U0 SpyCallerRep(CTask *task)
{
  CDoc *doc=DocDblBufStart;
  while (!ScanChar && TaskValidate(task)) {
    CallerRep(task->rbp,task);
    '\n';
    "$$BK,1$$PRESS A KEY$$BK,0$$\n";
    DocDblBufSwap;
    Refresh;
  }
  if (DocPut==doc) DocDblBufSwap;
  DocDblBufEnd;
}

U0 Spy()
{
  I64 i;
  CTask *task;

  while (TRUE) {
    task=Fs->next_task;
    while (task!=Fs) {
      "$$MA+X,T=\"Task:%08X:%16ts\",LM=\"0x%08X\n\"$$\n",
	    task,task->task_name,task;
      task=task->next_task;
    }
    '\n';
    task=GetI64("Task Addr: ",0);
    if (TaskValidate(task)) {
      "\n\n\t$$BT,\"StkRep\",LM=\"1\n\"$$\n\n\n"
	    "\n\n\t$$BT,\"CallerRep\",LM=\"2\n\"$$\n\n\n";
      i=GetI64("",0);
      if (i==1)
	SpyStkRep(task);
      else if (i==2)
	SpyCallerRep(task);
      else
	break;
    } else
      break;
  }
  '\n';
}

Spy;
