;#___________________________________________________________________________________________________
;****************************************************************************************************|
; Program Palitra (c) Sergei Steshin (Akyltist) |
;----------------------------------------------------------------------------------------------------|
;; compiler: FASM 1.69.31 |
;; version: 0.3.0 |
;; last update: 08/11/2012 |
;; e-mail: dr.steshin@gmail.com |
;.....................................................................................................
;; History: |
;; 0.1.0 - Ïåðâàÿ âåðñèÿ ïðîãðàììû. |
;; 0.2.0 - Èñïðàâëåíî ïîïàäàíèå â ñåòêó, áåðåòñÿ áëèæàéøèé ïî äèàãîíàëè ïèêñåëü. |
;; - Äîáàâëåíû ïîëçóíêè, äëÿ ðåãóëèðîâàíèÿ rgb ñîñòàâëÿþùèõ öâåòà è âûâîä ýòèõ ñîñòàâëÿþùèõ. |
;; - Óáðàí âûâîä öâåòà â áèíàðíîì âèäå (ïîêà çà íå íàäîáíîñòüþ è íå àêòóàëüíîñòüþ). |
;; - Ìåëêàÿ êîñìåòèêà. |
;; 0.3.0 - Äîáàâëåíî ïåðåêëþ÷åíèå âèäîâ öâåòîâûõ ñõåì (êíîïêà NEXT) |
;; - Óëó÷øåíû ïîëçóíêè, ïðîèçâîäèòñÿ îáðàáîòêà íàæàòèÿ ðÿäîì ñ ïîëçóíêîì. |
;; - ×èñëî ñåòîê â öâåòîâîé ñõåìå óìåíüøåíî ñ 6 äî 4 (êðàòíîñòü 256, èíà÷å äóáëèðîâàíèå öâåòà).|
;; - Ìåëêàÿ êîñìåòèêà. |
;.....................................................................................................
;; All rights reserved. |
;; |
;; Redistribution and use in source and binary forms, with or without modification, are permitted |
;; provided that the following conditions are met: |
;; * Redistributions of source code must retain the above copyright notice, this list of |
;; conditions and the following disclaimer. |
;; * Redistributions in binary form must reproduce the above copyright notice, this list of |
;; conditions and the following disclaimer in the documentation and/or other materials |
;; provided with the distribution. |
;; * Neither the name of the <organization> nor the names of its contributors may be used to |
;; endorse or promote products derived from this software without specific prior written |
;; permission. |
;; |
;; THIS SOFTWARE IS PROVIDED BY Sergei Steshin ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY DIRECT, |
;; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
;....................................................................................................|
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; ÇÀÃÎËÎÂÎÊ ÈÑÏÎËÍßÅÌÎÃÎ ÔÀÉËÀ ÏÐÈËÎÆÅÍÈß ÄËß ÊÎËÈÁÐÈ ÎÑ |
;----------------------------------------------------------------------------------------------------/
use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x1000
dd 0x1000
dd 0x0
dd 0x0
include '../../../macros.inc'
START:
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; ÎÑÍÎÂÍÎÉ ÖÈÊË ÏÐÎÃÐÀÌÌÛ - ÎÁÐÀÁÎÒÊÀ ÑÎÁÛÒÈÉ |
;----------------------------------------------------------------------------------------------------/
red:
call draw_window ; âûçûâàåì ïåðåðèñîâêó îêíà ïðèëîæåíèÿ
still:
mcall 10 ; ôóíêöèÿ 10 - æäàòü ñîáûòèÿ
cmp eax,1 ; ïåðåðèñîâàòü îêíî ?
je red ; åñëè äà - íà ìåòêó red
cmp eax,2 ; íàæàòà êëàâèøà ?
je key ; åñëè äà - íà key
cmp eax,3 ; íàæàòà êíîïêà ?
je button ; åñëè äà - íà button
jmp still ; åñëè äðóãîå ñîáûòèå - â íà÷àëî öèêëà
;end_still
key: ; íàæàòà êëàâèøà íà êëàâèàòóðå
mcall 2 ; ôóíêöèÿ 2 - ñ÷èòàòü êîä ñèìâîëà (â ah) (òóò â ïðèíöèïå íå íóæíà)
jmp still ; âåðíóòüñÿ ê íà÷àëó öèêëà
;end_key
button:
mcall 17 ; 17 - ïîëó÷èòü èäåíòèôèêàòîð íàæàòîé êíîïêè
cmp ah, 1 ; åñëè íàæàòà êíîïêà ñ íîìåðîì 1,
jz bexit ; âûõîäèì
;îáðàáîòêà êíîïêè Next
cmp ah, 11 ; åñëè íàæàòà êíîïêà NEXT
jne next_bg ; âûõîäèì
inc [pnext] ; óâåëè÷èâàåì ïðè íàæàòèè íîìåð ïàëèòðû
mov eax,[pnext]
cmp al,6
jne next_redraw
xor eax,eax
mov [pnext],eax
next_redraw:
call draw_palitra ; ÐÈÑÓÅÌ ÏÀËÈÒÐÓ
;call draw_result ; ÐÈÑÓÅÌ ÐÅÇÓËÜÒÀÒ
jmp still
next_bg:
cmp ah, 12 ; åñëè íàæàòà êíîïêà BACKGROUND
jne next_end ; âûõîäèì
mcall 15,4,1
mcall 15,1,1,1
mcall 15,5,color,0,3*1*1
mcall 15,3
jne next_redraw
next_end:
cmp ah, 7
jne color_button
call mouse_get
jmp still
color_button:
push eax
call mouse_local ; ïîëó÷èë ëîêàëüíûå êîîðäèíàòû
mov ebx,129
mov ecx,[mouse_y]
sub ebx,ecx
mov ecx,3
imul ecx,ebx
;push ecx
pop eax
red_button:
cmp ah, 8
jne green_button
mov [cred],cl
call set_spectr
jmp still
green_button:
cmp ah, 9
jne blue_button
mov [cgreen],cl
call set_spectr
jmp still
blue_button:
cmp ah, 10
jne still
mov [cblue],cl
call set_spectr
jmp still
bexit:
mcall -1 ; èíà÷å êîíåö ïðîãðàììû
;end_button
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; ÃËÀÂÍÛÉ ÌÎÄÓËÜ ÎÒÐÈÑÎÂÊÈ ÎÊÍÀ È ÝËÅÌÅÍÒÎÂ ÏÐÈËÎÆÅÍÈß |
;----------------------------------------------------------------------------------------------------/
draw_window:
mov eax,12 ; ôóíêöèÿ 12: îçíà÷àåò, ÷òî áóäåò ðèñîâàòüñÿ îêíî
mov ebx,1 ; 1,íà÷àëî ðèñîâàíèÿ
int 0x40 ; Ïðåðûâàíèå
mov eax,48 ; Ôóíêöèÿ 48 - ñòèëè îòîáðàæåíèÿ îêîí
mov ebx,3 ; Ïîäôóíêöèÿ 3 - ïîëó÷èòü ñòàíäàðòíûå öâåòà îêîí.
mov ecx,sc ; Óêàçàòåëü íà áóôåð ðàçìåðîì edx áàéò, ïîä ñòðóêòóðó
mov edx,sizeof.system_colors ; Ðàçìåð òàáëèöû öâåòîâ (äîëæåí áûòü 40 áàéò)
int 0x40 ; Ïðåðûâàíèå
mov eax,48 ; Ôóíêöèÿ 48 - ñòèëè îòîáðàæåíèÿ îêîí.
mov ebx,4 ; Ïîäôóíêöèÿ 4 - âîçâðàùàåò eax = âûñîòà ñêèíà.
int 0x40 ; Ïðåðûâàíèå
mov ecx,eax ; Çàïîìèíàåì âûñîòó ñêèíà
xor eax,eax ; Î÷èùàåì eax (mov eax,0) (Ôóíêöèÿ 0)
mov ebx,200 shl 16+250 ; [êîîðäèíàòà ïî îñè x]*65536 + [ðàçìåð ïî îñè x]
add ecx,200 shl 16+195 ; Âûñîòà ñêèíà + [êîîðäèíàòà ïî y]*65536 + [ðàçìåð ïî y] (168 äëÿ âåðñèè 0.2)
mov edx,[sc.work] ; Âèäèìî ñòèëü îêíà ïî äåôîëòó
or edx,0x34000000 ; Èëè îêíî ñî ñêèíîì ôèêñèðîâàííûõ ðàçìåðîâ
mov edi,title ; Çàãîëîâîê îêíà
int 0x40 ; Ïðåðûâàíèå
call draw_palitra ; ÐÈÑÓÅÌ ÏÀËÈÒÐÓ
call draw_result ; ÐÈÑÓÅÌ ÐÅÇÓËÜÒÀÒ
mov eax,8 ; Ôóíêöèÿ 8 - îïðåäåëèòü/óäàëèòü êíîïêó
mov ebx,89 shl 16+147 ; Íà÷àëüíûå êîîðäèíàòû ïî õ [ê-òà x]*65536 + [ðàçìåð]
mov ecx,9 shl 16+147 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
mov edx,0x60000007 ; Íà÷àëüíîå ID êíîïîê - 0xXYnnnnnn
int 0x40
mov ebx,9 shl 16+12 ; Íà÷àëüíûå êîîðäèíàòû ïî õ [ê-òà x]*65536 + [ðàçìåð]
mov edx,0x60000008 ; ID = 8
mov ecx,45 shl 16+85 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40 ; Ðèñóåì íåâèäèìóþ êíîïêó ïîä ñëàéäåðîì red
add ebx,26 shl 16 ; Äîáàâëÿåì
inc edx ; ID = 9
int 0x40 ; Ðèñóåì íåâèäèìóþ êíîïêó ïîä ñëàéäåðîì green
add ebx,26 shl 16 ; Äîáàâëÿåì
inc edx ; ID = 10
int 0x40 ; Ðèñóåì íåâèäèìóþ êíîïêó ïîä ñëàéäåðîì blue
mov eax,12 ; ôóíêöèÿ 12: îçíà÷àåò, ÷òî áóäåò ðèñîâàòüñÿ îêíî
mov ebx,2 ; 2 - êîíåö ðèñîâàíèÿ
int 0x40 ; Ïðåðûâàíèå
;.................................................................................................
; Îòðèñîâêà íèæíåé ïàíåëè
;.................................................................................................
mov eax,8 ; Ôóíêöèÿ 8 - îïðåäåëèòü/óäàëèòü êíîïêó
mov ebx,4 shl 16+64 ; Íà÷àëüíûå êîîðäèíàòû ïî õ [ê-òà x]*65536 + [ðàçìåð]
mov ecx,169 shl 16+16 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
mov edx,11 ; ID = 11
mov esi,[sc.work_button] ; öâåò
int 0x40
mov ebx,80 shl 16+102 ; Íà÷àëüíûå êîîðäèíàòû ïî õ [ê-òà x]*65536 + [ðàçìåð]
mov edx,12 ; ID = 11
int 0x40
mov eax,4 ; 4 - âûâåñòè ñòðîêó òåêñòà â îêíî
mov ebx,25 shl 16+174 ; [êîîðäèíàòà ïî îñè x]*65536 + [êîîðäèíàòà ïî îñè y]
mov ecx,[sc.work_button_text] ; 0xX0RRGGBB (RR, GG, BB çàäàþò öâåò òåêñòà)
mov edx,bnext ; óêàçàòåëü íà íà÷àëî ñòðîêè
;mov esi,1 ; âûâîäèòü esi ñèìâîëîâ
int 0x40
;mov ebx,247 shl 16+64 ; Íà÷àëüíûå êîîðäèíàòû ïî õ [ê-òà x]*65536 + [ðàçìåð]
;mov edx,12 ; ID = 12
;int 0x40
mov eax,38 ; Ôóíêöèÿ 38 - íàðèñîâàòü îòðåçîê.
mov ebx,4 shl 16+236 ;[êîîðäèíàòà íà÷àëà ïî îñè x]*65536 + [êîîðäèíàòà êîíöà ïî îñè x]
mov ecx,163 shl 16+163 ;[êîîðäèíàòà íà÷àëà ïî îñè y]*65536 + [êîîðäèíàòà êîíöà ïî îñè y]
mov edx,0x00666666 ;0x00RRGGBB - öâåò
int 0x40
ret ; Âîçâðàùàåì óïðàâëåíèå
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; ÁËÎÊ ÂÑÏÎÌÎÃÀÒÅËÜÍÛÕ ÏÐÎÖÅÄÓÐ È ÔÓÍÊÖÈÉ ÏÐÈËÎÆÅÍÈß |
;----------------------------------------------------------------------------------------------------/
mouse_global:
;.................................................................................................
; Ïîëó÷àåì êîîðäèíàòû ìûøè
;.................................................................................................
mov eax,37 ; Ôóíêöèÿ 37 - ðàáîòà ñ ìûøüþ
mov ebx,0 ; íàì íóæíû ãëîáàëüíûå êîîðäèíàòû
int 0x40 ; eax = x*65536 + y, (x,y)=êîîðäèíàòû êóðñîðà ìûøè
mov ecx,eax ;
shr ecx,16 ; ecx = x+1
movzx edx,ax ; edx = y+1
dec ecx ; ecx = x
dec edx ; edx = y
mov [mouse_x],ecx ; mouse_x = x
mov [mouse_y],edx ; mouse_y = y
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_mouse_global
mouse_local:
;.................................................................................................
; Ïîëó÷àåì êîîðäèíàòû ìûøè îòíîñèòåëüíî îêíà
;.................................................................................................
mov eax,37 ; Ôóíêöèÿ 37 - ðàáîòà ñ ìûøüþ
mov ebx,1 ; íàì íóæíû ãëîáàëüíûå êîîðäèíàòû
int 0x40 ; eax = x*65536 + y, (x,y)=êîîðäèíàòû êóðñîðà ìûøè
mov ecx,eax ;
shr ecx,16 ; ecx = x+1
movzx edx,ax ; edx = y+1
dec ecx ; ecx = x
dec edx ; edx = y
mov [mouse_x],ecx ; mouse_x = x
mov [mouse_y],edx ; mouse_y = y
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_mouse_local
desktop_get:
;.................................................................................................
; Îïðåäåëÿåì øèðèíó ýêðàíà
;.................................................................................................
mov eax,14 ; Îïðåäåëÿåì øèðèíó ýêðàíà (eax = [xsize]*65536 + [ysize])
int 0x40 ; xsize = ðàçìåð ïî ãîðèçîíòàëè - 1
mov ebx,eax ;
shr ebx,16 ; ebx = xsize-1
;movzx edx,ax ;; edx = ysize-1 (ëèøíèé êîä)
inc ebx ; ebx = xsize
;inc edx ;; edx = ysize (ëèøíèé êîä)
mov [desctop_w],ebx
ret
;end_desktop_get
mouse_get:
mov esi,2 ; ÊÎÑÒÛËÜ: ôëàã äëÿ èçáåæàíèÿ çàöèêëèâàíèÿ
call mouse_global
call desktop_get
re_mouse_loop: ; ÊÎÑÒÛËÜ: ìåòêà äëÿ âîçâðàòà åñëè ïîïàëè â ñåòêó
mov ebx,[desctop_w]
imul ebx,[mouse_y] ; ebx = y*xsize
add ebx,[mouse_x] ; ebx = y*xsize+x
;.................................................................................................
; Áåðåì öâåò ñ ïàëèòðû â ïåðåìåííóþ
;.................................................................................................
mov eax,35 ; Ôóíêöèÿ âçÿòèÿ öâåòà
;mov ebx,ecx ;; ebx = y*xsize+x (ëèøíèé êîä)
int 0x40 ; Ïîëó÷àåì öâåò â eax
cmp eax,[sc.work] ; Ñðàâíèâàåì ñ ôîíîì ïðèëîæåíèÿ
je mouse_err ; Åñëè ýòî îí - òî íè÷åãî íå äåëàåì
cmp eax,0x222222 ; Ñðàâíèâàåì ñ öâåòîì ñåòêè
je mouse_err ; Åñëè ýòî îí - òî íè÷åãî íå äåëàåì
jmp mouse_set ; ÊÎÑÒÛËÜ: ïðûãàåì ÷òîáû íå áðàòü öâåò ñåòêè
mouse_err: ; ÊÎÑÒÛËÜ: åñëè ïîïàëè â ñåòêó èëè ôîí
inc [mouse_y] ; ÊÎÑÒÛËÜ: ñìåùàåì ïî äèàãîíàëè ñíà÷àëà ïî õ
inc [mouse_x] ; ÊÎÑÒÛËÜ: ñìåùàåì ïî äèàãîíàëè ïîòîì ïî ó
dec esi ; ÊÎÑÒÛËÜ: Óìåíüøàåì ôëàã
cmp esi,0 ; ÊÎÑÒÛËÜ: Ñðàâíèâàåì ñ íóëåì
jz mouse_exit ; ÊÎÑÒÛËÜ: Åñëè íîëü òî ñäåëàëè âñ¸ ÷òî ìîãëè
jmp re_mouse_loop ; ÊÎÑÒÛËÜ: Åñëè íå íîëü òî ïîïðîáóåì âçÿòü ñîñåëíèé ïèêñåëü
mouse_set:
mov [color],eax ; Èíà÷å çàïîìèíàåì íîâûé öâåò
call draw_result ; Âûâîäèì ðåçóëüòàò
mouse_exit:
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_mouse_get----------------------------------------------------------------------------------------
draw_palitra:
;.................................................................................................
; Îòðèñîâêà ôîíà ïîä êíîïêè
;.................................................................................................
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,0x222222 ; öâåò
mov ecx,9 shl 16+73 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
mov esi,2 ; Ñ÷åò÷èê ëèíèé ïîäëîæåê
re_draw:
mov ebx,89 shl 16+73 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov edi,2 ; Ñ÷åò÷èê êîëè÷åñòâà ïîäëîæåê
for_fon_loop:
int 0x40 ; Ïðåðûâàíèå
add ebx,75 shl 16 ; Ñìåùàåì ïîëîæåíèå ëèíèè ïî õ
dec edi ; Óìåíüøàåì ñ÷åò÷èê êíîïîê
cmp edi,0 ; Ñðàâíèâàåì ñ íóëåì
jnz for_fon_loop ; Åñëè íå íîëü òî â íà÷àëî öèêëà
dec esi ; Óìåíüøàåì åãî
cmp esi,0 ; Ñðàâíèâàåì ñ íóëåì
mov ecx,84 shl 16+73 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
jnz re_draw ; Åñëè íå íîëü òî â íà÷àëî öèêëà
;.................................................................................................
; Îòðèñîâêà êíîïîê ïî öèêëó
;.................................................................................................
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,0x0FFFFFFF ; öâåò
mov esi,4 ; Ñ÷åò÷èê êîëè÷åñòâà àáçàöåâ (#4,8)
mov ebx,78 shl 16+8 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
for_abz:
;;push esi ; Ñîõðàíÿåì çíà÷åíèå ñ÷åò÷èêà ëèíèé â ñòåê
cmp esi,2
jne x2_line
mov ebx,78 shl 16+8
x2_line:
add ebx,3 shl 16 ; Ñìåùàåì ïîëîæåíèå ëèíèè ïî x
mov edi,8 ; Ñ÷åò÷èê êîëè÷åñòâà êíîïîê â ñòðîêå
for_stolbik:
push edi ; Ñîõðàíÿåì çíà÷åíèå ñ÷åò÷èêà ëèíèé â ñòåê
mov edi,8 ; Ñ÷åò÷èê êîëè÷åñòâà êíîïîê â ñòðîêå
mov ecx, 1 shl 16+8 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
cmp esi,2
jg y2_line ; Åñëè áîëüøå 4 òî èãíîðèì
mov ecx,76 shl 16+8
y2_line:
add ebx,9 shl 16 ; Ñìåùàåì ïîëîæåíèå ëèíèè ïî x
for_loop:
add ecx,9 shl 16 ; Ñìåùàåì ïîëîæåíèå ëèíèè ïî y
int 0x40 ; Ïðåðûâàíèå
call sub_red
dec edi ; Óìåíüøàåì ñ÷åò÷èê êíîïîê
cmp edi,0 ; Ñðàâíèâàåì ñ íóëåì
jnz for_loop ; Åñëè íå íîëü òî â íà÷àëî öèêëà
call sub_green
pop edi ; Èíà÷å âîññòàíàâëèâàåì ñ÷åò÷èê ëèíèé
dec edi ; Óìåíüøàåì åãî
cmp edi,0 ; Ñðàâíèâàåì ñ íóëåì
jnz for_stolbik ; Åñëè íå íîëü òî â íà÷àëî öèêëà
call sub_blue
;;pop esi ; Èíà÷å âîññòàíàâëèâàåì ñ÷åò÷èê ëèíèé
dec esi ; Óìåíüøàåì åãî
cmp esi,0 ; Ñðàâíèâàåì ñ íóëåì
jnz for_abz ; Åñëè íå íîëü òî â íà÷àëî öèêëà
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_draw_palitra-------------------------------------------------------------------------------------
sub_red:
;.................................................................................................
; Ðàñ÷¸ò ñìåùåíèé êðàñíîãî öâåòà â ãåíåðàöèè öâåòà ïàëèòðû
;.................................................................................................
push eax
mov eax,[pnext]
;sub_red_0 ; palitra
cmp al,0
jne sub_red_1
sub edx,0x20
jmp sub_red_e
sub_red_1: ; random
cmp al,1
jne sub_red_2
sub edx,0x40
jmp sub_red_e
sub_red_2: ; gree
cmp al,2
jne sub_red_3
sub edx,0x010101
jmp sub_red_e
sub_red_3: ; red
cmp al,3
jne sub_red_4
sub edx,0x0101
jmp sub_red_e
sub_red_4: ; green
cmp al,4
jne sub_red_5
sub edx,0x010001
jmp sub_red_e
sub_red_5: ; blue
cmp al,5
jne sub_red_e
sub edx,0x010100
jmp sub_red_e
sub_red_e:
pop eax
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_sub_red------------------------------------------------------------------------------------------
sub_green:
;.................................................................................................
; Ðàñ÷¸ò ñìåùåíèé êðàñíîãî öâåòà â ãåíåðàöèè öâåòà ïàëèòðû
;.................................................................................................
push eax
mov eax,[pnext]
;sub_green_0
cmp al,0
jne sub_green_1
sub edx,0x2000
jmp sub_green_e
sub_green_1:
cmp al,1
jne sub_green_e
sub edx,0x4000
;jmp sub_green_e
sub_green_e:
pop eax
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_sub_green----------------------------------------------------------------------------------------
sub_blue:
;.................................................................................................
; Ðàñ÷¸ò ñìåùåíèé êðàñíîãî öâåòà â ãåíåðàöèè öâåòà ïàëèòðû
;.................................................................................................
push eax
mov eax,[pnext]
;sub_blue_0
cmp al,0
jne sub_blue_1
sub edx,0x400000
jmp sub_blue_e
sub_blue_1:
cmp al,1
jne sub_blue_e
sub edx,0x600000
;jmp sub_blue_e
sub_blue_e:
pop eax
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_sub_blue-----------------------------------------------------------------------------------------
draw_result:
;.................................................................................................
; Îòðèñîâêà ðåçóëüòàòà öâåòà â hex
;.................................................................................................
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,0x222222 ; öâåò-îáâîäêè
mov ebx,4 shl 16+15 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,9 shl 16+15 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40 ; Ïðåðûâàíèå (îñ ðèñóåò ïðÿìîóãîëüíèê)
mov ebx,23 shl 16+62 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40 ; Ïðåðûâàíèå (îñ ðèñóåò ïðÿìîóãîëüíèê)
mov edx,[color] ; öâåò
mov ebx,5 shl 16+13 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,10 shl 16+13 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40 ; Ïðåðûâàíèå (îñ ðèñóåò ïðÿìîóãîëüíèê)
mov edx,0xFFFFFF ; öâåò-ôîíà
mov ebx,24 shl 16+60 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40 ; Ïðåðûâàíèå (îñ ðèñóåò ïðÿìîóãîëüíèê)
mov eax,47 ; Ôóíêöèÿ 47 - âûâîä ÷èñëà â îêíî
mov ecx,[color] ; ÷èñëî (ïðè bl=0) èëè óêàçàòåëü (ïðè bl=1)
mov esi,0x0 ; 0xX0RRGGBB
mov ebx,256+8 shl 16 ; ïàðàìåòðû ïðåîáðàçîâàíèÿ ÷èñëà â òåêñò (HEX)
mov edx,34 shl 16+13 ; [êîîðäèíàòà ïî îñè x]*65536 + [êîîðäèíàòà ïî îñè y]
int 0x40 ; Ïðåðûâàíèå - âûâîäèì ðåçóëüòàò â îêíî (HEX)
mov eax,4 ; ôóíêöèÿ 4: íàïèñàòü òåêñò â îêíå
mov ebx,27*65536+13 ; [x íà÷àëüíûé] *65536 + [y íà÷àëüíûé]
mov ecx,0x0 ; öâåò òåêñòà RRGGBB
mov edx,hex ; ðèñóåì '#'
mov esi,1 ; äëèíà òåêñòà â áàéòàõ
int 0x40
;.................................................................................................
; Îòðèñîâêà ïîëåé äëÿ r g b çíà÷åíèé
;.................................................................................................
call get_spectr
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê Leency{
mov edx,0x222222 ; öâåò-îáâîäêè
mov ebx,4 shl 16+24 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,142 shl 16+15 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
mov ebx,33 shl 16+24 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40
mov ebx,62 shl 16+24 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40
mov edx,0xFFFFFF ; öâåò-îáâîäêè
mov ebx,5 shl 16+22 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,143 shl 16+13 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
mov ebx,34 shl 16+22 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40
mov ebx,63 shl 16+22 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
int 0x40
;.................................................................................................
; Îòðèñîâêà r g b çíà÷åíèé
;.................................................................................................
movzx eax,[cred] ; êðàñíûé
mov ebx,7*65536+146 ; [x íà÷àëüíûé] *65536 + [y íà÷àëüíûé]
call draw_value ; âûâîäèì ðåçóëüòàò
movzx eax,[cgreen] ; çåëåíûé
mov ebx,36*65536+146 ; [x íà÷àëüíûé] *65536 + [y íà÷àëüíûé]
call draw_value ; âûâîäèì ðåçóëüòàò
movzx eax,[cblue] ; ñèíèé
mov ebx,65*65536+146 ; [x íà÷àëüíûé] *65536 + [y íà÷àëüíûé]
call draw_value ; âûâîäèì ðåçóëüòàò
;.................................................................................................
; Îáíóëÿåì ôîí
;.................................................................................................
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,[sc.work] ; öâåò-îáâîäêè
mov ebx,8 shl 16+66 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,40 shl 16+87 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
; mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
; mov edx,0x222222 ; öâåò-îáâîäêè
; mov ebx,4 shl 16+24 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
; mov ecx,30 shl 16+105 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
; int 0x40
; add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
; int 0x40
; add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
; int 0x40
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,[sc.work] ; öâåò-îáâîäêè
mov ebx,5 shl 16+22 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,31 shl 16+103 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
;.................................................................................................
; Âûâîäèì áóêâû r g b
;.................................................................................................
mov eax,4 ; 4 - âûâåñòè ñòðîêó òåêñòà â îêíî
mov ebx,12 shl 16+34 ; [êîîðäèíàòà ïî îñè x]*65536 + [êîîðäèíàòà ïî îñè y]
mov ecx,0x0 ; 0xX0RRGGBB (RR, GG, BB çàäàþò öâåò òåêñòà)
mov edx,cname ; óêàçàòåëü íà íà÷àëî ñòðîêè
mov esi,1 ; âûâîäèòü esi ñèìâîëîâ
newline: ; öèêë
int 0x40 ; Ïðåðûâàíèå
add ebx,29 shl 16 ; Äîáàâëÿåì
add edx,1 ; Äîáàâëÿåì
cmp [edx],byte 'x' ; Ñðàâíåíèå ñ áàéòîì õ
jne newline ; Åñëè íå íóëü èëè íå ðàâíî
;.................................................................................................
; Îòðèñîâêà ñëàéäåðîâ
;.................................................................................................
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
mov edx,0x222222 ; öâåò-îáâîäêè
mov ebx,12 shl 16+4 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,45 shl 16+85 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
mov edx,0xFA0919 ; öâåò-îáâîäêè
mov ebx,13 shl 16+2 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
mov ecx,46 shl 16+83 ; Íà÷àëüíûå êîîðäèíàòû ïî y [ê-òà y]*65536 + [ðàçìåð]
int 0x40
mov edx,0x08CE19 ; öâåò-îáâîäêè
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
mov edx,0x0909FF ; öâåò-îáâîäêè
add ebx,29 shl 16 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà y]*65536 + [ðàçìåð]
int 0x40
;.................................................................................................
; Îòðèñîâêà ïîëçóíêîâ
;.................................................................................................
mov edx,0x0 ; öâåò-ïîëçóíêîâ
mov ebx,10 shl 16+8 ; Íà÷àëüíûå êîîðäèíàòû ïî x [ê-òà x]*65536 + [ðàçìåð]
movzx eax,[cred] ; áåðåì çíà÷åíèå öâåòà
call draw_slider
add ebx,29 shl 16
movzx eax,[cgreen] ; áåðåì çíà÷åíèå öâåòà
call draw_slider
add ebx,29 shl 16
movzx eax,[cblue] ; áåðåì çíà÷åíèå öâåòà
call draw_slider
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_draw_result
draw_slider:
xor ecx,ecx
mov cl,0x3 ; áóäåì äåëèòü åãî íà 3 òàê êàê ïîëçóíêè äëèííîé 85 ïèêñåëåé
div cl ; äåëèì - öåëîå â al îñòàòîê â ah
mov cl,128 ; íèæíÿÿ òî÷êà ïîëçóíêà
sub cl,al ; cl=cl-al
shl ecx,16
add ecx,4 ; çàäàåì íà÷àëüíîå ïîëîæåíèå
mov eax,13 ; Ôóíêöèÿ 13 - íàðèñîâàòü ïðÿìîóãîëüíèê
int 0x40
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_slider
draw_value:
;.................................................................................................
; Âûâîä ÷èñëà èç ñòðîêè â óêàçàííîé îáëàñòè
;.................................................................................................
push ebx ; ñîõðàíÿåì ïðèñëàííûå êîîðäèíàòû
mov ebx,10 ; óñòàíàâëèâàåì îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ
mov edi,buff ; óêàçàòåëü íà ñòðîêó áóôåðà
call int2ascii ; êîíâåðòèðóåì ÷èñëî è ëîæèì êàê ñòðîêó â áóôåð + esi äëèíà
mov eax,4 ; ôóíêöèÿ 4: íàïèñàòü òåêñò â îêíå
pop ebx ; äîñòàåì èç ñòåêà ïðèñëàííûå êîîðäèíàòû
mov ecx,0x0 ; öâåò òåêñòà RRGGBB
mov edx,buff ; óêàçàòåëü íà íà÷àëî òåêñòà
int 0x40
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_draw_value
hex_digit:
;.................................................................................................
; Ïðåîáðàçîâàíèå â ASCII (âíå çàâèñèìîñòè îò ñèñòåìû ñ÷èñëåíèÿ)
;.................................................................................................
cmp dl,10 ; â dl îæèäàåòñÿ ÷èñëî îò 0 äî 15
jb .less ; åñëè dl<10 òî ïåðåõîäèì
add dl,'A'-10 ; 10->A 11->B 12->C ...
ret ; Âîçâðàùàåì óïðàâëåíèå
.less:
or dl,'0' ; Åñëè ñèñòåìà ñ÷èñëåíèÿ 10-ÿ è ìåíåå
ret ; Âîçâðàùàåì óïðàâëåíèå
;end_hex_digit
int2ascii:
;.................................................................................................
; Ïðåîáðàçîâàíèå ÷èñëà â ñòðîêó
;.................................................................................................
; eax - 32-õ çíà÷íîå ÷èñëî
; ebx - îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ
; edi - óêàçàòåëü íà ñòðîêó áóôåðà
; Âîçâðàùàåò çàïîëíåííûé áóôåð è esi - äëèíà ñòðîêè
;pushad
xor esi,esi ; çàíóëÿåì ñ÷åò÷èê ñèìâîëîâ
convert_loop:
xor edx,edx ; çàíóëÿåì ðåãèñòð ïîä îñòàòîê
div ebx ; eax/ebx - îñòàòîê â edx
call hex_digit ; ïðåîáðàçóåì ñèìâîë
push edx ; ëîæèì â ñòåê
inc esi ; óâåëè÷èâàåì ñ÷åò÷èê
test eax,eax ; åñëè åùå ìîæíî äåëèòü
jnz convert_loop ; òî äåëèåì åùå
cld ; ÎÁßÇÀÒÅËÜÍÎ ñáðàñûâàåì ôëàã íàïðàâëåíèÿ DF (çàïèñü âïåð¸ä)
write_loop: ; èíà÷å
pop eax ; äîñòàåì èç ñòåêà â åàõ
stosb ; çàïèñûâàåì â áóôåð ïî àäðåñó ES:(E)DI
dec esi ; óìåíüøàåì ñ÷åò÷èê
test esi,esi ; åñëè åñòü ÷òî äîñòàâàòü èç ñòåêà
jnz write_loop ; òî äîñòà¸ì
mov byte [edi],0 ; èíà÷å äîïèñûûâàåì íóëåâîé áàéò
;popad ; âîññòàíàâëèâàåì çíà÷åíèÿ ðåãèñòðîâ
; êîä íèæå íå èìååò íè÷åãî îáùåãî ê ôóíêöèè, ïðîñòî âîçâðàùàåò åùå äëèííó ïîëó÷åííîé ñòðîêè
mov edi,buff ; óêàçàòåëü íà íà÷àëî òåêñòà
call str_len
mov esi,eax
ret ; è âîçâðàùàåì óïðàâëåíèå
;end_int2ascii
get_spectr:
;.................................................................................................
; âîçâðàùàåò r,g,b ñîñòîâëÿþùèå öâåòà
;.................................................................................................
; get blue
mov ecx,[color]
movzx eax,cl
mov [cblue],al
; get red
mov eax,ecx
xor ax,ax
shr eax,16
mov [cred],al
; get green
shl ecx,16
shr ecx,24
mov [cgreen],cl
ret ; è âîçâðàùàåì óïðàâëåíèå
;end_get_spectr
set_spectr:
;.................................................................................................
; óñòàíàâëèâàåò èç r,g,b öâåò
;.................................................................................................
; get blue
movzx eax,[cred]
shl eax,8
mov al,[cgreen]
shl eax,8
mov al,[cblue]
mov [color],eax
call draw_result ; Âûâîäèì ðåçóëüòàò
ret ; è âîçâðàùàåì óïðàâëåíèå
;end_get_spectr
str_len:
;.................................................................................................
; îïðåäåëÿåò äëèíó ñòðîêè (âõîä->EDI ZS offset ; âûõîä->EAX ZS length)
;.................................................................................................
push ecx
push esi
push edi
cld
xor al, al
mov ecx, 0FFFFFFFFh
mov esi, edi
repne scasb
sub edi, esi
mov eax, edi
dec eax
pop edi
pop esi
pop ecx
ret
;end_str_len
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; ÁËÎÊ ÏÅÐÅÌÅÍÍÛÕ È ÊÎÍÑÒÀÍÒ |
;----------------------------------------------------------------------------------------------------/
color dd 00000000h ; õðàíèò çíà÷åíèå âûáðàííîãî öâåòà
mouse_x dd 0 ; õðàíèò ãëîáàëüíóþ õ êîîðäèíàòó ìûøè
mouse_y dd 0 ; õðàíèò ãëîáàëüíóþ ó êîîðäèíàòó ìûøè
desctop_w dd 0 ; õðàíèò øèðèíó ýêðàíà
sc system_colors ; õðàíèò ñòðóêòóðó ñèñòåìíûõ öâåòîâ ñêèíà
title db 'Palitra v0.3',0 ; õðàíèò èìÿ ïðîãðàììû
hex db '#',0 ; äëÿ âûâîäà ðåø¸òêè êàê òåêñòà
cname db 'RGBx' ; õðàíèò ðàçðÿäû öâåòîâ (red,green,blue) x-ìåòêà êîíöà
cred db 0 ; õðàíèì êðàñíûé ñïåêðò
cgreen db 0 ; õðàíèì çåëåíûé ñïåêòð
cblue db 0 ; õðàíèì ñèíèé ñïåêòð
buff db '000',0
bnext db 'NEXT BACKGROUND',0; èìÿ êíîïêè
pnext dd 0 ; ñ÷åò÷èê ïåðåêëþ÷åíèÿ ïàëèòðû
I_END: