mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
1191 lines
24 KiB
Plaintext
1191 lines
24 KiB
Plaintext
;
|
||
; individual function handlers
|
||
;
|
||
func13: ;reset disk system
|
||
|
||
if MPM
|
||
|
||
MOV BX,DLOG
|
||
MOV INFO,BX
|
||
CALL DISKRESET
|
||
JZ RESET_ALL
|
||
CALL RESET_37
|
||
JMP FUNC13_CONT
|
||
RESET_ALL:
|
||
|
||
endif
|
||
|
||
|
||
xor bx,bx
|
||
mov rodsk,bx
|
||
mov dlog,bx
|
||
|
||
if MPM
|
||
|
||
MOV RLOG,BX
|
||
MOV TLOG,BX
|
||
FUNC13_CONT:
|
||
|
||
endif
|
||
|
||
XOR AL,AL
|
||
MOV SELDSK,AL
|
||
DEC AL
|
||
MOV CURDSK,AL
|
||
JMP FUNC_48 ;FLUSH BUFFERS
|
||
|
||
func14: ;select disk info
|
||
|
||
CALL SET_SELDSK
|
||
|
||
if MPM
|
||
|
||
CALL CURSELECT
|
||
MOV BX,RLR
|
||
MOV AL,SELDSK
|
||
MOV P_DSK[BX],AL
|
||
RET
|
||
|
||
endif
|
||
if CPM
|
||
|
||
JMP CURSELECT
|
||
|
||
endif
|
||
|
||
func15: ;open file
|
||
|
||
call parsave33r ;copy fcb from user seg.
|
||
MOV CL,8
|
||
CALL COPY_DMA_IN
|
||
call clrmodnum ;clear the module number
|
||
|
||
if MPM
|
||
|
||
MOV MAKE_FLAG,FALSE
|
||
MOV BYTE PTR SDCNT+1,0FFH ;INITIALIZE SDCNT
|
||
MOV BX,OFFSET OPENFILE ;CHECK_FCB1 RETURNS TO OPEN_FILE
|
||
PUSH BX ;IF CHECKSUM INVALID
|
||
MOV CHECK_FCB_RET,TRUE
|
||
CALL CHECK_FCB1 ;RETURNS NORMALLY IF FCB CHKSUM VALID
|
||
POP BX
|
||
CMP HIGH_EXT,60H ;IS FILE OPEN IN READ/ONLY-USER 0 MODE?
|
||
JNE OPEN_FILE ;NO
|
||
CALL HOME ;ATTEMPT OPEN UNDER USER ZERO
|
||
CALL SET_END_DIR
|
||
JMP OPEN_USER_ZERO
|
||
OPEN_FILE:
|
||
MOV BX,INFO ;FCB(0) = USRCODE
|
||
MOV AL,USRCODE
|
||
MOV [BX],AL
|
||
MOV BYTE PTR SDCNT+1,0FFH ;INITIALIZE SDCNT
|
||
|
||
endif
|
||
|
||
CALL RESET_CHECKSUM_FCB ;INVALIDATE FCB CHKSUM
|
||
CALL CHECK_WILD ;CHECK FOR ?S IN FCB
|
||
CALL GET_ATTS ;GET & CLEAR ATTS F5'-F8'
|
||
AND AL,0C0H ;1ST 2 SPECIFY OPEN MODE
|
||
|
||
if MPM
|
||
|
||
CMP AL,0C0H ;IF BOTH ON DEFAULT TO READ/ONLY
|
||
JNE ATT_OK
|
||
|
||
endif
|
||
|
||
AND AL,40H ;REMOVE UNLOCKED MODE BIT
|
||
ATT_OK:
|
||
MOV HIGH_EXT,AL ;SAVE OPEN MODE
|
||
|
||
if MPM
|
||
|
||
MOV AH,AL ;DEFINE ATTRIBUTES
|
||
SHR AH,1 ;BIT 0 ON = LOCKED MODE
|
||
JNZ ATT_SET ;BIT 1 ON = UNLOCKED MODE
|
||
MOV AH,80H ;BIT 2 ON = READ/ONLY MODE
|
||
ATT_SET:
|
||
MOV ATTRIBUTES,AH
|
||
|
||
endif
|
||
|
||
AND AL,80H ;IS OPEN MODE UNLOCKED?
|
||
JNZ CALL_OPEN ;YES
|
||
CMP USRCODE,0 ;IS USER 0
|
||
JE CALL_OPEN ;YES
|
||
MOV AL,0FEH ;INITIALIZE SEARCH SWITCHES TO
|
||
MOV BYTE PTR XDCNT+1,AL ;FLAG PRESENCE OF FILE UNDER USER
|
||
INC AL ;ZERO IF FILE NOR PRESENT UNDER
|
||
MOV SEARCH_USER0,AL ;CURRENT USER #
|
||
|
||
if MPM
|
||
|
||
MOV BYTE PTR SDCNT0+1,AL ;INITIALIZE USER 0 SDCNT
|
||
|
||
endif
|
||
|
||
CALL_OPEN:
|
||
CALL OPEN ;ATTEMPT TO OPEN FCB
|
||
CALL OPENX ;RETURNS IF UNSUCCESSFUL
|
||
MOV BX,OFFSET SEARCH_USER0
|
||
TEST B[BX],TRUE ;IS SEARCH_USER0 TRUE?
|
||
JNZ $+3 ;YES
|
||
RET30: RET ;NO - OPEN FAILED
|
||
MOV B[BX],FALSE ;SEARCH_USER0 = FALSE
|
||
CMP BYTE PTR XDCNT+1,0FEH ;DOES FILE EXIST UNDER USER 0?
|
||
JE RET30 ;NO
|
||
|
||
if MPM
|
||
|
||
CALL SWAP ;SWAP SDCNT,SDBLK & SDCNT0,SDBLK0
|
||
|
||
endif
|
||
|
||
CALL SET_DCNT_DBLK ;RESET DCNT,DBLK
|
||
MOV HIGH_EXT,60H ;SET OPEN MODE TO READ/ON-USER 0
|
||
OPEN_USER_ZERO:
|
||
MOV BX,INFO ;FCB(0) = USER 0
|
||
MOV B[BX],0
|
||
MOV CL,NAMLEN ;ATTEMPT TO LOCATE FCB UNDER USER ZERO
|
||
CALL SEARCHI
|
||
CALL SEARCHN
|
||
CALL OPEN1
|
||
CALL OPENX ;OPENX RETURNS IF SEARCH UNSUCCESSFUL
|
||
RET
|
||
|
||
;
|
||
OPENX:
|
||
CALL END_OF_DIR ;WAS OPEN SUCCESSFUL
|
||
JZ RET30 ;NO
|
||
POP BX ;DISCARD RETURN ADDRESS
|
||
|
||
if MPM
|
||
|
||
MOV AL,HIGH_EXT ;IS OPEN MODE READ/ONLY - USER 0?
|
||
CMP AL,60H
|
||
JE OPENX00 ;YES
|
||
OR AL,AL ;IS OPEN MODE LOCKED?
|
||
JNZ OPENX0 ;NO
|
||
MOV BX,INFO
|
||
OR AL,AL ;IS USER NUMBER ZERO?
|
||
JNZ OPENX0 ;NO
|
||
CALL ROTEST ;IS FILE READ/ONLY ATTRIBUTE SET?
|
||
JNC OPENX0 ;NO
|
||
INC BX ;IS FILE SYSTEM ATTRIBUTE SET?
|
||
MOV AL,[BX]
|
||
RCL AL,1
|
||
JNC OPENX0 ;NO
|
||
|
||
OPENX00:
|
||
|
||
endif
|
||
if CPM
|
||
|
||
CMP HIGH_EXT,60H ;IS OPEN MODE READ/ONLY = USER 0?
|
||
JNE OPENX0 ;NO
|
||
|
||
endif
|
||
|
||
MOV ATTRIBUTES,20H ;OPEN FILE IN READ/ONLY-USER 0 MODE
|
||
MOV BX,INFO ;IF FCB HAS SYSTEM ATTRIBUTE SET
|
||
MOV AL,10[BX]
|
||
AND AL,80H
|
||
JNZ OPENX0 ;SYSTEM ATTRIBUTE SET
|
||
MOV HIGH_EXT,AL ;OPEN FAILED - SYSTEM ATTRIBUTE RESET
|
||
JMP LRET_EQ_FF
|
||
|
||
OPENX0:
|
||
CALL RESET_CHECKSUM_FCB ;INVALIDATE CHECKSUM
|
||
|
||
CALL GET_DIR_MODE ;AL = DIR LABEL DATA BYTE
|
||
OR AL,AL ;AL = 0 => NO DIR LBL
|
||
|
||
if MPM
|
||
|
||
JZ OPENX1 ;NO DIR LBL
|
||
|
||
endif
|
||
if CPM
|
||
|
||
JNZ $+8
|
||
MOV COMP_FCB_CKS,TRUE ;SET FCB CHKSUM FLAG
|
||
RET
|
||
|
||
endif
|
||
|
||
PUSH AX ;AL = DIR LBL DATA BYTE
|
||
CALL GET_XFCB
|
||
POP CX ;CL = DIR LBL, AL = FCB PASSWORD MODE
|
||
AND AL,0C0H ;IS PW MODE READ(0) OR WRITE(1)?
|
||
JZ OPENX1 ;NO - DON'T CHK PASSWORD
|
||
TEST CL,80H ;ARE PWS ACTIVATED BY DIR LBL?
|
||
JZ OPENX1 ;NO
|
||
MOV CH,AL ;CH = XFCB PW MODE
|
||
PUSH CX ;CL = DIR LBL DATA BYTE
|
||
CALL CMP_PW ;CHECK PASSWORDS
|
||
POP CX
|
||
JZ OPENX1 ;JUMP IF PASSWORD CHECKS
|
||
TEST CH,40H ;IS PW MODE WRITE(1)?
|
||
JNZ $+5 ;YES
|
||
JMP CHK_PW1 ;PASSWORD ERROR
|
||
MOV XFCB_READ_ONLY,80H ;PROHIBIT ANY WRITES TO FILE
|
||
OPENX1:
|
||
|
||
if MPM
|
||
|
||
call pack_sdcnt
|
||
;is this file currently open?
|
||
mov ch,3! call search_olist! jz openx04
|
||
openx01:
|
||
;no - is olist full?
|
||
cmp free_root,0! jne openx03
|
||
;yes - error
|
||
openx02:
|
||
mov al,11! jmp set_aret
|
||
openx03:
|
||
;has process exceeded open file maximum?
|
||
call count_opens! jb openx035
|
||
;yes - error
|
||
openx034:
|
||
mov al,10! jmp set_aret
|
||
openx035:
|
||
;create new olist element
|
||
call create_olist_item
|
||
jmp openx08
|
||
openx04:
|
||
;do file attributes match?
|
||
mov al,attributes! or al,2[bx]! cmp al,2[bx]! jnz openx06
|
||
;yes - is open mode locked?
|
||
and al,80h! jnz openx07
|
||
;no - has this file been opened by this process?
|
||
mov bx,prv_pos! mov cur_pos,bx
|
||
mov ch,5! call search_nlist! jnz openx01
|
||
openx05:
|
||
;yes - increment open file count
|
||
inc word ptr 8[bx]! jmps openx08
|
||
openx06:
|
||
;error - file opened by another process in
|
||
; incompatible mode
|
||
mov al,5! jmp set_aret
|
||
openx07:
|
||
;does this olist item belong to this process?
|
||
push bx! call compare_pds! pop bx! jnz openx06 ; no - error
|
||
jmps openx05 ; yes
|
||
openx08:
|
||
;open successful
|
||
;was file opened in unlocked mode?
|
||
test attributes,40h! jz openx09 ; no
|
||
;yes - return .olist_item in ranrec field of FCB
|
||
call getrra! mov dx,cur_pos! mov [bx],dx
|
||
mov parlg,35 ;copy 35 bytes back to user FCB
|
||
openx09:
|
||
mov comp_fcb_cks,true
|
||
test make_flag,true! jz $+3! ret
|
||
call get_dir_mode
|
||
|
||
endif
|
||
if CPM
|
||
|
||
MOV COMP_FCB_CKS,TRUE
|
||
MOV AL,CL
|
||
|
||
endif
|
||
|
||
AND AL,40H ;IS ACCESS DATE & TIME STAMPING
|
||
;ACTIVATED BY DIR LBL
|
||
JNZ $+3 ;YES
|
||
RET32: RET
|
||
CALL END_OF_DIR ;WAS XFCB FOUND?
|
||
JZ RET32 ;NO
|
||
CALL NOWRITE ;IS DISK READ/ONLY?
|
||
JNZ RET32 ;YES
|
||
OPENX2:
|
||
CALL STAMP1 ;SET FILE ACCESS TIME STAMP
|
||
JMP SEEK_COPY ;UPDATE XFCB
|
||
;ret ;jmp goback
|
||
|
||
func16: ;close file
|
||
|
||
call parsave33r
|
||
CALL GET_ATTS ;AL = INTERFACE ATTRIBUTES
|
||
MOV ATTRIBUTES,AL
|
||
|
||
if MPM
|
||
|
||
MOV BX,OFFSET CLOSE00 ;CHECK_FCB1 GOES TO CLOSE00 IF
|
||
PUSH BX ;A CHKSUM ERROR IS DETECTED
|
||
MOV CHECK_FCB_RET,TRUE
|
||
CALL CHECK_FCB1
|
||
POP BX ;CHKSUM OK
|
||
MOV BYTE PTR SDCNT+1,0FFH ;INITIALIZES SDCNT
|
||
CALL GET_MODNUM ;PERFORM PARTIAL CLOSE IF
|
||
AND AL,80H ;FCB(MODNUM) & 80H = 80H
|
||
JNZ CLOSE01
|
||
CALL CLOSE ;PERFORM FULL CLOSE
|
||
JMPS CLOSE02
|
||
CLOSE00:
|
||
MOV AL,6 ;CHECKSUM ERROR
|
||
JMP SET_ARET
|
||
CLOSE01:
|
||
MOV DONT_CLOSE,TRUE ;PERFORM CLOSE BUT DON'T UPDATE
|
||
CALL CLOSE1 ;DIRECTORY FCB
|
||
CLOSE02:
|
||
|
||
endif
|
||
if CPM
|
||
|
||
CALL CHEK_FCB ;CHECK FCB CHKSUM
|
||
MOV AL,6
|
||
JZ $+5
|
||
JMP SET_ARET ;PASSWORD ERROR
|
||
CALL CLOSE ;CLOSE FILE
|
||
|
||
endif
|
||
|
||
CMP LRET,0FFH
|
||
JNE $+3
|
||
RET34: RET ;ERROR ON CLOSE
|
||
CALL FUNC48 ;FLUSH BLOCKING/DEBLOCKING BUFFERS
|
||
TEST ATTRIBUTES,80H ;IS THIS A PARTIAL CLOSE
|
||
JNZ RET34 ;YES - RETURN
|
||
|
||
if MPM
|
||
|
||
call pack_sdcnt
|
||
;find olist item for this process and file
|
||
mov ch,5! call search_olist! jnz close03
|
||
;decrement open count
|
||
dec word ptr 8[bx]! cmp word ptr 8[bx],0ffffh
|
||
jnz close03
|
||
;yes - remove file's olist entry
|
||
mov file_id,bx! call delete_item
|
||
call reset_checksum_fcb
|
||
;if unlocked file, remove file's locktbl entries
|
||
test high_ext,80h! jz close03
|
||
mov bx,file_id! call remove_locks
|
||
close03:
|
||
|
||
endif
|
||
|
||
CALL GETMODNUM ;IS FILE WRITE FLAG IN FCB TRUE?
|
||
AND AL,40H
|
||
JZ RET34 ;NO - RETURN
|
||
CALL GET_DIR_MODE ;IS UPDATE DATE & TIME STAMPING
|
||
AND AL,20H ;ACTIVATED BY DIR LBL?
|
||
JZ RET34 ;NO - RETURN
|
||
CALL GET_XFCB ;DOES FILE HAVE AN XFCB
|
||
JZ RET34 ;NO - RETURN
|
||
CALL STAMP2 ;PERFORM UPDATE TIME STAMP
|
||
JMP SEEK_COPY ;UPDATE XFCB
|
||
;ret ;jmp goback
|
||
|
||
func17: ;search for first occurrence of a file
|
||
|
||
if MPM
|
||
|
||
mov bx,parametersegment ;SAVE USER SEGMENT & FCB OFFSET
|
||
mov srchabase,bx
|
||
mov bx,info
|
||
mov srchaofst,bx
|
||
|
||
endif
|
||
|
||
call parsave33
|
||
|
||
XOR AL,AL
|
||
CSEARCH:
|
||
PUSHF ;Z FLAG = 1 FOR SEARCH, 0 FOR SEARCHN
|
||
MOV BX,INFO
|
||
CMP B[BX],'?' ;DOES FCB(0) = '?'
|
||
JNE CSEARCH1 ;NO
|
||
CALL CURSELECT ;CURRENT SELECTED DISK IS SEARCHED
|
||
MOV CL,0 ;RETURN FIRST OR NEXT FCB
|
||
JMPS CSEARCH3 ;ALL FCBS MATCH
|
||
CSEARCH1:
|
||
CALL GETEXTA ;DOES FCB(EXT) = '?'
|
||
CMP B[BX],'?'
|
||
JE CSEARCH2 ;YES
|
||
CALL CLR_EXT ;CLEAR HIGH 3 BITS OF FCB(EXT)
|
||
CALL CLRMODNUM ;FCB(MODNUM) = 0
|
||
CSEARCH2:
|
||
CALL RESELECTX ;FCB(0) MAY SPECIFY DRIVE
|
||
MOV CL,NAMLEN
|
||
CSEARCH3:
|
||
|
||
POPF
|
||
MOV BX,OFFSET DIR_TO_USER ;CALLED AFTER SEARCH | SEARCHN
|
||
PUSH BX
|
||
JNZ $+5
|
||
JMP SEARCH
|
||
JMP SEARCHN
|
||
;ret ;jmp goback
|
||
|
||
func18: ;search for next occurrence of a file name
|
||
|
||
if MPM
|
||
|
||
;copy user's dma to dir buffer
|
||
mov si,dmaad ! mov di,buffa
|
||
PUSH DS ! MOV DS,DMABASE
|
||
CLD
|
||
mov cx,64 ! rep movs ax,ax
|
||
POP DS
|
||
;set search parameters
|
||
mov bx,srchabase
|
||
mov parametersegment,bx
|
||
mov bx,srchaofst
|
||
mov info,bx
|
||
call parsave33
|
||
mov bx,info
|
||
mov srcha,bx
|
||
|
||
endif
|
||
if CPM
|
||
|
||
mov bx,srcha
|
||
mov info,bx
|
||
|
||
endif
|
||
|
||
OR AL,1
|
||
JMP CSEARCH
|
||
;ret ;jmp goback
|
||
|
||
func19: ;delete a file
|
||
|
||
call parsave33r
|
||
MOV CL,8
|
||
CALL COPY_DMA_IN
|
||
JMP DELET
|
||
;ret ;jmp goback
|
||
|
||
func20: ;read a file
|
||
|
||
call parsave33r
|
||
CALL CHECK_FCB
|
||
jmp sqread
|
||
;jmp goback
|
||
|
||
func21: ;write a file
|
||
|
||
call parsave33r
|
||
CALL CHECK_FCB
|
||
jmp sqwrite
|
||
;jmp goback
|
||
|
||
func22: ;make a file
|
||
|
||
CALL PARSAVE33 ;COPY USER'S FCB INTO BDOS DSEG
|
||
MOV CL,9
|
||
CALL COPY_DMA_IN
|
||
CALL GET_ATTS ;GET AND CLEAR INTERFACE ATTS
|
||
MOV ATTRIBUTES,AL
|
||
MOV FCB_EXISTS,FALSE
|
||
CALL CLR_EXT ;CLEAR HIGH 3 BITS OF FCB(EXT)
|
||
call clrmodnum
|
||
CALL RESELECT
|
||
CALL CHECK_WILD ;VERIFY NO WILD CHARS EXIST IN FCB
|
||
MOV XDCNT,0FFFFH ;INIT XDCNT FOR OPEN,MAKE
|
||
|
||
if MPM
|
||
|
||
MOV BYTE PTR SDCNT+1,0FFH
|
||
|
||
endif
|
||
|
||
CALL OPEN ;ATTEMPT TO OPEN FCB
|
||
CALL RESET_CHECKSUM_FCB ;INVALIDATE FCB CHKSUM IN CASE FILE
|
||
;ALREADY EXISTS
|
||
CALL END_OF_DIR ;DOES FILE EXIST?
|
||
JZ $+5
|
||
JMP FILE_EXISTS ;YES - ERROR
|
||
|
||
if MPM
|
||
|
||
mov al,attributes! and al,80h! shr al,1! jnz makex00
|
||
mov al,80h
|
||
makex00:
|
||
mov make_flag,al ; make_flag = open attribute
|
||
cmp byte ptr sdcnt+1,0ffh! jz makex01
|
||
call pack_sdcnt
|
||
mov ch,3! call search_olist! jz make_x02
|
||
makex01:
|
||
cmp free_root,0! jne $+5! jmp openx02
|
||
jmps makex03
|
||
makex02:
|
||
mov al,makeflag! and al,2[bx]! jnz $+5
|
||
makex025:
|
||
jmp openx06
|
||
call compare_pds! jz makex03
|
||
test make_flag,80h! jnz makex025
|
||
make_x03:
|
||
|
||
endif
|
||
|
||
TEST FCB_EXISTS,TRUE ;DO ANY FCBS EXIST FOR FILE?
|
||
JZ MAKEX04 ;NO
|
||
CALL GET_DIR_MODE ;DOES DIR LBL REQUIRE PASSWORDS?
|
||
AND AL,80H
|
||
JZ MAKEX04 ;NO
|
||
CALL GET_XFCB ;DOES XFCB EXIST WITH MODE 1 OR 2
|
||
AND AL,0C0H ;PASSWORD?
|
||
JZ MAKEX04 ;NO
|
||
CALL CHK_XFCB_PASSWORD1 ;CHECK PASSWORD
|
||
MAKEX04:
|
||
CALL MAKE ;MAKE FCB
|
||
CALL RESET_CHECKSUM_FCB ;INVALIDATE FCB CHKSUM IN CASE
|
||
;MAKE FAILS
|
||
CALL END_OF_DIR ;DID MAKE FAIL?
|
||
JNZ $+3 ;NO
|
||
RET36: RET ;YES - NO ROOM IN DIRECTORY
|
||
CALL GET_DIR_MODE ;GET DIR LBL DATA BYTE
|
||
OR AL,AL
|
||
JZ MAKE4 ;ZERO IMPLIES NO DIR LBL
|
||
CALL GET_XFCB ;DOES XFCB EXIST FOR FILE?
|
||
JNZ MAKE000 ;YES
|
||
CALL GET_DIR_MODE ;GET DIR LBL AGAIN
|
||
AND AL,10H ;IS AUTOMATIC XFCB CREATION SPECIFIED?
|
||
JZ MAKE4 ;NO
|
||
MOV MAKE_XFCB,TRUE ;ATTEMPT TO MAKE XFCB
|
||
CALL MAKE
|
||
JNZ MAKE00 ;MAKE SUCCEEDED
|
||
MOV CL,NAMLEN ;DELETE THE FCB THAT WAS CREATED
|
||
CALL SEARCH ;ABOVE
|
||
CALL DELET0
|
||
JMP LRET_EQ_FF ;RETURN NO ROOM IN DIR ERROR
|
||
MAKE000:
|
||
TEST FCB_EXISTS,TRUE ;DO OTHER FCBS EXIST FOR FILE?
|
||
JNZ MAKE4 ;YES
|
||
MAKE00:
|
||
CALL INIT_XFCB ;INITIALIZE XFCB
|
||
MOV COMP_FCB_CKS,TRUE ;SET FCB CHKSUM FLAG
|
||
TEST ATTRIBUTES,40H ;IS USER SETTING PASSWORD?
|
||
JZ MAKE3 ;NO
|
||
MOV SI,XDMAAD ;PICK UP PASSWORD MODE FROM 9TH
|
||
ADD SI,8 ;BYTE OF DMA
|
||
LODS AL
|
||
AND AL,0E0H ;HAS PASSWORD MODE BEEN SPECIFIED?
|
||
JNZ MAKE2 ;YES
|
||
MOV AL,80H ;DEFAULT TO READ MODE
|
||
MAKE2:
|
||
PUSH AX
|
||
CALL GET_XFCB1 ;BX = .DIRBUFF XFCB(EXT)
|
||
POP AX
|
||
MOV [BX],AL ;XFCB(EXT) = PASSWORD MODE
|
||
CALL SET_PW
|
||
MOV [BX],CH ;XFCB(S1) = PASSWORD SUM
|
||
MAKE3:
|
||
CALL OPENX2 ;PLACE CREATE TIME STAMP IN XFCB
|
||
MAKE4:
|
||
|
||
if MPM
|
||
|
||
MOV AL,MAKE_FLAG ;SET ATTRIBUTES TO OPEN ATTRIBUTES
|
||
MOV ATTRIBUTES,AL
|
||
AND AL,40H
|
||
SHL AL,1
|
||
MOV HIGH_EXT,AL ;HIGH_EXT = SHL(ATTRIBUTES,1)
|
||
|
||
test byte ptr sdcnt+1,0ffh! jnz makexx02
|
||
call sdcnt_eq_xdcnt! call pack_sdcnt
|
||
jmp openx03
|
||
makexx02:
|
||
call fix_olist_item! jmp openx1
|
||
|
||
endif
|
||
|
||
MOV COMP_FCB_CKS,TRUE ;SET FCB CHKSUM FLAG
|
||
RET
|
||
|
||
FILE_EXISTS: ;FILE ALREADY EXISTS
|
||
MOV AL,8
|
||
SET_ARET:
|
||
MOV CL,AL ;SAVE ERROR INDEX
|
||
MOV BYTE PTR ARET+1,AL ;ARET+1 = EXTENDED ERRORS
|
||
CALL LRET_EQ_FF
|
||
CMP ERROR_MODE,0FFH
|
||
JNE $+5
|
||
JMP GOBACK ;RETURN PHYSICAL & EXTENDED ERRORS
|
||
SUB CL,3
|
||
SUB CH,CH
|
||
ADD CX,CX
|
||
MOV BX,OFFSET XERR_LIST ;COMPUTE EXTENDED ERROR MESSAGE OFFSET
|
||
ADD BX,CX
|
||
MOV BX,[BX]
|
||
JMP REPORT_ERR ;PRINT ERROR MESSAGE
|
||
;
|
||
func23: ;rename a file
|
||
|
||
call parsave33r
|
||
MOV CL,8
|
||
CALL COPY_DMA_IN
|
||
JMP RENAME
|
||
;ret ;jmp goback
|
||
|
||
func24: ;return the login vector
|
||
|
||
if CPM
|
||
|
||
mov bx,dlog
|
||
jmps sthlret
|
||
;ret ;jmp goback
|
||
|
||
endif
|
||
if MPM
|
||
|
||
mov bx,dlog
|
||
sub cx,cx ! ret
|
||
|
||
endif
|
||
|
||
func25: ;return selected disk number
|
||
|
||
if CPM
|
||
|
||
MOV AL,SELDSK
|
||
jmp staret
|
||
;ret ;jmp goback
|
||
|
||
endif
|
||
if MPM
|
||
|
||
mov bx,rlr
|
||
mov bl,p_dsk[bx] ! mov bh,0
|
||
sub cx,cx ! ret
|
||
|
||
endif
|
||
|
||
func26: ;set the subsequent dma address to info
|
||
|
||
if CPM
|
||
|
||
mov dmaad,dx ;dmaad = info
|
||
jmp setdata ;to data dma address
|
||
;ret ;jmp goback
|
||
endif
|
||
if MPM
|
||
|
||
mov u_dma_ofst,dx
|
||
sub bx,bx ! mov cx,bx
|
||
ret
|
||
|
||
endif
|
||
|
||
func27: ;return the login vector address
|
||
|
||
MOV RETURNSEG,DS
|
||
CALL XCURSELECT
|
||
mov bx,alloca
|
||
jmps sthlret
|
||
;ret ;jmp goback
|
||
|
||
if MPM
|
||
|
||
func28: ;write protect current disk
|
||
|
||
MOV SET_RO_FLAG,1
|
||
MOV CL,SELDSK
|
||
MOV BX,1
|
||
SHL BX,CL ;form drive vector from seldsk
|
||
CALL INTRNL_DISK_RESET ;verify no other process has files open
|
||
JMP SET_RO
|
||
|
||
endif
|
||
if CPM
|
||
|
||
func28 equ setro ;write protect current disk
|
||
|
||
endif
|
||
|
||
func29: ;return r/o bit vector
|
||
|
||
if CPM
|
||
|
||
mov bx,rodsk
|
||
jmps sthlret
|
||
;ret ;jmp goback
|
||
|
||
endif
|
||
if MPM
|
||
|
||
mov bx,rodsk
|
||
sub cx,cx ! ret
|
||
|
||
endif
|
||
|
||
func30: ;set file indicators
|
||
|
||
call parsave33
|
||
MOV CL,8
|
||
CALL COPY_DMA_IN
|
||
CALL CHECK_WILD
|
||
CALL RESELECTX
|
||
CALL CHK_PASSWORD
|
||
call indicators
|
||
jmp cpydirloc ;lret=dirloc
|
||
;ret ;jmp goback
|
||
|
||
func31: ;return address of disk parameter block
|
||
|
||
MOV RETURNSEG,DS
|
||
CALL XCURSELECT
|
||
mov bx,dpbaddr
|
||
sthlret:
|
||
mov aret,bx
|
||
ret ;jmp goback
|
||
|
||
func32: ;set user code
|
||
|
||
if CPM
|
||
|
||
mov al,linfo
|
||
cmp al,0ffh
|
||
jnz setusrcode
|
||
;interrogate user code instead
|
||
mov al,usrcode
|
||
jmp staret ;lret=usrcode
|
||
;ret ;jmp goback
|
||
setusrcode:
|
||
AND AL,0FH
|
||
mov usrcode,al
|
||
ret ;jmp goback
|
||
|
||
endif
|
||
if MPM
|
||
|
||
mov si,rlr
|
||
cmp dl,0ffh ! jne setusrcode
|
||
mov bl,p_user[si] ! mov bh,0
|
||
sub cx,cx ! ret
|
||
|
||
setusrcode:
|
||
AND DL,0FH
|
||
mov p_user[si],dl
|
||
sub bx,bx ! mov cx,bx ! ret
|
||
|
||
endif
|
||
|
||
func33: ;random disk read operation
|
||
|
||
call parsave36r ;save 36 bytes from user seg
|
||
CALL CHECK_FCB
|
||
jmp rdread ;to perform the disk read
|
||
;ret ;jmp goback
|
||
|
||
func34: ;random disk write operation
|
||
|
||
call parsave36r
|
||
CALL CHECK_FCB
|
||
jmp rdwrite ;to perform the disk write
|
||
;ret ;jmp goback
|
||
|
||
func35: ;return file size (0-65536)
|
||
|
||
call parsave36r
|
||
jmp getfilesize
|
||
;ret ;jmp goback
|
||
|
||
func36: ;set random record
|
||
|
||
call parsave36
|
||
MOV DX,INFO
|
||
jmp setrandom
|
||
;ret ;jmp goback
|
||
|
||
func37: ;reset drive
|
||
|
||
if MPM
|
||
|
||
CALL DISKRESET
|
||
RESET_37:
|
||
|
||
endif
|
||
|
||
mov ax,info
|
||
not ax
|
||
push ax
|
||
mov bx,offset dlog
|
||
and ax,[bx]
|
||
mov [bx],ax
|
||
pop ax
|
||
PUSH AX
|
||
mov bx,offset rodsk
|
||
and ax,[bx]
|
||
mov [bx],ax
|
||
POP AX
|
||
MOV BX,OFFSET RLOG
|
||
AND AX,[BX]
|
||
MOV [BX],AX
|
||
MOV CL,CURDSK ;IF CURDSK RESET, SET TO 0FFH
|
||
MOV DX,DLOG
|
||
CALL TEST_VECTOR1
|
||
JNZ RET38
|
||
MOV CURDSK,0FFH
|
||
RET38: ret
|
||
|
||
if MPM
|
||
|
||
func38: ;access drive
|
||
|
||
mov word ptr packed_dcnt,0ffffh
|
||
mov byte ptr packed_dcnt+2,0ffh
|
||
xor al,al
|
||
acc_drv0:
|
||
shl dx,1! adc al,0! or dx,dx! jnz acc_drv0
|
||
or al,al! jz ret38
|
||
mov dl,al! dec al! push ax
|
||
call acc_drv02
|
||
pop ax! jmp openx02
|
||
acc_drv02:
|
||
call check_free0! pop bx
|
||
call count_opens! pop bx
|
||
add bl,open_cnt! jb acc_drv3
|
||
sub bl,openmax! jae acc_drv3
|
||
mov bx,info
|
||
mov al,curdsk! push ax! mov al,16
|
||
acc_drv1:
|
||
dec al! shl bx,1! jb acc_drv2
|
||
acc_drv15:
|
||
or al,al! jnz acc_drv1
|
||
pop ax! mov curdsk,al! ret
|
||
acc_drv2:
|
||
push ax! push bx! mov curdsk,al
|
||
call create_olist_item
|
||
pop bx! pop ax! jmps acc_drv15
|
||
acc_drv3:
|
||
jmp openx034
|
||
|
||
func39: ;free drive
|
||
|
||
test open_root,0ffffh! jnz $+3
|
||
retf39:
|
||
ret
|
||
mov incr_pdcnt,false! mov free_mode,1
|
||
mov bx,info! cmp bx,0ffffh! jnz free_drv1
|
||
mov free_mode,0! call free_files! jmp free_drv3
|
||
free_drv1:
|
||
mov al,curdsk! push ax! mov al,16
|
||
free_drv2:
|
||
dec al! shl bx,1! jb free_drv4
|
||
free_drv25:
|
||
or al,al! jnz free_drv2
|
||
pop ax! mov curdsk,al
|
||
free_drv3:
|
||
cmp incr_pdcnt,true! jnz retf39
|
||
jmp inc_pdcnt
|
||
free_drv4:
|
||
push ax! push bx! mov curdsk,al
|
||
call free_files
|
||
pop bx! pop ax! jmp free_drv25
|
||
|
||
endif
|
||
if CPM
|
||
|
||
func38 equ funcret ;access drive
|
||
func39 equ funcret ;free drive
|
||
|
||
endif
|
||
|
||
func40: ;write random with zero fill
|
||
|
||
;random disk write with zero fill of unallocated block
|
||
|
||
call parsave36r
|
||
CALL CHECK_FCB
|
||
mov seqio,2
|
||
mov cl,false
|
||
call rseek1
|
||
jz func40a
|
||
ret
|
||
func40a:
|
||
call diskwite
|
||
ret
|
||
|
||
FUNC41 EQU FUNCRET ;TEST AND WRITE
|
||
|
||
FUNC42: ;LOCK RECORD
|
||
MOV LOCK_UNLOCK,TRUE
|
||
JMP LOCK
|
||
|
||
FUNC43: ;UNLOCK RECORD
|
||
MOV LOCK_UNLOCK,FALSE
|
||
JMP LOCK
|
||
|
||
FUNC44: ;SET MULTI-SECTOR COUNT
|
||
|
||
OR DL,DL
|
||
JZ RETURN_NOT_OK
|
||
CMP DL,17
|
||
JNB RETURN_NOT_OK
|
||
MOV U_MULT_CNT,DL
|
||
RETURN_OK:
|
||
XOR CX,CX
|
||
MOV BX,CX
|
||
RET
|
||
RETURN_NOT_OK:
|
||
XOR CX,CX
|
||
MOV BX,0FFH
|
||
RET
|
||
|
||
FUNC45: ;SET BDOS ERROR MODE
|
||
|
||
MOV U_ERROR_MODE,DL
|
||
JMPS RETURN_OK
|
||
|
||
FUNC46: ;GET DISK FREE SPACE
|
||
|
||
CALL TMPSELECT ;PERFORM TEMPORARY SELECT OF
|
||
;SPECIFIED DRIVE
|
||
|
||
MOV SI,ALLOCA ;SI = ALLOCATION VECTOR ADDR
|
||
CALL GET_NALBS ;BX = # OF ALLOCATION VECTOR BYTES
|
||
XOR CX,CX ;CX = TRUE BIT COUNTER
|
||
|
||
;COUNT # OF TRUE BITS IN ALLOCATION VECTOR
|
||
|
||
GSP1: LODS AL ;INCREMENTS SI
|
||
GSP2: OR AL,AL
|
||
JZ GSP4
|
||
GSP3: SHR AL,1
|
||
JNC GSP3
|
||
INC CX
|
||
JMPS GSP2
|
||
GSP4: DEC BX
|
||
JNZ GSP1
|
||
|
||
;BX = 0 WHEN ALLOCATION VECTOR SCANNED
|
||
;COMPUTE MAXALL + 1 - BC
|
||
|
||
MOV BX,MAXALL
|
||
INC BX
|
||
SUB BX,CX ;BX = # OF AVAILABLE BLOCKS ON DRIVE
|
||
MOV CL,BLKSHF ;CONVERT # OF BLOCKS TO # OF RECORDS
|
||
XOR CH,CH
|
||
MOV AL,BH
|
||
XOR AH,AH
|
||
SHL BX,CL
|
||
SHL AX,CL ;AH,BH,BL = # OF AVAILABLE RECORDS
|
||
MOV DI,OFFSET COMMON_DMA ;STORE # OF RECORDS IN 1ST 3 BYTES
|
||
MOV [DI],BX ;OF COMMON_DMA
|
||
MOV 2[DI],AH
|
||
MOV CL,3
|
||
JMP COPY_DMA_OUT ;COPY TO USER'S DMA
|
||
|
||
FUNC47 EQU FUNCRET ;CHAIN TO PROGRAM
|
||
|
||
FUNC48: ;FLUSH BUFFERS
|
||
|
||
CALL FLUSH
|
||
JMP DIOCOMP
|
||
|
||
FUNC49 EQU FUNCRET ;??????
|
||
FUNC50 EQU FUNCRET ;DIRECT BIOS CALL
|
||
|
||
|
||
if MPM
|
||
|
||
func51: ; set dma base
|
||
|
||
mov u_dma_seg,dx
|
||
sub cx,cx ! mov bx,cx
|
||
ret
|
||
|
||
func52: ; get dma
|
||
|
||
MOV RETURN_SEG,DS
|
||
mov bx,u_dma_seg
|
||
mov u_retseg,bx
|
||
mov bx,u_dma_ofst
|
||
sub cx,cx ! ret
|
||
|
||
endif
|
||
|
||
FUNC100:
|
||
;DX -> .FCB
|
||
; DRIVE LOCATION
|
||
; NAME & TYPE FIELD'S USER'S DISCRETION
|
||
; EXTENT FIELD DEFINITION
|
||
; BIT 1 (80H): ENABLE PASSWORDS ON DRIVE
|
||
; BIT 2 (40H): ENABLE FILE ACCESS
|
||
; BIT 3 (20H): ENABLE FILE UPDATE STAMPING
|
||
; BIT 8 (01H): ASSIGN PASSWORD TO DIR LBL
|
||
MOV CL,16
|
||
CALL COPY_DMA_IN
|
||
CALL PARSAVE33
|
||
CALL RESELECTX
|
||
CALL CHECK_WRITE
|
||
MOV BX,INFO ;DOES DIR LBL EXIST ON DRIVE?
|
||
MOV B[BX],20H
|
||
MOV CL,1
|
||
MOV XDCNT,0FFFFH ;INITIALIZED FOR MAKE
|
||
CALL SEARCH
|
||
JNZ SDL1 ;YES
|
||
MOV MAKE_XFCB,0FFH ;NO - MAKE ONE
|
||
CALL MAKE
|
||
JNZ $+3
|
||
RET ;NO DIRECTORY SPACE
|
||
CALL INIT_XFCB
|
||
CALL STAMP1 ;SET CREATE DATE AND TIME STAMP
|
||
SDL1:
|
||
CALL STAMP2 ;SET UPDATE DATE AND TIME STAMP
|
||
CALL GET_XFCB1 ;VERIFY PASSWORD
|
||
CALL CHK_XFCB_PASSWORD1 ;NEW DIR LBL FALLS THROUGH
|
||
MOV CX,0
|
||
CALL INIT_XFCB0 ;UPDATE DIR LBL NAME
|
||
MOV SI,DX ;COPY USER'S DIR LBL DATA BYTE
|
||
LODS AL ;INTO DIR LBL (EX BYTE)
|
||
OR AL,1 ;SET DIR LBL EXISTS FLAG
|
||
MOV [BX],AL
|
||
MOV DI,DRVLBLA ;UPDATE DRIVES DIR LBL DATA BYTE
|
||
STOS AL
|
||
SDL2:
|
||
DEC SI ;TEST FOR ASSIGNMENT OF NEW
|
||
LODS AL ;PASSWORD TO DIR LBL OR XFCB
|
||
AND AL,1
|
||
JZ SDL3
|
||
ADD XDMAAD,8 ;ASSIGN NEW PASSWORD
|
||
CALL SET_PW
|
||
MOV [BX],CH ;SET PASSWORD CHECKSUM BYTE
|
||
SUB XDMAAD,8
|
||
SDL3:
|
||
JMP SEEK_COPY ;WRITE DIR LBL OR XFCB TO DIRECTORY
|
||
|
||
FUNC101: ;RETURN DIRECTORY LABEL DATA
|
||
CALL TMPSELECT
|
||
CALL GET_DIR_MODE
|
||
JMP STA_RET
|
||
|
||
FUNC102: ;READ FILE XFCB
|
||
CALL PARSAVE33
|
||
CALL RESELECTX
|
||
CALL CHECK_WILD
|
||
CALL GET_XFCB ;DOES XFCB EXIST FOR FILE?
|
||
MOV AL,0FFH
|
||
JNZ $+5
|
||
JMP STA_RET ;NO
|
||
MOV BX,INFO ;YES - COPY XFCB TO USER'S FCB
|
||
MOV CL,NXTREC
|
||
JMP MOVE
|
||
|
||
FUNC103: ;WRITE OR UPDATE FILE XFCB
|
||
MOV CL,16
|
||
CALL COPY_DMA_IN
|
||
CALL PARSAVE33
|
||
CALL RESELECTX
|
||
CALL CHECK_WILD
|
||
MOV XDCNT,0FFFFH ;INITIALIZED FOR MAKE
|
||
CALL GET_XFCB ;DOES XFCB EXIST FOR FILE?
|
||
JNZ WXFCB1 ;YES
|
||
CALL GET_DIR_MODE ;NO - DOES DIR LBL EXIST?
|
||
OR AL,AL
|
||
MOV AL,0FFH
|
||
JNZ $+5
|
||
JMP STA_RET ;NO
|
||
MOV MAKE_XFCB,AL ;DOES FILE EXIST?
|
||
MOV CL,EXTNUM
|
||
CALL SEARCH
|
||
JNZ $+3
|
||
WXFCB0: RET ;NO
|
||
CALL MAKE ;DOES DIRECTORY SPACE EXIST FOR MAKE?
|
||
JZ WXFCB0 ;NO
|
||
CALL INIT_XFCB ;INITIALIZE XFCB
|
||
WXFCB1:
|
||
CALL CHK_XFCB_PASSWORD ;CHECK PASSWORD
|
||
MOV SI,BX
|
||
CALL GETEXTA
|
||
XCHG BX,SI
|
||
TEST B[BX],0FFH ;IS CURRENT PASSWORD MODE NON-ZERO
|
||
JNZ WXFCB2 ;YES
|
||
LODS AL ;IS USER SPECIFYING A NEW PASSWORD?
|
||
DEC SI
|
||
AND AL,1
|
||
JNZ WXFCB2 ;YES
|
||
JMP SEEK_COPY ;NO - PASSWORD MODE REMAINS ZERO
|
||
WXFCB2:
|
||
LODS AL ;ASSIGN NEW PASSWORD MODE TO XFCB
|
||
AND AL,0E0H
|
||
JNZ WXFCB3
|
||
MOV AL,80H
|
||
WXFCB3:
|
||
MOV [BX],AL
|
||
JMP SDL2 ;CHECK FOR NEW PASSWORD
|
||
|
||
FUNC104: ;SET CURRENT DATE AND TIME
|
||
MOV CL,4
|
||
CALL PARSAVE
|
||
MOV PARCOPFL,FALSE
|
||
MOV BX,OFFSET TOD
|
||
MOV CL,4
|
||
MOV DX,INFO
|
||
CALL MOVE
|
||
MOV BYTE PTR TOD+4,0
|
||
RET
|
||
|
||
FUNC105: ;GET CURRENT DATE AND TIME
|
||
|
||
MOV INFOSAVE,DX
|
||
MOV BX,OFFSET LOC_PAR_AREA
|
||
MOV INFO,BX
|
||
MOV DX,OFFSET TOD
|
||
MOV CL,4
|
||
CALL MOVE
|
||
MOV PARLG,4
|
||
JMP PARUNSAVE
|
||
|
||
FUNC106: ;SET DEFAULT PASSWORD
|
||
MOV CL,8
|
||
CALL PARSAVE
|
||
MOV PARCOPFL,FALSE
|
||
MOV BX,INFO
|
||
MOV SI,OFFSET DF_PASSWORD+7
|
||
PUSH BX
|
||
MOV CX,8
|
||
JMP SET_PW0
|
||
|
||
FUNC107 EQU FUNCRET
|
||
|
||
if MPM
|
||
|
||
GOBACK:
|
||
MOV SP,SAVESP
|
||
JMP BDOS_RETURN
|
||
|
||
endif
|
||
if CPM
|
||
|
||
goback:
|
||
;arrive here at end of processing to return to user
|
||
|
||
; cmp resel,0
|
||
; jz jpretmon
|
||
;reselection may have
|
||
;taken place
|
||
; mov bx,info
|
||
; mov b[bx],0 ;fcb(0)=0
|
||
; mov al,fcbdsk
|
||
; or al,al
|
||
; jnz goback1
|
||
;jpretmon:
|
||
; jmp retmon
|
||
;restore disk number
|
||
;goback1:
|
||
; mov [bx],al ;fcb(0)=fcbdsk
|
||
; mov al,olddsk
|
||
; mov linfo,al
|
||
; call curselect
|
||
;
|
||
; return from the disk monitor
|
||
|
||
;retmon:
|
||
; cmp parcopfl,true ;test if parameter block
|
||
; jnz retm1 ;to be copied back to user
|
||
; call parunsave
|
||
;retm1: mov ax,aret
|
||
; mov bx,ax
|
||
;retmonret:
|
||
; ret
|
||
|
||
endif
|
||
|
||
;******************* end bdos file system *************
|
||
|