240 lines
8.5 KiB
Markdown
240 lines
8.5 KiB
Markdown
**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 640x480 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 {#Heading7}
|
||
|
||
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 640x350 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
|