home *** CD-ROM | disk | FTP | other *** search
- ;unsigned short directory_level(tree_array,array_position);
- ; char *tree_array;
- ; unsigned short array_position;
-
- EXTRN _memory_model:byte
- EXTRN _error_code:byte
- EXTRN _tree_array_size:word
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _directory_level
- _directory_level proc near
- push bp ;
- mov bp,sp ;
- push di ;
- push si ;
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bp ;else add 2 to BP
- inc bp ;
- begin: mov dx,1 ;let dx count levels
- cmp _memory_model,2 ;data near or far?
- jb L0 ;jump if near
- les di,dword ptr[bp+4] ;ES:DI pts to array
- add di,21 ;start with first array element
- mov ax,[bp+8] ;get array position
- jmp short L00 ;
- L0: mov ax,ds ;ES = DS
- mov es,ax ;
- mov di,[bp+4] ;
- add di,21 ;start with first array element
- mov ax,[bp+6] ;array position
- L00: mov si,di ;save copy of di
- cmp ax,_tree_array_size ;in range?
- jna L1 ;jump ahead if OK
- mov _error_code,1 ;
- sub dx,dx ;return zero
- jmp short L2 ;jump ahead and quit
- L1: mov _error_code,0 ;default errorcode
- mov di,si ;restore original array ptr
- dec ax ;count from zero to get offset
- mov cl,21 ;byte per element
- mul cl ;calculate offset
- add di,ax ;now ES:DI pts to element
- add di,13 ;point to parent field
- mov bx,es:[di] ;fetch parent pointer
- or bx,bx ;test if pts to root dir
- jz L2 ;jump if no higher levels
- inc dx ;else increment level counter
- mov ax,bx ;new offset
- jmp short L1 ;go check parent element
- L2: mov ax,dx ;level counter to AX
- pop si ;
- pop di ;
- pop bp ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _directory_level endp
- _TEXT ENDS
- END