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

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile: CSUP.ASM$
  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. ;    ENDLOG
  33. ;
  34. ; 28 Jan 88 Change the validation check for the environment. Now we look
  35. ; for a valid DOS Memory Descriptor which is owned by the 
  36. ; Command Processor.
  37. ; 12 May 88 Handle Empty environments correctly (Thanks DesqView)
  38. ; 26 May 88 ach _stack is only defined for MSC
  39. ; 16 Jun 88 Support TURBO C Stack checking and enable CHKSTK for
  40. ;       MSC only.
  41. ; 26 Aug 88 Make the Minimum Stack Address Public
  42. ; 14 Apr 89 Make heap_top public
  43. ; 14 Jul 89 Move findeof to assembler
  44. ; 09 Oct 90 Write heap_size() to return remaining bytes on heap at 
  45. ;               any given instance
  46. ;
  47. _DLS_INCLS_ equ 1
  48. include message.def
  49. CGROUP GROUP _TEXT
  50. DGROUP GROUP _DATA
  51. codeOFFSET equ offset CGROUP:
  52. dataOFFSET equ offset DGROUP:
  53. STACKSLOP equ 128 ; Minimum Stack Size
  54. jmps macro label ; Define a Macro to generate the
  55. jmp SHORT label ; Short Jmp instruction
  56. endm
  57. _TEXT SEGMENT byte public 'CODE'
  58. ifdef MWC
  59. extrn longjmp:near ; MetaWare does not preceed library
  60. LONGJUMP equ longjmp ; functions with an UNDERSCORE
  61. else
  62. ifdef WATCOMC
  63. extrn longjmp_:near
  64. LONGJUMP equ longjmp_
  65. else
  66. extrn _longjmp:near
  67. LONGJUMP equ _longjmp
  68. endif
  69. endif
  70. assume cs:CGROUP, ds:DGROUP, es:nothing
  71. public _debug
  72. _debug proc near
  73. out 0fdh,al
  74. ret
  75. _debug endp
  76. ; Environment manipulation routines
  77. ; =================================
  78. ;
  79. ;BOOLEAN env_entry(BYTE *buf, WORD entry);
  80. ;
  81. ; Copy entry number ENTRY into the buffer BUF. Return FAILURE
  82. ; if ENTRY cannot be found.
  83. ;
  84. assume cs:CGROUP, ds:DGROUP, es:nothing
  85. public _env_entry
  86. _env_entry PROC near
  87. cld
  88. push bp
  89. mov bp,sp
  90. push ds
  91. push si
  92. push es
  93. push di
  94. call get_env ; Get the environment segment
  95. mov es,bx ; Initialise ES
  96. mov cx,ax ; Check the environment size - 1 
  97. dec cx ; and FFFF bytes if no env header 
  98. xor di,di ; Offset to start scaning for data
  99. xor ax,ax
  100. env_e10:
  101. cmp es:byte ptr [di],al ; Is this a Null string
  102. jz env_fail ; Then hit the end of the search
  103. cmp word ptr 06[bp],0 ; Is this the entry required
  104. jz env_e20
  105. repnz scasb ; Scan for the next zero byte
  106. jcxz env_fail ; and abort if out of space 
  107. dec word ptr 06[bp] ; Decrement the string count
  108. jmps env_e10
  109. env_e20: ; Found the correct entry now copy
  110. mov si,di ; Get the correct source offset
  111. push ds
  112. push es
  113. pop ds
  114. pop es
  115. mov di,04[bp]
  116. env_e30:
  117. lodsb
  118. stosb ; Copy byte through AL
  119. or al,al
  120. jnz env_e30 ; and check for end of string
  121. jmps env_exit
  122. _env_entry ENDP
  123. ;BOOLEAN env_scan(BYTE *key, BYTE *buf);
  124. ;
  125. ; Scan through the environment searching for the string KEY then copy
  126. ; the result into buffer.
  127. Public _env_scan
  128. _env_scan PROC near
  129. cld
  130. push bp
  131. mov bp,sp
  132. push ds
  133. push si
  134. push es
  135. push di
  136. call get_env ; Get the environment segment
  137. call get_key ; Find the key
  138. jz env_fail ; Abort if an error occurs
  139. add di,dx ; Add the Key length and just copy
  140. mov si,di ; The key definition into the 
  141. push ds ; Buffer
  142. push es
  143. pop ds
  144. pop es
  145. mov di,06[bp]
  146. env_s10:
  147. lodsb 
  148. stosb ; Copy byte through AL
  149. or al,al
  150. jnz env_s10 ; and check for end of string
  151. jmps env_exit
  152. _env_scan ENDP
  153. ;
  154. ; Environment handling exit routines
  155. env_err: ; Invalid Environment descriptor
  156. mov ax,-1 ; return with -1
  157. jmps env_ret
  158. env_fail: ; Environment fail the operation 
  159. mov ax,1 ; requested has failed.
  160. jmps env_ret
  161. env_exit:
  162. xor ax,ax
  163. env_ret PROC near
  164. pop di
  165. pop es
  166. pop si
  167. pop ds
  168. pop bp
  169. ret
  170. env_ret ENDP
  171. ;
  172. ;BOOLEAN env_del(BYTE *key);
  173. ; Delete the entry matching  KEY from the environment and return
  174. ; success or failure
  175. ;
  176. public _env_del
  177. _env_del PROC near
  178. cld
  179. push bp
  180. mov bp,sp
  181. push ds
  182. push si
  183. push es
  184. push di
  185. call get_env ; Get the environment segment
  186. jz env_err ; Stop if not the real thing
  187. call get_key ; Find the key
  188. jz env_fail ; Abort if an error occurs
  189. mov ds,bx ; Point DS at the environment
  190. mov si,di ; save the destination offset
  191. add di,dx ; and search for the end of this string
  192. xor ax,ax
  193. mov cx,-1
  194. repnz scasb ; Now search for the end of string
  195. xchg si,di ; Swap the source and destination
  196. env_d10:
  197. cmp al,[si] ; Is this the end of the environment
  198. jz env_d20 ; Yes so terminate
  199. env_d15:
  200. lodsb
  201. stosb ; Copy through AL checking for the end
  202. or al,al
  203. jnz env_d15 ; of the environment after each
  204. jmps env_d10 ; end of string.
  205. env_d20:
  206. stosw ; Force 0 word to be placed here to 
  207. jmps env_exit ; terminate the string
  208. _env_del ENDP
  209. ;BOOLEAN env_ins(BYTE *str);
  210. ; Insert the string at the end of the current environment
  211. ; checking if there is enough room to save the string.
  212. ;
  213. public _env_ins
  214. _env_ins PROC near
  215. cld
  216. push bp
  217. mov bp,sp
  218. push ds
  219. push si
  220. push es
  221. push di
  222. call get_env ; Get the environment segment
  223. jz env_err ; and its segment
  224. sub ax,2 ; Decrement the size of the env
  225. mov cx,ax ; to make sure we can store a 0
  226. xor ax,ax ; word terminator
  227. mov es,bx ; Find the end of the current env
  228. xor di,di
  229. env_i10:
  230. repnz scasb
  231. jcxz env_fail
  232. cmp al,es:byte ptr [di]
  233. jnz env_i10
  234. cmp di,1 ; Is this an empty Environment
  235. jnz env_i25 ; No. If yes then start from offset 0
  236. dec di
  237. env_i25:
  238. mov bx,di ; Save the starting address of string
  239. mov si,04[bp] ; Get the source string offset
  240. env_i20:
  241. lodsb
  242. stosb ; Copy the String until a zero byte
  243. or al,al ; then add the environment terminator
  244. loopnz env_i20
  245. mov es:word ptr [di],0
  246. jz env_exit ; Exit with no error if the string is
  247. mov es:byte ptr [bx],00 ; terminated correctly otherwise remove
  248. jmps env_fail ; all traces of this string and exit
  249. _env_ins ENDP
  250. ;
  251. page
  252. ;
  253. ; Returns environment size in Bytes in AX or zero if error
  254. ; and BX is the Environment segment.
  255. ;
  256. get_env PROC near
  257. push es
  258. mov dx,__psp ; Get the Current PSP in DX
  259. mov es,dx ; and point ES at Our PSP
  260. xor ax,ax ; and assume an error condition
  261. mov bx,es:002Ch ; get environment segment
  262. dec bx ; Check for memory descriptor
  263. mov es,bx
  264. inc bx
  265. cmp es:byte ptr 00h,'M' ; Byte 0 must contains either an 
  266. jz get_e10 ; M or Z and the DMD be owned by
  267. cmp es:byte ptr 00h,'Z' ; the Command Processor
  268. jnz get_e20
  269. get_e10:
  270. if 0
  271. cmp dx,es:word ptr 1h ; Is this "OUR" PSP if not then
  272. jnz get_e20 ; complain bitterly.
  273. endif
  274. mov ax,es:word ptr 3h ; Get the memory size in paragraphs
  275. shl ax,1 ; convert to size in bytes and exit.
  276. shl ax,1
  277. shl ax,1
  278. shl ax,1
  279. get_e20:
  280. pop es
  281. or ax,ax
  282. ret
  283. get_env ENDP
  284. ;
  285. ; enter this search function with BX == ENVIRONMENT SEGMENT
  286. ; 04[bp] == Key string offset
  287. ; On exit AX == 0 Failure
  288. ; else DX is Key string Length
  289. ; DI is Offset
  290. ;
  291. get_key PROC near
  292. push ds
  293. pop es ; Calculate the length of the 
  294. mov di,04[bp] ; key by scaning the string for
  295. mov al,0 ; a zero byte.
  296. mov cx,-1
  297. repnz scasb
  298. neg cx ; CX is the length of the sting + 2
  299. sub cx,2
  300. mov dx,cx ; Save the count in dx
  301. xor ax,ax
  302. mov es,bx ; Point ES at the environment
  303. xor di,di ; and start from the begining
  304. get_k10:
  305. push di ; Save incase this is a match
  306. mov cx,dx ; Get the string length
  307. mov si,04[bp] ; and offset and check for a match
  308. repz cmpsb
  309. jnz get_k20 ; No match so get the next string
  310. pop di ; This is the starting offset
  311. or ax,-1 ; All ok
  312. ret
  313. get_k20:
  314. pop cx ; Throw away the old DI
  315. mov cx,-1 ; Set the count to maximum
  316. repnz scasb ; and search for the end of the string
  317. cmp al,es:[di] ; exit with error if this is the end
  318. jnz get_k10 ; of the environment
  319. ret
  320. get_key ENDP
  321. page
  322. assume cs:CGROUP, ds:DGROUP, es:nothing
  323. ifdef MSC
  324. ;
  325. ;
  326. ; STACK(WORD) allocates memory from the C STACK if at any stage
  327. ; the stack grows to within STACKSLOP of the top of the heap this
  328. ; function executes a LONGJUMP using the BREAK_ENV buffer. This will
  329. ; terminate any internal function.
  330. ;
  331. PUBLIC _stack
  332. _stack:
  333. pop bx ; Get the return address
  334. pop cx ; and the number of bytes required
  335. add cx,1 ; Force CX to be a even value to
  336. and cx,not 1 ; ensure the stack is word aligned
  337. mov ax,sp ; Get the Stack
  338. sub ax,STACKSLOP ; Include STACKSLOP
  339. sub ax,cx ; Subtract requested buffer
  340. jc heap_error ; Exit with error if Carry
  341. cmp ax,heap_top ; Are we still above the heap
  342. jc heap_error ; No
  343. pop ax ; Get possible saved SI
  344. pop dx ; Get possible saved DI
  345. push dx ; Restore the stack to its
  346. push ax ; origibnal format
  347. sub sp,cx ; All OK so update SP
  348. push dx ; Save possible saved DI
  349. push ax ; Save possible saved SI
  350. mov ax,sp ; Return pointer
  351. add ax,4 ; Adjust pointer for saved SI/DI
  352. push cx ; Restore the entry parameter
  353. jmp bx ; and return to the caller
  354. endif
  355. ;
  356. ; HEAP_GET(WORD) allocates memory from the C HEAP if at any stage
  357. ; the heap grows to within STACKSLOP of the base of the stack this
  358. ; function executes a LONGJUMP using the BREAK_ENV buffer. This will
  359. ; terminate any internal function.
  360. ;
  361. PUBLIC _heap_get
  362. _heap_get:
  363. push bp
  364. mov bp,sp
  365. mov ax,heap_top
  366. add ax,04[bp] ; Add in the requested value
  367. jc heap_error ; Exit with error if Carry
  368. sub bp,STACKSLOP ; now check that the stack
  369. cmp bp,ax ; is still well above the 
  370. jc heap_error ; heap.
  371. mov stack_min,ax ; Update the Stack Minimum Variable
  372. add stack_min,STACKSLOP ; for the CHKSTK routine
  373. xchg ax,heap_top ; Return the existing heap top
  374. pop bp ; and update the local variable
  375. ret ; with the new value.
  376. heap_error:
  377. mov dx,3 ; Return the Heap Overflow error
  378. push dx
  379. mov ax,dataOFFSET _break_env ; using the JMP_BUF
  380. push ax
  381. call LONGJUMP ; We are never coming back
  382. ;
  383. ; HEAP_SIZE returns the size remaining on the C HEAP 
  384. ;
  385. PUBLIC _heap_size
  386. _heap_size:
  387. push bp
  388. mov bp,sp
  389. mov ax,heap_top
  390.         add     ax,STACKSLOP
  391. sub bp,ax
  392.         jnc     noprobs
  393.         xor     bp,bp
  394. noprobs:
  395. mov ax,sp
  396. pop bp
  397. ret
  398. ;
  399. ; HEAP() can only return a pointer to the top of the C Heap
  400. ; and is identical in function to HEAP_GET(0) except that no
  401. ; overflow checking is required and the calling overhead is 
  402. ; minimal.
  403. ;
  404. PUBLIC _heap
  405. _heap:
  406. mov ax,heap_top
  407. ifndef FINAL
  408. ifdef WATCOMC
  409. add ax,STACKSLOP ; we'd better do some stack checking
  410. cmp ax,sp ; 'cause the C isn't doing it now
  411.  jae heap_error
  412. sub ax,STACKSLOP
  413. endif
  414. endif
  415. ret
  416. ;
  417. ; VOID HEAP_SET(BYTE *) forces the heap to a specified value
  418. ;
  419. PUBLIC _heap_set
  420. _heap_set:
  421. push bp
  422. mov bp,sp
  423. mov ax,04[bp] ; Get the new value for the HEAP
  424. cmp ax,dataOFFSET _end ; base and check against the 
  425. jnb heap_s10 ; absolute base. If below then force
  426. mov ax,dataOFFSET _end ; the heap to the absolute base
  427. heap_s10:
  428. mov heap_top,ax
  429. mov stack_min,ax
  430. add stack_min,STACKSLOP
  431. pop bp
  432. ret
  433. page
  434. ifdef MSC
  435. ;
  436. ; This is our own Stack Check routine which is called on 
  437. ; entry to every C routine. AX contains the number of bytes
  438. ; to be reseved on the stack.
  439. ;
  440. PUBLIC __chkstk
  441. __chkstk:
  442. pop cx ; Get the Return Address
  443. mov bx,sp ; Calculate the new SP value
  444. sub bx,ax ; AX contains the number of bytes
  445. jc OVERFLOW@ ; to reserve.
  446. cmp bx,stack_min ; Check we are still above the heap
  447. jc OVERFLOW@ ; No !!! Help
  448. mov sp,bx ; Update the Stack pointer
  449. jmp cx ; Its Ok lets go back
  450. endif
  451. ifdef WATCOMC
  452. Public __STK
  453. __STK:
  454. cmp ax,sp
  455.  jnb OVERFLOW@
  456. sub ax,sp
  457. neg ax
  458. cmp ax,stack_min
  459.  jbe OVERFLOW@
  460. ret
  461. endif
  462. ifdef TURBOC
  463. Public OVERFLOW@ ; Public TURBOC Stack Error Handler
  464. endif
  465. OVERFLOW@:
  466. mov dx,2 ; Return the STACK Overflow error
  467. push dx
  468. mov ax,dataOFFSET _break_env ; using the JMP_BUF
  469. push ax
  470. call LONGJUMP ; We are never coming back
  471. ; MLOCAL UWORD CDECL findeof(s, count) /* find ^Z in buffer    */
  472. ; BYTE FAR   *s; /* buffer to search    */
  473. ; UWORD  count; /* # of bytes in buffer    */
  474. ; {
  475. ; REG UWORD i;
  476. ;  i = count;
  477. ;  while(i) { /* Scan through the data   */
  478. ;      if(*s++ == (BYTE) 0x1A) /* looking for a Control-Z */
  479. ;          break;
  480. ;      i--;
  481. ;  }
  482. ;  return (count - i);
  483. ; }
  484. PUBLIC _findeof
  485. _findeof:
  486. push bp ; establish a stack frame
  487. mov bp,sp ;  s dword 04[bp]
  488. push es ;  count word 08[bp]
  489. push di ; save important registers
  490. cld
  491. les di,4[bp] ; load up the pointer
  492. mov cx,8[bp] ;  and the count
  493. mov al,26 ; looking for EOF mark in the buffer
  494. repne scasb ;  scan until we find one
  495.  jne findeof10 ; if we do find one
  496. inc cx ;  then include it in the count
  497. findeof10:
  498. mov ax,8[bp] ; we wanted this many
  499. sub ax,cx ;  subtract any past EOF
  500. pop di
  501. pop es
  502. pop bp
  503. ret
  504. ifdef DLS
  505. public _my_dls_init
  506. ; void my_dls_init()
  507. ;extrn _dls_init:near
  508. ;extrn _dls_get_table:near
  509. _my_dls_init proc far
  510. push ds
  511. push cs
  512. pop ds
  513. call _dls_init
  514. mov ax,1
  515. push ax
  516. call _dls_get_table
  517. pop ax
  518. pop ds
  519. ret
  520. _my_dls_init endp
  521. public _copy_crit_msgs
  522. _copy_crit_msgs proc near 
  523. extrn _crit_msgs:word
  524. extrn _crit_text:byte
  525. push ds
  526. push es
  527. push di
  528. push si
  529. push ds
  530. pop es
  531. push cs
  532. pop ds
  533. mov si,_dls_table
  534. add si,msg0
  535. mov si,[si]
  536. mov di,offset DGROUP:_crit_text
  537. add di,2
  538. mov bx,offset DGROUP:_crit_msgs
  539. add bx,2
  540. mov cx,24
  541. ccm_loop1:
  542. mov es:[bx],di
  543. add bx,2
  544. ccm_loop2:
  545. lodsb
  546. stosb
  547. cmp al,'$'
  548. jne ccm_loop2
  549. loop ccm_loop1
  550. pop si
  551. pop di
  552. pop es
  553. pop ds
  554. ret
  555. _copy_crit_msgs endp
  556. public _copy_rld_msgs
  557. _copy_rld_msgs proc near
  558. extrn _rld_msgs:word
  559. extrn _rld_text:byte
  560. push ds
  561. push es
  562. push di
  563. push si
  564. push ds
  565. pop es
  566. push cs
  567. pop ds
  568. mov si,_dls_table
  569. add si,reload_msgs
  570. mov si,[si]
  571. mov di,offset DGROUP:_rld_text
  572. add di,2
  573. mov bx,offset DGROUP:_rld_msgs
  574. add bx,2
  575. mov cx,3
  576. crm_loop1:
  577. mov es:[bx],di
  578. add bx,2
  579. crm_loop2:
  580. lodsb
  581. stosb
  582. cmp al,0
  583. jne crm_loop2
  584. loop crm_loop1
  585. pop si
  586. pop di
  587. pop es
  588. pop ds
  589. ret
  590. _copy_rld_msgs endp
  591. public _dls_msg1
  592. ; char *dls_msg1(int)
  593. _dls_msg1:
  594. push bp
  595. mov bp,sp
  596. push bx
  597. mov ax,4[bp]
  598. shl ax,1
  599. mov bx,cs:_dls_table
  600. add bx,ax
  601. mov ax,cs:[bx]
  602. pop bx
  603. pop bp
  604. ret
  605. endif   ; ifdef DLS
  606. public _dos_parse_filename
  607. _dos_parse_filename proc near
  608. push bp
  609. mov bp,sp
  610. sub sp,30h
  611. push es
  612. push ds
  613. pop es
  614. lea di,-30h[bp]
  615. mov si,4[bp]
  616. mov ax,2901h
  617. int 21h
  618. mov ah,0
  619. pop es
  620. add sp,30h
  621. pop bp
  622. ret
  623. _dos_parse_filename endp
  624. public _flush_cache
  625. _flush_cache proc near
  626. push si
  627. push di
  628. push bp
  629. mov ax,4a10h
  630. mov bx,0
  631. mov cx,0edch
  632. int 2fh
  633. cmp ax,6756h ; NWCACHE
  634. je do_flush
  635. cmp ax,0BABEh ; SmartDrive
  636. jne skip_flush
  637. do_flush:
  638. mov ax,4a10h
  639. mov bx,1
  640. mov cx,0edch
  641. int 2fh
  642. skip_flush:
  643. pop bp
  644. pop di
  645. pop si
  646. ret
  647. _flush_cache endp
  648. _TEXT ENDS
  649. page
  650. _DATA SEGMENT byte public 'DATA'
  651. extrn __psp:word
  652. extrn _end:byte
  653. extrn _break_env:word
  654. extrn low_seg:word
  655. public stack_min
  656. public heap_top
  657. ifdef TURBOC
  658. public ___brklvl ; Turbo C does an inline check against
  659. ___brklvl label word ; ___brklvl and id SP < ___brklvl then
  660. endif ; it calls OVERFLOW@
  661. stack_min dw dataOFFSET _end + STACKSLOP
  662. heap_top dw dataOFFSET _end ; Current Top of Heap
  663. _DATA ENDS
  664. END