Espamática
Ensamblador Z80RetroZX Spectrum

0x01 Ensamblador ZX Spectrum Marciano – Gráficos

En este capítulo de Ensamblador ZX Spectrum Marciano, vamos a definir todos los gráficos que vamos a usar en Batalla espacial, aprovechando para practicar la conversión hexadecimal/binario, por lo que vamos a hacer nuestra primera práctica.

UDG

Ya comenté en el capítulo anterior que estoy usando una Raspberry Pi 400, y eso me impone alguna limitación, como que no tengo disponible el programa que suelo usar para diseñar los gráficos para ZX Spectrum, así que he hecho dos plantillas para usar con GIMP, y que simula el área de dibujo de ZX Paintbrush, que es el programa que uso en Windows.

Las plantillas que he preparado son las siguientes:

  • 8x8Template: para diseñar gráficos de 8×8 píxeles.
  • 256x192Template: tapiz con el tamaño de la pantalla del ZX Spectrum.

Para batalla espacial vamos a usar 8x8Template, os pondré la imagen de los gráficos, los códigos hexadecimales de los mismos, y vuestra labor consistirá en convertir, de cabeza, esos códigos hexadecimales para dibujar los gráficos en las plantillas.

Conversión hexadecimal/binario

Aunque en un primer momento pueda resultar complicado hacer la conversión de un número hexadecimal a binario, y viceversa, la realidad es que es muy sencillo y prácticamente directa, necesitamos saber el valor de cada bit (pixel) en bloques de cuatro, lo que nos da un valor comprendido entre 0 y F, que es el valor que se puede representar con cada dígito hexadecimal.

En un byte, cada bit a uno tiene un valor específico, siendo los siguientes:

Bit76543210
Valor1286432168421
Peso de cada bit de un byte

Cuando hacemos la conversión hexadecimal/binario, dividimos el byte en dos bloques de cuatro bits (nibble), lo que resulta en un rango de valores entre 0 y F (8 + 4 + 2 + 1 = 15 = F). De esta manera, para convertir de binario a hexadecimal, tan solo hay que sumar el valor de los bits a 1 de cada nibble, lo cual nos da el valor en hexadecimal.

Suponed que tenemos el siguiente valor en binario:

01011001

Si sumamos los valores de los nibbles, el resultado sería:

0 + 4 + 0 + 1 = 58 + 0 + 0 + 1 = 9

Resultando que 01011001 en hexadecimal es 59.

En hexadecimal, un byte se representa con dos dígitos. Pero, ¿qué pasa si el valor de algunos de los nibbles es mayor de 9? Veamos un ejemplo:

11011011 = 8 + 4 + 0 + 1 = 13 y 8 + 0 + 2 + 1 = 11

¿Cómo representamos 13 y 11 con solo dos dígitos? En hexadecimal los valores de 10 a 15 se representan con letras, usando la siguiente nomenclatura:

Decimal123456789101112131415
Hexadecimal123456789ABCDEF
Valores decimales/hexadecimales

Por lo que, en el ejemplo anterior, el valor hexadecimal de 11011011 es DB.

Practicado la conversión hexadecimal/binario

Una buena forma de aprender es con la práctica, y eso es lo que propongo a continuación; vamos a ver la definición de cada uno de los UDG que vamos a usar (los valores hexadecimales) y vamos a dibujarlos haciendo la conversión de hexadecimal a binario.

Al trabajar con nibble (4 bits), la tabla de conversión para un byte sería la siguiente:

Byte76543210
Valor84218421
Peso de los bits por nibble

Vamos a crear la carpeta Paso01, y dentro de ella el archivo Var.asm. Teniendo esta tabla a mano, vamos a dibujar la nave, cuya definición en hexadecimal (que vamos a copiar en el archivo creado) es la siguiente:

ASM
udgsCommon:
db $24, $42, $99, $bd, $ff, $18, $24, $5a	; $90 Nave

Vamos a hacer la conversión a binario.

Byte76543210
Valor84218421
$24

X

X

$42
X



X
$99X

XX

X
$bdX
XXXX
X
$ffXXXXXXXX
$18


XX


$24

X

X

$5a
X
XX
X
Gráfico de la nave

Si trasladáis esta conversión a ZX Paintbrush, o a las plantillas que os he dejado, el resultado debe ser el siguiente, aquí está nuestra nave:

Vamos a seguir practicando, haciendo las conversiones para el disparo y la animación de la explosión de la nave. Es importante que intentéis trasladar vosotros de hexadecimal a binario, y de ahí al gráfico.

ASM
db $00, $18, $24, $5a, $5a, $24, $18, $00	; $91 Disparo
Byte76543210
Valor84218421
$00







$18


XX


$24

X

X

$5a
X
XX
X
$5a
X
XX
X
$24

X

X

$18


XX


$00







Gráfico del disparo
ASM
db $00, $00, $00, $00, $24, $5a, $24, $18	; $92 Explosión 1
Byte76543210
Valor84218421
$00







$00







$00







$00







$24

X

X

$5a
X
XX
X
$24

X

X

$18


XX


Gráfico uno de la explosión
ASM
 db $00, $00, $00, $14, $2a, $34, $24, $18	; $93 Explosión 2
Byte76543210
Valor84218421
$00







$00







$00







$14


X
X

$2a

X
X
X
$34

XX
X

$24

X

X

$18


XX


Gráfico dos de la explosión
ASM
db $00, $00, $0c, $12, $2a, $56, $64, $18	; $94 Explosión 3
Byte76543210
Valor84218421
$00







$00







$0c



XX

$12


X

X
$2a

X
X
X
$56
X
X
XX
$64
XX

X

$18


XX


Gráfico tres de la explosión
ASM
db $20, $51, $92, $d5, $a9, $72, $2c, $18 ; $95 Explosión 4
Byte76543210
Valor84218421
$20

X




$51
X
X


X
$92X

X

X
$d5XX
X
X
X
$a9X
X
X

X
$72
XXX

X
$2c

X
XX

$18


XX


Gráfico cuatro de la explosión

A partir de aquí solo voy a poner la definición hexadecimal y la imagen del aspecto final de cada UDG.

Quizá os preguntéis que significa el número que hay en cada comentario de cada definición; es el código del carácter que estamos redefiniendo, ese el código de carácter que mandaremos a imprimir para pintar el gráfico. No os preocupéis si ahora no lo entendéis, más adelante lo veréis mucho más claro.

ASM
db $3f, $6a, $ff, $b8, $f3, $a7, $ef, $ae	; $96 Esquina superior izquierda
db $ff, $aa, $ff, $00, $ff, $ff, $00, $00	; $97 Horizontal superior
db $fc, $ae, $fb, $1f, $cd, $e7, $f5, $77	; $98 Esquina superior derecha
db $ec, $ac, $ec, $ac, $ec, $ac, $ec, $ac	; $99 Lateral izquierda
db $35, $37, $35, $37, $35, $37, $35, $37	; $9a Lateral derecha
db $ee, $af, $e7, $b3, $f8, $df, $75, $3f	; $9b Esquina inferior izquierda
db $00, $00, $ff, $ff, $00, $ff, $55, $ff	; $9c Horizontal inferior
db $75, $f7, $e5, $cf, $1d, $ff, $56, $fc	; $9d Esquina inferior derecha
db $00, $00, $00, $00, $00, $00, $00, $00	; $9e Blanco
ASM
udgsEnemiesLevel1:
db $8c, $42, $2d, $1d, $b4, $be, $46, $30	; $9f Left/Up
db $31, $42, $b4, $b8, $2d, $7d, $62, $0c	; $a0 Rigth/Up
db $30, $46, $be, $b4, $1d, $2d, $42, $8c	; $a1 Left/Down
db $0c, $62, $7d, $2d, $b8, $b4, $42, $31	; $a2 Rigth/Down
ASM
udgsEnemiesLevel2:
db $c0, $fb, $69, $5d, $7b, $14, $4a, $79 	; $9f Left/Up
db $03, $df, $96, $ba, $de, $28, $52, $9e 	; $a0 Rigth/Up
db $79, $4a, $14, $7b, $5d, $69, $fb, $c0 	; $a1 Left/Down
db $9e, $52, $28, $de, $ba, $96, $df, $03 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel3:
db $fc, $84, $b4, $af, $99, $f7, $14, $1c 	; $9f Left/Up
db $3f, $21, $2d, $f5, $99, $ef, $28, $38 	; $a0 Rigth/Up
db $1c, $14, $f7, $99, $af, $b4, $84, $fc 	; $a1 Left/Down
db $38, $28, $ef, $99, $f5, $2d, $21, $3f 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel4:
db $f2, $95, $98, $fe, $39, $55, $92, $4d 	; $9f Left/Up
db $4f, $a9, $19, $7f, $9c, $aa, $49, $b2 	; $a0 Rigth/Up
db $4d, $92, $55, $39, $fe, $98, $95, $f2 	; $a1 Left/Down
db $b2, $49, $aa, $9c, $7f, $19, $a9, $4f 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel5:
db $76, $99, $a4, $d4, $47, $bd, $8a, $4c 	; $9f Left/Up
db $6e, $99, $25, $2b, $e2, $bd, $51, $32 	; $a0 Rigth/Up
db $4c, $8a, $bd, $47, $d4, $a4, $99, $76 	; $a1 Left/Down
db $32, $51, $bd, $e2, $2b, $25, $99, $6e 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel6:
db $98, $66, $59, $aa, $b6, $49, $5a, $24 	; $9f Left/Up
db $19, $66, $9a, $55, $6d, $92, $5a, $24 	; $a0 Rigth/Up
db $24, $5a, $49, $b6, $aa, $59, $66, $98 	; $a1 Left/Down
db $24, $5a, $92, $6d, $55, $9a, $66, $19 	; $a2 Rigth/Down
Ensamblador ZX Spectrum, enemigos nivel seis
Enemigos nivel seis
ASM
udgsEnemiesLevel7:
db $04, $72, $5d, $74, $2e, $be, $4c, $20 	; $9f Left/Up
db $20, $4e, $ba, $2e, $74, $7d, $32, $04 	; $a0 Rigth/Up
db $20, $4c, $be, $2e, $74, $5d, $72, $04 	; $a1 Left/Down
db $04, $32, $7d, $74, $2e, $ba, $4e, $20 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel8:
db $00, $7c, $5a, $68, $7c, $4f, $26, $04 	; $9f Left/Up
db $00, $3e, $5a, $16, $3e, $f2, $64, $20 	; $a0 Rigth/Up
db $04, $26, $4f, $7c, $68, $5a, $7c, $00 	; $a1 Left/Down
db $20, $64, $f2, $3e, $16, $5a, $3e, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel9:
db $e0, $d8, $b6, $6e, $5b, $36, $3c, $08 	; $9f Left/Up
db $07, $1b, $6d, $76, $da, $6c, $3c, $10 	; $a0 Rigth/Up
db $08, $3c, $36, $5b, $6e, $b6, $d8, $e0 	; $a1 Left/Down
db $10, $3c, $6c, $da, $76, $6d, $1b, $07 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel10:
db $e0, $ce, $bf, $3c, $73, $75, $6a, $2c 	; $9f Left/Up
db $07, $73, $fd, $3c, $ce, $ae, $56, $34 	; $a0 Rigth/Up
db $2c, $6a, $75, $73, $3c, $bf, $ce, $e0 	; $a1 Left/Down
db $34, $56, $ae, $ce, $3c, $fd, $73, $07 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel11:
db $e0, $de, $bf, $7c, $7b, $75, $6a, $2c 	; $9f Left/Up
db $07, $7b, $fd, $3e, $de, $ae, $56, $34 	; $a0 Rigth/Up
db $2c, $6a, $75, $7b, $7c, $bf, $de, $e0 	; $a1 Left/Down
db $34, $56, $ae, $de, $3e, $fd, $7b, $07 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel12:
db $e0, $fe, $f7, $6c, $5f, $7e, $6c, $28 	; $9f Left/Up
db $07, $7f, $ef, $36, $fa, $7e, $36, $14 	; $a0 Rigth/Up
db $28, $6c, $7e, $5f, $6c, $f7, $fe, $e0 	; $a1 Left/Down
db $14, $36, $7e, $fa, $36, $ef, $7f, $07 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel13:
db $07, $6c, $7e, $34, $6f, $fb, $ae, $8c 	; $9f Left/Up
db $e0, $36, $7e, $2c, $f6, $df, $75, $31 	; $a0 Rigth/Up
db $8c, $ae, $fb, $6f, $34, $7e, $6c, $07 	; $a1 Left/Down
db $31, $75, $df, $f6, $2c, $7e, $36, $e0 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel14:
db $21, $1a, $96, $75, $4c, $3c, $62, $90 	; $9f Left/Up
db $84, $58, $69, $ae, $32, $3c, $46, $09 	; $a0 Rigth/Up
db $90, $62, $3c, $4c, $75, $96, $1a, $21 	; $a1 Left/Down
db $09, $46, $3c, $32, $ae, $69, $58, $84 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel15:
db $04, $02, $0d, $14, $28, $b0, $40, $20 	; $9f Left/Up
db $20, $40, $b0, $28, $14, $0d, $02, $04 	; $a0 Rigth/Up
db $20, $40, $b0, $28, $14, $0d, $02, $04 	; $a1 Left/Down
db $04, $02, $0d, $14, $28, $b0, $40, $20 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel16:
db $30, $48, $be, $b9, $7c, $2e, $27, $13 	; $9f Left/Up
db $0c, $12, $7d, $9d, $3e, $74, $e4, $c8 	; $a0 Rigth/Up
db $13, $27, $2e, $7c, $b9, $be, $48, $30 	; $a1 Left/Down
db $c8, $e4, $74, $3e, $9d, $7d, $12, $0c 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel17:
db $c0, $df, $36, $7c, $58, $77, $66, $44 	; $9f Left/Up
db $03, $fb, $6c, $3e, $1a, $ee, $66, $22 	; $a0 Rigth/Up
db $44, $66, $77, $58, $7c, $36, $df, $c0 	; $a1 Left/Down
db $22, $66, $ee, $1a, $3e, $6c, $fb, $03 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel18:
db $02, $71, $69, $57, $2f, $1e, $9e, $78 	; $9f Left/Up
db $40, $8e, $96, $ea, $f4, $78, $79, $1e 	; $a0 Rigth/Up
db $78, $9e, $1e, $2f, $57, $69, $71, $02 	; $a1 Left/Down
db $1e, $79, $78, $f4, $ea, $96, $8e, $40 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel19:
db $20, $7f, $e6, $4e, $5e, $79, $78, $44 	; $9f Left/Up
db $04, $fe, $67, $72, $7a, $9e, $1e, $22 	; $a0 Rigth/Up
db $44, $78, $79, $5e, $4e, $e6, $7f, $20 	; $a1 Left/Down
db $22, $1e, $9e, $7a, $72, $67, $fe, $04 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel20:
db $36, $2f, $db, $be, $7c, $db, $f6, $64 	; $9f Left/Up
db $6c, $f4, $db, $7d, $3e, $db, $6f, $26 	; $a0 Rigth/Up
db $64, $f6, $db, $7c, $be, $db, $2f, $36 	; $a1 Left/Down
db $26, $6f, $db, $3e, $7d, $db, $f4, $6c 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel21:
db $00, $70, $6e, $54, $2b, $34, $28, $08 	; $9f Left/Up
db $00, $0e, $76, $2a, $d4, $2c, $14, $10 	; $a0 Rigth/Up
db $08, $28, $34, $2b, $54, $6e, $70, $00 	; $a1 Left/Down
db $10, $14, $2c, $d4, $2a, $76, $0e, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel22:
db $00, $78, $6e, $56, $6d, $3b, $34, $0c 	; $9f Left/Up
db $00, $1e, $76, $6a, $b6, $dc, $2c, $30 	; $a0 Rigth/Up
db $0c, $34, $3b, $6d, $56, $6e, $78, $00 	; $a1 Left/Down
db $30, $2c, $dc, $b6, $6a, $76, $1e, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel23:
db $0c, $02, $3d, $35, $ac, $b8, $40, $30 	; $9f Left/Up
db $30, $40, $bc, $ac, $35, $1d, $02, $0c 	; $a0 Rigth/Up
db $30, $40, $b8, $ac, $35, $3d, $02, $0c 	; $a1 Left/Down
db $0c, $02, $1d, $35, $ac, $bc, $40, $30 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel24:
db $00, $77, $6e, $56, $2a, $74, $7b, $42 	; $9f Left/Up
db $00, $ee, $76, $6a, $54, $2e, $de, $42 	; $a0 Rigth/Up
db $42, $7b, $74, $2a, $56, $6e, $77, $00 	; $a1 Left/Down
db $42, $de, $2e, $54, $6a, $76, $ee, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel25:
db $c0, $ff, $76, $6c, $5f, $7e, $6c, $48 	; $9f Left/Up
db $03, $ff, $6e, $36, $fa, $7e, $36, $12 	; $a0 Rigth/Up
db $48, $6c, $7e, $5f, $6c, $76, $ff, $c0 	; $a1 Left/Down
db $12, $36, $7e, $fa, $36, $6e, $ff, $03 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel26:
db $3c, $7e, $f7, $e8, $da, $e1, $68, $24 	; $9f Left/Up
db $3c, $7e, $ef, $17, $5b, $87, $16, $24 	; $a0 Rigth/Up
db $24, $68, $e1, $da, $e8, $f7, $7e, $3c 	; $a1 Left/Down
db $24, $16, $87, $5b, $17, $ef, $7e, $3c 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel27:
db $04, $02, $39, $2d, $3f, $9e, $4c, $38 	; $9f Left/Up
db $20, $40, $9c, $b4, $fc, $79, $32, $1c 	; $a0 Rigth/Up
db $38, $4c, $9e, $3f, $2d, $39, $02, $04 	; $a1 Left/Down
db $1c, $32, $79, $fc, $b4, $9c, $40, $20 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel28:
db $00, $37, $69, $5c, $34, $5f, $46, $64 	; $9f Left/Up
db $00, $ec, $96, $3a, $2c, $fa, $62, $26 	; $a0 Rigth/Up
db $64, $46, $5f, $34, $5c, $69, $37, $00 	; $a1 Left/Down
db $26, $62, $fa, $2c, $3a, $96, $ec, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel29:
db $00, $37, $6d, $5e, $34, $7f, $56, $64 	; $9f Left/Up
db $00, $ec, $b6, $7a, $2c, $fe, $6a, $26 	; $a0 Rigth/Up
db $64, $56, $7f, $34, $5e, $6d, $37, $00 	; $a1 Left/Down
db $26, $6a, $fe, $2c, $7a, $b6, $ec, $00 	; $a2 Rigth/Down
ASM
udgsEnemiesLevel30:
db $e0, $ff, $ed, $5b, $7e, $6e, $5f, $72 	; $9f Left/Up
db $07, $ff, $b7, $da, $7e, $76, $fa, $4e 	; $a0 Rigth/Up
db $72, $5f, $6e, $7e, $5b, $ed, $ff, $e0 	; $a1 Left/Down
db $4e, $fa, $76, $7e, $da, $b7, $ff, $07 	; $a2 Rigth/Down

Ensamblador ZX Spectrum, conclusión

Con esto ya tenemos definidos los gráficos que vamos a usar: tenemos la nave, el disparo, la explosión de la nave, el marco de la pantalla y los enemigos.

Podéis observar que todos los enemigos tienen el mismo código de carácter, lo cual es debido a que hay un número limitado de caracteres para usar como UDG. No os preocupéis, más adelante veremos una forma de salvar esta limitación.

Vuelvo a insistir en la importancia de practicar la conversión hexadecimal / binario, así que no lo dejéis para otro día, es un ejercicio sencillo.

En el próximo capítulo veremos como usar los UDG y pintaremos todos nuestros gráficos en pantalla.

El código generado, las imágenes y las plantillas las podéis descargar desde aquí.

Enlaces de interés

Ensamblador para ZX Spectrum Batalla espacial por Juan Antonio Rubio García.
Esta obra está bajo licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.



Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.

12 comentarios en «0x01 Ensamblador ZX Spectrum Marciano – Gráficos»

  • Lo primero es dar las gracias por este tutorial.
    Lo segundo es hacer una consulta. ¿Hay algún programa en que puedas dibujar y te de después los códigos hexadecimales para meterlos en el ensamblador tal como has hecho tu en los db? Un saludo.

    Respuesta
  • Gracias por contestar. He visto los dos pero no se cual es la opción para que me de los códigos del dibujo. A ver si me puedes dar una pista de en que parte del menu está esa opción.

    Respuesta
    • En ZX PaintBrush, seleccionas la parte de la que quieres sacar los datos, menu File\Export file/selection as, seleccionas Assembler data file, le das un nombre y al darle a guardar ya te salen más opciones. Yo suelo quitar Include attributes in output, lo dejo con hexadecimal output, pongo como prefijo hexadecimal $ y quito el sufijo, y como prefijo de línea pongo db: yo uso PASMO para compilar.
      En lugar de darle a OK, le doy a Export to clipboard y así no me crea el archivo.

      Respuesta
      • Perfecto. Ya lo he probado y era eso exactamente lo que buscaba. Gracias.

        Respuesta
  • Pingback: 0x0B Ensamblador ZX Spectrum Marciano - Comportamiento de los enemigo - Espamática

  • Feliz noche.
    Realmente no es un problema, no hace falta mucho para crear esta hoja incluso con Excel y macro para que te haga la conversión por filas en binario y a hexadecimal.
    La curiosidad es BE_256x192Template.png pueda 870kb pero solo salen 4×4 cuadrados de 8x8bytes. Algo no me carga bien. La anterior pesa 1,79kb y la diferencia es el espacio en blanco. Mmmmm. Jajaja. Felicidades y un millón de gracias esperando mi ks2 de Next y como no

    Respuesta
  • Y me gustan los puzzles se que existen calculadoras pero me encanta entender el funcionamiento. Entiendo nibble alto y bajo. No la manera de conversión. 😞

    01011001

    No comprendo por qué teniendo los dos nibble…

    0 + 4 + 0 + 1 = 58 + 0 + 0 + 1 = 9

    Solo cambia el bit 2 del nibble alto y el 58 que busque sumando bits y de varias maneras y no localizo de donde sale y lo mismo los otros valores por qué siguen siendo 0y1?
    Si ves que no corresponde no pierdas tu tiempo. Porfavor. Es un placer y se que aún aprenderé mucho pero como un buen profesor me dijo, si puedes preguntar… Pregunta. Salud desde Mallorca a todos

    Respuesta
    • Buenas noches.
      No me queda clara tu duda.
      Dividimos el byte en dos nibles y cada bit tiene un peso.
      7 6 5 4 3 2 1 0
      8 4 2 1 8 4 2 1

      En el ejemplo:
      0 1 0 1 1 0 0 1
      El peso sería:
      0 4 0 1 8 0 0 1

      Solo se tiene en cuenta el peso de los bits a 1.
      El nibble de la izquierda vale 5 y el de la derecha 8, eso nos da que 01011001 en binario es 58 en hexadecimal.

      No sé si con esto te contesto.

      Respuesta

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Descubre más desde Espamática

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo