TITLE	DACTABLE.ASM
NAME	DACTABLE
PAGE	55,132

P286

; Borland TASM directive for assembly-language syntax
IDEAL

; Borland TASM directive to disable "needs brackets" warning
NOWARN BRK

SEGMENT WAIT_TEXT WORD PUBLIC 'CODE'
ASSUME	cs:WAIT_TEXT

;unsigned HorByVer(void)

PUBLIC	HORBYVER
PROC	HORBYVER FAR

	xor  ax,ax
	mov  es,ax

	; Определяем адрес порта индексного регистра контроллера ЭЛТ (3B4h/3D4h)
	mov  dx,es:[463h]

	; Вычисляем адрес порта регистра состояния 1 (ISR1)
	add  dl,6

	; Ожидаем начала очередного цикла обновления экрана
	; (конца обратного вертикального хода луча)
wait_not_vert:

	in   al,dx
	test al,8

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

wait_vert:

	in   al,dx
	test al,8

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

	; Определяем количество обратных горизонтальных перемещений луча
	; произошедших до следующего обратного вертикального хода луча

	xor  cx,cx     ; сбрасываем счетчик
	cli            ; запрещаем прерывания

wait_not_enable:

	in   al,dx
	test al,1

	; Ожидаем вертикальное или горизонтальное прерывания
	jnz  wait_not_enable

	inc  cx        ; увеличиваем счетчик

	test al,8

	; Произошло вертикальное прерывание?
	jnz  quit

	; Если нет, значит произошло горизонтальное прерывание

wait_enable:

	in   al,dx
	test al,1

	; Ожидаем новую развертку
	jz   wait_enable

	jmp  wait_not_enable

quit:

	sti            ; разрешаем прерывания

	mov  ax,cx

	leave
	ret

ENDP	HORBYVER


; void WaitVert(void)

PUBLIC	WAITVERT
PROC	WAITVERT FAR

	enter	0, 0

	mov  ax,0h
	mov  es,ax

	; Определяем адрес порта индексного регистра контроллера ЭЛТ (3B4h/3D4h)
	mov  dx,es:[463h]

	; Вычисляем адрес порта регистра состояния 1 (ISR1)
	add  dl,6

	; Читаем содержимое порта регистра состояния 1
	in   al,dx

	; Тестируем бит D3 регистра состояния 1
	; бит D3 = 1 при обратном вертикальном ходе луча

	test al,8
	jz   wait_on

wait_off:

	in   al,dx

	; Тестируем бит D3
	test al,8

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

wait_on:

	in   al,dx
	test al,8

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

	; +--------------------------------------------------------+
	;   Здесь могут распологаться операции, которые необходимо
	;   выполнить  во время обратного  вертикального хода луча
	; +--------------------------------------------------------+

	leave
	ret

	ENDP	WAITVERT

ENDS	WAIT_TEXT

END
