Previous | Table of Contents | Next

LISTING 25.3 L25-3.ASM

    ; Program to illustrate operation of set/reset circuitry to force
    ;  setting of memory that already contains data.
    ; By Michael Abrash.
    ;
    stack   segment para stack ‘STACK#146;
            db      512 dup(?)
    stack   ends
    ;
    EGA_VIDEO_SEGMENT       equ     0a000h  ;EGA display memory segment
    ;
    ; EGA register equates.
    ;
    SC_INDEX        equ     3c4h    ;SC index register
    SC_MAP_MASK     equ     2       ;SC map mask register
    GC_INDEX        equ     3ceh    ;GC index register
    GC_SET_RESET    equ     0       ;GC set/reset register
    GC_ENABLE_SET_RESET equ 1       ;GC enable set/reset register
    ;
    ; Macro to set indexed register INDEX of SC chip to SETTING.
    ;
    SETSC   macro   INDEX, SETTING
            mov     dx,SC_INDEX
            mov     al,INDEX
            out     dx,al
            inc     dx
            mov     al,SETTING
            out     dx,al
            dec     dx
            endm
    ;
    ; Macro to set indexed register INDEX of GC chip to SETTING.
    ;
    SETGC   macro   INDEX, SETTING
            mov     dx,GC_INDEX
            mov     al,INDEX
            out     dx,al
            inc     dx
            mov     al,SETTING
            out     dx,al
            dec     dx
            endm
    ;
    cseg    segment para public ‘CODE#146;
            assume  cs:cseg
    start   proc    near
    ;
    ; Select 640×480 graphics mode.
    ;
            mov     ax,012h
            int     10h
    ;
            mov     ax,EGA_VIDEO_SEGMENT
            mov     es,ax                   ;point to video memory
    ;
    ; Draw 24 10-scan-line high horizontal bars in green, 10 scan lines apart.
    ;
            SETSC   SC_MAP_MASK,02h         ;map mask setting enables only
                                            ; plane 1, the green plane
            sub     di,di           ;start at beginning of video memory
            mov     al,0ffh
            mov     bp,24           ;# bars to draw
    HorzBarLoop:
            mov     cx,80*10        ;# bytes per horizontal bar
            rep stosb               ;draw bar
            add     di,80*10        ;point to start of next bar
            dec     bp
            jnz     HorzBarLoop
    ;
    ; Fill screen with blue, using set/reset to force plane 0 to 1#146;s and all
    ; other plane to 0#146;s.
    ;
            SETSC   SC_MAP_MASK,0fh         ;must set map mask to enable all
                                            ; planes, so set/reset values can
                                            ; be written to memory
            SETGC   GC_ENABLE_SET_RESET,0fh ;CPU data to all planes will be
                                            ; replaced by set/reset value
            SETGC   GC_SET_RESET,01h        ;set/reset value is 0ffh for plane 0
                                            ; (the blue plane) and 0 for other
                                            ; planes
            sub     di,di
            mov     cx,80*480               ;# bytes per screen
            mov     al,0ffh                 ;since set/reset is enabled for all
                                            ; planes, the CPU data is ignored-
                                            ; only the act of writing is
                                            ; important
            rep stosb                       ;perform fill (affects all planes)
    ;
    ; Turn off set/reset.
    ;
            SETGC   GC_ENABLE_SET_RESET,0
    ;
    ; Wait for a keystroke.
    ;
            mov     ah,1
            int     21h
    ;
    ; Restore text mode.
    ;
            mov     ax,03h
            int     10h
    ;
    ; Exit to DOS.
    ;
            mov     ah,4ch
            int     21h
    start   endp
    cseg    ends
            end     start

#### Manipulating Planes Individually

Listing 25.4 illustrates the use of set/reset to control only some, rather than all, planes. Here, the set/reset circuitry forces plane 2 to 1 and planes 0 and 3 to 0. Because bit 1 of the Enable Set/Reset register is 0, however, set/reset does not affect plane 1; the CPU data goes unchanged to the plane 1 ALU. Consequently, the CPU data can be used to control the value written to plane 1. Given the settings of the other three planes, this means that each bit of CPU data that is 1 generates a brown pixel, and each bit that is 0 generates a red pixel. Writing alternating bytes of 07H and 0E0H, then, creates a vertically striped pattern of brown and red.

In Listing 25.4, note that the vertical bars are 10 and 6 bytes wide, and do not start on byte boundaries. Although set/reset replaces an entire byte of CPU data for a plane, the combination of set/reset for some planes and CPU data for other planes, as in the example above, can be used to control individual pixels.

LISTING 25.4 L25-4.ASM

    ; Program to illustrate operation of set/reset circuitry in conjunction
    ;  with CPU data to modify setting of memory that already contains data.
    ; By Michael Abrash.
    ;
    stack   segment para stack ‘STACK#146;
            db      512 dup(?)
    stack   ends
    ;
    EGA_VIDEO_SEGMENT       equ     0a000h  ;EGA display memory segment
    ;
    ; EGA register equates.
    ;
    SC_INDEX        equ     3c4h    ;SC index register
    SC_MAP_MASK     equ     2       ;SC map mask register
    GC_INDEX        equ     3ceh    ;GC index register
    GC_SET_RESET    equ     0       ;GC set/reset register
    GC_ENABLE_SET_RESET equ 1       ;GC enable set/reset register
    ;
    ; Macro to set indexed register INDEX of SC chip to SETTING.
    ;
    SETSC   macro   INDEX, SETTING
            mov     dx,SC_INDEX
            mov     al,INDEX
            out     dx,al
            inc     dx
            mov     al,SETTING
            out     dx,al
            dec     dx
            endm
    ;
    ; Macro to set indexed register INDEX of GC chip to SETTING.
    ;
    SETGC   macro   INDEX, SETTING
            mov     dx,GC_INDEX
            mov     al,INDEX
            out     dx,al
            inc     dx
            mov     al,SETTING
            out     dx,al
            dec     dx
            endm
    ;
    cseg    segment para public ‘CODE#146;
            assume  cs:cseg
    start   proc    near
    ;
    ; Select 640×350 graphics mode.
    ;
            mov     ax,010h
            int     10h
    ;
            mov     ax,EGA_VIDEO_SEGMENT
            mov     es,ax                   ;point to video memory
    ;
    ; Draw 18 10-scan-line high horizontal bars in green, 10 scan lines apart.
    ;
            SETSC   SC_MAP_MASK,02h;map mask setting enables only
    ; plane 1, the green plane
            sub     di,di;start at beginning of video memory
            mov     al,0ffh
            mov     bp,18;# bars to draw
    HorzBarLoop:
            mov     cx,80*10;# bytes per horizontal bar
            rep stosb;draw bar
            add     di,80*10;point to start of next bar
            dec     bp
            jnz     HorzBarLoop
    ;
    ; Fill screen with alternating bars of red and brown, using CPU data
    ; to set plane 1 and set/reset to set planes 0, 2 & 3.
    ;
            SETSC   SC_MAP_MASK,0fh         ;must set map mask to enable all
                                            ; planes, so set/reset values can
                                            ; be written to planes 0, 2 & 3
                                            ; and CPU data can be written to
                                            ; plane 1 (the green plane)
            SETGC   GC_ENABLE_SET_RESET,0dh    ;CPU data to planes 0, 2 & 3 will be
                                               ; replaced by set/reset value
            SETGC   GC_SET_RESET,04h        ;set/reset value is 0ffh for plane 2
                                            ; (the red plane) and 0 for other
                                            ; planes
            sub     di,di
            mov     cx,80*350/2             ;# words per screen
            mov     ax,07e0h                ;CPU data controls only plane 1;
                                            ; set/reset controls other planes
            rep stosw                       ;perform fill (affects all planes)
    ;
    ; Turn off set/reset.
    ;
            SETGC   GC_ENABLE_SET_RESET,0
    ;
    ; Wait for a keystroke.
    ;
            mov     ah,1
            int     21h
    ;
    ; Restore text mode.
    ;
            mov     ax,03h
            int     10h
    ;
    ; Exit to DOS.
    ;
            mov     ah,4ch
            int     21h
    start   endp
    cseg    ends
            end     start

Previous | Table of Contents | Next

Graphics Programming Black Book © 2001 Michael Abrash