home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / s / s001 / 1.ddi / TS / ASM / EXITMP.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-03-15  |  2.0 KB  |  81 lines

  1. ;                 **************
  2. ;                 * EXITMP.asm *
  3. ;               *******************************************
  4. ;               * Copyright TimeSlice, Inc. 1985, 86, 87. *
  5. ;               *******************************************
  6. include ts.inc
  7. ;
  8. extern_code    critend
  9. ifdef MICROSOFT
  10. extern_code    critstart
  11. else
  12. extern_code    critstar
  13. critstart equ    critstar
  14. endif
  15. extern_code    term13
  16. extern_code    intrest
  17. extern_code    exit
  18. extern_code    tickrate
  19. ;
  20. start_data
  21. end_data
  22. ;
  23. start_code
  24. ;
  25. extrn __jaddr:far
  26. ;
  27. ;*******
  28. ;* EXITMP( STATUS )
  29. ;* This function is invoked to cleanly exit the multi-tasking application.
  30. ;* It detaches all interrupt routines attached by the multi-tasking
  31. ;* application,  restores the timer interrupt vector to point to original
  32. ;* service routine, and then invokes EXIT() the close all files and
  33. ;* return to dos.
  34. ;*******
  35. start_struct
  36. mbr    exbp    d_int
  37. mbr    exret    d_ret
  38. mbr    exstat    d_int
  39. ;
  40. routine exitmp            ;reset timer interrupt to orig. value
  41.     push    bp
  42.     mov    bp,sp
  43.     mov    ax, 13h     ;restore original interrupt 13h
  44.     push    ax
  45.     call    term13
  46.     mov    sp,bp
  47.     mov    ax,DOS_CRCLASS
  48.     push    ax
  49.     call    critstart
  50.     mov    sp,bp
  51.     mov    ax,1        ;restore normal ticker rate
  52.     push    ax
  53.     call    tickrate
  54.     mov    sp,bp
  55.         call    intrest        ;detach all functions attached to an interrupt
  56.     mov    ax,_slint    ;ax <-- interrupt of slicer
  57.     mov    cl,2
  58.     shl    ax,cl        ;ax <-- offset of slicer's IntVector
  59.     mov    si,ax        ;si <-- slicer's Int Vector
  60.     push    ds        ;save local data segment
  61.     push    es        ;save extra data segment
  62.     xor    ax,ax        ;set ds to IVT segment (0)
  63.     mov    ds,ax
  64.     cli            ;hold interrupts while replacing intvect
  65.     mov    di,offset __jaddr    ;reset original offset
  66.     mov    ax,seg __jaddr
  67.     mov    es,ax
  68.     mov    ax,es:[di].off    ;reset original interrupt vector
  69.     mov    bx,es:[di].sgt
  70.     mov    [si].off,ax
  71.     mov    [si].sgt,bx
  72.     sti            ;reenable interrupts before exiting
  73.     pop    es        ;restore es to DATA segment
  74.     pop    ds        ;restore ds to DATA segment
  75.     ldint    ax,[bp].exstat    ;pass exit status to exit()
  76.     push    ax
  77.     call    exit        ;call regular exit() function
  78. return  exitmp
  79. ;
  80. end_code
  81.