Cursor position after lcd.print() and lcd.scrollDisplayLeft()

rwiens:

How fast do you need to update the display? How often? How many cycles are used by other stuff?

I haven't figured out the exact speed (and it will actually change depending on the content) of the scroll but I would say at the fastest I need to shift at about 60ms (i.e. a character goes all the way from col 15 to col 0 in 1s). The question is whether I could read and re-write all 80 characters in that time. Sounds like the fm LiquidCrystal library replacement will at least update the display quickly enough (where do I find it?).

60ms is a LONG time to a micro-controller.
Keep in mind, the times I quoted are to update the entire 16x2 display.
Doing this:
lcd.setCursor(0,0);
lcd.write(char); // repeated 16 times
lcd.setCursor(0,1);
lcd.write(char); // repeated 16 times.
All that gets done in 11.5ms on the standard library or 3.4ms using fm's library
( https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home )
To write an individual character to the display or position the cursor takes:
338us with the standard LiduidCrystal library or 98us with fm's library.

You don't need to re-write 80 characters.
All you need to do is write the 32 characters visible on the display.
In looking at your timing and doing some math:
You are wanting to scroll characters from col 15 to col 0
that is 16 "moves" in 1 second that means each move needs to happen in
1/16 of second or 62.5ms.
The standard LiduidCrystal libraray can update all 32 characters on the display
in 11.5ms and fm's library can udpate all 32 in 3.5ms.
When using the standard library that means you use
11.5ms out of your 62.5ms budget. Which means that
updating the display uses about 18% of the CPU available in your timing interval
which means you still have 72% of the CPU left over to do all your other stuff
like reading information from the SD card etc.
While fm's library would reduce that budget to just under 6%
my gut feeling is that based on what you have said you want to do
the standard LiquidCrystal library should be capable of doing what you want
even when updating the full 16x2 display each time you need to do a move/animation.

You might want to experiment by writing a 'normal' string of about ten characters to the display and then send at least 100 shift left commands, with a pause between each so you can watch what is going on. You may be surprised at the result.

I did some experimentation along these lines and did get unexpected results.
One thing I thought about was trying to read the memory pointer from the display controller to see what was happening.

The memory pointer increases (assuming left to right) each time a character is written.
The memory pointer is set to an absolute address when setCursor() is called.

You may want to consider managing a shadow display buffer in RAM.

I assume you are talking about the Arduino RAM?

Yes, just fill in your buffer and then write it to the display.
You can update the entire display, which is every single character position on a 16x2 display
in 11.51ms (87 times per second) using the standard library or in 3.35ms (~300 times per second)
If you shadow the full LCD ram, you can make things shift by simply changing the index
of where you start grabbing characters from memory.
Also if you use a local RAM buffer you will be able to shift the two lines independently.