		TITLE	VGA8
;
; Эта программа изменяет ширину символов в текстовых режимах VGA:
; 8 точек растра вместо стандартных 9. В результате фон, составленный
; из символов типа "▒", не имеет неприятной "решетки" из вертикальных
; линий. Кроме того, смыкание символов по горизонтали совершенно
; необходимо при имитации графики в текстовом режиме с помощью
; загружаемых символов.
; Программирование данной операции было описано Ричардом Уилтоном в
; статье "Видеорежимы графического адаптера VGA" (получила широкое
; распространение на дискетах). К сожалению, м-р Уилтон умолчал об
; одной весьма важной детали: после изменения ширины символов необхо-
; димо изменить частоту генератора развертки, иначе экран превратится
; в "кашу". Это обстоятельство доставило автору немало неприятных
; минут; в конце концов решение было найдено методом "тыка".
; Помимо всего прочего, VGA8 - лучшее средство для тестирования
; видеодрайверов-русификаторов. Если после ее запуска пропадает русский
; шрифт - значит, драйвер сделан при помощи трех инструментов: молотка,
; мата и пол-литры.
;			М.А.Яковлев, г.Тула
;
CODE		SEGMENT
		ASSUME	CS:CODE,DS:CODE
		ORG	100H
START:		JMP	SHORT MAIN
NOT_FOUND	DB	'VGA не найден',15Q,12Q,'$'
MAIN:		MOV	AX,1A00H
		INT	10H		; Проверка на наличие VGA
		CMP	AL,1AH
		JNZ	MA_1
		CMP	BL,7
		JB	MA_1
		CMP	BL,8
		JBE	MA_2
MA_1:		MOV	AH,9		; Если VGA отсутствует - вывод
		MOV	DX,OFFSET NOT_FOUND ; сообщения и выход из программы
		INT	21H
		MOV	AX,4C01H
		INT	21H
MA_2:		MOV	AX,1130H	; Получение адреса шрифта 8*16
		MOV	BH,6		; (предназначен для графических
		INT	10H		; режимов)
		CMP	CL,16		; Если высота текущего шрифта не 16, то
		JNZ	ST_1		; загрузка не выполняется
		MOV	AX,1100H
		MOV	BX,1000H
		MOV	CX,256
		XOR	DX,DX
		INT	10H		; Загрузка этого шрифта
		MOV	AX,1131H	; Получение адреса русского шрифта.
		MOV	BH,2		; Эту функцию поддерживает только
		INT	10H		; драйвер EVC.
		CMP	CL,16		; Если функция не поддерживается, то
		JNZ	ST_1		; последующие действия не выполняются
		MOV	AX,1100H	
		MOV	BX,1000H
		MOV	CX,48
		MOV	DX,80H
		INT	10H		; Подзагрузка русского шрифта
		MOV	AX,1100H	; первые 48 символов
		ADD	BP,300H
		MOV	CX,16
		MOV	DX,0E0H
		INT	10H		; Подзагрузка последних 16 символов
;
; Изменение ширины символов
;
ST_1:		CLI			; Запретить прерывания
		MOV	DX,3C4H
		MOV	AX,100H
		OUT	DX,AX		; Перезапуск блока синхронизации:
					; порт 3C4h, регистр 0
		MOV	AL,1
		OUT	DX,AL		; Получить доступ к регистру 1
		INC	DX
		IN	AL,DX		; Чтение режима синхронизации:
					; порт 3C4h, регистр 1
		DEC	DX
		OR	AL,1		; Установка ширины 8 точек
		MOV	AH,AL
		MOV	AL,1
		OUT	DX,AX		; Запись нового значения в регистр
					; режима синхронизации
		MOV	DL,0CCH
		IN	AL,DX		; Чтение регистра управления: порт 3CCh
		AND	AL,NOT 0CH	; Сброс двух битов, задающих
					; частоту синхронизации
		MOV	DL,0C2H
		OUT	DX,AL		; Запись в регистр управления: порт 3C2h
		MOV	DL,0DAH
		IN	AL,DX		; Получить доступ к контроллеру атрибутов
					; посредством чтения из порта 3DAh
		MOV	DL,0C0H
		MOV	AL,13H
		OUT	DX,AL		; Получить доступ к регистру горизонтального
					; сдвига: порт 3C0h, регистр 13h
		MOV	AL,0
		OUT	DX,AL		; Установить величину сдвига 0
		MOV	DL,0DAH
		IN	AL,DX		; Получить доступ к контроллеру атрибутов
		MOV	DL,0C0H
		MOV	AL,20H
		OUT	DX,AL		; Разрешить генерацию изображения
		MOV	DL,0C4H
		MOV	AX,300H
		OUT	DX,AX		; Перезапуск блока синхронизации
		STI			; Разрешить прерывания
		MOV	AX,4C00H
		INT	21H		; Выход из программы
CODE		ENDS
		END	START
