DISK.A86
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:31k
源码类别:

操作系统开发

开发平台:

Asm

  1. ;    File              : $DISK.A86$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;    DISK.A86 1.26 94/12/01 10:05:21
  33. ;    added attribute support for open/move/unlink during server call
  34. ;    DISK.A86 1.24 93/11/16 13:46:21
  35. ;    Generate critical error on int21/36 (get free space)
  36. ;    DISK.A86 1.23 93/10/25 21:58:02
  37. ;    Tighten up error checks on int21/6C modes (DL bits 0-3 = 3 rejected)
  38. ;    DISK.A86 1.22 93/10/18 17:40:51
  39. ;    fix for >255 open files (PNW Server)
  40. ;    DISK.A86 1.21 93/09/03 20:28:02
  41. ;    Add "no critical errors" support (int 21/6C)
  42. ;    DISK.A86 1.20 93/08/04 15:15:15
  43. ;    Int21/6C allows DH=1 
  44. ;    DISK.A86 1.19 93/07/22 20:32:12 
  45. ;    don't check AL on int 21/6c
  46. ;    DISK.A86 1.18 93/07/22 19:28:02
  47. ;    correct bug in extended open/create
  48. ;    DISK.A86 1.15 93/06/23 04:05:38
  49. ;    more int21/6C - we still need no critical errors support
  50. ;    DISK.A86 1.14 93/06/23 03:00:27
  51. ;    fix bug in int21/6C
  52. ;    DISK.A86 1.13 93/05/07 15:09:29
  53. ;    Move delwatch free space adjust call inside the MXDisk
  54. ;    DISK.A86 1.12 93/03/16 22:33:49
  55. ;    UNDELETE support changes
  56. ;    DISK.A86 1.11 93/03/05 18:10:55
  57. ;    Add UNDELETE definition
  58. ;    ENDLOG
  59. ;
  60. ; All FCB based PCMODE functions are translated to FDOS function
  61. ; calls in this file.
  62. ;
  63. ; 22 May 87 Support the extended CHMOD function to get/set the
  64. ;           password mode.
  65. ; 28 May 87 Support the Update Handle Count Function
  66. ;  5 Nov 87 Remove MAJOR_VER reference from func0D
  67. ; 15 Mar 88 Return Attributes in CX and AX
  68. ;  3 May 88 Return correct disk size from functions 1B, 1C and 36
  69. ; 17 May 88 Add valid drive check routine used by FUNC29 and FUNC4B
  70. ; 30 Jun 88 Call FDOS to build DDSC for INT21/53
  71. ; 18 Aug 88 FUNC67 correctly fill new handle table with 0FFh
  72. ;           Sorcim ACCPAC Plus
  73. ; 27 Sep 88 Return error codes from Read and Write Random.
  74. ; 19 Feb 89 Allowing SHARE to be disabled with DR DOS
  75. ; 16 May 89 Include Random Record field on func23 (file size)
  76. ; 23 May 89 func3F (Read) now allows Ignore on errors (CopyIIpc)
  77. ; 11 Sep 89 MSNET Flush hook added
  78. ; 20 Sep 89 func3B "d:=" form fills in LDT (func4B support)
  79. ; 24 Oct 89 func32 (getdpb) sets top bit of drive on fdos_getdpb
  80. ;           to indicate free space count not required
  81. ; 27 Oct 89 mutilate the code to save space
  82. ; 24 Jan 90 valid_drive uses dos_entry, doesn't peek at HDS's
  83. ;  8 Feb 90 func_43 updated for new password support
  84. ; 27 Feb 90 func57 gives ED_FUNCTION if not get/set (HEADROOM bug)
  85. ;  7 Mar 90 Convert to register preserved function calls
  86. ; 14 Mar 90 Share func3D_mask bodge move to FDOS
  87. ; 28 Sep 90 Return sectors xfered on Int21/27 even if error (CALC.EXE>64k)
  88. ; 14 mar 91 add delwatch hook to func36 (disk free space)
  89. ; 14 jun 91 correct error codes from func3F during func4B
  90. ;  8 aug 91 func3B (chdir) now maintains LDT name for all cases
  91. ;  1 oct 91  Valdivar it
  92. ; 27 feb 92 func3E returns previous open count
  93. ;  3 mar 92 fill in default search attribute in Func3D for future
  94. ; 23 mar 92 func67 will now shrink #handles
  95. ;
  96. include pcmode.equ
  97. include fdos.def
  98. include i:doshndl.def
  99. include i:fdos.equ
  100. include i:psp.def
  101. include i:msdos.equ
  102. include i:mserror.equ
  103. include i:redir.equ
  104. FCB_LEN equ 32
  105. XFCB_LEN equ FCB_LEN+7
  106. PCM_CODE CSEG BYTE
  107. extrn dbcs_lead:near
  108. extrn dos_entry:near
  109. extrn fdos_nocrit:near
  110. extrn fdos_crit:near, fdos_ax_crit:near
  111. extrn fcbfdos_crit:near
  112. extrn set_retry:near
  113. extrn set_retry_RF:near
  114. extrn error_exit:near
  115. extrn error_ret:near
  116. extrn fcberror_exit:near
  117. extrn reload_registers:near
  118. extrn reload_ES:near
  119. extrn return_AX_CLC:near
  120. extrn return_BX:near
  121. extrn return_CX:near
  122. extrn return_DX:near
  123. ; *****************************
  124. ; ***    DOS Function 0D    ***
  125. ; ***      Disk Reset       ***
  126. ; *****************************
  127. ;
  128. Public func0D
  129. func0D:
  130. mov FD_FUNC,FD_FLUSH
  131. call fdos_nocrit ; flush buffers
  132. mov ax,0FFFFh
  133. push ax
  134. mov ax,I2F_FLUSH
  135. int 2fh ; magic INT2F flush remote buffers
  136. pop ax
  137. push ss ! pop ds
  138. ret
  139. ; *****************************
  140. ; ***    DOS Function 0E    ***
  141. ; ***      Select Disk      ***
  142. ; *****************************
  143. ;
  144. Public func0E
  145. func0E:
  146. ;
  147. ; Entry:
  148. ; DL  == drive to set as default (0 == A:)
  149. ; Exit:
  150. ; AL  ==  Number of Drives in System (from SYSDAT)
  151. ;
  152. mov FD_FUNC,FD_SELECT
  153. xchg ax,dx ; drive in AL
  154. cbw ; make that AX
  155. mov FD_DRIVE,ax
  156. call fdos_nocrit ; ask the FDOS to try to select it
  157. mov al,last_drv ; Return the number of valid drives
  158. ret
  159. ;
  160. ; Return with the ZERO flag set if the drive passed in AL is
  161. ; valid. This function is used to set the initial AX value
  162. ; when a program is loaded.
  163. ;
  164. ; On Entry:- AL 00   - Default Drive
  165. ; 01 to 26 - A: to Z:
  166. ;
  167. ; On Exit:- ZF If AL referenced a valid drive
  168. ;
  169. Public valid_drive
  170. valid_drive:
  171. push dx
  172. mov dl,al ; get drive in DL
  173. dec dl ; make drive zero based
  174.  js valid_drive10 ; if current drive always OK
  175. mov ah,MS_DRV_GET
  176. call dos_entry ; get current drive
  177. push ax ; save for later
  178. mov ah,MS_DRV_SET
  179. call dos_entry ; try and select new drive
  180. mov ah,MS_DRV_GET ;  if we can select it
  181. call dos_entry ;  then it's valid
  182. sub al,dl ; AL = 0 if drive valid
  183. pop dx ; recover old drive
  184. push ax ; save result
  185. mov ah,MS_DRV_SET
  186. call dos_entry ; reset to original drive
  187. pop ax ; recover result
  188. valid_drive10:
  189. pop dx
  190. test al,al ; set ZF if valid drive
  191. ret
  192. eject
  193. ; *****************************
  194. ; ***    DOS Function 0F    ***
  195. ; ***    Open File (FCB)    ***
  196. ; *****************************
  197. ;
  198. Public func0F
  199. func0F:
  200. ; *****************************
  201. ; ***    DOS Function 10    ***
  202. ; ***    Close File (FCB)   ***
  203. ; *****************************
  204. ;
  205. Public func10
  206. func10:
  207. ; *****************************
  208. ; ***    DOS Function 11    ***
  209. ; ***   Search First (FCB)  ***
  210. ; *****************************
  211. ;
  212. Public func11
  213. func11:
  214. ; *****************************
  215. ; ***    DOS Function 12    ***
  216. ; ***   Search Next (FCB)   ***
  217. ; *****************************
  218. ;
  219. Public func12
  220. func12:
  221. ; *****************************
  222. ; ***    DOS Function 13    ***
  223. ; ***   Delete File (FCB)   ***
  224. ; *****************************
  225. ;
  226. Public func13
  227. func13:
  228. ; *****************************
  229. ; ***    DOS Function 14    ***
  230. ; *** Sequential Read (FCB) ***
  231. ; *****************************
  232. ;
  233. Public func14
  234. func14:
  235. ; *****************************
  236. ; ***    DOS Function 15    ***
  237. ; *** Sequential Write (FCB)***
  238. ; *****************************
  239. ;
  240. Public func15
  241. func15:
  242. ; *****************************
  243. ; ***    DOS Function 16    ***
  244. ; ***   Create File (FCB)   ***
  245. ; *****************************
  246. ;
  247. Public func16
  248. func16:
  249. ; *****************************
  250. ; ***    DOS Function 17    ***
  251. ; ***   Rename File (FCB)   ***
  252. ; *****************************
  253. ;
  254. Public func17
  255. func17:
  256. ; *****************************
  257. ; ***    DOS Function 21    ***
  258. ; ***   Random Read (FCB)   ***
  259. ; *****************************
  260. ;
  261. Public func21
  262. func21:
  263. ; *****************************
  264. ; ***    DOS Function 22    ***
  265. ; ***   Random Write (FCB)  ***
  266. ; *****************************
  267. ;
  268. Public func22
  269. func22:
  270. ; *****************************
  271. ; ***    DOS Function 23    ***
  272. ; ***    File Size (FCB)    ***
  273. ; *****************************
  274. ;
  275. Public func23
  276. func23:
  277. ; *****************************
  278. ; ***    DOS Function 24    ***
  279. ; ***  Set Relative Record  ***
  280. ; *****************************
  281. ;
  282. Public func24
  283. func24:
  284. ; *****************************
  285. ; ***    DOS Function 27    ***
  286. ; ***   Random Block Read   ***
  287. ; *****************************
  288. ;
  289. Public func27
  290. func27:
  291. ; *****************************
  292. ; ***    DOS Function 28    ***
  293. ; ***   Random Block Write  ***
  294. ; *****************************
  295. ;
  296. Public func28
  297. func28:
  298. ; All FCB function come through here
  299. call set_retry_RF ; Valid to RETRY or FAIL
  300. mov ax,FD_FCB ; FCB file function
  301. xchg ax,FD_FUNC ; recover function number
  302. mov FD_FCBFUNC,ax ; pass FCB function number
  303. mov FD_FCBOFF,dx ; Initialise the FCB Pointer
  304. mov FD_FCBSEG,es
  305. mov FD_FCBCNT,cx ; we may need record count
  306. call fcbfdos_crit ; Execute the function
  307.  jc fcb_error ; Check for an Error
  308. mov cx,FD_FCBCNT ; Get the number of records
  309. jmp return_CX ; processed and return in CX
  310. fcb_error:
  311. jmp fcberror_exit ; Use default Error handler
  312. eject
  313. ; *****************************
  314. ; ***    DOS Function 19    ***
  315. ; ***      Current Disk     ***
  316. ; *****************************
  317. Public func19
  318. func19:
  319. mov al,current_dsk ; Get the current logical disk
  320. ret ; and return
  321. ; *****************************
  322. ; ***    DOS Function 1A    ***
  323. ; ***   Set Disk Trans Adr  ***
  324. ; *****************************
  325. Public func1A
  326. func1A:
  327. mov dma_offset,dx ; set the PCMODE DMA Offset
  328. mov dma_segment,es ;  and then the DMA Segment
  329. ret
  330. ; *****************************
  331. ; ***    DOS Function 1B    ***
  332. ; ***    Def. Disk Info     ***
  333. ; *****************************
  334. ;
  335. Public func1B
  336. func1B:
  337. ; *****************************
  338. ; ***    DOS Function 1C    ***
  339. ; ***    Sel. Disk Info     ***
  340. ; *****************************
  341. ;
  342. Public func1C
  343. func1C:
  344. call set_retry_RF ; Valid to RETRY or FAIL
  345. xor dh,dh ; Pass the drive requested
  346. call fdos_DISKINFO ; find out about drive
  347.  jc fdos_DI_error
  348. mov cx,es:DDSC_SECSIZE[bx] ; Get the Physical Sector Size
  349. call return_CX ; in bytes
  350. mov dx,es:DDSC_NCLSTRS[bx] ; Convert the last cluster no
  351. dec dx ; returned in DDSC to maximum
  352. call return_DX ; number of clusters and return
  353. mov al,es:DDSC_CLMSK[bx] ; get (sectors per cluster)-1
  354. inc ax ; return sectors per cluster
  355. lea bx,DDSC_MEDIA[bx] ; return address of media byte
  356. f1B1C1F32_common:
  357. push ds
  358. lds di,int21regs_ptr
  359. mov reg_DS[di],es
  360. mov reg_BX[di],bx
  361. pop ds
  362. ret
  363. ; *****************************
  364. ; ***    DOS Function 1F    ***
  365. ; ***    Get Default DPB    ***
  366. ; *****************************
  367. ;
  368. Public func1F
  369. func1F:
  370. ; *****************************
  371. ; ***    DOS Function 32    ***
  372. ; ***   Get Requested DPB   ***
  373. ; *****************************
  374. ;
  375. Public func32
  376. func32:
  377. call set_retry_RF ; Valid to RETRY or FAIL
  378. mov dh,80h ; set top bit - free space not needed
  379. call fdos_DISKINFO ; and make the function call
  380.  jnc f1B1C1F32_common ; exit using common code
  381. fdos_DI_error:
  382. jmp fcberror_exit ; exit thru FCB error
  383. ; *****************************
  384. ; ***    DOS Function 36    ***
  385. ; ***    Disk Free Space    ***
  386. ; *****************************
  387. ;
  388. Public func36
  389. func36:
  390. call set_retry_RF ; Valid to RETRY or FAIL
  391. xor dh,dh ; clear out DH
  392. call fdos_DISKINFO ; find out about drive
  393.  jnc f36_OK ; CY set if we had a problem
  394. push es
  395. push bx
  396. call error_exit ; generate a critical error
  397. pop bx
  398. pop es
  399. mov ax,0FFFFh ; Invalid Drive Return 0FFFFh
  400.  jc f36_exit ; No Carry
  401. f36_OK:
  402. mov cx,es:DDSC_SECSIZE[bx] ; Get the Physical Sector Size
  403. call return_CX ; in bytes
  404. mov dx,es:DDSC_NCLSTRS[bx] ; Convert the last cluster no
  405. dec dx ; returned in DDSC to maximum
  406. call return_DX ; number of clusters
  407. mov cx,es:DDSC_FREE[bx] ; get number of free clusters
  408. if DELWATCH
  409. add cx,FD_ADJUST ; now add in DELWATCH adjustment
  410. endif
  411. xor ax,ax
  412. mov al,es:DDSC_CLMSK[bx] ; get the sectors per cluster -1
  413. inc ax ; AX = sectors per cluster
  414. mov bx,cx
  415. call return_BX ; return free clusters
  416. f36_exit:
  417. jmp return_AX_CLC
  418. fdos_DISKINFO:
  419. ;-------------
  420. ; Called by func1B, func1C, func1F, func32, func36
  421. ; Even number functions have drive in DL
  422. ; Odd numbered function use default drive (0)
  423. mov ax,FD_DISKINFO ; get information about drive
  424. xchg ax,FD_FUNC ; while getting orginal function #
  425. test al,1 ; is it func1B/func1F ?
  426.  jz fdos_DI10 ; if so these use the default
  427. xor dl,dl ;  drive so zero DL
  428. fdos_DI10:
  429. mov FD_DRIVE,dx ; drive in DX
  430. call fdos_crit
  431. les bx,FD_DPB ; get the DPB pointer
  432. ret
  433. eject
  434. ; *****************************
  435. ; ***    DOS Function 2F    ***
  436. ; ***   Get Disk Trans Adr  ***
  437. ; *****************************
  438. Public func2F
  439. func2F:
  440. les bx,dword ptr dma_offset ; current dma address
  441. push ds
  442. lds di,int21regs_ptr
  443. mov reg_ES[di],es
  444. mov reg_BX[di],bx
  445. pop ds
  446. ret
  447. eject
  448. ; *****************************
  449. ; ***    DOS Function 41    ***
  450. ; ***    Delete File(s)     ***
  451. ; *****************************
  452. ;
  453. Public func41
  454. func41:
  455. cmp ss:remote_call,0
  456.  jne fdos_common41
  457. mov cl,06h
  458. ; *****************************
  459. ; ***    DOS Function 39    ***
  460. ; ***  Create SubDirectory  ***
  461. ; *****************************
  462. ;
  463. Public func39
  464. func39:
  465. ; *****************************
  466. ; ***    DOS Function 3A    ***
  467. ; ***  Delete SubDirectory  ***
  468. ; *****************************
  469. ;
  470. Public func3A
  471. func3A:
  472. ; *****************************
  473. ; ***    DOS Function 3B    ***
  474. ; ***  Change SubDirectory  ***
  475. ; *****************************
  476. ;
  477. Public func3B
  478. func3B:
  479. ; *****************************
  480. ; ***    DOS Function 4E    ***
  481. ; ***    Find First File    ***
  482. ; ***    DOS Function 4F    ***
  483. ; ***    Find Next File     ***
  484. ; *****************************
  485. ;
  486. Public func4E
  487. func4E:
  488. Public func4F
  489. func4F:
  490. ; Func 4F has no parameters, but using the same routine saves code
  491. fdos_common41:
  492. call set_retry_RF ; Valid to RETRY or FAIL
  493. ; jmps fdos_name
  494. fdos_name:
  495. mov FD_NAMEOFF,dx ; Initialise Pointer
  496. mov FD_NAMESEG,es
  497. mov FD_ATTRIB,cx ; and attributes
  498. jmp fdos_ax_crit
  499. eject
  500. ; *****************************
  501. ; ***    DOS Function 5B    ***
  502. ; ***   Create New File     ***
  503. ; *****************************
  504. ;
  505. Public func5B
  506. func5B:
  507. ; *****************************
  508. ; ***    DOS Function 3C    ***
  509. ; ***     Create a File     ***
  510. ; *****************************
  511. ;
  512. Public func3C
  513. func3C:
  514. call set_retry_RF ; Valid to RETRY or FAIL
  515. cmp FD_FUNC,MS_X_CREAT ; is it a standard create ?
  516.  je f3C_10
  517. mov FD_FUNC,FD_NEW ; no, create a new file
  518. f3C_10:
  519. mov FD_MODE,DHM_RW ; create as read/write
  520. jmps fdos_name ; go do it
  521. ; *****************************
  522. ; ***    DOS Function 3D    ***
  523. ; ***      Open a File      ***
  524. ; *****************************
  525. ;
  526. Public func3D
  527. func3D:
  528. call set_retry_RF ; Valid to RETRY or FAIL
  529. cmp ss:remote_call,0
  530.  jne funcExtendedOpenCreate
  531. mov cl,06h ; default search mode for local
  532. ; jmp funcExtendedOpenCreate ;  calls (remote it's in CL)
  533. funcExtendedOpenCreate:
  534. ; On Entry:
  535. ; FD_FUNC = function to carry out
  536. ; ES:DX -> name
  537. ; AX = open mode
  538. ; CX = file attributes
  539. ;
  540. push ax
  541. and al,DHM_SHAREMSK
  542. cmp al,DHM_DENY_NONE ; any funny share bits ?
  543. pop ax
  544.  ja open_mode_err
  545. push ax
  546. and al,DHM_RWMSK
  547. cmp al,DHM_RW ; check RW bits are valid
  548. pop ax
  549.  ja open_mode_err
  550. mov FD_MODE,ax ; Set Open Mode
  551. jmps fdos_name
  552. open_mode_err:
  553. mov ax,ED_ACC_CODE ; This is an illegal open mode
  554. jmp error_exit ;  return an error
  555. ; *****************************
  556. ; ***    DOS Function 3F    ***
  557. ; ***    Read from Handle   ***
  558. ; *****************************
  559. ;
  560. Public func3F
  561. func3F:
  562. ; *****************************
  563. ; ***    DOS Function 40    ***
  564. ; ***    Write to a Handle  ***
  565. ; *****************************
  566. ;
  567. Public func40
  568. func40:
  569. mov al,OK_RIF ; Valid to RETRY,IGNORE or FAIL
  570. call set_retry
  571. mov FD_BUFOFF,dx
  572. mov FD_BUFSEG,es
  573. mov FD_COUNT,cx
  574. call fdos_handle
  575. mov dx,FD_COUNT
  576.  jnc f40_10 ; no error, return # xfered
  577. push FD_HANDLE
  578. push dx ; an error, try critical error
  579. call error_exit ;  and if we get back here that
  580. pop dx ;  means we Fail/Ignore it
  581. pop bx
  582.  jc f40_20 ; are we returning an error ?
  583. push dx ; no, we are ignoring it
  584. xor cx,cx ;  CX:DX offset to skip
  585. mov ax,(MS_X_LSEEK*256)+1 ;  seek to current+offset
  586.     call    dos_entry           
  587. pop dx ; finally return # we wanted
  588. f40_10: ;  to xfer
  589. xchg ax,dx ; AX = return code
  590. jmp return_AX_CLC
  591. f40_20:
  592. ret
  593. ; *****************************
  594. ; ***    DOS Function 42    ***
  595. ; ***    Move R/W Pointer   ***
  596. ; *****************************
  597. ;
  598. Public func42
  599. func42:
  600. call set_retry_RF ; Valid to RETRY or FAIL
  601. mov word ptr FD_OFFSET+0,dx
  602. mov word ptr FD_OFFSET+2,cx
  603. mov FD_METHOD,ax
  604. call fdos_handle
  605.  jc f42_error ; Do not return the current
  606. mov ax,word ptr FD_OFFSET+0 ; file position if
  607. mov dx,word ptr FD_OFFSET+2 ; an error occurs
  608. call return_DX
  609. jmp return_AX_CLC
  610. f42_error:
  611. jmp error_exit
  612. fdos_handle:
  613. mov FD_HANDLE,bx
  614. jmp fdos_crit
  615. ; *****************************
  616. ; ***    DOS Function 43    ***
  617. ; ***    Change File Mode   ***
  618. ; *****************************
  619. ;
  620. ; Concurrent Password Support:-
  621. ;
  622. ;      *WO* *GR* *OW* This is the format of the Password
  623. ; P---$RWED$RWED$RWED  mode word which is compatible with
  624. ; the FlexOS F_PROTECT field.
  625. ; *WO* World (Ignored)
  626. ; *GR* Group (Ignored) The P flag is only used to designate
  627. ; *OW* Owner (Used) that the password is being updated.
  628. ;
  629. Public func43
  630. func43:
  631. call set_retry_RF ; Valid to RETRY or FAIL
  632. mov FD_FLAG,ax ; Requested Attributes ignored
  633. call fdos_name ; if flags are not being set
  634.  jc f42_error
  635. call reload_registers ; get back AL
  636. test al,81h
  637.      jnz    f43_exit        
  638. mov cx,FD_ATTRIB
  639. call return_CX ; Return Attribs/Password
  640. xchg ax,cx ; Also in AX
  641. f43_exit:
  642. jmp return_AX_CLC
  643. ; *****************************
  644. ; ***    DOS Function 46    ***
  645. ; ***    Force Dup Handle   ***
  646. ; *****************************
  647. ;
  648. Public func46
  649. func46:
  650. xchg bx,cx ; destination handle in BX
  651. mov ah,MS_X_CLOSE ; try to close it but ignore
  652. call dos_entry ;  errors as it may be already
  653. xchg bx,cx ; now fall thru to handle func
  654. mov ah,MS_X_DUP2 ;  do do the duplicate
  655. ; *****************************
  656. ; ***    DOS Function 45    ***
  657. ; ***    Duplicate Handle   ***
  658. ; *****************************
  659. ;
  660. Public func45
  661. func45:
  662. ; *****************************
  663. ; ***    DOS Function 3E    ***
  664. ; ***      Close a File     ***
  665. ; *****************************
  666. ;
  667. Public func3E
  668. func3E:
  669. mov al,OK_FAIL
  670. call set_retry ; Valid to FAIL
  671. mov FD_NEWHND,cx ; (in case it's force dup)
  672. ; jmps fdos_ax_handle
  673. fdos_ax_handle:
  674. mov FD_HANDLE,bx
  675. jmp fdos_ax_crit
  676. ; *****************************
  677. ; ***    DOS Function 5C    ***
  678. ; ***Lock/Unlock File Access***
  679. ; *****************************
  680. ;
  681. Public func5C
  682. func5C:
  683. call set_retry_RF ; Valid to RETRY or FAIL
  684. mov FD_FUNC,FD_LOCK ; Lock/Unlock File
  685. mov word ptr FD_OFFSET+0,dx ; Lock Offset (LOW)
  686. mov word ptr FD_OFFSET+2,cx ; Lock Offset (HIGH)
  687. mov word ptr FD_LENGTH+0,di ; Lock Length (LOW)
  688. mov word ptr FD_LENGTH+2,si ; Lock Length (HIGH)
  689. mov FD_LFLAG,ax ; Lock Type
  690. jmps fdos_ax_handle
  691. ; *****************************
  692. ; ***    DOS Function 47    ***
  693. ; ***    Get Current Dir    ***
  694. ; *****************************
  695. ;
  696. Public func47
  697. func47:
  698. call set_retry_RF ; Valid to RETRY or FAIL
  699. mov FD_PATHOFF,si ; Initialise Pointer
  700. mov FD_PATHSEG,es
  701. xchg ax,dx ; drive in AL
  702. cbw ; make that AX
  703. mov FD_DRIVE,ax
  704. jmp fdos_ax_crit ; return garbage in AH (SPJ bug)
  705. ; *****************************
  706. ; ***    DOS Function 53    ***
  707. ; ***  Build DPB from BPB   ***
  708. ; *****************************
  709. ;
  710. ; This function takes the BPB at DS:SI and builds a DDSC at ES:BP
  711. ;
  712. Public func53
  713. func53:
  714. call set_retry_RF ; Valid to RETRY or FAIL
  715. mov FD_BPBOFF,si ; Segment and Offset of BPB
  716. mov FD_BPBSEG,es
  717. mov FD_DDSCOFF,bp ; Segment and Offset of DDSC
  718. call reload_ES
  719. mov FD_DDSCSEG,es
  720. jmp fdos_nocrit
  721. ;
  722. ; *****************************
  723. ; ***    DOS Function 56    ***
  724. ; ***    Rename/Move a File ***
  725. ; *****************************
  726. ;
  727. Public func56
  728. func56:
  729. call set_retry_RF ; Valid to RETRY or FAIL
  730. mov FD_NNAMEOFF,di ; New FileName
  731. push es
  732. call reload_ES ; callers ES:DI
  733. mov FD_NNAMESEG,es ; point to new filename
  734. pop es
  735. mov FD_ONAMEOFF,dx ; Old FileName
  736. mov FD_ONAMESEG,es
  737. cmp ss:remote_call,0
  738.  jne func56_10
  739. mov cl,17h
  740. func56_10:
  741. mov FD_ATTRIB,cx
  742. jmp fdos_crit
  743. ; *****************************
  744. ; ***    DOS Function 57    ***
  745. ; ***   Get/Set File Time   ***
  746. ; *****************************
  747. ;
  748. Public func57
  749. func57:
  750. call set_retry_RF ; Valid to RETRY or FAIL
  751. mov FD_DATE,dx
  752. mov FD_TIME,cx
  753. mov FD_SFLAG,ax
  754. cmp al,1 ; allow get/set only
  755. mov ax,ED_FUNCTION ; all else fails horribly
  756.  ja f57_error
  757. call fdos_handle
  758.  jc f57_error
  759.     call    reload_registers  
  760. test al,al
  761.  jnz f57_exit
  762. mov cx,FD_TIME
  763. call return_CX ; return TIME in CX
  764. mov dx,FD_DATE
  765. jmp return_DX ; and DATE in DX
  766. f57_exit:
  767. ret
  768. f57_error:
  769. jmp error_exit
  770. ; *****************************
  771. ; ***    DOS Function 5A    ***
  772. ; ***   Create Unique File  ***
  773. ; *****************************
  774. ;
  775. Public func5A
  776. func5A:
  777. mov ax,ED_ACCESS ; assume we will have an error
  778. test cx,DA_FIXED ;  because of silly attributes
  779.  jnz func5A_40 ; did we ?
  780. mov si,dx ; find end of pathname
  781. xor ax,ax ; no previous char
  782. func5A_10:
  783. xchg ax,bx ; BL = previous char
  784. lods es:al ; get next char
  785. test al,al ; is it the end of the string?
  786.  jz func5A_20
  787. call dbcs_lead ; is it a KANJI char?
  788.  jnz func5A_10
  789. inc si ; skip 2nd char of pair
  790. jmps func5A_10
  791. func5A_20:
  792. dec si ; SI -> NUL
  793. cmp bl,'' ; was last char a '' ?
  794.  je func5A_30
  795. cmp bl,'/' ; (or a '/' for unix freaks)
  796.  je func5A_30
  797. mov es:byte ptr [si],'' ; append a '' to name
  798. inc si
  799. func5A_30:
  800. ; Here ES:DX -> start of name, ES:SI -> position to append <unique name>,0
  801. ; CX = attribute for file.
  802. ; We generate a unique name based upon the time and date - if this already
  803. ; exists we keep retrying knowing the number of files is finite and we must
  804. ; succeed eventually
  805. push cx ! push dx ! push si ; append a unique'ish name
  806. call func5A_append_unique_name
  807. pop si ! pop dx ! pop cx
  808. mov ah,MS_X_MKNEW ; try to create unique file
  809. call dos_entry
  810.  jnc func5A_50 ; exit if we succeeded
  811. mov es:byte ptr [si],0 ;  else forget extention
  812. cmp ax,ED_EXISTS ; we only retry if it already exists 
  813.  je func5A_30
  814. func5A_40:
  815. jmp error_exit ; return error to caller
  816. func5A_50:
  817. jmp return_AX_CLC ; return handle to caller
  818. func5A_append_unique_name:
  819. ;-------------------------
  820. ; On Entry:
  821. ; ES:DX -> start of name
  822. ; ES:SI -> position to append <unique name>,0
  823. ; CX = attribute for file.
  824. ; On Exit:
  825. ; None
  826. ;
  827. ; We append a unique 8 character filename to this based upon the current
  828. ; date/time.
  829. push si
  830. mov ax,120dh
  831. int 2fh ; get date/time in AX & DX
  832. pop di
  833. add ax,unique_name_seed ; randomise the date otherwise we would
  834. inc unique_name_seed ;  have one second wait between names
  835. call func5A_app_AX ; store 4 ascii bytes
  836. xchg ax,dx ; was DX = time
  837. call func5A_app_AX ; store 4 ascii bytes
  838. xor ax,ax
  839. stosb ; and a terminating NUL
  840. ret
  841. func5A_app_AX:
  842. ; On Entry AX = word, ES:DI -> string
  843. ; Store 4 ASCII chars at ES:DI, based upon value in AX
  844. call func5A_app_AL ; do low byte, falling thru to do high
  845. func5A_app_AL:
  846. call func5A_app_NIB ; low nibble, falling thru for high
  847. func5A_app_NIB:
  848. push ax
  849. and al,0fh ; mask out a nibble
  850. add al,'A' ; make it ASCII character
  851. stosb ; plant the string
  852. pop ax
  853. mov cl,4
  854. shr ax,cl ; shift nibble
  855. ret
  856. ; *****************************
  857. ; ***    DOS Function 60    ***
  858. ; ***Perform Name Processing***
  859. ; *****************************
  860. ;
  861. ; DS:SI point to a source string which contains a relative path
  862. ; specification ES:DI points to a buffer which is at least 80
  863. ; bytes longer than the source string.
  864. ;
  865. ; The carry flag is set and AX contains an error code if the 
  866. ; source string is mal formed. This function is used by the
  867. ; Ryan-McFarland COBOL compiler.
  868. ;
  869. Public func60
  870. func60:
  871. call set_retry_RF ; Valid to RETRY or FAIL
  872. mov FD_FUNC,FD_EXPAND ; Expand a relative Path
  873. mov FD_ONAMEOFF,si ; Initialise Source Pointer
  874. mov FD_ONAMESEG,es
  875. mov FD_NNAMEOFF,di ; Initialise Destination
  876. call reload_ES ;  pointer
  877. mov FD_NNAMESEG,es
  878. jmp fdos_crit
  879. ; *****************************
  880. ; ***    DOS Function 67    ***
  881. ; ***    Set/Handle Count   ***
  882. ; *****************************
  883. ;
  884. ; We impose a minimum of 20 handles regardless of what the caller
  885. ; requests. If the request is <=20 we use the default handle table in
  886. ; the PSP, else we allocate a memory block for the new table.
  887. ; If the old handle table was in a memory block (ie. zero offset) we
  888. ; will free that block up afterwards.
  889. ; When shrinking the handle count the error ED_HANDLE will be given if
  890. ; open files would have been lost.
  891. ;
  892. Public func67
  893. func67:
  894. push ds
  895. mov ds,current_psp ; DS -> current PSP blk
  896. cmp bx,20 ; force to minimum value of 20
  897.  jae f67_10
  898. mov bx,20 ; never have less than 20 handles
  899. f67_10:
  900. mov cx,ds:PSP_XFNMAX ; we have this many handles
  901. sub cx,bx ; are we growing ?
  902.  jbe f67_20 ; if shrinking make sure none open
  903. les di,ds:PSP_XFTPTR ; point to existing handle table
  904. lea di,[di+bx] ; point to 1st handle we will lose
  905. mov al,0FFh ; they must all be closed
  906. repe scasb ;  or we fail
  907. mov ax,ED_HANDLE ; fail if we are in danger of losing
  908.  jne f67_error ;  open handles
  909. f67_20:
  910. push bx ; save # of handles wanted
  911. push ds ! pop es
  912. mov di,offset PSP_XFT ; ES:DI -> new handle table
  913. cmp bx,20 ;  if we are setting to the
  914.  je f67_30 ;   default size
  915. add bx,15 ; calculate memory required
  916. mov cl,4 ! shr bx,cl ; num of paragraphs required
  917. xor di,di ;  offset will be zero
  918. mov ah,MS_M_ALLOC ;  allocate the memory
  919. call dos_entry
  920. mov es,ax ; ES:DI -> new handle table
  921. f67_30:
  922. pop bx ; BX = # handles wanted
  923.  jc f67_error ; ES:DI -> new handle table
  924. mov cx,bx ; CX = new # handles
  925. xchg cx,ds:PSP_XFNMAX ; Update the Handle Count
  926. mov si,di ; Update the Table Offset
  927. xchg si,ds:PSP_XFTOFF
  928. mov ax,es
  929. xchg ax,ds:PSP_XFTSEG ; Update the Table Segment
  930. mov ds,ax ; DS:SI -> old handle table
  931. ; ES:DI -> new handle table
  932. ; CX = # old handles to copy
  933. ; BX = # new handles desired 
  934. sub bx,cx ; BX = # extra "closed" handles
  935.  jae f67_40 ; negative if we are shrinking
  936. add cx,bx ; CX = # handles we inherit
  937. xor bx,bx ; BX = no extra "closed" handles
  938. f67_40:
  939. push si ; save offset old handle table
  940. rep movsb ; Copy the existing Handles
  941. pop si ; SI = offset old handle table
  942. mov al,0FFh ; AL = unused handle
  943. mov cx,bx ; mark extra handles as unused
  944. rep stosb ; mark as unused
  945. test si,si ; do we have memory to free ?
  946.  jnz f67_50
  947. mov ah,MS_M_FREE
  948. call dos_entry ; free up old handle table DMD
  949. f67_50:
  950. pop ds
  951. jmp return_AX_CLC ; clear carry on return
  952. f67_error:
  953. pop ds ; restore DS
  954. jmp error_exit ;  and return error AX to caller
  955. ; *****************************
  956. ; ***    DOS Function 68    ***
  957. ; ***      Commit File      ***
  958. ; *****************************
  959. ;
  960. Public func68
  961. func68:
  962. call set_retry_RF ; Valid to RETRY or FAIL
  963. mov FD_FUNC,FD_COMMIT ; Close a File Handle
  964. jmp fdos_handle
  965. ; *****************************
  966. ; ***    DOS Function 6C    ***
  967. ; ***     Extended Open     ***
  968. ; *****************************
  969. ;
  970. Public func6C
  971. func6C:
  972. mov al,OK_RF ; Valid to RETRY or FAIL
  973. test bh,20h ; should we allow critical errors ?
  974.  jz f6C10
  975. or al,NO_CRIT_ERRORS ; no, so remember that
  976. f6C10:
  977. call set_retry
  978. mov ax,ED_FUNCTION ; assume an illegal action code
  979. test dx,not 0113h ; now check for sensible bits
  980.  jnz f6C_error
  981. inc dx
  982. test dl,4 ; also reject bits 0-3 = 3
  983.  jnz f6C_error
  984. dec dx
  985. xchg ax,si ; ES:AX -> name
  986. xchg ax,dx ; AX = action, ES:DX -> name
  987. xchg ax,bx ; AX = open mode, BX = action
  988. test bl,010h ; should we create if not there ?
  989.  jz f6C_open ; no, skip the attempt at make new
  990. and ah,(DHM_COMMIT+DHM_NOCRIT)/100h
  991. mov FD_FUNC,FD_NEW ; create only if not there
  992. call funcExtendedOpenCreate ; try to open/create the file
  993. mov cx,2 ; CX = file created
  994.  jnc f6C_exit ; return this if we succeeded
  995. f6C_open:
  996. call reload_registers ; all registers as per entry
  997. xchg ax,si ; ES:AX -> name
  998. xchg ax,dx ; AX = action, ES:DX -> name
  999. xchg ax,bx ; AX = open mode, BX = action
  1000. push bx ; save action
  1001. and ah,(DHM_COMMIT+DHM_NOCRIT)/100h
  1002. mov FD_FUNC,MS_X_OPEN ; try an open an existing file
  1003. call funcExtendedOpenCreate
  1004. pop bx ; recover action
  1005.  jc f6C_error ; return error if we can't open file
  1006. mov cx,1 ; CX = file opened
  1007. test bl,001h ; should we open if it exists ?
  1008.  jnz f6C_exit ; yes, return the handle
  1009. xchg ax,bx ; BX = handle, AX = action
  1010. test al,002h ; should we replace the file ?
  1011. mov ax,ED_EXISTS ; if not close and return error
  1012.  jz f6C_close_on_error
  1013. mov ah,MS_X_WRITE
  1014. xor cx,cx ; write zero bytes to truncate file
  1015. call dos_entry
  1016.  jc f6C_close_on_error ; on error AX = error code, return it
  1017. xchg ax,bx ; AX = handle
  1018. mov cx,3 ; CX = file replaced
  1019. f6C_exit:
  1020. jmp return_CX ; return CX to caller
  1021. f6C_close_on_error:
  1022. ; File exits, but open should be failed (error code in AX)
  1023. push ax
  1024. mov ah,MS_X_CLOSE
  1025. call dos_entry ; close that file
  1026. pop ax
  1027. f6C_error:
  1028. jmp error_exit ; generate critical error
  1029. PCMODE_DATA DSEG WORD
  1030. extrn current_psp:word
  1031. extrn current_dsk:byte
  1032. extrn dma_offset:word
  1033. extrn dma_segment:word
  1034. extrn int21regs_ptr:dword
  1035. extrn last_drv:byte
  1036. extrn remote_call:word
  1037. if DELWATCH
  1038. extrn fdos_stub:dword
  1039. endif
  1040. GLOBAL_DATA dseg word
  1041. ; When creating unique files we use the date/time to make the name.
  1042. ; We add this seed value to "randomise" things, INCing on failure so the next
  1043. ; attempt usually succeeds.
  1044. unique_name_seed dw 0 ; so we don't have to wait 1 second
  1045. end