; 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'
	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'
	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
