Programación General => Pascal => Mensaje iniciado por: 123celes en Jueves 16 de Octubre de 2008, 15:09
Título: Texto en modo gráfico
Publicado por: 123celes en Jueves 16 de Octubre de 2008, 15:09
Hola, ¿Qué tal?, les escribo para preguntarles sobre una rutina en Turbo Pascal que permite escribir texto en modo gráfico
PROCEDURE WriteTXT(segm,x,y:word;txt:string;color:byte); VAR i,j,k:byte; Begin for i:=1 to length(txt) do for j:=0 to 15 do for k:=0 to 7 do
if ((mem[fseg:fofs+ord(txt)*16+j] shl k) and 128) > 0 then begin mem[segm:(y+j)*320+(i*8)+x+k]:=color; end; End;
fseg,fofs:word; {para la fuente grafica}
Me podrían explicar por favor ¿Qué hace cada linea?, muchas gracias.
Título: Re: Texto en modo gráfico
Publicado por: m0skit0 en Jueves 16 de Octubre de 2008, 16:05
¡Bienvenido al foro 123celes!
Deberías usar las etiquetas de código para que te quede más legible.
Primero debes comprender que este es un código de 16 bits, por tanto se ejecuta en el modo real de los procesadores Intel (y clones) ¿Sabes cómo se referencia la memoria en modo real (segmento:desplazamiento)?
¡Saludos!
Título: Re: Texto en modo gráfico
Publicado por: 123celes en Sábado 18 de Octubre de 2008, 16:37
Muchas gracias por tu respuesta, me sirvió de mucho. Una cosa más si no es molestia:
PROCEDURE WriteTXT(segm,x,y:word;txt:string;color:byte); VAR i,j,k:byte; Begin for i:=1 to length(txt) do for j:=0 to 15 do {horiz} for k:=0 to 7 do {vert}
if ((mem[fseg:fofs+ord(txt)*16+j] shl k) and 128) > 0 then begin mem[segm:(y+j)*320+(i*8)+x+k]:=color; end; End;
En la linea que resalte en negrita. Concretamente que esta preguntando:
Lo que me confunde es el and 128, ¿Que hace?
¿comparar el shl k del mem... con el shl k de 128:?
Bueno muchas gracias la respuesta.
Título: Re: Texto en modo gráfico
Publicado por: m0skit0 en Sábado 18 de Octubre de 2008, 17:24
esto supongo que está claro, es el código ASCII del carácter txt.
Código: Pascal
Ord(txt[i])*16+j
trivial.
Código: Pascal
fofs+Ord(txt[i])*16+j
sumamos la expresión anterior al puntero de segmento.
Código: Pascal
mem[fseg:fofs+Ord(txt[i])*16+j]
direccionamos la memoria (mem[]), especificando como segmento fseg y segmento la expresión anterior.
Código: Pascal
mem[fseg:fofs+Ord(txt[i])*16+j]SHL k
movemos los bits k posiciones hacia la izquierda (o lo que es lo mismo, multiplicamos el contenido de la dirección por 2^k).
Y llegamos al final:
Código: Pascal
mem[fseg:fofs+Ord(txt[i])*16+j]SHL k)AND128
¿por qué 128? 128 = 0x80 (hexadecimal) = 1000 0000 en binario, es decir, se hace una operación AND sobre el contenido de la memoria con 1000 0000. El objetivo de esta operación es comprobar si el bit más alto de la palabra está a 1 ó 0, dado que el resultado de la operación será 0 si el bit más alto es 0:
Código: Text
0xxx xxxx <- Contenido de la memoria
1000 0000 <- 128
---------
0000 0000 <- 0
o bien 128 si ese bit es 1:
Código: Text
1xxx xxxx <- Contenido de la memoria
1000 0000 <- 128
---------
1000 0000 <- 128
independientemente del resto de bits de la palabra.
Así que al haber hecho un SHL k sobre la memoria, nos encontramos que en realidad es el bit que se encuentra k posiciones antes del más alto el que en realidad estamos comprobando. De esta manera se pueden comprobar todos los bits de la palabra direccionada haciendo un FOR i:=0 TO 15.