Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
140
58-02.md
140
58-02.md
|
|
@ -12,52 +12,54 @@ pages: 1082-1085
|
|||
|
||||
**LISTING 58.1 L58-1.ASM**
|
||||
|
||||
; Inner loop to draw a single texture-mapped horizontal scanline in
|
||||
; Mode X, the VGA's page-flipped 256-color mode. Because adjacent
|
||||
; pixels lie in different planes in Mode X, an OUT must be performed
|
||||
; to select the proper plane before drawing each pixel.
|
||||
;
|
||||
; At this point:
|
||||
; AL = initial pixel's plane mask
|
||||
; DS:BX = initial source texture pointer
|
||||
; DX = pointer to VGA's Sequencer Data register
|
||||
; SI = # of pixels to fill
|
||||
; ES:DI = pointer to initial destination pixel
|
||||
```nasm
|
||||
; Inner loop to draw a single texture-mapped horizontal scanline in
|
||||
; Mode X, the VGA's page-flipped 256-color mode. Because adjacent
|
||||
; pixels lie in different planes in Mode X, an OUT must be performed
|
||||
; to select the proper plane before drawing each pixel.
|
||||
;
|
||||
; At this point:
|
||||
; AL = initial pixel's plane mask
|
||||
; DS:BX = initial source texture pointer
|
||||
; DX = pointer to VGA's Sequencer Data register
|
||||
; SI = # of pixels to fill
|
||||
; ES:DI = pointer to initial destination pixel
|
||||
|
||||
TexScanLoop:
|
||||
TexScanLoop:
|
||||
|
||||
; Set the Map Mask for this pixel's plane, then draw the pixel.
|
||||
; Set the Map Mask for this pixel's plane, then draw the pixel.
|
||||
|
||||
out dx,al
|
||||
mov ah,[bx] ;get texture pixel
|
||||
mov es:[di],ah ;set screen pixel
|
||||
out dx,al
|
||||
mov ah,[bx] ;get texture pixel
|
||||
mov es:[di],ah ;set screen pixel
|
||||
|
||||
; Point to the next source pixel.
|
||||
; Point to the next source pixel.
|
||||
|
||||
add bx,[bp].lXBaseAdvance ;advance the minimum # of pixels in X
|
||||
mov cx,word ptr [bp].lSourceStepX
|
||||
add word ptr [bp].lSourceX,cx ;step the source X fractional part
|
||||
jnc NoExtraXAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lXAdvanceByOne ;did turn over; advance X one extra
|
||||
NoExtraXAdvance:
|
||||
add bx,[bp].lXBaseAdvance ;advance the minimum # of pixels in X
|
||||
mov cx,word ptr [bp].lSourceStepX
|
||||
add word ptr [bp].lSourceX,cx ;step the source X fractional part
|
||||
jnc NoExtraXAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lXAdvanceByOne ;did turn over; advance X one extra
|
||||
NoExtraXAdvance:
|
||||
|
||||
add bx,[bp].lYBaseAdvance ;advance the minimum # of pixels in Y
|
||||
mov cx,word ptr [bp].lSourceStepY
|
||||
add word ptr [bp].lSourceY,cx ;step the source Y fractional part
|
||||
jnc NoExtraYAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lYAdvanceByOne ;did turn over; advance Y one extra
|
||||
NoExtraYAdvance:
|
||||
add bx,[bp].lYBaseAdvance ;advance the minimum # of pixels in Y
|
||||
mov cx,word ptr [bp].lSourceStepY
|
||||
add word ptr [bp].lSourceY,cx ;step the source Y fractional part
|
||||
jnc NoExtraYAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lYAdvanceByOne ;did turn over; advance Y one extra
|
||||
NoExtraYAdvance:
|
||||
|
||||
; Point to the next destination pixel, by cycling to the next plane, and
|
||||
; advancing to the next address if the plane wraps from 3 to 0.
|
||||
; Point to the next destination pixel, by cycling to the next plane, and
|
||||
; advancing to the next address if the plane wraps from 3 to 0.
|
||||
|
||||
rol al,1
|
||||
adc di,0
|
||||
rol al,1
|
||||
adc di,0
|
||||
|
||||
; Continue if there are any more dest pixels to draw.
|
||||
; Continue if there are any more dest pixels to draw.
|
||||
|
||||
dec si
|
||||
jnz TexScanLoop
|
||||
dec si
|
||||
jnz TexScanLoop
|
||||
```
|
||||
|
||||
Figure 58.2 shows why this cycling is necessary. In Mode X, the
|
||||
page-flipped 256-color mode of the VGA, each successive pixel across a
|
||||
|
|
@ -124,44 +126,46 @@ of *four* times faster than Listing 58.1.)
|
|||
|
||||
**LISTING 58.2 L58-2.ASM**
|
||||
|
||||
; Inner loop to draw a single texture-mapped vertical column, rather
|
||||
; than a horizontal scanline. This allows all pixels handled
|
||||
; by this code to reside in the same plane, so the time-consuming
|
||||
; plane switching can be moved out of the inner loop.
|
||||
;
|
||||
; At this point:
|
||||
; DS:BX = initial source texture pointer
|
||||
; DX = offset to advance to the next pixel in the dest column
|
||||
; (either positive or negative scanline width)
|
||||
; SI = # of pixels to fill
|
||||
; ES:DI = pointer to initial destination pixel
|
||||
; VGA set up to draw to the correct plane for this column
|
||||
```nasm
|
||||
; Inner loop to draw a single texture-mapped vertical column, rather
|
||||
; than a horizontal scanline. This allows all pixels handled
|
||||
; by this code to reside in the same plane, so the time-consuming
|
||||
; plane switching can be moved out of the inner loop.
|
||||
;
|
||||
; At this point:
|
||||
; DS:BX = initial source texture pointer
|
||||
; DX = offset to advance to the next pixel in the dest column
|
||||
; (either positive or negative scanline width)
|
||||
; SI = # of pixels to fill
|
||||
; ES:DI = pointer to initial destination pixel
|
||||
; VGA set up to draw to the correct plane for this column
|
||||
|
||||
REPTLOOP_UNROLL
|
||||
REPTLOOP_UNROLL
|
||||
|
||||
; Set the Map Mask for this pixel's plane, then draw the pixel.
|
||||
; Set the Map Mask for this pixel's plane, then draw the pixel.
|
||||
|
||||
mov ah,[bx] ;get texture pixel
|
||||
mov es:[di],ah ;set screen pixel
|
||||
mov ah,[bx] ;get texture pixel
|
||||
mov es:[di],ah ;set screen pixel
|
||||
|
||||
; Point to the next source pixel.
|
||||
; Point to the next source pixel.
|
||||
|
||||
add bx,[bp].lXBaseAdvance ;advance the minimum # of pixels in X
|
||||
mov cx,word ptr [bp].lSourceStepX
|
||||
add word ptr [bp].lSourceX,cx ;step the source X fractional part
|
||||
jnc NoExtraXAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lXAdvanceByOne ;did turn over; advance X one extra
|
||||
NoExtraXAdvance:
|
||||
add bx,[bp].lXBaseAdvance ;advance the minimum # of pixels in X
|
||||
mov cx,word ptr [bp].lSourceStepX
|
||||
add word ptr [bp].lSourceX,cx ;step the source X fractional part
|
||||
jnc NoExtraXAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lXAdvanceByOne ;did turn over; advance X one extra
|
||||
NoExtraXAdvance:
|
||||
|
||||
add bx,[bp].lYBaseAdvance ;advance the minimum # of pixels in Y
|
||||
mov cx,word ptr [bp].lSourceStepY
|
||||
add word ptr [bp].lSourceY,cx ;step the source Y fractional part
|
||||
jnc NoExtraYAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lYAdvanceByOne ;did turn over; advance Y one extra
|
||||
NoExtraYAdvance:
|
||||
add bx,[bp].lYBaseAdvance ;advance the minimum # of pixels in Y
|
||||
mov cx,word ptr [bp].lSourceStepY
|
||||
add word ptr [bp].lSourceY,cx ;step the source Y fractional part
|
||||
jnc NoExtraYAdvance ;didn't turn over; no extra advance
|
||||
add bx,[bp].lYAdvanceByOne ;did turn over; advance Y one extra
|
||||
NoExtraYAdvance:
|
||||
|
||||
; Point to the next destination pixel, which is on the next scan line.
|
||||
; Point to the next destination pixel, which is on the next scan line.
|
||||
|
||||
adc di,dx
|
||||
adc di,dx
|
||||
|
||||
ENDM
|
||||
ENDM
|
||||
```
|
||||
|
|
|
|||
Loading…
Reference in a new issue