// перевод видеоадаптера в режим отображения 43 строк

#include <graph.h>

void Set43Line(void);


main(void) {

     int  i;


     // устанавливаем текстовый режим, принятый по умолчанию

     _setvideomode(_DEFAULTMODE);

     // перепрограммируем видеоадаптер для отображения 43 строк

     Set43Line();

	  for(i = 0; i < 43; i++)
          printf("text line number %d\n", i);

     getch();

     // восстанавливаем режим с 25 текстовыми строками 

     _setvideomode(_DEFAULTMODE);
}


/**
*.Name    Set43Line
*
*.Title   Установка 43 строк.
*
*.Descr   Переводит адаптеры EGA и VGA в режим отображения 43
*         строк текста.
*
*.Proto   void Set43Line(void)
*
*.Params  Отсутствуют.
*
*
*.Return  Не используется.
*
*.Sample  43line.c
**/
void Set43Line(void) {

     #define   CHAR_SIZE 8         // новая высота символов

     _asm {

          ; устанавливаем регистр es на начало оперативной памяти

          xor  ax,ax
          mov  es,ax

; получаем адрес порта индексного регистра контроллера ЭЛТ
; (3B4h/3D4h),
; в монохромных режимах для адресации к индексному регистру
; используется порт с адресом 3B4h, а в цветных - порт 3D4h

          mov  dx,es:[463h]

; выбираем для обмена регистр максимальной линии сканирования
; этот регистр задает высоту символов на экране дисплея

          mov  al,9
          out  dx,al

; вычисляем адрес порта регистра данных контроллера ЭЛТ,
; в монохромных режимах для адресации к регистру данных
; используется порт с адресом 3B5h, а в цветных - порт 3D5h

          inc  dx

; биты D4-D0, регистра максимальной линии сканирования содержат
; число, меньшее на единицу, чем высота символов в пикселах

          mov  al,CHAR_SIZE-1
          out  dx,al

; вычисляем адрес порта индексного регистра контроллера ЭЛТ

          dec  dx

; выбираем для обмена регистр положения подчеркивания

          mov  al,14h
          out  dx,al

; вычисляем адрес порта регистра данных контроллера ЭЛТ

          inc  dx

; определяем положение подчеркивания символов

          mov  al,CHAR_SIZE
          out  dx,al

; вычисляем адрес порта индексного регистра контроллера ЭЛТ

          dec  dx


; выбираем для обмена регистр завершения отображения
; вертикальной развертки

; регистр завершения отображения вертикальной развертки
; содержит восемь младших бит, определяющих число отображаемых
; горизонтальных линий растра минус один

          mov  al,12h
          out  dx,al

; вычисляем адрес порта регистра данных контроллера ЭЛТ

          inc  dx

; для отображения 43 текстовых символов, при высоте символов
; 8 пикселов, необходимо иметь 43 * 8 = 344 горизонтальных
; линий растра

; помещаем в регистр завершения отображения вертикальной
; развертки младшие 8 бит числа 344

          mov  al,(43 * CHAR_SIZE - 1 - 256)
          out  dx,al

; устанавливаем новые значения переменных BIOS

; число символов в строке равно восьмидесяти

          mov  WORD PTR es:[44Ah],80

; число строк текста минус один

          mov  BYTE PTR es:[484h],(350/CHAR_SIZE)-1

; высота символов в пикселах

          mov  WORD PTR es:[485h],CHAR_SIZE

; загружаем нулевую таблицу знакогенератора набором символов
; (размер 8х8) из ПЗУ BIOS

          mov  ax,1112h
          xor  bl,bl
          int  10h
     }
}
