{ > >If anyone wants to see my "improved" move() and fillchar() which I put > >into a unit which I almost always link in I'd be happy to post it. (I > >know that TCA has an even better one though, in case he'd like to post > >his version as well) > > Oh, fine. Now that the world knows, I suppose I have to post it ;) > Thank you for so graciously accepting the terms before anyone wanted me to post my much more elementary 16-bit version as below: } procedure move (var src, dest; count : word); assembler; asm push ds mov bx, count mov cx, bx shr cx, 1 les di, src lds si, dest rep movsw and bx, 1 jz @NoMovsB movsb @NoMovsB: pop ds end; > This is a 32bit move() replacement. Just throw the procedure in at the > top of your program, and all your move() calls will work a little faster > (about 4 times faster for counts above 128 bytes). > > procedure move(var Source,Dest; Count:word); assembler; > asm > push ds > les di,Dest > lds si,Source > mov cx,count > mov bx,cx > shr cx,2 > db 66h; rep movsw > and bx,3 > mov cx,bx > rep movsb > pop ds > end; > I remember yours looking a little different then that, maybe I'm thinking of fillchar (later on)... but not to be picky, since dx isn't used, couldn't you use mov dx, ds and mov ds, dx instead of push and pop respectively? > The fillchar() replacement isn't as nice, since with fillchar you can do > things like: fillchar(foo,128,'H'); or fillchar(foo,128,TRUE); > That makes conversions more difficult. Still, for those of you who don't > do that: > > procedure fillchar(var X; Count:word; Value:byte); assembler; > asm > les di,X > mov cx,count > mov al,value > mov ah,al > mov bx,ax > db 66h; shl ax,16 > mov ax,bx > mov bx,cx > shr cx,2 > db 66h; rep stosw > and bx,3 > mov cx,bx > rep stosb > end; > Hmmm... you must have rewritten both of them since I last saw them, as I remember something utilizing adc in one of those... oh well, thse look more logical anyway :) > To get around the character or boolean types, do ord('H') or ord(TRUE). > (It all compiles to the same code). > > This procedure will only increase the speed of fillchar() calls when the > Count is above 128 or so. It will also fillchar to pointers faster than > arrays (since pointers are aligned, and arrays are [usually] not). I > just wrote the fillchar() procedure, so it is not as optimized as it > could be. > How about I put up my fillchar as well, just for comparison's sake (it's, once again, only 16-bit, but it seems to work just fine anyway :) procedure FillChar (var src, dest; count : word; value : byte); assembler; asm mov bx, count mov cx, bx shr cx, 1 mov al, value mov ah, al les di, dest rep stosw and bx, 1 jz @NoStosB stosb @NoStosB: end; In other words it's my move() only with ax = 257*value and, well, a fill instead of a move. :)