ENTRY.ASM
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:7k
源码类别:

操作系统开发

开发平台:

DOS

  1. ;
  2. ; File:
  3. ;    entry.asm
  4. ; Description:
  5. ;        System call entry code
  6. ;
  7. ; Copyright (c) 1998
  8. ; Pasquale J. Villani
  9. ; All Rights Reserved
  10. ;
  11. ; This file is part of DOS-C.
  12. ;
  13. ; DOS-C is free software; you can redistribute it and/or
  14. ; modify it under the terms of the GNU General public License
  15. ; as published by the Free Software Foundation; either version
  16. ; 2, or (at your option) any later version.
  17. ;
  18. ; DOS-C is distributed in the hope that it will be useful, but
  19. ; WITHOUT ANY WARRANTY; without even the implied warranty of
  20. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  21. ; the GNU General public License for more details.
  22. ;
  23. ; You should have received a copy of the GNU General public
  24. ; License along with DOS-C; see the file COPYING.  If not,
  25. ; write to the Free Software Foundation, 675 Mass Ave,
  26. ; Cambridge, MA 02139, USA.
  27. ;
  28. ; $Header:   C:/dos-c/src/kernel/entry.asv   1.0   07 Feb 1998 20:42:08   patv  $
  29. ;
  30. ; $Log:   C:/dos-c/src/kernel/entry.asv  $
  31. ;  
  32. ;     Rev 1.0   07 Feb 1998 20:42:08   patv
  33. ;  Modified stack fram to match DOS standard
  34. ; $EndLog$
  35. page 60,132
  36. title System call entry code
  37. IFDEF ??version
  38. _TEXT segment byte public 'CODE'
  39. DGROUP group _FIXED_DATA,_DATA,_BSS,_BSSEND ; small model
  40. assume cs:_TEXT,ds:DGROUP,ss:DGROUP
  41. _TEXT ends
  42. _FIXED_DATA segment para public 'DATA'
  43. _FIXED_DATA ends
  44. _DATA segment word public 'DATA'
  45. _DATA ends
  46. _BSS segment word public 'BSS'
  47. _BSS ends
  48. _BSSEND segment byte public 'STACK'
  49. _BSSEND ends
  50. ELSE
  51. _TEXT segment byte public 'CODE'
  52. _TEXT ends
  53. _FIXED_DATA segment para public 'DATA'
  54. _FIXED_DATA ends
  55. _DATA segment word public 'DATA'
  56. _DATA ends
  57. CONST segment word public 'CONST'
  58. CONST ends
  59. _BSS segment word public 'BSS'
  60. _BSS ends
  61. _BSSEND segment byte public 'STACK'
  62. _BSSEND ends
  63. DGROUP group CONST,_DATA,_BSS,_BSSEND ; small/tiny model
  64. assume ds:DGROUP, ss:DGROUP
  65. ENDIF
  66. include stacks.inc
  67. _TEXT segment byte public 'CODE'
  68. extrn _int21_syscall:near
  69. extrn _int25_handler:NEAR, _int26_handler:NEAR
  70. extrn _set_stack:FAR
  71. extrn _restore_stack:FAR
  72. extrn _api_sp:WORD
  73. extrn _api_ss:WORD
  74. extrn _disk_api_tos:WORD
  75. public _cpm_entry
  76. public _int20_handler
  77. public _int21_handler
  78. public _low_int25_handler
  79. public _low_int26_handler
  80. public _int27_handler
  81. ;
  82. ; MS-DOS CP/M style entry point
  83. ;
  84. ; VOID FAR 
  85. ; cpm_entry(iregs UserRegs)
  86. ;
  87. ; This one is a strange one.  The call is to psp:0005h but it returns to the 
  88. ; function after the call.  What we do is convert it to a normal call and 
  89. ; fudge the stack to look like an int 21h call.
  90. ;
  91. assume cs:_TEXT
  92. _cpm_entry proc far
  93. ; Stack is:
  94. ; return offset
  95. ; psp seg
  96. ; 000ah
  97. ;
  98. push bp ; trash old return address
  99. mov bp,sp
  100. xchg bp,2[bp]
  101. pop bp
  102. pushf ; start setting up int 21h stack
  103. ;
  104. ; now stack is
  105. ; return offset
  106. ; psp seg
  107. ; flags
  108. ;
  109. push bp
  110. mov bp,sp ; set up reference frame
  111. ;
  112. ; reference frame stack is
  113. ; return offset bp + 6
  114. ; psp seg bp + 4
  115. ; flags bp + 2
  116. ; bp <--- bp
  117. ;
  118. push ax
  119. mov ax,2[bp] ; get the flags
  120. xchg ax,6[bp] ; swap with return address
  121. mov 2[bp],ax
  122. pop ax ; restore working registers
  123. pop bp
  124. ;
  125. ; Done. Stack is
  126. ; flags
  127. ; psp seg (alias .COM cs)
  128. ; return offset
  129. ;
  130. cmp cl,024h
  131. jbe cpm_error
  132. mov ah,cl ; get the call # from cl to ah
  133. jmp short _int21_handler ; do the system call
  134. cpm_error: mov al,0
  135. iret
  136. _cpm_entry endp
  137. ;
  138. ; Terminate the current process
  139. ;
  140. ; VOID INRPT far 
  141. ; int20_handler(iregs UserRegs)
  142. ;
  143. assume cs:_TEXT
  144. _int20_handler proc far
  145. mov ah,0 ; terminate through int 21h
  146. _int20_handler endp
  147. ;
  148. ; MS-DOS system call entry point
  149. ;
  150. ; VOID INRPT far 
  151. ; int21_handler(iregs UserRegs)
  152. ;
  153. assume cs:_TEXT
  154. _int21_handler proc far
  155. ;
  156. ; Create the stack frame for C call.  This is done to 
  157. ; preserve machine state and provide a C structure for 
  158. ; access to registers.
  159. ;
  160. ; Since this is an interrupt routine, CS, IP and flags were 
  161. ; pushed onto the stack by the processor, completing the 
  162. ; stack frame.
  163. ;
  164. ; NB: stack frame is MS-DOS dependent and not compatible
  165. ; with compiler interrupt stack frames.
  166. ;
  167. PUSH$ALL
  168. ;
  169. ; Create kernel refernce frame.
  170. ;
  171. ; NB: At this point, SS != DS and won't be set that way 
  172. ; until later when which stack to run on is determined.
  173. ;
  174. mov bp,DGROUP
  175. mov ds,bp
  176. mov bp,sp
  177. ;
  178. ; Push the far pointer to the register frame for 
  179. ; int21_syscall and remainder of kernel.
  180. ;
  181. push ss
  182. lea ax,word ptr [bp]
  183. push ax
  184. call near ptr _int21_syscall
  185. ;
  186. ; Clean up stack.  It's int2_syscall responsibility to 
  187. ; restore user stack.
  188. ;
  189. pop cx
  190. pop cx
  191. ;
  192. ; Recover registers from system call.  Registers and flags 
  193. ; were modified by the system call.
  194. ;
  195. POP$ALL
  196. ;
  197. ; ... and return.
  198. ;
  199. iret
  200. _int21_handler endp
  201. ;
  202. ; Terminate the current process
  203. ;
  204. ; VOID INRPT far 
  205. ; int27_handler(iregs UserRegs)
  206. ;
  207. assume cs:_TEXT
  208. _int27_handler proc far
  209. ;
  210. ; First convert the memory to paragraphs
  211. ;
  212. add dx,0fh ; round up
  213. rcr dx,1
  214. shr dx,1
  215. shr dx,1
  216. shr dx,1
  217. ;
  218. ; ... then use the standard system call
  219. ;
  220. mov ax,3100h
  221. jmp short _int21_handler ; terminate through int 21h
  222. _int27_handler endp
  223. ;
  224. ; I really do need to get rid of this because it's the only thing stopping 
  225. ; us from being ROMABLE.
  226. ;
  227. stkframe        dd      ?
  228. _low_int25_handler  proc far
  229. sti
  230. pushf
  231. push    ax
  232. push    cx
  233. push    dx
  234. push    bx
  235. push    sp
  236. push    bp
  237. push    si
  238. push    di
  239. push    ds
  240. push    es
  241. mov     word ptr cs:stkframe, sp     ; save stack frame
  242. mov     word ptr cs:stkframe+2, ss
  243. cld
  244. mov     ax, seg DGROUP
  245. mov     ds, ax
  246. mov     word ptr DGROUP:_api_sp, offset DGROUP:_disk_api_tos
  247. mov     word ptr DGROUP:_api_ss, ds
  248. call    far ptr _set_stack
  249. push    word ptr cs:stkframe+2
  250. push    word ptr cs:stkframe
  251. call    _int25_handler
  252. add     sp, 4
  253. call    far ptr _restore_stack
  254. pop     es
  255. pop     ds
  256. pop     di
  257. pop     si
  258. pop     bp
  259. pop     bx      ; pop off sp value
  260. pop     bx
  261. pop     dx
  262. pop     cx
  263. pop     ax
  264. popf
  265. retf            ; Bug-compatiblity with MS-DOS.
  266.                 ; This function is supposed to leave the original
  267.                 ; flag image on the stack.
  268. _low_int25_handler  endp
  269. _low_int26_handler  proc far
  270. sti
  271. pushf
  272. push    ax
  273. push    cx
  274. push    dx
  275. push    bx
  276. push    sp
  277. push    bp
  278. push    si
  279. push    di
  280. push    ds
  281. push    es
  282. mov     word ptr cs:stkframe, sp     ; save stack frame
  283. mov     word ptr cs:stkframe+2, ss
  284. cld
  285. mov     ax, seg DGROUP
  286. mov     ds, ax
  287. mov     word ptr DGROUP:_api_sp, offset DGROUP:_disk_api_tos
  288. mov     word ptr DGROUP:_api_ss, ds
  289. call    far ptr _set_stack
  290. push    word ptr cs:stkframe+2
  291. push    word ptr cs:stkframe
  292. call    _int26_handler
  293. add     sp, 4
  294. call    far ptr _restore_stack
  295. pop     es
  296. pop     ds
  297. pop     di
  298. pop     si
  299. pop     bp
  300. pop     bx      ; pop off sp value
  301. pop     bx
  302. pop     dx
  303. pop     cx
  304. pop     ax
  305. popf
  306. retf            
  307. _low_int26_handler  endp
  308. _TEXT ends
  309. end