(* IL> Use the memw array to read one word. The low byte is the attribute IL> (color) and the other is the character. IL> IL> var ch:word; x,y:byte; IL> begin IL> {get x,y then read} IL> ch:=MEMW[$b800:y*25+x-1]; IL> end. IL> IL> The numbers might be off, but that's the idea. Ouch. You screwed up there... This should do it: (and I DON'T want some optimizations as 'shl ax,5' is faster than 'mov cl,5; shl ax,cl'. It is coded in this way to ensure downward compatiblity. Replace TextVidMem with either 0b000h or 0b800h, depending on your screen.) *) Function ReadCharThingy(x, y : Word) : Word; Assembler; Asm dec x dec y mov ax,y mov cl,5 shl ax,cl mov si,ax mov cl,2 shl ax,cl add si,ax shl x,1 add si,x mov ax,TextVideoMem push ds mov ds,ax lodsw pop ds End;