📄 gshare2.asm
字号:
lck4 DW OFFSET DOSData:lck3 ; link
DB SIZE RLR_entry-2 DUP(0)
lck5 DW OFFSET DOSDATA:lck4 ; link
DB SIZE RLR_entry-2 DUP(0)
lck6 DW OFFSET DOSDATA:lck5 ; link
DB SIZE RLR_entry-2 DUP(0)
lck7 DW OFFSET DOSDATA:lck6 ; link
DB SIZE RLR_entry-2 DUP(0)
lck8 DW OFFSET DOSDATA:lck7 ; link
DB SIZE RLR_entry-2 DUP(0)
CODE ENDS
%out Ignore this END error (blasted assembler)
ENDIF
IF Installed
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:NOTHING
IF1
InitSpace DW PoolSize
ELSE
IF shareinit-MFT LT PoolSize
InitSpace DW PoolSize
ELSE
InitSpace DW shareinit-MFT
ENDIF
ENDIF
InitLocks DW 20
JTable LABEL BYTE
DD ?
DD JMFT_Enter ; 1 MFT_enter
DD JMFTClose ; 2 MFTClose
DD JMFTclU ; 3 MFTclU
DD JMFTcloseP ; 4 MFTCloseP
DD JMFTcloN ; 5 MFTCloN
DD JSet_Mult_Block ; 6 Set_Mult_Block
DD JClr_Mult_Block ; 7 Clr_Mult_Block
DD JChk_Block ; 8 Chk_Block
DD JMFT_Get ; 9 MFT_get
DD JShSave ; 10 ShSave
DD JShChk ; 11 ShChk
DD JShCol ; 12 ShCol
DD JShCloseFile ; 13 ShCloseFile
DD JShSU ; 14 ShSU
JTableLen = $ - JTable
; $SALUT (4,9,17,36)
;---------------------------------------
; STRUCTURE TO DEFINE ADDITIONAL
; COMMAND LINE PARAMETERS
;---------------------------------------
PARMS LABEL DWORD
DW OFFSET PARMSX ; POINTER TO PARMS STRUCTURE
DB 0 ; NO DELIMITER LIST FOLLOWS
DB 0 ; NUMBER OF ADDITIONAL DELIMITERS
;---------------------------------------
; STRUCTURE TO DEFINE SORT
; SYNTAX REQUIREMENTS
;---------------------------------------
PARMSX LABEL BYTE
DB 0,0 ; THERE ARE NO POSITIONAL PARAMETERS
DB 2 ; THERE ARE TWO TYPES OF SWITCH
DW OFFSET SW ; POINTER TO THE SWITCH DEFINITION AREA
DW OFFSET SW_OPT ; POINTER TO THE SWITCH DEFINITION AREA
DW 0 ; THERE ARE NO KEYWORDS IN SHARE SYNTAX
;---------------------------------------
; STRUCTURE TO DEFINE THE SWITCHES
;---------------------------------------
SW LABEL WORD
DW 08001H ; MUST BE NUMERIC
DW 0 ; NO FUNCTION FLAGS
DW OFFSET SWITCH_BUFF ; PLACE RESULT IN SWITCH BUFFER
DW OFFSET VALUES ; NEED VALUE LIST
DB 3 ; TWO SWITCHES IN FOLLOWING LIST
F_SW DB "/F",0 ; /F: INDICATES n FILESPACE REQUESTED
L_SW DB "/L",0 ; /L: INDICATES m LOCKS REQUESTED
N_SW DB "/NC",0 ; /NC: INDICATES no checking required
PUBLIC SW_OPT, ?_SW
SW_OPT LABEL WORD
DW 0 ; MATCH MASK
DW 0 ; FUNCTION MASK
DW OFFSET SWITCH_BUFF ; PLACE RESULT IN SWITCH BUFFER
DW OFFSET VALUES ; NEED VALUE LIST
DB 1 ; 1 SWITCH IN FOLLOWING LIST
?_SW DB "/?",0 ; /? INDICATES give options help
;---------------------------------------
; VALUE LIST DEFINITION FOR n
;---------------------------------------
VALUES LABEL BYTE
DB 1 ; ONE VALUE ALLOWED
DB 1 ; ONLY ONE RANGE
DB FILE_SWITCH ; IDENTIFY IT AS n
DD 1,65535 ; USER CAN SPECIFY /+1 THROUGH /+65535
;---------------------------------------
; RETURN BUFFER FOR SWITCH INFORMATION
;---------------------------------------
; $SALUT (4,17,27,36)
SWITCH_BUFF LABEL BYTE
SW_TYPE DB ? ; TYPE RETURNED
SW_ITEM_TAG DB ? ; SPACE FOR ITEM TAG
SW_SYN DW ? ; POINTER TO SWITCH LIST ENTRY
SW_VALUE DD ? ; SPACE FOR VALUE
Exit_Msg db 0 ;flag set if no exit on ShDispMsg ;M006
Fswitch db 0 ;flag set if /F given ;M006
Lswitch db 0 ;flag set if /L given ;M006
; $SALUT (4,4,9,41)
Break <INIT - INITalization routines>
;******************* START OF SPECIFICATIONS ***********************************
;
; INIT - INITalization routines
;
;******************* END OF SPECIFICATIONS *************************************
Procedure Init,NEAR
PUSH CS
POP DS
ASSUME DS:SHARE
MOV BX,InitSpace
SUB BX,3
MOV SI,OFFSET MFT
MOV WORD PTR [SI+1],BX ; length of first item
ADD SI,BX ; link to end of structure
MOV BYTE PTR [SI],-1 ; signal end
INC SI ; point to next free byte
MOV CX,initlocks ; count for loop
MOV AX,0
; $do ; ;AC000;
$$DO48:
MOV [SI].RLR_next,AX ; link in previous
MOV AX,SI ; this is now previous
ADD SI,SIZE RLR_Entry ; move to next object
; $enddo loop ; ;AC000;
LOOP $$DO48
MOV FreLock,AX ; point to beginning of free list
MOV DX,CS
MOV BX,ES
SUB DX,BX
ADD SI,15
RCR SI,1
SHR SI,1
SHR SI,1
SHR SI,1
ADD SI,DX
PUSH SI ; # of paras for share on stack
MOV AX,(Get_Interrupt_Vector SHL 8) + 2Fh
INT 21h
MOV WORD PTR CONT,BX
MOV WORD PTR CONT+2,ES
MOV AX,(Set_Interrupt_Vector SHL 8) + 2Fh
MOV DX,OFFSET INT2F
INT 21h
;---------------------------------------
; Notify the DOS that we are around so that
; the DOS can make expensive calls to us.
;---------------------------------------
MOV AH,Get_In_Vars
INT 21h
ASSUME ES:DOSDATA
MOV fShare,-1 ; tell DOS we are here ;AC011;
;---------------------------------------
; Cram in the new jump table
;---------------------------------------
CLI
MOV SI,OFFSET JTable
MOV DI,OFFSET JShare
MOV CX,JTableLen/2
REP MOVSW
;---------------------------------------
; Examine the size of the FCB cache.
; If it is NOT the system default of 4,0
; change it (via reallocation) to 16,8.
; The old table is lost.
;---------------------------------------
ASSUME DS:NOTHING
CMP KeepCount,0
; $if z,and ; if the ",0" part and ;AC000;
JNZ $$IF52
LDS SI,ES:[BX].SYSI_FCB ; point to the existing cache
CMP [SI].sfCount,4
; $if z ; if the "4," part then ;AC000;
JNZ $$IF52
;---------------------------------------
; Whammo, we need to allocate 16 * size
; of SF_entry + size of sfTable.
; Compute this size in paragraphs
;---------------------------------------
MOV AX,16
MOV CX,size sf_entry
MUL CX
ADD AX,(size sf) - 2
;---------------------------------------
; This size is in bytes...
; Round up to paragraph size
;---------------------------------------
ADD AX,0Fh
RCR AX,1
SHR AX,1
SHR AX,1
SHR AX,1
;---------------------------------------
; AX is the number of paragraphs to add.
; Word on stack is current TNR size.
; Make dos point to new table
;---------------------------------------
MOV WORD PTR ES:[BX].SYSI_FCB,0
MOV WORD PTR ES:[BX].SYSI_FCB+2,SS
POP SI
ADD WORD PTR ES:[BX].SYSI_FCB+2,SI
;---------------------------------------
; Initialize table parts, next link
; and size
;---------------------------------------
MOV DS,WORD PTR ES:[BX].SYSI_FCB+2
MOV WORD PTR DS:[sfLink],-1
MOV WORD PTR DS:[sfLink+2],-1
MOV DS:[sfcount],16
;---------------------------------------
; Set up succeeding LRU size
;---------------------------------------
MOV KeepCount,8
ADD SI,AX
PUSH SI
; $endif ; endif - "4,0" ;AC000;
$$IF52:
;---------------------------------------
; Clean out the FCB Cache
;---------------------------------------
LES DI,ES:[BX].SYSI_FCB
ASSUME ES:Nothing
MOV CX,ES:[DI].SFCount
LEA DI,[DI].SFTable
; $do ; ;AC000;
$$DO54:
MOV ES:[DI].sf_ref_count,0
MOV WORD PTR ES:[DI].sf_position,0
MOV WORD PTR ES:[DI].sf_position+2,0
ADD DI,SIZE sf_entry
; $enddo loop ; ;AC000;
LOOP $$DO54
STI
ASSUME ES:NOTHING
XOR BX,BX
MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN
; $do ; Close STD handles before ;AC000;
$$DO56:
; keep process
MOV AH,CLOSE
INT 21H
INC BX
; $enddo loop ; ;AC000;
LOOP $$DO56
POP DX ; T+R size in DX
MOV AX,(Keep_Process SHL 8) + 0
INT 21h
MOV AX,(EXIT SHL 8) + 1
INT 21h ; We'er now resident, return to DOS
EndProc Init
Break <SHAREINIT - Share initialization entry point>
;******************* START OF SPECIFICATIONS ***********************************
;
; SHAREINIT - Share initialization entry point
;
;******************* END OF SPECIFICATIONS *************************************
Procedure SHAREINIT,NEAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:STACK
; int 3
nop
nop
PUSH DS ; save PSP segment for later stack ;AC001;
; relocation
;---------------------------------------
; Load Messages
;---------------------------------------
call ShLoadMsg ; ;AN000;
;---------------------------------------
; At this point, the DOS version is OK.
; (checked by SYSLOADMSG)
; Now - Check the DOS data version
;---------------------------------------
; $if c,or ; if not same as us ;AC009;
JC $$LL58
MOV AH,Get_In_Vars
INT 21h
ASSUME ES:DOSDATA
CMP DataVersion,ShareDataVersion
ASSUME ES:NOTHING
; $if ne ; if not same as us ;AC000;
JE $$IF58
$$LL58:
mov ax,(Utility_Msg_CLASS shl 8) + Bad_DOS_Ver ; ;AN000;
call ShDispMsg ; ;AN000;
; $endif ; endif - not same as us ;AC000;
$$IF58:
;---------------------------------------
; Deallocate memory if possible
;---------------------------------------
mov ax,ds:[pdb_environ]
or ax,ax
; $if nz ; if > 0 deallocate memory ;AC000;
JZ $$IF60
mov es,ax
mov ah,dealloc
int 21h
; $endif ; endif - > 0 deallocate memory ;AC000;
$$IF60:
;---------------------------------------
; Parse the command line
;---------------------------------------
call ShComndParse ; ;AN000;
;---------------------------------------
; Check to see if share already installed.
;---------------------------------------
mov ah,multShare ; ;AC010;
xor al,al
INT 2Fh ; ;AC010;
CMP AL,0FFh ; ;AC010;
JNZ $$IF62
;Share is already loaded
mov ax,(UTILITY_MSG_CLASS shl 8) + Sh_Already_Loaded ; ;AC010;
call ShDispMsg ; ;AC010;
$$IF62:
;
;M007; Begin changes
; Check to see if we are under the Dosshell. If so, we issue an error
;message and exit
;
mov ax,4b02h ; see if switcher enabled
xor bx,bx
push es
mov es,bx
mov di,bx ; es:di <- 0 on entry
int 2fh
mov ax,es
pop es
or ax,di ; es:di == 0 =>no switcher
jz Sh_noshell ;switcher not present, continue
mov ax,(UTILITY_MSG_CLASS shl 8) + SH_DOSSHELL ;switcher present
call ShDispMsg ;display error message & terminate
Sh_noshell:
;---------------------------------------
; All set to initialize the world.
; Make sure that we have enough memory
; for everything in our little 64K here.
; First get avail count of paras.
;---------------------------------------
pop es ; recover PSP segment ;AC002;
push es ; ;AC002;
MOV BX,CS
MOV AX,ES:[PDB_Block_Len]
SUB AX,BX
;---------------------------------------
; AX has the number of paragraphs
; available to us after the beginning
; of CS. Max this out at 64K.
;---------------------------------------
CMP AX,1000h
; $if a ; if more than we can handle ;AC000;
JNA $$IF66
MOV AX,1000h ; force it
; $endif ; endif - more than we can handle ;AC000;
$$IF66:
;---------------------------------------
; Take AX paragraphs and convert them
; into BX:CX bytes.
;---------------------------------------
XOR BX,BX
SHL AX,1
SHL AX,1
SHL AX,1
SHL AX,1
ADC BX,0
MOV CX,AX
;---------------------------------------
; compute in DX:AX, the size
; requested by the user
;---------------------------------------
MOV AX,initlocks
MOV SI,size RLR_Entry
MUL SI
ADD AX,OFFSET MFT
ADC DX,0
ADD AX,InitSpace
ADC DX,0
;---------------------------------------
; Compare the 32 bit sizes DX:AX and BX:CX.
; If BX:CX is smaller, then we
; are out of memory.
;---------------------------------------
CMP DX,BX ; try upper half first
; $if a,or ; if most significant is bigger or ;AC000;
JA $$LL68
; $if e,and ; if equal and ;AC000;
JNE $$IF68
CMP AX,CX ;
; $if a ; if least significant is bigger ;AC000;
JNA $$IF68
$$LL68:
mov ax,(EXT_ERR_CLASS shl 8) + No_Mem_Error ; issue error message ;AN000;
call ShDispMsg ; ;AN000;
; $endif ; endif - bigger ;AC000;
$$IF68:
;SR;
; Display the installed message here
;
mov ax,(UTILITY_MSG_CLASS shl 8) + SH_LOADED
mov Exit_Msg,1 ;do not exit after message ;M006
call ShDispMsg ;will
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -