  PROCEDURE [INLINE] dmp$get_next_fmd_fau
    (    p_dfd: ^dmt$disk_file_descriptor;
         byte_address: integer;
         fmd_index: dmt$fmd_index;
     VAR p_next_fau_entry: ^dmt$file_allocation_unit);

?? PUSH (LISTEXT := ON) ??
?? RIGHT := 110 ??

    VAR
      level_1_start: integer,
      level_1_index: dmt$level_1_index,
      level_2_start: integer,
      level_2_index: dmt$level_2_index,
      p_level_1: ^dmt$level_1_table,
      p_level_2: ^dmt$level_2_table;

    IF byte_address >= 0 THEN
      level_1_start := byte_address DIV p_dfd^.bytes_per_level_2;
      level_2_start := ((byte_address MOD p_dfd^.bytes_per_level_2) DIV p_dfd^.bytes_per_allocation) + 1;
      IF level_2_start > (p_dfd^.bytes_per_level_2 DIV p_dfd^.bytes_per_allocation - 1) THEN
        level_1_start := level_1_start + 1;
        level_2_start := 0;
        IF level_1_start > p_dfd^.fat_upper_bound THEN
          p_next_fau_entry := NIL;
        IFEND;
      IFEND;
    ELSE
      {Negative byte address means find FIRST AU.
      level_1_start := 0;
      level_2_start := 0;
    IFEND;

    dmp$get_level_1_ptr (p_dfd, p_level_1);
    IF p_level_1 <> NIL THEN
      FOR level_1_index := level_1_start TO p_dfd^.fat_upper_bound DO
        p_level_2 := dmf$level_2_ptr (^p_level_1^ [level_1_index]);
        IF p_level_2 <> NIL THEN
          FOR level_2_index := level_2_start TO (p_dfd^.bytes_per_level_2 DIV p_dfd^.bytes_per_allocation - 1)
                DO
            IF p_level_2^ [level_2_index].state <> dmc$fau_free THEN
              IF p_level_2^ [level_2_index].fmd_index = fmd_index THEN
                {Return next allocated AU
                p_next_fau_entry := ^p_level_2^ [level_2_index];
                RETURN; {----->
              IFEND;
            IFEND;
          FOREND;
        IFEND;
        level_2_start := 0;
      FOREND;
    IFEND;

    p_next_fau_entry := NIL;

  PROCEND dmp$get_next_fmd_fau;

*copyc dmp$get_level_1_ptr
*copyc dmf$level_2_ptr
*copyc dmp$get_fau_entry
*copyc amt$file_byte_address
?? POP ??
