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

  1. ;void  get_volume(spec,work_area,return_string);
  2. ;  unsigned short  spec;
  3. ;  char  *work_area,*return_string;
  4.  
  5.     EXTRN  _memory_model:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _get_volume
  10. _get_volume proc near
  11.     push bp            ;
  12.     mov  bp,sp        ;
  13.     push di            ;
  14.     push si            ;
  15.     cmp  _memory_model,0    ;near or far?
  16.     jle  begin        ;jump if near
  17.     inc  bp            ;else add 2 to BP
  18.     inc  bp            ;
  19. begin:    push ds            ;
  20.     mov  ah,2fh        ;save current DTA
  21.     int  21h        ;
  22.     push es            ;
  23.     push bx            ;
  24.     cld            ;set direction flag
  25.     mov  al,[bp+4]        ;get drive specifier
  26.     push ax            ;save for later
  27.     cmp  _memory_model,2    ;data near or far?
  28.     jb   L0            ;jump if near
  29.     lds  dx,dword ptr[bp+6]  ;DS:DX pts to WorkArea
  30.     les  di,dword ptr[bp+10] ;point to return string
  31.     jmp  short L00        ;
  32. L0:    mov  dx,[bp+6]        ;NEAR case
  33.     mov  ax,ds        ;ES = DS
  34.     mov  es,ax        ;
  35.     mov  di,[bp+8]        ;
  36. L00:    mov  ah,1ah        ;function to set DTA
  37.     int  21H        ;set DTA
  38.     mov  si,dx        ;point SI to DTA
  39.     pop  ax            ;get back drive spec
  40.     or   al,al        ;0 = current drive
  41.     jnz  L1            ;jump if not current
  42.     mov  ah,19H        ;DOS func to get drv num
  43.     int  21H        ;get current drive
  44.     inc  al            ;count drives from 1
  45. L1:    add  al,64        ;convert to A:, B: etc.
  46.     mov  [si],al        ;write it
  47.     inc  si            ;forward ptr
  48.     mov  al,':'        ;color to follow drv spec
  49.     mov  [si],al        ;write it
  50.     inc  si            ;forward ptr
  51.     mov  al,'*'        ;global character
  52.     mov  [si],al        ;write it
  53.     inc  si            ;forward ptr
  54.     mov  al,'.'        ;global character
  55.     mov  [si],al        ;write it
  56.     inc  si            ;forward ptr
  57.     mov  al,'*'        ;global character
  58.     mov  [si],al        ;write it
  59.     inc  si            ;forward ptr
  60.     mov  al,0        ;terminate with 0
  61.     mov  [si],al        ;write it
  62.     mov  cx,8        ;attribute for vol label
  63.     mov  ah,4eh        ;function to seek file
  64.     int  21H        ;seek vol label
  65.     jnc  L2            ;jump if found
  66.     mov  byte ptr es:[di],0 ;set null string
  67.     jmp  L5            ;go quit
  68. L2:    mov  si,dx        ;SI to start of WorkArea
  69.     add  si,30        ;offset to vol label
  70. L3:    lodsb            ;get a byte
  71.     or   al,al        ;test for terminating 0
  72.     jz   L4            ;jump when finished
  73.     cmp  al,'.'        ;period?
  74.     je   L3            ;skip it if so
  75.     stosb            ;transfer char 
  76.     jmp  short L3        ;go get next
  77. L4:    mov  byte ptr es:[di],0 ;set string terminator
  78. L5:    pop  dx            ;restore prior DTA
  79.     pop  ds            ;
  80.     mov  ah,1ah        ;
  81.     int  21h        ;
  82.     pop  ds            ;
  83.     pop  si            ;
  84.     pop  di            ;
  85.     pop  bp            ;
  86.     cmp  _memory_model,0    ;quit
  87.     jle  quit        ;
  88.     db   0CBh        ;RET far
  89. quit:    ret            ;RET near
  90. _get_volume  endp
  91. _TEXT    ENDS
  92.     END
  93.