LOCALS

.MODEL	SMALL


.CODE

PUBLIC	DetectAdlib

;*******************************************************************************
;DetectAdlib	определяет наличие Adlib-совместимой звуковой карты
;		(ЧМ-синтезатора)
;*******************************************************************************
;Использует:	WriteFMReg
;
;Вызов:		нет
;
;Возврат:	AX=0 - не обнаружена Adlib-совместимая звуковая карта
;		AX=1 - обнаружена Adlib-совместимая звуковая карта
;
;Изменяемые
;  регистры:	AX,BX,CX,DX,Flags
;*******************************************************************************
DetectAdlib	PROC

		mov	ax,6004h	;AL=4 (флаги управления таймерами)
					;AH=60h (сброс таймеров 1 и 2)
		call	WriteFMReg
		mov	ax,8004h	;AL=4 (флаги управления таймерами)
					;AH=80h (разрешить прерывания)
		call	WriteFMReg

		mov	dx,388h		;DX=388h (порт адреса/состояния)
		in	al,dx		;AL = байт состояния звуковой карты
		mov	bl,al		;BL = байт состояния звуковой карты

		mov	ax,0FF02h	;AL=2 (таймер 1)
					;AH=FFh (начальное значение счетчика)
		call	WriteFMReg
		mov	ax,2104h	;AL=4 (флаги управления таймерами)
					;AH=21h (запуск таймера 1)
		call	WriteFMReg

		mov	dx,388h		;DX=388h (порт адреса/состояния)
		mov	cx,100		;задержка на 80мкс
@@WaitLoop:	in	al,dx		;AL = байт состояния звуковой карты
		loop	@@WaitLoop
		mov	bh,al		;BH = байт состояния звуковой карты

		mov	ax,6004h	;AL=4 (флаги управления таймерами)
					;AH=60h (сброс таймеров 1 и 2)
		call	WriteFMReg
		mov	ax,8004h	;AL=4 (флаги управления таймерами)
					;AH=80h (разрешить прерывания)
		call	WriteFMReg

		xor	ax,ax		;AX=0
		and	bx,0E0E0h
		cmp	bx,0C000h	;если BX=C000h, обнаружена
					;Adlib-совместимая звуковая плата
		jne	@@Exit

		inc	ax		;AX=1

@@Exit:		ret

DetectAdlib	ENDP

;*******************************************************************************
;WriteFMReg	записывает значение в указанный регистр ЧМ-синтезатора
;*******************************************************************************
;Использует:	нет
;
;Вызов:		AL = адрес регистра
;		AH = записываемое значение
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AL,CX,DX,Flags
;*******************************************************************************
WriteFMReg	PROC

		mov	dx,388h		;DX=388h (порт адреса/состояния)
		out	dx,al		;запись номера регистра в порт адреса

		mov	cx,6		;задержка на 3,3мкс
@@WaitLoop1:	in	al,dx
		loop	@@WaitLoop1

		inc	dx		;DX=389h (порт данных)
		mov	al,ah
		out	dx,al		;запись значения в регистр

		dec	dx		;DX=388h (порт адреса/состояния)
		mov	cx,35		;задержка на 23мкс
@@WaitLoop2:	in	al,dx
		loop	@@WaitLoop2

		ret

WriteFMReg	ENDP


END
