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.

Ensamblador ZX Spectrum, sección plantilla 8x8
Sección plantilla 8×8
Ensamblador ZX Spectrum, sección plantilla 256x192
Sección plantilla 256×192

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:

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:

Ensamblador ZX Spectrum, nave
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.

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
Ensamblador ZX Spectrum, disparo
Disparo
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
 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
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
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
Ensamblador ZX Spectrum, explosión
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.

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
Ensamblador ZX Spectrum, marco
Marco
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
Ensamblador ZX Spectrum, enemigos nivel uno
Enemigos nivel uno
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
Ensamblador ZX Spectrum, enemigos nivel dos
Enemigos nivel dos
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
Ensamblador ZX Spectrum, enemigos nivel tres
Enemigos nivel tres
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
Ensamblador ZX Spectrum, enemigos nivel cuatro
Enemigos nivel cuatro
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
Ensamblador ZX Spectrum, enemigos nivel cinco
Enemigos nivel cinco
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
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
Ensamblador ZX Spectrum, enemigos nivel siete
Enemigos nivel siete
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
Ensamblador ZX Spectrum, enemigos nivel ocho
Enemigos nivel ocho
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
Ensamblador ZX Spectrum, enemigos nivel nueve
Enemigos nivel nueve
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
Ensamblador ZX Spectrum, enemigos nivel diez
Enemigos nivel diez
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
Ensamblador ZX Spectrum, enemigos nivel once
Enemigos nivel once
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
Ensamblador ZX Spectrum, enemigos nivel doce
Enemigos nivel doce
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
Ensamblador ZX Spectrum, enemigos nivel trece
Enemigos nivel trece
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
Ensamblador ZX Spectrum, enemigos nivel catorce
Enemigos nivel catorce
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
Ensamblador ZX Spectrum, enemigos nivel quince
Enemigos nivel quince
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
Ensamblador ZX Spectrum, enemigos nivel dieciséis
Enemigos nivel dieciséis
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
Ensamblador ZX Spectrum, enemigos nivel diecisiete
Enemigos nivel diecisiete
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
Ensamblador ZX Spectrum, enemigos nivel dieciocho
Enemigos nivel dieciocho
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
Ensamblador ZX Spectrum, enemigos nivel diecinueve
Enemigos nivel diecinueve
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
Ensamblador ZX Spectrum, enemigos nivel veinte
Enemigos nivel veinte
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
Ensamblador ZX Spectrum, enemigos nivel veintiuno
Enemigos nivel veintiuno
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
Ensamblador ZX Spectrum, enemigos nivel veintidós
Enemigos nivel veintidós
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
Ensamblador ZX Spectrum, enemigos nivel veintitrés
Enemigos nivel veintitrés
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
Ensamblador ZX Spectrum, enemigos nivel veinticuatro
Enemigos nivel veinticuatro
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
Ensamblador ZX Spectrum, enemigos nivel veinticinco
Enemigos nivel veinticinco
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
Ensamblador ZX Spectrum, enemigos nivel veintiséis
Enemigos nivel veintiséis
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
Ensamblador ZX Spectrum, enemigos nivel veintisiete
Enemigos nivel veintisiete
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
Ensamblador ZX Spectrum, enemigos nivel veintiocho
Enemigos nivel veintiocho
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
Ensambladdor ZX Spectrum, enemigos nivel veintinueve
Enemigos nivel veintinueve
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
Enemigos nivel treinta

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.

Aquí puedes ver más cosas que he desarrollado para .Net, y aquí las desarrolladas en ensamblador para Z80.

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

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

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
A %d blogueros les gusta esto: