Normal quotes
This commit is contained in:
parent
5e10794a24
commit
18011c595a
352 changed files with 6040 additions and 6040 deletions
30
47-04.md
30
47-04.md
|
|
@ -10,9 +10,9 @@ wrapping back to plane 0. This is the sort of code that stems from a
|
|||
write-pixel line of thinking; it reflects not a whit of the unique
|
||||
perspective that Mode X demands, and although it looks reasonably
|
||||
efficient, it is in fact some of the slowest graphics code you will ever
|
||||
see. I’ve provided Listing 47.4 partly for illustrative purposes, but
|
||||
mostly so we’ll have a point of reference for the substantial speed-up
|
||||
that’s possible with code that’s designed from a Mode X perspective.
|
||||
see. I've provided Listing 47.4 partly for illustrative purposes, but
|
||||
mostly so we'll have a point of reference for the substantial speed-up
|
||||
that's possible with code that's designed from a Mode X perspective.
|
||||
|
||||
**LISTING 47.4 L47-4.ASM**
|
||||
|
||||
|
|
@ -47,9 +47,9 @@ that’s possible with code that’s designed from a Mode X perspective.
|
|||
.code
|
||||
public _FillRectangleX
|
||||
_FillRectangleX proc near
|
||||
push bp ;preserve caller’s stack frame
|
||||
push bp ;preserve caller's stack frame
|
||||
mov bp,sp ;point to local stack frame
|
||||
push si ;preserve caller’s register variables
|
||||
push si ;preserve caller's register variables
|
||||
push di
|
||||
|
||||
mov ax,SCREEN_WIDTH
|
||||
|
|
@ -62,16 +62,16 @@ that’s possible with code that’s designed from a Mode X perspective.
|
|||
add di,[bp+PageBase] ;offset of first rectangle pixel in
|
||||
; display memory
|
||||
mov ax,SCREEN_SEG
|
||||
mov es,ax ;point ES:DI to the first rectangle pixel’s
|
||||
mov es,ax ;point ES:DI to the first rectangle pixel's
|
||||
; address
|
||||
mov dx,SC_INDEX ;set the Sequence Controller Index to
|
||||
mov al,MAP_MASK ; point to the Map Mask register
|
||||
out dx,al
|
||||
inc dx ;point DX to the SC Data register
|
||||
mov cl,byte ptr [bp+StartX]
|
||||
and cl,011b ;CL = first rectangle pixel’s plane
|
||||
and cl,011b ;CL = first rectangle pixel's plane
|
||||
mov al,01h
|
||||
shl al,cl ;set only the bit for the pixel’s plane to 1
|
||||
shl al,cl ;set only the bit for the pixel's plane to 1
|
||||
mov ah,byte ptr [bp+Color] ;color with which to fill
|
||||
mov bx,[bp+EndY]
|
||||
sub bx,[bp+StartY] ;BX = height of rectangle
|
||||
|
|
@ -86,7 +86,7 @@ that’s possible with code that’s designed from a Mode X perspective.
|
|||
FillScanLineLoop:
|
||||
out dx,al ;set the plane for this pixel
|
||||
mov es:[di],ah ;draw the pixel
|
||||
shl al,1 ;adjust the plane mask for the next pixel’s
|
||||
shl al,1 ;adjust the plane mask for the next pixel's
|
||||
and al,01111b ; bit, modulo 4
|
||||
jnz AddressSet ;advance address if we turned over from
|
||||
inc di ; plane 3 to plane 0
|
||||
|
|
@ -100,9 +100,9 @@ that’s possible with code that’s designed from a Mode X perspective.
|
|||
dec bx ;count down scan lines
|
||||
jnz FillRowsLoop
|
||||
FillDone:
|
||||
pop di ;restore caller’s register variables
|
||||
pop di ;restore caller's register variables
|
||||
pop si
|
||||
pop bp ;restore caller’s stack frame
|
||||
pop bp ;restore caller's stack frame
|
||||
ret
|
||||
_FillRectangleX endp
|
||||
end
|
||||
|
|
@ -110,16 +110,16 @@ that’s possible with code that’s designed from a Mode X perspective.
|
|||
The two major weaknesses of Listing 47.4 both result from selecting the
|
||||
plane on a pixel by pixel basis. First, endless **OUT**s (which are
|
||||
particularly slow on 386s, 486s, and Pentiums, much slower than accesses
|
||||
to display memory) must be performed, and, second, **REP STOS** can’t be
|
||||
to display memory) must be performed, and, second, **REP STOS** can't be
|
||||
used. Listing 47.5 overcomes both these problems by tailoring the fill
|
||||
technique to the organization of display memory. Each plane is filled in
|
||||
its entirety in one burst before the next plane is processed, so only
|
||||
five **OUT**s are required in all, and **REP STOS** can indeed be used;
|
||||
I’ve used **REP STOSB** in Listings 47.5 and 47.6. **REP STOSW** could
|
||||
I've used **REP STOSB** in Listings 47.5 and 47.6. **REP STOSW** could
|
||||
be used and would improve performance on most VGAs; however, **REP
|
||||
STOSW** requires extra overhead to set up, so it can be slower for small
|
||||
rectangles, especially on 8-bit VGAs. Note that doing an entire plane at
|
||||
a time can produce a “fading-in” effect for large images, because all
|
||||
a time can produce a "fading-in" effect for large images, because all
|
||||
columns for one plane are drawn before any columns for the next. If this
|
||||
is a problem, the four planes can be cycled through once for each scan
|
||||
line, rather than once for the entire rectangle.
|
||||
|
|
@ -127,7 +127,7 @@ line, rather than once for the entire rectangle.
|
|||
Listing 47.5 is 2.5 times faster than Listing 47.4 at clearing the
|
||||
screen on a 20-MHz cached 386 with a Paradise VGA. Although Listing 47.5
|
||||
is slightly slower than an equivalent mode 13H fill routine would be,
|
||||
it’s not grievously so.
|
||||
it's not grievously so.
|
||||
|
||||
------------------------ --------------------------------- --------------------
|
||||
[Previous](47-03.html) [Table of Contents](index.html) [Next](47-05.html)
|
||||
|
|
|
|||
Loading…
Reference in a new issue