How to read HD44780 LCD programmatically

The only way to do this correctly is to make a "shadow" screen which buffers the content send to the screen.

You are answering this from a more modern perspective than might have originally been intended when the LCD controller was designed. I mean that it looks like you are assuming that he wants to read back information that corresponds to that displayed on the screen.

If you are using a display with less than 80 characters then there is some unused RAM in the LCD controller. In ancient times when RAM was scarce this RAM was a valuable resource and could be (and was) used for general purpose storage. Perhaps the OP has an application such as this in mind.

Here is what the HD44780U data sheet has to say (just before Figure 1).

Display Data RAM (DDRAM) 

Display   data   RAM   (DDRAM)   stores   display   data   represented   in   8-bit   character   codes.   Its   extended 
capacity is 80 × 8 bits, or 80 characters. [b]The area in display data RAM (DDRAM) that is not used for 
display can be used as general data RAM.[/b] See Figure 1 for the relationships between DDRAM addresses 
and positions on the liquid crystal display.

Don