Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
How does the VGA text buffer relate to the display? Is the buffer an array? If so does buffer[0..NCOLS] correspond to the top row of text displayed on the screen?
If so, why does this scrolling code work? If buffer[0..NCOLS] holds the oldest data (top row) and buffer[lastRow*NCOLS..NROWS*NCOLS] holds the most recent data (bottom row), shouldn't we be shifting the buffer elements by -row instead of +row?
void monitor_scrollUp ()
{
int i;
int lastRow = NROWS - 1;
u16int spaceChar = m_attribute | 0x20; // space character
// Move the current text chunk that makes up the screen back in the buffer by a line
for ( i = 0; i < NROWS * NCOLS; i += 1 )
{
videoMemory[ i ] = videoMemory[ i + NCOLS ];
}
// The last line should now be blank. Do this by writing 80 spaces to it
for ( i = lastRow * NCOLS; i < NROWS * NCOLS; i += 1 )
{
videoMemory[ i ] = spaceChar;
}
// The cursor should now be on the last line
cursorY = lastRow;
}
The buffer is a string of memory organized as you wrote: row 0 = 0 to NCOLS - 1, row 1 = NCOLS to NCOLS * 2 - 1. As for the code: it would work, but it should only copy NROWS - 1. The buffer elements are being shifted -1 row: i is initially 0, and videoMemory is getting the value of the next row (i + NCOLS). So let's say you had a 5 column video display (NCOLS = 5), this is what's going on: