; Программа выводит информацию о загруженных драйверах

;
; Это макроопределение печатает символы на экране
;
@@out_ch     MACRO c1,c2,c3,c4,c5
		mov   ah,02h
		IRP   chr,<c1,c2,c3,c4,c5>
		IFB   <chr>
		EXITM
		ENDIF
		mov   dl,chr
		int   21h
		ENDM
		ENDM


		  .MODEL  tiny
		  DOSSEG

		  .STACK  100h

		  .DATA

msg     DB 13,10,"Device Drivers Information V1.00", 13, 10
		  DB       "Copyright (C)Frolov A.,1990",13,10,13,10
		  DB       "Address    Attr  Device Name",13,10
		  DB       "-------    ----  -----------",13,10
		  DB "$"

bl_msg  DB "--------> Block Device, Number of Units: ","$"

		  .CODE
		  .STARTUP

		  mov     ah, 9h                ; Выводим заголовок
		  mov     dx, OFFSET msg
		  int     21h

		  mov ah,52h      ; Получаем адрес первого
		  int 21h         ;   драйвера в цепочке
		  add bx,22h      ; es:bx - адрес первого драйвера

dr_loop:
		  call show_driver_info           ; выводим параметры

		  cmp  WORD PTR es:[bx+2], 0ffffh ; последний ?
		  jz   end_of_driver_list
		  cmp  WORD PTR es:[bx], 0ffffh
		  jz   end_of_driver_list

		  mov  ax,es:[bx]        ; получаем адрес следующего
		  mov  cx,es:[bx+2]      ;     драйвера
		  mov  bx,ax
		  mov  es,cx

		  jmp  dr_loop

end_of_driver_list:

		  .EXIT   0


show_driver_info proc near       ;es:bx  - адрес драйвера

		push  es
		push  bx

		mov   ax,es                ; выводим адрес драйвера
		call  Print_word
		@@out_ch ':'
		mov   ax,bx
		call  Print_word
		@@out_ch ' ',' '

		mov   ax,es:[bx+4]         ; выводим атрибут драйвера
		call  Print_word
		@@out_ch ' ',' '

		test  WORD PTR es:[bx+4],8000h  ; проверяем, это символьный
		jz    is_block                  ;   драйвер или блочный

		mov   cx,8                      ; для символьного выводим
		mov   si,bx                     ;    имя драйвера
pr_name:
		mov   al,BYTE PTR es:[si+10]
		@@out_ch al
		inc   si
		loop pr_name
		jmp  nxt

is_block:

		mov     ah, 9h                  ; для блочного драйвера
		mov     dx, OFFSET bl_msg       ; выводим количество
		int     21h                     ; логических устройств,
		mov     al,BYTE PTR es:[bx+10]  ; которые обслуживает
		mov     ah,0                    ; этот драйвер
		call    Print_word

nxt:

		@@out_ch 13,10

		pop   bx
		pop   es

		ret
show_driver_info endp

; Вывод на экран содержимого регистра AX

Print_word proc near
;--------------------
	  push ax
	  push bx
	  push dx
;
	  push ax
	  mov cl,8
	  rol ax,cl
	  call Byte_to_hex
	  mov bx,dx
	  @@out_ch bh
	  @@out_ch bl
;
	  pop ax
	  call Byte_to_hex
	  mov bx,dx
	  @@out_ch bh
	  @@out_ch bl
;
	  pop dx
	  pop bx
	  pop ax
	  ret
Print_word endp
;
Byte_to_hex proc near
;--------------------
; al - input byte
; dx - output hex
;--------------------
	  push ds
	  push cx
	  push bx
;
	  lea bx,tabl
	  mov dx,cs
	  mov ds,dx
;
	  push ax
	  and al,0fh
	  xlat
	  mov dl,al
;
	  pop ax
	  mov cl,4
	  shr al,cl
	  xlat
	  mov dh,al
;
	  pop bx
	  pop cx
	  pop ds
	  ret
;
tabl db '0123456789ABCDEF'
Byte_to_hex endp
;

		  END
