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
This commit is contained in:
Evgeny Grechnikov (Diamond) 2006-05-17 13:43:20 +00:00
parent 65a732dc5a
commit cb6852bc2c
1 changed files with 156 additions and 183 deletions

View File

@ -5,181 +5,162 @@ use32
dd 0x01
dd START
dd I_END
dd 0x100000
dd 0x7fff0
dd mem_end
dd mem_end
dd 0x0, 0x0
include 'lang.inc'
;include 'lang.inc'
START:
call draw_window
mov edi,my_img
mov ecx,64001*3/4
xor eax,eax
mov edi, my_img
mov ecx, 64001*3/4+1
xor eax, eax
rep stosd
mov esi,my_img
mov [count1],esi
mov eax,3
mov al, 3
int 0x40
mov [curtime], eax
red:
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
mov [curtime],eax
still:
mov eax,11
push 11
pop eax
int 0x40
cmp eax,1
je red
cmp eax,2
je key
cmp eax,3
je button
dec eax
jz red
dec eax
jz key
dec eax
jz button
call image
mov eax,3
push 3
pop eax
int 0x40
mov ebx,[curtime]
cmp eax,ebx
cmp eax, [curtime]
jz still
mov [curtime],eax
call print_fps
jmp still
red:
call draw_window
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
mov al, 2
int 0x40
cmp ah,1
cmp ah, 1Bh ;<Esc>
jne still
mov eax,0xffffffff
int 0x40
jmp still
button:
mov eax,17
; we have only one button, close
or eax, -1
int 0x40
cmp ah,1
jne still
mov eax,-1
int 0x40
retn
image:
;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:
; <20>¨á㥬 ¯¥­â £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
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 ecx, 10000h
Flame: cmp esi,0xFA00*3+my_img ; <20>ᥢ¤®á«ãç ©­ ï â®çª  ¢ ¯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
@ -198,49 +179,41 @@ loc_cont2:
loop Flame
mov [count1],esi
mov [count2],edx
retn
image:
call penta
call fire
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:
align 16
rb 320*3
my_img rb 320*200*3
rb 320*3
; stack
align 256
rb 256
mem_end: