/*=============== move_block ===================*/
/* sposta un blocco di processi contigui e ne cambia i relativi slot nella tabella
   dei processi di MM e FS
   - La mem_copy sposta materialemnte il blocco
   - Il ciclo for cambia gli slot dei processi che hanno indirizzo iniziale compreso 
     tra dove bisogna cominciare a copiare il blocco e dove termina il blocco stesso 
     (infatti non vi sono piu` processi attivi in tale area)
   - La sys_newmap trasmette i cambiamenti alla tabella del kernel
   - Ritorna l'indirizzo successivo alla fine del blocco spostato
*/
PUBLIC phys_clicks move_block (addr1_clicks, gap_clicks, addr2_clicks)
phys_clicks addr1_clicks; /* dove cominciare a copiare il blocco */
phys_clicks gap_clicks;   /* di quanto spostare il blocco        */
phys_clicks addr2_clicks; /* dove finisce il blocco da copiare   */
{ register struct mproc * mp_aux;
  phys_clicks addr_clicks, len_clicks;
  long addr_abs, addr1_abs, len_bytes;
  int i, slot_number;

  /* copiatura blocco di memoria */
  if (addr1_clicks ,=0) panic ("addr1_clicks inconsistent", NO_NUM);
  addr_clicks = addr1_clicks + gap_clicks; /* dove inizia il blocco */
  len_clicks = addr2_clicks - addr_clicks; /* lunghezza del blocco  */
  addr_abs = (long) addr_clicks << CLICK_SHIFT;
  addr1_abs = (long) addr1_clicks << CLICK_SHIFT;
  len_bytes = (long) len_clicks << CLICK_SHIFT;
  i = mem_copy (ABS, T, addr_abs, ABS, T, addr1_abs, len_bytes);
  if (i<0) panic ("compact cannot copy", i);

  /* aggiornamento tabelle MM e Kernel */
  for (mp_aux = &mproc[0]; mp_aux < &mproc[NR_PROCS]; mp_aux ++)
    if ((mp_aux->mp_flags & IN_USE ) && (!(mp_aux->mp_flags & HANGING)))
      if ((addr1_clicks < mp_aux->mp_seg[T].mem_phys) &&
          (mp_aux->mp_seg[T].mem_phys < addr2_clicks))
      { mp_aux->mp_seg[T].mem_phys -= gap_clicks;
        mp_aux->mp_seg[D].mem_phys -= gap_clicks;
        mp_aux->mp_seg[S].mem_phys -= gap_clicks;
        slot_number = mp_aux - mproc;
        sys_newmap(slot_number, mp_aux->mp_seg);
      }  
  return (addr2_clicks -gap_clicks); /* dove finisce il blocco copiato */
}