home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 183_01 / sdira.asm < prev    next >
Assembly Source File  |  1985-12-15  |  12KB  |  279 lines

  1. page ,132
  2. title **** DIRGT.ASM ***
  3. comment *
  4.  
  5. =========================================================================
  6. DIRGT.ASM
  7. 03-06-85  by  Thomas E. Link
  8.  
  9.         If using LATTICE C delete that line.
  10. =========================================================================
  11. *
  12. page
  13. workstruc       struc
  14.         dircount        dw      (?)
  15.         dos_version     db      (?)
  16.         filler          db      (?)
  17.         saved_sp        dw      (?)
  18.         fcb             db      48 dup (?)
  19.         dta             db      48 dup (?)
  20. workstruc       ends
  21.  
  22. stack   struc                      ; Define the stack area for C.
  23.         workarea        db      type workstruc dup (?)
  24.         pushed_bp       dw      (?)
  25.         address         dw      (?)
  26.         countnumad      dw      (?)
  27.         volstrgad       dw      (?)
  28.         dirrecarad      dw      (?)
  29.         lookstringad    dw      (?)
  30. stack   ends
  31.         poplen  equ     0
  32.  
  33.  
  34. _DATA   segment word public  'DATA'
  35. _DATA   ends
  36. dgroup  group   _data
  37.         assume ds:dgroup
  38.  
  39. pgroup  group   _text
  40.         assume  CS:pgroup
  41. _TEXT   segment byte public  'CODE'
  42.         public  _DIRGET
  43. _DIRGET proc    near
  44.  
  45. DIRGET_:
  46.         cld                          ; Clear direction flag.
  47.         push    bp
  48.         mov     bp,sp                ; Point to arguments on stack.
  49.         push    di
  50.         push    si
  51.         sub     bp,type workstruc    ; Give us room to work
  52.         mov     [bp].saved_sp,sp     ; Save the stack pointer
  53.         mov     sp,bp                ; and move it below workarea.
  54.         mov     [bp].dircount,0      ; Move zero to directory count.
  55.  
  56. ;----------------- determine DOS version, store in variable
  57.         mov     ah,48                ; find DOS version number
  58.         int     21h
  59.         mov     [bp].dos_version,al  ; and store in variable
  60.  
  61. ;-----------------  parse filename
  62.         mov     ax,ss
  63.         mov     es,ax           ; Have ES point at STACK **************
  64.         mov     di,bp           ; and DI point
  65.         add     di,offset fcb   ;            to FCB area.
  66.         mov     si,[bp].lookstringad    ; Point SI at file specifier
  67.         mov     ah,29H          ; DOS function to parse filename
  68.         mov     al,1            ; scan off leading separators
  69.         int     21H             ; DOS function call
  70.         push    ds              ; Get DATA seg into ES.***************
  71.         pop     es
  72.         cmp     al,0FFH         ; Any errors on parsing ?
  73.         jne     dir2            ; No - continue
  74.         jmp     done            ; YES - end.
  75.  
  76. ;----------------- get addresses of the parms
  77. dir2:
  78.         mov     dx,bp           ; Put address of workspace into DX
  79.         add     dx,offset dta   ; Bump to DTA
  80.         push    ds              ; Save value of DS
  81.         mov     ax,ss           ; and move STACK into DS.**************
  82.         mov     ds,ax
  83.         mov     ah,1AH          ; Set AH for *SET DTA* function call.
  84.         int     21H             ; Use DOS interrupt.
  85.  
  86.         cmp     [bp].dos_version,2 ; if DOS 2.0 or greater
  87.         jae     dos2_search        ; use special routine
  88.  
  89. ;----------------- DOS 1.0, 1.1 search
  90.         mov     dx,bp           ; Point DX at workspace
  91.         add     dx,offset fcb   ;       bump to FCB area.
  92.         mov     ah,11H          ; Set AH for directory search.
  93.         int     21H             ; Use DOS interrupt.
  94.         cmp     al,0FFH         ; Any matches found ?
  95.         je      done1           ; No - so end
  96.         inc     [bp].dircount   ; Yes - count first entry.
  97.         call    move            ; Go move entry into fnames().
  98. dirloop:
  99.         mov     ah,12H          ; Set AH for continuation of search.
  100.         int     21H             ; Use DOS interrupt.
  101.         cmp     al,0FFH         ; Any matches found ?
  102.         je      done1           ; No - jump to exit
  103.         inc     [bp].dircount   ; Yes - count this entry.
  104.         call    move            ; Go move entry into arrays.
  105.         jmp     dirloop         ; Do again.
  106.  
  107. ;----------------- DOS 2.x  search
  108. dos2_search:
  109.         mov     dx,[bp].lookstringad    ; Point DX at file specifier
  110.         mov     ah,4EH          ; Set AH for directory search.
  111.         mov     cx,10H          ; search for files and directories.
  112.         int     21H             ; Use DOS interrupt.
  113.         jc      findlabel       ; No matches - so look for a label
  114.         inc     [bp].dircount   ; found - count first entry.
  115.         call    move2           ; Go move entry into arrays.
  116. dir2loop:
  117.         mov     cx,10H
  118.         mov     ah,4FH          ; Set AH for continuation of search.
  119.         int     21H             ; Use DOS interrupt.
  120.         jc      findlabel       ; No matches - so look for a label
  121.         inc     [bp].dircount   ; match - count this entry.
  122.         call    move2           ; Go move entry into arrays.
  123.         jmp     dir2loop        ; Do again.
  124. findlabel:
  125.         call    get_label       ; look for a volume label
  126. done1:
  127.         pop     ds              ; restore DS to DATA  ****************
  128. done:
  129.         mov     ax,[bp].dircount      ; Move entries count to AX.
  130.         mov     di,[bp].countnumad    ; Get address of COUNT%
  131.         mov     [di],ax         ; Put entry count in COUNT%.
  132.         mov     sp,[bp].saved_sp      ; Restore SP.
  133.         pop     si
  134.         pop     di
  135.         pop     bp              ; Restore BP.
  136.         ret     poplen          ; Return and throw away parms if PASCAL
  137.  
  138. ;........................................................................
  139. ;----------------- procedure to store results from DOS 1.x search
  140. move    proc    near
  141. ;----------------- first move filename into string array
  142.         mov     di,[bp].dirrecarad   ; Move name address to DI and BX.
  143.         mov     bx,di
  144.         add     bx,20           ; Have BX point at next record
  145.         mov     [bp].dirrecarad,bx   ; and save in variable
  146.         mov     si,bp
  147.         add     si,offset dta+1 ; put file name(in DTA) address into SI
  148.         mov     cx,4            ; Length of name in words
  149.         rep     movsw           ; Move name into array.
  150.         mov     byte ptr [di],'.' ; Put period in filename.
  151.         inc     di              ; Bump DI past '.'
  152.         mov     cx,3            ; Length of extension in bytes
  153.         rep     movsb           ; Move extension into array.
  154. ;-----------------  get the file time into array
  155.         add     si,11           ; move to file time area
  156.                 movsw           ; Move time into array.
  157. ;-----------------  get the file date into array
  158.                 movsw           ; Move size into array.
  159. ;-----------------  get the file length into array
  160.         add     si,2            ; Point SI at file size.
  161.                 movsw           ; Move size into array.
  162.                 movsw
  163.         ret
  164. move    endp
  165.  
  166. ;........................................................................
  167. ;----------------- procedure to store results of DOS 2.x search
  168. move2   proc    near
  169. ;----------------- first get the file time into array
  170.         mov     si,bp
  171.         add     si,offset dta +22 ; Point AX at DTA + 22
  172.         mov     bx,[bp].dirrecarad    ; Move record address to BX and DI.
  173.         mov     di,bx
  174.         add     di,12           ; Bump DI to time.
  175.                 movsw           ; Move time into array.
  176. ;----------------- now get the file date into array
  177.                 movsw           ; Move size into array.
  178. ;----------------- get the file length into array
  179.                 movsw           ; Move size into array.
  180.                 movsw
  181. ;-----------------  move filename into string array
  182.         mov     di,bx           ; Point DI at name.
  183.         add     bx,20           ; Bump BX to next record.
  184.         mov     [bp].dirrecarad,bx ; Save it in variable space.
  185.         mov     cx,8            ; Length of name in bytes
  186. move201:
  187.                 lodsb           ; Move character into al
  188.         cmp     al,'.'          ; If is it a period ... jump.
  189.         je      move202
  190.         cmp     al,0            ; If zero - dont jump.
  191.         jne     move201A
  192.         add     cx,4
  193.         mov     al,' '          ; Fill with spaces
  194.         rep     stosb           ; till 12 characters filled.
  195.         jmp     move203         ; Skip to subdir check.
  196. move201A:
  197.                 stosb           ; A character - store it in output string
  198.         loop    move201
  199.         inc     si              ; We found 8 characters - bump SI past .
  200.         jmp     move2020
  201. move202:
  202.         mov     al,' '          ; Pad short name with spaces.
  203.         rep     stosb
  204. move2020:
  205.         inc     di
  206.         mov     cx,3            ; Length of extension in bytes
  207. move202A:
  208.                 lodsb           ; Move character into AL.
  209.         cmp     al,0            ; Is it a zero ?
  210.         je      move202B        ; Yes .. jump.
  211.                 stosb           ; No .. Store it and loop
  212.         loop    move202A
  213.         jmp     move203
  214. move202B:
  215.         mov     al,' '
  216.         rep     stosb
  217. move203:
  218.         mov     byte ptr[di]-4,'.'      ; Store a period.
  219.         cmp     byte ptr [bp].dta+21,10H        ; is it a subdirectory ?
  220.         jne     move23          ; no - jump
  221.         std                     ; change direction to decrement SI and DI
  222.         dec     di              ; Back up to last character of extension
  223.         mov     cx,3            ; Store `...' as the extension name when
  224.         mov     al,'.'          ; a subdirectory entry.
  225.         rep     stosb
  226.         cld                     ; clear direction flag (increment)
  227. move23:
  228.         ret
  229. move2   endp
  230.  
  231. ;........................................................................
  232.  
  233. get_label proc near             ;Display the label for the
  234.                                 ;disk in the selected drive 
  235.         push    es              ; Save ES
  236.         push    ss              ; Get STACK into ES **************
  237.         pop     es
  238. ;----------------- first change the FCB to an extended FCB
  239.         mov     di,bp 
  240.         add     di,offset fcb   ; Move FCB address to DI
  241.         mov     dx,di           ; And also put into DX.
  242.         mov     al,byte ptr[di] ; Get drive id
  243.         mov     byte ptr [di+7],al    ; move it to offset 7
  244.         mov     byte ptr [di],0FFH    ; indicate extended FCB
  245.         inc     di
  246.         mov     cx,5            ; Store 5 zeros
  247.         xor     al,al
  248.         rep     stosb
  249.         mov     byte ptr [di],08H   ; Store volume attribute
  250.         inc     di
  251.         inc     di              ; bump past drive id
  252.         mov     cx,11
  253.         mov     al,'?'          ; Store 11 `?' in filename
  254.         rep     stosb
  255.         mov     cx,25           ; End with 25 zeros
  256.         xor     al,al
  257.         rep     stosb
  258.         pop     es              ; restore ES
  259. ;----------------- now search for volume
  260.         mov     ah,11H          ; using DOS function 11H
  261.         int     21h
  262.         cmp     al,0FFH         ;any volume label found?
  263.         je      get_label2      ;no,jump
  264. ;----------------- store volume name in variable
  265.         mov     di,[bp].volstrgad    ; Point DI at VOLUMES
  266.         mov     si,bp
  267.         add     si,offset dta +8; Point AX at File name in DTA
  268.         mov     cx,11           ; Length of name in bytes
  269.         rep     movsb           ; Move name into string
  270. get_label2:
  271.         ret
  272. get_label endp
  273.  
  274. ;........................................................................
  275.  
  276. _dirget          endp
  277. _text            ends
  278.                  end
  279.