81 lines
1.6 KiB
NASM
81 lines
1.6 KiB
NASM
; Program to illustrate operation of Map Mask register when drawing
|
|
; to 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
|
|
;
|
|
; 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
|
|
;
|
|
cseg segment para public 'CODE'
|
|
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 Map Mask register to enable writes
|
|
; to blue plane only.
|
|
;
|
|
SETSC SC_MAP_MASK,01h ;map mask setting enables only
|
|
; plane 0, the blue plane
|
|
sub di,di
|
|
mov cx,80*480 ;# bytes per screen
|
|
mov al,0ffh
|
|
rep stosb ;perform fill (affects only
|
|
; plane 0, the blue plane)
|
|
;
|
|
; 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
|