;****************************
;Metapallot by KilledWhale
;Kääntyy fasmilla
;22.7.2009
;****************************
 
org 100h
 
mx	equ 160
my	equ 100
 
	push	word 0a000h ; Osoite ruudulle
	pop	es
 
	mov	ax, 0013h ; 320 * 200 * 256
	int	10h
 
	fninit
 
	; Paletti
	xor	al, al
	mov	dx, 03c8h ; Palettiin kirjoitus
	out	dx, al ; Läheteään luku
	inc	dx
 
	mov cx, 255
	paletti:
		mov	ax, cx
		shr	al, 2
		out	dx, al
		push	ax
		mov	al, 0
		out	dx, al
		pop	ax
		out	dx, al
		loop	paletti
 
main:
	fld	[a]
	fadd	[aadd]
	fstp	[a]
 
	mov	bx, pallot		; pallojen sijainti
	palloLoop:
		fld	dword [bx + 12] ; st0 = pallon_mod1
		fadd	[a]		; st0 = pallon_mod1 + a
		fcos			; st0 = cos(pallon_mod1 + a)
		fimul	[xx]		; st0 = cos(pallon_mod1 + a) * 100
		fiadd	dword [hsw]	; st0 = 160 + cos(pallon_mod1 + a) * 100
 
		fistp	dword [bx]	; päivitetään pallon x sijainti
 
		fld	dword [bx + 16] ; st0 = pallon_mod2
		fadd	[a]		; st0 = pallon_mod2 + a
		fsin			; st0 = cos(pallon_mod2 + a)
		fimul	[yy]		; st0 = cos(pallon_mod2 + a) * 100
		fiadd	dword [hsh]	; st0 = 160 + cos(pallon_mod2 + a) * 100  )
 
		fistp	dword [bx + 4]	; päivitetään pallon y sijainti
 
		add	bx, 20		; Seuraava pallo
 
		cmp	bx, pallot_loppu; jos kaikkia palloja ei ole käyty hypätään pallolooppiin
		jne	palloLoop
 
	xor	di, di
	mov	dx, 200
	yloop:
		mov	cx, 320
		xloop:
			xor	ax, ax
			mov	bx, pallot ; Pallojen osoite
			palloop:
				mov	[null], cx	; cx talteen muuttujaan
				fild	dword [bx]	; st0 = pallon_x
				fild	dword [null]	; st0 = ruudun_x, st1 = pallon_x
				fsubp	st1, st0	; st0 = pallon_x - ruudun_x
				fmul	st0, st0	; st0 = (pallon_x - ruudun_x) ^ 2
 
				mov	[null], dx	; dx talteen muuttujaan
				fild	dword [bx + 4]	; st0 = pallon_y, st1 = (pallonx - ruudunx) ^ 2
				fild	dword [null]	; st0 = ruudun_y, st1 = pallon_y, st2 = (pallon_x - ruudun_x) ^ 2
				fsubp	st1, st0	; st0 = pallon_y - ruudun_y, st2 = (pallon_x - ruudun_x) ^ 2
				fmul	st0, st0	; st0 = (pallon_y - ruudun_y) ^ 2
 
				faddp	st1, st0	; st0 = (pallon_x - ruudun_x) ^ 2 + (pallon_y - ruudun_y) ^ 2
				fadd	[d]		; st0 = (pallon_x - ruudun_x) ^ 2 + (pallon_y - ruudun_y) ^ 2 + 0.00001
 
				fdivr	dword [bx + 8]	; st0 = pallon_säde / ((pallon_x - ruudun_x) ^ 2 + (pallon_y - ruudun_y) ^ 2 + 0.00001)
 
				fstp	dword [null]	; tulos talteen muuttujaan
 
				add	ax, word [null] ; lisätään tulos pikseliin
 
				add	bx, 20		; seuraava pallo
				cmp	bx, pallot_loppu; jos ei oo käyty kaikkia hypätään seuraavaan
				jne palloop
 
			cmp	ax, 255
			jbe	ok
				mov ax, 255
			ok:
 
			mov	bx, ax
			mov	ax, 255
			sub	ax, bx
 
			stosb
			loop xloop
 
		dec	dx
		jnz	yloop
 
	mov	ax, 0100h
	int	16h
	jz	main
 
	mov	ax, 004ch
	int	21h
 
; *******************
; DATA
; *******************
 
a	dq	0.0
aadd	dd	0.02
 
xx	dd	120
yy	dd	70
hsw	dd	160
hsh	dd	100
d	dd	0.00001
 
pallot:
	pallo1_x	dd 100
	pallo1_y	dd 40
	pallo1_r	dd 60000
	pallo1_mod1	dd 0.5
	pallo1_mod2	dd 4.5
pallo1_loppu:
	pallo2_x	dd 100
	pallo2_y	dd 100
	pallo2_r	dd 120000
	pallo2_mod1	dd 1.5
	pallo2_mod2	dd 1.0
pallo2_loppu:
	pallo3_x	dd 100
	pallo3_y	dd 100
	pallo3_r	dd 160000
	pallo3_mod1	dd 5.85
	pallo3_mod2	dd 1.4
pallot_loppu:
	null		dw 0