#02-整个字节还不够... | 变化的十字架

以荣誉和部分荣誉来表达荣誉。像这样的事情,我们会让您沉浸在迷人的恶魔世界中。今天,我们将讨论大小编码领域的具体工作。事实是,某些发行版不仅在狭窄的圈子中具有崇拜地位 -它们直接且明显地影响了人们的思想,迫使他们学习IDA Pro,观看代码并深入所有最小的细节。这种魔术是如何工作的,简直是难以理解,也很有趣。

这是一个交叉队列成员组 -从遥远的1996 128字节介绍用于PC:

图片

这里是工作的视频:



简而言之,祖父的战斗方式...在FIDO会议DEMO.DESIGN中成功实现Enlight'95之后,宣布了一场虚拟竞赛,旨在为PC创建128字节的作品。他走了几个月,组织者收集了结果,投票并确定了获奖者。与整个版本的存档演示design'96可以用Pouet审查。获胜者是一个疯狂的麦克斯/队列成员组QMG小组来自萨马拉(Samara),当时这些家伙是其中一所技术大学的学生,而Mad Max本人则是整个团队的负责人。

这场比赛震惊了全国各地的年轻人,以至于Enlight'96的组织者印制了T恤版本,背面印有交叉转储打印输出。以下是一些存档照片:

图片

图片

图片

有关Enlight'96 视频的快照:

图片

2020年3月,小组= R MDA =(我在这里正式代表)成功实施了一个数字保存此历史著作的项目。我们首先创建了一个视频...是的,一个普通的视频,随后被上传到YouTube。以前,在25年的过程中,没有Cross的视频版本,要观看它,需要功能强大的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个字节),但是所有优化的内容都花在了文本和声音上。我们将颜色更改为绿色,以便您不会在视觉上混淆以下作品:



在这里嘲弄历史遗产没有任何目的,只是随时间推移,可以在几个字节上优化任何sizecoding。时间过去了将近30年,而且效果非常好,而且优化非常重要-20字节(几乎占代码的16%)。我们的工作比原始文件长了一个字节(在代码中添加了13个字节的文本,在输出中添加了6个字节的代码,每个声音2个字节= 21,大小相差减去1个字节)。

其实一切!可以在Pouet的档案中找到cross2然后将其与原始图像进行直观比较。非常感谢Peter [frog] SobolevMike [Mad Max] Shirobokov在该项目的开发过程中提供的建议和材料。

--- EOF --- #

FF-而且整个字节还不够... |飞行员)
#00-MBM ... | 邀请参加在线修订版2020
#01-IBMP ... | 什么是简介?
#02-MBM ... | 变化的十字架
#03-IBMP ... | 2B还是不2B
#04-IBMP ... | 我们以BC号角
#05-ICBM ... | 动漫
#06-IBMP ... | 电报

祖父的娱乐频道:teleg.run/bornded

频道旁有个聊天室。在其中,您可以尝试对演示场景,汇编器,像素图,跟踪器音乐和其他过程方面提出问题。您可以被回答或发送给其他更具主题的聊天。

他们赢了-我们赢了!

All Articles