public byte popFirstValueForCell(int li, int co) {
        if (isCellFilled(li, co))
            return 0;
        for (byte v = 1; v <= 9; v++) {
            if (isCellValuePossible(li, co, v) && !isCellValueScreened(li, co, v)) {
                return v;
            } else {
                System.out.println("GridShadow.popFirstValueForCell() value "+v+" is screened in cell "+li+","+co);
            }
        }
        return 0;
    }

    public boolean setCellValueAt(int li, int co, byte value) {
        System.out.println("GridShadow.setCellValueAt(" + li + "," + co + "=>"
                + value + ")");

        cellFlags[offset + 9 * li + co] &= ~MASK_FOR_CURRENT_VALUE;
        cellFlags[offset + 9 * li + co] |= FLAG_CELL_READ_ONLY | value;

        // ligne
        for (int c = 0; c < 9; c++) {
            if (c != co) {
                if (!isCellFilled(li, c) && isCellValuePossible(li, c, value)) {
                    unsetCellValuePossible(li, c, value);
                    setCellValueScreened(li, c, value);
                    if (getNumberOfPossibleValues(li, c) == 0) {
                        /* DEAD END */
                        return true;
                    }
                }
            }
        }