# 02 - Dan seluruh byte tidak cukup ... | Salib perubahan

Hormatilah kehormatan dan sebagian demi sebagian. Sesuatu seperti ini kami akan membenamkan Anda dalam dunia demoscene yang menakjubkan. Hari ini kita akan berbicara tentang pekerjaan khusus di bidang sizecoding. Faktanya adalah bahwa beberapa rilis tidak hanya memiliki status kultus dalam lingkaran sempit - mereka secara langsung dan jelas mempengaruhi pikiran orang, memaksa mereka untuk belajar IDA Pro, menonton kode, dan menembus ke semua detail terkecil. Itu benar-benar tidak dapat dipahami dan sangat menarik bagaimana sihir itu bekerja.

Ini adalah umpan silang oleh Queue Members Group - 128 byte intro untuk PC dari jarak jauh tahun 1996:

gambar

Ini adalah video hasil kerjanya:



Singkatnya, bagaimana kakek berjuang ... Setelah keberhasilan Enlight'95 dalam DIDO -konferensi FIDO. DESIGN , sebuah kontes virtual diumumkan untuk pembuatan pekerjaan 128-byte untuk PC. Dia berjalan selama beberapa bulan, panitia mengumpulkan hasilnya, memilih dan menentukan pemenang. Seluruh arsip rilis dengan Demo design'96 tersedia di Pouet untuk ditinjau. Pemenangnya adalah umpan silang dari Mad Max / Queue Members Group . Grup QMG berasal dari Samara, pada waktu itu orang-orang itu adalah mahasiswa dari salah satu universitas teknis, dan Mad Max sendiri adalah pemimpin seluruh tim.

Kontes ini begitu "mengguncang" pikiran muda di seluruh negeri sehingga panitia Enlight'96 mencetak t-shirt dengan cetakan cross-dump di punggung mereka. Berikut adalah beberapa foto arsip:

gambar

gambar

gambar

Dan bidikan dari video tentang Enlight'96:

gambar

Pada bulan Maret 2020, grup = R MDA = (yang secara resmi saya wakili di sini) berhasil mengimplementasikan proyek pelestarian digital karya bersejarah ini. Kami mulai dengan membuat video ... Ya, video dangkal, yang kemudian diunggah ke YouTube. Sebelumnya, selama 25 tahun, versi video cross tidak ada, dan untuk menontonnya diperlukan DosBox kung fu yang kuat, yang tidak dimiliki semua orang.

Selanjutnya, kami telah mengumpulkan dalam arsip tunggal semua bahan tambahan, termasuk lintas kode sumber. Sayangnya, penulis tidak mempublikasikan kode sumber pada saat itu, terlebih lagi, dari kata-katanya, perubahan terbaru pada karya dibuat sama sekali di editor HEX. Karenanya, kode sumber di bawah ini adalah kebalikan dari yang asli dengan komentar kami:

; 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


Sudah jelas bahwa dalam proses membalikkan kode ke sumber, programmer x86 utama kami mendapat ide untuk optimasi. Ini adalah bagaimana cross2 ternyata - ini membutuhkan 1 byte lebih banyak (127 bukannya 126), tetapi semua yang dioptimalkan dihabiskan untuk teks dan suara. Kami mengubah warna menjadi hijau sehingga Anda tidak secara visual membingungkan karya-karya ini:



Tidak ada gunanya mengejek warisan sejarah di sini, hanya sizecoding yang dapat dioptimalkan lebih dari beberapa byte dari waktu ke waktu. Waktu berlalu dengan sangat baik, hampir 30 tahun, dan optimasi ternyata signifikan - 20 byte (hampir 16% dari kode). Pekerjaan kami adalah satu byte lebih lama dari aslinya (13 byte teks ditambahkan ke kode, 6 byte kode untuk output, 2 byte per suara = 21, dikurangi perbedaan ukuran 1 byte).

Sebenarnya semuanya! Sumber cross2 dapat ditemukan dalam arsip di Pouet dan bandingkan secara visual dengan aslinya. Terima kasih banyak kepada Peter [katak] Sobolev dan Mike [Mad Max] Shirobokov untuk saran dan bahan selama pengembangan proyek ini.

--- EOF ---

#FF - Dan seluruh byte tidak cukup ... | Pilot)
# 00 - MBM ... | Undangan ke Revision Online 2020
# 01 - IBMP ... | Apa itu intro?
# 02 - MBM ... | Salib Perubahan
# 03 - IBMP ... | 2B atau tidak 2B
# 04 - IBMP ... | Kami mengambil BC dengan klakson
# 05 - ICBM ... | Anime
# 06 - IBMP ... |

Saluran Hiburan Meteorisme Kakek di Telegram:teleg.run/bornded

Ada obrolan di sebelah saluran. Di dalamnya, Anda dapat mencoba mengajukan pertanyaan untuk demoscene, assembler, pixel art, musik pelacak dan aspek lain dari proses. Anda dapat dijawab atau dikirim ke obrolan lain yang lebih bertema.

Jadi mereka menang - jadi kami menang!

All Articles