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.
Tabla de contenidos
- UDG
- Conversión hexadecimal/binario
- Practicado la conversión hexadecimal/binario
- Ensamblador ZX Spectrum, conclusión
- Enlaces de interés
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:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
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:
Decimal | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Hexadecimal | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
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:
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
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.
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$24 | X | X | ||||||
$42 | X | X | ||||||
$99 | X | X | X | X | ||||
$bd | X | X | X | X | X | X | ||
$ff | X | X | X | X | X | X | X | X |
$18 | X | X | ||||||
$24 | X | X | ||||||
$5a | X | X | X | X |
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.
db $00, $18, $24, $5a, $5a, $24, $18, $00 ; $91 Disparo
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$00 | ||||||||
$18 | X | X | ||||||
$24 | X | X | ||||||
$5a | X | X | X | X | ||||
$5a | X | X | X | X | ||||
$24 | X | X | ||||||
$18 | X | X | ||||||
$00 |
db $00, $00, $00, $00, $24, $5a, $24, $18 ; $92 Explosión 1
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$00 | ||||||||
$00 | ||||||||
$00 | ||||||||
$00 | ||||||||
$24 | X | X | ||||||
$5a | X | X | X | X | ||||
$24 | X | X | ||||||
$18 | X | X |
db $00, $00, $00, $14, $2a, $34, $24, $18 ; $93 Explosión 2
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$00 | ||||||||
$00 | ||||||||
$00 | ||||||||
$14 | X | X | ||||||
$2a | X | X | X | |||||
$34 | X | X | X | |||||
$24 | X | X | ||||||
$18 | X | X |
db $00, $00, $0c, $12, $2a, $56, $64, $18 ; $94 Explosión 3
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$00 | ||||||||
$00 | ||||||||
$0c | X | X | ||||||
$12 | X | X | ||||||
$2a | X | X | X | |||||
$56 | X | X | X | X | ||||
$64 | X | X | X | |||||
$18 | X | X |
db $20, $51, $92, $d5, $a9, $72, $2c, $18 ; $95 Explosión 4
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Valor | 8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
$20 | X | |||||||
$51 | X | X | X | |||||
$92 | X | X | X | |||||
$d5 | X | X | X | X | X | |||
$a9 | X | X | X | X | ||||
$72 | X | X | X | X | ||||
$2c | X | X | X | |||||
$18 | X | X |
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
- Notepad++
- Visual Studio Code
- Sublime Text
- ZEsarUX
- PASMO
- Git
- Curso de ensamblador Z80 de Compiler Software
- Referencia Z80
- Ensamblador Z80 en Telegram
- Tutorial completo en formato PDF y EPUB
- Proyecto en itch.io
- Archivo .dsk con los juegos de los tutoriales
- Personalización y depuración con ZEsarUX
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.
También puedes visitar el resto de tutoriales:
Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.
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.
Hola Jesús.
Tienes varios.
Yo suelo usar ZX PaintBrush (https://sourcesolutions.itch.io/zx-paintbrush). También te puede interesar SevenUp.
Puedes encontrar más cosas aquí: https://wiki.speccy.org/programacion/recursos_prog/indice#utilidades-y-herramientas-de-desarrollo
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.
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.
Perfecto. Ya lo he probado y era eso exactamente lo que buscaba. Gracias.
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
Hola.
8×8 pesa 59Kb y 256×192 pesa 37Kb.
Si las abres con GIMP no olvides ir al menú Vista y seleccionar Mostrar rejilla.
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
Y no se por que creo que estoy metiendo enmedio el decimal y eso me descoloca. Abrazos
No puedo borrarlo mis neuronas se han colocado perdón
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.