- // Get the dimensions
- u16 nbrows = GET_BDA(video_rows) + 1;
- u16 nbcols = GET_BDA(video_cols);
-
- // Get the current page
- if (page == 0xFF)
- page = GET_BDA(video_page);
-
- if (rlr >= nbrows)
- rlr = nbrows - 1;
- if (clr >= nbcols)
- clr = nbcols - 1;
- if (nblines > nbrows)
- nblines = 0;
- u8 cols = clr - cul + 1;
-
- if (GET_GLOBAL(vmode_g->class) == TEXT) {
- // Compute the address
- void *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, page));
- dprintf(3, "Scroll, address %p (%d %d %02x)\n"
- , address_far, nbrows, nbcols, page);
-
- if (nblines == 0 && rul == 0 && cul == 0 && rlr == nbrows - 1
- && clr == nbcols - 1) {
- memset16_far(GET_GLOBAL(vmode_g->sstart), address_far
- , (u16)attr * 0x100 + ' ', nbrows * nbcols * 2);
- } else { // if Scroll up
- if (dir == SCROLL_UP) {
- u16 i;
- for (i = rul; i <= rlr; i++)
- if ((i + nblines > rlr) || (nblines == 0))
- memset16_far(GET_GLOBAL(vmode_g->sstart)
- , address_far + (i * nbcols + cul) * 2
- , (u16)attr * 0x100 + ' ', cols * 2);
- else
- memcpy16_far(GET_GLOBAL(vmode_g->sstart)
- , address_far + (i * nbcols + cul) * 2
- , GET_GLOBAL(vmode_g->sstart)
- , (void*)(((i + nblines) * nbcols + cul) * 2)
- , cols * 2);
- } else {
- u16 i;
- for (i = rlr; i >= rul; i--) {
- if ((i < rul + nblines) || (nblines == 0))
- memset16_far(GET_GLOBAL(vmode_g->sstart)
- , address_far + (i * nbcols + cul) * 2
- , (u16)attr * 0x100 + ' ', cols * 2);
- else
- memcpy16_far(GET_GLOBAL(vmode_g->sstart)
- , address_far + (i * nbcols + cul) * 2
- , GET_GLOBAL(vmode_g->sstart)
- , (void*)(((i - nblines) * nbcols + cul) * 2)
- , cols * 2);
- if (i > rlr)
- break;
- }
- }
- }
- return;
- }
-