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/CREATE.ASM | 380 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 v4.0/src/DOS/CREATE.ASM (limited to 'v4.0/src/DOS/CREATE.ASM') diff --git a/v4.0/src/DOS/CREATE.ASM b/v4.0/src/DOS/CREATE.ASM new file mode 100644 index 0000000..6983e29 --- /dev/null +++ b/v4.0/src/DOS/CREATE.ASM @@ -0,0 +1,380 @@ +; SCCSID = @(#)create.asm 1.6 85/08/19 +TITLE DOS_CREATE/DOS_CREATE_NEW - Internal CREATE calls for MS-DOS +NAME DOS_CREATE +; Internal Create and Create new to create a local or NET file and SFT. +; +; DOS_CREATE +; DOS_CREATE_NEW +; SET_MKND_ERR +; SET_Media_ID +; SET_EXT_Mode +; +; Revision history: +; +; A000 version 4.00 Jan. 1988 +; A001 D490 -- Change IOCTL subfunctios from 63h,43h to 66h, 46h + +; +; get the appropriate segment definitions +; +.xlist +include dosseg.asm + +CODE SEGMENT BYTE PUBLIC 'CODE' + ASSUME SS:DOSGROUP,CS:DOSGROUP + +.xcref +INCLUDE DOSSYM.INC +INCLUDE DEVSYM.INC +include version.inc +.cref +.list + +Installed = TRUE + + i_need NoSetDir,BYTE + i_need THISSFT,DWORD + i_need THISCDS,DWORD + I_need EXTERR,WORD + I_Need ExtErr_locus,BYTE + I_need JShare,DWORD + I_need VOLCHNG_FLAG,BYTE + I_need SATTRIB,BYTE + I_need CALLVIDM,DWORD + I_need OpenBuf,128 + I_need EXTOPEN_ON,BYTE ;AN000; extended open + I_need NAME1,BYTE ;AN000; + I_need NO_NAME_ID,BYTE ;AN000; + I_need Packet_Temp,WORD ;AN000; + I_need DOS34_FLAG,WORD ;AN000; + I_need SAVE_BX,WORD ;AN000; + +; Inputs: +; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL +; terminated) +; [CURR_DIR_END] Points to end of Current dir part of string +; ( = -1 if current dir not involved, else +; Points to first char after last "/" of current dir part) +; [THISCDS] Points to CDS being used +; (Low word = -1 if NUL CDS (Net direct request)) +; [THISSFT] Points to SFT to fill in if file created +; (sf_mode field set so that FCB may be detected) +; [SATTRIB] Is attribute of search, determines what files can be found +; AX is Attribute to create +; Function: +; Try to create the specified file truncating an old one that exists +; Outputs: +; sf_ref_count is NOT altered +; CARRY CLEAR +; THISSFT filled in. +; sf_mode = unchanged for FCB, sharing_compat + open_for_both +; CARRY SET +; AX is error code +; error_path_not_found +; Bad path (not in curr dir part if present) +; error_bad_curr_dir +; Bad path in current directory part of path +; error_access_denied +; Attempt to re-create read only file , or +; create a second volume id or create a dir +; error_sharing_violation +; The sharing mode was correct but not allowed +; generates an INT 24 +; DS preserved, others destroyed + + procedure DOS_Create,NEAR + DOSAssume CS,,"DOS_Create" + ASSUME ES:NOTHING + + XOR AH,AH ; Truncate is OK +Create_inter: + TEST AL,NOT (attr_all + attr_ignore + attr_volume_id) + ; Mask out any meaningless bits + JNZ AttErr + TEST AL,attr_volume_id + JZ NoReset + OR [DOS34_FLAG],DBCS_VOLID ;AN000;FOR dbcs volid + MOV AL,attr_volume_id +NoReset: + OR AL,attr_archive ; File changed + TEST AL,attr_directory + attr_device + JZ ATT_OK +AttErr: + MOV AX,5 ; Attribute problem + MOV Exterr_Locus,errLOC_Unk + JMP SHORT SET_MKND_ERR ; Gotta use MKDIR to make dirs, NEVER allow + ; attr_device to be set. +ATT_OK: + LES DI,[THISSFT] + PUSH ES + LES SI,[THISCDS] + CMP SI,-1 + JNZ TEST_RE_NET + POP ES + +;Extended open hooks + TEST [EXTOPEN_ON],ext_open_on ;AN000;EO. from extnded open + JZ NOEXTOP ;AN000;EO. no, do normal +IFS_extopen: ;AN000;EO. + PUSH AX ;AN000;EO. pass create attr + MOV AX,(multNET SHL 8) OR 46 ;AN000;EO. issue extended open verb + INT 2FH ;AN000;EO. + POP BX ;AN000;EO. trash bx + MOV [EXTOPEN_ON],0 ;AN000;EO. + return ;AN000;EO. +NOEXTOP: ;AN000; +;Extended open hooks + +IF NOT Installed + transfer NET_SEQ_CREATE +ELSE + PUSH AX + MOV AX,(multNET SHL 8) OR 24 + INT 2FH + POP BX ; BX is trashed anyway + return +ENDIF + +TEST_RE_NET: + TEST ES:[SI.curdir_flags],curdir_isnet + POP ES + JZ LOCAL_CREATE + + CALL Set_EXT_mode ;AN000;EO. + JC SHORT dochk ;AN000;EO. + OR ES:[DI.sf_mode],sharing_compat + open_for_both ;IFS. +dochk: + ; invoke IFS_SHARE_CHECK ;AN000;IFS. check share + ; JC nomore ;AN000;IFS. share violation + +;Extended open hooks + TEST [EXTOPEN_ON],ext_open_on ;AN000;EO. from extnded open + JNZ IFS_extopen ;AN000;EO. yes, issue extended open +;Extended open hooks + +IF NOT Installed + transfer NET_CREATE +ELSE + PUSH AX + MOV AX,(multNET SHL 8) OR 23 + INT 2FH + POP BX ; BX is trashed anyway +nomore: + return +ENDIF + +LOCAL_CREATE: + CALL Set_EXT_mode ;AN000;EO. set mode if from extended open + JC setdone ;AN000;EO. + OR ES:[DI].sf_mode,sharing_compat+open_for_both +setdone: + EnterCrit critDisk + invoke MakeNode + JNC Create_ok + mov [VOLCHNG_FLAG],-1 ; indicate no change in volume label + LeaveCrit critDisk + + entry SET_MKND_ERR + DOSAssume CS,,"Set_MkNd_Err" + ASSUME ES:NOTHING +; Looks up MakeNode errors and converts them. AL is MakeNode +; error, SI is GetPath bad spot return if path_not_found error. + + MOV BX,OFFSET DOSGROUP:CRTERRTAB + XLAT +CreatBadRet: + STC + return + +TABLE SEGMENT +Public CREAT001S,CREAT001E +CREAT001S label byte +CRTERRTAB LABEL BYTE ; Lookup table for MakeNode returns + DB ? ; none + DB error_access_denied ; MakeNode error 1 + DB error_cannot_make ; MakeNode error 2 + DB error_file_exists ; MakeNode error 3 + DB error_path_not_found ; MakeNode error 4 + DB error_access_denied ; MakeNode error 5 + DB error_sharing_violation ; MakeNode error 6 + DB error_file_not_found ; MakeNode error 7 +CREAT001E label byte +TABLE ENDS + +; +; We have just created a new file. This results in the truncation of old +; files. We must inform the sharer to slash all the open SFT's for this +; file to the current size. +; +Create_ok: +; If we created a volume id on the diskette, set the VOLCHNG_FLAG to logical +; drive number to force a Build BPB after Media Check. + +;;; FASTOPEN 8/29/86 + invoke FastOpen_Delete +;;; FASTOPEN 8/29/86 + mov al,[SATTRIB] + test al,attr_volume_id + jz NoVolLabel + LES DI,[THISCDS] + mov ah,byte ptr ES:[DI] ; get drive letter + sub ah,'A' ; convert to drive letter + mov [VOLCHNG_FLAG],ah ;Set flag to indicate volid change + MOV BH,1 ;AN000;>32mb set volume id to boot record + CALL Set_Media_ID ;AN000;>32mb + + EnterCrit CritDisk + invoke FatRead_CDS ; force a media check + LeaveCrit CritDisk +NoVolLabel: + MOV ax,2 + LES DI,ThisSFT +if installed + call JShare + 14 * 4 +else + Call ShSU +endif + LeaveCrit critDisk + transfer SET_SFT_MODE + +EndProc DOS_Create + +; Inputs: +; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL +; terminated) +; [CURR_DIR_END] Points to end of Current dir part of string +; ( = -1 if current dir not involved, else +; Points to first char after last "/" of current dir part) +; [THISCDS] Points to CDS being used +; (Low word = -1 if NUL CDS (Net direct request)) +; [THISSFT] Points to SFT to fill in if file created +; (sf_mode field set so that FCB may be detected) +; [SATTRIB] Is attribute of search, determines what files can be found +; AX is Attribute to create +; Function: +; Try to create the specified file truncating an old one that exists +; Outputs: +; sf_ref_count is NOT altered +; CARRY CLEAR +; THISSFT filled in. +; sf_mode = sharing_compat + open_for_both for Non-FCB SFT +; CARRY SET +; AX is error code +; error_path_not_found +; Bad path (not in curr dir part if present) +; error_bad_curr_dir +; Bad path in current directory part of path +; error_access_denied +; Create a second volume id or create a dir +; error_file_exists +; Already a file by this name +; DS preserved, others destroyed + + procedure DOS_Create_New,NEAR + DOSAssume CS,,"DOS_Create_New" + ASSUME ES:NOTHING + + MOV AH,1 ; Truncate is NOT OK + JMP Create_inter + +EndProc DOS_Create_New + + +; Inputs: +; NAME1= Volume ID +; BH= 0, delete volume id +; 1, set new volume id +; DS= DOSGROUP +; Function: +; Set Volume ID to DOS 4.00 Boot record. +; Outputs: +; CARRY CLEAR +; volume id set +; CARRY SET +; AX is error code + + procedure Set_Media_ID,NEAR ;AN000; + DOSAssume CS,,"DOS_Create_New" ;AN000; + ASSUME ES:NOTHING ;AN000; + + PUSH AX ;AN000;;>32mb + PUSH ES ;AN000;;>32mb + PUSH DI ;AN000;;>32mb + + INC AH ;AN000;;>32mb bl=drive # + MOV BL,AH ;AN000;;>32mb bl=drive # (A=1,B=2,,,) + MOV AL,0DH ;AN000;;>32mb generic IOCTL + MOV CX,0866H ;AN001;;>32mb get media id + MOV DX,OFFSET DOSGROUP:PACKET_TEMP ;AN000;>32mb + + PUSH BX ;AN000;;>32mb + PUSH DX ;AN000;;>32mb + XOR BH,BH ;AN000;;>32mb + + invoke $IOCTL ;AN000;;>32mb + POP DX ;AN000;;>32mb + POP BX ;AN000;;>32mb + JC geterr ;AN000;;>32mb + + OR BH,BH ;AN000;;>32mb delete volume id + JZ NoName ;AN000;>32mb yes + MOV SI,OFFSET DOSGROUP:NAME1 ;AN000;>32mb + JMP SHORT doset ;AN000;>32mb yes +Noname: ;AN000; + MOV SI,OFFSET DOSGROUP:NO_NAME_ID ;AN000;>32mb +doset: ;AN000; + MOV DI,DX ;AN000;;>32mb + ADD DI,MEDIA_LABEL ;AN000;;>32mb + PUSH CS ;AN000;;>32mb move new volume id to packet + POP DS ;AN000;;>32mb + PUSH CS ;AN000;;>32mb + POP ES ;AN000;;>32mb + MOV CX,11 ;AN000;;>32mb + REP MOVSB ;AN000;;>32mb + MOV CX,0846H ;AN001;;>32mb + MOV AL,0DH ;AN000;;>32mb + XOR BH,BH ;AN000;;>32mb + invoke $IOCTL ;AN000;;>32mb set volume id +geterr: ;AN000; + PUSH CS ;AN000;>32mb + POP DS ;AN000;>32mb ds= dosgroup + + POP DI ;AN000;;>32mb + POP ES ;AN000;;>32mb + POP AX ;AN000;;>32mb + return ;AN000;>32mb + +EndProc Set_Media_ID ;AN000; + + +; Inputs: +; [EXTOPEN_ON]= flag for extende open +; SAVE_BX= mode specified in Extended Open +; Function: +; Set mode in ThisSFT +; Outputs: +; carry set,mode is set if from Extended Open +; carry clear, mode not set yet + +IF NOT IBMCOPYRIGHT + public Set_EXT_mode +ENDIF + + procedure Set_EXT_mode,NEAR ;AN000; + ASSUME ES:NOTHING,DS:NOTHING ;AN000; + + TEST [EXTOPEN_ON],ext_open_on ;AN000;EO. from extnded open + JZ NOTEX ;AN000;EO. no, do normal + PUSH AX ;AN000;EO. + MOV AX,[SAVE_BX] ;AN000;EO. + OR ES:[DI.sf_mode],AX ;AN000;EO. + POP AX ;AN000;EO. + STC ;AN000;EO. +NOTEX: ;AN000; + return ;AN000;EO. + +EndProc Set_EXT_mode ;AN000; + +CODE ENDS + END + \ No newline at end of file -- cgit v1.2.3