home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
sampler0
/
devchain.asm
< prev
next >
Wrap
Assembly Source File
|
1989-02-26
|
4KB
|
222 lines
;
; A device driver utility
; prints the chain of DOS device drivers
;
; by Raymond Michels
;
;
cseg segment
assume cs:cseg,ds:cseg
org 100h
ddhead struc
next_dd dd 0 ;
attrib dw 0 ;
strat_ptr dw 0 ;
int_ptr dw 0 ;
dev_name db 8 dup (0);
ddhead ends
begin:
mov ax,es ;get PSP segment for return
mov cs:psp_seg,ax
mov ax,cs
mov ds,ax ;set DS to our CS
mov ss,ax
mov sp,offset ourstk
;
mov ah,52h ;get dos variables
int 21h
;es:bx -> vars
add bx,22h ;get to nul device
mov dx,offset crlf ;print headers
call string_out
mov dx,offset head0
call string_out
loop1:
call prt_dd ;print device driver info
cmp word ptr es:[bx],0FFFFh ;check if last driver in chain
je exit ;yes - so exit
les bx,es:[bx] ;get address of next driver
jmp short loop1
exit:
mov ax,cs:psp_seg
mov ds,ax
mov es,ax
mov ah,0 ;exit to dos
int 21h
prt_dd proc near
;Print pertinent field of device driver header
;Input: ES:BX points to device driver header
;Output: None
push ax ;save registers
push bx
push cx
push dx
push si
mov dx,es ;segment of device driver
call hex_to_ascii
mov al,':'
call char_out
mov dx,bx ;offset of device driver
call hex_to_ascii
mov al,' '
call char_out
mov al,' '
call char_out
mov dx,es:[bx.attrib] ;attribute
call hex_to_ascii
mov al,' '
call char_out
mov al,' '
call char_out
mov dx,es ;Print SEG:OFS of Strategy
call hex_to_ascii
mov al,':'
call char_out
mov dx,es:[bx.strat_ptr]
call hex_to_ascii
mov al,' '
call char_out
mov dx,es ;Print SEG:OFS of Interrupt
call hex_to_ascii
mov al,':'
call char_out
mov dx,es:[bx.int_ptr]
call hex_to_ascii
mov al,' '
call char_out
mov al,' '
call char_out
mov ax,es:[bx.attrib];Print BLOCK or CHAR
and ax,0f000h
test ax,8000h
jnz is_char ;Has Character Attribute
mov dx,offset block ;Print Out Block Info
call string_out
mov al,' '
call char_out
mov al,es:[bx+10]
add al,48
call char_out
jmp prt_dd1
is_char:mov dx,offset char ;Print Out Character Info
call string_out
mov al,' '
call char_out
mov si,bx
add si,10
mov cx,8
is_char_loop: ;Print Out Character Device Name
mov al,es:[si]
inc si
call char_out
loopnz is_char_loop
prt_dd1:
mov dx,offset crlf
call string_out
pop si ;restore registers
pop dx
pop cx
pop bx
pop ax
ret
prt_dd endp
char_out proc near ;output character in al
push dx
mov dl,al
mov ah,2
int 21h
pop dx
ret
char_out endp
hex_to_ascii proc near ;output hex word in dx
push cx
push ax
mov cx,4
hex1:
push cx
mov cl,4
rol dx,cl
mov al,dl
and al,0fh
daa
add al,0f0h
adc al,040h
call char_out
pop cx
loop hex1
pop ax
pop cx
ret
hex_to_ascii endp
string_out proc near ;print a string pointed to by DS:DX
;first byte of string is length
push ax
push bx
push cx
push dx
mov ah,40h
mov bx,dx
inc dx ;point to string
mov cl,[bx] ;get length
mov bx,1 ;standard output
int 21h
pop dx
pop cx
pop bx
pop ax
ret
string_out endp
;
;data
;
head0 db 162,' D E V I C E D R I V E R C H A I N ',13,10
db 'Drv Addrs Atrb Strategy Interrupt Type Name/Unit',13,10
db '--------- ---- --------- --------- ----- ---------',13,10
block db 5,'Block'
char db 5,'Char '
crlf db 2,13,10
;
psp_seg dw 0
align 4
db 40 dup ('STACK ')
ourstk dw ?
cseg ends
end begin