home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / screen / scrncolr.asm < prev    next >
Assembly Source File  |  1994-03-05  |  9KB  |  254 lines

  1. 16-Jul-86 14:08:30-PDT,9473;000000000001
  2. Return-Path: <SY.FDC@CU20B.COLUMBIA.EDU>
  3. Received: FROM CU20B.COLUMBIA.EDU BY B.ISI.EDU WITH TCP ; 16 Jul 86 14:04:53 PDT
  4. Date: Wed 16 Jul 86 15:41:15-EDT
  5. From: Frank da Cruz <SY.FDC@CU20B.COLUMBIA.EDU>
  6. Subject: SCRNCOLR.ASM
  7. To: info-ibmpc@B.ISI.EDU
  8. Message-ID: <12223203329.166.SY.FDC@CU20B.COLUMBIA.EDU>
  9.  
  10. Here's a version of SCRNCOLR.ASM that, unlike the version in your library,
  11. will assemble and run.
  12.  
  13. page    64,132
  14. title   scrncolr - Change display screen from white to color attrib
  15. .radix 10
  16. ;***************************************************************
  17. ; Adapted from "SCREEN.ASM" by H. Fischer - HFischer@eclb 12/83
  18. ; SCREEN was Typed in by Glass - gjg@cmu-cs-cad from Byte Nov. 1983
  19. ;
  20. ; NOTE: only meaningful with color card, and does not look at
  21. ;       keyboard (which makes it easywriter, etc. compatible)
  22. ;
  23. ;   To build this program:
  24. ;       1>  masm scrncolr;      /* assemble the code */
  25. ;       2>  link scrncolr;      /* link it - will get no stack seg. message */
  26. ;       3>  exe2bin scrncolr.exe scrncolr.com  /* make executable */
  27. ;       4>  del scrncolr.exe    /* don't need this anymore */
  28. ;
  29. ;  To use program:  run it or place in autoexec.bat as follows:
  30. ;
  31. ;               scrncolr nn rr
  32. ;
  33. ;                       where nn are screen attributes to replace
  34. ;                       normal white (attr=07h) video, and rr are
  35. ;                       attributes for reversed white (attr=70h)
  36. ;                       (intensity and blink are preserved).
  37. ;
  38. ;       for example, to change calls for white to white on blue
  39. ;       and to change calls for reverse white to magenta on white,
  40. ;       issue the call:  "scrncolr 17 75"
  41. ;
  42. ;  Only 80x25 screen calls are affected and only in text mode,
  43. ;       (this makes it LOGO and APL compatible)
  44. ;
  45. ;  COMMANDS:
  46. ;       none -- you reassemble to change the color assignment
  47.  
  48. ;***************************************************************
  49. ;
  50. ;  Define interrupt vectors for
  51. ;       screen interrupt 10H, in segment 0.
  52. ;
  53. ;***************************************************************
  54.  
  55. scrvect segment at 0            ; define screen interrupt vector
  56.         org     10h*4
  57. SCRINT  label   word            ; fixed. was dword. [jrd]
  58. scrvect ends
  59.  
  60. ;***************************************************************
  61. ;
  62. ;       define constants
  63. ;
  64. ;***************************************************************
  65.  
  66. bw_val     equ  07h             ; standard b&w attibute sent to monitor
  67.  
  68. ;***************************************************************
  69. ;
  70. ;       start code area
  71. ;
  72. ;***************************************************************
  73.  
  74. code    segment para
  75.         assume  cs:code
  76.         org     82h             ; parameters
  77. PARM    label   word            ;    normal & rev attribs "nn rr"
  78.         org     100h            ; start code offset 100h from starting segment
  79.                                 ; (this leaves room for DOS's work areas)
  80.  
  81. KEY     proc    far
  82. START:
  83.         ; Initialization code...used only once, on system startup
  84.  
  85.         jmp     init_code       ; call initialization routine
  86. even
  87.         validchk db 'FCP!'      ; used by INSTALL to check for valid SCREEN
  88.                                 ; program
  89.  
  90.  
  91. ;***************************************************************
  92. ;
  93. ;       SCR_RTNE - Replaces SCREEN interrupt so that it can intercept
  94. ;               B&W character writes and change attributes
  95. ;
  96. ;***************************************************************
  97.  
  98. SCR_RTNE:
  99.         assume  ds:code
  100.         sti
  101.         push    ds              ; get cs into ds  the funny way
  102.         push    cs
  103.         pop     ds
  104.         cmp     ah,0            ; Spot mode change call
  105.         jne     NOT_MODE
  106.         mov     savemod,al      ; Save mode input
  107. NOT_MODE:
  108.         cmp     ah,6            ; Spot SCROLL UP and SCROLL DOWN calls
  109.         jl      NORMAL_SCR      ;
  110.         push    ax              ; check if in 80x25 modes
  111.         mov     al,savemod
  112.         cmp     al,2
  113.         pop     ax
  114.         jl      NORMAL_SCR      ; no-ignore attribs (keep LOGO straight)
  115.         push    ax              ; check if in 80x25 modes
  116.         mov     al,savemod
  117.         cmp     al,3
  118.         pop     ax
  119.         jg      NORMAL_SCR      ; no-ignore attribs (keep LOGO straight)
  120.  
  121.         cmp     ah,6
  122.         jg      NOT_SCROLL      ;
  123.  
  124. SCROLL:
  125.         call    GET_CH          ; for scrolling, update attribute
  126.         jmp     NORMAL_SCR      ; now, execute scroll
  127.  
  128. NOT_SCROLL:
  129.         cmp     ah,9            ; check for "WRITE ATTRIBUTE/CHAR" cmd
  130.         jne     NORMAL_SCR      ; send out any other command as normal
  131.         xchg    bh,bl           ; get attribute for command
  132.         call    GET_CH          ; update attribute for command
  133.         xchg    bh,bl           ; move attribute back to bh for cmd
  134.  
  135. NORMAL_SCR:
  136.         pop     ds              ; restore ds reg
  137.  
  138.         ;
  139.         ; NOTE: We are now ready to invoke the BIOS screen interrupt.
  140.         ;       Since the ROM code includes an IRET interrupt return call,
  141.         ;       all we need to do is to jump to the start of the ROM code
  142.         ;       and all will be well.  Since the initialization code set
  143.         ;       up the address to the screen interrupt code below, we can
  144.         ;       set up a forced jump to that address.
  145.  
  146. JMP_SCR:                        ; Address to SCREEN interrupt
  147.         db      0EAh            ; force a FAR JMP but do not set up dest-
  148.         dw      0,0             ;   ination address at assembly time.
  149.                                 ;   (INIT routine will set this address)
  150.  
  151. savemod db      3               ;   default to 80x24 color mode
  152.  
  153. KEY endp                        ;done with main routine
  154.  
  155. ;***************************************************************
  156. ;
  157. ;       GET_CH - subroutine replaces B&W character with current replacement
  158. ;                       attributes and allows for intensity bit setting
  159. ;
  160. ;               Inputs : bh contains attribute to be modified
  161. ;
  162. ;***************************************************************
  163.  
  164. GET_CH  proc    near
  165.         mov     savech,bh       ; save character
  166.         and     bh,77h          ; Remove intensity and blink bits
  167.         cmp     bh,07h          ; see if currently defined B&W value
  168.         jne     ISITREV         ; exit if not
  169.         mov     bh,savech       ; otherwise, modify to current attribute
  170.         and     bh,88h          ; get rid of B&W part
  171.         or      bh,normvid      ; move in current attribute part
  172.         jmp     OUT
  173.  
  174. ISITREV:
  175.         cmp     bh,70h          ; see if currently defined W&B value
  176.         mov     bh,savech       ; otherwise, modify to current attribute
  177.         jne     OUT
  178.         and     bh,88h
  179.         or      bh,revrvid
  180.  
  181. OUT:
  182.         ret                     ; done
  183.  
  184. savech  db      0               ; temporary character store
  185. normvid db      05h             ; replacement for white norml video
  186. revrvid db      50h             ; replacement for reverse white video
  187. GET_CH  endp
  188.  
  189. LASTONE:        ; all code after this label is freed to DOS use after
  190.                 ; initialization of the program.
  191.  
  192.  
  193. ;***************************************************************
  194. ;
  195. ;       INIT_CODE - Code to load and initialize the SCREEN program..
  196. ;               sets up DOS to keep all code before "LASTONE" label
  197. ;               safe from overlaying during system operation.
  198. ;
  199. ;***************************************************************
  200.  
  201. INIT_CODE proc  near
  202.  
  203.         ; initialize SCREEN intercept code
  204.         assume  es:scrvect              ;'vectors' is interrupt segment 0
  205.  
  206.         mov     ax,scrvect              ; get address to interrupt vector
  207.         mov     es,ax                   ; save in es
  208.         mov     ax,es:scrint            ; get address to interrupt
  209.         mov     bx,offset jmp_scr+1     ; address to place to save vector
  210.         mov     [bx],ax                 ; save interrupt address
  211.         mov     ax,es:scrint[2]         ; get interrupt segment for rtne
  212.         mov     [bx+2],ax               ; save it too
  213.         mov     es:scrint,offset scr_rtne ; now replace with own address
  214.         mov     ax,cs                   ; save segment in interrupt vector
  215.         mov     es:scrint[2],ax         ;
  216.  
  217.         mov     ax,cs                   ; make parameters for color
  218.         mov     ds,ax                   ;   addressable
  219.         mov     dx,PARM
  220.         test    dx,0040h                ; fix hex a-f
  221.         jz      IT2
  222.         sub     dx,0007h
  223. IT2:    test    dx,4000h
  224.         jz      IT3
  225.         sub     dx,0700h
  226. IT3:
  227.         and     dx,0f0fh                ; strip and jamb nibbles
  228.         mov     cl,4
  229.         shl     dl,cl
  230.         or      dh,dl
  231.         mov     normvid,dh              ; save parameter
  232.         mov     dx,PARM+3
  233.         test    dx,0040h                ; fix hex a-f
  234.         jz      IT4
  235.         sub     dx,0007h
  236. IT4:    test    dx,4000h
  237.         jz      IT5
  238.         sub     dx,0700h
  239. IT5:
  240.         and     dx,0f0fh
  241.         mov     cl,4
  242.         shl     dl,cl
  243.         or      dh,dl
  244.         mov     revrvid,dh
  245.  
  246.  
  247.         mov     dx,offset lastone       ; save all code up to "LASTONE" label
  248.         int     27h                     ; no return needed
  249.  
  250. INIT_CODE endp
  251. code ends
  252. end start
  253. -------
  254.