home *** CD-ROM | disk | FTP | other *** search
- ;unsigned short prior_subdirectory(array_position,tree_array);
- ; unsigned short array_position;
- ; char *tree_array;
-
- EXTRN _memory_model:byte
- EXTRN _error_code:byte
- EXTRN _tree_array_size:word
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _prior_subdirectory
- _prior_subdirectory proc near
- push bp ;
- mov bp,sp ;
- push di ;
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bp ;else add 2 to BP
- inc bp ;
- begin: mov ax,[bp+4] ;get current element
- mov _error_code,1 ;1 = ArrayPosition out of range
- or ax,ax ;zero?
- jz L5 ;
- cmp ax,_tree_array_size ;too large?
- ja L5 ;
- dec _error_code ;0 = No error
- call FigureOffset ;
- mov ax,es:[di+17] ;get Prior
- or ax,ax ;is there a Prior?
- jnz L2 ;go get Parent if not
- mov ax,es:[di+13] ;get Parent
- jmp short L5 ;quit
- L2: mov bx,ax ;copy current element number
- call FigureOffset ;point to Prior
- L3: mov ax,es:[di+15] ;if there a Child?
- or ax,ax ;
- jnz L4 ;jump ahead if Child exists
- mov ax,bx ;set element number for return
- jmp short L5 ;quit
- L4: mov bx,ax ;copy current element number
- call FigureOffset ;point to Child or next Next
- mov ax,es:[di+19] ;if there a Next?
- or ax,ax ;
- jz L3 ;jump ahead if not
- jmp short L4 ;go to last Next
- L5: pop di ;
- pop bp ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _prior_subdirectory endp
- figureoffset PROC ;figures offset of array element
- cmp _memory_model,2 ;data near or far?
- jb L6 ;jump if near
- les di,dword ptr[bp+6] ;ES:DI pts to tree array
- add di,21 ;start with array element 1
- jmp short L7 ;
- L6: push ds ;
- pop es ;
- mov di,[bp+6] ;
- add di,21 ;start with array element 1
- L7: dec ax ;count from zero
- mov dl,21 ;bytes per element
- mul dl ;
- add di,ax ;now ES:DI pts to element
- ret ;
- figureoffset endp ;
- _TEXT ENDS
- END