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

操作系统开发

开发平台:

Asm

  1. ;    File              : $SUPPORT.A86$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;    SUPPORT.A86 1.11 93/11/29 13:39:28
  33. ;    Don't rely on DS when return_ called
  34. ;    ENDLOG
  35. ;
  36. ; The following Support routines are provided for both the 
  37. ; handle and FCB functions which require critical error handler
  38. ; support.
  39. ;
  40. ; 15 Jun 88 Modify the SYSDAT and SUPERVISOR variables to enable
  41. ;           the relocation of the BDOS into high memory
  42. ;  5 Jan 89 Only set PCKBD mode if we own the default console
  43. ;  9 Mar 89 Support a split PCMODE and SYSDAT Segments
  44. ; 22 Sep 89 LDT support routine added
  45. ; 29 Jan 90 Int 2A critical section support added to dpbdos_entry
  46. ;  7 Mar 90 Convert to register preserved function calls
  47. ;  4 May 90 DRDOS int3x handlers removed (they are pointed to IRET
  48. ;           in PCMODE_DATA by INIT.PCM)
  49. ; 12 Dec 90 keep error server number inverted so local = 0, more compatible
  50. ;
  51. include pcmode.equ
  52. include fdos.def
  53. include i:mserror.equ
  54. include i:doshndl.def
  55. eject
  56. PCM_CODE CSEG BYTE
  57. extrn error_exit:near ; Standard Error Exit Routine
  58. extrn fcberror_exit:near ; Special FCB function Error Exit
  59. extrn fdos_entry:near
  60. extrn get_dseg:near
  61. eject
  62. ;
  63. ; STRLEN determines the length of the string passed in DS:SI
  64. ; and returns the byte length in CX.
  65. ;
  66. Public strlen
  67. strlen:
  68. push es ! push di
  69. push ds ! pop es
  70. mov di,si
  71. mov cx,0FFFFh
  72. sub al,al
  73. repnz scasb
  74. pop di ! pop es
  75. not cx
  76. dec cx
  77. ret
  78. eject
  79. ;
  80. ; This routine sets the address to be returned to by the 
  81. ; FDOS when an error has occured and the RETRY request has been
  82. ; made. The set_retry routine should be used as follows:-
  83. ;
  84. ; mov al,Valid Error Responses
  85. ; call set_retry
  86. ; Init All FDOS Parameters
  87. ; call fdos_crit
  88. ;
  89. ; NB. For register model return with AX = dos_AL extended to 16 bit
  90. Public set_retry_RF
  91. set_retry_RF:
  92. mov al,OK_RF ; Valid to RETRY or FAIL
  93. ; jmp set_retry ; (the most common case)
  94. Public set_retry
  95. set_retry:
  96. mov valid_flg,al ; Save Valid Error Reponses
  97. pop retry_off ; Save the Routine Address
  98. mov retry_sp,sp ; and the Stack Pointer
  99. mov al,ah ; get function number
  100. xor ah,ah ; make it a word
  101. mov FD_FUNC,ax ; save it for the FDOS
  102. push ds
  103. push bx
  104. lds bx,int21regs_ptr ; point to users registers
  105. and reg_FLAGS[bx],not CARRY_FLAG
  106. mov al,reg_AL[bx] ; clear CY assuming we will succeed
  107. pop bx ;  and reload AL with entry value
  108. pop ds
  109. jmp retry_off
  110. ;
  111. ; The FDOS routine executes the CCP/M FDOS function using the 
  112. ; static FDOS parameter block defined in the Data Segment.
  113. ;
  114. Public fdos_crit
  115. fdos_crit:
  116. call fdos_nocrit
  117. cmp ax,ED_LASTERROR ; Compare against last error code
  118.  jnb fdos_error ; if NOT below then is ERROR CODE
  119. or ax,ax ; Reset the Carry Flag and Return
  120. ret
  121. Public fdos_ax_crit
  122. fdos_ax_crit:
  123. call fdos_nocrit
  124. cmp ax,ED_LASTERROR ; Compare against last error code
  125.  jnb fdos_error ; if NOT below then is ERROR CODE
  126. or ax,ax ; Reset the Carry Flag and Return
  127. ; jmp return_AX_CLC ; Save the Return Code
  128. Public return_AX_CLC
  129. return_AX_CLC:
  130. ;-------------
  131. ; On Entry:
  132. ; AX to be returned to caller in AX
  133. ; On Exit:
  134. ; ES:DI trashed
  135. ;
  136. push ds ! push di
  137. lds di,ss:int21regs_ptr
  138. mov reg_AX[di],ax ; return AX to caller
  139. and reg_FLAGS[di],not CARRY_FLAG
  140. pop di ! pop ds
  141. ret
  142. fdos_error: ; Process the Error
  143. cmp sp,retry_sp ; Is the user expecting use to 
  144.  jnz fdos_e10 ; return or use the default handler
  145. jmp error_exit ; If CALLed then return with the error
  146. fdos_e10: ; to the calling routine.
  147. stc
  148. ret
  149. Public fcbfdos_crit
  150. fcbfdos_crit:
  151. call fdos_nocrit
  152. cmp ax,ED_LASTERROR ; Compare against last error code
  153.  jnb fcbfdos_error ; if NOT below then is ERROR CODE
  154. or ax,ax ; Reset the Carry Flag and Return
  155. ret
  156. fcbfdos_error: ; Process the Error
  157. cmp sp,retry_sp ; Is the user expecting use to 
  158.  jnz fcbfdos_e10 ; return or use the default handler
  159. jmp fcberror_exit ; If CALLed then return with the error
  160. fcbfdos_e10: ; to the calling routine.
  161. stc
  162. ret
  163. Public fdos_nocrit
  164. fdos_nocrit:
  165. mov dx,offset fdos_data ; point to fdos parameter block
  166. push ds ! push es
  167. push si ! push di ! push bp
  168. call fdos_entry ; BDOS module entry point
  169. or ax,ax ; Set the Flags
  170. pop  bp ! pop  di ! pop  si
  171. pop es ! pop  ds
  172. ret
  173. Public reload_ES
  174. reload_ES:
  175. ; On Entry:
  176. ; None
  177. ; On Exit:
  178. ; ES = callers ES
  179. ; All regs preserved
  180. ;
  181. push bx
  182. les bx,ss:int21regs_ptr
  183. mov es,es:reg_ES[bx] ; reload with callers ES
  184. pop bx
  185. ret
  186. Public return_BX
  187. return_BX:
  188. ;---------
  189. ; On Entry:
  190. ; BX to be returned to caller in BX
  191. ; On Exit:
  192. ; All regs preserved
  193. ;
  194. push ds ! push bx
  195. lds si,ss:int21regs_ptr
  196. mov reg_BX[si],bx ; return BX to caller
  197. pop bx ! pop ds
  198. ret
  199. Public return_CX
  200. return_CX:
  201. ;---------
  202. ; On Entry:
  203. ; CX to be returned to caller in CX
  204. ; On Exit:
  205. ; All regs preserved
  206. ;
  207. push ds ! push bx
  208. lds bx,ss:int21regs_ptr
  209. mov reg_CX[bx],cx ; return CX to caller
  210. pop bx ! pop ds
  211. ret
  212. Public return_DX
  213. return_DX:
  214. ;---------
  215. ; On Entry:
  216. ; DX to be returned to caller in DX
  217. ; On Exit:
  218. ; All regs preserved
  219. ;
  220. push ds ! push bx
  221. lds bx,ss:int21regs_ptr
  222. mov reg_DX[bx],dx ; return DX to caller
  223. pop bx ! pop ds
  224. ret
  225. PCMODE_DATA DSEG WORD
  226. extrn current_psp:word
  227. extrn DBCS_tbl:word ; double byte character set table
  228. extrn int21regs_ptr:dword
  229. extrn retry_off:word
  230. extrn retry_sp:word
  231. extrn valid_flg:byte
  232. end