Contributor: BRENT BEACH { From: Kris Vandermotten Read: Yes Replied: No There has been some talk about fast moves to move temp screens to the screen memory. Here's my FastMove. It's demonstrated here with a color text screen, but it can be used with mode $13 screens also. I guess that's where it is most usefull. It can be used for other things than screens, but remember: - the memory blocks must not overlap - the size of the memory block must be a multiple of 4 bytes - it works best if the memory blocks are aligned at 4 byte boundaries All these are ok for screens. Needs TP7. } program testmove; {$G+,S-,R-} procedure FastMove(var source, dest; count: word); assembler; {count must be evenly dividible by 4 !} asm cld mov cx,count lds si,source cmp cx,0 les di,dest je @end cmp test8086,2 jle @no386 shr cx,2 @loop: db $66; mov ax,[si] db $66; mov es:[di],ax dec cx add si,4 add di,4 cmp cx,0 jne @loop jmp @end @no386: shr cx,1 rep movsw @end: mov ax, seg @data mov ds,ax end; Type PScreen = ^TScreen; TScreen = array[0..24,0..79] of word; Var Screen: TScreen absolute $B800:$0000; {$B000:$0000 for mono} Buf1, buf2: PScreen; i: word; begin New(Buf1); New(Buf2); Buf1^ := Screen; FillChar(Buf2^,SizeOf(Buf2^),0); For i := 0 to 1000 do begin FastMove(Buf2^,Screen,SizeOf(Screen)); FastMove(Buf1^,Screen,SizeOf(Screen)); end; Dispose(buf1); Dispose(Buf2); end. { That's it. If you use this in any commercial software, give me credit. Tested. Normal disclaimer goes: use at your own risk. }