summaryrefslogtreecommitdiff
path: root/v2.0/source/DIRCALL.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v2.0/source/DIRCALL.ASM')
-rw-r--r--v2.0/source/DIRCALL.ASM507
1 files changed, 507 insertions, 0 deletions
diff --git a/v2.0/source/DIRCALL.ASM b/v2.0/source/DIRCALL.ASM
new file mode 100644
index 0000000..db55ab8
--- /dev/null
+++ b/v2.0/source/DIRCALL.ASM
@@ -0,0 +1,507 @@
1TITLE DIRCALL - Directory manipulation internal calls
2NAME DIRCALL
3
4; $MKDIR
5; $CHDIR
6; $RMDIR
7
8.xlist
9INCLUDE DOSSEG.ASM
10
11CODE SEGMENT BYTE PUBLIC 'CODE'
12 ASSUME SS:DOSGROUP,CS:DOSGROUP
13
14.xcref
15INCLUDE DOSSYM.ASM
16INCLUDE DEVSYM.ASM
17.cref
18.list
19
20ifndef Kanji
21Kanji equ 0
22endif
23
24 i_need AUXSTACK,BYTE
25 i_need NoSetDir,BYTE
26 i_need CURBUF, DWORD
27 i_need DIRSTART,WORD
28 i_need THISDPB,DWORD
29 i_need NAME1,BYTE
30 i_need LASTENT,WORD
31 i_need ATTRIB,BYTE
32 i_need THISFCB,DWORD
33 i_need AUXSTACK,BYTE
34 i_need CREATING,BYTE
35 i_need DRIVESPEC,BYTE
36 i_need ROOTSTART,BYTE
37 i_need SWITCH_CHARACTER,BYTE
38
39 extrn sys_ret_ok:near,sys_ret_err:near
40
41
42; XENIX CALLS
43BREAK <$MkDir - Make a directory entry>
44MKNERRJ: JMP MKNERR
45NODEEXISTSJ: JMP NODEEXISTS
46 procedure $MKDIR,NEAR
47ASSUME DS:NOTHING,ES:NOTHING
48
49; Inputs:
50; DS:DX Points to asciz name
51; Function:
52; Make a new directory
53; Returns:
54; STD XENIX Return
55; AX = mkdir_path_not_found if path bad
56; AX = mkdir_access_denied If
57; Directory cannot be created
58; Node already exists
59; Device name given
60; Disk or directory(root) full
61 invoke validate_path
62 JC MKNERRJ
63 MOV SI,DX
64 MOV WORD PTR [THISFCB+2],SS
65 MOV WORD PTR [THISFCB],OFFSET DOSGROUP:AUXSTACK-40 ; Scratch space
66 MOV AL,attr_directory
67 MOV WORD PTR [CREATING],0E500h
68 invoke MAKENODE
69ASSUME DS:DOSGROUP
70 MOV AL,mkdir_path_not_found
71 JC MKNERRJ
72 JNZ NODEEXISTSJ
73 LDS DI,[CURBUF]
74ASSUME DS:NOTHING
75 SUB SI,DI
76 PUSH SI ; Pointer to fcb_FIRCLUS
77 PUSH [DI.BUFSECNO] ; Sector of new node
78 PUSH SS
79 POP DS
80ASSUME DS:DOSGROUP
81 PUSH [DIRSTART] ; Parent for .. entry
82 XOR AX,AX
83 MOV [DIRSTART],AX ; Null directory
84 invoke NEWDIR
85 JC NODEEXISTSPOPDEL ; No room
86 invoke GETENT ; First entry
87 LES DI,[CURBUF]
88 MOV ES:[DI.BUFDIRTY],1
89 ADD DI,BUFINSIZ ; Point at buffer
90 MOV AX,202EH ; ". "
91 STOSW
92 MOV DX,[DIRSTART] ; Point at itself
93 invoke SETDOTENT
94 MOV AX,2E2EH ; ".."
95 STOSW
96 POP DX ; Parent
97 invoke SETDOTENT
98 LES BP,[THISDPB]
99 POP DX ; Entry sector
100 XOR AL,AL ; Pre read
101 invoke GETBUFFR
102 MOV DX,[DIRSTART]
103 LDS DI,[CURBUF]
104ASSUME DS:NOTHING
105ZAPENT:
106 POP SI ; fcb_Firclus pointer
107 ADD SI,DI
108 MOV [SI],DX
109 XOR DX,DX
110 MOV [SI+2],DX
111 MOV [SI+4],DX
112DIRUP:
113 MOV [DI.BUFDIRTY],1
114 PUSH SS
115 POP DS
116ASSUME DS:DOSGROUP
117 MOV AL,ES:[BP.dpb_drive]
118 invoke FLUSHBUF
119SYS_RET_OKJ:
120 JMP SYS_RET_OK
121
122NODEEXISTSPOPDEL:
123 POP DX ; Parent
124 POP DX ; Entry sector
125 LES BP,[THISDPB]
126 XOR AL,AL ; Pre read
127 invoke GETBUFFR
128 LDS DI,[CURBUF]
129ASSUME DS:NOTHING
130 POP SI ; dir_first pointer
131 ADD SI,DI
132 SUB SI,dir_first ; Point back to start of dir entry
133 MOV BYTE PTR [SI],0E5H ; Free the entry
134 CALL DIRUP
135NODEEXISTS:
136 MOV AL,mkdir_access_denied
137MKNERR:
138 JMP SYS_RET_ERR
139$MKDIR ENDP
140
141BREAK <$ChDir -- Change current directory on a drive>
142 procedure $CHDIR,NEAR
143ASSUME DS:NOTHING,ES:NOTHING
144
145; Inputs:
146; DS:DX Points to asciz name
147; Function:
148; Change current directory
149; Returns:
150; STD XENIX Return
151; AX = chdir_path_not_found if error
152
153 invoke validate_path
154 JC PathTooLong
155
156 PUSH DS
157 PUSH DX
158 MOV SI,DX
159 invoke GETPATH
160 JC PATHNOGOOD
161 JNZ PATHNOGOOD
162ASSUME DS:DOSGROUP
163 MOV AX,[DIRSTART]
164 MOV BX,AX
165 XCHG BX,ES:[BP.dpb_current_dir]
166 OR AX,AX
167 POP SI
168 POP DS
169ASSUME DS:NOTHING
170 JZ SYS_RET_OKJ
171 MOV DI,BP
172 ADD DI,dpb_dir_text
173 MOV DX,DI
174 CMP [DRIVESPEC],0
175 JZ NODRIVESPEC
176 INC SI
177 INC SI
178NODRIVESPEC:
179 MOV CX,SI
180 CMP [ROOTSTART],0
181 JZ NOTROOTPATH
182 INC SI
183 INC CX
184 JMP SHORT COPYTHESTRINGBXZ
185NOTROOTPATH:
186 OR BX,BX ; Previous path root?
187 JZ COPYTHESTRING ; Yes
188 XOR BX,BX
189ENDLOOP:
190 CMP BYTE PTR ES:[DI],0
191 JZ PATHEND
192 INC DI
193 INC BX
194 JMP SHORT ENDLOOP
195PATHEND:
196 MOV AL,'/'
197 CMP AL,[switch_character]
198 JNZ SLASHOK
199 MOV AL,'\' ; Use the alternate character
200SLASHOK:
201 STOSB
202 INC BX
203 JMP SHORT CHECK_LEN
204
205PATHNOGOOD:
206 POP AX
207 POP AX
208PATHTOOLONG:
209 error error_path_not_found
210
211ASSUME DS:NOTHING
212
213INCBXCHK:
214 INC BX
215BXCHK:
216 CMP BX,DIRSTRLEN
217 return
218
219COPYTHESTRINGBXZ:
220 XOR BX,BX
221COPYTHESTRING:
222 LODSB
223 OR AL,AL
224
225 JNZ FOOB
226 JMP CPSTDONE
227FOOB:
228 CMP AL,'.'
229 JZ SEEDOT
230 CALL COPYELEM
231CHECK_LEN:
232 CMP BX,DIRSTRLEN
233 JB COPYTHESTRING
234 MOV AL,ES:[DI-1]
235 invoke PATHCHRCMP
236 JNZ OK_DI
237 DEC DI
238OK_DI:
239 XOR AL,AL
240 STOSB ; Correctly terminate the path
241 MOV ES:[BP.dpb_current_dir],-1 ; Force re-validation
242 JMP SHORT PATHTOOLONG
243
244SEEDOT:
245 LODSB
246 OR AL,AL ; Check for null
247 JZ CPSTDONEDEC
248 CMP AL,'.'
249 JNZ COPYTHESTRING ; eat ./
250 CALL DELELMES ; have ..
251 LODSB ; eat the /
252 OR AL,AL ; Check for null
253 JZ CPSTDONEDEC
254 JMP SHORT COPYTHESTRING
255
256; Copy one element from DS:SI to ES:DI include trailing / not trailing null
257; LODSB has already been done
258COPYELEM:
259 PUSH DI ; Save in case too long
260 PUSH CX
261 MOV CX,800h ; length of filename
262 MOV AH,'.' ; char to stop on
263 CALL CopyPiece ; go for it!
264 CALL BXCHK ; did we go over?
265 JAE POPCXDI ; yep, go home
266 CMP AH,AL ; did we stop on .?
267 JZ CopyExt ; yes, go copy ext
268 OR AL,AL ; did we end on nul?
269 JZ DECSIRet ; yes, bye
270CopyPathEnd:
271 STOSB ; save the path char
272 CALL INCBXCHK ; was there room for it?
273 JAE POPCXDI ; Nope
274 INC SI ; guard against following dec
275DECSIRET:
276 DEC SI ; point back at null
277 POP CX
278 POP AX ; toss away saved DI
279 return
280POPCXDI:
281 POP CX ; restore
282 POP DI ; point back...
283 return
284CopyExt:
285 STOSB ; save the dot
286 CALL INCBXCHK ; room?
287 JAE POPCXDI ; nope.
288 LODSB ; get next char
289 XOR AH,AH ; NUL here
290 MOV CX,300h ; at most 3 chars
291 CALL CopyPiece ; go copy it
292 CALL BXCHK ; did we go over
293 JAE POPCXDI ; yep
294 OR AL,AL ; sucessful end?
295 JZ DECSIRET ; yes
296 JMP CopyPathEnd ; go stash path char
297
298DELELMES:
299; Delete one path element from ES:DI
300 DEC DI ; the '/'
301 DEC BX
302
303 IF KANJI
304 PUSH AX
305 PUSH CX
306 PUSH DI
307 PUSH DX
308 MOV CX,DI
309 MOV DI,DX
310DELLOOP:
311 CMP DI,CX
312 JZ GOTDELE
313 MOV AL,ES:[DI]
314 INC DI
315 invoke TESTKANJ
316 JZ NOTKANJ11
317 INC DI
318 JMP DELLOOP
319
320NOTKANJ11:
321 invoke PATHCHRCMP
322 JNZ DELLOOP
323 MOV DX,DI ; Point to char after '/'
324 JMP DELLOOP
325
326GOTDELE:
327 MOV DI,DX
328 POP DX
329 POP AX ; Initial DI
330 SUB AX,DI ; Distance moved
331 SUB BX,AX ; Set correct BX
332 POP CX
333 POP AX
334 return
335 ELSE
336DELLOOP:
337 CMP DI,DX
338 retz
339 PUSH AX
340 MOV AL,ES:[DI-1]
341 invoke PATHCHRCMP
342 POP AX
343 retz
344 DEC DI
345 DEC BX
346 JMP SHORT DELLOOP
347 ENDIF
348
349CPSTDONEDEC:
350 DEC DI ; Back up over trailing /
351CPSTDONE:
352 STOSB ; The NUL
353 JMP SYS_RET_OK
354
355; copy a piece CH chars max until the char in AH (or path or NUL)
356CopyPiece:
357 STOSB ; store the character
358 INC CL ; moved a byte
359 CALL INCBXCHK ; room enough?
360 JAE CopyPieceRet ; no, pop CX and DI
361 OR AL,AL ; end of string?
362 JZ CopyPieceRet ; yes, dec si and return
363
364 IF KANJI
365 CALL TestKanj ; was it kanji?
366 JZ NotKanj ; nope
367 MOVSB ; move the next byte
368 CALL INCBXCHK ; room for it?
369 JAE CopyPieceRet ; nope
370 INC CL ; moved a byte
371NotKanj:
372 ENDIF
373
374 CMP CL,CH ; move too many?
375 JBE CopyPieceNext ; nope
376
377 IF KANJI
378 CALL TestKanj ; was the last byte kanji
379 JZ NotKanj2 ; no only single byte backup
380 DEC DI ; back up a char
381 DEC BX
382NotKanj2:
383 ENDIF
384
385 DEC DI ; back up a char
386 DEC BX
387CopyPieceNext:
388 LODSB ; get next character
389 invoke PathChrCmp ; end of road?
390 JZ CopyPieceRet ; yep, return and don't dec SI
391 CMP AL,AH ; end of filename?
392 JNZ CopyPiece ; go do name
393CopyPieceRet:
394 return ; bye!
395
396$CHDIR ENDP
397
398BREAK <$RmDir -- Remove a directory>
399NOPATHJ: JMP NOPATH
400
401 procedure $RMDIR,NEAR ; System call 47
402ASSUME DS:NOTHING,ES:NOTHING
403
404; Inputs:
405; DS:DX Points to asciz name
406; Function:
407; Delete directory if empty
408; Returns:
409; STD XENIX Return
410; AX = rmdir_path_not_found If path bad
411; AX = rmdir_access_denied If
412; Directory not empty
413; Path not directory
414; Root directory specified
415; Directory malformed (. and .. not first two entries)
416; AX = rmdir_current_directory
417
418 invoke Validate_path
419 JC NoPathJ
420 MOV SI,DX
421 invoke GETPATH
422 JC NOPATHJ
423ASSUME DS:DOSGROUP
424 JNZ NOTDIRPATH
425 MOV DI,[DIRSTART]
426 OR DI,DI
427 JZ NOTDIRPATH
428 MOV CX,ES:[BP.dpb_current_dir]
429 CMP CX,-1
430 JNZ rmdir_current_dir_check
431 invoke GetCurrDir
432 invoke Get_user_stack
433 MOV DX,[SI.user_DX]
434 MOV DS,[SI.user_DS]
435 JMP $RMDIR
436
437NOTDIRPATHPOP:
438 POP AX
439 POP AX
440NOTDIRPATH:
441 error error_access_denied
442
443rmdir_current_dir_check:
444 CMP DI,CX
445 JNZ rmdir_get_buf
446 error error_current_directory
447
448rmdir_get_buf:
449 LDS DI,[CURBUF]
450ASSUME DS:NOTHING
451 SUB BX,DI
452 PUSH BX ; Save entry pointer
453 PUSH [DI.BUFSECNO] ; Save sector number
454 PUSH SS
455 POP DS
456ASSUME DS:DOSGROUP
457 PUSH SS
458 POP ES
459 MOV DI,OFFSET DOSGROUP:NAME1
460 MOV AL,'?'
461 MOV CX,11
462 REP STOSB
463 XOR AL,AL
464 STOSB
465 invoke STARTSRCH
466 invoke GETENTRY
467 MOV DS,WORD PTR [CURBUF+2]
468ASSUME DS:NOTHING
469 MOV SI,BX
470 LODSW
471 CMP AX,(' ' SHL 8) OR '.'
472 JNZ NOTDIRPATHPOP
473 ADD SI,32-2
474 LODSW
475 CMP AX,('.' SHL 8) OR '.'
476 JNZ NOTDIRPATHPOP
477 PUSH SS
478 POP DS
479ASSUME DS:DOSGROUP
480 MOV [LASTENT],2 ; Skip . and ..
481 invoke GETENTRY
482 MOV [ATTRIB],attr_directory+attr_hidden+attr_system
483 invoke SRCH
484 JNC NOTDIRPATHPOP
485 LES BP,[THISDPB]
486 MOV BX,[DIRSTART]
487 invoke RELEASE
488 POP DX
489 XOR AL,AL
490 invoke GETBUFFR
491 LDS DI,[CURBUF]
492ASSUME DS:NOTHING
493 POP BX
494 ADD BX,DI
495 MOV BYTE PTR [BX],0E5H ; Free the entry
496 JMP DIRUP
497
498NOPATH:
499 error error_path_not_found
500
501$RMDIR ENDP
502
503 do_ext
504
505CODE ENDS
506 END
507