public void runCoreLogic(String[] args) throws IOException {
        long baganAt = System.currentTimeMillis();
        List<ChessBoard> boards = new ArrayList<ChessBoard>();
        // TODO get board dimensions from parameters
        //        DataInputReaderSimple dataInputReaderSimple = new DataInputReaderSimple(new DataInputReaderDimensions(),
        //                new DataInputReaderPieces());
        //        DataInput di = dataInputReaderSimple.read(args);
        DataInputDimensions did = new DataInputDimensions(4, 4);
        DataOutputDisplay dod = new DataOutputDisplay();
        List<ChessPiece> piecesList = new ArrayList<ChessPiece>();
        // FIXME 2K & R, should have 4Boards
        // FIXME B & R, should have 8Boards
        
        //        piecesList.add(new ChessKing(did));
        //        piecesList.add(new ChessKing(did));
        //        piecesList.add(new ChessKnight(did));
        //        piecesList.add(new ChessQueen(did));
        //        piecesList.add(new ChessQueen(did));
        //        piecesList.add(new ChessBishop(did));
        //        piecesList.add(new ChessBishop(did));
        //        
        piecesList.add(new ChessRook(did));
        piecesList.add(new ChessRook(did));
        piecesList.add(new ChessKnight(did));
        piecesList.add(new ChessKnight(did));
        piecesList.add(new ChessKnight(did));
        piecesList.add(new ChessKnight(did));
        
        //        //        piecesList.add(new ChessKing(did));
        //        //        piecesList.add(new ChessKing(did));
        //        //        piecesList.add(new ChessKing(did));
        //        
        //        //        piecesList.add(new ChessKing(did));
        //        //        piecesList.add(new ChessKing(did));
        //        //        piecesList.add(new ChessRook(did));
        
        final List<List<ChessPiece>> listOfpiecesList = preparePiecesLists(piecesList);
        for (final List<ChessPiece> currentList : listOfpiecesList) {
            for (int x = 0; x < did.getN(); ++x) {
                for (int y = 0; y < did.getM(); ++y) {
                    final ChessBoard chessBoard = new ChessBoard(did);
                    chessBoard.initialize(x, y);
                    boolean isValid = false;
                    for (ChessPiece piece : currentList) {
                        isValid = chessBoard.placePieceInPlaceWhereHasNotGotCollisions(piece);
                        if (!isValid) {
                            break;
                        }
                    }
                    if (!isValid) {
                        continue;
                    }
                    //                    System.out.println("T");
                    // TODO bez contains, ale ze sprawdzeniem contains @ preparePiecesLists 
                    if (boards.contains(chessBoard)) {
                        continue;
                    }
                    boards.add(chessBoard);
                }
            }
        }
        System.out.println("DoneIn: " + (System.currentTimeMillis() - baganAt) + ", Boards variants: " + boards.size());
        for (ChessBoard chessBoard : boards) {
            System.out.println("++++++++++++++++++++ >>>> ");
            dod.print(chessBoard);
            System.out.println("++++++++++++++++++++ <<<< ");
            System.out.println();
        }
        System.out.println("DoneIn: " + (System.currentTimeMillis() - baganAt) + ", Boards variants: " + boards.size());
        System.exit(OK_EXIT_STATUS);
    }