LOCALS

.MODEL	SMALL


.CODE

PUBLIC	GetVideoMode
PUBLIC	SetVideoMode
PUBLIC	SetPaletteRegs
PUBLIC	SetDACRegs
PUBLIC	SetGraphASCII
PUBLIC	ScreenOff
PUBLIC	ScreenOn
PUBLIC	ClrScr

;*******************************************************************************
;GetVideoMode	возвращает текущий видеорежим
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		нет
;
;Возврат:	AL = текущий видеорежим
;		AH = число знаков в строке
;		BH = номер активной страницы экрана
;
;Изменяемые
;  регистры:	AX,BH,Flags
;*******************************************************************************
GetVideoMode	PROC

		mov	ah,0Fh		;номер функции возврата текущего
					;видеорежима
		int	10h

		ret

GetVideoMode	ENDP

;*******************************************************************************
;SetVideoMode	устанавливает графический режим
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		AL = номер видеорежима
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AH,Flags
;*******************************************************************************
SetVideoMode	PROC

		xor	ah,ah		;AH=0 (номер функции прерывания INT 10h)
		int	10h

		ret

SetVideoMode	ENDP

;*******************************************************************************
;SetPaletteRegs	устанавливает все регистры палитры
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		ES:DX -> таблица с новыми значениями регистров
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,Flags
;*******************************************************************************
SetPaletteRegs	PROC

		mov	ax,1002h	;AH=10h (номер функции прерывания
					;int 10h)
					;AL=2 (установка регистров палитры
					;и регистра цвета рамки)
		int	10h

		ret

SetPaletteRegs	ENDP

;*******************************************************************************
;SetDACRegs	устанавливает несколько регистров таблицы цветов (регистров ЦАП)
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		BX = номер первого регистра таблицы цветов
;		CX = число устанавливаемых регистров (1-256)
;		ES:DX -> таблица с новыми значениями регистров ЦАП
;		Таблица цветов содержит по три байта на один регистр ЦАП
;		В каждом байте значимыми являются только 6 бит.
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,Flags
;*******************************************************************************
SetDACRegs	PROC

		mov	ax,1012h	;AH=10h (номер функции прерывания
					;int 10h)
					;AL=12h (установка нескольких
					;регистров ЦАП)
		int	10h

		ret

SetDACRegs	ENDP

;*******************************************************************************
;SetGraphASCII	загружает определенный пользователем набор графических
;		символов
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		CX = количество байтов на определение символа
;		DL = количество строк символов
;		ES:BX -> таблица определения символов
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,BL,Flags
;*******************************************************************************
SetGraphASCII	PROC

		push	bp

		mov	ax,1121h	;AH=11h (номер службы интерфейса для
					;генератора знаков)
					;AL=21h (номер подфункции)
		mov	bp,bx		;ES:BP -> таблица определения символов
		xor	bl,bl		;количество отображаемых знаковых
					;строк в DL
		int	10h

		pop	bp

		ret

SetGraphASCII	ENDP

;*******************************************************************************
;ScreenOff/ScreenOn гасит/включает экран
;*******************************************************************************
;Вызов:		нет
;
;Возврат:	AL=12h, если компьютер имеет видеоадаптер VGA
;
;Изменяемые
;  регистры:	AX,BL,Flags
;*******************************************************************************
ScreenOff	PROC

		mov	al,1		;AL=1 (гашение экрана)
		jmp	@@Switch

ScreenOn:
		xor	al,al		;AL=0 (включение экрана)

@@Switch:	mov	ah,12h		;AH=12h (функция прерывания int 10h)
		mov	bl,36h		;BL = подфункция гашения/включения экрана
		int	10h

		ret

ScreenOff	ENDP

;*******************************************************************************
;ClrScr		очищает экран заданным цветом
;*******************************************************************************
;Использует:	int 10h
;
;Вызов:		BH = цвет экрана
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,CX,DX,Flags
;*******************************************************************************
ClrScr		PROC

		push	ds

		mov	ax,40h
		mov	ds,ax		;DS = сегмент области данных видео-BIOS

		mov	ax,600h		;AH=6 (функция свертки окна вверх)
					;AL=0 (очистить все окно)
		xor	cx,cx		;левый верхний угол окна - (0,0)
		mov	dh,ds:[84h]	;DH = число строк в данном режиме - 1
		mov	dl,ds:[4Ah]	;DL = число символов в строке
		dec	dl
		int	10h

		pop	ds

		ret

ClrScr		ENDP


END
