{ Ok, without even going back to my compiler I can improve yer design. i forgot that on 386 and up that a mov [addr],al is faster than a single stosb etc, so that was likely my largest time deficit. Yours is the Imul. I'll add the color into mine, but I thought that passing up one less param MIGHT increase the speed slightly. } procedure Putstr(x,y:integer;s:string;attr:byte);assembler; asm push ds {that's all you really need} mov bx,y shl bx,1 mov ax,bx shl bx,2 add ax,bx add ax,$b800 mov es,ax { es:=$B800 + (Yx$80 + Yx$20) shr 4 or $B800+Y*$A } mov di,x shl di,1 { di:=x shl 1 } lds si,s mov cl,byte ptr [si] inc si mov ah,attr @1: mov al,byte ptr [si] mov word ptr es:[di],ax inc si add di,2 dec cl jnz @1 pop ds end; (* | Mov AX,Col { Load Column to write to. } | Shl AX,1 { Column = Column * 2. } | Mov BX,AX { Copy AX to BX. } | Mov AX,Row { Load Row to write to. } | Mov CX,160 { Row = Row * 160. } | IMul CX | Add AX,BX { Offset = (Col * 2) + (Row * 160). } | Mov DI,AX ugh, comments. You freaking PD coder, you. You probably like windows too huh? This is the only section that I have improved on yer design. I only discovered the optimize cause I was writing a faster putpixel. Questions/comments: Xor CH,CH You don't need this line at all. that's 2 opcode tiks for me. (ahhhh, obsessed) Is "mov cl, byte ptr ds:[si]" any slower than "mov cl,[si]" ? I know that "add di,2" is faster than "inc di;inc di" and "dec cl" is better than "dec cx" and "xor cx,cx" is faster than "mov cx,0" GE|BEGIN | Start := ReadTimer; | FOR X := -MaxInt TO MaxInt DO | FastWr(40,5,2,'Greg Estabrooks!'); ^^^^^^^^^^^^^^, see that's the problem right there. It should read: 'Jamie - coder god' The only differences between our code: I used lodsb/stosw out of lasyness. You used xor ch,ch You used imul where I did shifts ( faster, but not the slowest part of the code, so not a big deal ) *)