Previous | Table of Contents | Next

### Overscan

While we’re at it, I’m going to touch on overscan. Overscan is the color of the border of the display, the rectangular area around the edge of the monitor that’s outside the region displaying active video data but inside the blanking area. The overscan (or border) color can be programmed to any of the 64 possible colors by either setting Attribute Controller register 11H directly or calling video function 10H, subfunction 1.

| On ECD-compatible monitors, however, there’s too little scan time to display a proper border when the EGA is in 350-scan-line mode, so overscan should always be 0 (black) unless you’re in 200-scanmode. Note, though, that a VGA can easily display a border on a VGA-compatible monitor, and VGAs are in fact programmed at mode set for an 8-pixel-wide border in all modes; all you need do is set the overscan color on any VGA to see the border.

### A Bonus Blanker

An interesting bonus: The Attribute Controller provides a very convenient way to blank the screen, in the form of the aforementioned bit 5 of the Attribute Controller Index register (at address 3C0H after the Input Status 1 register—3DAH in color, 3BAH in monochrome—has been read and on every other write to 3C0H thereafter). Whenever bit 5 of the AC Index register is 0, video data is cut off, effectively blanking the screen. Setting bit 5 of the AC Index back to 1 restores video data immediately. Listing 29.4 illustrates this simple but effective form of screen blanking.

LISTING 29.4 L29-4.ASM

    ; Program to demonstrate screen blanking via bit 5 of the
    ; Attribute Controller Index register.
    ;
    AC_INDEX               equ   3c0h            ;Attribute Controller Index register
    INPUT_STATUS_1         equ   3dah            ;color-mode address of the Input
                                                 ; Status 1 register
    ;
    ; Macro to wait for and clear the next keypress.
    ;
    WAIT_KEY macro
                  mov      ah,8                  ;DOS input without echo function
                  int      21h
                  endm
    ;
    stack         segment para stack ‘STACK’
                  db512 dup (?)
    stack         ends
    ;
    Data  segment   word   ‘DATA’
    SampleText      db     ‘This is bit-mapped text, drawn in hi-res ’
                    db     ‘EGA graphics mode 10h.’, 0dh, 0ah, 0ah
                    db     ‘Press any key to blank the screen, then ’
                    db     ‘any key to unblank it,’, 0dh, 0ah
                    db     ‘then any key to end.$’
    Data        ends
    ;
    Code        segment
                assume  cs:Code, ds:Data
    Start       proc    near
                mov     ax,Data
                mov     ds,ax
    ;
    ; Go to hi-res graphics mode.
    ;
                mov     ax,10h          ;AH = 0 means mode set, AL = 10h selects
                                        ; hi-res graphics mode
                int     10h             ;BIOS video interrupt
    ;
    ; Put up some text, so the screen isn’t empty.
    ;
                mov     ah,9            ;DOS print string function
                mov     dx,offset SampleText
                int     21h
    ;
                WAIT_KEY
    ;
    ; Blank the screen.
    ;
                mov     dx,INPUT_STATUS_1
                in      al,dx           ;reset port 3c0h to index (rather than data)
                                        ; mode
                mov     dx,AC_INDEX
                sub     al,al           ;make bit 5 zero...
                out     dx,al           ;...which blanks the screen
    ;
                WAIT_KEY
    ;
    ; Unblank the screen.
    ;
                mov    dx,INPUT_STATUS_1
                in     al,dx            ;reset port 3c0h to Index (rather than data)
                                        ; mode
                mov    dx,AC_INDEX
                mov    al,20h           ;make bit 5 one...
                out    dx,al            ;...which unblanks the screen
    ;
                WAIT_KEY
    ;
    ; Restore text mode.
    ;
                mov    ax,2
                int    10h
    ;
    ; Done.
    ;
    Done:
                mov    ah,4ch           ;DOS terminate function
                int    21h
    Start              endp
    Code               ends
                end    Start

Previous | Table of Contents | Next

Graphics Programming Black Book © 2001 Michael Abrash