# 02 - Und ein ganzes Byte reicht nicht ... | Das Kreuz der Veränderungen

Ehre zu Ehren und Teil für Teil. So etwas tauchen wir Sie in die faszinierende Welt der Demoszene ein. Heute werden wir über spezifische Arbeiten im Bereich der Größencodierung sprechen. Tatsache ist, dass einige Veröffentlichungen nicht nur in engen Kreisen Kultstatus hatten - sie beeinflussten direkt und klar den Geist der Menschen und zwangen sie, IDA Pro zu lernen, den Code zu beobachten und bis ins kleinste Detail einzudringen. Es war einfach unverständlich und sehr interessant, wie solche Magie funktioniert.

Dies ist ein Kreuz von Queue Members Group - 128 Bytes Intro für PC aus dem fernen 1996:

Bild

Hier ist ein Video der Arbeit:



Kurz gesagt, wie die Großväter gekämpft haben ... Nach dem Erfolg von Enlight'95 in der FIDO-Konferenz DEMO.DESIGN wurde ein virtueller Wettbewerb für die Erstellung von 128-Byte-Arbeiten für den PC angekündigt. Er ging mehrere Monate, die Organisatoren sammelten die Ergebnisse, stimmten ab und bestimmten die Gewinner. Das gesamte Release-Archiv mit Demo design'96 steht auf Pouet zur Überprüfung zur Verfügung. Der Gewinner war eine Flanke von Mad Max / Queue Members Group . Die QMG- Gruppe stammt aus Samara, zu dieser Zeit waren die Jungs Studenten einer der technischen Universitäten, und Mad Max selbst war der Leiter des gesamten Teams.

Der Wettbewerb hat junge Köpfe im ganzen Land so „erschüttert“, dass die Organisatoren von Enlight'96 einen Druck von T-Shirts mit einem Cross-Dump-Ausdruck auf dem Rücken druckten. Hier einige Archivfotos:

Bild

Bild

Bild

Und ein Frame aus einem Video über Enlight'96:

Bild

Im März 2020 hat die Gruppe = R MDA = (die ich hier offiziell vertrete) erfolgreich ein Projekt zur digitalen Bewahrung dieser historischen Arbeit umgesetzt. Wir haben zunächst ein Video erstellt ... Ja, ein banales Video, das anschließend auf YouTube hochgeladen wurde. Zuvor gab es im Laufe von 25 Jahren keine Videoversion von cross , und um sie anzusehen, war das leistungsstarke DosBox-Kung-Fu erforderlich, das nicht jedem gehört.

Als nächstes haben wir alle zusätzlichen Materialien, einschließlich des Quellcodekreuzes, in einem einzigen Archiv gesammelt. Leider hat der Autor den Quellcode zu diesem Zeitpunkt nicht veröffentlicht, außerdem wurden nach seinen Worten die letzten Änderungen an der Arbeit überhaupt im HEX-Editor vorgenommen. Dementsprechend ist der folgende Quellcode unsere Umkehrung des Originals mit unseren Kommentaren:

; 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


Es ist klar, dass unser x86-Schlüsselprogrammierer beim Umkehren des Codes zur Quelle auf die Idee zur Optimierung kam. So stellte sich heraus, dass cross2 1 Byte mehr benötigt (127 statt 126), aber alles, was optimiert wurde, wurde für Text und Ton ausgegeben. Wir haben die Farbe in Grün geändert, damit Sie diese Arbeiten nicht visuell verwechseln:



Es hat keinen Sinn, das historische Erbe hier zu verspotten, nur jede Größencodierung kann über mehrere Bytes im Laufe der Zeit optimiert werden. Die Zeit verging ziemlich gut, fast 30 Jahre, und die Optimierung erwies sich als signifikant - 20 Bytes (fast 16% des Codes). Unsere Arbeit ist ein Byte länger als das Original (13 Bytes Text wurden zum Code hinzugefügt, 6 Bytes Code für die Ausgabe, 2 Bytes pro Sound = 21, minus 1 Byte Größenunterschied).

Eigentlich alles! Source cross2 befindet sich im Archiv des Pouet und kann visuell mit dem Original verglichen werden. Vielen Dank an Peter [Frosch] Sobolev und Mike [Mad Max] Shirobokov für Ratschläge und Materialien während der Entwicklung dieses Projekts.

--- EOF ---

#FF - Und ein ganzes Byte reicht nicht aus ... | Pilot)
# 00 - Das MBM ... | Einladung zur Online-Revision 2020
# 01 - IBMP ... | Was sind Intro?
# 02 - Das MBM ... | Das Kreuz der Veränderungen
# 03 - IBMP ... | 2B oder nicht 2B
# 04 - IBMP ... | Wir nehmen BC bei den Hörnern
# 05 - ICBM ... | Anime
# 06 - IBMP ... | Meteorismen

Großvaters Unterhaltungskanal im Telegramm:teleg.run/bornded

Neben dem Kanal befindet sich ein Chat. Darin können Sie versuchen, Fragen für die Demoszene, Assembler, Pixel Art, Tracker-Musik und andere Aspekte der Prozesse zu stellen. Sie können beantwortet oder an andere, thematischere Chats gesendet werden.

Also haben sie gewonnen - also gewinnen wir!

All Articles