Page 1 of 1

[solved] VGA Text Mode Scrolling

Posted: Tue May 08, 2018 3:03 pm
by quadrant
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?

Code: Select all

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;
}
Re: OSDev Wiki, JamesM Kernel Tutorial

Re: VGA Text Mode Scrolling

Posted: Tue May 08, 2018 6:24 pm
by clusterlizard
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:

Code: Select all

line 0 (address 0 to NCOLS - 1)        : *****
line 1 (address NCOLS to NCOLS * 2 - 1): 12345

videoMemory[0] = videoMemory[NCOLS + 0], line 0: 1****
videoMemory[1] = videoMemory[NCOLS + 1], line 0: 12***
videoMemory[2] = videoMemory[NCOLS + 2], line 0: 123**
videoMemory[3] = videoMemory[NCOLS + 3], line 0: 1234*
videoMemory[4] = videoMemory[NCOLS + 4], line 0: 12345

Re: VGA Text Mode Scrolling

Posted: Wed May 09, 2018 12:59 pm
by quadrant
Ah, thank you! :)