TITLE	DACTABLE.ASM
NAME	DACTABLE
PAGE	55,132

P286

IDEAL
NOWARN BRK

SEGMENT VGA_TEXT WORD PUBLIC 'CODE'
ASSUME	cs:VGA_TEXT

;//void SetVgaDAC(unsigned seg_table, unsigned off_table)

off_table	EQU	[bp+6]
seg_table	EQU	[bp+8]

	PUBLIC	SETVGADAC
	PROC	SETVGADAC FAR

	enter	0, 0

	; сохраняем регистры ds и es

	push  ds
	push  es

	; устанавливаем регистр es на начало оперативной памяти

	xor   ax,ax
	mov   es,ax

	; получаем адрес порта индексного регистра контроллера ЭЛТ
	; (3B4h/3D4h),
	; в монохромных режимах для адресации к индексному регистру
	; используется порт с адресом 3B4h, а в цветных - порт 3D4h

	mov   dx,es:[463h]

	; вычисляем адрес порта регистра состояния 1,
	; в монохромных режимах для адресации к регистру состояния 1
	; используется порт с адресом 3BAh, а в цветных - порт 3DAh

	add   dx,6

	pop   es


	; ожидаем начало обратного вертикального хода луча

	in    al,dx
	nop
	nop

	; если бит D3 равен единице, то происходит обратный
	; вертикальный ход луча

	test  al,08h
	jz    wait_on

wait_off:

	in    al,dx
	nop
	nop
	test  al,08h
	jnz   wait_off

wait_on:

	in    al,dx
	nop
	nop
	test  al,08h
	jz    wait_on

	; устанавливаем индекс первого записываемого регистра
	; таблицы цветов

	mov   dx,3C8h

	; начинаем модифицировать таблицу цветов с первого регистра

	mov   ax,1
	out   dx,al

	; задержка

	nop
	nop

	; устанавливаем ds:si на массив данных, записываемых
	; в регистры таблицы цветов

	mov   ax,seg_table
	mov   ds,ax
	mov   si,off_table

	; загружаем 256 регистров (по 3 байта на регистр)

	mov   cx,(256 * 3)

	; выбираем регистр данных таблицы цветов (порт 3C9h)

	mov   dx,3C9h

	cld

	; загружаем все регистры таблицы цветов

get_reg:

	lodsb
	out   dx,al
	nop
	nop
	loop  get_reg

	; восстанавливаем регистр ds

	pop   ds

	leave
	ret 4

	ENDP	SETVGADAC

ENDS	VGA_TEXT

END
