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

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile: DOSIF.ASM$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : 
  6. ;
  7. ;    Last Edited By    : $Author: RGROSS$
  8. ;
  9. ;    Copyright         : (C) 1992 Digital Research (UK), Ltd.
  10. ;                                 Charnham Park
  11. ;                                 Hungerford, Berks.
  12. ;                                 U.K.
  13. ;
  14. ;    *** Current Edit History ***
  15. ;    *** End of Current Edit History ***
  16. ;
  17. ;    $Log: $
  18. ;    DOSIF.ASM 1.1 94/06/28 16:01:14 RGROSS
  19. ;    Initial PUT
  20. ;    DOSIF.ASM 1.16 94/06/28 16:01:28 IJACK
  21. ;    ms_x_expand returns error codes (for benefit of TRUENAME)
  22. ;    DOSIF.ASM 1.15 93/11/29 19:57:24 IJACK
  23. ;    
  24. ;    --------
  25. ;    
  26. ;    DOSIF.ASM 1.13 93/09/09 10:24:50 RFREEBOR
  27. ;    call_novell() now returns all allowed error codes.
  28. ;    
  29. ;    DOSIF.ASM 1.12 93/02/24 17:42:49 EHILL
  30. ;    _get_scr_width() function added.
  31. ;    
  32. ;    DOSIF.ASM 1.11 93/01/21 16:19:31 EHILL
  33. ;    
  34. ;    DOSIF.ASM 1.10 93/01/21 14:32:32 EHILL
  35. ;    
  36. ;    DOSIF.ASM 1.8 92/09/11 10:46:28 EHILL
  37. ;    
  38. ;    DOSIF.ASM 1.7 92/08/06 09:56:07 EHILL
  39. ;    Added DOS 5 calls to get and set memory allocation strategy and
  40. ;    upper memory link.
  41. ;    
  42. ;    DOSIF.ASM 1.6 92/07/10 17:47:13 EHILL
  43. ;    No comment
  44. ;
  45. ;    ENDLOG
  46. ;
  47. ; This file provides all the assembler level interfaces to the
  48. ; underlying operating system that are required by COMMAND.COM.
  49. ; The type of functions calls that will be made is controlled
  50. ; by a Assemble time flag.
  51. ;
  52. ; Currently the Operating System Interfaces that are supported
  53. ; are MS-DOS and Concurrent DOS 6.0.
  54. ;
  55. ;
  56. ; Command Line Flags
  57. ; ==================
  58. ;
  59. ; MSDOS If defined then USE MSDOS function Calls
  60. ; CDOS If defined then Use Concurrent DOS Calls
  61. ;
  62. ;
  63. ;  2/Sep/87 jc Convert the Concurrent IOCTL function to use the FDOS
  64. ; command.
  65. ; 19/Oct/87 jc Handle Fail on Get current directory correctly
  66. ; 23/Feb/88 jc Use Text substitution function to get the path assigned
  67. ; to floating drives (ms_x_subst).
  68. ;  3/Mar/88 jc Support Server Password Error
  69. ;  9/Mar/88 jc Return a NULL terminated string when an error occurs on the
  70. ; ms_x_subst function.
  71. ; 15/Mar/88 jc Correct ms_x_subst register corruption bug
  72. ; 13/Apr/88 jc Support the FAR_READ and FAR_WRITE routines as well as external
  73. ; copy buffer allocation via MEM_ALLOC and MEM_FREE
  74. ; 20/May/88 jc Return the current country code to the calling application
  75. ; 25/May/88 jc Missing dataOFFSET causing garbage offset to be passed
  76. ; ms_x_subst.
  77. ; 18/Jul/88 jc Modify LOGICAL_DRV test to detect substituted physical drives
  78. ; 17/Aug/88 jc Return the current Break Status using DL not AL
  79. ; 22/Sep/88 jc Replace MS_X_SUBST with more general MS_X_EXPAND routine
  80. ; 25/Jan/89 ij If new DRDOS internal data layout get DPHTBL the new way
  81. ; 07/Feb/89 jc Add the Get and Set Global Codepage MS_X_GETCP/MS_X_SETCP
  82. ; 25/Jan/89 ij Get DPHTBL using DRDOS_DPHTBL_OFFSET equate
  83. ; 14/Apr/89 jjs Add ms_x_setdev
  84. ; 31/May/89 ij Get SYSDAT for DPHTBL using new f4458 function 
  85. ; 19/May/89 jc Remove "Alternative" techniques of getting SYSDAT:DPHTABLE
  86. ; 20/Jun/89 js ms_f_parse, ms_f_delete, for DEL cmd
  87. ; 30/Aug/89 js  ms_idle_ptr
  88. ;  6/Sep/89 ij network_drvs really does something on DRDOS
  89. ; 16/Oct/89 ach Added double byte character set support routines: dbcs_init,
  90. ; dbcs_expected and dbcs_lead.
  91. ; 18/Jan/90 ij HILOAD interfaces added
  92. ;  4/Apr/90 ij dbcs_init moved to cstart, use system table, then we can throw
  93. ; away the init code
  94. ; 24-May-90 ij ms_x_expand sets up ES....
  95. ; 17 Sep 90 ij TMP Control Break kludge echo's ^C to console
  96. ;  4 Oct 90 ij Use P_CAT, not P_HDS
  97. ; 15 Mar 91 jc DRDOS_DPHTBL is now called SYSDAT_DPHTBL cos thats where it lives
  98. ; 28 May 91 ejh No longer use SYSDAT to determine if drives are physical,
  99. ; logical or networked. See _physical_drive, _logical_drive and
  100. ; _network_drive.
  101. ; 23 Jun 91 ejh SUBST and ASSIGN are now external commands, so the following
  102. ; are no longer required:
  103. ; _physical_drvs, _logical_drvs, _network_drvs
  104. ; _physical_drive,_logical_drive,_network_drive
  105. ;  3 jul 91 ij except for NETDRIVE in MDOS
  106. ;
  107. ; 18 Jun 92 ejh Added get_lines_page() function.
  108. ; 24 Jun 92 ejh Added novell_copy() function.
  109. CGROUP group _TEXT
  110. DGROUP group _DATA
  111. codeOFFSET equ offset CGROUP:
  112. dataOFFSET equ offset DGROUP:
  113. EXT_SUBST equ 1 ; External Subst and Assign commands
  114. CRET MACRO num
  115. ret
  116. ENDM
  117. ifndef ??Version ;; Turbo Assembler always knows RETF
  118. ifndef retf ;; some versions of MASM do as well
  119. retf macro ;; define far return macro for others
  120. db 0cbh
  121. endm
  122. endif
  123. endif
  124. ifndef CDOSTMP
  125. include msdos.equ
  126. endif
  127. ifndef DOSPLUS
  128. include system.def
  129. include pd.def
  130. include ccpm.equ
  131. ;include udaa.def
  132. include net.def
  133. include mserror.equ
  134. else
  135. include f52data.def
  136. endif
  137. ;
  138. ifdef CDOSTMP
  139. OK_RIF equ 00111000b ; All Responsese are Valid
  140. OK_RI equ 00110000b ; Retry and Ignore are Valid
  141. OK_RF equ 00011000b ; Retry and Fail are Valid
  142. ;
  143. ;       Structure of DOS DPB
  144. ;       --------------------
  145. ; The  layout  of  this  structure  is  a  guess  based  on
  146. ; examples.  It is returned by PC MODE on functions 1Fh and
  147. ; 32h  and is required  by various  disk-related  utilities
  148. ; like disk editors and CHKDSK.
  149. DDSC_UNIT equ es:byte ptr 0 ; absolute drive number
  150. DDSC_RUNIT equ es:byte ptr 1 ; relative unit number
  151. DDSC_SECSIZE equ es:word ptr 2 ; sector size in bytes
  152. DDSC_CLMSK equ es:byte ptr 4 ; sectors/cluster - 1
  153. DDSC_CLSHF equ es:byte ptr 5 ; log2 (sectors/cluster)
  154. DDSC_FATADDR equ es:word ptr 6 ; sector address of FAT
  155. DDSC_NFATS equ es:byte ptr 8 ; # of FAT copies
  156. DDSC_DIRENT equ es:word ptr 9 ; size of root directory
  157. DDSC_DATADDR equ es:word ptr 11 ; sector address of cluster #2
  158. DDSC_NCLSTRS equ es:word ptr 13 ; # of clusters on disk
  159. DDSC_NFATRECS equ es:byte ptr 15 ; # of sectors per FAT
  160. DDSC_DIRADDR equ es:word ptr 16 ; sector address of root dir
  161. DDSC_DEVHEAD equ es:dword ptr 18 ; device driver header
  162. DDSC_MEDIA equ es:byte ptr 22 ; current media byte
  163. DDSC_FIRST equ es:byte ptr 23 ; "drive never accessed" flag
  164. DDSC_LINK equ es:dword ptr 24 ; next drive's DDSC
  165. DDSC_BLOCK equ es:word ptr 28 ; next block to allocate
  166. DDSC_FREE equ es:word ptr 30 ; total free clusters on drive
  167. DDSC_MAP equ es:word ptr 32 ; free blocks/FAT sector
  168. endif
  169. BDOS_INT equ 224 ; ##jc##
  170. _DATA SEGMENT byte public 'DATA'
  171. extrn __psp:word
  172. ifndef DOSPLUS
  173. extrn _pd:dword ; Process Descriptor Pointer
  174. endif
  175. extrn _country:WORD
  176. ifdef DOSPLUS
  177. extrn dbcs_table_ptr:dword ; points to system DBCS table
  178. endif
  179. ifdef CDOSTMP
  180. ;
  181. ; The following buffer is used by the P_PATH function.
  182. ; FINDFILE uses the first three fields to get the full path and
  183. ; filename of the command. 
  184. ;
  185. exec_block label byte
  186. exec_pathoff dw ? ; Offset of ASCIIZ Load file
  187. exec_pathseg dw ? ; Segment of ASCIIZ Load File
  188. exec_filetype db ? ; File Type Index
  189. fdos_data dw 7 dup(0) ; FDOS parameter Block
  190. mpb_start dw ? ; Memory parameter Block
  191. mpb_min dw ?
  192. mpb_max dw ?
  193. mpb_pdadr dw ?
  194. mpb_flags dw ?
  195. mfpb_start dw ? ; Memory Free Parameter Block
  196. mfpb_res dw ?
  197. country_data label word ; GET country data
  198. cd_country dw ? ; Requested Country Code
  199. cd_codepage dw ? ; Requested Code Page
  200. cd_table dw ? ; Table Number
  201. cd_offset dw ? ; Buffer Offset
  202. cd_segment dw ? ; Buffer Segment
  203. valid dw 0 ; Valid Error Responses
  204. retry_ip dw 0 ; Critical Error Retry IP
  205. retry_sp dw 0 ; Critical Error Retry SP
  206. crit_flg db FALSE ; Critical Section of Error Handler
  207. include fdos.def
  208. endif
  209. ifdef NETWARE
  210. ipx label dword
  211. ipx_offset dw 0
  212. ipx_segment dw 0
  213. ;
  214. ; Socket Allocation by Novell
  215. ;
  216. ; Socket Nos 4000 and 4001 appear to be used by the IPX internally
  217. ; and these are NOT closed by the NET_WARE routine. All other USER
  218. ; sockets are closed.
  219. ;
  220. ; List of sockets to be closed on shutdown
  221. ; Start Count
  222. socket label word
  223. ;; dw 0001h, 0BB8h
  224. dw 4002h, 3FFFh - 2 ; User Socket Numbers
  225. dw 0, 0
  226. aes label  byte ; Event Control Block
  227. aes_link label dword ; Link Field
  228. aes_linkoff dw 0
  229. aes_linkseg dw 0
  230. aes_esr label dword ; Service Routine Address
  231. aes_esroff dw codeOFFSET aes_retf
  232. aes_esrseg dw 0000
  233. aes_inuse db 0 ; Flag Field
  234. aes_workspc db 5 dup(?) ; AES WorkSpace
  235. endif
  236. _DATA ENDS
  237. _TEXT SEGMENT byte public 'CODE'
  238. assume cs:CGROUP, ds:DGROUP, es:DGROUP
  239. extrn _int_break:near ; Control-C Break Handler
  240. ifdef CDOSTMP
  241. ifdef MWC
  242. extrn _critical_error:near ; Default Critical Error Handler
  243. CRITICAL_ERR equ _critical_error
  244. else
  245. extrn CRITICAL_ERROR:near ; Default Critical Error Handler
  246. CRITICAL_ERR equ CRITICAL_ERROR
  247. endif
  248. endif
  249. ;
  250. ; UWORD psp_poke(WORD handle, BYTE ifn);
  251. ;
  252. Public _psp_poke
  253. _psp_poke:
  254. push bp
  255. mov bp,sp
  256. push es
  257. ifdef CDOSTMP
  258. mov es,__psp ; ES:0 -> our PSP
  259. else
  260. mov ah,MS_P_GETPSP
  261. int DOS_INT ; for software carousel
  262. mov es,bx
  263. endif
  264. les bx,es:[0034h] ; ES:BX -> external file table
  265. add bx,4[bp] ; ES:BX -> XFT entry for our handle
  266. mov al,6[bp] ; get new value to use
  267. xchg al,es:[bx] ; get old value, set new value
  268. xor ah,ah
  269. pop es
  270. pop bp
  271. ret
  272. ifndef CDOSTMP
  273. Public _ms_drv_set
  274. ;-----------
  275. _ms_drv_set:
  276. ;-----------
  277. push bp
  278. mov bp,sp
  279. mov dl,04[bp]
  280. mov ah,MS_DRV_SET ; Select the Specified Disk Drive
  281. int DOS_INT ; Nothing Returned to caller
  282. pop bp
  283. ret
  284. Public _ms_drv_get
  285. ;-----------
  286. _ms_drv_get:
  287. ;-----------
  288. mov ah,MS_DRV_GET ; Return the Currently selected
  289. int DOS_INT ; disk drive
  290. cbw
  291. ret
  292. Public _ms_drv_space
  293. ;------------
  294. _ms_drv_space:
  295. ;------------
  296. ;
  297. ; ret = _ms_drv_space (drive, &free, &secsiz, &nclust);
  298. ; where: drive = 0, 1-16 is drive to use
  299. ; free    = free cluster count
  300. ; secsiz  = bytes/sector
  301. ; nclust = clusters/disk
  302. ; ret = sectors/cluster -or- (0xFFFFh)
  303. push bp
  304. mov bp,sp
  305. mov dx,4[bp]
  306. mov ah,MS_DRV_SPACE
  307. int DOS_INT
  308. push bx
  309. mov bx,6[bp] ; get free cluster count
  310. pop word ptr [bx]
  311. mov bx,8[bp]
  312. mov [bx],cx ; bytes/sector
  313. mov bx,10[bp]
  314. mov [bx],dx ; clusters/disk
  315. cbw
  316. pop bp
  317. ret
  318. Public _ms_s_country
  319. ;------------
  320. _ms_s_country:
  321. ;------------
  322. push bp
  323. mov bp,sp
  324. mov ax,MS_S_COUNTRY shl 8 ; Get the curremt country information
  325. mov dx,4[bp] ; and return the current country code
  326. int DOS_INT ; to the calling application.
  327. mov ax,bx
  328. pop bp
  329. ret
  330. Public _ms_x_mkdir
  331. ;----------
  332. _ms_x_mkdir:
  333. ;----------
  334. mov ah,MS_X_MKDIR
  335. jmp ms_dx_call
  336. Public _ms_x_rmdir
  337. ;----------
  338. _ms_x_rmdir:
  339. ;----------
  340. mov ah,MS_X_RMDIR
  341. jmp ms_dx_call
  342. Public _ms_x_chdir
  343. ;----------
  344. _ms_x_chdir:
  345. ;----------
  346. mov ah,MS_X_CHDIR
  347. jmp ms_dx_call
  348. Public _ms_x_creat
  349. ;----------
  350. _ms_x_creat:
  351. ;----------
  352. mov ah,MS_X_CREAT
  353. jmp ms_open_creat
  354. Public _ms_x_open
  355. ;---------
  356. _ms_x_open:
  357. ;---------
  358. mov ah,MS_X_OPEN
  359. ms_open_creat:
  360. push bp
  361. mov bp,sp
  362. mov dx,4[bp]
  363. mov cx,6[bp] ; get mode for new file (CREAT)
  364. mov al,cl ;          or open mode (OPEN)
  365. int DOS_INT
  366. jnc ms_open_ret ; AX = handle if no error
  367. neg ax ; else mark as error code
  368. ms_open_ret:
  369. pop bp
  370. ret
  371. Public _ms_x_close
  372. ;----------
  373. _ms_x_close:
  374. ;----------
  375. push bp
  376. mov bp,sp
  377. mov bx,4[bp] ; get the open handle
  378. mov ah,MS_X_CLOSE ; get the function
  379. jmp ms_call_dos ; call DOS, handle errors
  380. Public _ms_x_unique
  381. ;----------
  382. _ms_x_unique:
  383. ;----------
  384. mov ah,MS_X_MKTEMP
  385. jmp ms_open_creat
  386. Public _ms_x_fdup
  387. ;----------
  388. _ms_x_fdup:
  389. ;----------
  390. push bp
  391. mov bp,sp
  392. mov cx,4[bp] ; get the destination handle
  393. mov bx,6[bp] ; Get the current handle
  394. mov ah,MS_X_DUP2 ; get the function
  395. jmp ms_call_dos ; call DOS, handle errors
  396. Public _far_read
  397. ;---------
  398. _far_read:
  399. ;---------
  400. mov ah,MS_X_READ
  401. jmp far_read_write
  402. Public _far_write
  403. ;----------
  404. _far_write:
  405. ;----------
  406. mov ah,MS_X_WRITE
  407. far_read_write:
  408. push bp
  409. mov bp,sp
  410. push ds
  411. mov bx,4[bp] ; get file handle
  412. lds dx,dword ptr 6[bp] ; get buffer address
  413. mov cx,10[bp] ; get byte count
  414. int DOS_INT ; call the DOS
  415. jnc far_rw_ok ; skip if no error
  416. neg ax ; else make it negative error code
  417. far_rw_ok:
  418. pop ds
  419. pop bp
  420. ret
  421. Public _ms_x_read
  422. ;---------
  423. _ms_x_read:
  424. ;---------
  425. mov ah,MS_X_READ
  426. jmp ms_read_write
  427. Public _ms_x_write
  428. ;----------
  429. _ms_x_write:
  430. ;----------
  431. mov ah,MS_X_WRITE
  432. ms_read_write:
  433. push bp
  434. mov bp,sp
  435. mov bx,4[bp] ; get file handle
  436. mov dx,6[bp] ; get buffer address
  437. mov cx,8[bp] ; get byte count
  438. int DOS_INT ; call the DOS
  439. jnc ms_rw_ok ; skip if no error
  440. neg ax ; else make it negative error code
  441. ms_rw_ok:
  442. pop bp
  443. ret
  444. Public _ms_x_unlink
  445. ;-----------
  446. _ms_x_unlink:
  447. ;-----------
  448. mov ah,MS_X_UNLINK
  449. jmp ms_dx_call
  450. Public _ms_x_lseek
  451. ;----------
  452. _ms_x_lseek:
  453. ;----------
  454. push bp
  455. mov bp,sp
  456. mov ah,MS_X_LSEEK ; get the function
  457. mov bx,4[bp] ; get the file handle
  458. mov dx,6[bp] ; get the offset
  459. mov cx,8[bp]
  460. mov al,10[bp] ; get the seek mode
  461. int DOS_INT
  462. jnc ms_lseek_ok ; skip if no errors
  463. neg ax ; make error code negative
  464. cwd ; sign extend to long
  465. ms_lseek_ok:
  466. mov bx,dx ; AX:BX = DRC long return
  467. pop bp
  468. ret
  469. Public _ms_x_ioctl
  470. ;----------
  471. _ms_x_ioctl:
  472. ;----------
  473. push bp
  474. mov bp,sp
  475. mov bx,4[bp] ; get our handle
  476. mov ah,MS_X_IOCTL ; get IO Control function
  477. mov al,0 ; get file/device status
  478. int DOS_INT ; do INT 21h
  479. jnc ms_x_i10
  480. neg ax
  481. ms_x_i10:
  482. pop bp ; 
  483. ret
  484. Public _ms_x_setdev
  485. ;------------
  486. _ms_x_setdev:
  487. ;------------
  488. push bp
  489. mov bp, sp
  490. mov bx, 4[bp] ; handle
  491. mov dx, 6[bp] ; byte value to set
  492. sub dh, dh
  493. mov ah, MS_X_IOCTL
  494. mov al, 1
  495. int DOS_INT
  496. jnc ms_x_sd10
  497. neg ax
  498. ms_x_sd10:
  499. pop bp
  500. ret
  501. Public _ms_x_chmod
  502. ;----------
  503. _ms_x_chmod:
  504. ;----------
  505. push bp
  506. mov bp,sp
  507. mov ah,MS_X_CHMOD
  508. mov dx,4[bp]
  509. mov cx,6[bp]
  510. mov al,8[bp]
  511. int DOS_INT
  512. jnc ms_chmod_ok
  513. neg ax ; make error code negative
  514. jmp ms_chmod_ret
  515. ms_chmod_ok:
  516. sub ax,ax ; assume no error
  517. cmp byte ptr 8[bp],0 ; getting attributes
  518. jne ms_chmod_ret ; return ax = 0 if setting & no error
  519. xchg ax,cx ; return ax = attrib otherwise
  520. ms_chmod_ret:
  521. pop bp
  522. ret
  523. Public _ms_x_curdir
  524. ;-----------
  525. _ms_x_curdir:
  526. ;-----------
  527. push bp
  528. mov bp,sp
  529. push si
  530. mov si,6[bp] ; Get the buffer address and 
  531. mov byte ptr [si],0 ; put a zero in the first byte in
  532. mov ah,MS_X_CURDIR ; the command is FAILED
  533. push word ptr 4[bp]
  534. call ms_dx_call
  535. pop dx
  536. pop si
  537. pop bp
  538. ret
  539. Public _ms_x_exit
  540. ;---------
  541. _ms_x_exit:
  542. ;---------
  543. push bp
  544. mov bp,sp
  545. ifdef NETWARE
  546. push es ; If this is Novell Netware and
  547. mov ax,__psp ; the command processor is terminating
  548. mov es,ax ; ie PSP_PARENT == PSP then do the
  549. cmp ax,es:word ptr 16h ; special Novell Close down sequence
  550. pop es
  551. jnz ms_x_exit10
  552. mov ax,7A00h ; Check for IPX being present using
  553. int 2Fh ; the Multi-Plex Interrupt.
  554. cmp al,0FFh
  555. jz net_ware
  556. ms_x_exit10:
  557. endif
  558. mov al,04[bp] ; Get the Return Code
  559. mov ah,MS_X_EXIT ; terminate process function
  560. int DOS_INT ; call the DOS
  561. pop bp
  562. ret
  563. ifdef NETWARE
  564. ;
  565. ; The following routine attempts to clean-up after a Novell 
  566. ; session. It does so in the following manner:-
  567. ;
  568. ; 1) Close all file handles (May be Networked !!)
  569. ; 2) Close all User Sockets
  570. ; 3) Remove all User Events from Internal lists
  571. ; 4) Use CDOS terminate function
  572. ;
  573. net_ware:
  574. mov ipx_offset,di
  575. mov ipx_segment,es
  576. mov cx,20 ; Close all the possible handles 
  577. mov bx,0 ; used by the command processor
  578. net_w05: ; in case any have been redirected
  579. mov ah,MS_X_CLOSE ; accross the Network
  580. int DOS_INT
  581. inc bx
  582. loop net_w05
  583. mov si,dataOFFSET socket
  584. net_w10:
  585. mov cx,word ptr 02[si] ; Get the number of sockets to close
  586. mov dx,word ptr 00[si] ; starting at Socket No.
  587. jcxz net_w30 ; Terminate on a 0 Count
  588. push si
  589. net_w20:
  590. push cx
  591. push dx ; Save Count and Socket No.
  592. xchg dl,dh ; Swap socket no to High/Low
  593. mov bx,1 ; Close Socket Function
  594. call ipx ; Close Socket.
  595. pop dx
  596. pop cx
  597. inc dx ; Increment Socket No
  598. loop net_w20 ; and Loop
  599. pop si
  600. add si,4 ; Point to next entry in the array
  601. jmp net_w10 ; and repeat till count is 0
  602. net_w30: ; All sockets have been closed
  603. mov aes_esrseg,cs
  604. mov ax,0FFFFh ; Create Special event with the 
  605. mov bx,7 ; maximum time delay
  606. push ds
  607. pop  es ; Pass the address of the Special
  608. mov si,dataOFFSET aes ; Event control block call the IPX
  609. call ipx
  610. net_w40:
  611. les si,aes_link ; Remove all entries from the Link
  612. ; Which are not owned by the IPX
  613. net_w50:
  614. mov bx,es ; get the AES segment
  615. cmp bx,ipx_segment ; and check for a match
  616. jnz net_w60 ; Remove this entry
  617. les si,es:dword ptr [si] ; get the next entry and try again
  618. jmp short net_w50
  619. net_w60:
  620. or bx,si ; End of List
  621. jz net_w70 ; Yes terminate our entry
  622. mov bx,0006h ; Cancel this event
  623. call ipx
  624. jmp short net_w40
  625. net_w70:
  626. mov bx,0006h ; Cancel our event
  627. push ds
  628. pop  es
  629. mov si,dataOFFSET aes
  630. call ipx
  631. net_exit:
  632. mov dh,0 ; Standard Exit
  633. mov dl,04[bp] ; With the supplied ExitCode
  634. mov cx,P_EXITCODE ; Set the ExitCode for the Parent
  635. int BDOS_INT
  636. mov cx,P_TERMCPM ; Use a Concurrent Terminate Call
  637. int BDOS_INT ; because Novell has taken over 4Ch
  638. aes_retf: ; Dummy AES routine
  639. retf
  640. endif
  641. ;
  642. ; ms_x_expand(dstbuf, srcbuf) returns the full path of SRCBUF
  643. ;
  644. Public _ms_x_expand
  645. ;-----------
  646. _ms_x_expand:
  647. ;-----------
  648. push bp
  649. mov bp,sp
  650. push si
  651. push di
  652. mov si,06[bp] ; Get the source String Address
  653. mov di,04[bp] ; Get the destination string
  654. mov byte ptr [di],0 ; address and force it to be a NULL
  655. push ds
  656. pop es ; ES:DI -> destination
  657. mov ah,60h ; terminated string in case of errors
  658. int DOS_INT
  659. jc ms_exp_ret ; skip if error
  660. xor ax,ax ; signal no errors
  661. ms_exp_ret:
  662. neg ax ; make error negative, 0 = 0
  663. pop di
  664. pop si
  665. pop bp
  666. CRET 4
  667. Public _ms_x_wait
  668. ;---------
  669. _ms_x_wait: ; retrieve child return code
  670. ;---------
  671. mov ah,MS_X_WAIT ; Top byte is abort code ie ^C
  672. int DOS_INT ; Bottom byte is return code
  673. ret
  674. Public _ms_x_first
  675. ;----------
  676. _ms_x_first:
  677. ;----------
  678. push bp
  679. mov bp,sp
  680. mov dx,8[bp] ; get DMA buffer address
  681. mov ah,MS_F_DMAOFF
  682. int DOS_INT
  683. mov dx,4[bp] ; get ASCII string
  684. mov cx,6[bp] ; get attribute
  685. mov ah,MS_X_FIRST ; get search function
  686. jmp ms_call_dos ; call DOS, check for errors
  687. Public _ms_x_next
  688. ;---------
  689. _ms_x_next:
  690. ;---------
  691. push bp
  692. mov bp,sp
  693. mov dx,4[bp] ; get DMA buffer address
  694. mov ah,MS_F_DMAOFF
  695. int DOS_INT
  696. mov ah,MS_X_NEXT ; get the function
  697. jmp ms_call_dos ; get DX, call DOS, handle errors
  698. ms_dx_call: ; call DOS with parameter in DX
  699. push bp
  700. mov bp,sp
  701. mov dx,4[bp]
  702. ms_call_dos:
  703. int DOS_INT
  704. jnc ms_dos_ok ; no carry = no error
  705. neg ax ; else make it negative
  706. jmp ms_dos_ret ; and return with error
  707. ms_dos_ok:
  708. sub ax,ax ; return 0 if no error
  709. ms_dos_ret:
  710. pop bp ; return 0 or negative error code
  711. ret
  712. Public _ms_x_rename
  713. ;-----------
  714. _ms_x_rename:
  715. ;-----------
  716. push bp
  717. mov bp,sp
  718. push di
  719. push ds
  720. pop es
  721. mov ah,MS_X_RENAME
  722. mov di,6[bp] ; ES:DI = new name
  723. push word ptr 4[bp] ; make it look like DRC call
  724. call ms_dx_call ; DX = 4[bp], call DOS, handle errors
  725. pop di ; remove parameter
  726. pop di
  727. pop bp
  728. ret
  729. Public _ms_x_datetime
  730. ; ret = _ms_x_datetime (gsflag, h, &time, &date);
  731. ;-------------
  732. _ms_x_datetime:
  733. ;-------------
  734. push bp
  735. mov bp,sp
  736. mov ah,MS_X_DATETIME ; set/get time stamp function
  737. mov al,4[bp] ; get/set subfunction (0/1)
  738. mov bx,8[bp] ; get address of time
  739. mov cx,[bx] ; get time
  740. mov bx,10[bp] ; get address of date
  741. mov dx,[bx] ; get date
  742. mov bx,6[bp] ; get handle
  743. int DOS_INT ; call the DOS
  744. jc ms_dt_ret ; skip if error
  745. sub ax,ax ; signal no errors
  746. cmp byte ptr 4[bp],0 ; geting time/date?
  747. jne ms_dt_ret ; skip if setting
  748. mov bx,8[bp] ; get time address
  749. mov [bx],cx ; update time
  750. mov bx,10[bp] ; get date address
  751. mov [bx],dx ; update date
  752. ms_dt_ret:
  753. neg ax ; make error negative, 0 = 0
  754. pop bp
  755. ret
  756. ;
  757. ; The following routines allow COMMAND.COM to manipulate
  758. ; the system time and date. Four functions are provided and
  759. ; these are MS_GETDATE, MS_SETDATE, MS_GETTIME and MS_SETTIME
  760. ;
  761. ; Date information is passed and return in a structure which 
  762. ; has the following format.
  763. ;
  764. ; WORD Year (1980 - 2099)
  765. ; BYTE Month
  766. ; BYTE Day
  767. ; BYTE Day of the Week (Ignored on SET DATE)
  768. Public _ms_getdate
  769. _ms_getdate:
  770. push bp
  771. mov bp,sp
  772. mov ah,MS_T_GETDATE ; get the current date from DOS
  773. int DOS_INT
  774. mov bx,4[bp] ; and get the structure address
  775. mov [bx],cx ; save the year
  776. xchg dh,dl ; swap month and day
  777. mov 2[bx],dx ; and save
  778. mov 4[bx],al ; and finally save the day number
  779. pop bp ; and exit
  780. ret
  781. Public _ms_setdate
  782. _ms_setdate:
  783. push bp
  784. mov bp,sp
  785. mov bx,4[bp] ; and get the structure address
  786. mov cx,0[bx] ; det the year
  787. mov dx,2[bx] ; get the month and day
  788. xchg dh,dl ; swap month and day
  789. mov ah,MS_T_SETDATE ; set the current date
  790. int DOS_INT
  791. cbw ; 0000 = Ok and FFFF = Bad
  792. pop bp ; and exit
  793. ret
  794. ; Time information is passed and return in a structure which 
  795. ; has the following format.
  796. ;
  797. ; BYTE Hours (0 - 23)
  798. ; BYTE Minutes (0 - 59)
  799. ; BYTE Seconds (0 - 59)
  800. ; BYTE Hundredths of a second (0 - 99)
  801. Public _ms_gettime
  802. _ms_gettime:
  803. push bp
  804. mov bp,sp
  805. mov ah,MS_T_GETTIME ; get the current date from DOS
  806. int DOS_INT
  807. mov bx,4[bp] ; and get the structure address
  808. xchg cl,ch
  809. mov [bx],cx ; save the hours and minutes
  810. xchg dh,dl
  811. mov 2[bx],dx ; save seconds and hundredths
  812. pop bp ; and exit
  813. ret
  814. Public _ms_settime
  815. _ms_settime:
  816. push bp
  817. mov bp,sp
  818. mov bx,4[bp] ; and get the structure address
  819. mov cx,[bx] ; get the hours and minutes
  820. xchg cl,ch
  821. mov dx,2[bx] ; get seconds and hundredths
  822. xchg dh,dl
  823. mov ah,MS_T_SETTIME ; get the current date from DOS
  824. int DOS_INT
  825. cbw ; 0000 = Ok and FFFF = Bad
  826. pop bp ; and exit
  827. ret
  828. Public _ms_idle_ptr
  829. ;------------
  830. _ms_idle_ptr:
  831. ;------------
  832. push es
  833. push si
  834. push di
  835. mov ax, 4458h
  836. int DOS_INT ; ptr in ES:AX
  837. mov dx, es
  838. pop di
  839. pop si
  840. pop es
  841. ret
  842. Public _ms_switchar
  843. ;-----------
  844. _ms_switchar:
  845. ;-----------
  846. mov ax,3700h
  847. int DOS_INT
  848. sub ah,ah
  849. mov al,dl
  850. ret
  851. if 0
  852. Public _ms_p_getpsp
  853. ;-----------
  854. _ms_p_getpsp:
  855. ;-----------
  856. mov ah,51h ; Note: SeCRET DOS 2.x entry
  857. int DOS_INT
  858. xchg ax,bx
  859. ret
  860. endif
  861. Public _ms_f_verify
  862. ;-----------
  863. _ms_f_verify:
  864. ;-----------
  865. push bp
  866. mov bp,sp
  867. mov ah,MS_F_VERIFY
  868. mov al,4[bp] ;get 0/1 al parameter 
  869. int DOS_INT
  870. pop bp
  871. ret
  872. Public _ms_f_getverify
  873. ;--------------
  874. _ms_f_getverify:
  875. ;--------------
  876. mov ah,MS_F_GETVERIFY
  877. int DOS_INT
  878. cbw
  879. ret
  880. ifndef CDOSTMP
  881. Public _ms_f_parse
  882. ;-----------
  883. _ms_f_parse:
  884. ;-----------
  885. push bp
  886. mov bp, sp
  887. push es
  888. push si
  889. push di
  890. push ds
  891. pop es
  892. mov di, 4[bp] ; fcb
  893. mov si, 6[bp] ; filename
  894. mov al, 8[bp] ; flags
  895. mov ah, MS_F_PARSE
  896. int DOS_INT
  897. cbw ; return code in ax
  898. pop di
  899. pop si
  900. pop es
  901. pop bp
  902. ret
  903. Public _ms_f_delete
  904. ;------------
  905. _ms_f_delete:
  906. ;------------
  907. push bp
  908. mov bp, sp
  909. mov dx, 4[bp] ; fcb
  910. mov ah, MS_F_DELETE
  911. int DOS_INT
  912. cbw ; return code
  913. pop bp
  914. ret
  915. endif
  916. ;
  917. ; The SET BREAK function returns the previous Break Flag Status
  918. ;
  919. Public _ms_set_break
  920. ;------------
  921. _ms_set_break:
  922. ;------------
  923. push bp
  924. mov bp,sp
  925. mov dl,04[bp]
  926. mov ax,(MS_S_BREAK SHL 8) + 2
  927. int DOS_INT
  928. pop bp
  929. mov al,dl
  930. cbw
  931. ret
  932. if 0
  933. Public _ms_get_break
  934. ;------------
  935. _ms_get_break:
  936. ;------------
  937. mov ax,MS_S_BREAK SHL 8
  938. int DOS_INT
  939. mov al,dl
  940. cbw
  941. ret
  942. endif
  943. ;
  944. ; mem_alloc(BYTE FAR * NEAR * bufaddr, UWORD * bufsize, UWORD min, UWORD max);
  945. ;
  946. ; max 10[bp]
  947. ; min 08[bp]
  948. ; bufsize 06[bp]
  949. ; buffadr  04[bp]
  950. ;
  951. Public _mem_alloc
  952. ;---------
  953. _mem_alloc:
  954. ;---------
  955. push bp
  956. mov bp,sp
  957. mov bx,10[bp] ; Start with request maximum size
  958. mem_all10:
  959. mov ah,MS_M_ALLOC ; Attempt to allocate the maximum
  960. int DOS_INT ; memory requested by the user. 
  961. jnc mem_all20 ; Allocation OK
  962. cmp bx,08[bp] ; Is this less than the requested
  963. jae mem_all10 ; No then allocate this amount
  964. xor ax,ax ; Force the Buffer address and Buffer
  965. mov bx,ax ; Size to Zero
  966. mem_all20:
  967. mov cx,bx ; Save the Buffer Size
  968. mov bx,04[bp] ; Update the Buffer Address
  969. mov word ptr 00[bx],0 ; Offset 0
  970. mov word ptr 02[bx],ax ; Segment AX
  971. mov bx,06[bp] ; Now Update the Buffer Size
  972. mov word ptr 00[bx],cx ; and return to the caller
  973. pop bp
  974. ret
  975. ;
  976. ; mem_free(BYTE FAR * NEAR * bufaddr);
  977. ;
  978. ; buffadr  04[bp]
  979. ;
  980. Public _mem_free
  981. ;---------
  982. _mem_free:
  983. ;---------
  984. push bp
  985. mov bp,sp
  986. xor ax,ax
  987. mov bx,04[bp] ; Get the Buffer Pointer address
  988. xchg ax,word ptr 02[bx] ; and from this the segment of the
  989. cmp ax,0 ; allocated memory. If the memory
  990. jz mem_free10 ; has already been freed the quit
  991. push es ; Otherwise Free the Memory
  992. mov es,ax
  993. mov ah,MS_M_FREE
  994. int DOS_INT
  995. pop es
  996. mem_free10:
  997. pop bp
  998. ret
  999. Public _msdos
  1000. ;-------
  1001. _msdos:
  1002. ;-------
  1003. push bp
  1004. mov bp,sp
  1005. push si
  1006. push di
  1007. mov ah,4[bp]
  1008. mov dx,6[bp]
  1009. int DOS_INT
  1010. pop di
  1011. pop si
  1012. pop bp
  1013. ret
  1014. Public _ioctl_ver
  1015. ;---------
  1016. _ioctl_ver:
  1017. ;---------
  1018. ifdef DOSPLUS
  1019.   mov ax,4452h ; Get DOS Plus BDOS version Number
  1020. else
  1021.   mov ax,4451h ; Get Concurrent BDOS Version
  1022. endif
  1023. int DOS_INT ; Real DOS returns with Carry Set
  1024. jc cdos_v10
  1025. and ax,not 0200h ; Reset the Networking Bit
  1026. ret
  1027. cdos_v10:
  1028. xor ax,ax
  1029. ret
  1030. ifdef DOSPLUS
  1031. ;
  1032. ; Get CodePage information form the system. Return both the currently
  1033. ; active CodePage and the System CodePage.
  1034. ;
  1035. ; ms_x_getcp(&globalcp, &systemcp);
  1036. ;
  1037. Public _ms_x_getcp
  1038. ;-----------
  1039. _ms_x_getcp:
  1040. ;-----------
  1041. push bp
  1042. mov bp,sp
  1043. mov ax,MS_X_GETCP ; Get the CodePage Information
  1044. int DOS_INT ; and return an error if not
  1045. jc ms_x_getcp10 ; supported.
  1046. mov ax,bx ; Now update the callers
  1047. mov bx,04[bp] ; Global and System Codepage
  1048. mov word ptr [bx],ax ; variables 
  1049. mov bx,06[bp]
  1050. mov word ptr [bx],dx
  1051. xor ax,ax
  1052. ms_x_getcp10:
  1053. neg ax ; Negate the error code has 
  1054. pop bp ; no effect on 0
  1055. ret
  1056. ;
  1057. ; Change the current CodePage
  1058. ;
  1059. ; ms_x_setcp(globalcp);
  1060. ;
  1061. Public _ms_x_setcp
  1062. ;-----------
  1063. _ms_x_setcp:
  1064. ;-----------
  1065. push bp
  1066. mov bp,sp
  1067. mov bx,04[bp] ; Get the requested CodePage
  1068. mov ax,MS_X_SETCP ; and make this the default
  1069. int DOS_INT
  1070. jc ms_x_getcp10
  1071. xor ax,ax
  1072. pop bp
  1073. ret
  1074. endif
  1075. endif
  1076. ifdef CDOSTMP
  1077. Public _ms_drv_set
  1078. ;-----------
  1079. _ms_drv_set:
  1080. ;-----------
  1081. push bp
  1082. mov bp,sp
  1083. mov dl,04[bp] ; Get the Specified drive
  1084. or dl,80h ; Prevent any Select Errors
  1085. mov cl,DRV_SET ; and go select the bugger
  1086. int BDOS_INT
  1087. pop bp
  1088. ret
  1089. Public _ms_drv_get
  1090. ;-----------
  1091. _ms_drv_get:
  1092. ;-----------
  1093. mov cl,DRV_GET ; Return the Currently selected
  1094. int BDOS_INT ; disk drive
  1095. cbw
  1096. ret
  1097. Public _ms_drv_space
  1098. ;------------
  1099. _ms_drv_space:
  1100. ;------------
  1101. ;
  1102. ; ret = _ms_drv_space (drive, &free, &secsiz, &nclust);
  1103. ; where: drive = 0, 1-16 is drive to use
  1104. ; free    = free cluster count
  1105. ; secsiz  = bytes/sector
  1106. ; nclust = clusters/disk
  1107. ; ret = sectors/cluster -or- (0xFFFFh)
  1108. push bp
  1109. mov bp,sp
  1110. mov al,OK_RF ; Retry or Fail
  1111. call fdos_retry
  1112. mov FD_FUNC, FD_DISKINFO
  1113. mov ax,04[bp]
  1114. mov FD_DRIVE,ax
  1115. call fdos_entry
  1116. or ax,ax ; Check for Errors
  1117. mov ax,0FFFFh
  1118. jnz ms_drv_exit ; Error Exit
  1119. push es ; Save ES
  1120. push di
  1121. les di,FD_DPB ; Get the DPB Address
  1122. mov ax,es:DDSC_FREE[di] ; Get the number of free
  1123. mov bx,06[bp] ; clusters on the drive
  1124. mov [bx],ax
  1125. mov ax,es:DDSC_SECSIZE[di] ; Get the Physical Sector Size
  1126. mov bx,08[bp] ; in bytes
  1127. mov [bx],ax
  1128. mov ax,es:DDSC_NCLSTRS[di] ; Get the disk size in
  1129. mov bx,10[bp] ; clusters and save in DX
  1130. mov [bx],ax
  1131. mov al,es:DDSC_CLMSK[di] ; Get the sectors per Cluster -1
  1132. cbw ; and save in AX
  1133. inc ax
  1134. pop di
  1135. pop es
  1136. ms_drv_exit:
  1137. pop bp
  1138. CRET 8
  1139. Public _ms_s_country
  1140. ;------------
  1141. _ms_s_country:
  1142. ;------------
  1143. push bp
  1144. mov bp,sp
  1145. mov ax,04[bp] ; Get the data Block Offset
  1146. mov cd_country,0 ; Get the Current Country
  1147. mov cd_codepage,0 ; Current CodePage
  1148. mov cd_table,0 ; Country Information
  1149. mov cd_offset,ax ; Save the Buffer Offset
  1150. mov cd_segment,ds ; and the Buffer Segment
  1151. mov dx,dataOFFSET country_data
  1152. mov cl,S_GETCOUNTRY ; Get the country information
  1153. int BDOS_INT ; and return the current country
  1154. pop bp ; code to the caller
  1155. CRET 2
  1156. Public _ms_x_mkdir
  1157. ;----------
  1158. _ms_x_mkdir:
  1159. ;----------
  1160. push bp
  1161. mov bp,sp
  1162. mov al,OK_RIF ; Retry, Ignore or Fail
  1163. call fdos_retry
  1164. mov FD_FUNC,FD_MKDIR ; Make Directory
  1165. mkdir_10:
  1166. mov ax,04[bp]
  1167. mov FD_NAMEOFF,ax
  1168. mov FD_NAMESEG,ds
  1169. call fdos_entry
  1170. pop bp
  1171. CRET 2
  1172. Public _ms_x_rmdir
  1173. ;----------
  1174. _ms_x_rmdir:
  1175. ;----------
  1176. push bp
  1177. mov bp,sp
  1178. mov al,OK_RIF ; Retry, Ignore or Fail
  1179. call fdos_retry
  1180. mov FD_FUNC,FD_RMDIR
  1181. jmp mkdir_10
  1182. Public _ms_x_chdir
  1183. ;----------
  1184. _ms_x_chdir:
  1185. ;----------
  1186. push bp
  1187. mov bp,sp
  1188. mov al,OK_RF ; Retry or Fail
  1189. call fdos_retry
  1190. mov FD_FUNC,FD_CHDIR
  1191. jmp mkdir_10
  1192. Public _ms_x_creat
  1193. ;----------
  1194. _ms_x_creat:
  1195. ;----------
  1196. push bp
  1197. mov bp,sp
  1198. mov al,OK_RF ; Retry or Fail
  1199. call fdos_retry
  1200. mov FD_FUNC,FD_CREAT
  1201. jmp ms_open_creat
  1202. Public _ms_x_open
  1203. ;---------
  1204. _ms_x_open:
  1205. ;---------
  1206. push bp
  1207. mov bp,sp
  1208. mov al,OK_RF ; Retry or Fail
  1209. call fdos_retry
  1210. mov FD_FUNC,FD_OPEN
  1211. ms_open_creat:
  1212. mov ax,4[bp]
  1213. mov FD_NAMEOFF,ax
  1214. mov FD_NAMESEG,ds
  1215. mov ax,6[bp] ; get mode for new file (CREAT)
  1216. mov FD_MODE,ax ; or the OPEN mode
  1217. call fdos_entry ; Call the FDOS and return either
  1218. pop bp ; a handle or error code
  1219. CRET 4
  1220. Public _ms_x_close
  1221. ;----------
  1222. _ms_x_close:
  1223. ;----------
  1224. push bp
  1225. mov bp,sp
  1226. mov al,OK_RIF ; Retry, Ignore or Fail
  1227. call fdos_retry
  1228. mov ax,4[bp] ; get the open handle
  1229. mov FD_FUNC,FD_CLOSE
  1230. mov FD_HANDLE,ax
  1231. call fdos_entry
  1232. pop bp
  1233. CRET 2
  1234. Public _ms_x_unique
  1235. ;----------
  1236. _ms_x_unique:
  1237. ;----------
  1238. push bp
  1239. mov bp,sp
  1240. mov al,OK_RF ; Retry or Fail
  1241. call fdos_retry
  1242. mov FD_FUNC,FD_MKTEMP
  1243. jmp ms_open_creat
  1244. Public _ms_x_fdup
  1245. ;----------
  1246. _ms_x_fdup:
  1247. ;----------
  1248. push bp
  1249. mov bp,sp
  1250. mov al,OK_RIF ; Retry, Ignore or Fail
  1251. call fdos_retry
  1252. mov FD_FUNC,FD_FDUP
  1253. mov ax,4[bp] ; get the destination handle
  1254. mov FD_NEWHND,ax
  1255. mov ax,6[bp] ; Get the current handle
  1256. mov FD_HANDLE,ax
  1257. call fdos_entry
  1258. pop bp
  1259. CRET 4
  1260. Public _far_read
  1261. ;---------
  1262. _far_read:
  1263. ;---------
  1264. push bp
  1265. mov bp,sp
  1266. mov al,OK_RF ; Retry or Fail
  1267. call fdos_retry
  1268. mov FD_FUNC,FD_READ
  1269. jmp far_read_write
  1270. Public _far_write
  1271. ;----------
  1272. _far_write:
  1273. ;----------
  1274. push bp
  1275. mov bp,sp
  1276. mov al,OK_RIF ; Retry, Ignore or Fail
  1277. call fdos_retry
  1278. mov FD_FUNC,FD_WRITE
  1279. far_read_write:
  1280. mov ax,4[bp] ; get file handle
  1281. mov FD_HANDLE,ax
  1282. mov ax,6[bp] ; get buffer offset address
  1283. mov FD_BUFOFF,ax
  1284. mov ax,8[bp] ; get buffer Segment address
  1285. mov FD_BUFSEG,ax
  1286. mov ax,10[bp] ; get byte count
  1287. mov FD_COUNT,ax
  1288. call fdos_entry
  1289. or ax,ax
  1290. jnz far_rw_fail
  1291. mov ax,FD_COUNT ; Get the Byte Count
  1292. far_rw_fail:
  1293. pop bp
  1294. CRET 6
  1295. Public _ms_x_read
  1296. ;---------
  1297. _ms_x_read:
  1298. ;---------
  1299. push bp
  1300. mov bp,sp
  1301. mov al,OK_RF ; Retry or Fail
  1302. call fdos_retry
  1303. mov FD_FUNC,FD_READ
  1304. jmp ms_read_write
  1305. Public _ms_x_write
  1306. ;----------
  1307. _ms_x_write:
  1308. ;----------
  1309. push bp
  1310. mov bp,sp
  1311. mov al,OK_RIF ; Retry, Ignore or Fail
  1312. call fdos_retry
  1313. mov FD_FUNC,FD_WRITE
  1314. ms_read_write:
  1315. mov ax,4[bp] ; get file handle
  1316. mov FD_HANDLE,ax
  1317. mov ax,6[bp] ; get buffer address
  1318. mov FD_BUFOFF,ax
  1319. mov FD_BUFSEG,ds
  1320. mov ax,8[bp] ; get byte count
  1321. mov FD_COUNT,ax
  1322. call fdos_entry
  1323. or ax,ax
  1324. jnz ms_rw_fail
  1325. mov ax,FD_COUNT ; Get the Byte Count
  1326. ms_rw_fail:
  1327. pop bp
  1328. CRET 6
  1329. Public _ms_x_unlink
  1330. ;-----------
  1331. _ms_x_unlink:
  1332. ;-----------
  1333. push bp
  1334. mov bp,sp
  1335. mov al,OK_RIF ; Retry, Ignore or Fail
  1336. call fdos_retry
  1337. mov FD_FUNC,FD_UNLINK
  1338. jmp mkdir_10
  1339. Public _ms_x_lseek
  1340. ;----------
  1341. _ms_x_lseek:
  1342. ;----------
  1343. push bp
  1344. mov bp,sp
  1345. mov al,OK_RIF ; Retry, Ignore or Fail
  1346. call fdos_retry
  1347. mov FD_FUNC,FD_LSEEK ; get the function
  1348. mov ax,4[bp] ; get the file handle
  1349. mov FD_HANDLE,ax
  1350. mov ax,6[bp] ; get the offset
  1351. mov word ptr FD_OFFSET+0,ax
  1352. mov ax,8[bp]
  1353. mov word ptr FD_OFFSET+2,ax
  1354. mov ax,10[bp] ; get the seek mode
  1355. mov FD_METHOD,ax
  1356. call fdos_entry
  1357. cwd
  1358. or ax,ax
  1359. jnz ms_lseek_fail ; skip if errors
  1360. mov ax,word ptr FD_OFFSET+0 ; Return the New Location
  1361. mov dx,word ptr FD_OFFSET+2
  1362. ms_lseek_fail:
  1363. mov bx,dx ; AX:BX = DRC long return
  1364. pop bp
  1365. CRET 8
  1366. Public _ms_x_ioctl
  1367. ;----------
  1368. _ms_x_ioctl:
  1369. ;----------
  1370. push bp
  1371. mov bp,sp
  1372. mov al,OK_RF ; Retry or Fail
  1373. call fdos_retry
  1374. mov ax,4[bp] ; get Enquiry Handle
  1375. mov FD_FUNC,FD_IOCTL ; Use the IOCTL function
  1376. mov FD_HANDLE,ax ; For Handle AX
  1377. mov FD_CTLFUNC,0000 ; Get the Handle Status
  1378. mov FD_CTLSTAT,0 ; Invalidate CTLSTAT
  1379. call fdos_entry ; Call the FDOS
  1380. mov ax,FD_CTLSTAT ; and return the STATUS
  1381. pop bp
  1382. CRET 2
  1383. Public _ms_x_setdev
  1384. ;------------
  1385. _ms_x_setdev:
  1386. ;------------
  1387. push bp
  1388. mov bp,sp
  1389. mov al,OK_RF ; Retry or Fail
  1390. call fdos_retry
  1391. mov ax,4[bp] ; get Handle
  1392. mov FD_HANDLE,ax
  1393. mov FD_FUNC,FD_IOCTL ; Use the IOCTL function
  1394. mov FD_CTLFUNC,1 ; Set device info
  1395. mov ax, 6[bp] ; status to set
  1396. sub ah, ah
  1397. mov FD_CTLSTAT,ax
  1398. call fdos_entry ; Call the FDOS
  1399. mov ax,FD_CTLSTAT ; and return the STATUS
  1400. pop bp
  1401. CRET 2
  1402. Public _ms_x_chmod
  1403. ;----------
  1404. _ms_x_chmod: ; ms_x_chmod(path, attrib, get/set)
  1405. ;----------
  1406. push bp
  1407. mov bp,sp
  1408. mov al,OK_RIF ; Retry, Ignore or Fail
  1409. call fdos_retry
  1410. mov FD_FUNC,FD_CHMOD
  1411. mov ax,4[bp] ; Get the FileName
  1412. mov FD_NAMEOFF,ax
  1413. mov FD_NAMESEG,ds
  1414. mov ax,6[bp] ; Get the Required Attributes
  1415. mov FD_ATTRIB,ax
  1416. mov ax,8[bp] ; Finally Get the GET/SET flag
  1417. mov FD_FLAG,ax
  1418. call fdos_entry ; Returns with AX equal to the  
  1419. or ax,ax ; error code or with the file
  1420. js chmod10 ; attributes.
  1421. mov ax,FD_ATTRIB
  1422. chmod10:
  1423. pop bp
  1424. CRET 6
  1425. Public _ms_x_curdir
  1426. ;-----------
  1427. _ms_x_curdir:
  1428. ;-----------
  1429. push bp
  1430. mov bp,sp
  1431. mov al,OK_RF ; Retry or Fail
  1432. call fdos_retry
  1433. mov FD_FUNC,FD_GETDIR
  1434. mov ax,04[bp] ; Get the drive
  1435. mov FD_DRIVE,ax
  1436. mov bx,06[bp] ; and then the path
  1437. mov byte ptr [bx],0 ; Put a Zero byte in the buffer in
  1438. mov FD_PATHOFF,bx ; case the command fails and the
  1439. mov FD_PATHSEG,ds ; user selects the FAIL Option
  1440. call fdos_entry
  1441. pop bp
  1442. CRET 4
  1443. ;
  1444. ; ms_x_expand(dstbuf, srcbuf) returns the full path of SRCBUF
  1445. ;
  1446. Public _ms_x_expand
  1447. ;-----------
  1448. _ms_x_expand:
  1449. ;-----------
  1450. push bp
  1451. mov bp,sp
  1452. mov al,OK_RF ; Retry or Fail
  1453. call fdos_retry
  1454. mov FD_FUNC,FD_EXPAND
  1455. mov ax,06[bp] ; Get Source Buffer Offset
  1456. mov FD_ONAMEOFF,ax
  1457. mov FD_ONAMESEG,ds
  1458. mov bx,04[bp] ; Get the destination string
  1459. mov byte ptr [bx],0 ; address and force it to be a NULL
  1460. mov FD_NNAMEOFF,bx ; terminated string in case of errors
  1461. mov FD_NNAMESEG,ds
  1462. call fdos_entry
  1463. pop bp
  1464. CRET 4
  1465. Public _ms_x_wait
  1466. ;---------
  1467. _ms_x_wait: ; retrieve child return code
  1468. ;---------
  1469. mov cl,P_EXITCODE ; Return the Exit Code
  1470. mov dx,0FFFFh ; Get the Exit Code
  1471. int BDOS_INT
  1472. CRET 0
  1473. Public _ms_x_first
  1474. ;----------
  1475. _ms_x_first:
  1476. ;----------
  1477. push bp
  1478. mov bp,sp
  1479. mov dx,8[bp] ; get DMA buffer address
  1480. mov cl,F_DMAOFF
  1481. call bdos_entry
  1482. mov dx,ds ;##jc##
  1483. mov cl,F_DMASEG ;##jc##
  1484. call bdos_entry ;##jc##
  1485. mov al,OK_RF ; Retry or Fail
  1486. call fdos_retry
  1487. mov FD_FUNC,FD_FFIRST ; Search First
  1488. mov ax,04[bp] ; Get the FileName
  1489. mov FD_NAMEOFF,ax
  1490. mov FD_NAMESEG,ds
  1491. mov ax,06[bp] ; Get the Attributes
  1492. mov FD_ATTRIB,ax
  1493. mov FD_COUNT, 0 ; Search for a File at a time
  1494. call fdos_entry
  1495. cmp ax,1 ; Did we match 1 entry
  1496. jnz ms_x_f10 ; No so return Error Code
  1497. mov ax,0 ; Return Zero on sucess
  1498. ms_x_f10:
  1499. pop bp
  1500. CRET 6
  1501. Public _ms_x_next
  1502. ;---------
  1503. _ms_x_next:
  1504. ;---------
  1505. push bp
  1506. mov bp,sp
  1507. mov dx,4[bp] ; get DMA buffer address
  1508. mov cl,F_DMAOFF
  1509. call bdos_entry
  1510. mov dx,ds ;##jc##
  1511. mov cl,F_DMASEG ;##jc##
  1512. call bdos_entry ;##jc##
  1513. mov al,OK_RF ; Retry or Fail
  1514. call fdos_retry
  1515. mov FD_FUNC,FD_FNEXT ; Search Next
  1516. mov FD_NEXTCNT, 0 ; Search for a File at a time
  1517. call fdos_entry
  1518. cmp ax,1 ; Did we match 1 entry
  1519. jnz ms_x_n0 ; No so return Error Code
  1520. mov ax,0 ; Return Zero on sucess
  1521. ms_x_n0:
  1522. pop bp
  1523. CRET 2
  1524. Public _ms_x_rename
  1525. ;-----------
  1526. _ms_x_rename:
  1527. ;-----------
  1528. push bp
  1529. mov bp,sp
  1530. mov al,OK_RIF ; Retry, Ignore or Fail
  1531. call fdos_retry
  1532. mov FD_FUNC,FD_RENAME
  1533. mov ax,04[bp] ; Get the Old Name
  1534. mov FD_ONAMEOFF,ax
  1535. mov FD_ONAMESEG,ds
  1536. mov ax,06[bp] ; Get the New Name
  1537. mov FD_NNAMEOFF,ax
  1538. mov FD_NNAMESEG,ds
  1539. call fdos_entry
  1540. pop bp
  1541. CRET 4
  1542. Public _ms_x_datetime
  1543. ;-------------
  1544. _ms_x_datetime: ; ms_x_datetime (gsflag, h, &time, &date);
  1545. ;-------------
  1546. push bp
  1547. mov bp,sp
  1548. mov al,OK_RIF ; Retry, Ignore or Fail
  1549. call fdos_retry
  1550. mov FD_FUNC,FD_DATETIME ; set/get Time Stamp
  1551. mov ax,4[bp] ; get/set subfunction (0/1)
  1552. mov FD_SFLAG,ax
  1553. mov ax,6[bp] ; get handle
  1554. mov FD_HANDLE,ax
  1555. mov bx,8[bp] ; get address of time
  1556. mov ax,[bx] ; get time
  1557. mov FD_TIME,ax ; and Save
  1558. mov bx,10[bp] ; get address of date
  1559. mov ax,[bx] ; get date
  1560. mov FD_DATE,ax
  1561. call fdos_entry
  1562. or ax,ax ; Skip if Failed
  1563. jnz ms_dt_ret
  1564. mov ax,FD_TIME
  1565. mov bx,8[bp] ; get time address
  1566. mov [bx],ax ; update time
  1567. mov ax,FD_DATE
  1568. mov bx,10[bp] ; get date address
  1569. mov [bx],ax ; update date
  1570. xor ax,ax
  1571. ms_dt_ret:
  1572. pop bp
  1573. CRET 8
  1574. ;
  1575. ; The following routines allow COMMAND.COM to manipulate
  1576. ; the system time and date. Four functions are provided and
  1577. ; these are GETDATE, SETDATE, GETTIME and SETTIME
  1578. ;
  1579. ; Date information is passed and return in a structure which 
  1580. ; has the following format.
  1581. ;
  1582. ; WORD Year (1980 - 2099)
  1583. ; BYTE Month
  1584. ; BYTE Day
  1585. ; BYTE Day of the Week (Ignored on SET DATE)
  1586. Public _ms_getdate
  1587. ;-----------
  1588. _ms_getdate:
  1589. ;-----------
  1590. push bp
  1591. mov bp,sp
  1592. mov dx,04[bp] ; Get the structure address
  1593. mov cl,T_GETDATE ; and call the BDOS
  1594. call bdos_entry
  1595. pop bp
  1596. CRET 2
  1597. Public _ms_setdate
  1598. ;----------
  1599. _ms_setdate:
  1600. ;----------
  1601. push bp
  1602. mov bp,sp
  1603. mov dx,4[bp] ; and get the structure address
  1604. mov cl,T_SETDATE ; and call the BDOS to do the work
  1605. call bdos_entry ; Return 0 Good and FFFF Bad
  1606. pop bp
  1607. CRET 2
  1608. ; Time information is passed and return in a structure which 
  1609. ; has the following format.
  1610. ;
  1611. ; BYTE Hours (0 - 23)
  1612. ; BYTE Minutes (0 - 59)
  1613. ; BYTE Seconds (0 - 59)
  1614. ; BYTE Hundredths of a second (0 - 99)
  1615. Public _ms_gettime
  1616. ;----------
  1617. _ms_gettime:
  1618. ;----------
  1619. push bp
  1620. mov bp,sp
  1621. mov dx,04[bp] ; Get the Time Structure address
  1622. mov cl,T_GETTIME ; and call the OS
  1623. call bdos_entry
  1624. pop bp
  1625. CRET 2
  1626. Public _ms_settime
  1627. ;----------
  1628. _ms_settime:
  1629. ;----------
  1630. push bp
  1631. mov bp,sp
  1632. mov dx,4[bp] ; and get the structure address
  1633. mov cl,T_SETTIME ; and call the BDOS SET Time Function
  1634. call bdos_entry ; Return 0 Good and FFFF Bad
  1635. pop bp
  1636. CRET 2
  1637. Public _ms_f_verify
  1638. ;-----------
  1639. _ms_f_verify:
  1640. ;-----------
  1641. push bp
  1642. mov bp,sp
  1643. push es
  1644. mov ax,04[bp] ; Get the required state
  1645. les bx,_pd ; Update the Verify flag in
  1646. and es:P_SFLAG[bx],not PSF_VERIFY ; current PD
  1647. or ax,ax ; Set the Flag
  1648. jz ms_fv10 ; No
  1649. or es:P_SFLAG[bx],PSF_VERIFY ; Flag set in PD
  1650. ms_fv10:
  1651. pop es
  1652. pop bp
  1653. ret
  1654. Public _ms_f_getverify
  1655. ;--------------
  1656. _ms_f_getverify:
  1657. ;--------------
  1658. push es
  1659. xor ax,ax ; Assume the flag is RESET
  1660. les bx,_pd ; now test the state of the
  1661. test es:P_SFLAG[bx],PSF_VERIFY ; flag in the current PD
  1662. jz ms_fgv10 ; Verify = OFF
  1663. inc ax ; Verify = ON
  1664. ms_fgv10:
  1665. pop es
  1666. ret
  1667. ;
  1668. ; mem_alloc(BYTE FAR * NEAR * bufaddr, UWORD * bufsize, UWORD min, UWORD max);
  1669. ;
  1670. ; max 10[bp]
  1671. ; min 08[bp]
  1672. ; bufsize 06[bp]
  1673. ; buffadr  04[bp]
  1674. ;
  1675. Public _mem_alloc
  1676. ;---------
  1677. _mem_alloc:
  1678. ;---------
  1679. push bp
  1680. mov bp,sp
  1681. mov mpb_start,0
  1682. mov ax,08[bp] ; Get the Minimum and Maximum values
  1683. mov mpb_min,ax ; and fill in the parameter block
  1684. mov ax,10[bp]
  1685. mov mpb_max,ax
  1686. mov mpb_pdadr,0
  1687. mov mpb_flags,0
  1688. mov cx,M_ALLOC ; Call the Concurrent Allocate function
  1689. mov dx,dataOFFSET mpb_start ; 
  1690. call bdos_entry
  1691. xor cx,cx ; Assume that the function fails
  1692. mov dx,cx ; and zero the start and size fields
  1693. cmp ax,0
  1694. jnz mem_all10
  1695. mov cx,mpb_min ; Get the Allocation Size
  1696. mov dx,mpb_start ; and the starting segment
  1697. mem_all10:
  1698. mov bx,04[bp] ; Update the Buffer Address
  1699. mov word ptr 00[bx],0 ; Offset 0
  1700. mov word ptr 02[bx],dx ; Segment DX
  1701. mov bx,06[bp] ; Now Update the Buffer Size
  1702. mov word ptr 00[bx],cx ; and return to the caller
  1703. pop bp
  1704. ret
  1705. ;
  1706. ; mem_free(BYTE FAR * NEAR * bufaddr);
  1707. ;
  1708. ; buffadr  04[bp]
  1709. ;
  1710. Public _mem_free
  1711. ;---------
  1712. _mem_free:
  1713. ;---------
  1714. push bp
  1715. mov bp,sp
  1716. xor ax,ax
  1717. mov bx,04[bp] ; Get the Buffer Pointer address
  1718. xchg ax,word ptr 02[bx] ; and from this the segment of the
  1719. cmp ax,0 ; allocated memory. If the memory
  1720. jz mem_free10 ; has already been freed the quit
  1721. mov mfpb_start,ax ; Otherwise Free the Memory
  1722. mov mfpb_res,0
  1723. mov cx,M_FREE
  1724. mov dx,dataOFFSET mfpb_start
  1725. call bdos_entry
  1726. mem_free10:
  1727. pop bp
  1728. ret
  1729. ;
  1730. ; findfile(BYTE *loadpath, UWORD *loadtype)
  1731. Public _findfile
  1732. _findfile:
  1733. push bp
  1734. mov bp,sp
  1735. mov al,OK_RF ; Retry, Ignore or Fail
  1736. call fdos_retry
  1737. mov ax,word ptr 04[bp]
  1738. mov exec_pathoff,ax
  1739. mov exec_pathseg,ds
  1740. mov cx,P_PATH
  1741. mov dx,dataOFFSET exec_block
  1742. call ppath_entry
  1743. or ax,ax
  1744. jnz ff_error
  1745. mov al,exec_filetype
  1746. cbw
  1747. mov bx,word ptr 06[bp]
  1748. mov word ptr [bx],ax
  1749. xor ax,ax
  1750. ff_error:
  1751. pop bp
  1752. ret
  1753. ;
  1754. fdos_retry:
  1755. xor ah,ah
  1756. mov valid,ax ; Save the Valid Error responses
  1757. pop retry_ip ; Get the return Address
  1758. mov retry_sp,sp ; and Stack Pointer
  1759. jmp retry_ip
  1760. ;
  1761. ; FDOS_ENTRY is an internal function entry point which makes the
  1762. ; F_DOS function call. As the F_DOS data area used by COMMAND.COM 
  1763. ; is always FDOS_DATA.
  1764. ;
  1765. ; WORD PASCAL critical_error(error, valid, drive, mode, server);
  1766. ;
  1767. ; critical_error will return an WORD response which (R,I,A,F)
  1768. ; after displaying the appropriate error message and get the
  1769. ; correct response from the user.
  1770. ;
  1771. fdos_entry:
  1772. mov cl,F_DOS
  1773. mov dx,dataOFFSET fdos_data
  1774. ppath_entry:
  1775. call bdos_entry
  1776. cmp ax,ED_LASTERROR ; Did an Error Occur
  1777. jb fdos_exit ; No So Exit OK
  1778. cmp crit_flg,TRUE ; Already in handler
  1779. jz fdos_exit ; Yes Skip Critical Error
  1780. cmp ax,ED_PROTECT ; Is this a Physical Error
  1781. jg fdos_exit ; if so then simulate a 
  1782. cmp ax,ED_GENFAIL ; Critical Error by calling
  1783. jge fdos_e05 ; the COMMAND routine Critical
  1784. ; error
  1785. cmp ax,ED_NETPWD ; Now check for DR-NET errors
  1786. jg fdos_exit ; if so then simulate a 
  1787. cmp ax,ED_NETLOG ; Critical Error by calling
  1788. jge fdos_e05 ; the COMMAND routine Critical
  1789. ; error
  1790. fdos_exit:
  1791. ret
  1792. fdos_e05:
  1793. push retry_ip ; Save Retry IP and SP and valid
  1794. push retry_sp ; responses
  1795. push valid
  1796. mov crit_flg,TRUE ; Start Critical Section
  1797. mov cx,es ; Save the Segment Regsiter
  1798.   push ax  ; Save the Error Code
  1799. push valid ; Save the Valid Responses (R,I,F)
  1800. les bx,_pd ; Get the PD address
  1801. mov es,es:P_UDA[bx] ; and then the UDA address
  1802. xor ah,ah ; Zero the top byte of AX and
  1803. mov al,es:byte ptr 15h ;;U_ERR_DRV ; Get the Failing Drive
  1804. push ax ; Save on the Stack
  1805. mov al,es:byte ptr 14h ;;U_ERR_RW ; Get the Error Mode
  1806. push ax ; and Save
  1807. mov ax,00FFH ; Default Server NO is (INVALID)
  1808. les bx,_pd ; Get the PD address Again
  1809. mov bx,es:P_NDA[bx] ; and then the NDA address
  1810. cmp bx,0 ; Are we attached to DR-NET
  1811. jz fdos_e08 ; NO
  1812. mov es,bx ; ES -> DR-Net NDA
  1813. mov al,es:byte ptr 0Ch  ;; NDA_CXRTN
  1814. fdos_e08:
  1815. push ax ; Pass the DR-NET Server No.
  1816. mov es,cx ; Restore ES
  1817. call CRITICAL_ERR ; Handle the Critical Error. Parameters
  1818. ; are removed by the CALLEE
  1819. mov crit_flg,FALSE ; Critical Section complete
  1820. pop valid ; Restore our original RETRY IP
  1821. pop retry_sp ; and SP values which have been
  1822. pop retry_ip ; corrupted by the "CRITICAL_ERROR"
  1823. ; routine during message printing
  1824. cmp ax,0 ; Ignore the Error
  1825. jz fdos_exit ; Then Exit with no Error
  1826. cmp ax,1 ; Retry the Operation
  1827. jnz fdos_e10 ; using information saved by FDOS_RETRY
  1828. mov sp,retry_sp ; Reset the Stack Pointer
  1829. jmp retry_ip ; and retry the Operation
  1830. fdos_e10:
  1831. cmp ax,3 ; FAIL this function
  1832. mov ax,ED_FAIL ; Fail the function
  1833. jz fdos_exit ; Yes otherwise ABORT
  1834. call _int_break ; Simulate a Control C to terminate
  1835. ; We are never coming back
  1836. ;
  1837. ; BDOS_ENTRY is the usual method of calling the Operating System.
  1838. ; In order to provide a DOS compatible environment this function.
  1839. ; does Control-C checking on function exit.
  1840. bdos_entry:
  1841. int BDOS_INT
  1842. push es
  1843. les bx,_pd ; Get our process descriptor address
  1844. test es:P_SFLAG[bx],PSF_CTLC ; Check if a Control-C has been typed
  1845. jnz bdos_e10 ; Jump to Abort Handler
  1846. mov bx,ax ; Restore BX and Return.
  1847. pop es
  1848. ret
  1849. bdos_e10:
  1850. and es:P_SFLAG[bx],not PSF_CTLC
  1851. pop es
  1852. bdos_e20:
  1853. mov cl,C_RAWIO ; Flush the Character buffer until
  1854. mov dl,0FFh ; Return the character or 00 if queue
  1855. int BDOS_INT ; is empty. Repeat till the Keyboard
  1856. or  al,al ; Buffer has been flushed
  1857. jnz bdos_e20
  1858. push ds
  1859. push cs
  1860. pop ds
  1861. mov cl,C_WRITESTR
  1862. mov dx,offset break_str ; echo ^C to screen
  1863. int BDOS_INT
  1864. pop ds
  1865. call _int_break ; Place the Control Break Code on the 
  1866. ; Stack and the call the error handler
  1867. ; ** We will never return **
  1868. break_str db '^C$'
  1869. endif
  1870. ifndef DOSPLUS
  1871. Public __BDOS
  1872. ;-------
  1873. __BDOS:
  1874. ;-------
  1875. push bp
  1876. mov bp,sp
  1877. push si
  1878. push di
  1879. mov cl,4[bp]
  1880. mov dx,6[bp]
  1881. int BDOS_INT
  1882. pop di
  1883. pop si
  1884. pop bp
  1885. ret
  1886. ;
  1887. endif
  1888. ifdef DOSPLUS
  1889. ifndef EXT_SUBST
  1890. Public _physical_drvs ; Physical Drives returns a LONG
  1891. _physical_drvs: ; Vector with bits set for every drive
  1892. mov ax,0 ; start with drive A:
  1893. mov cx,16 ; check the first 16 drives
  1894. mov bx,0
  1895. p_d10:
  1896. push ax ; pass drive no. to _physical_drive
  1897. call _physical_drive ; call it
  1898. cmp ax,0 ; check return value 
  1899. pop ax ; restore ax
  1900. jz p_d20 ; if zero skip setting the bit in 
  1901. or bx,1 ; the bitmap
  1902. p_d20:
  1903. ror bx,1 ; shift bitmap right
  1904. inc ax ; next drive
  1905. loop p_d10 ; Loop 16 Times
  1906. mov cx,10 ; Finally check the last 10 drives
  1907. mov dx,0
  1908. p_d30:
  1909. push ax ; pass drive no. to _physical_drive
  1910. call _physical_drive ; call it
  1911. cmp ax,0 ; check return val
  1912. pop ax ; restore ax
  1913. jz p_d40 ; id zero skip setting the bit in 
  1914. or dx,1 ; the bitmap
  1915. p_d40:
  1916. ror dx,1 ; shift bitmap right
  1917. inc ax ; next drive
  1918. loop p_d30 ; Loop 10 Times
  1919. mov cl,6 ; Now rotate the contents of 
  1920. ror dx,cl ; DX 6 more times for correct
  1921. ; alignment of the Physical Drive Vector
  1922. mov ax,bx
  1923. mov bx,dx ; Return the long value in both
  1924. ; AX:BX and AX:DX
  1925. ret
  1926. Public _logical_drvs ; Logical Drives returns a LONG
  1927. _logical_drvs: ; vector with bits set for every
  1928. mov cx,16 ; check the first 16 drives
  1929. mov ax,0 ; start with drive A:
  1930. mov bx,ax
  1931. l_d10:
  1932. push ax ; pass the drive to _logical_drive
  1933. call _logical_drive ; call it
  1934. cmp ax,0 ; check return value
  1935. pop ax ; restore ax
  1936. jz l_d20 ; skip if zero return
  1937. or bx,1 ; set bit in bitmap
  1938. l_d20:
  1939. ror bx,1 ; shift bitmap right
  1940. inc ax ; next drive
  1941. loop l_d10 ; Loop 16 Times
  1942. mov cx,10 ; Finally check the last 10 drives
  1943. mov dx,0
  1944. l_d30:
  1945. push ax ; pass the drive to _logical_drive
  1946. call _logical_drive ; call it
  1947. cmp ax,0 ; check return value
  1948. pop ax ; restore ax
  1949. jz l_d40 ; skip if zero return
  1950. or dx,1 ; set bit in bitmap
  1951. l_d40:
  1952. ror dx,1 ; shift bitmap right
  1953. inc ax ; next drive
  1954. loop l_d30 ; Loop 10 Times
  1955. mov cl,6 ; Now rotate the contents of 
  1956. ror dx,cl ; DX 6 more times for correct
  1957. ; alignment of bits
  1958. mov ax,bx
  1959. mov bx,dx ; Return the long value in both
  1960. ret ; AX:BX and AX:DX
  1961. Public _network_drvs ; Network Drives returns a LONG
  1962. _network_drvs: ; vector with bits set for every drive
  1963. xor ax,ax ; Start with BX:AX as
  1964. mov bx,ax ; zeros.
  1965. mov cx,'Z'-'A' ; We look at drives A-Z
  1966. n_d10:
  1967. add ax,ax ; we move the dword vector
  1968. adc bx,bx ;  one place left
  1969. push ax
  1970. push bx ; save the vector
  1971. mov ah,MS_X_IOCTL
  1972. mov al,9 ; is device local ?
  1973. mov bl,cl ; drive number in BL
  1974. int DOS_INT
  1975. pop bx
  1976. pop ax ; recover the vector
  1977.  jc n_d20 ; if an error skip network bit
  1978. test dx,1000h ; is device local ?
  1979.  jz n_d20 ; if not then
  1980. or ax,1 ;  set bit for this drive
  1981. n_d20:
  1982. loop n_d10
  1983. mov dx,bx ; long value in both AX:BX and AX:DX
  1984. ret
  1985. public _physical_drive
  1986. _physical_drive PROC NEAR
  1987. ; BOOLEAN physical_drive(WORD);
  1988. ; returns true if given drive (0-25) is physical.
  1989. ;
  1990. push bp
  1991. mov bp,sp
  1992. push ds
  1993. push es
  1994. push si
  1995. push di
  1996. push dx
  1997. push cx
  1998. push bx
  1999. mov bx,4[bp] ; get the drive number
  2000. inc bx ; A=1, B=2, etc
  2001. mov ax,4409h ; IOCTL Network/Local
  2002. int 21h ; do it
  2003. jc not_phys ; carry means invalid drive
  2004. and dx,1000h ;
  2005. cmp dx,0
  2006. jne not_phys ; its a network drive
  2007. mov ax,cs
  2008. mov ds,ax
  2009. mov es,ax
  2010. mov si,offset func60_in
  2011. mov di,offset func60_out
  2012. mov ax,4[bp] ; insert drive letter in input string
  2013. add al,'A'
  2014. mov [si],al ;
  2015. mov ah,60h ; Expand Path string
  2016. int 21h ; do it
  2017. jc not_phys ; carry set means invalid drive
  2018. mov ax,4[bp] ; if drive letter changes then drive is
  2019. add al,'A' ; substed
  2020. cmp al,cs:[func60_out]
  2021. jne not_phys
  2022. mov ax,-1
  2023. jmp  phys_exit
  2024. not_phys:
  2025. mov ax,0
  2026. phys_exit:
  2027. pop bx
  2028. pop cx
  2029. pop dx
  2030. pop di
  2031. pop si
  2032. pop es
  2033. pop ds
  2034. pop bp
  2035. ret 
  2036. func60_in db "d:con",0
  2037. func60_out db 0,0,0,0,0,0,0,0,0,0
  2038. _physical_drive ENDP
  2039. ;
  2040. ; This function translates a logical to physical drive.
  2041. ;
  2042. Public _pdrive
  2043. ;------
  2044. _pdrive:
  2045. ;------
  2046. push bp
  2047. mov bp,sp
  2048. push ds
  2049. push es
  2050. push si
  2051. push di
  2052. mov ax,cs
  2053. mov ds,ax
  2054. mov es,ax
  2055. mov si,offset func60_in
  2056. mov di,offset func60_out
  2057. mov ax,4[bp] ; insert drive letter in input string
  2058. add al,'A'
  2059. mov [si],al
  2060. mov ah,60h ; Expand Path string
  2061. int 21h ; do it
  2062. mov ax,4[bp] ; assume invalid, hence no change
  2063.  jc pdrive_exit ; carry set means invalid drive
  2064. mov al,cs:[func60_out]
  2065. sub al,'A'
  2066. pdrive_exit:
  2067. pop di
  2068. pop si
  2069. pop es
  2070. pop ds
  2071. pop bp
  2072. CRET 2
  2073. public _logical_drive
  2074. _logical_drive PROC NEAR
  2075. ; BOOLEAN logical_drive(WORD);
  2076. ; returns TRUE if given drive (0-25) is logical
  2077. ;
  2078. push bp
  2079. mov bp,sp
  2080. push ds
  2081. push es
  2082. push si
  2083. push di
  2084. push dx
  2085. push cx
  2086. push bx
  2087. mov bx,4[bp] ; get the drive number
  2088. inc bx ; A=1, B=2, etc
  2089. mov ax,4409h ; IOCTL Network/Local
  2090. int 21h ; do it
  2091. jc not_logical ; carry means invalid drive
  2092. and dx,1000h ;
  2093. cmp dx,0
  2094. jne not_logical ; its a network drive
  2095. mov ax,cs
  2096. mov ds,ax
  2097. mov es,ax
  2098. mov si,offset func60_in
  2099. mov di,offset func60_out
  2100. mov ax,4[bp] ; insert drive letter in input string
  2101. add al,'A'
  2102. mov [si],al ;
  2103. mov ah,60h ; Expand Path string
  2104. int 21h ; do it
  2105. jc not_logical ; carry set means invalid drive
  2106. mov ax,4[bp] ; if drive letter changes then drive is
  2107. add al,'A' ; substed
  2108. cmp al,cs:[func60_out]
  2109. je not_logical
  2110. mov ax,-1
  2111. jmp  logical_exit
  2112. not_logical:
  2113. mov ax,0
  2114. logical_exit:
  2115. pop bx
  2116. pop cx
  2117. pop dx
  2118. pop di
  2119. pop si
  2120. pop es
  2121. pop ds
  2122. pop bp
  2123. ret 
  2124. _logical_drive ENDP
  2125. public _network_drive
  2126. _network_drive PROC NEAR
  2127. ; BOOLEAN network_drive(WORD);
  2128. ; returns TRUE if given drive (0-25) is networked
  2129. ;
  2130. push bp
  2131. mov bp,sp
  2132. push dx
  2133. push cx
  2134. push bx
  2135. mov bx,4[bp] ; get the drive number
  2136. inc bx ; A=1, B=2, etc
  2137. mov ax,4409h ; IOCTL Network/Local
  2138. int 21h ; do it
  2139. jc not_networked ; carry means invalid drive
  2140. and dx,1000h ;
  2141. cmp dx,0
  2142. jne not_networked ; its a network drive
  2143. mov ax,-1
  2144. jmp  network_exit
  2145. not_networked:
  2146. mov ax,0
  2147. network_exit:
  2148. pop bx
  2149. pop cx
  2150. pop dx
  2151. pop bp
  2152. ret 
  2153. _network_drive ENDP
  2154. endif ;EXT_SUBST
  2155. else ;!DOSPLUS
  2156. Public _physical_drvs ; Physical Drives returns a LONG
  2157. _physical_drvs: ; Vector with bits set for every
  2158. mov cx,DRV_LOGINVEC ; Physical or Networked Drive 
  2159. int BDOS_INT ; attached to the system
  2160. xor dx,dx ; Return the LONG value in both
  2161. mov bx,dx ; AX:DX and AX:BX for maximum
  2162. ret ; compatibility
  2163. Public _network_drvs ; Network Drives returns a LONG
  2164. _network_drvs: ; vector with bits set for every
  2165. push es ; physical drive which has been
  2166. mov ax,0 ; mapped to a remote DRNET server
  2167. mov dx,ax
  2168. les bx,_pd ; Get Our Process Descriptor
  2169. mov cx,es:P_NDA[bx] ; and then the NDA Segment
  2170.  jcxz n_d20 ; Skip Drive Test if no NDA
  2171. mov es,cx ; Get the RCT Address
  2172. les bx,es:dword ptr 04h ;; NDA_RCT ; From the NDA
  2173. mov cx,16
  2174. n_d10:
  2175. test es:RCT_DSK[bx],080h ; Is this a Remote drive
  2176.  jz n_d15 ; No
  2177. or ax,1 ; Set Drive Bit
  2178. n_d15:
  2179. ror ax,1 ; Rotate Drive Bit Vector
  2180. add bx,2 ; Update the Drive Pointer
  2181. loop n_d10 ; Loop Till Done
  2182. n_d20:
  2183. mov bx,dx ; Return the long value in both
  2184. pop es ; AX:BX and AX:DX
  2185. ret
  2186. ifndef EXT_SUBST
  2187. Public _logical_drvs ; Logical Drives returns a LONG
  2188. _logical_drvs: ; vector with bits set for every
  2189. push es
  2190. push si
  2191. push di
  2192. les si,_pd ; Get Our Process Descriptor
  2193. mov si,es:P_CAT[si] ; and then the address of the 
  2194. mov cx,16 ; first HDS and check the first
  2195. mov ax,0 ; 16 Drives
  2196. mov bx,ax
  2197. l_d10:
  2198. mov di,es:word ptr [si] ; Has this drive got an HDS
  2199. test di,di ; then skip setting the bit in 
  2200.  jz l_d20 ; the vector register
  2201. cmp es:byte ptr [di],bl ; Is the HDS pointing to same drive
  2202.  jz l_d20 ; Yes then this is a Physical Drive
  2203. or ax,1
  2204. l_d20:
  2205. ror ax,1
  2206. add si,2
  2207. inc bx
  2208. loop l_d10 ; Loop 16 Tines
  2209. mov cx,10 ; Finally check the last 10 HDS
  2210. mov dx,0
  2211. l_d30:
  2212. mov di,es:word ptr [si] ; Has this drive got an HDS
  2213. test di,di ; then skip setting the bit in 
  2214.  jz l_d40 ; the vector register
  2215. cmp es:byte ptr [di],bl ; Is the HDS pointing to same drive
  2216.  jz l_d40 ; Yes then this is a Physical Drive
  2217. or dx,1
  2218. l_d40:
  2219. ror dx,1
  2220. add si,2
  2221. inc bx
  2222. loop l_d30 ; Loop 10 Tines
  2223. mov cl,6 ; Now rotate the contents of 
  2224. ror dx,cl ; DX 6 more times for correct
  2225. ; alignment of bits
  2226. pop di
  2227. pop si
  2228. pop es
  2229. mov bx,dx ; Return the long value in both
  2230. ret ; AX:BX and AX:DX
  2231. ;
  2232. ; This function use the CONCURRENT 5.xx CP/M function to translate
  2233. ; a logical to physical drive.
  2234. ;
  2235. Public _pdrive
  2236. ;------
  2237. _pdrive:
  2238. ;------
  2239. push bp
  2240. mov bp,sp
  2241. mov dl,4[bp] ; get the logical drive
  2242. mov cl,175 ; Logical to Physical Xlat
  2243. int BDOS_INT
  2244. cbw
  2245. pop bp
  2246. CRET 2
  2247. endif ;!EXT_SUBST
  2248. endif ;!DOSPLUS
  2249. Public _toupper
  2250. UCASE equ 18 ; offset of dword ptr to uppercase func
  2251. ;-------
  2252. _toupper proc near
  2253. ;-------
  2254. ; Return the uppercase equivilant of the given character.
  2255. ; The uppercase function defined in the international info block is 
  2256. ; called for characters above 80h.
  2257. ;
  2258. ; char ch; char to be converted
  2259. ; char result; uppercase equivilant of ch
  2260. ;
  2261. ; result = toupper(ch);
  2262. push bp
  2263. mov bp, sp
  2264. mov ax, 4[bp]
  2265. mov ah, 0 ; al = character to be converted
  2266. cmp al, 'a' ; al < 'a'?
  2267. jb exit_toupper ;  yes - done (char unchanged)
  2268. cmp al, 'z' ; al <= 'z'?
  2269. jbe a_z ;  yes - do ASCII conversion
  2270. cmp al, 80h ; international char?
  2271. jb exit_toupper ;  no - done (char unchanged)
  2272. ; ch >= 80h  -- call international routine
  2273. call dword ptr [_country+UCASE]
  2274. jmp exit_toupper
  2275. a_z:
  2276. ; 'a' <= ch <= 'z'  -- convert to uppercase ASCII equivilant
  2277. and al, 0DFh
  2278. exit_toupper:
  2279. pop bp
  2280. ret
  2281. _toupper endp
  2282. ifdef DOSPLUS
  2283. if 0
  2284. Public _hiload_status
  2285. ;----------
  2286. _hiload_status:
  2287. ;----------
  2288. push bp
  2289. mov bp,sp
  2290. mov dx,100h ; get hiload state
  2291. mov ax,(MS_X_IOCTL*256)+57h ; IO Control function
  2292. int DOS_INT ; do INT 21h
  2293. pop bp ; 
  2294. ret
  2295. Public _hiload_set
  2296. ;----------
  2297. _hiload_set:
  2298. ;----------
  2299. push bp
  2300. mov bp,sp
  2301. mov dx,4[bp] ; get state
  2302. mov dh,2 ; set hiload state
  2303. mov ax,(MS_X_IOCTL*256)+57h ; IO Control function
  2304. int DOS_INT ; do INT 21h
  2305. pop bp ; 
  2306. ret
  2307. endif
  2308. Public _get_upper_memory_link
  2309. _get_upper_memory_link:
  2310. mov ax,5802h
  2311. int 21h
  2312. cbw
  2313. ret
  2314. Public _set_upper_memory_link
  2315. _set_upper_memory_link:
  2316. push bp
  2317. mov bp,sp
  2318. mov bx,4[bp]
  2319. mov ax,5803h
  2320. int 21h
  2321. pop bp
  2322. ret
  2323. Public _get_alloc_strategy
  2324. _get_alloc_strategy:
  2325. mov ax,5800h
  2326. int 21h
  2327. ret
  2328. Public _set_alloc_strategy
  2329. _set_alloc_strategy:
  2330. push bp
  2331. mov bp,sp
  2332. mov bx,4[bp]
  2333. mov ax,5801h
  2334. int 21h
  2335. pop bp
  2336. ret
  2337. Public _alloc_region
  2338. _alloc_region:
  2339. push es
  2340. xor ax,ax
  2341. mov es,ax ; assume no block allocated
  2342. mov ah,MS_M_ALLOC
  2343. mov bx,1
  2344. int 21h ; allocate a small block
  2345.  jc _alloc_region10
  2346. mov es,ax
  2347. mov ah,MS_M_SETBLOCK
  2348. mov bx,0FFFFh
  2349. int 21h ; find out how big the block is
  2350. mov ah,MS_M_SETBLOCK
  2351. int 21h ; now grow to take up the block
  2352. _alloc_region10:
  2353. mov ax,es ; return address of block
  2354. pop es
  2355. ret
  2356. Public _free_region
  2357. _free_region:
  2358. push bp
  2359. mov bp,sp
  2360. push es
  2361. mov es,4[bp]
  2362. mov ah,MS_M_FREE
  2363. int 21h ; free the block
  2364. pop es
  2365. pop bp
  2366. ret
  2367. endif
  2368. ; The Double Byte Character Set lead byte table.
  2369. ; Each entry in the table except the last specifies a valid lead byte range.
  2370. ;
  2371. ;   0 +---------------+---------------+
  2372. ;    |    start of |    end of  | DBCS table entry 0
  2373. ; |    range 0 |    range 0 |
  2374. ;   2 +---------------+---------------+
  2375. ;     |    start of |    end of  | DBCS table entry 1
  2376. ; |    range 1 |    range 1 |
  2377. ; +---------------+---------------+
  2378. ; :
  2379. ;   n +---------------+---------------+
  2380. ; |       0 |       0  | end of DBCS table
  2381. ; |     |     |
  2382. ; +---------------+---------------+
  2383. Public _dbcs_expected
  2384. _dbcs_expected proc near
  2385. ;-------------
  2386. ; Returns true if double byte characters are to be expected.
  2387. ; A call to dbcs_init() MUST have been made.
  2388. ; Entry
  2389. ; none
  2390. ; Exit
  2391. ; ax = 1 - double byte characters are currently possible
  2392. ;   0 - double byte characters are not currently possible
  2393. ifdef DOSPLUS
  2394. push ds
  2395. push si
  2396. lds si, dbcs_table_ptr ; DS:SI -> system DBCS table
  2397. lodsw ; ax = first entry in DBCS table
  2398. test  ax, ax ; empty table?
  2399.  jz de_exit ;  yes - return 0 (not expected)
  2400. mov ax, 1 ; return 1 (yes you can expect DBCS)
  2401. de_exit:
  2402. pop si
  2403. pop ds
  2404. else
  2405. xor ax,ax ; CDOS doesn't support them
  2406. endif
  2407. ret
  2408. _dbcs_expected endp
  2409. Public _dbcs_lead
  2410. _dbcs_lead proc near
  2411. ;---------
  2412. ; Returns true if given byte is a valid lead byte of a 16 bit character.
  2413. ; A call to init_dbcs() MUST have been made.
  2414. ; Entry
  2415. ; 2[bp] = possible lead byte
  2416. ; Exit
  2417. ; ax = 1 - is a valid lead byte
  2418. ;   0 - is not a valid lead byte
  2419. ifdef DOSPLUS
  2420. push bp
  2421. mov bp, sp
  2422. push ds
  2423. push si
  2424. mov bx, 4[bp] ; bl = byte to be tested
  2425. lds si,dbcs_table_ptr ; ds:si -> system DBCS table
  2426. lodsw ; any entries ?
  2427. test ax,ax
  2428.  jz dl_not_valid ; no DBC entries
  2429. dl_loop:
  2430. lodsw ; al/ah = start/end of range
  2431. test  ax, ax ; end of table?
  2432.  jz dl_not_valid ;  yes - exit (not in table)
  2433. cmp al, bl ; start <= bl?
  2434.  ja dl_loop ;  no - try next range
  2435. cmp ah, bl ; bl <= end?
  2436.  jb dl_loop ;  no - try next range
  2437. mov ax, 1 ; return 1 - valid lead byte
  2438. dl_not_valid:
  2439. pop si
  2440. pop ds
  2441. pop bp
  2442. else
  2443. xor ax,ax ; CDOS doesn't support them
  2444. endif
  2445. ret
  2446. _dbcs_lead endp
  2447. PUBLIC _extended_error
  2448. _extended_error PROC NEAR
  2449. mov ah,59h
  2450. mov bx,0
  2451. int 21h
  2452. neg ax
  2453. ret
  2454. _extended_error ENDP
  2455. PUBLIC _get_lines_page
  2456. _get_lines_page PROC NEAR
  2457. push bp
  2458. push es
  2459. mov ax,1130h
  2460. mov bx,0
  2461. mov dx,24 ; preset dx to 24 in case function not supported 
  2462. int 10h  
  2463. mov ax,dx ; returns (no. rows)-1 in dx
  2464. inc ax
  2465. pop es
  2466. pop bp
  2467. ret
  2468. _get_lines_page ENDP
  2469. PUBLIC _get_scr_width
  2470. _get_scr_width PROC NEAR
  2471. push bp
  2472. mov ah,0fh
  2473. int 10h
  2474. xor al,al
  2475. xchg ah,al
  2476. pop bp
  2477. ret
  2478. _get_scr_width ENDP
  2479. PUBLIC _novell_copy
  2480. _novell_copy PROC NEAR
  2481. push bp
  2482. mov bp,sp
  2483. push si
  2484. push di
  2485. mov ax,11f0h
  2486. mov si,4[bp] ; si = source handle
  2487. mov di,6[bp] ; di = destination handle
  2488. mov dx,8[bp] ; lo word of source length
  2489. mov cx,10[bp] ; hi word of source length
  2490. clc ; start with carry cleared
  2491. int 2fh ; do it
  2492. jc novcop_failure ; carry set means novell couldn't handle it
  2493. cmp ax,11f0h
  2494. je novcop_failure  ; ax hasn't changed, so novell isn't there
  2495. mov ax,1 ; success !
  2496. jmp novcop_exit
  2497. novcop_failure:
  2498. mov ax,0
  2499. novcop_exit:
  2500. pop di
  2501. pop si
  2502. pop bp
  2503. ret
  2504. _novell_copy ENDP
  2505. PUBLIC _call_novell
  2506. _call_novell PROC NEAR
  2507. push bp
  2508. mov bp,sp
  2509. push es
  2510. push si
  2511. push di
  2512. mov ah,8[bp]
  2513. mov al,0ffh
  2514. push ds
  2515. pop es
  2516. mov si,4[bp]
  2517. mov di,6[bp]
  2518. int 21h
  2519. cmp al,0
  2520. jne call_nov_err
  2521. jc call_nov_err
  2522. mov ax,0
  2523. jmp call_nov_exit
  2524. call_nov_err:
  2525. mov ah,0 ;; clear ah, BUT allow all ret' values in al 
  2526. call_nov_exit:
  2527. pop di
  2528. pop si
  2529. pop es
  2530. pop bp
  2531. ret
  2532. _call_novell ENDP
  2533. PUBLIC _nov_station
  2534. _nov_station PROC NEAR
  2535. push bp
  2536. mov bp,sp
  2537. push si
  2538. mov ax,0eeffh
  2539. int 21h
  2540. cmp ax,0ee00h
  2541. je ns_err
  2542. mov si,4[bp]
  2543. mov [si],cx
  2544. mov 2[si],bx
  2545. mov 4[si],ax
  2546. mov ax,0
  2547. jmp ns_exit
  2548. ns_err:
  2549. mov ax,-1
  2550. ns_exit:
  2551. pop si
  2552. pop bp
  2553. ret
  2554. _nov_station ENDP
  2555. public _nov_connection
  2556. _nov_connection PROC NEAR
  2557. push es
  2558. push si
  2559. if 0
  2560. mov ax,0
  2561. mov es,ax
  2562. mov si,0
  2563. mov ax,0ef03h
  2564. int 21h
  2565. mov ax,es
  2566. cmp ax,0
  2567. jne nc_ok
  2568. cmp si,0
  2569. jne nc_ok
  2570. mov ax,-1
  2571. jmp nc_exit
  2572. nc_ok:
  2573. mov al,es:23[si]
  2574. mov ah,0
  2575. endif
  2576. mov ax,0dc00h
  2577. int 21h
  2578. jc nc_err
  2579. sub ah,ah
  2580. jmp nc_exit
  2581. nc_err:
  2582. mov al,-1;
  2583. nc_exit:
  2584. pop si
  2585. pop es
  2586. ret
  2587. _nov_connection ENDP
  2588. _TEXT ENDS
  2589. END