; CALL FRESPACE(AH,AL,BH,BL,CH,CL). CL SHOULD BE 0 for default ; drive 1 for A, 2 for B, 3 for C, etc. The value of the ; other variables does not matter. They will come back ; with a meaningful value. ; ; AN EXAMPLE PROGRAM: ; ; 10 defint a-z ; 20 color 7,1:cls ; 30 test1=1:ah=0:al=0:bh=0:ch=0:cl=1:test2=2 ; 35 INPUT"DRIVE 0=DEFAULT, 1=A, 2=B, 3=C";CL ; 37 PRINT"JUST BEFORE CALL" ; 40 CALL FRESPACE(AH,AL,BH,BL,CH,CL) ; 45 PRINT"JUST AFTER CALL" ; 50 PRINT" AH=";AH;" AL=";AL;" BH=";BH;" BL=";BL;" CH=";CH;" CL=";CL; ; 60 UFREE!=256*AH+AL ; 70 UBYTES!=256*BH+BL ; 80 USECTOR!=256*CH+CL ; 90 PRINT"UFREE!=";UFREE!;" UBYTES!=";UBYTES!;" USECTOR!=";USECTOR! ; 100 FRESPACE!=UFREE!*UBYTES!*USECTOR! ; 110 PRINT"FRESPACE!=";FRESPACE! ; 120 PRINT"THIS SHOULD BE 1",TEST1 ; 130 PRINT"THIS SHOULD BE 2",TEST2 ; get_spa equ 36h ;Get disk free space function call doscall equ 21h ;DOS interrupt number dgroup group datarea datarea segment para public 'DATA' ah_ret dw ? ;ah to be sent back al_ret dw ? ;al to be sent back bh_ret dw ? ;bh to be sent back bl_ret dw ? ;bl to be sent back ch_ret dw ? ;ch to be sent back cl_ret dw ? ;cl to be sent back datarea ENDS ; cseg segment 'CODE' assume cs:cseg public frespace frespace proc far push bp ;BP from BASIC mov bp,sp ;set base for parm list push ds ;DS from basic work area push es ;ES from basic work area mov ax,datarea ;establish data addressability mov ds,ax ;now DS is local data assume ds:datarea ; ; ; ; push bp sub ax,ax mov si,ss:[bp+6] ;get addr of parameter mov al,es:[si] ;get value of parm mov dx,ax ;dl contains the drive number on call ;dh will be zero mov ah,get_spa ;get space function number int doscall ;Call DOS ; Move the values into local work area to prepare to send back to basic xchg dx,ax ;must have a word. Want to zero out DH. sub ax,ax ; produce the zero xchg dx,ax ; DX is now zero. ; DH is what we really want as zero. mov dl,ah ;want to send back a byte mov ah_ret,dx ; prepare to return ah mov dl,al ;want to send back a byte mov al_ret,dx ; prepare to return al mov dl,bh ;want to send back a byte mov bh_ret,dx ; prepare to return bh mov dl,bl ;want to send back a byte mov bl_ret,dx ; prepare to return bl mov dl,ch ;want to send back a byte mov ch_ret,dx ; prepare to return ch mov dl,cl ;want to send back a byte mov cl_ret,dx ; prepare to return cl ; Go back pop bp ;get back Basic's workspace mov ax,cl_ret mov si,ss:[bp+6] mov es:[si],ax ;return cl mov ax,ch_ret mov si,ss:[bp+8] mov es:[si],ax ;return ch mov ax,bl_ret mov si,ss:[bp+10] mov es:[si],ax ;return bl mov ax,bh_ret mov si,ss:[bp+12] mov es:[si],ax ;return bh mov ax,al_ret mov si,ss:[bp+14] mov es:[si],ax ;return al mov ax,ah_ret mov si,ss:[bp+16] mov es:[si],ax ;return ah ; pop es pop ds pop bp ret 12 ;return to basic 6 parameters were sent frespace endp ;----------------------------------------------------------------------- cseg ends end ;end for assembler