[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
From: gutier@unixg.ubc.ca (Gerald Gutierrez)
: If I am going to be writing a large number of pixels to the screen, would
: it be faster to do a direct memory write to the video buffer at $A000
: (assuming I'm using 320x200x256 mode) or use an assembly language routine
: to do this?
}
Procedure Z_0GetImage( ImgPtr : pointer; XOfs,YOfs,XSize,YSize : Word );
Assembler;
asm
PUSH DS
MOV AX,0A000h
MOV DS,AX
LES DI,Imgptr
MOV BX,YOfs
XCHG BH,BL
MOV DX,BX
SHR BX,1
SHR BX,1
ADD DX,BX
ADD DX,XOfs
MOV AX,xsize
STOSW
MOV BX,AX
MOV AX,ysize
STOSW
@JP1:
MOV SI,DX
MOV CX,BX
shr cx,1
jnc @Jp2
movsb
@Jp2:
repz movsw
ADD DX,0140h
DEC AX
JNZ @JP1
POP DS
end;
Procedure Z_0PutImage( ImgPtr : pointer; XOfs,YOfs : Word );
Assembler;
asm
PUSH DS
MOV AX,0A000h
MOV ES,AX
LDS SI,ImgPtr
MOV BX,YOfs
XCHG BH,BL
MOV CX,BX
SHR BX,1
SHR BX,1
ADD CX,BX
ADD CX,XOfs
lodsw
or ax,ax
jz @Exit
mov dx,ax
lodsw
or ax,ax
jz @Exit
mov bx,ax
mov ax,cx
@JP1:
MOV DI,AX
MOV CX,DX
SHR CX,1
JNC @JP2
MOVSB
@JP2:
REPZ MOVSW
ADD AX,140h
DEC BX
JNZ @JP1
@Exit:
POP DS
end;
Procedure Z_0PutPixel ( X,Y : Word; Color: Byte );
Assembler;
asm
mov ax,0a000h
mov es,ax
mov di,x
mov ax,y
xchg ah,al { multiply Y by 320 }
add di,ax
shr ax,1
shr ax,1
add di,ax
mov al,color
stosb
end;
Function Z_0GetPixel ( X,Y : Word ): Byte;
Assembler;
asm
push ds
mov ax,0a000h
mov ds,ax
mov si,x
mov ax,y
xchg ah,al { multiply Y by 320 }
add si,ax
shr ax,1
shr ax,1
add si,ax
lodsb
pop ds
end;
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]