home *** CD-ROM | disk | FTP | other *** search
- ;unsigned short next_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 _next_subdirectory
- _next_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 L2 ;error if so
- cmp ax,_tree_array_size ;too large?
- ja L2 ;also an error
- dec _error_code ;0 = No error
- call FigureOffset ;
- mov ax,es:[di+15] ;get Child
- or ax,ax ;
- jnz L2 ;quit if not zero
- L1: mov ax,es:[di+19] ;get Next
- or ax,ax ;
- jnz L2 ;quit if not zero
- mov ax,es:[di+13] ;go back to Parent
- or ax,ax ;no more subdirs when Parent = 0
- jz L2 ;
- call FigureOffset ;else loop upwards
- jmp short L1 ;
- L2: pop di ;
- pop bp ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _next_subdirectory endp
- figureoffset PROC ;figures offset of array element
- cmp _memory_model,2 ;data near or far?
- jb L3 ;jump if near
- les di,dword ptr[bp+6] ;ES:DI pts to tree array
- add di,21 ;start with element 1
- jmp short L4 ;
- L3: push ds ;
- pop es ;
- mov di,[bp+6] ;
- add di,21 ;start with element 1
- L4: 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