TITLE	CHARGEN.ASM
NAME	CHARGEN

P286
IDEAL
NOWARN BRK


GROUP	DGROUP _DATA

SEGMENT MAP2 WORD PUBLIC 'CODE'
ASSUME	cs:MAP2, ds:DGROUP

;===============================================================
; OpenMap2
; Функция открывает доступ ко второму слою видеопамяти
; void VS2API OpenMap2( LPVOID lpSave );
;===============================================================
PUBLIC	OPENMAP2
PROC	OPENMAP2 FAR

	enter	0, 0

; Программируем регистры синхронизатора

	; Получаем доступ к регистру определения структуры памяти
	; (регистр MMR)
	mov	dx, 3C4h
	mov	al, 4
	out	dx, al

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

	; Сохраняем полученную величину в переменной varMMR
	mov	varMMR, al

	mov	ah, al

	;	and	ah, 0F7h	; bit 3 = 0

	; Запрещаем доступ по четным адресам к нулевому слою,
	; а по нечетным адресам к первому слою
	or 	ah, 4		; bit 2 = 1
	mov	al, 4

	dec	dx

	; Обновляем значение регистра MMR
	out	dx, ax

	; Получаем доступ к регистру разрешения записи цветотвого слоя
	; (регистр CPWER)

;	mov	dx, 3C4h
	mov	al, 2
	out	dx, al

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

	; Сохраняем полученную величину в переменной varCPWER
	mov	varCPWER, al

	; Открываем доступ ко второму цветовому слою
	mov	ah, 4

	; Обновляем значение регистра CPWER
	dec	dx
	mov	al, 2
	out	dx, ax

; Программируем регистры графического контроллера

	; Считываем значение регистра многоцелевого назначения
	; (регистр MIR)
	mov	dx, 3CEh
	mov	al, 6
	out	dx, al

	inc	dx
	in 	al, dx

	; Сохраняем значение регистра MIR
	mov	varMIR, al

	; Отображаем видеопамять на область адресов
	; A000:0000h - B000:FFFFh
	mov	ah, al
	and	ah, 0F1h

	; Обновляем значение регистра MIR
	dec	dx
	mov	al, 6
	out	dx, ax

	; Считываем значение регистра режима работы
	; (регистр MDR)

	mov	dx, 3CEh
	mov	al, 5
	out	dx, al

	inc	dx
	in 	al, dx

	; Сохраняем значение регистра MDR
	mov	varMDR, al

	; Отключаем разделение доступа по четным/нечетным адресам
	; к разным слоям видеопамяти
	mov	ah, al
	and	ah, 0EFh

	; Обновляем значение регистра MDR
	dec	dx
	mov	al, 5
	out	dx, ax

	; Считываем значение регистра выбора читаемого слоя
	; (регистр RPSR)
	mov	dx, 3CEh
	mov	al, 4
	out	dx, al

	inc	dx
	in 	al, dx

	; Сохраняем значение регистра RPSR
	mov	varRPSR, al

	; Получаем доступ на чтение второго слоя видеопамяти
	mov	ah,2

	; Обновляем значение регистра RPSR
	dec	dx
	mov	al, 4
	out	dx, ax

	leave
	ret

ENDP	OPENMAP2

;===============================================================
; CloseMap2
; Функция возвращает видеоадаптер в текстовый режим
;   void VS2API CloseMap2( LPVOID lpSave );
;===============================================================

PUBLIC	CLOSEMAP2
PROC	CLOSEMAP2 FAR

	enter	0, 0

; Программируем регистры синхронизатора
	mov	dx, 3C4h

	; Выполняяем асинхронный сброс синхронизатора
	mov	al, 0
	mov	ah, 1
	out	dx, ax

	; Восстанавливаем значение регистра определения
	; структуры памяти (регистр MMR)
	mov	al, 4
	mov	ah, varMMR
	out	dx, ax

	; Восстанавливаем значение регистра разрешения
	; записи цветового слоя (регистр CPWER)
	mov	al, 2
	mov	ah, varCPWER
	out	dx, ax

; Программируем регистры графического контроллера
	mov	dx, 3CEh

	; Восстанавливаем значение регистра многоцелевого
	; назначения (регистр MIR)
	mov	al, 6
	mov	ah, varMIR
	out	dx, ax

	; Восстанавливаем значение регистра режима
	; работы (регистр MDR)
	mov	al, 5
	mov	ah, varMDR
	out	dx, ax

	; Восстанавливаем значение регистра выбора
	; читаемого слоя (регистр RPSR)
	mov	al, 4
	mov	ah, varRPSR
	out	dx, ax

	leave
	ret

ENDP CLOSEMAP2

ENDS	MAP2


SEGMENT _DATA	WORD PUBLIC 'DATA'

	; В следующих переменных сохраняются регистры синхронизатора
	; и регистры графического контроллера
	varMMR	DB	0
	varCPWER	DB	0
	varMIR	DB	0
	varMDR	DB	0
	varRPSR	DB	0

ENDS	_DATA

END
