Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: 2D Metaballs

Sivun loppuun

thefox [03.05.2003 20:40:02]

#

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,,,,

Teme [04.05.2003 10:41:01]

#

Hieno on, kun vielä ymmärtäiskin jotain Assemblerin päälle... :)

muhis [04.05.2003 11:55:15]

#

piru, toi on kyl upee.

thefox [05.05.2003 09:52:50]

#

Tästä on nyt olemassa toinenkin (parempi?) versio, katotaan jos jaksan tunkea sen tänne.

GeoHound [05.05.2003 18:48:45]

#

MITEN TÄTÄ VOI PELata

snakari [05.05.2003 20:25:57]

#

onko kyllä perkeleen hieno

constans [08.05.2003 22:04:25]

#

Tosi siisti, ja vielä näin vähän koodia. C++:lla ton tekemiseen ois tarvittu 2000 riviä koodia :)

tejeez [06.08.2003 16:28:13]

#

Hieno!

Gwaur [30.08.2003 23:54:33]

#

geohundilla on hauskaa

BlueByte [25.08.2004 16:53:25]

#

joo

mankeli [07.01.2005 17:56:47]

#

Todella hieno ja tyylikäs! Todellinen ohjelmoinnin mestariteos!

koodi mies [07.01.2005 18:08:38]

#

miten joku saa noin lyhyellä koodilla noin hienoa aikaan. q basicilla ois vaikee tehdä noin hienoa!

moptim [16.09.2006 20:35:03]

#

binaryyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

Puusilmä Ado [27.10.2007 20:05:19]

#

tämä on taidetta kauneimmillaan. thefox on jeesus.

jätkä on mun sankari! \o/

nörtti [14.11.2007 18:35:20]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta