forked from KolibriOS/kolibrios
218 lines
8.1 KiB
FASM
218 lines
8.1 KiB
FASM
;#**************************
|
|
;#* LIGHTS (c)* main.inc
|
|
;#************************** 15/10/2007
|
|
L0 equ 0x0000F8 ; light off
|
|
L1 equ 0xFFFF00 ; light on
|
|
LAG equ 2
|
|
deltaX equ 35
|
|
deltaY equ 35
|
|
posX equ 50
|
|
posY equ 50
|
|
|
|
macro main_loop
|
|
{
|
|
|
|
; функция отрисовки окна
|
|
draw_window:
|
|
mov eax,12 ; функция 12: сообщить системе о
|
|
; состоянии перерисовки окна
|
|
mov ebx,1 ; подфункция 1, начало перерисовки
|
|
int 0x40
|
|
; ===== ОКНО !!1
|
|
mov eax,0 ; функция 0: определить и вывести окно
|
|
mov ebx,100*65536+270 ; [x начальный] *65536 + [x размер]
|
|
mov ecx,100*65536+280 ; [y начальный] *65536 + [y размер]
|
|
mov edx,0x02ccddff ; цвет рабочей области RRGGBB
|
|
; 0x02000000 = тип окна 2
|
|
mov esi,0x808899AA ; цвет области заголовка RRGGBB
|
|
; 0x80000000 = цвет перетекает
|
|
mov edi,0xFFAAcc ; цвет рамки RRGGBB
|
|
int 0x40
|
|
; НАДПИСЬ в заголовке Lights v0.001
|
|
mov eax,4 ; функция 4: написать текст в окне
|
|
mov ebx,8*65536+8 ; [x начальный] *65536 + [y начальный]
|
|
mov ecx,0x00224422 ; цвет текста RRGGBB
|
|
; старший байт (0x00) - размер шрифта
|
|
; (маленький)
|
|
mov edx,text ; указатель на начало текста
|
|
mov esi,texts-text ; длина текста в байтах
|
|
int 0x40
|
|
|
|
xor eax,eax ; НАДПИСЬ в окне!!!
|
|
mov ecx,eax
|
|
lb: ;loop ecx
|
|
mov edi,ecx ;
|
|
shl edi,3 ;
|
|
add edi,tBut ;
|
|
add al,byte[edi+1] ;
|
|
;
|
|
inc ecx ;
|
|
cmp ecx,25 ;
|
|
jne lb ;ecx<25
|
|
|
|
cmp eax, 0xE7 ;25
|
|
jne goon
|
|
;int3
|
|
;call Bin2Hex
|
|
mov eax,4 ; функция 4: написать текст в окне
|
|
mov ebx,80*65536+250 ; [x начальный] *65536 + [y начальный]
|
|
mov ecx,0x10FF22FF ; цвет текста RRGGBB
|
|
; ; старший байт (0x10) - размер шрифта
|
|
; ; (большой)
|
|
;mov edx,txthex
|
|
;mov esi,17
|
|
mov edx,texts ; указатель на начало текста
|
|
mov esi,textend-texts ; длина текста в байтах
|
|
int 0x40
|
|
|
|
goon:
|
|
;-------------------------------------------------------------------------------
|
|
; ----КНОПКИ----
|
|
; button()
|
|
;-------------------------------------------------------------------------------
|
|
|
|
mov eax,8 ; функция 8: определить и вывести кнопку
|
|
mov ebx,(200-19)*65536+12 ; [x начальный] *65536 + [x размер]
|
|
mov ecx,5*65536+12 ; [y начальный] *65536 + [y размер]
|
|
mov edx,100 ; идентификатор кнопки =1
|
|
mov esi,0xFF6611 ; цвет кнопки RRGGBB
|
|
int 0x40 ; ===КНОПКА ЗАКРЫТИЯ ОКНА===
|
|
|
|
|
|
LoopBegin labl,0 ;ecx - loop index
|
|
;add ecx,5
|
|
mov edi,ecx
|
|
shl edi,3 ;edi*8 -index of table
|
|
add edi,tBut
|
|
|
|
xor ebx,ebx
|
|
mov bl,byte[edi+2] ;X
|
|
shl ebx,16 ;*65536=256*256
|
|
add ebx,deltaX-LAG ;dX
|
|
xor ecx,ecx
|
|
mov cl,byte[edi+3] ;Y
|
|
shl ecx,16 ;*65536=256*256
|
|
add ecx,deltaY-LAG ;dY
|
|
xor edx,edx
|
|
mov dl,byte[edi] ;N
|
|
|
|
xor esi,esi
|
|
cmp byte[edi+1], 0 ;Color = 0/1
|
|
je lit_off
|
|
mov esi,L1 ;on
|
|
jmp lend
|
|
lit_off:
|
|
mov esi,L0 ;off
|
|
lend:
|
|
mov eax,8 ;8-BUTTON
|
|
int 0x40
|
|
LoopEnd labl,25
|
|
|
|
;=============================================================
|
|
endbut:
|
|
mov eax,12 ; функция 12: сообщить системе о
|
|
; состоянии перерисовки окна
|
|
mov ebx,2 ; подфункция 2, перерисовка окончена
|
|
int 0x40
|
|
;ret ; конец функции - это не функция!
|
|
|
|
event_wait:
|
|
;mov eax,10 ; функция 10:=0A ожидание события
|
|
mov eax,23
|
|
mov ebx,100
|
|
int 0x40
|
|
|
|
; тип события возвращён в eax, далее проверяем, какое событие произошло
|
|
;-------------------------------------------------------------------------------
|
|
cmp eax,1 ; запрос на перерисовку?
|
|
je redraw
|
|
cmp eax,2 ; нажата клавиша клавиатуры?
|
|
je key
|
|
cmp eax,3 ; нажата кнопка в окне программы?
|
|
je button
|
|
|
|
jmp event_wait ; возвращаемся к началу цикла ожидания событий
|
|
|
|
; после того, как событие идентифицировано, его надо обработать
|
|
;-------------------------------------------------------------------------------
|
|
redraw:
|
|
call draw_window ; вызываем функцию draw_window и
|
|
jmp event_wait ; возвращаемся назад к циклу ожидания
|
|
|
|
key:
|
|
mov eax,2 ; считываем код нажатой клавиши. Возвращен в ah.
|
|
int 0x40 ; Клавиша должна быть прочитана для очистки
|
|
cmp ah,27
|
|
je clos0 ; exit on ESC
|
|
;
|
|
jmp event_wait ; возврат к event_wait
|
|
|
|
button:
|
|
mov eax,17 ; считываем идентификатор нажатой кнопки
|
|
int 0x40 ; возвращен ah.
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; смотрим, какая кнопка была нажата и соответствующим образом реагируем.
|
|
;-------------------------------------------------------------------------------
|
|
cmp ah,100 ; кнопка с id=100("закрыть")?
|
|
jne noclose
|
|
clos0:
|
|
mov eax,-1 ; функция -1: завершить программу
|
|
int 0x40 ; кнопка 5-29
|
|
noclose:
|
|
|
|
xor ecx,ecx ;
|
|
mov cl,ah ;
|
|
sub ecx,5 ; ecx - index for tBut
|
|
|
|
mov edi,ecx
|
|
call x_lit ;+0 - центр
|
|
mov [tButIdx],edi ;save index
|
|
|
|
mov edi,[tButIdx]
|
|
cmp byte[edi+6],0
|
|
je next000
|
|
mov edi,ecx
|
|
inc edi
|
|
call x_lit ;+1 справа
|
|
|
|
next000:
|
|
mov edi,[tButIdx]
|
|
cmp byte[edi+5],0
|
|
je next001
|
|
mov edi,ecx
|
|
dec edi
|
|
call x_lit ;-1 слева
|
|
|
|
next001:
|
|
mov edi,[tButIdx]
|
|
cmp byte[edi+4],0
|
|
je next002
|
|
mov edi,ecx
|
|
sub edi,5
|
|
call x_lit ;-5 сверху
|
|
|
|
next002:
|
|
mov edi,[tButIdx]
|
|
cmp byte[edi+7],0
|
|
je next003
|
|
mov edi,ecx
|
|
add edi,5
|
|
call x_lit ;+5 снизу
|
|
next003:
|
|
call draw_window
|
|
jmp event_wait
|
|
;================================--
|
|
x_lit: ; edi - index
|
|
shl edi,3 ; edi*8 -index of table tBut
|
|
add edi,tBut ;
|
|
not byte[edi+1] ; invert second byte = L0/L1
|
|
ret ;
|
|
;================================--
|
|
call draw_window ;наша кнопка;)
|
|
; здесь проверяем остальные кнопки
|
|
jmp event_wait ;возвращаемся к циклу ожидания
|
|
}
|
|
|
|
|