LOCALS

.MODEL	SMALL


SCANDEVSTRUC	STRUC
	sd_wBasePort	DW	?
	sd_bDevNum	DB	?
	sd_psPort	DW	?
SCANDEVSTRUC	ENDS


.STACK	100h


.DATA

sPriMaster	DB	"======================Primary Master=======================", 0Dh, 0Ah, "$"
sPriSlave	DB	"=======================Primary Slave=======================", 0Dh, 0Ah, "$"
sSecMaster	DB	"=====================Secondary Master======================", 0Dh, 0Ah, "$"
sSecSlave	DB	"======================Secondary Slave======================", 0Dh, 0Ah, "$"
sTerMaster	DB	"======================Tertiary Master======================", 0Dh, 0Ah, "$"
sTerSlave	DB	"======================Tertiary Slave=======================", 0Dh, 0Ah, "$"
sQuaMaster	DB	"=====================Quaternary Master=====================", 0Dh, 0Ah, "$"
sQuaSlave	DB	"=====================Quaternary Slave======================", 0Dh, 0Ah, "$"

sDevice		DB	"           Device: ", "$"
sModel		DB	"            Model: ", "$"
sFirmwareRev	DB	"Firmware Revision: ", "$"
sSerNum		DB	"    Serial Number: ", "$"

sHDD		DB	"HDD", "$"
sCDROM		DB	"CDROM", "$"
sUnknown	DB	"Unknown", "$"

sPressAnyKey	DB	0Dh, 0Ah, "Press any key..."

ScanDevices	SCANDEVSTRUC	<1F0h,0,OFFSET sPriMaster>
		SCANDEVSTRUC	<1F0h,1,OFFSET sPriSlave>
		SCANDEVSTRUC	<170h,0,OFFSET sSecMaster>
		SCANDEVSTRUC	<170h,1,OFFSET sSecSlave>
		SCANDEVSTRUC	<1E8h,0,OFFSET sTerMaster>
		SCANDEVSTRUC	<1E8h,1,OFFSET sTerSlave>
		SCANDEVSTRUC	<168h,0,OFFSET sQuaMaster>
		SCANDEVSTRUC	<168h,1,OFFSET sQuaSlave>
SCANDEVICESCOUNT	=	($-ScanDevices)/SIZE SCANDEVSTRUC


.DATA?

DevInfo		DW	256 DUP(?)


.CODE

EXTRN	GetATAPIDevInfo:PROC
EXTRN	GetIDEDevInfo:PROC
EXTRN	DetectATAPIDev:PROC

Start:
		mov	ax,@data		;AX = сегмент данных
		mov	ds,ax			;DS = сегмент данных
		mov	es,ax			;ES = сегмент данных

;Сканирование устройств IDE/ATAPI
		mov	si,OFFSET ScanDevices	;DS:SI -> ScanDevices
		mov	di,OFFSET DevInfo	;ES:DI -> DevInfo

		mov	cx,SCANDEVICESCOUNT
@@DevLoop:	push	cx

;Получение информации об устройстве IDE/ATAPI
		mov	dx,[(SCANDEVSTRUC PTR si).sd_wBasePort]
		mov	al,[(SCANDEVSTRUC PTR si).sd_bDevNum]
		push	ax
		push	dx
		call	DetectATAPIDev
		pop	dx
		pop	ax
		jc	@@TryIDE

		call	GetATAPIDevInfo
		jmp	@@Common

@@TryIDE:	call	GetIDEDevInfo

@@Common:	jc	@@NextDev

;Вывод информации об устройстве IDE/ATAPI
		mov	dx,[(SCANDEVSTRUC PTR si).sd_psPort]
		mov	ah,9
		int	21h

		call	PrintDevInfo

@@NextDev:	pop	cx
		add	si,SIZE SCANDEVSTRUC
		loop	@@DevLoop

Exit:		mov	bx,2			;стандартное устройство вывода
						;ошибки
		mov	dx,OFFSET sPressAnyKey
		mov	cx,18
		mov	ah,40h
		int	21h

		xor	ah,ah
		int	16h

		mov	ax,4C00h		;AH=4Ch (функция завершения
						;программы)
		int	21h


;*******************************************************************************
;PrintDevInfo	выводит информацию об устройстве
;*******************************************************************************
;Использует:	NewLine
;		int 21h
;
;Вызов:		DS:DI -> буфер с информацией об устройстве
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,BX,CX,DX,Flags
;*******************************************************************************
PrintDevInfo	PROC

		mov	bx,1			;стандартное устройство вывода

;Тип устройства
		mov	dx,OFFSET sDevice
		mov	ah,9
		int	21h

		mov	al,[di+1]
		test	al,80h			;устройство ATAPI?
		mov	dx,OFFSET sHDD
		jz	@@PrintDeviceType

		and	al,1Fh			;AL = тип устройства ATAPI
		cmp	al,5			;CDROM?
		mov	dx,OFFSET sCDROM
		je	@@PrintDeviceType
		mov	dx,OFFSET sUnknown

@@PrintDeviceType:
		mov	ah,9
		int	21h

		call	NewLine

;Модель
		cmp	WORD PTR [di+54],0
		je	@@Model_Done

		mov	dx,OFFSET sModel
		mov	ah,9
		int	21h

		lea	dx,[di+54]
		mov	cx,40
		mov	ah,40h
		int	21h

		call	NewLine

@@Model_Done:

;Firmware Revision
		cmp	WORD PTR [di+46],0
		je	@@FirmwareRev_Done

		mov	dx,OFFSET sFirmwareRev
		mov	ah,9
		int	21h

		lea	dx,[di+46]
		mov	cx,8
		mov	ah,40h
		int	21h

		call	NewLine

@@FirmwareRev_Done:

;Серийный номер
		cmp	WORD PTR [di+20],0
		je	@@SerNum_Done

		mov	dx,OFFSET sSerNum
		mov	ah,9
		int	21h

		lea	dx,[di+20]
		mov	cx,20
		mov	ah,40h
		int	21h

		call	NewLine

@@SerNum_Done:

		ret

PrintDevInfo	ENDP

;*******************************************************************************
;NewLine	переводит курсор на новую строку на стандартном устройстве
;		вывода
;*******************************************************************************
;Использует:	int 21h
;
;Вызов:		нет
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AH,DL,Flags
;*******************************************************************************
NewLine		PROC

		mov	ah,2
		mov	dl,0Dh
		int	21h
		mov	dl,0Ah
		int	21h

		ret

NewLine		ENDP


END		Start
