📄 gshare2.asm
字号:
mov bx,es:[di].sf_MFT
or bx,bx
; $if nz,,long ; if not network ;AC000;
JNZ $$XL2
JMP $$IF4
$$XL2:
EnterCrit critShare
;---------------------------------------
; Walk the sft chain for this file and
; skip the current SFT (ES:DI)
;---------------------------------------
SaveReg <DS,SI>
lds si,cs:[bx].MFT_SPTR
mov cx,ax
; $search ; ;AC000;
$$DO5:
CallInstall PointComp,multDOS,20 ; pointers different?
; $if z ; if ourselves ;AC000;
JNZ $$IF6
lds si,[si].sf_chain ; move to next ;AC000;
; $endif ; endif - ourselves ;AC000;
$$IF6:
or si,si
; $leave z ; ;AC000;
JZ $$EN5
;---------------------------------------
; CX = 0 for updating of time
; CX = 1 for updating of size/allocation
; for growth
; CX = 2 for updating of size/allocation
; for shrink
; CX = 3 for new instance copy.
;---------------------------------------
cmp cx,2 ; ;AC000;
; $exitif a ; ;AC000;
JNA $$IF5
;---------------------------------------
; CX = 3 for new instance copy.
; CX = 4 for codepage and high attrib update
;---------------------------------------
cmp cx,3 ; cx = 3 ? ;an000;
; $if e ; yes ;an000;
JNE $$IF10
call New_Sft ; ;AN000;
;; $else ; cx = 4 ;an000;
;; call New_CP_Attrib ; update codepage and high attrib ;an000;
; $endif ; ;an000;
$$IF10:
; $orelse ; ;AC000;
JMP SHORT $$SR5
$$IF5:
or cx,cx
; $if z ; if cx = 0 then ;AC000;
JNZ $$IF13
;---------------------------------------
; CX = 0 for updating of time
;
; Copy time from ES:DI into DS:SI
;---------------------------------------
mov bx,es:[di].sf_time
mov [si].sf_time,bx
mov bx,es:[di].sf_date
mov [si].sf_date,bx
test [si].sf_flags,ifs_flag ; ;AN000;
; $if nz ; if non-FAT ;AC003;
JZ $$IF14
call Call_IFS ; tell IFS of SFT change ;AN000;
; $endif ; endif non- FAT ;AN000;
$$IF14:
; $else ; else - must be >0 and <2 ;AC000;
JMP SHORT $$EN13
$$IF13:
;---------------------------------------
; CX = 1 for updating of size/allocation
; for growth
; CX = 2 for updating of size/allocation
; for shrink
;
; We always copy size and firclus
;---------------------------------------
mov bx,word ptr es:[di].sf_size
mov word ptr [si].sf_size,bx
mov bx,word ptr es:[di].sf_size+2
mov word ptr [si].sf_size+2,bx
test [si].sf_flags,ifs_flag ; ;AN000;
; $if nz ; if non-FAT ;AC003;
JZ $$IF17
invoke Call_IFS ; tell IFS of SFT change ;AN000;
; $else ; else - its FAT ;AN000;
JMP SHORT $$EN17
$$IF17:
mov bx,es:[di].sf_firclus
mov [si].sf_firclus,bx
cmp cx,2 ; ;AC000;
; $if z,or ; if SFT is shrinking or ;AC000;
JZ $$LL19
cmp [si].sf_lstclus,0 ; lstclus UN-set from a create? ;AC000;
; $if z ; If it is, set lstclus and cluspos too;AC000;
JNZ $$IF19
$$LL19:
;---------------------------------------
; Shrink the file, move in new cluspos
; and lstclus
;---------------------------------------
mov [si].sf_cluspos,0 ; retrace from start
mov [si].sf_lstclus,bx ; ditto
; $endif ; endif - set lstclus and cluspos ;AC000;
$$IF19:
; $endif ; endif FAT ;AN000;
$$EN17:
; $endif ; enndif - > 0 ;AC000;
$$EN13:
;---------------------------------------
; Link to next SFT
;---------------------------------------
lds si,[si].sf_chain
; $endloop ; ;AC000;
JMP SHORT $$DO5
$$EN5:
; $endsrch ; ;AC000;
$$SR5:
;---------------------------------------
; All Done
;---------------------------------------
RestoreReg <SI,DS>
LeaveCrit critShare
; $endif ; endif - device and network ;AC000;
$$IF4:
ret
EndProc ShSU
Break <New_Sft - update a new SFT>
;******************* START OF SPECIFICATIONS ***********************************
;
; NAME: New_Sft - update a new SFT
;
; FUNCTION: Copy all SFT information into a NEW sft of a SHARED file.
;
;
; INPUT: ES.DI has SFT that was just Revised.
; DS:SI has SFT that is to be updated
;
; OUTPUT: SFT is updated.
;
; REGISTERS USED: AX, BX
; (NOT RESTORED)
;
; LINKAGE: Invoked by: ShSU
;
; EXTERNAL Invoke: Call_IFS
; REFERENCES:
;
; CHANGE 04/15/87 - First release
; LOG:
;
;******************* END OF SPECIFICATIONS *************************************
;******************+ START OF PSEUDOCODE +**************************************
;
; START New_Sft
;
; update time
; update date
; update size
; if non - FAT file system
; call IFSFUNC
; else
; update first cluster
; update cluster position
; update last cluster
; endif
; return
;
; END New_Sft
;
;******************+ END OF PSEUDOCODE +**************************************
Procedure New_Sft,near ; ;AN000;
mov bx,[si].sf_time ; update time
mov es:[di].sf_time,bx
mov bx,[si].sf_date ; update date
mov es:[di].sf_date,bx
mov bx,word ptr [si].sf_size ; update size
mov word ptr es:[di].sf_size,bx
mov bx,word ptr [si].sf_size+2
mov word ptr es:[di].sf_size+2,bx
test es:[di].sf_flags,ifs_flag ; ;AN000;
; $if nz ; if non-FAT ;AC003;
JZ $$IF26
call Call_IFS ; tell IFS of SFT change ;AN000;
; $else ; else - its FAT ;AN000;
JMP SHORT $$EN26
$$IF26:
mov bx,[si].sf_firclus ; update first cluster
mov es:[di].sf_firclus,bx
mov es:[di].sf_cluspos,0 ; retrace from start
mov es:[di].sf_lstclus,bx ; ditto
; $endif ; endif FAT ;AN000;
$$EN26:
ret ; we'er done ;AN000;
EndProc New_Sft ; ;AN000;
Break <New_CP_Attrib - update the codepage and attrib in SFT>
;******************* START OF SPECIFICATIONS ***********************************
;
; NAME: New_CP_Attrib - Update codepage and attrib in SFT
;
; FUNCTION: Copy all codepage and attrib into SFT of a SHARED file.
;
;
; INPUT: ES.DI has SFT that was just Revised.
; DS:SI has SFT that is to be updated
;
; OUTPUT: SFT is updated.
;
; REGISTERS USED: AX, BX
; (NOT RESTORED)
;
; LINKAGE: Invoked by: ShSU
;
; EXTERNAL Invoke: Call_IFS
; REFERENCES:
;
; CHANGE 10/06/87 - First release - D. M. Sewell
; LOG:
;
;******************* END OF SPECIFICATIONS *************************************
;******************+ START OF PSEUDOCODE +**************************************
;
; START New_CP_Attrib
;
; Update codepage
; Update high attribute
; $if ifs_flag
; call Call_IFS
; $endif
; return
;
; END New_CP_Attrib
;
;******************+ END OF PSEUDOCODE +**************************************
;; Procedure New_CP_Attrib,near ; ;AN000;
;; mov bx,es:[di].SF_Codepage ; update codepage ;an000;
;; mov [si].SF_Codepage,bx ;an000; dms;
;; mov bl,es:[di].SF_Attr_Hi ; update high attribute ;an000;
;; mov [si].SF_Attr,bl ;an000; dms;
;; test es:[di].sf_flags,ifs_flag ; ;AN000;
;; $if nz ; if non-FAT ;AC003;
;; call Call_IFS ; tell IFS of SFT change ;AN000;
;; $endif ; endif FAT ;AN000;
;; ret ; we'er done ;AN000;
;; EndProc New_CP_Attrib ; ;AN000;
Break <Call_IFS - warn IFS that SFT has changed>
;******************* START OF SPECIFICATIONS ***********************************
;
; NAME: Call_IFS - warn IFS that SFT has changed
;
; FUNCTION: Call IFS thru 2F interupt.
;
; INPUT: DS.SI points to SFT that was just Revised.
;
; OUTPUT: none
;
; REGISTERS USED: AX
; (NOT RESTORED)
;
; LINKAGE: Invoked by: ShSU, New_SFT
;
; EXTERNAL Callinstall
; REFERENCES:
;
; CHANGE 04/15/87 - First release
; LOG:
;
;******************* END OF SPECIFICATIONS *************************************
;******************+ START OF PSEUDOCODE +**************************************
;
; START Call_IFS
;
; set up for INT
; INT 2F
; return
;
; END Call_IFS
;
;******************+ END OF PSEUDOCODE +**************************************
Procedure Call_IFS,near ; ;AN000;
CallInstall BlockUpdate,MultIFS,44,CX,CX ; ;AC005;
ret ; ;AN000;
EndProc Call_IFS ; ;AN000;
Break <Internal error routines>
;******************* START OF SPECIFICATIONS ***********************************
;
; INTERR - INTernal ERRor routines
;
;******************* END OF SPECIFICATIONS *************************************
Procedure INTERR,NEAR
ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
SaveReg <BX,SI,DS> ; save registers that get clobbered
push cs ; gain addressability
pop ds
mov si,ax ; get message to print
call gout
off si,IntErrMsg
call gout
RestoreReg <ds,si,bx>
INTERRL:jmp INTERRL ; hang here - we're sick
gout: lodsb
or al,al
retz
mov ah,14
int 10h
jmp gout
EndProc INTERR
Break <INT 2F handler>
IF installed
Cont dd ?
INT2F PROC FAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:NOTHING
cmp ah,multSHARE
jnz ContJ
;
; 00h its anyone else - return 0FFh - loaded
;
or al,al ;
jnz ContJ ;not our function, pass it on
loaded:
mov al,0ffh ;indicate that Share is loaded
iret
ContJ:
jmp Cont ;chain on to next handler
INT2F ENDP
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:DOSData
IRP rtn,<MFT_enter, MFTClose, MFTclU, MFTCloseP, MFTCloN, set_mult_block, clr_mult_block>
J&rtn proc far
call rtn
ret
j&rtn endp
endm
IRP rtn,<chk_block, MFT_get, ShSave, ShChk, ShCol, ShCloseFile, ShSU>
J&rtn proc far
call rtn
ret
j&rtn endp
endm
IRP sect,<critShare>
Procedure E§,NEAR
PUSH AX
MOV AX,8000h+sect
INT int_ibm
POP AX
ret
EndProc E§
Procedure L§,NEAR
PUSH AX
MOV AX,8100h+sect
INT int_ibm
POP AX
ret
EndProc L§
ENDM
ENDIF
;SR;
; The internal error messages are being included here. These have all been
;moved into a single file so that it is easy to internationalize the messages
;
include shmsg.inc
BREAK <MFT and Lock Record Data Area>
;******************* START OF SPECIFICATIONS ***********************************
;
; first MFT record
;
; Note that the name field can have garbage after the trailing
; 00 byte. This is because the field might be too long, but
; not long enough (at least 16 extra bytes) to fragment.
; in this case we copy the length of the string area, not
; the length of the string and thus may copy tailing garbage.
;
;******************* END OF SPECIFICATIONS *************************************
PoolSize = 2048
PUBLIC MFT
MFT DB 0 ; free
DW PoolSize ; PoolSize bytes long
IF not Installed
DB (PoolSize-3) DUP(0) ; leave rest of record
MEND DB -1 ; END record
lck1 DW 0 ; link
DB SIZE RLR_entry-2 DUP(0)
lck2 DW OFFSET DOSDATA:lck1 ; link
DB SIZE RLR_entry-2 DUP(0)
lck3 DW OFFSET DOSDATA:lck2 ; link
DB SIZE RLR_entry-2 DUP(0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -