home *** CD-ROM | disk | FTP | other *** search
- ;void set_volume(spec,work_area,new_label);
- ; unsigned short spec;
- ; char *work_area,*new_label;
-
- EXTRN _memory_model:byte
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _set_volume
- _set_volume proc near
- jmp short start ;jump over local data
- label_seg dw ? ;
- label_ofs dw ? ;
- start: push bp ;
- mov bp,sp ;
- push di ;
- push si ;
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bp ;else add 2 to BP
- inc bp ;
- begin: push ds ;
- mov ah,2fh ;save current DTA
- int 21h ;
- push es ;
- push bx ;
- again: mov al,[bp+4] ;drive number
- push ax ;save for label
- cmp _memory_model,2 ;data near or far?
- jb L0 ;
- lds dx,dword ptr[bp+6] ;DS:DX pts to WorkArea
- mov si,dx ;DS:SI also
- les di,dword ptr[bp+10] ;get seg and offset of new_label
- mov cs:label_seg,es ;save for later
- mov cs:label_ofs,di ;
- les di,dword ptr[bp+6] ;now ES:DI pts to WorkArea
- jmp short L00 ;
- L0: mov si,[bp+6] ;same for NEAR case
- mov dx,si ;
- mov ax,ds ;
- mov es,ax ;
- mov di,si ;
- mov ax,[bp+8] ;get address of new_label
- mov cs:label_seg,ds ;save for later
- mov cs:label_ofs,ax ;
- L00: mov ah,1ah ;function to set DTA
- int 21h ;set DTA
- L1: mov ax,2020H ;clear with spaces
- mov cx,22 ;22 words in WorkArea
- cld ;direction forward
- rep stosw ;clear the WorkArea
- mov byte ptr[si],0ffh ;FF marks extended FCB
- add si,6 ;forward to attri byte
- mov byte ptr[si],8 ;volume label attribute
- inc si ;forward ptr
- pop ax ;get back drive number
- mov [si],al ;set it
- mov bx,si ;
- inc bx ;
- mov ax,cs:label_seg ;point ES:DI to new_label
- mov es,ax ;
- mov di,cs:label_ofs ;
- sub cx,cx ;clear CX
- cmp byte ptr es:[di],0 ;test for null string
- je L4 ;
- L2: inc si ;forward target ptr
- mov al,es:[di] ;get a byte
- inc di ;forward string ptr for next time
- cmp al,0 ;end of string?
- je L3 ;
- mov [si],al ;transfer char to WorkArea
- jmp short L2 ;loop
- L3: mov ah,16H ;"create file"
- int 21h ;go set label
- cmp al,0ffh ;test for error
- jne L5 ;quit if none
- L4: mov ax,ds ;point ES:DI back to label field
- mov es,ax ;
- mov di,bx ;
- mov al,'?' ;write global chars
- mov cx,13 ;13 chars
- rep stosb ;write them
- mov ah,13H ;func to delete label
- int 21h ;get rid of old label
- cmp al,0ffh ;test for error
- je L5 ;get out if error
- mov si,bx ;pt back to label field
- mov di,bx ;DI too
- jmp again ;go set up label again
- L5: pop dx ;restore prior DTA
- pop ds ;
- mov ah,1ah ;
- int 21h ;
- pop ds ;
- pop si ;
- pop di ;
- pop bp ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _set_volume endp
- _TEXT ENDS
- END