Wanhat kunnon metapallot asmilla 256-tavun pläjäyksenä.
Assembloiminen tapahtuu seuraavasti (MASM):
ml /AT /Cp /c /nologo metab.asm link /nologo /tiny metab.obj,metab.com,,,,
Jossa 'link' on Microsoftin® DOS-linkkeri (http://win32asm.cjb.net). Tuloksena on 258-tavun kokoinen .com-filu, josta saa 256-tavuisen kun nappaat kaksi viimeistä tavua pois (niitä ei siis tarvita).
Optimisoitu rankalla kädellä. Huomaa lisäksi, että voi pyöriä melko nopeasti nopeilla koneilla, sisältää waitsyncin puolikkaan (koko-syistä). Välkkymistä voi sitten taas esiintyä hitaammilla koneilla.. mikä lie sitten olisi optimaalinen kokoonpano.. :-) Hidastaa voi tarpeen vaatiessa Mo'Slo-ohjelmalla: http://www.hpaa.com/moslo/v132/moslo132.zip
Edit: päivitin paremman version
metab.asm
; Good old 2D-Metaballs in 256 bytes ; Coded by thefox <thefox@cracked.org> 2003 ; ; Assembles with MASM (*DOS-linker*): ; ml /AT /Cp /c /nologo metab.asm ; link /nologo /tiny metab.obj,metab.com,,,, ; ; After assembling, crop out the last two bytes to get ; it down to 256 bytes. ; ; Note: this ain't targeted towards the fastest ; machines on earth (I've a P150MHz). .model tiny, stdcall .386 .code option casemap :none org 100h BLOB_SIZE equ (offset blob1_end - offset blobs) start: push 0A000h pop es mov al, 13h int 10h xor cx, cx make_palette: mov dx, 3c8h mov al, cl out dx, al inc dx shr ax, 2 out dx, al out dx, al out dx, al loop make_palette ; slow, but small main_loop: xor di, di rend_screen: mov bx, offset blobs fldz cwd mov ax, di mov cx, 320 div cx @@: mov tmp, dx fild tmp fsub real4 ptr [bx] fmul st, st mov tmp, ax fild tmp fsub real4 ptr [bx+4] fmul st, st fadd fidivr word ptr [bx+8] fadd add bl, (BLOB_SIZE and 0FFh) test bl, bl jnz @B fcom m_0_09 fnstsw ax sahf jc @F mov al, 255 jmp put_pixel @@: fcom m_0_01 fnstsw ax sahf jc @F fimul m_2700 fist tmp mov al, byte ptr [tmp] jmp put_pixel @@: mov al, 27 put_pixel: fstp st mov [di+500h], al inc di cmp di, (320*200) jnz rend_screen mov bx, offset blobs @@: fld counter fld st fidiv word ptr [bx+10] fsin fimul blob1_s fadd real4 ptr [bx] fstp real4 ptr [bx] fidiv word ptr [bx+12] fcos fimul blobs_ca fadd real4 ptr [bx+4] fstp real4 ptr [bx+4] add bl, (BLOB_SIZE and 0FFh) test bl, bl jnz @B fld counter fadd counter_a fstp counter mov si, 500h xor di, di mov cx, (320*200)/2 rep movsw in al, 60h dec al jnz main_loop mov ax, 03h int 10h ret ; data --- m_0_09 real4 0.09 m_0_01 real4 0.01 m_2700 word 2700 counter real4 0.0 counter_a real4 0.5 blobs_ca word 3 blobs: blob1_x real4 15.0 blob1_y real4 105.0 blob1_rad word 64 blob1_s word 8 blob1_c word 9 blob1_end: blob2_x real4 15.0 blob2_y real4 105.0 blob2_rad word 33 blob2_s word 9 blob2_c word 8 blobs_end: tmp word 0 end start
make.bat
ml /AT /Cp /c /nologo metab.asm link /nologo /tiny metab.obj,metab.com,,,,
Hieno on, kun vielä ymmärtäiskin jotain Assemblerin päälle... :)
piru, toi on kyl upee.
Tästä on nyt olemassa toinenkin (parempi?) versio, katotaan jos jaksan tunkea sen tänne.
MITEN TÄTÄ VOI PELata
onko kyllä perkeleen hieno
Tosi siisti, ja vielä näin vähän koodia. C++:lla ton tekemiseen ois tarvittu 2000 riviä koodia :)
Hieno!
geohundilla on hauskaa
joo
Todella hieno ja tyylikäs! Todellinen ohjelmoinnin mestariteos!
miten joku saa noin lyhyellä koodilla noin hienoa aikaan. q basicilla ois vaikee tehdä noin hienoa!
binaryyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
tämä on taidetta kauneimmillaan. thefox on jeesus.
jätkä on mun sankari! \o/
Minulla tulee seuraava ilmoitus:
ml ei tunnistettu sisäiseksi tai ulkoiseksi komennoksi,
suoritettavaksi ohjelmaksi tai komentojonotiedostoksi.
link ei tunnistettu sisäiseksi tai ulkoiseksi komennoksi,
suoritettavaksi ohjelmaksi tai komentojonotiedostoksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.