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

  1. ;void  set_volume(spec,work_area,new_label);
  2. ;  unsigned short  spec;
  3. ;  char  *work_area,*new_label;
  4.  
  5.     EXTRN  _memory_model:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _set_volume
  10. _set_volume proc near
  11.     jmp  short start    ;jump over local data
  12. label_seg dw ?            ;
  13. label_ofs dw ?            ;
  14. start:    push bp            ;
  15.     mov  bp,sp        ;
  16.     push di            ;
  17.     push si            ;
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:    push ds            ;
  23.     mov  ah,2fh        ;save current DTA
  24.     int  21h        ;
  25.     push es            ;
  26.     push bx            ;
  27. again:    mov  al,[bp+4]        ;drive number
  28.     push ax            ;save for label
  29.     cmp  _memory_model,2    ;data near or far?
  30.     jb   L0            ;
  31.     lds  dx,dword ptr[bp+6] ;DS:DX pts to WorkArea
  32.     mov  si,dx        ;DS:SI also
  33.     les  di,dword ptr[bp+10] ;get seg and offset of new_label
  34.     mov  cs:label_seg,es    ;save for later
  35.     mov  cs:label_ofs,di    ;
  36.     les  di,dword ptr[bp+6] ;now ES:DI pts to WorkArea
  37.     jmp  short L00        ;
  38. L0:    mov  si,[bp+6]        ;same for NEAR case
  39.     mov  dx,si        ;
  40.     mov  ax,ds        ;
  41.     mov  es,ax        ;
  42.     mov  di,si        ;
  43.     mov  ax,[bp+8]        ;get address of new_label
  44.     mov  cs:label_seg,ds    ;save for later
  45.     mov  cs:label_ofs,ax    ;
  46. L00:    mov  ah,1ah        ;function to set DTA
  47.     int  21h        ;set DTA
  48. L1:    mov  ax,2020H        ;clear with spaces
  49.     mov  cx,22        ;22 words in WorkArea
  50.     cld            ;direction forward
  51.     rep  stosw        ;clear the WorkArea
  52.     mov  byte ptr[si],0ffh  ;FF marks extended FCB
  53.     add  si,6        ;forward to attri byte
  54.     mov  byte ptr[si],8    ;volume label attribute
  55.     inc  si            ;forward ptr
  56.     pop  ax            ;get back drive number
  57.     mov  [si],al        ;set it
  58.     mov  bx,si        ;
  59.     inc  bx            ;
  60.     mov  ax,cs:label_seg    ;point ES:DI to new_label
  61.     mov  es,ax        ;
  62.     mov  di,cs:label_ofs    ;
  63.     sub  cx,cx        ;clear CX
  64.     cmp  byte ptr es:[di],0 ;test for null string
  65.     je   L4            ;
  66. L2:    inc  si            ;forward target ptr
  67.     mov  al,es:[di]        ;get a byte
  68.     inc  di            ;forward string ptr for next time
  69.     cmp  al,0        ;end of string?
  70.     je   L3            ;
  71.     mov  [si],al        ;transfer char to WorkArea
  72.     jmp  short L2        ;loop
  73. L3:    mov  ah,16H        ;"create file"
  74.     int  21h        ;go set label
  75.     cmp  al,0ffh        ;test for error
  76.     jne  L5            ;quit if none
  77. L4:    mov  ax,ds        ;point ES:DI back to label field
  78.     mov  es,ax        ;
  79.     mov  di,bx        ;
  80.     mov  al,'?'        ;write global chars
  81.     mov  cx,13        ;13 chars
  82.     rep  stosb        ;write them
  83.     mov  ah,13H        ;func to delete label
  84.     int  21h        ;get rid of old label
  85.     cmp  al,0ffh        ;test for error
  86.     je   L5            ;get out if error
  87.     mov  si,bx        ;pt back to label field
  88.     mov  di,bx        ;DI too
  89.     jmp  again        ;go set up label again
  90. L5:    pop  dx            ;restore prior DTA
  91.     pop  ds            ;
  92.     mov  ah,1ah        ;
  93.     int  21h        ;
  94.     pop  ds            ;
  95.     pop  si            ;
  96.     pop  di            ;
  97.     pop  bp            ;
  98.     cmp  _memory_model,0    ;quit
  99.     jle  quit        ;
  100.     db   0CBh        ;RET far
  101. quit:    ret            ;RET near
  102. _set_volume  endp
  103. _TEXT    ENDS
  104.     END
  105.