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
94
40-04.md
94
40-04.md
|
|
@ -66,55 +66,57 @@ list processing) could pay off reasonably well.
|
|||
|
||||
**LISTING 40.5 L40-5.ASM**
|
||||
|
||||
; Draws all pixels in the horizontal line segment passed in, from
|
||||
; (LeftX,Y) to (RightX,Y), in the specified color in mode 13h, the
|
||||
; VGA's 320x200 256-color mode. No drawing will take place if
|
||||
; LeftX > RightX. Tested with TASM
|
||||
; C near-callable as:
|
||||
; void DrawHorizontalLineSeg(Y, LeftX, RightX, Color);
|
||||
```nasm
|
||||
; Draws all pixels in the horizontal line segment passed in, from
|
||||
; (LeftX,Y) to (RightX,Y), in the specified color in mode 13h, the
|
||||
; VGA's 320x200 256-color mode. No drawing will take place if
|
||||
; LeftX > RightX. Tested with TASM
|
||||
; C near-callable as:
|
||||
; void DrawHorizontalLineSeg(Y, LeftX, RightX, Color);
|
||||
|
||||
SCREEN_WIDTH equ 320
|
||||
SCREEN_SEGMENT equ 0a000h
|
||||
SCREEN_WIDTH equ 320
|
||||
SCREEN_SEGMENT equ 0a000h
|
||||
|
||||
Parms struc
|
||||
dw 2 dup(?);return address & pushed BP
|
||||
Y dw ? ;Y coordinate of line segment to draw
|
||||
LeftX dw ? ;left endpoint of the line segment
|
||||
RightX dw ? ;right endpoint of the line segment
|
||||
Color dw ? ;color in which to draw the line segment
|
||||
Parms ends
|
||||
Parms struc
|
||||
dw 2 dup(?);return address & pushed BP
|
||||
Y dw ? ;Y coordinate of line segment to draw
|
||||
LeftX dw ? ;left endpoint of the line segment
|
||||
RightX dw ? ;right endpoint of the line segment
|
||||
Color dw ? ;color in which to draw the line segment
|
||||
Parms ends
|
||||
|
||||
.model small
|
||||
.code
|
||||
public _DrawHorizontalLineSeg
|
||||
align 2
|
||||
_DrawHorizontalLineSeg proc
|
||||
push bp ;preserve caller's stack frame
|
||||
mov bp,sp ;point to our stack frame
|
||||
push di ;preserve caller's register variable
|
||||
cld ;make string instructions inc pointers
|
||||
mov ax,SCREEN_SEGMENT
|
||||
mov es,ax ;point ES to display memory
|
||||
mov di,[bp+LeftX]
|
||||
mov cx,[bp+RightX]
|
||||
sub cx,di ;width of line
|
||||
jl DrawDone ;RightX < LeftX; no drawing to do
|
||||
inc cx ;include both endpoints
|
||||
mov ax,SCREEN_WIDTH
|
||||
mul [bp+Y] ;offset of scan line on which to draw
|
||||
add di,ax ;ES:DI points to start of line seg
|
||||
mov al,byte ptr [bp+Color] ;color in which to draw
|
||||
mov ah,al ;put color in AH for STOSW
|
||||
shr cx,1 ;# of words to fill
|
||||
rep stosw ;fill a word at a time
|
||||
adc cx,cx
|
||||
rep stosb ;draw the odd byte, if any
|
||||
DrawDone:
|
||||
pop di ;restore caller's register variable
|
||||
pop bp ;restore caller's stack frame
|
||||
ret
|
||||
_DrawHorizontalLineSeg endp
|
||||
end
|
||||
.model small
|
||||
.code
|
||||
public _DrawHorizontalLineSeg
|
||||
align 2
|
||||
_DrawHorizontalLineSeg proc
|
||||
push bp ;preserve caller's stack frame
|
||||
mov bp,sp ;point to our stack frame
|
||||
push di ;preserve caller's register variable
|
||||
cld ;make string instructions inc pointers
|
||||
mov ax,SCREEN_SEGMENT
|
||||
mov es,ax ;point ES to display memory
|
||||
mov di,[bp+LeftX]
|
||||
mov cx,[bp+RightX]
|
||||
sub cx,di ;width of line
|
||||
jl DrawDone ;RightX < LeftX; no drawing to do
|
||||
inc cx ;include both endpoints
|
||||
mov ax,SCREEN_WIDTH
|
||||
mul [bp+Y] ;offset of scan line on which to draw
|
||||
add di,ax ;ES:DI points to start of line seg
|
||||
mov al,byte ptr [bp+Color] ;color in which to draw
|
||||
mov ah,al ;put color in AH for STOSW
|
||||
shr cx,1 ;# of words to fill
|
||||
rep stosw ;fill a word at a time
|
||||
adc cx,cx
|
||||
rep stosb ;draw the odd byte, if any
|
||||
DrawDone:
|
||||
pop di ;restore caller's register variable
|
||||
pop bp ;restore caller's stack frame
|
||||
ret
|
||||
_DrawHorizontalLineSeg endp
|
||||
end
|
||||
```
|
||||
|
||||
The algorithm used to X-sort the AET is an interesting performance
|
||||
consideration. Listing 40.1 uses a bubble sort, usually a poor choice
|
||||
|
|
|
|||
Loading…
Reference in a new issue