{ > YES!!! Thats it exactly...!!!! If your procedures are Masked then > post away :) Umm.. Don't 'spose your procedures are really fast ASM > versions eh?? How'd you guess? These will only work in 320x200x256 video mode. I might be able to set them up for SVGA modes, but that would be a pain and you would really have to beg and plead and everything to get me to do them. } Function GetImage(x1, y1, x2, y2 : integer) : pointer; { Gets an image from the current buffer } label gi1; var temp : integer; Addr, XReps : word; ImageSize : word; ImagePtr : pointer; begin if (x1>x2) then begin temp := x1; x1 := x2; x2 := temp end; if (y1>y2) then begin temp := y1; y1 := y2; y2 := temp end; ImageSize := (x2-x1+1) * (y2-y1+1) + 4; GetMem(ImagePtr,ImageSize); GetImage := ImagePtr; Addr := x1 + y1 shl 8 + y1 shl 6; XReps := x2-x1+1; asm push ds lds si, CurBuf add si, Addr les di, ImagePtr mov bx, y2 sub bx, y1 inc bx mov ax, XReps { store image height } stosw mov ax, bx { store image width } stosw gi1: { store image } mov cx, XReps rep movsb add si, SW sub si, XReps dec bx jnz gi1 pop ds end end; Procedure PutImage(x, y : integer; ImagePtr : pointer); { Puts an image on the current buffer } label pi1; var Addr : word; begin Addr := x + y shl 8 + y shl 6; asm push ds les di, CurBuf add di, Addr lds si, ImagePtr lodsw mov dx, ax { image width } lodsw mov bx, ax { image height } pi1: mov cx, dx rep movsb add di, SW sub di, dx dec bx jnz pi1 pop ds end end;