Демка Gespensterwald умещается в 62 байта кода языка ассемблера x86

от автора

В начале октября 2020 года программист-энтузиаст HellMood из группы DESiRE выпустил демку для MS-DOS/FreeDos под названием Gespensterwald. Программа размером в 62 байта написана на ассемблере. Демка сейчас занимает первое место в соревновании разработчиков Inércia Demoparty 2020 Combined Tiny Intro.

Автор демо постарался показать в нескольких строчках кода в 3D анимации угрюмый и жуткий лес, около которого он живет. HellMood добавил в демо необычное гудение, которое иногда возникает в этом реальном лесу.

Gespensterwald Nienhagen — это небольшой старый лес Нинхаген в Германии на побережье Балтийского моря (между Хайлигендаммом и Варнемюнде). У него причудливые деревья, которые выглядят зловеще. Когда идет дождь или лес окружает туман, создается впечатление, будто в нем происходит что-то мистическое. Лесополоса занимает площадь протяженностью 1,25 км и около 100 метров. В лесу растут 130-летние дубы, буки, грабы и ясени.

Код демки Gespensterwald.

        DB      60              ; 1st run piano, then french horn         DB      0x9B, 25, 114   ; play note 25 with volume 114         NOP                     ; align executable music data         MOV     AL, 13h         ; set graphic mode         INT     10h             ; 320x200 pixels, 256 colors Y:      MOV     CL, 62          ; 62 = length of this code         PUSH    SI              ; save pointer to music data         MOV     DX, 0x330       ; MIDI port (requires UART)         REP     OUTSB           ; send code as data to MIDI port         POP     SI              ; restore pointer to music data         PUSH    0xA000          ; set ES to start of visible screen         POP     ES              ; 2 extra bytes to work everywhere X:      MOV     BL, 126         ; Depth D, start at ~0 (signed) L:      INC     BX              ; D++, advance ray         MOV     AX, 0xCCCD      ; Rrrola trick, convert screen         MUL     DI              ; ... pointer DI to Y,X in DH, DL         MOV     AL, DH          ; get Y in AL         ADD     AL, 92          ; center forest in the middle         IMUL    BL              ; Y' projection, result in AH         XCHG    AX, DX          ; save Y' in DH, get X in AL         MUL     BL              ; X' projection, result in AH         ADD     AX, BP          ; X'' = X' + T (high byte of BP)         OR      AH, BL          ; sierpinski pyramid formula         AND     AH, DH          ; H = ( X'' | D ) & Y'         JNZ     L               ; if not hit, continue ray         XCHG    BX, AX          ; get number of steps in AL         INC     AX              ; map number of steps ...         SHR     AL, 3           ; .. to black white scale         STOSB                   ; write pixel value and advance         IMUL    DI, BYTE 85     ; antiflicker, rough look         LOOP    X               ; frame loop (65536 pixels)         ADD     BP, SI          ; T++, high byte of BP (SI=100h)         JMP     SHORT Y         ; repeat, also change instrument... 

Вариант демки Gespensterwald без звука занимает 44 байта.

mov al,13h int 0x10 push 0xa000 pop es pop ds X: mov bl,126 L: inc bx mov ax,0xcccd mul di mov al,dh add al,92 imul bl xchg ax,dx mul bl add ah,[0x46c] or ah,bl and ah,dh jnz L xchg bx,ax inc ax shr al,3 stosb jmp short X 

См. также:


ссылка на оригинал статьи https://habr.com/ru/articles/522104/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *