home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / disasm / uasm / kilcolr2.asm < prev    next >
Assembly Source File  |  1988-06-03  |  2KB  |  72 lines

  1.     .xlist
  2.     page 66,132
  3. title    Video Interrupt Interceptor to Kill Color Displays -- DOS 2.0 Version
  4. subttl Permanently resident portion
  5.     PAGE
  6.     .list
  7. interseg    SEGMENT    PARA PUBLIC 'CODE'
  8.     ASSUME    CS:interseg,ds:interseg
  9. changevectint = 25h    ; DOS function code for "change interrupt vector"
  10. getvectint = 35h    ; DOS function code for "get interrupt vector"
  11. setvideomode = 0    ; subcode for "set video mode"
  12. termbutstayres = 27h    ; interrupt code for "terminate but stay resident"
  13. start    equ    $
  14.     org    100h
  15. entrypoint:
  16.     jmp    nonresidentportion
  17.  
  18. ; the following code and data will remain resident for the processing of
  19. ;     interrupts and permanent processing
  20. ;
  21. ; data section
  22. savevect    dd    ?    ; location in which to save original vector
  23. ;
  24. ;
  25. ;
  26. ;
  27. interruptroutine:
  28.     cmp    ah,setvideomode    ; is this the "set mode" function ?
  29.     jne    go_on        ; br if no
  30.     cmp    al,4        ; is this the special case ?
  31.     je    special        ; yes, handle it
  32.     and    al,0feh        ; for all others, turn off the low bit
  33.                 ; --- that is the only difference between bw and color
  34. go_on:
  35.     jmp    cs:savevect    ; jump to regular routine in rom
  36. special:
  37.     inc    al        ; change color 320X200 to b/w 320X200
  38.     jmp    go_on        ; jump to common exit
  39. ; align the interrupt routine on a paragraph boundary
  40.     if    ($-start) mod 16
  41.     org     ($-start)+16-(($-start) mod 16)
  42.     endif
  43. endofresident:
  44.     .xlist
  45. subttl Non-resident portion --- to be deleted after execution
  46.     PAGE
  47.     .list
  48. nonresidentportion:
  49.  
  50. ; code following the symbol endofresident, starting with symbol nonresidentportion
  51. ;     is transient and will be overlaid at the initial exit
  52. ;
  53.  
  54.     mov    si,offset savevect ; get offset of address to store vector
  55.     mov    al,vectnum    ; get vector number
  56.     mov    ah,getvectint     ; indicate get vector function
  57.     int    21h         ; Call DOS
  58.     mov    ax,bx        ; get offset of vector
  59.     mov    [si],ax         ; store it in local address space
  60.     mov    ax,es        ; get segment of vector
  61.     mov    2[si],ax    ; store it in local address space
  62.     mov    al,vectnum    ; get vector number
  63.     mov    ah,changevectint ; indicate change vector function
  64.     mov    dx,offset interruptroutine ; point dx to my interrupt routine
  65.     int    21h         ; Call DOS
  66.     mov    dx,offset endofresident ; get end of resident portion
  67.     int    termbutstayres    ; terminate, but stay resident
  68.  
  69. vectnum    db    10h        ; vector number of interrupt we wish to replace
  70. interseg    ENDS
  71.     END    entrypoint
  72.