home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / ctask.zip / TSKTIM.ASM < prev    next >
Assembly Source File  |  1988-03-01  |  4KB  |  220 lines

  1. ;
  2. ;    CTask - Timer interrupt handler (IBM specific)
  3. ;
  4. ;    Public Domain Software written by
  5. ;        Thomas Wagner
  6. ;        Patschkauer Weg 31
  7. ;        D-1000 Berlin 33
  8. ;        West Germany
  9. ;
  10.     name    tsktim
  11.     .model    large
  12. ;
  13.     public    _tsk_install_timer
  14.     public    _tsk_remove_timer
  15.     public    _tsk_chain_timer
  16. ;
  17.     include    tsk.mac
  18. ;
  19. timer    equ    40h            ; 8253 timer base I/O address
  20. inta00    equ    20h            ; 8259 int controller base
  21. eoi    equ    20h            ; unspecific EOI
  22. ;
  23. intseg    segment at 0
  24. ;
  25.         org    8*4
  26. tintofs        dw    ?        ; timer interrupt entry
  27. tintseg        dw    ?
  28.  
  29. intseg    ends
  30. ;
  31. ;
  32.     .data?
  33. ;
  34.     extrn    _tsk_timer_counter:word
  35. ;
  36. divisor        dw    ?
  37. timflag        dw    ?
  38. timcnt        dw    ?
  39. sys_ticks    dw    ?
  40. ;
  41.     .code
  42. ;
  43.     extrn    _sched_int: far
  44.     extrn    _inc_counter: far
  45. ;
  46. timer_save    label    dword        ; in CSEG to allow addressing
  47. tsofs        dw    ?
  48. tsseg        dw    ?
  49. ;
  50. ;----------------------------------------------------------------------
  51. ;
  52. ;    timer interrupt handler
  53. ;
  54. timer_int    proc    far
  55.     sti
  56.     push    ds
  57.     push    ax
  58.     mov    ax,SEG dgroup
  59.     mov    ds,ax
  60. ;
  61.     cmp    timflag,1        ; initialisation ?
  62.     jne    no_init
  63. ;
  64. ;    Install timer
  65. ;
  66.     mov    timflag,0        ; signal init ready
  67.     mov    timcnt,1
  68.     mov    al,36h
  69.     out    timer+3,al        ; setup to load divisor
  70.     mov    al,byte ptr divisor
  71.     out    timer,al        ; lsb
  72.     mov    al,byte ptr divisor+1
  73.     out    timer,al        ; msb
  74.     jmp    short no_uninit
  75. ;
  76. ;    Increment timer tick counter. The scheduler will activate the
  77. ;    timer task if the counter is nonzero.
  78. ;
  79. no_init:
  80.     cmp    timflag,2        ; un-install flag set?
  81.     jne    no_uninit        ; no un-install if not
  82. timdec:
  83.     cli
  84.     dec    timcnt            ; decrement tick count
  85.     jz    uninit            ; go un-install if zero
  86.     mov    al,eoi            ; else just issue EOI
  87.     out    inta00,al
  88.     pop    ax
  89.     pop    ds
  90.     iret                ; do nothing while waiting for uninit
  91. ;
  92. no_uninit:
  93.     push    es
  94.     push    bx
  95.     push    cx
  96.     push    dx
  97.     mov    ax,ds
  98.     mov    es,ax
  99.     mov    ax,offset _tsk_timer_counter
  100.     push    ds
  101.     push    ax
  102.     call    _inc_counter
  103.     add    sp,4
  104.     pop    dx
  105.     pop    cx
  106.     pop    bx
  107.     pop    es
  108. ;
  109.     mov    al,eoi            ; else just issue EOI
  110.     out    inta00,al
  111.     pop    ax
  112.     pop    ds
  113.     jmp    _sched_int
  114. ;
  115. ;
  116. ;    Uninstall timer int handler
  117. ;
  118. uninit:
  119.     mov    timflag,0        ; mark un-install complete
  120.     mov    al,36h            ; setup to load divisor
  121.     out    timer+3,al
  122.     mov    al,0            ; divisor 0 means 65536
  123.     out    timer,al        ; lsb
  124.     out    timer,al        ; msb
  125.     push    es
  126.     xor    ax,ax
  127.     mov    es,ax
  128.     assume    es:intseg
  129.     mov    ax,cs:tsofs        ; restore vector
  130.     mov    tintofs,ax
  131.     mov    ax,cs:tsseg
  132.     mov    tintseg,ax
  133.     assume    es:nothing
  134.     pop    es
  135.     pop    ax
  136.     pop    ds
  137.     jmp    cs:timer_save        ; pass on interrupt
  138. ;
  139. timer_int    endp
  140. ;
  141. ;
  142. ;    Here the counter for system ticks is decremented. 
  143. ;    If it reaches zero, the interrupt is passed on to the
  144. ;    standard timer handler, so the system clock continues to run.
  145. ;
  146. _tsk_chain_timer    proc    far
  147. ;
  148.     dec    timcnt            ; decrement tick count
  149.     jnz    no_pass            ; pass on this int if zero
  150. ;
  151.     mov    ax,sys_ticks
  152.     mov    timcnt,ax        ; re-init tick counter
  153. ;
  154.     pushf
  155.     cli
  156.     call    cs:timer_save
  157.     ret
  158. ;
  159. no_pass:
  160.     mov    al,eoi            ; else just issue EOI
  161.     out    inta00,al
  162.     ret
  163. _tsk_chain_timer    endp
  164. ;
  165. ;
  166. ;    void far tsk_install_timer (word divisor, word sys_ticks)
  167. ;
  168. ;    This routine installs the timer tick int handler.
  169. ;    The timer chip is reprogrammed on the next tick.
  170. ;
  171. _tsk_install_timer    proc    far
  172. ;
  173.     push    bp
  174.     mov    bp,sp
  175.     mov    ax,6[bp]
  176.     mov    divisor,ax
  177.     mov    ax,8[bp]
  178.     mov    sys_ticks,ax
  179.     mov    timflag,1        ; set init-flag
  180.     xor    ax,ax
  181.     mov    es,ax            ; establish addressing for intseg
  182.     assume    es:intseg
  183. ;
  184.     mov    ax,tintofs        ; save old timer int addr
  185.     mov    tsofs,ax
  186.     mov    ax,tintseg
  187.     mov    tsseg,ax
  188.     cli
  189.     mov    tintofs,offset timer_int ; set new timer int addr
  190.     mov    tintseg,cs
  191.     sti
  192.     assume    es:nothing
  193. wait_set:
  194.     cmp    timflag,0        ; wait until timer started
  195.     jne    wait_set
  196.     pop    bp
  197.     ret
  198. ;
  199. _tsk_install_timer    endp
  200. ;
  201. ;    void far tsk_remove_timer (void)
  202. ;
  203. ;    This routine un-installs the timer tick int handler.
  204. ;    The timer chip is reprogrammed & the interrupt vector
  205. ;    restored when the system tick count reaches zero.
  206. ;
  207. _tsk_remove_timer    proc    far
  208. ;
  209.     mov    timflag,2        ; set un-init flag for timer
  210. wait_tim:
  211.         sti                             ; just to be safe
  212.     cmp    timflag,0        ; wait until int un-installed
  213.     jne    wait_tim
  214.     ret
  215. ;
  216. _tsk_remove_timer    endp
  217. ;
  218.     end
  219.  
  220.