From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/MAPPER/QFSINFO.ASM | 136 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 v4.0/src/MAPPER/QFSINFO.ASM (limited to 'v4.0/src/MAPPER/QFSINFO.ASM') diff --git a/v4.0/src/MAPPER/QFSINFO.ASM b/v4.0/src/MAPPER/QFSINFO.ASM new file mode 100644 index 0000000..fe0fdba --- /dev/null +++ b/v4.0/src/MAPPER/QFSINFO.ASM @@ -0,0 +1,136 @@ +page 80,132 + +title CP/DOS DosQFsInfo mapper + +buffer segment word public 'buffer' + +clsdr40 dw ? +avlcls40 dw ? +secalc40 dw ? +bytsec40 dw ? + +buffer ends + +dosxxx segment byte public 'dos' + assume cs:dosxxx,ds:nothing,es:nothing,ss:nothing +; +; ************************************************************************* * +; * +; * MODULE: DosQFsInfo +; * +; * FILE NAME: DOS040.ASM +; * +; * FUNCTION: This module will return the information for a file +; * system device. +; * +; * CALLING SEQUENCE: +; * +; * PUSH WORD DriveNumber ; Drive Number +; * PUSH OTHER FSInfoLevel ; File system info required +; * PUSH@ OTHER FSInfoBuf ; File system info buffer +; * PUSH WORD FSInfoBufSize ; file system info buffer size +; * Call DosQFsInfo +; * +; * +; * RETURN SEQUENCE: +; * +; * IF ERROR (AX not = 0) +; * +; * AX = Error Code: +; * +; * o Invalid parameter +; * +; * +; * MODULES CALLED: DOS int 21H function 19H +; * DOS int 25H +; * +; * +; ************************************************************************* + + public DosQFsInfo + .sall + .xlist + include macros.inc + include error.inc + .list + +str struc +old_bp dw ? +return dd ? +FSIBS40 dw ? ; info buffer size +FSIB40 dd ? ; info buffer +ILL40 dw ? ; info level +DRNUM40 dw ? ; driver number +str ends + +DosQFsInfo proc far + Enter Dosqfsinfo ; push registers + + mov dx,[bp].drnum40 ; load drive number + mov ah,036h + int 21h ; get disk space + + cmp ax,0ffffh ; check if valid drive number + jne valdr40 ; jump if drive is ok + + mov ax,error_invalid_parameter ; esle set error code + jmp erret40 ; error return + +valdr40:; + push ax + mov ax,buffer ; set the data segment and save + push ax ; space information in the data area + pop ds + assume ds:buffer + mov avlcls40,bx ; save available cluster + mov clsdr40,dx ; save clusters per drive + mov bytsec40,cx ; save bytes per sector + pop ax ; + mov secalc40,ax ; save sectors per allocation unit + mov ax,[bp].ill40 ; get info level + cmp al,01 ; valid level ?? + je getinfo40 ; jump if valid + + mov ax,error_invalid_parameter ; else invalid parameter + jmp erret40 ; error return + +getinfo40:; + mov ax,[bp].fsibs40 ; get info buffer size address + cmp ax,18 ; check if valid + jge bufok40 ; jump if valid + + mov ax,error_buffer_overflow ; move buffer not big enough + jmp erret40 ; error return + +bufok40:; + les di,[bp].fsib40 ; get FSI buffer pointer + sub ax,ax ; return + mov es:[di],ax ; null + mov es:[di]+2,ax ; File system ID + add di,4 ; set pointer to number of sectors in alloc + sub ax,ax ; + mov es:[di]+2,ax ; set high order # of sectors in alloc to 0 + mov ax,secalc40 ; + mov es:[di],ax ; store low order # of sectors in alloc + add di,4 ; set pointer to number of allocation units + mov ax,clsdr40 ; load low order number + mov es:[di],ax ; of alloc units + sub ax,ax ; + mov es:[di]+2,ax ; set high order # of alloc units to 0 + mov ax,avlcls40 ; load low order number + mov es:[di]+4,ax ; of avail alloc units + sub ax,ax ; + mov es:[di]+6,ax ; set high order # of avail alloc to 0 + mov ax,bytsec40 ; get number + mov es:[di]+8,ax ; of bytes per sector + sub ax,ax ; set good return code + +erret40:; + mexit ; pop registers + ret size str - 6 ; return + +DosQFsInfo endp + +dosxxx ends + + end -- cgit v1.2.3