home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / cexpress / files / dirlevel.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-03  |  1.7 KB  |  63 lines

  1. ;unsigned short  directory_level(tree_array,array_position);
  2. ;  char  *tree_array;
  3. ;  unsigned short  array_position;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.     EXTRN  _tree_array_size:word
  8.  
  9. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  10.     ASSUME CS:_TEXT
  11.     PUBLIC _directory_level
  12. _directory_level    proc near
  13.     push bp            ;
  14.     mov  bp,sp        ;
  15.     push di            ;
  16.     push si            ;
  17.     cmp  _memory_model,0    ;near or far?
  18.     jle  begin        ;jump if near
  19.     inc  bp            ;else add 2 to BP
  20.     inc  bp            ;
  21. begin:    mov  dx,1        ;let dx count levels
  22.     cmp  _memory_model,2    ;data near or far?
  23.     jb   L0            ;jump if near
  24.     les  di,dword ptr[bp+4] ;ES:DI pts to array
  25.     add  di,21        ;start with first array element
  26.     mov  ax,[bp+8]        ;get array position
  27.     jmp  short L00        ;
  28. L0:    mov  ax,ds        ;ES = DS
  29.     mov  es,ax        ;
  30.     mov  di,[bp+4]        ;
  31.     add  di,21        ;start with first array element
  32.     mov  ax,[bp+6]        ;array position
  33. L00:    mov  si,di        ;save copy of di
  34.     cmp  ax,_tree_array_size ;in range?
  35.     jna  L1            ;jump ahead if OK
  36.     mov  _error_code,1    ;
  37.     sub  dx,dx        ;return zero
  38.     jmp  short L2        ;jump ahead and quit
  39. L1:    mov  _error_code,0    ;default errorcode
  40.     mov  di,si        ;restore original array ptr
  41.     dec  ax            ;count from zero to get offset
  42.     mov  cl,21        ;byte per element
  43.     mul  cl            ;calculate offset
  44.     add  di,ax        ;now ES:DI pts to element
  45.     add  di,13        ;point to parent field    
  46.     mov  bx,es:[di]        ;fetch parent pointer
  47.     or   bx,bx        ;test if pts to root dir
  48.     jz   L2            ;jump if no higher levels
  49.     inc  dx            ;else increment level counter
  50.     mov  ax,bx        ;new offset
  51.     jmp  short L1        ;go check parent element
  52. L2:     mov  ax,dx        ;level counter to AX
  53.     pop  si            ;
  54.     pop  di            ;
  55.     pop  bp            ;
  56.     cmp  _memory_model,0    ;quit
  57.     jle  quit        ;
  58.     db   0CBh        ;RET far
  59. quit:    ret            ;RET near
  60. _directory_level  endp
  61. _TEXT    ENDS
  62.     END
  63.