TITLE	EVGAM.ASM
NAME	EVGAM
PAGE	55,132

P286

IDEAL

NOWARN BRK

INCLUDE EVGA.INC

SEGMENT EVGA_TEXT WORD PUBLIC 'CODE'
ASSUME	cs:EVGA_TEXT


; void Set320x400Mode( void )
; Установка режима 320х400 пикселов, 256 цветов.

PUBLIC	SET320X400MODE
PROC	SET320X400MODE FAR

	enter	0, 0

	; сохраняем регистр di
	push	di

	; устанавливаем стандартный режим 13h (320x200 пикселов, 256 цветов)
	mov	ax,0013h
	int	10h

	; выбираем регистр определенияя структуры памяти
	mov	dx,SC_INDEX
	mov	al,MMR
	out	dx,al

	; считываем значение регистра определения структуры памяти
	inc     dx
	in      al,dx

	; сбрасываем бит D4
	and     al,11110111b

	; устанавливаем бит D3, при этом выключается режим адресации
	; по четным и нечетным адресам к разным слоям памяти
	or      al,00000100b

	; записываем в регистр новое значение
	out     dx,al


	; после загрузки в этот регистр нового значения структура
	; видеопамяти соответствует режимам 10h и 12h за исключением
	; того, что каждому пикселу соответствует один байт видеопамяти

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

	mov     dx,GC_INDEX
	mov     al,MDR
	out     dx,al

	; считываем его значение
	inc     dx
	in      al,dx

	; выключаем доступ по четным адресам к четным слоям, а по
	; нечетным адресам к нечетным слоям
	and     al,11101111b
	out     dx,al

	; выбираем регистр смешанного назначения графического контроллера
	dec     dx
	mov     al,MIR
	out     dx,al

	; считываем его значение
	inc     dx
	in      al,dx

	; сбрасываем бит управляющий сцеплением четных и нечетных слоев
	and     al,11111101b
	out     dx,al

	; разрешаем запись днных во все четыре цветовых слоя,
	; записывая число 0fh в регистр разрешения записи цветового слоя

	mov     dx,SC_INDEX
	mov     al,CPWER
	out     dx,al

	inc     dx
	mov     al,00001111b
	out     dx,al

	; очищаем первую страницу видеопамяти, так как установка
	; ржима 13h очищает только первые 64K

	mov     ax,VGA_SEGMENT
	mov     es,ax

	xor     di,di
	mov     ax,di

	mov     cx,8000h
	cld
	rep     stosb

	; выбираем регистр высоты символов текста контроллера ЭЛТ
	mov     dx,CRTC_INDEX
	mov     al,MSLR
	out     dx,al

	inc     dx
	in      al,dx

	; устанавливаем высоту символа равную нулю
	; !!! and     al,not 1fh

	; запрещаем двойное сканирование
	and     al,01100000b
	out     dx,al

	; выбираем регистр положения подчеркивания символа
	dec     dx
	mov     al,ULR
	out     dx,al

	; выключаем режим адресации видеопамяти по двойным словам
	inc     dx
	in      al,dx
	and     al,10111111b
	out     dx,al

	; выбираем регистр управления режимом
	dec     dx
	mov     al,MCR
	out     dx,al

	; включаем байтовый режим адресации
	inc     dx
	in      al,dx
	or      al,01000000b
	out     dx,al

	pop     di

	leave
	ret

ENDP	SET320X400MODE


; void WritePixel(unsigned x, unsigned y, unsigned char color)
; Функция отображает на экране пиксел в заданных координатах,
; определенного цвета.
; x - x-координата пиксела (0-319),
; y - y-координата пиксела (0-399),
; color - цвет пиксела (0-255).

color	EQU	[bp+6]
y		EQU	[bp+8]
x		EQU	[bp+10]

PUBLIC	WRITEPIXEL
PROC	WRITEPIXEL FAR

	enter	0, 0

	push    di

	mov     cx,x
	mov     dx,y
	mov     bl,color

	mov     ax,VGA_SEGMENT
	mov     es,ax

	mov     ax,( SCREEN_WIDTH / 4 )
	mul     dx

	push    cx

	shr     cx,1
	shr     cx,1

	add     ax,cx
	mov     di,ax

	pop     cx

	and     cl,3
	mov     ah,1
	shl     ah,cl

	mov     dx,SC_INDEX
	mov     al,CPWER
	out     dx,ax

	mov     es:[di],bl

	pop     di

	leave
	ret 6


ENDP	WRITEPIXEL

; unsigned char ReadPixel(unsigned x, unsigned y, unsigned char color)*
; Функция возвращает значение байта видеопамяти, определяющего пиксел
; с заданными координатами.
; x - x-координата пиксела (0-319),
; y - y-координата пиксела (0-399).
; Return  цвет пиксела (0-255).

color	EQU	[bp+6]
y		EQU	[bp+8]
x		EQU	[bp+10]

PUBLIC	READPIXEL
PROC	READPIXEL FAR

	enter	0, 0

	unsigned char  color;

	push    si

	mov     cx,x
	mov     dx,y

	mov     ax,VGA_SEGMENT
	mov     es,ax

	mov     ax,( SCREEN_WIDTH / 4 )
	mul     dx

	push    cx

	shr     cx,1
	shr     cx,1

	add     ax,cx
	mov     si,ax

	pop     ax

	and     al,3
	mov     ah,al

	mov     dx,GC_INDEX
	mov     al,RPSR
	out     dx,ax

	mov     al,es:[si]
	mov     color,al

	pop     si

	return( color );

	leave
	ret 6

ENDP	READPIXEL


; void FullScr( unsigned char color )
; Закрашивает экран заданным цветом.
; color - цвет экрана (0-255).

color	EQU	[bp+6]

PUBLIC	FILLSCR
PROC	FILLSCR FAR

	enter	0, 0

	;разрешаем запись данных во все четыре цветовых слоя

	push    di

	mov     dx,SC_INDEX
	mov     al,CPWER
	out     dx,al

	inc     dx
	mov     al,0fh
	out     dx,al

	mov     ax,VGA_SEGMENT
	mov     es,ax

	xor     di,di
	mov     al,color

	mov     cx,32000
	cld
	rep     stosb

	pop     di

	leave
	ret 2

ENDS	EVGA_TEXT

END
