The Prime 9000-series CPUs could contain a mix of 2MB, 4MB, and 8MB memory boards (yes, this was Way Back When) in eight slots... but these had to be arranged in specific ways for the hardware to properly address them. This routine, when given a list of memory boards, determines if the arrangement was legitimate. I wrote a routine like this for each of the CPU series (6300/6500, 4000, 4450, 5300, and 2455).

/*---------------------------------------------------------------------------
    Calculate 9000-class addressing
---------------------------------------------------------------------------*/

mem_config_9000 (address)                             /* MEM_CONFIG_9000 */

int
    address[64][3];

{
int
    board_size,
    i,
    more,
    next_board_size,
    size = 0;

static int
    /* For C9000, physical slot N is followed by next_board_xxx[N], plus
         some exceptions (see the code) */
    /* physical slot    0  1  2  3  4  5  6  7 */
    next_board_4mb[] = {1, 4, 3, 6, 5, 2, 7,-1},
    next_board_8mb[] = {4,-1, 6,-1, 2,-1,-1,-1};

    /* Handle 9000-class weirdo addressing */
    i = 0;
    more = TRUE;
    while (more)
    {
         /* Use nifty "next-board" arrays to figure out which board
              is next in the addressing scheme of things */
         board_size = mem_board[current_boards[i]].kw;
         /* Nifty scheme breaks down if a 4MB board is in slot 0 or 4,
              followed by a 2MB board.  Check for that and adjust: */
         if ((i == 1 || i == 5)
              && mem_board[current_boards[i-1]].kw == 2048
              && mem_board[current_boards[i]].kw == 0)
         {
              i += 1;
              board_size = mem_board[current_boards[i]].kw;
         }
         if (board_size != 0)
              checked_boards[xlate_physical[i]] = TRUE;
         if (board_size > last_board_size && board_size != 0)
         {
              /* Boards in wrong order! */
              if (last_board_size == 0)
                   sprintf (message, "Skipped slot %d%s.",
                        xlate_logical[i] + 1, slotnamefunc (i));
              else
                   sprintf (message,
 "Board %d%s must be before smaller board, not after.",
                        xlate_logical[i] + 1, slotnamefunc (i));
              return;
         }
         last_board_size = board_size;
         address[i][0] = size;
         size += board_size;
         address[i][1] = size - 1;
         address[i][2] = size - 1;
         /* 8 MB board? */
         if (board_size == 4096) i = next_board_8mb[i];
         /* 4 MB board? */
         else if (board_size == 2048) i = next_board_4mb[i];
         /* 2 MB board? */
         else i = i + 1;
         if (i == -1 || board_size == 0 || i > 7) more = FALSE;
    } /* end "while (more boards to check)" */

    /* Some more checking:
         8MB board cannot be immediately followed by a smaller board;
         4MB board cannot be immediately followed by a smaller board. */
    for (i = 0; i < cpu[current_cpu].maxmembd - 1; i++)
    {
         board_size = mem_board[current_boards[i]].kw;
         next_board_size = mem_board[current_boards[i+1]].kw;
         if (next_board_size < board_size && next_board_size != 0)
         {
              i++;      /* NEXT board has the problem */
              sprintf (message,
                   "%dMB board in slot %d%s cannot follow a %dMB board.",
                   next_board_size / 512,
                   xlate_logical[i] + 1,
                   slotnamefunc (i),
                   board_size / 512);
              return;
         }
    }

    return;
}


[Back to home page]