# 02 - Y un byte completo no es suficiente ... | La cruz de los cambios.

Honor en honor y parte por parte. Algo así te sumergiremos en el fascinante mundo del demoscene. Hoy hablaremos sobre el trabajo específico en el campo de la codificación por tamaño. El hecho es que algunos lanzamientos no solo tenían un estado de culto en círculos estrechos, sino que influyeron directa y claramente en las mentes de las personas, obligándolos a aprender IDA Pro, ver el código y penetrar en todos los detalles más pequeños. Era simplemente incomprensible y muy interesante cómo funciona esa magia.

Este es un cruce de Queue Members Group : introducción de 128 bytes para PC desde el lejano 1996:

imagen

Aquí hay un video del trabajo:



En pocas palabras, cómo lucharon los abuelos ... Después del éxito de Enlight'95 en la DEMO.DESIGN de la conferencia FIDO , se anunció un concurso virtual para la creación de trabajo de 128 bytes para PC. Caminó durante varios meses, los organizadores recogieron los resultados, votaron y determinaron los ganadores. El archivo de lanzamiento completo con Demo design'96 está disponible en Pouet para su revisión. El ganador fue un cruce de Mad Max / Queue Members Group . El grupo QMG es de Samara, en ese momento los chicos eran estudiantes de una de las universidades técnicas, y el propio Mad Max era el líder de todo el equipo.

El concurso “sacudió” a las mentes jóvenes de todo el país que los organizadores de Enlight'96 imprimieron una impresión de camisetas con una impresión de volcado cruzado en sus espaldas. Aquí hay algunas fotos de archivo:

imagen

imagen

imagen

Y una foto de un video sobre Enlight'96:

imagen

en marzo de 2020, el grupo = R MDA = (que oficialmente represento aquí) implementó con éxito un proyecto para la preservación digital de este trabajo histórico. Comenzamos creando un video ... Sí, un video banal, que posteriormente se subió a YouTube. Anteriormente, en el transcurso de 25 años, la versión de video de cross no existía, y para verla se requería el poderoso DosBox kung fu, que no todos poseen.

A continuación, hemos recopilado en un único archivo todos los materiales adicionales, incluido el código fuente cruzado. Desafortunadamente, el autor no publicó el código fuente en ese momento, además, según sus palabras, los últimos cambios en el trabajo se realizaron en el editor HEX. En consecuencia, el código fuente a continuación es nuestro reverso del original con nuestros comentarios:

; NASM or FASM

        org 100h

        mov bx,es
        add bh,10h              ; bx = cs + 1000h
        mov es,bx               ; es = segment behind 64k of our code (extra video buffer)
        mov ds,bx               ; ds = es

        xor ax,ax
        mov cx,ax
        dec cx                  ; cx = -1
        rep stosb               ; clear extra video buffer
        dec ax                  ; ax = -1
        mov di,0A2D0h           ; set pointer to pixel at 130,80 (col,row)
        mov cl,80
        rep stosw               ; fill 80*2 = 160 pixels by 0FFh color (draw horizontal line)

        mov bx,19A0h            ; set pointer to pixel at 20,160 (col,row)
v:      mov [bx],ax             ; draw vertical line...
        add bx,320
        ja v                    ; ...until bottom

        mov ax,13h
        int 10h                 ; set 320x200 (256 colors) graphical video mode

        mov dx,3C8h
        xor al,al
        out dx,al               ; start palette set from 0 color
        inc dx
        mov cx,0C0h*3
        rep outsb               ; set first 0C0h (192) colors to black
p:
        out dx,al               ; red component
        outsb                   ; green = 0
        outsb                   ; blue = 0
        inc ax                  ; increase color (1, 2, 3..63)
        cmp al,64
        jb p                    ; set colors 0C0h..0FFh to red gradient (from dark to saturated)

        mov ch,0A0h
        mov ds,cx               ; ds = 0A000h = vedeo segment

l:      ; bx = pixel pointer, dx = pixel pointer delta value (initial values doesn't matter)
        cmp bh,0FAh
        jae s                   ; jump if current pixel is out of screen
        mov al,[bx]             ; else get color of pixel
        cmp al,0C0h
        jb s                    ; jump if pixel color is out of red gradient range (0C0h..0FFh)

        ; flame effect
        dec ax                  ; else decrase color by 1 (make it darker)
        mov [bx+1],al
        mov [bx-1],al
        mov [bx+320],al         ; di = 320
        mov [bx-320],al         ; and fill pixels around the current by new color

        mov si,-640             ; position delta: 2 lines up
        test dh,80h
        jnz n                   ; jump if dx is negative (poor pseudorandom boolean check)
        add si,2                ; wind effect
n:      mov [bx+si],al          ; add pixel 2 lines higher than current pixel considering possible wind
s:
        ; restore cross
        mov al,[es:bx]          ; get color from extra video buffer
        or [bx],al              ; replace pixel on screen by 0FFh is al = 0FFh (slow cross redraw)
        add bx,dx               ; increase pixel pointer by (pseudorandom) delta value
        inc dx                  ; increase delta value

        or bx,bx
        jnz l                   ; loop until full screen will be processed

        in al,60h               ; read keyboard scan code
        cmp al,1
        jnz l                   ; repeat if Esc key is not pressed

        mov al,3
        int 10h                 ; set text video mode

        ret                     ; return to DOS


Está claro que en el proceso de invertir el código a la fuente, nuestro programador clave x86 tuvo la idea de la optimización. Así es como resultó cross2 : se necesita 1 byte más (127 en lugar de 126), pero todo lo que se ha optimizado se gasta en texto y sonido. Cambiamos el color a verde para que no confunda visualmente estos trabajos:



No hay ningún propósito en burlarse del patrimonio histórico aquí, cualquier código de tamaño puede optimizarse en varios bytes a lo largo del tiempo. El tiempo pasó bastante bien, casi 30 años, y la optimización resultó ser significativa: 20 bytes (casi el 16% del código). Nuestro trabajo es un byte más largo que el original (se agregaron 13 bytes de texto al código, 6 bytes de código para la salida, 2 bytes por sonido = 21, menos 1 byte de diferencia de tamaño).

En realidad todo! Source cross2 se puede encontrar en el archivo en Pouet y compararlo visualmente con el original. Muchas gracias a Peter [rana] Sobolev y Mike [Mad Max] Shirobokov por sus consejos y materiales durante el desarrollo de este proyecto.

--- EOF ---

#FF - Y un byte completo no es suficiente ... | Piloto)
# 00 - El MBM ... | Invitación a revisión en línea 2020
# 01 - IBMP ... | ¿Qué son las intro?
# 02 - El MBM ... | La Cruz de los Cambios
# 03 - IBMP ... | 2B o no 2B
# 04 - IBMP ... | Tomamos BC por los cuernos
# 05 - ICBM ... | Anime
# 06 - IBMP ... | Meteorismos

Canal de entretenimiento del abuelo en Telegram:teleg.run/bornded

Hay un chat al lado del canal. En él, puede intentar plantear preguntas para el demoscene, ensamblador, pixel art, música de seguimiento y otros aspectos de los procesos. Puede ser respondido o enviado a otros chats más temáticos.

Entonces ganaron, ¡así ganamos nosotros!

All Articles