I am trying to create a two player chess game. To do this I want to generate a list of legal moves. I am having trouble with the brevity of the code to generate the moves for the rooks and bishops.

The code I have pasted below works (i.e. shows legal bishop moves) but there is a lot of repetition, which is not ideal. To make this work for both black and white bishops I would need to add even more repetitive lines. 

Is there a better way to do this? I do not want to use any 'chess modules' as this is a learning exercise for me; as you can tell, I am a beginner.

    import numpy as np
    
    # chess board is a numpy array
    # white pieces are capitalised, black pieces are not
    board = np.zeros((8,8),dtype=str)
    
    # example piece positions
    white_bishop = (4,5)
    white_pawn = (6,7)
    black_knight = (0,1)
    board[white_bishop] = 'B'
    board[white_pawn] = 'P'
    board[black_knight] = 'n'

    def bishop(insquare):
        '''
        Gets all legal moves for bishop on insquare
        output is a list (outsquares) of indices of possible squares
        '''
        out_squares = []
        y,x = insquare
       
        y1 = y-1 # these are steps in one of the four directions bishops can go
        x1 = x-1
        while (x1 > -1) and (y1 > -1): # edge of the board
            if not board[(y1,x1)].isupper(): # if not a white piece...
                out_squares.append((y1,x1)) # square is legal
                if board[(y1,x1)].islower(): # if black piece...
                    y1 = -1 # look no further in this direction
            else: # if white piece...
                y1 = -1 # look no further in this direction
            y1 -= 1 # check next square
            x1 -= 1
        
        # check all other directions
        y1 = y+1
        x1 = x+1
        while (x1 < 8) and (y1 < 8):
            if not board[(y1,x1)].isupper():
                out_squares.append((y1,x1))
                if board[(y1,x1)].islower():
                    y1 = 8
            else:
                y1 = 8
            y1 += 1
            x1 += 1
      
        y1 = y + 1
        x1 = x - 1
        while (x1 > -1) and (y1 < 8):
            if not board[(y1,x1)].isupper():
                out_squares.append((y1,x1))
                if board[(y1,x1)].islower():
                    y1 = 8
            else:
                y1 = 8
            y1 += 1
            x1 -= 1
        
        y1 = y - 1
        x1 = x + 1
        while (x1 < 8) and (y1 > -1):
            if not board[(y1,x1)].isupper():
                out_squares.append((y1,x1))
                if board[(y1,x1)].islower():
                    y1 = -1
            else:
                y1 = -1
            y1 = y1 - 1
            x1 = x1 + 1
        return out_squares
    
    # Get all legal moves for the white bishop
    print bishop((4,5))
    # >>> [(3, 4), (2, 3), (1, 2), (5, 6), (5, 4), (6, 3), (7, 2), (3, 6), (2, 7)]