private void sysCallExec()
    {
        //If there is nothing to run, abort.  This should never happen.
        if (m_programs.size() == 0)
        {
            System.err.println("ERROR!  syscallExec has no programs to run.");
            System.exit(-1);
        }
        
        //find out which program has been called the least and record how many
        //times it has been called
        int leastCallCount = m_programs.get(0).callCount;
        for(Program prog : m_programs)
            if (prog.callCount < leastCallCount)
                leastCallCount = prog.callCount;

        //Create a vector of all programs that have been called the least number
        //of times
        Vector<Program> cands = new Vector<Program>();
        for(Program prog : m_programs)
            cands.add(prog);
        
        //Select a random program from the candidates list
        Random rand = new Random();
        int pn = rand.nextInt(m_programs.size());
        Program prog = cands.get(pn);

        //Determine the address space size using the default if available.
        //Otherwise, use a multiple of the program size.
        int allocSize = prog.getDefaultAllocSize();
        if (allocSize <= 0)
            allocSize = prog.getSize() * 2;

        //Load the program into RAM
        boolean success = createProcess(prog, allocSize);

        //Adjust the PC since it's about to be incremented by the CPU
        if(success)
            m_CPU.setPC(m_CPU.getPC() - CPU.INSTRSIZE);
    }//syscallExec