ktimer.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:3k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ;*
  2. ;* COW : Character Oriented Windows
  3. ;*
  4. ;* ktimer.asm : kernel timer routine (for LRU sweep only at present).
  5. include kernel.inc
  6. ctickLruMax EQU 6 ;* 6/18 = 1/3 s (approx.)
  7. IFDEF DEBPUB
  8. PUBLIC HandlerTimer
  9. ENDIF ;DEBPUB
  10. sBegin DATA
  11.     assumes DS,DGROUP
  12. externDP pwndAlarm ;* != NULL if alarm set
  13. externW  fMessage
  14. globalW  wTimer,0
  15. sEnd DATA
  16. sBegin BSS
  17.     assumes DS,DGROUP
  18. labelD pfnHdlrTimer ;* old int8 handler
  19. staticW OFF_pfnHdlrTimer,?
  20. staticW SEG_pfnHdlrTimer,?
  21. staticB ctickLruCur,0
  22. sEnd BSS
  23. ;* * Entries to initialize
  24. sBegin KERNEL
  25. ;* * LRU sweep
  26. externNP    <SweepLru> ;* from ldthunk.asm
  27. sEnd KERNEL
  28. sBegin INIT
  29.     assumes CS,INIT
  30.     assumes DS,DGROUP
  31.     assumes SS,DGROUP
  32. ;********** FInitSysTimer **********
  33. ;* entry : n/a
  34. ;* * Called to initialize the timer routine
  35. ;* exit : AX == true
  36. cProc FInitSysTimer,<FAR,PUBLIC,ATOMIC>
  37. cBegin FInitSysTimer
  38. mov ax,3508H ; Get Interrupt Vector 8H
  39. int 21H
  40. mov OFF_pfnHdlrTimer,bx
  41. mov SEG_pfnHdlrTimer,es
  42. ;* * Set new interrupt handler
  43. push ds
  44. mov ax,SEG kernelBase ;* both in KERNEL segment
  45. mov ds,ax
  46.     assumes ds,nothing
  47. mov dx,kernelOffset HandlerTimer
  48. mov ax,2508H ; Set Interrupt Vector 8
  49. int 21H
  50. pop ds
  51.     assumes ds,DATA
  52. mov ax,sp ;* always return true
  53. cEnd FInitSysTimer
  54. sEnd INIT
  55. ;*****************************************************************************
  56. sBegin EXIT
  57.     assumes CS,EXIT
  58.     assumes SS,DATA
  59.     assumes DS,DATA
  60. ;********** EndSysTimer **********
  61. ;* entry : n/a
  62. ;* * Unhook the timer interrupt
  63. ;* exit : n/a
  64. cProc EndSysTimer,<FAR,PUBLIC,ATOMIC>
  65. cBegin EndSysTimer
  66. push ds
  67. lds dx,pfnHdlrTimer
  68.     assumes ds,NOTHING
  69. mov ax,2508H ; Set Interrupt Vector 8H
  70. int 21H
  71. pop ds
  72.     assumes ds,DATA
  73. cEnd EndSysTimer
  74. sEnd EXIT
  75. ;*****************************************************************************
  76. sBegin KERNEL
  77.     assumes CS,KERNEL
  78.     assumes SS,NOTHING
  79.     assumes DS,NOTHING ;* interrupt handler may be called from anywhere
  80. ;********* HandlerTimer **********
  81. ;* INTERRUPT HANDLER
  82. ;* entry : hardware timer interrupt (every ~1/18 of a second).
  83. cProc HandlerTimer,<FAR,ATOMIC>
  84. cBegin nogen;HandlerTimer
  85. push ax
  86. push ds
  87. mov ax,SEG DGROUP
  88. mov ds,ax
  89.     assumes ds,DATA
  90. ;* * call the old int8 handler
  91. pushf ;* make it look like an interrupt
  92. call [pfnHdlrTimer]
  93. ;* * if alarm set, set fMessage
  94. mov ax,pwndAlarm
  95. or fMessage,ax
  96. ;* * see if we must decrement the pCode's timer counter
  97. cmp wTimer,0
  98. jne DoDecr
  99. DoneDecr:
  100. ;* * see if we must sweep the LRU
  101. mov al,ctickLruCur
  102. inc al
  103. mov ctickLruCur,al ;* update count
  104. cmp al,ctickLruMax
  105. jb end_sweep
  106. ;* * Sweep the LRU : Enable interrupts first !!!
  107. mov ctickLruCur,0 ;* start over
  108. STI
  109. Save <bx,cx,dx,es> ;* save trashable registers
  110. cCall SweepLru
  111. end_sweep:
  112. pop ds
  113.     assumes ds,nothing
  114. pop ax ;* restore everything
  115. iret
  116. cEnd nogen;HandlerTimer
  117. ; --------------------------------------
  118. assumes ds,DATA
  119. DoDecr: ;* The pCode has set wTimer != 0.
  120. dec wTimer ;* It's our job to decrement it once
  121. jmp short DoneDecr ;*   per timer tick until back to 0.
  122. assumes ds,nothing
  123. ; --------------------------------------
  124. sEnd KERNEL
  125. ;*****************************************************************************
  126. END