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/DOS/IFS.ASM | 523 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 523 insertions(+) create mode 100644 v4.0/src/DOS/IFS.ASM (limited to 'v4.0/src/DOS/IFS.ASM') diff --git a/v4.0/src/DOS/IFS.ASM b/v4.0/src/DOS/IFS.ASM new file mode 100644 index 0000000..2893f28 --- /dev/null +++ b/v4.0/src/DOS/IFS.ASM @@ -0,0 +1,523 @@ + + + +.xlist ;AN000; +include dosseg.asm ;AN000; + +CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000; + ASSUME CS:DOSGROUP, SS:DOSGROUP ;AN000; +.xcref ;AN000; +include dossym.inc ;AN000; +include devsym.inc ;AN000; +include doscntry.inc ;AN000; +.cref ;AN000; +.list +StackSize = 180h ; gross but effective + + i_need VERFLG ; verify status flag ;AN000; + i_need CNTCFLAG ; break status flag ;AN000; + i_need CPSWFLAG ; CP switch logic ON/OFF ;AN000; + I_need CURRENTPDB,WORD ; Current process identifier ;AN000; + I_need HIGH_SECTOR,WORD ;AN000; + I_need BUF_HASH_COUNT,WORD ;AN000; + I_need FAILERR,WORD ;AN000; + I_need USER_ID,WORD ;AN000; + I_need CALLDEVAD,DWORD ; ;AN000; + I_need SYSINITVAR,WORD ;AN000; + I_need MYNAME,16 ; NetBIOS name ;AN000; + I_need RETRYCOUNT,WORD ; retry count ;AN000; + I_need COUNTRY_CDPG,BYTE ;AN000; + i_need DAY,BYTE ; date ;AN000; + i_need MONTH,BYTE ;AN000; + i_need YEAR,WORD ;AN000; + i_need CURBUF,DWORD ;AN000; + i_need IFS_DRIVER_ERR,WORD ;AN000; + i_need DOS34_FLAG,WORD ; IFS function Read/Write flag ;AN000; + i_need Callback_SS,WORD ; ;AN000; + i_need Callback_SP,WORD ;AN000; + i_need SaveBX,WORD ;AN000; + i_need Temp_Var,WORD ;AN000; + i_need INDOS,BYTE ;AN000; + i_need DskStack,BYTE ;AN000; + i_need IOStack,BYTE ;AN000; + i_need Callback_flag,BYTE ;AN000; + +DOSINFO STRUC ;AN000; +bsize dw 0 ;AN000; +files dw 0 ;AN000; +fcbs1 dw 0 ;AN000; +fcbs2 dw 0 ;AN000; +buffers dw 0 ;AN000; + dw 0 ;AN000; +lastdrv dw 0 ;AN000; +secsize dw 0 ;AN000; +DosInfo ENDS ;AN000; + + + + extrn ABSDRD:NEAR ;AN000; + extrn ABSDWRT:NEAR ;AN000; + extrn READTIME:NEAR ;AN000; + extrn CHECKFLUSH:NEAR ;AN000; + extrn GETCURHEAD:NEAR ;AN000; + + +;****************************************************************************** +; * +; * MODULE: IFS_DOSCALL +; * +; * FUNCTION: IFS to DOS function request dispatcher +; * +; * FUNCTION: This procedure dispatches the IFS DOS service requests +; * by calling various DOS service routines +; * +; * CALLING SEQUENCE: +; * +; * CALL DWORD PTR IFS_DOSCALL@ +; * +; * +; * RETURN SEQUENCE: +; * +; * If AX = 0 No error +; * +; * If AX <> 0 Error +; * AX = Error Code: +; * +; * +; * INTERNAL REFERENCES: None +; * +; * +; * EXTERNAL REFERENCES: STRATEGY, INTERRUPT, ABSDRD, ABSDWRT, +; * FIND_SECTOR, MARK_SECTOR, WRITE_BUFFR, +; * READ_BUFFR, WRITE_BUFFR, FREE_BUFFR, +; * GET_DOS_INFO, FLUSH_BUFF +; * +; * NOTES: None +; * +; * REVISION HISTORY: New +; * +; * COPYRIGHT: "MS DOS IFS Function" +; * "Version 1.00 (C) Copyright 1988 Microsoft Corporation" +; * "Licensed Material - Program Property of Microsoft" +; * +; ************************************************************************* + + + + + +PROCEDURE IFS_DOSCALL,FAR ;AN000; + assume DS:NOTHING,ES:NOTHING ;AN000; + + CLI ; ;AN000; + CMP AH,39 ; ;AN000; + JNZ others ; ;AN000; + INC CS:[INDOS] ; in DOS ;AN000; + JMP Dosend ; ;AN000; +others: + CMP AH,40 ; ;AN000; + JNZ others2 ; ;AN000; + DEC CS:[INDOS] ; out DOS ;AN000; + JMP Dosend ; ;AN000; +others2: + CMP AH,38 ; ;AN000; + JNZ not_stack ; ;AN000; + PUSH CS ; ;AN000; + POP DS ; ;AN000; + MOV SI,OFFSET DOSGROUP:IOSTACK ;AN000; + MOV CX,stacksize ;AN000; + JMP Dosend ; ;AN000; + ; ;AN000; +not_stack: ; ;AN000; + MOV CS:[Temp_Var],DS; save ds for strcmp strcpy ;AN000; + PUSH CS ; ;AN000; + POP DS ; ;AN000; + assume DS:DOSGROUP ;AN000; + INC [INDOS] ; in DOS ;AN000; + PUSH CX ; save cx ;AN000; + PUSH DX ; save cx ;AN000; + MOV CX,SS ; cx=stack ;AN000; + MOV DX,CS ; cx=stack ;AN000; + CMP CX,DX ; dosgroup stack ? ;AN000; + POP DX ; save cx ;AN000; + POP CX ; restore cx ;AN000; + JZ withSS_SP ; yes ;AN000; + MOV [Callback_SS],SS ;save SS:SP ;AN000; + MOV [Callback_SP],SP ;AN000; + MOV [SaveBX],BX ; ;AN000; + MOV BX,CS ; prepare system stack ;AN000; + MOV SS,BX ; ;AN000; + MOV SP,OFFSET DOSGROUP:DSKSTACK ;AN000; + MOV BX,[SaveBX] ; ;AN000; + MOV [Callback_flag],1 ;set flag ;AN000; +withSS_SP: ; ;AN000; + STI ;AN000; + ASSUME DS:NOTHING ;AN000; +; OR [DOS34_FLAG],Force_I24_Fail ;AN000; +; ;AN000; +; cmp ah,0 ; call Strategy routine ?? ;AN000; +; jne dos_chk_ah1 ; jump if not ;AN000; +; CALL STRATEGY ; else call strategy routine ;AN000; +; jmp dos_exit ; then exit ;AN000; + ;AN000; +;Dos_Chk_Ah1: ;AN000; +; cmp ah,1 ; call interrupt routine ;AN000; +; jne dos_chk_ah2 ; jump if not ;AN000; +; CALL INTERRUPT ; else call interrupt routine ;AN000; +; jmp dos_exit ; then exit ;AN000; + ;AN000; +;Dos_Chk_Ah2: ;AN000; +; cmp ah,4 ;AN000; +; jae Dos_Chk_Ah8 ;AN000; +; mov High_Sector,si ; save HI sector word ;AN000; +; mov dx,di ; save low sector ;AN000; +; push es ;AN000; +; invoke FIND_DPB ; ds:si -> DPB ;AN000; +; mov bp,si ;AN000; +; push ds ;AN000; +; pop es ; es:bp -> DPB ;AN000; +; pop ds ; DS:BX-->Input buffer ;AN000; +; +; cmp ah,2 ; absolute read ?? ;AN000; +; jne dos_chk_ah3 ; jump if not ;AN000; +; +; invoke DSKREAD ; else do absolute read ;AN000; +; jmp dos_exit ; then return ;AN000; + +;Dos_Chk_Ah3: ;AN000; +; invoke DSKWRITE ; do absolute write ;AN000; +; jmp dos_exit ; then exit ;AN000; + + + +Dos_chk_ah32: ;AN000; + cmp ah,32 + jne str_cmp ;AN000; + CALL GET_DOS_INFO ; else get DOS information ;AN000; + jmp SHORT dos_exit ;AN000; ;AN000; +str_cmp: ;AN000; + mov DS,[Temp_Var] ; restore DS ;AN000; + cmp ah,36 ;AN000; + jne str_cpy ;AN000; + invoke strcmp ; string compare ;AN000; + jmp SHORT dos_exit ;AN000; +str_cpy: ;AN000; + cmp ah,37 ;AN000; + jne dos_error ;AN000; + invoke strcpy ; string copy ;AN000; + jmp SHORT dos_exit ;AN000; + +Dos_Error: ;AN000; + stc + ;AN000; +Dos_Exit: ;AN000; + CLI ;AN000; + PUSHF ;AN000; + AND [DOS34_FLAG],No_Force_I24_Fail ;AN000; + DEC [INDOS] ; exit DOS ;AN000; + CMP [Callback_flag],0 ;from dosgroup + JZ noSS_SP ;yes ;AN000; + MOV [Callback_flag],0 ; ;AN000; + POPF ;AN000; + MOV SP,CS:[Callback_SP]; ;AN000; + MOV SS,CS:[Callback_SS]; restore user's SS:SP ;AN000; + JMP SHORT DOSend ;AN000; +noSS_SP: ;AN000; + POPF +Dosend: + STI ; ;AN000; + + ret ;return ;AN000; + + +ENDPROC IFS_DOSCALL ;AN000; + + + + + +; **************************************************************************** +; * +; * MODULE: STRATEGY +; * +; * FUNCTION: Call Strategy Routine +; * +; * FUNCTION: This procedure dispatches the IFS DOS service requests +; * by calling various DOS service functions +; * +; * INPUT: ES:BX ---> Device Request Header +; * AL = Drive # +; * +; * CALL STRATEGY +; * +; * OUTPUT: output of driver +; * +; * INTERNAL REFERENCES: None +; * +; * +; * EXTERNAL REFERENCES: GETTHISDRV +; * +; * NOTES: None +; * +; * REVISION HISTORY: New +; * +; ************************************************************************* + +;PROCEDURE STRATEGY,NEAR ;AN000; + +; INVOKE FIND_DPB ; get DPB from drive number ;AN000; +; ; DS:SI-->DPB for drive ;AN000; +; LDS DI,DS:[SI.DPB_Driver_Addr] ; get driver addres from DPB ;AN000; +; MOV DX,WORD PTR [DI.SDEVSTRAT] ;get strategy routine address;AN000; +;Driver_Call: ;AN000; +; MOV WORD PTR [CALLDEVAD],DX ; save it ;AN000; +; MOV WORD PTR [CALLDEVAD+2],DS ; ;AN000; +; CALL DWORD PTR [CALLDEVAD] ; call strategy routine ;AN000; +;STRAT_Exit: ;AN000; +; RET ; return ;AN000; + +;ENDPROC STRATEGY ;AN000; + + + + + + + + +; **************************************************************************** +; * +; * MODULE: INTERRUPT +; * +; * FUNCTION: This procedure calls the interrupt routine of the drive +; * specified in the drive#. +; * +; * INPUT: AL = Drive # +; * +; * +; * OUTPUT: output of driver +; * +; * +; * INTERNAL REFERENCES: None +; * +; * +; * EXTERNAL REFERENCES: FIND_DPB +; * +; * NOTES: None +; * +; * REVISION HISTORY: New +; * +; ************************************************************************* + +;PROCEDURE INTERRUPT,NEAR ;AN000; + +; INVOKE FIND_DPB ; get DPB from drive number ;AN000; +; LDS DI,DS:[SI.DPB_Driver_Addr] ; get driver addres from DPB ;AN000; +; MOV DX,WORD PTR [DI.SDEVINT] ; get interrupt routine addrs;AN000; +; JMP Driver_Call ;AN000; + +;ENDPROC INTERRUPT ;AN000; + + + + + + + + +; ************************************************************************* * +; * +; * MODULE: Get_Dos_Info +; * +; * FUNCTION: Get DOS information +; * +; * INPUT: AL = Dos info code +; * +; * OUTPUT: Dos Information in registers +; * +; * INTERNAL REFERENCES: None +; * +; * +; * EXTERNAL REFERENCES: READTIME, $GETEXTCNTRY +; * +; * NOTES: None +; * +; * REVISION HISTORY: New +; * +; ************************************************************************* + +PROCEDURE GET_DOS_INFO,NEAR ;AN000; + + cmp al,0 ; TIME and DATE ?? ;AN000; + jne chk_al1 ;AN000; + + Invoke ReadTime ; get time in CX:DX ;AN000; + + push cx ; save time ;AN000; + push dx ;AN000; + + MOV CX,[YEAR] ;AN000; + ADD CX,1980 ;AN000; + MOV DX,WORD PTR [DAY] ; fetch both day and month ;AN000; + + pop bx ; bh = seconds bl = hundredths ;AN000; + pop ax ; ah = hour al = minutes ;AN000; + ; cx = year dh = month ;AN000; + jmp get_info_exit ;AN000; + + +chk_al1: ; Active process info ?? ;AN000; + cmp al,1 ;AN000; + jne chk_al2 ; no, try next ;AN000; + MOV BX,[CurrentPDB] ; BX = active process ID ;AN000; + mov DX,[User_ID] ; User ID ;AN000; + jmp get_info_exit ; exit ;AN000; + + +chk_al2: ;AN000; +; cmp al,2 ; get CPSW info ?? ;AN000; +; jne chk_al3 ; jump if not ;AN000; +; MOV SI,OFFSET DOSGROUP:COUNTRY_CDPG ;AN000; +; MOV BX,[SI.ccDosCodePage] ; get dos code page id in BX ;AN000; +; MOV DL,CPSWFLAG ; get CP Switch status ;AN000; +; jmp get_info_exit ; exit ;AN000; + + +chk_al3: +; cmp al,3 ; get CTRL BRK status ?? ;AN000; +; jne chk_al4 ;AN000; +; mov dl,CNTCFLAG ; DL = break status flag ;AN000; +; jmp get_info_exit ; exit ;AN000; + + +chk_al4: +; cmp al,4 ; get Verify status ?? ;AN000; +; jne chk_al5 +; mov dl,VERFLG ; DL = verify status flag ;AN000; +; jmp get_info_exit ; exit ;AN000; + + +chk_al5: + cmp al,5 ; Config.sys info ?? ;AN000; + jne chk_al6 ;AN000; + + mov si,OFFSET DOSGROUP:SYSINITVAR ; DS:SI-->SysInitVar ;AN000; + push ds ;AN000; + push si ;AN000; + lds si,[si].Sysi_SFT ; get SFT address ;AN000; + mov ax,[si].SFCount ; get number of files ;AN000; + lds si,[si].SFlink ; get next SFT table ;AN000; + cmp si,-1 ; end of table ;AN000; + jz nomore ; ;AN000; + add ax,[si].SFCount ; ;AN000; +nomore: ; ;AN000; + mov es:[di].files,ax ; save files= value ;AN000; + pop si ;AN000; + pop ds ;AN000; + mov ax,[si].Sysi_MaxSec ; get maximum sector size ;AN000; + mov es:[di].secsize,ax ; save files= value ;AN000; + mov ax,[si].Sysi_Keep ; ;AN000; + mov es:[di].fcbs2,ax ; ;AN000; + lds si,[si].Sysi_FCB ; get FCB address ;AN000; + mov ax,[si].SFCount ; get number of fcbs ;AN000; + mov es:[di].fcbs1,ax ; save fcbs= value ;AN000; + jmp get_info_exit ;AN000; + + + +chk_al6: ;AN000; + cmp al,6 ; get machine name ?? ;AN000; + jne chk_al7 ; no, check next function ;AN000; + context DS ;AN000; + mov si,offset DOSGroup:MyName ; DS:SI-->name string ;AN000; + ; ES:DI-->return buffer ;AN000; + add di,2 ; skip max return size ;AN000; + mov cx,15 ; name size ;AN000; +Chk6_Loop: ;AN000; + rep movsb ; copy machine name to return buffer;AN000; + xor al,al ; set 16th byte is 0 ;AN000; + stosb ;AN000; + jmp get_info_exit ; return ;AN000; + ;AN000; + ;AN000; +Chk_Al7: ;AN000; +; cmp al,7 ; get country information ?? ;AN000; +; jne chk_al8 ; no, try next function ;AN000; +; mov al,dl ; AL = info ID ;AN000; +; mov bx,-1 ; select active code page ;AN000; +; mov dx,-1 ; select active country ;AN000; +; mov cx,-1 ; get all ;AN000; +; INVOKE $getExtCntry ; get country info ;AN000; +; jmp SHORT Get_Info_Exit ; exit ;AN000; + + +Chk_Al8: ;AN000; + cmp al,8 ; get share retry count ?? ;AN000; + jne bad_param ; no, Bad parameter ;AN000; + mov bx,RetryCount ; BX = Share retry count ;AN000; + jmp SHORT Get_Info_Exit ; exit ;AN000; + +Bad_Param: ; Bad parameter ;AN000; + stc ; ;AN000; + +Get_Info_Exit: ; exit ;AN000; + + ret ;AN000; + + +ENDPROC GET_DOS_INFO ;AN000; + + + + + + + + +; ************************************************************************* * +; * +; * MODULE: $IFS_IOCTL +; * +; * FUNCTION: Handle IFS Driver IOCTL calls +; * +; * INPUT: AH = 6B function code +; * AL = XX 00 = Drive IOCTL, 01 = Psudo device IOCTL +; * CX = 00 Reserved +; * BL = XX Device Number +; * DS:DX Pointer to Buffer +; * +; * OUTPUT: +; * IF CARRY = 0 No Error +; * IF CARRY = 1 Error +; * AX = ERROR CODE +; * +; * INTERNAL REFERENCES: None +; * +; * +; * EXTERNAL REFERENCES: INT 2F +; * +; * NOTES: None +; * +; * REVISION HISTORY: New +; ************************************************************************* + +PROCEDURE $IFS_IOCTL,NEAR ;AN000; + + PUSH AX ;AN000; + MOV AX,(multnet SHL 8) OR 47 ; pass control to IFS Func ;AN000; + INT 2FH ;AN000; + POP BX ;AN000; + JC ABB_ERR ;AN000; + TRANSFER SYS_RET_OK ; return ;AN000; + +ABB_ERR: ;AN000; + transfer SYS_RET_ERR ; error return ;AN000; + +ENDPROC $IFS_IOCTL ;AN000; + + + +CODE ENDS ;AN000; + END ;AN000; + + -- cgit v1.2.3