TITLE	SET43.ASM
NAME	SET43
PAGE	55,132

P286
IDEAL
NOWARN BRK

SEGMENT STR_TEXT WORD PUBLIC 'CODE'
ASSUME	cs:STR_TEXT


; void SetMoreStr(void)
; Переводит адаптер VGA в режим отображения 50
; строк текста.

	CHAR_SIZE	EQU 8
	TEXT_STR		EQU 50  ; для EGA константа TEXT_STR должна равняться 43

	PUBLIC	SETMORESTR
	PROC	SETMORESTR FAR

	enter	0, 0

	; Устанавливаем режим видеоадаптера номер 3
	mov	ah,0
	mov	al,3
	int	10h

	; Устанавливаем регистр 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

	; Помещаем в регистр завершения отображения вертикальной
	; развертки младшие 8 бит числа TEXT_STR * CHAR_SIZE
	mov  al,(TEXT_STR * CHAR_SIZE - 256 - 1)
	out  dx,al

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

	; Количество символов в строке равно восьмидесяти
	mov  WORD PTR es:[44Ah],80

	; Количество строк текста минус один
	mov  BYTE PTR es:[484h],TEXT_STR-1

	; Высота символов в пикселах
	mov  WORD PTR es:[485h],CHAR_SIZE

	; Загружаем нулевую таблицу знакогенератора набором символов
	; (размер 8х8) из ПЗУ BIOS
	mov  ax,1112h
	xor  bl,bl
	int  10h

	leave
	ret

	ENDP	SETMORESTR

ENDS	STR_TEXT

END
