home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / PCACHSRC.ZIP / INT8.ASM < prev    next >
Assembly Source File  |  1990-01-24  |  3KB  |  89 lines

  1. ;INT8.COM      B.Kauler
  2. ;This program demonstrates "multitasking" by using a resident
  3. ;program and the timer-interrupt.
  4. ;A resident program opens many possibilities, and can be made to
  5. ;execute at the "same" time as another program.
  6. ;This is achieved by using int08 to call the resident program.
  7. ;Int08 is generated every 55mSec, and updates the BIOS clock.
  8. ;Our INSTALL routine can change the interrupt-8 vector in the
  9. ;interrupt table, to divert to the RUN_TIME routine, which would
  10. ;in turn transfer control back to the proper BIOS routine after
  11. ;doing whatever it wants.
  12. ;However, IBM considered that programmers would want to access the
  13. ;55mSec timer, so provided int1Ch "USER_TIMER_INT", which is
  14. ;called by int08 routine after it has done its own housekeeping.
  15. ;Normally int1Ch consists of simply an IRET instruction, but we
  16. ;can divert it to our own routine, which would terminate with an
  17. ;IRET.
  18. ;Note that our RUN_TIME routine could do many other things; maybe
  19. ;display the date or time on the screen continuously if we wished,
  20. ;rather than a message, in which case our routine would have to
  21. ;access int21h, functions 2Ah and 2Ch.
  22. ;The program INT9.COM accessed the interrupt table, but due to
  23. ;the danger of an interrupt occurring while writing to it (which
  24. ;we got around by a CLI), IBM provided INT21h functions 35h and
  25. ;25h to do the job.  This program uses these.
  26. ;
  27. com_seg segment
  28.         assume  cs:com_seg,ds:com_seg,ss:com_seg
  29.         org     100h
  30. int8    proc    far
  31.         jmp     install
  32. ;
  33. ;data area....
  34. int_offset      dw      0       ;original int1Ch vector.
  35. int_seg         dw      0       ;       /
  36. column          db      0       ;original cursor position.
  37. row             db      0       ;       /
  38. message         db      "MULTITASKING RESIDENT PROGRAM"
  39. ;
  40. run_time:       ;displays message on screen.
  41. ;note; routine must be kept very short, as it is recalled every 55mSec.
  42. ;best to drive video ram directly.
  43.         push    si
  44.         push    di
  45.         push    cx
  46.         push    ax
  47.         push    es
  48.         push    ds
  49.         push    cs
  50.         pop     ds
  51.         mov     ax,0b000h        ;video ram segment.
  52. ;****change this to 0B800h for colour adaptor*****
  53.         mov     es,ax           ;       /
  54.         mov     si,offset message
  55.         mov     di,0            ;video offset.
  56.         mov     ah,0f0h         ;attribute.
  57.         mov     cx,001dh        ;loop count.
  58. next_char: lodsb                   ;display a char.
  59.         stosw                   ;       /
  60. loop    next_char
  61.         pop     ds
  62.         pop     es
  63.         pop     ax
  64.         pop     cx
  65.         pop     di
  66.         pop     si
  67.         iret
  68. ;
  69. install:
  70.         mov     al,1Ch  ;get interrupt vector.
  71.         mov     ah,35h  ;       /
  72.         int     21h     ;       / (--> ES:BX).
  73.         mov     int_offset,bx   ;save vector.
  74.         mov     int_seg,es      ;       /
  75. ;note that I have saved the original vector, to show how it is
  76. ;done, though in this program there's no need to.
  77.         mov     dx,offset run_time      ;load new vector.
  78.         ;COM file, so DS already set okay.
  79.         mov     al,1Ch                  ;       /
  80.         mov     ah,25h                  ;       /
  81.         int     21h                     ;       / (DS:DX-->).
  82.         mov     dx,offset install       ;point free memory,
  83.         int     27h                     ;leave resident.
  84. ;
  85. int8    endp
  86. com_seg ends
  87. end     int8
  88.  
  89.