Usa las etiquetas de código, nen
IF ( (mem[fseg:fofs+Ord(txt[i])*16+j] SHL k) AND 128) > 0
Vayamos por partes:
esto supongo que está claro, es el código ASCII del carácter
txt.
trivial.
sumamos la expresión anterior al puntero de segmento.
mem[fseg:fofs+Ord(txt[i])*16+j]
direccionamos la memoria (
mem[]), especificando como segmento
fseg y segmento la expresión anterior.
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:
mem[fseg:fofs+Ord(txt[i])*16+j] SHL k) AND 128
¿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:
0xxx xxxx <- Contenido de la memoria
1000 0000 <- 128
---------
0000 0000 <- 0
o bien 128 si ese bit es 1:
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.
P.D: No hay molestia