{ Updated MISC.SWG on May 26, 1995 }
{
> I've seen a message where some guys were talking about 32 bits
> graphics programming. It was something like this
> db $66
> MOVSW
> When you use this it will move four bytes instead of 2.
> My problem is were to put those 4 bytes which should be stord.
> I know the first 2 bytes should be put in AX but were should you put
> the next 2. The trouble is that you can't use EAX because it's a 386
> instruction. I hope you can help me with this
Using db 66h; Movsw is the same as the ASM instruction Movsd. AX and EAX
are not used in this operation. A double word at [ds:si] is moved to [es:di]
and si and di are incremented. In the case of db 66h; Stosw (an ASM Stosd),
you must have a value in EAX. If you are clearing a screen, you must place
the color value in each byte.
Here are some sample procedures that use these ideas:
}
Procedure ClearScreen(Var Screen; Color : Byte); Assembler;
{$G+} { Enable 286 instructions }
Asm
Les di,Screen { Load a the pointer to the screen into [es:di] }
Mov al,Color
Mov ah,al
db 66h; Shl ax,16
Mov al,Color
Mov ah,al
Mov cx,16000 { Store 16000 DWords }
db 66h Rep Stosw
End;
In this case, if the color value was $34, EAX would equal $34343434, and
this would be stored to the screen.
Procedure CopyScreen(Var Source, Dest); Assembler;
Asm
Push ds { TP doesn't save DS }
Les di,Dest
Lds si,Source
Mov cx,16000
db 66h; Rep Movsw { Move 16000 words at [ds:si] to [es:di] }
Pop ds
End;