Difúze by Řrřola [web]
;##***---... DIFU'ZE
;#*#*-*-.-. . a 256-byte intro by Rrrola
;##***---... rrrola@gmail.com
;#*#*-*-.-. . http://rrrola.wz.cz
; greets to all MIDI enthusiasts
org 100h ; assume ah=bx=0, dx=cs, di=sp=-2, 216kB free
;Init: set mode 13h, ds=cs+1300h es=cs+2600h fs~A000h cx=20CDh
lfs cx,[bx]
mov al,13h
int 10h
add dh,al
mov ds,dx ; urine density (u)
add dh,al
mov es,dx ; vomit density (v)
;Palette: eight gradients (six unique: vi pi cy bl br gr)
mov dx,3C8h
P imul bx,cx,-4 ; bl = 4 times {0..255}
mov al,bl
sar al,1 ; al = {0..63,-64..0}
je Q ; al==0: cycle RGB->GBR
jns R
not al
R out dx,al ; = {0..63,63..0}
mov dl,0C9h
mul bl
shr ax,7 ; {0..63,63..0} * {0..255} / 128
Q out dx,al ; = {63..48..0,0..16..63}
mul al
shr ax,6
out dx,al ; = {62..36..0,0..4..62}
loop P
;Initial densities
mov ah,18
S mov [di+37304],di
stosw ; v = constant (0.07)
loop S ; u = vertical gradient (0.57 .. 1)
;Main loop: store last pixel, load the rule
M imul dx,di,3 ; change the rule every 4096/3 frames (cycles from 15 to 0)
shld bx,si,8
sub dx,bx
mov bl,[si+1]
add dx,bx
shr dx,12 ; curtain: phase is based on the address and u
mov al,dl
;M mov al,[ss:100h] ;#KEYBOARD
; and al,0Fh
push ax ; ax = oldpixel....RULE
mov bx,G
ss xlatb ; ax = oldpixelGGGGDvDu
aam 16
ror al,2
or ax,0010000000100000b
xchg ax,cx ; cx = ..1.GGGGDu1...Dv
;Compute new (u,v) for this cell (Gray-Scott reaction-diffusion)
mov ax,[es:si] ; .ax = v
push ax
mul ax
xchg ax,dx
mul word[si] ; .bp = 3*u*v*v
imul bp,dx,3
mov ah,10 ; F = random(0.039, 0.043)
imul dx,[si],-1
mul dx
sub dx,bp ; .dx = du = F*(1-u) - 3*u*v*v
pop ax
push dx
mul cx
sub bp,dx ; .bp = dv = 3*u*v*v - G*v
pop ax ; .ax = du
push ds
push es
U pop ds
xchg ax,bp
mov bx,320 ; bx = {320,-320,2,-2} = {+y,-y,+x,-x}
xadd [si],ax ; .ax = v, v += dv
L mov dx,[si+bx]
shr dx,2
sub ax,dx
neg bx
js L
shr bx,7
jnz L ; .ax = -laplace(v) = v - v[{+y,-y,+x,-x}] / 4
sar ax,cl ; .ax = -laplace(v) * Dv
sub [si],ax ; v += laplace(v) * Dv
shr cl,6
jc U ; do the Laplace also for u,du,Du
pop cx ; cx = oldpixel....RULE
lodsw
shrd ax,cx,10 ; ax = __....RULEuuuuuu
aad 32 ; ax = ........RULuuuuu
mov ah,al
add al,ch
rcr al,1 ; even pixels = averaged odd pixels
mov [fs:si],ax
test si,si
jnz M
;Music
test di,15
; test di,7 ;#FASTER MUSIC
mov dx,331h
jnz V ; di = lkjihgfedcba0000: is it time to play a note?
mov al,3Fh ; switch the MPU-401 to UART mode
out dx,al
dec dx
mov al,0C0h
out dx,al
xchg ax,cx ; program change: instrument = {5,0..9,0..4}[rule]
dec ax
aaa
out dx,al
and ax,3
xchg ax,bp
mov al,90h ; note on (no "note off": must use sustain-less instruments)
out dx,al
mov ax,[bp+T] ; load transposition vector (4 notes, each having 4 bits)
shld cx,di,16-2 ; cx = ......hgfedcba00
; shld cx,di,16-1 ;#FASTER MUSIC
ror ax,cl ; cycle notes
aaa ;="and al,0Fh" because nibbles of ax are always < 10
imul cx,-12*16 ; ch = hgfedcba * -3 halftones: base chord = Cdim {c d# f# a}
add al,ch
and al,3Fh ; mod 64 notes = 5 1/3 octaves: cycle among Cdim, Edim, G#dim
add al,16
out dx,al
out dx,al ; loudness=note
V
; mov dl,0DAh ;#VSYNC: wait for vertical retrace end (70 fps cap)
;W in al,dx
; test al,8
; jz W
dec di ; frame count
in al,60h
dec al ; ESC test
; mov [ss:100h],al ;#KEYBOARD
jnz M
ret
;Chords (4 sets of 4 notes, two are shared between consecutive chords)
T db (11-9)+( 6-6)*16 ; F#7sus4 {c# e f# b}
db ( 4-3)+( 1+0)*16 ; Em6 {g b c# e}
db (11-9)+( 7-6)*16 ; Cmaj7 {c e g b}
db ( 4-3)+( 0+0)*16 ; C6 {g a c e}
db ( 9-9)+( 7-6)*16
;Reaction-diffusion parameter sets: G*256-32, -log(Dv), -log(Du)
G db 11*16 + 3*4 + 3 ; squares (color 000: vi-pi)
db 7*16 + 3*4 + 3 ; pulse maps (color 010: cy-bl)
db 5*16 + 1*4 + 2 ; shimmer (color 100: br-gr)
db 14*16 + 2*4 + 2 ; gliders (color 110: br-gr)
db 9*16 + 0*4 + 1 ; explosions (color 001: pi-cy)
db 9*16 + 3*4 + 3 ; islands (color 011: bl-br)
db 7*16 + 3*4 + 2 ; plasma (color 101: gr-br)
db 15*16 + 2*4 + 1 ; mitosis (color 111: gr-vi)
db 8*16 + 1*4 + 1 ; pool (color 010: cy-bl)
db 0*16 + 0*4 + 2 ; caramel (color 100: br-gr)
db 11*16 + 3*4 + 2 ; fingerprint (color 110: br-gr)
db 9*16 + 1*4 + 1 ; goo spirals (color 000: vi-pi)
db 2*16 + 0*4 + 3 ; noise fields (color 011: bl-br)
db 12*16 + 2*4 + 1 ; worms (color 101: gr-br)
db 9*16 + 2*4 + 1 ; smooth pulse (color 111: gr-vi)
db 15*16 + 1*4 + 0 ; polka dots (color 001: pi-cy)
[ back to the prod ]
