You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.1 KiB
NASM

4 years ago
; 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