kolibrios-gitea/programs/fire2/trunk/fire2.asm
Evgeny Grechnikov (Diamond) cb6852bc2c 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
2006-05-17 13:43:20 +00:00

220 lines
4.6 KiB
NASM
Raw Blame History

use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd mem_end
dd mem_end
dd 0x0, 0x0
;include 'lang.inc'
START:
mov edi, my_img
mov ecx, 64001*3/4+1
xor eax, eax
rep stosd
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
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 al, 2
int 0x40
cmp ah, 1Bh ;<Esc>
jne still
button:
; we have only one button, close
or eax, -1
int 0x40
image:
; <20><><EFBFBD><20><><EFBFBD>⠣p<E2A0A3><70><EFBFBD><EFBFBD>
penta:
mov edi,my_img+0x540*3
mov ebx,(320)*3
mov eax,0x00fc0000
push edi
push 0x78
pop ecx
ll_3:
call put_big_point
lea edi, [edi+ebx+6]
loop ll_3
pop edi
mov cl, 0x60
ll_4:
call put_big_point
lea edi, [edi+ebx*2+3]
loop ll_4
mov cl, 0x61
ll_5:
call put_big_point
sub edi, 2*320*3-3
loop ll_5
mov edi, my_img+0x1D4F6
push edi
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: stosd
mov [edi+ebx-4],eax
dec edi
loop ll_7
fire:
; _<>H<EFBFBD><48><EFBFBD>H<EFBFBD><48>_! <20><><EFBFBD><EFBFBD><EFBFBD><><E1A0AC> <20><><EFBFBD><EFBFBD>p<EFBFBD><EFBFBD>.
; <20><><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD> <20><>p<EFBFBD><70><EFBFBD><EFBFBD>.
mov esi,[count1]
mov edx,[count2]
mov ecx, 10000h
Flame: cmp esi,0xFA00*3+my_img ; <20><EFBFBD><E1A5A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A0A9><EFBFBD> <20><><20> <20>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>p
jae NxtP ; <20>᫨ H<><48> - <20><>p<EFBFBD><70><><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
lodsd
dec esi ; <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0> <20><><>.
; and eax,0x00ff0000
test eax, eax
; <20><><20><>p<EFBFBD><70><EFBFBD>? (<28><>p<EFBFBD><70><EFBFBD> <20><><EFBFBD>?)
jz NxtP ; <20><20><> - <20><>p<EFBFBD><70><><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
sub eax,0x00040000
; <20><><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
mov [esi-2*3],eax ; <20><EFBFBD><E2A0A2> <20><><EFBFBD><EFBFBD><EFBFBD><><E1ABA5>,
mov [esi],eax ; <20><>p<EFBFBD><70><EFBFBD>,
mov [320*3+esi-1*3],eax ; ᭨<><E1ADA8>
mov [esi-0x141*3],eax ; <20> ᢥp<E1A2A5><70>.
NxtP:
add esi,edx
cmp esi,0xffff*3+my_img
jbe loc_cont
sub esi,0xfffe*3
loc_cont:
; <20><>p<EFBFBD><70><><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add edx,3
cmp edx,0x10000*3
jbe loc_cont2
sub edx,0xfffe*3
loc_cont2:
; <20><EFBFBD><E1A5A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A0A9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
;jnz Flame ; <20> ⠪ 65536 p<><70>.
loop Flame
mov [count1],esi
mov [count2],edx
mov ebx,my_img
mov ecx,320*65536+200
mov edx,2*65536+23
push 7
pop eax
int 0x40
inc [fps]
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 my_img
count2 dd 0
curtime dd 0
fps dd 0
fire_label db 'Pentagramm in FIRE FPS:'
len00=$-fire_label
I_END:
align 16
rb 320*3
my_img rb 320*200*3
rb 320*3
; stack
align 256
rb 256
mem_end: