; ; RDsave для Kolibri (0.6.5.0 и старше) ; ; Mario79 2005 ; Heavyiron 12.02.2007 ; ; Компилировать FASM'ом ; ;--------------------------------------------------------------------- include 'lang.inc' include 'macros.inc' appname equ 'RDsave ' version equ '1.2' use32 ; включить 32-битный режим ассемблера org 0x0 ; адресация с нуля db 'MENUET01' ; 8-байтный идентификатор MenuetOS dd 0x01 ; версия заголовка (всегда 1) dd START ; адрес первой команды dd I_END ; размер программы dd 0x1000 ; количество памяти dd 0x1000 ; адрес вершины стэка dd 0x0 ; адрес буфера для параметров (не используется) dd 0x0 ; зарезервировано include '..\..\..\develop\examples\editbox\trunk\editbox.inc' use_edit_box ;--------------------------------------------------------------------- ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- START: mov eax, 40 mov ebx, 100111b int 0x40 red: ; перерисовать окно call draw_window ; вызываем процедуру отрисовки окна ;--------------------------------------------------------------------- ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- ;--------------------------------------------------------------------- still: push 10 pop eax int 40h dec eax ; перерисовать окно? jz red ; если да - на метку red dec eax jz key dec eax jz button mouse: mouse_edit_boxes editbox,editbox_end jmp still button: mov al,17 ; получить идентификатор нажатой кнопки int 0x40 cmp ah,1 ; кнопка с id=1("закрыть")? jne noclose or eax,-1 ; функция -1: завершить программу int 0x40 noclose: cmp ah,2 jne path_2 call clear_err mov al,16 mov ebx,1 int 0x40 call check_for_error jmp still path_2: cmp ah,3 jne path_3 call clear_err mov al,16 mov ebx,2 int 0x40 call check_for_error jmp still path_3: cmp ah,4 jne path_4 call clear_err mov al,18 mov ebx,6 mov ecx,path3 int 0x40 call check_for_error jmp still path_4: call clear_err mov eax,18 mov ebx,6 mov ecx,path4 int 0x40 call check_for_error jmp still key: mov al,2 int 0x40 key_edit_boxes editbox,editbox_end jmp still check_for_error: ;Обработчик ошибок cmp eax,0 jne err1 mov ecx,[sc.work_text] mov edx,ok jmp print err1: cmp eax,1 jne err3 mov ecx,0xdd2222 mov edx,error11 jmp print err3: cmp eax,3 jne err5 mov ecx,0xdd2222 mov edx,error3 jmp print err5: cmp eax,5 jne err8 mov ecx,0xdd2222 mov edx,error5 jmp print err8: cmp eax,8 jne err9 mov ecx,0xdd2222 mov edx,error8 jmp print err9: cmp eax,9 jne err10 mov ecx,0xdd2222 mov edx,error9 jmp print err10: cmp eax,10 jne err11 mov ecx,0xdd2222 mov edx,error10 jmp print err11: mov ecx,0xdd2222 mov edx,error11 jmp print print: mov eax,4 ;надписи mov ebx,20 shl 16 + 148 or ecx,0x80000000 int 0x40 ret clear_err: mov al,13 mov ebx,15 shl 16 + 240 mov ecx,145 shl 16 +15 mov edx,[sc.work] int 0x40 ret ;--------------------------------------------------------------------- ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- ;--------------------------------------------------------------------- draw_window: mov eax,48 mov ebx,3 mov ecx,sc mov edx,sizeof.system_colors int 0x40 mov eax,12 ; функция 12: сообщить ОС об отрисовке окна mov bl,1 ; 1 - начинаем рисовать int 0x40 ; СОЗДАЁМ ОКНО xor eax,eax ; функция 0 : определить и отрисовать окно mov ebx,200 shl 16 + 270 ; [x старт] *65536 + [x размер] mov ecx,200 shl 16 + 190 ; [y старт] *65536 + [y размер] mov edx,[sc.work] ; цвет рабочей области RRGGBB,8->color gl or edx,0x33000000 mov edi,header ; ЗАГОЛОВОК ОКНА int 0x40 draw_edit_boxes editbox,editbox_end ;рисование edit box'ов mov al,13 ;отрисовка теней кнопок mov ebx,194 shl 16 + 60 mov ecx,34 shl 16 +15 mov edx,0x444444 int 0x40 add ecx,20 shl 16 int 0x40 add ecx,20 shl 16 int 0x40 add ecx,40 shl 16 int 0x40 mov eax,8 ;отрисовка кнопок sub ebx,4 shl 16 sub ecx,4 shl 16 mov edx,5 mov esi,[sc.work_button] int 0x40 sub ecx,40 shl 16 dec edx int 0x40 sub ecx,20 shl 16 dec edx int 0x40 sub ecx,20 shl 16 dec edx int 0x40 mov al,4 ;надписи mov ebx,45 shl 16 + 12 mov ecx,[sc.work_text] or ecx,0x80000000 mov edx,label1 int 0x40 mov ebx,150 shl 16 + 35 mov edx,path1 int 0x40 add ebx,20 mov edx,path2 int 0x40 mov ebx,75 shl 16 + 75 mov edx,path3 int 0x40 mov ebx,30 shl 16 + 97 mov edx,label2 int 0x40 mov ebx,40 shl 16 + 135 mov edx,label3 int 0x40 mov ecx,[sc.work_button_text] or ecx,0x80000000 mov ebx,195 shl 16 + 35 mov edx,save int 0x40 add ebx,20 int 0x40 add ebx,20 int 0x40 add ebx,40 int 0x40 mov al,12 ; функция 12: сообщить ОС об отрисовке окна mov ebx,2 ; 2, закончили рисовать int 0x40 ret ; выходим из процедуры ;--------------------------------------------------------------------- ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- header db appname,version,0 editbox: edit1 edit_box 170,10,113,0xffffff,0,0,0,512,path4,ed_focus,26 editbox_end: path1 db '/fd/1/',0 path2 db '/fd/2/',0 path3 db '/hd0/1/kolibri.img',0 path4 db '/hd0/1/kolibri/kolibri.img',0 ;для резервного сохранения rb 513 if lang eq ru save db 'Сохранить',0 label1 db 'Выберите один из вариантов:',0 label2 db 'Или введите полный путь к файлу:',0 label3 db 'Все папки должны существовать',0 ok db 'RAM-диск сохранен успешно',0 error3 db 'Неизвестная файловая система',0 error5 db 'Несуществующий путь',0 error8 db 'Нет места на диске',0 error9 db 'Таблица FAT разрушена',0 error10 db 'Доступ запрещен',0 error11 db 'Ошибка устройства',0 else save db ' Save',0 label1 db 'Select one of the variants:',0 label2 db ' Or enter full path to file:',0 label3 db ' All folders must exist',0 ok db 'RAM-drive was saved successfully',0 error3 db 'Unknown file system',0 error5 db 'Incorrect path',0 error8 db 'Disk is full',0 error9 db 'FAT table corrupted',0 error10 db 'Access denied',0 error11 db 'Device error',0 end if ;--------------------------------------------------------------------- I_END: ; метка конца программы sc system_colors