# 02 - والبايت كله لا يكفي ... | صليب التغييرات

شرف على شرف وجزء. شيء من هذا القبيل سوف نغمرك في عالم demoscene الرائع. سنتحدث اليوم عن عمل محدد في مجال التشفير. والحقيقة هي أن بعض الإصدارات لم يكن لها حالة عبادة في الدوائر الضيقة فحسب - بل أثرت بشكل مباشر وواضح على عقول الناس ، مما أجبرهم على تعلم IDA Pro ، ومشاهدة الكود ، واختراق جميع التفاصيل الصغيرة. كان من غير المفهوم ببساطة ومثير للاهتمام للغاية كيف يعمل هذا السحر.

هذا صليب من قبل مجموعة أعضاء قائمة الانتظار - مقدمة 128 بايت للكمبيوتر الشخصي من عام 1996 البعيد:

صورة

إليك مقطع فيديو للعمل:



باختصار ، كيف حارب الأجداد ... بعد نجاح Enlight'95 في مؤتمر FIDO DEMO.DESIGN ، تم الإعلان عن مسابقة افتراضية لإنشاء عمل 128 بايت للكمبيوتر الشخصي. مشى لعدة أشهر ، وجمع المنظمون النتائج وصوتوا وحددوا الفائزين. أرشيف الإصدار الكامل مع Demo design'96 متاح على Pouet للمراجعة. الفائز كان صليب من Mad Max / Queue Members Group . مجموعة QMG من سمارة ، في ذلك الوقت كان الرجال طلابًا في إحدى الجامعات التقنية ، وكان Mad Max نفسه قائد الفريق بأكمله.

المسابقة "هزت" عقول الشباب في جميع أنحاء البلاد لدرجة أن منظمي Enlight'96 طبعوا طبعة من القمصان مع مطبوعات متقاطعة على ظهورهم. فيما يلي بعض صور الأرشيف:

صورة

صورة

صورة

وإطار من فيديو حول Enlight'96:

صورة

في مارس 2020 ، نجحت المجموعة = R MDA = (التي أمثلها هنا رسميًا) في تنفيذ مشروع للحفظ الرقمي لهذا العمل التاريخي. بدأنا بإنشاء فيديو ... نعم ، فيديو عادي ، تم تحميله لاحقًا على YouTube. في السابق ، على مدار 25 عامًا ، لم تكن هناك نسخة فيديو من Cross ، ولمشاهدتها تتطلب kung fu DosBox قوية ، والتي لا يمتلكها الجميع.

بعد ذلك ، جمعنا في أرشيف واحد جميع المواد الإضافية ، بما في ذلك تقاطع شفرة المصدر. لسوء الحظ ، لم ينشر المؤلف شفرة المصدر في ذلك الوقت ، علاوة على ذلك ، من كلماته ، تم إجراء أحدث التغييرات على العمل على الإطلاق في محرر HEX. وفقًا لذلك ، فإن شفرة المصدر أدناه هي عكس النسخة الأصلية مع تعليقاتنا:

; 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


من الواضح أنه في عملية عكس الشفرة إلى المصدر ، حصل مبرمج x86 الرئيسي لدينا على فكرة التحسين. هذه هي الطريقة التي ظهر بها cross2 - يستغرق 1 بايت أكثر (127 بدلاً من 126) ، ولكن كل شيء تم تحسينه تم إنفاقه على النص والصوت. قمنا بتغيير اللون إلى اللون الأخضر حتى لا تخلط بصريًا بين هذه الأعمال:



لا يوجد هدف في السخرية من التراث التاريخي هنا ، يمكن فقط تحسين أي ترميز كبير على عدة بايت مع مرور الوقت. مر الوقت بشكل جيد ، ما يقرب من 30 عامًا ، وتبين أن التحسين مهم - 20 بايت (ما يقرب من 16 ٪ من الرمز). عملنا أطول بايت واحد من الأصلي (تمت إضافة 13 بايت من النص إلى الكود ، 6 بايت من الكود للإخراج ، 2 بايت لكل صوت = 21 ، ناقص 1 بايت في اختلاف الحجم).

في الواقع كل شيء! يمكن العثور على مصدر cross2 المصدر في الأرشيف في Pouet ومقارنته بصريًا بالأصل. شكرا جزيلا ل بيتر [ضفدع] سوبوليف و مايك [ماكس المجنون] Shirobokov للحصول على المشورة والمواد خلال تطوير هذا المشروع.

--- EOF ---

#FF - والبايت كله لا يكفي ... | طيار)
# 00 - MBM ... | دعوة للمراجعة عبر الإنترنت 2020
# 01 - IBMP ... | ما هي المقدمة؟
# 02 - MBM ... | صليب التغييرات
# 03 - IBMP ... | 2B أم لا 2B
# 04 - IBMP ... | نأخذ BC من الأبواق
# 05 - ICBM ... | أنمي
# 06 - IBMP ... |

قناة الترفيه عن الأرصاد الجوية في Telegram:teleg.run/bornded

هناك محادثة بجانب القناة. في ذلك ، يمكنك محاولة طرح أسئلة عن demoscene ، المجمع ، فن البكسل ، موسيقى المقتفي والجوانب الأخرى للعمليات. يمكن الرد عليك أو إرسالها إلى محادثات أخرى أكثر موضوعية.

لذا فازوا - لذا فزنا!

All Articles