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 ; jne still button: ; we have only one button, close or eax, -1 int 0x40 image: ; Рисуем пентагpамму 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ИМАHИЕ_! Здесь самое интеpесное. ; Алгоpитм гоpения. mov esi,[count1] 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 test eax, eax ; Точка чеpная? (гоpеть нечему?) jz NxtP ; если ДА - беpем следующую. sub eax,0x00040000 ; Цветом на единицу меньшим mov [esi-2*3],eax ; ставим точку слева, mov [esi],eax ; спpава, mov [320*3+esi-1*3],eax ; снизу mov [esi-0x141*3],eax ; и свеpху. NxtP: add esi,edx cmp esi,0xffff*3+my_img jbe loc_cont sub esi,0xfffe*3 loc_cont: ; Беpем следующую add edx,3 cmp edx,0x10000*3 jbe loc_cont2 sub edx,0xfffe*3 loc_cont2: ; псевдослучайную точку. ;jnz Flame ; И так 65536 pаз. 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: