• Sábado 19 de Octubre de 2019, 06:30

Autor Tema:  Texto en modo gráfico  (Leído 1125 veces)

123celes

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Texto en modo gráfico
« en: Jueves 16 de Octubre de 2008, 15:09 »
0
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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Texto en modo gráfico
« Respuesta #1 en: Jueves 16 de Octubre de 2008, 16:05 »
0
¡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!

123celes

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Texto en modo gráfico
« Respuesta #2 en: Sábado 18 de Octubre de 2008, 16:37 »
0
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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Texto en modo gráfico
« Respuesta #3 en: Sábado 18 de Octubre de 2008, 17:24 »
0
Usa las etiquetas de código, nen

Código: Pascal
  1.  
  2. IF ( (mem[fseg:fofs+Ord(txt[i])*16+j] SHL k) AND 128) > 0
  3.  
  4.  

Vayamos por partes:

Código: Pascal
  1. Ord(txt[i])
  2.  
esto supongo que está claro, es el código ASCII del carácter txt.

Código: Pascal
  1. Ord(txt[i])*16+j
  2.  
trivial.

Código: Pascal
  1. fofs+Ord(txt[i])*16+j
  2.  
sumamos la expresión anterior al puntero de segmento.

Código: Pascal
  1. mem[fseg:fofs+Ord(txt[i])*16+j]
  2.  
direccionamos la memoria (mem[]), especificando como segmento fseg y segmento la expresión anterior.

Código: Pascal
  1. mem[fseg:fofs+Ord(txt[i])*16+j] SHL k
  2.  
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
  1. mem[fseg:fofs+Ord(txt[i])*16+j] SHL k) AND 128
  2.  
¿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
  1.  
  2. 0xxx xxxx <- Contenido de la memoria
  3. 1000 0000 <- 128
  4. ---------
  5. 0000 0000 <- 0
  6.  
  7.  

o bien 128 si ese bit es 1:

Código: Text
  1.  
  2. 1xxx xxxx <- Contenido de la memoria
  3. 1000 0000 <- 128
  4. ---------
  5. 1000 0000 <- 128
  6.  
  7.  

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.

P.D: No hay molestia  ^_^