Para los que no se crean que puedes crear una animación en 224 bytes (que es lo que ocupa en verdad el ejecutable, aunque tuve que añadir un byte extra vacío para que el número fuera múltiplo de 3), aquí va el código. es código de x86 en modo real (16 bits), lo cual significa que funciona de forma nativa en Windows XP, pero no en Vista ni W7 (pero puedes rularlo mediante DosBox). Para los que saben poco de programación, un .com es un ejecutable de MsDos con código binario plano. No hace llamadas al API de Windows, ni OpengGL ni ninguna otra librería externa, porque es eso, un programa de MsDos, y en aquella época no exitía Windows. La BIOS (a la que se accedía mediante la interrupción "int 0x10") se encargaban de implementar el cambio de modo grafico. El hardware de la targeta de video VGA (accedido mediante el puerto "out 0x3c8") se utilzaba para elegir los colores de la paleta. El resto, es ya manipulación de la memoria de la VGA (dirección 0xa000) para dibujar directamente las imágenes en la pantalla mediante manipulación de los bytes individuales de cada pixel.
El código fuente es este:
[BITS 16]
[ORG 0x100]
[SECTION .text]
; --- free .com memory ---
;mov bx, 1000h
mov bh, 10h
mov ah, 4Ah
int 21h
; --- texture malloc ---
;mov bx, (256*256/16)
mov ah, 48h
int 21h
mov gs, ax
; --- table malloc ---
;mov bx, (320*200*2/16)
mov bh, 32 ; sobran 192 bytes...
mov ah, 48h
int 21h
mov fs, ax
mov es, ax
; --- create table ---
mov bp, data
mov cl, 200 ; ( cx=0! )
@loopy:
xor di, di
mov bx, -160
@loopx:
mov ax, cx
sub ax, 100
mov [bp+3], ax
mov [bp+5], bx
fild word [bp+5] ; x
fild word [bp+3] ; x y
fld st0 ; x y y
fmul st0, st0 ; x y y^2
fld st2 ; x y y^2 x
fmul st0, st0 ; x y y^2 x^2
faddp st1, st0 ; x y y^2+x^2
fsqrt ; x y r
fidivr word [bp+1] ; x y d/r
fistp word [es:di+0] ; x y
fpatan ; a
fimul word [bp+0] ; a*128/pi=u
fistp word [es:di+1] ; x y
inc di
inc di
inc bx
cmp bx, 159
jle@loopx
mov ax, es
add ax, 320*2/16
mov es, ax
loop@loopy
; --- create texture ---
; --- create a xor texture ---
@looptex:
mov al, cl
xor al, ch
%if 0
mov bl, al ; x = 4*x*(1-x)
not al
mul bl
shr ax, 6
%endif
mov bx, cx
mov [gs:bx], al
loop @looptex
; --- soften ---
mov cl, 16
@sof:
;xor bx, bx
@loopSOF2:
;inc bl
mov al, [gs:bx]
;sub bl, 2
dec bl
add al, byte [gs:bx]
inc bl
inc bh
add al, byte [gs:bx]
sub bh, 2
add al, byte [gs:bx]
inc bh
shr ax, 2
mov [gs:bx], al
inc bx
jnz@loopSOF2
loop @sof
; --- set gfx mode ---
;mov ax, 0x0013
mov al, 0x13
int 0x10
; --- set video ptr --
push word 0xa000
pop es
;mov bh, 0xa0
;mov es, bx
; --- set palette ---
;mov cl, 63
@looppal:
mov al, cl
mov dx, 0x03c8
out dx, al
inc dx
out dx, al
out dx, al
out dx, al
loop@looppal
; --- start ! --------------------------------------------------------------
@superloop:
; --- inc "timer" ---
inc bp
; --- wait retrace ---
mov dl, 0xda
@r1: in al, dx
test al, 8
jz@r1
@r2: in al, dx
test al, 8
jnz@r2
; --- do_frame ---
push fs
xor di, di
mov cl, 200
@loopy2:
xor si, si
@loopx2:
mov bx, [fs:si]
add bx, bp
mov al, [gs:bx]
stosb
lodsw ; add si,2
cmp si, 640
jl@loopx2
mov ax, fs
add ax, 320*2/16
mov fs, ax
loop @loopy2
pop fs
; --- loop until kbhit() ---
mov ah, 0x11
int 0x16
jz@superloop
; --- set txt mode ---
mov ax, 3
int 0x10
; --- quit to dos ---
ret
; --- data ------------------------------------
data:
R128iPI db 41 ; 40.743665...
radio db 00, 10 ; 2560
que una vez compilado da como resultado 224 bytes binarios, que son los que se reproducen en photoshop mediante colores. Mas info en el link de la noticia.
Portada
mis comunidades
otras secciones
¿engañar? no, no, joder. como explico en el blog, es básicamente un ejercicio de demostrar visualmente cuan poco hace falta para crear una animación. enseñar código, fuente o binario, no suele ayudar. pero enseñar una imagen de 9x9 pixels, que se crea en cuestión de minutos como se ve en el video, es mucho más gráfico y puede ayudar a entender cuan poco son 224 bytes, y cuánto se puede extraer de ellos. el picking de colores no lo hice de memoria, o es que alguien pensó que tengo los opcodes en mi cabeza y tengo también una vista de águila que discierne valores numéricos en los colores?