struct DefaultNode *FindDNodeMode(ULONG ModeID);

struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *NS,
                                                  REG __a1 struct TagItem *TagList,
                                                  REG __a6 struct IntuitionBase *IBase)
{
  struct DefaultNode *match;
  struct Screen *retval=0;
  
  if(match=MatchDNode(NS,TagList))
  {
    retval=PromoteScreen(NS,TagList,match);
    FreeDNode(match);
  }
  
  if(!retval)
    retval=OldOpenScreenTagList(NS,TagList,IBase);
    
  return(retval);
}


struct DefaultNode *MatchDNode(struct ExtNewScreen *NS,
                               struct TagItem      *TagList)
{
  struct DefaultNode  *n,
                      *retval=0;
  UBYTE   cliname[41];
  STRPTR  taskname,title=0;
  ULONG   modeid=-1;

  ObtainSemaphoreShared(&MPSem->ListSem); 
  ObtainSemaphore(&MPSem->NodeSem); 

  taskname=FindTask(0)->tc_Node.ln_Name;

  if(GetProgramName(cliname,40)) /* Get cli program's name */
    if(CLIName[0]!=0)            /* make sure CLIName contains something */
      taskname=cliname;

  if(NS)
  {
    title   =NS->DefaultTitle;
    modeid  =NS->ViewModes;
  }
    
  if(TagList)
  {
    title   =(STRPTR)GetTagData(SA_Title        ,(ULONG)title   ,TagList);
    modeid  =        GetTagData(SA_DisplayID    ,modeid         ,TagList);
  }
    
  if(!title) title=GetString(MSG_ITEM_NO_NAME); /* Just in case ther isn't a title */

  if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  {
    if(!(n=FindDNode(&MPSem->PromotionList[0],taskname)))
    {
      n=FindDNodeMode(modeid);
    }
  }
  
  if(n)
    retval=DupDNode(n);

  ReleaseSemaphoreShared(&MPSem->ListSem); 
  ReleaseSemaphore(&MPSem->NodeSem); 
    
  return(retval);
}

struct DefaultNode *FindDNodeMode(ULONG ModeID)
{
  struct DefaultNode *smnode;
  ULONG  mode_monall,
         orig_monall;
      
  mode_monall  =ModeID | ALL_MODES;      
  smnode=(struct DefaultNode *)MPSem->PromotionList[PL_SCREENMODES].lh_Head;
  
  while(smnode->Def_Node.ln_Succ)
  {
    orig_monall= smnode->OrigDisplayID & ALL_MODES;
  
    if( (smnode->OrigDisplayID == ModeID) ||
        (smnode->OrigDisplayID == mode_monall) )     
    {
      return(smnode);
    }
    smnode=(struct DefaultNode *)smnode->Def_Node.ln_Succ;
  }
  return(0);
}


struct DefaultNode *DupDNode(struct DefaultNode *DNode)
{
  struct DefaultNode *retval;
  
  if(retval=AllocVec(sizeof(struct DefaultNode),MEMF_PUBLIC|MEMF_CLEAR))
  {
    *retval=*DNode;

    retval->Def_Node.ln_Name=0;
    retval->Font.tta_Name=0;
    retval->Font.tta_Tags=0;
    retval->PubName=
    retval->LockedPens=
    retval->HotKey=0;
    retval->Palette=0;

    if(retval->Def_Node.ln_Name=CopyString(DNode->Def_Node.ln_Name))
    {
      if(
    

}