Почти все мы - быдлокодеры. Чего уж там...

Jan 19, 2011 12:47

Вчера наткнулся на 128-байтную интру от TBC, взявшую первое место (в весовой категории до 256 байт) на "Function 2009" demo party. Вот как это выглядит:

image Click to view



Как человек, считающий себя каким-то боком причастным к демосцене, могу сказать, что простому смертному такое не под силу... "Не утешайте меня, мне слова не нужны" (С)


.model tiny
.486
.code
org 100h ; ax = 0000, bx = 0000, cx = 00FFh ; si = 0100h, di = 0FFFEh, bp = 09xxh start: mov al, 13h int 10h ; set 320x200 MCGA mode push 0A000h
pop es
; Здесь ничего военного - устанавливаем палитру, 256 оттенков серого
; в целях оптимизации по размеру цикл проходит много раз, и лишь
; последние 256 проходов используются "по делу"
set_pal:
mov dx, 3C8h ; PEL address register
out dx, al ; latest 256 values are 0..FF
inc dx ; PEL data register
out dx, al
out dx, al
out dx, al
inc ax
jnz set_pal
; bx = 0000, cx = 00FF, si = 0100, di = screen_address
begin: mul bx
inc ax ; dx:ax = 0000:0001
add ax, di ; ax = screen_address+1
; div by 320 :)
div word ptr [si+15h]; dx = X+127, ax = Y
mov cx, 7Fh ; Z = 127
sub dx, cx ; dx = X (-127..192)
pusha ; ax=Y, bx=0, cx=Z, dx=X, si=0100, di=FFFE, bp=09xx, sp=FFFE
; w[FFFC]=Y, w[FFFA]=Z, w[FFF8]=X, w[FFF6]=0, w[FFF4]=FFFE, w[FFF2]=bp, w[FFF0]=0100, w[FFEE]=FFFE
; Этот волшебный цикл осуществляет поворот вектора (X, Y, Z) на угол bp/256
; сперва в плоскости XZ, а затем в плоскости YZ'
mov cl, 4
rotate: mov si, 0FFF8h
fild word ptr [si-6] ; w[FFF2] = bp; st(0) = bp
fidiv word ptr [si-8] ; w[FFF0] = 0100h; φ = bp / 256
fsincos ; st(0) = cos(phi); st(1) = sin(phi)
fimul word ptr [bx+si]
xor bl, 2
fxch st(1)
fimul word ptr [bx+si]
jnz even
fchs
mov [si], ax
even: faddp st(1), st
lodsw
mov ax, [bx+si]
fistp word ptr [bx+si]
loop rotate
; теперь у нас есть повернутый вектор (X', Y', Z'')
; w[FFF8] = X' = X*cos+Z*sin; Z'=Z*cos-X*sin
; w[FFFA] = Z'' = Z'*cos-Y*sin
; w[FFFC] = Y' = Y*cos+Z'*sin

; bx = 0, cx = 0
; А здесь начинается настоящее шаманство. Проследить мысль автора
; не представляется возможным. Общая идея понятна - путем raytracing'а
; мы определяем, насколько далеко пройдет луч, пока не упрется в "губку Серпинского"
sierpinsky: mov ch, 1
outer: xor bp, bp
mov si, 0FFF8h
inner: lodsw
mul bx
add ax, [si-0Bh]
mul cx
xchg ax, dx
add al, 43
cmp al, 85
sbb bp, 0
jnp continue
or si, si
jp inner
imul cx, 3
jno outer
jmp break
continue: inc bl
jnz sierpinsky
dec bx
break: ; Чем дальше в лес, тем ярче пиксел
xchg ax, bx
shr ax, 2
stosb
popa
inc di
jnz begin

inc bp ; инкрементируем угол зрения
in al, 60h ; AT Keyboard controller 8042.
dec al ; Esc pressed?
jnz begin
retn
end start
; Вот и всё. Ещё пару байт я вижу, где можно выкинуть. Если бы взялись за дело
; ruud вместе с int-E, может, нашли бы с десяток лишних байт, но это уж точно всё :)
; Автору - мегареспект
;
Previous post Next post
Up