From cb6852bc2c738672817f2f46791b9f06f09d01aa Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Wed, 17 May 2006 13:43:20 +0000 Subject: [PATCH] Optimized FIRE2 program: code size 684->511, now it fits in one sector; memory requirements 1Mb -> 200Kb. git-svn-id: svn://kolibrios.org@80 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/fire2/trunk/fire2.asm | 339 +++++++++++++++------------------ 1 file changed, 156 insertions(+), 183 deletions(-) diff --git a/programs/fire2/trunk/fire2.asm b/programs/fire2/trunk/fire2.asm index f1ba1a2dc..2795a6ab1 100644 --- a/programs/fire2/trunk/fire2.asm +++ b/programs/fire2/trunk/fire2.asm @@ -1,185 +1,166 @@ use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd START - dd I_END - dd 0x100000 - dd 0x7fff0 - dd 0x0, 0x0 + org 0x0 -include 'lang.inc' + db 'MENUET01' + dd 0x01 + dd START + dd I_END + dd mem_end + dd mem_end + dd 0x0, 0x0 + +;include 'lang.inc' START: - - call draw_window - - mov edi,my_img - mov ecx,64001*3/4 - xor eax,eax - rep stosd - - mov esi,my_img - mov [count1],esi - - mov eax,3 - int 0x40 - mov [curtime],eax - -still: - - mov eax,11 - int 0x40 - - cmp eax,1 - je red - cmp eax,2 - je key - cmp eax,3 - je button - call image - mov eax,3 - int 0x40 - mov ebx,[curtime] - cmp eax,ebx - jz still - mov [curtime],eax - call print_fps - jmp still - + + mov edi, my_img + mov ecx, 64001*3/4+1 + xor eax, eax + rep stosd + + mov al, 3 + int 0x40 + mov [curtime], eax + red: - call draw_window - jmp still - + push 12 + pop eax + push 1 + pop ebx + int 0x40 + + xor eax, eax + mov ebx, 200*65536+325 + mov ecx, 150*65536+225 + xor edx, edx + xor esi, esi + mov edi, 0x00100000 + int 0x40 + + mov al, 8 + mov ebx, (325-19)*65536+12 + mov ecx, 5*65536+12 + inc edx + mov esi, 0x00400000 + int 0x40 + + mov al, 4 + mov ebx, 8*65536+8 + mov ecx, 0x00FFFFFF;0x00402020 + mov edx, fire_label + push len00 + pop esi + int 0x40 + + mov al, 12 + push 2 + pop ebx + int 0x40 + +still: + + push 11 + pop eax + int 0x40 + + dec eax + jz red + dec eax + jz key + dec eax + jz button + + call image + push 3 + pop eax + int 0x40 + cmp eax, [curtime] + jz still + mov [curtime], eax +print_fps: + push 13 + pop eax + mov ebx, (8+27*6)*65536+18 + mov ecx, 8*65536+8 + xor edx, edx + int 0x40 + lea edx, [ebx-10] + mov al, 47 + mov ebx, 30000h + xor ecx, ecx + xchg ecx, [fps] + mov esi, 0x00FFFFFF ;0x00400000 + int 0x40 + jmp still + key: - mov eax,2 - int 0x40 - cmp ah,1 - jne still - mov eax,0xffffffff - int 0x40 - jmp still - + mov al, 2 + int 0x40 + cmp ah, 1Bh ; + jne still button: - mov eax,17 - int 0x40 - - cmp ah,1 - jne still - mov eax,-1 - int 0x40 - retn - -;Window - -draw_window: - - mov eax,12 - mov ebx,1 - int 0x40 - - mov eax,0 - mov ebx,200*65536+325 - mov ecx,150*65536+225 - mov edx,0x00000000 - mov esi,edx - mov edi,0x00100000 - int 0x40 - - mov eax,4 - mov ebx,8*65536+8 - mov ecx,0x00402020 - mov edx,fire_label - mov esi,len00 - int 0x40 - - mov eax,8 - mov ebx,(325-19)*65536+12 - mov ecx,5*65536+12 - mov edx,1 - mov esi,0x00400000 - int 0x40 - - mov eax,12 - mov ebx,2 - int 0x40 - - retn - -penta: +; we have only one button, close + or eax, -1 + int 0x40 + +image: + ; Рисуем пентагpамму - - mov edi,my_img +penta: + mov edi,my_img+0x540*3 mov ebx,(320)*3 -DrawP: mov eax,0x00fc0000 - add edi,0x540*3 + mov eax,0x00fc0000 push edi - mov ecx,0x78 -ll_3: mov [edi],eax - mov [edi+3],eax - mov [edi-3],eax - mov [edi+ebx],eax - add edi,6 - add edi,ebx - loop ll_3 + push 0x78 + pop ecx +ll_3: + call put_big_point + lea edi, [edi+ebx+6] + loop ll_3 pop edi - mov ecx,0x60 -ll_4: mov [ebx+edi],eax - mov [edi],eax - mov [edi+3],eax - mov [edi-3],eax - add edi,3 - add edi,ebx - add edi,ebx + mov cl, 0x60 +ll_4: + call put_big_point + lea edi, [edi+ebx*2+3] loop ll_4 - mov ecx,0x61 -ll_5: mov [ebx+edi],eax - mov [edi],eax - mov [edi+3],eax - mov [edi-3],eax - add edi,3 - sub edi,ebx - sub edi,ebx + mov cl, 0x61 +ll_5: + call put_big_point + sub edi, 2*320*3-3 loop ll_5 - add edi,0x98D1*3 + mov edi, my_img+0x1D4F6 push edi - mov ecx,0x78 -ll_6: mov [edi],eax - mov [edi+ebx],eax - mov [edi+3],eax - mov [edi-3],eax + mov cl, 0x78 +ll_6: + call put_big_point add edi,6 sub edi,ebx loop ll_6 pop edi mov ecx,0x8F*2 -ll_7: mov [edi],eax - mov [edi+ebx],eax - add edi,3 +ll_7: stosd + mov [edi+ebx-4],eax + dec edi loop ll_7 - - retn - - + fire: ; _ВHИМАHИЕ_! Здесь самое интеpесное. ; Алгоpитм гоpения. mov esi,[count1] - mov edx,[count2] - mov ebx,320*3 - mov ecx,0xffff + mov edx,[count2] + mov ecx, 10000h Flame: cmp esi,0xFA00*3+my_img ; Псевдослучайная точка в пpедалах экp jae NxtP ; если HЕТ - беpем следующую. lodsd dec esi ; Считываем ее цвет. - and eax,0x00ff0000 +; and eax,0x00ff0000 + test eax, eax ; Точка чеpная? (гоpеть нечему?) jz NxtP ; если ДА - беpем следующую. sub eax,0x00040000 ; Цветом на единицу меньшим mov [esi-2*3],eax ; ставим точку слева, mov [esi],eax ; спpава, - mov [ebx+esi-1*3],eax ; снизу + mov [320*3+esi-1*3],eax ; снизу mov [esi-0x141*3],eax ; и свеpху. NxtP: add esi,edx @@ -187,7 +168,7 @@ NxtP: jbe loc_cont sub esi,0xfffe*3 loc_cont: - ; Беpем следующую + ; Беpем следующую add edx,3 cmp edx,0x10000*3 jbe loc_cont2 @@ -197,50 +178,42 @@ loc_cont2: ;jnz Flame ; И так 65536 pаз. loop Flame mov [count1],esi - mov [count2],edx - retn - -image: - call penta - call fire - + mov [count2],edx + mov ebx,my_img mov ecx,320*65536+200 mov edx,2*65536+23 - mov eax,7 + push 7 + pop eax int 0x40 - + inc [fps] retn - -print_fps: - mov eax,13 - mov ebx,(8+27*6)*65536+18 - mov ecx,8*65536+8 - mov edx,0x00000000 - int 0x40 - mov eax,47 - xor ebx,ebx - mov bx,3 - shl ebx,16 - mov ecx,[fps] - mov edx,(8+27*6)*65536+8 - mov esi,0x00400000 - int 0x40 - xor eax,eax - mov [fps],eax - retn - + +put_big_point: + mov [edi], eax + mov [edi+3], eax + mov [edi-3], eax + mov [edi+ebx], eax + ret + ;DATA +align 4 -count1 dd 0 +count1 dd my_img count2 dd 0 curtime dd 0 fps dd 0 fire_label db 'Pentagramm in FIRE FPS:' len00=$-fire_label - org 320*3*2 -my_img: - I_END: - \ No newline at end of file + +align 16 + rb 320*3 +my_img rb 320*200*3 + rb 320*3 + +; stack + align 256 + rb 256 +mem_end: