294 lines
9.8 KiB
HTML
294 lines
9.8 KiB
HTML
<HTML>
|
|
<HEAD>
|
|
<META name=vsisbn content="1576101746">
|
|
<META name=vstitle content="Michael Abrash's Graphics Programming Black Book, Special Edition">
|
|
<META name=vsauthor content="Michael Abrash">
|
|
<META name=vspublisher content="The Coriolis Group">
|
|
<META name=vspubdate content="07/01/97">
|
|
<META name=vscategory content="Web and Software Development: Game Development,Web and Software Development: Graphics and Multimedia Development">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<TITLE>Michael Abrash's Graphics Programming Black Book Special Edition: VGA Data Machinery</TITLE>
|
|
|
|
<!-- HEADER -->
|
|
<!-- Empty Reference Subhead -->
|
|
|
|
<!--ISBN=1576101746//-->
|
|
<!--TITLE=Michael Abrash's Graphics Programming Black Book Special Edition//-->
|
|
<!--AUTHOR=Michael Abrash//-->
|
|
<!--PUBLISHER=The Coriolis Group, Inc.//-->
|
|
<!--CHAPTER=25//-->
|
|
<!--PAGES=474-478//-->
|
|
<!--UNASSIGNED1//-->
|
|
<!--UNASSIGNED2//--></HEAD><BODY LINK=#0000FF ALINK=#000099 VLINK=#0000FF BGCOLOR=#FFFFFF>
|
|
|
|
<CENTER>
|
|
<TABLE BORDER>
|
|
<TR>
|
|
<TD><A HREF="25-04.html">Previous</A></TD>
|
|
<TD><A HREF="index.html">Table of Contents</A></TD>
|
|
<TD><A HREF="25-06.html">Next</A></TD>
|
|
</TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
<P><BR></P>
|
|
<P><B>LISTING 25.3 L25-3.ASM</B></P>
|
|
<!-- CODE //-->
|
|
<PRE>
|
|
; 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
|
|
</PRE>
|
|
<!-- END CODE //-->
|
|
<H4 ALIGN="LEFT"><A NAME="Heading7"></A><FONT COLOR="#000077">Manipulating Planes Individually</FONT></H4>
|
|
<P>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.
|
|
</P>
|
|
<P>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.</P>
|
|
<P><B>LISTING 25.4 L25-4.ASM</B></P>
|
|
<!-- CODE //-->
|
|
<PRE>
|
|
; 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
|
|
</PRE>
|
|
<!-- END CODE //-->
|
|
<P><BR></P>
|
|
<CENTER>
|
|
<TABLE BORDER>
|
|
<TR>
|
|
<TD><A HREF="25-04.html">Previous</A></TD>
|
|
<TD><A HREF="index.html">Table of Contents</A></TD>
|
|
<TD><A HREF="25-06.html">Next</A></TD>
|
|
</TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
|
|
<hr width="90%" size="1" noshade>
|
|
<div align="center">
|
|
<font face="Verdana,sans-serif" size="1">Graphics Programming Black Book © 2001 Michael Abrash</font>
|
|
</div>
|
|
<!-- all of the reference materials (books) have the footer and subfoot reveresed -->
|
|
<!-- reference_subfoot = footer -->
|
|
<!-- reference_footer = subfoot -->
|
|
|
|
<!-- BEGIN SUB FOOTER -->
|
|
</BODY>
|
|
</HTML>
|
|
|
|
<!-- END FOOTER -->
|
|
|
|
|