diff --git a/kernel/trunk/blkdev/rdsave.inc b/kernel/trunk/blkdev/rdsave.inc index abae7a055..6b85a27fe 100644 --- a/kernel/trunk/blkdev/rdsave.inc +++ b/kernel/trunk/blkdev/rdsave.inc @@ -1,27 +1,22 @@ -sysfn_saveramdisk: ; 18.6 = SAVE FLOPPY IMAGE (HD version only) - cmp ebx,1 - jnz img_save_hd_1 - mov edx,bootpath ; path = '/KOLIBRI ' - jmp img_save_hd_3 - img_save_hd_1: - cmp ebx,2 - jnz img_save_hd_2 - mov edx,bootpath2 ; path = 0 (root dir) - jmp img_save_hd_3 - img_save_hd_2: - cmp ebx,3 - jnz exit_for_anyone - mov edx,[0x3010] - mov edx,[edx+TASKDATA.mem_start] - add edx,ecx - img_save_hd_3: - call reserve_hd1 - call reserve_hd_channel - call restorefatchain ; restore FAT !!! - mov eax,image_save - mov ebx,1440*1024 ; size 1440 Kb - mov ecx,0x100000 ; address of image - call file_write - call free_hd_channel - mov [esp+36],eax - ret +iglobal +saverd_fileinfo: + dd 2 ; subfunction: write + dd 0 ; (reserved) + dd 0 ; (reserved) + dd 1440*1024 ; size 1440 Kb + dd 0x100000 - std_application_base_address ; base address + db 0 +.name: + dd ? +endg +sysfn_saveramdisk: ; 18.6 = SAVE FLOPPY IMAGE (HD version only) + call restorefatchain + mov eax, saverd_fileinfo - std_application_base_address + mov [saverd_fileinfo.name], ebx + pushad + push eax + call file_system_lfn + pop eax + popad + mov [esp+36], eax + ret diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index b30c20b89..eae469c25 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -676,19 +676,12 @@ Параметры: * eax = 18 - номер функции * ebx = 6 - номер подфункции - * ecx определяет путь к файлу: - * 1 = в папке "/KOLIBRI" - * 2 = в корневом каталоге - * 3 = edx указывает на путь (имена папок в формате 8+3, - разделённые '/') + * ecx = указатель на строку с полным именем файла + (например, "/hd0/1/kolibri/kolibri.img") Возвращаемое значение: * eax = 0 - успешно * иначе eax = код ошибки файловой системы Замечания: - * Имя файла фиксировано, "kolibri.img" (глобальная переменная ядра - image_save из preboot.inc) - * На каком разделе какого диска файл будет сохранён, определяется - подфункцией 7 и подфункцией 8 функции 21. * Все папки в указанном пути должны существовать, иначе вернётся значение 5, "файл не найден". diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 83349cf1d..e723876e6 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -671,19 +671,12 @@ Returned value: Parameters: * eax = 18 - function number * ebx = 6 - subfunction number - * ecx defines path to the file: - * 1 = in the folder "/KOLIBRI" - * 2 = in the root folder - * 3 = edx points to the path (names of folders in the format 8+3, - divided by '/') + * ecx = pointer to the full path to file + (for example, "/hd0/1/kolibri/kolibri.img") Returned value: * eax = 0 - success * else eax = error code of the file system -╟рьхўрэш : - * Filename is fixed, "kolibri.img" (global kernel variable - 'image_save' from 'preboot.inc') - * Drive and partition are defined by subfunction 7 - and subfunction 8 of function 21. +Remarks: * All folders in the given path must exist, otherwise function returns value 5, "file not found". diff --git a/programs/system/cpu/trunk/cpu.asm b/programs/system/cpu/trunk/cpu.asm index 45a5fa3c7..54c720769 100644 --- a/programs/system/cpu/trunk/cpu.asm +++ b/programs/system/cpu/trunk/cpu.asm @@ -126,7 +126,7 @@ still_end: ;close program if we going to reboot close: - mov eax,-1 ; close this program + or eax,-1 ; close this program int 0x40 draw_next_process: @@ -479,19 +479,12 @@ draw_window: xor eax,eax ; function 0 : define and draw window mov ebx,[winxpos] ; [x start] *65536 + [x size] mov ecx,[winypos] ; [y start] *65536 + [y size] - mov edx,0x03ddffdd ;ffffff ; color of work area RRGGBB,8->color - mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl - mov edi,0x005080d0 ; color of frames RRGGBB + mov edx,0x13ddffdd ;ffffff ; color of work area RRGGBB,8->color + mov edi,header ; WINDOW CAPTION; int 0x40 - ; WINDOW CAPTION + mov eax,4 ; function 4 : write text to window - mov ebx,8*65536+8 ; [x start] *65536 + [y start] - mov ecx,0x10ffffff ; font 1 & color ( 0xF0RRGGBB ) - mov edx,labelt ; pointer to text beginning - mov esi,labellen-labelt ; text length - int 0x40 - mov ebx,22*65536+35 ; draw info text with function 4 xor ecx,ecx mov edx,text @@ -601,9 +594,7 @@ tbts_2 db '>' tbts_3 db 'START' tbte_2: -labelt: - db 'Prozesse - Ctrl/Alt/Del' -labellen: +header db 'Prozesse - Ctrl/Alt/Del',0 else if lang eq et text: @@ -617,9 +608,7 @@ tbts_2 db '>' tbts_3 db 'START' tbte_2: -labelt: - db 'Protsessid - Ctrl/Alt/Del' -labellen: +header db 'Protsessid - Ctrl/Alt/Del',0 else text: @@ -633,9 +622,7 @@ tbts_2 db '>' tbts_3 db 'RUN' tbte_2: -labelt: - db 'Processes - Ctrl/Alt/Del' -labellen: +header db 'Processes - Ctrl/Alt/Del',0 end if diff --git a/programs/system/end/trunk/end.asm b/programs/system/end/trunk/end.asm index 021d853de..936724265 100644 --- a/programs/system/end/trunk/end.asm +++ b/programs/system/end/trunk/end.asm @@ -29,19 +29,14 @@ do_draw: movzx ecx,ax shr eax,17 -; sub eax,110 shl eax,16 -; mov ebx,eax -; add ebx,220 lea ebx,[eax-110*10000h+220] shr ecx,1 -; sub ecx,50 shl ecx,16 -; add ecx,100 - sub ecx,50*10000h - 100 + sub ecx,50*10000h - 120 - mov eax,0 ; define and draw window + xor eax,eax ; define and draw window mov edx,[sc.work] mov esi,edx mov edi,edx @@ -51,11 +46,12 @@ do_draw: mov al,13 mcall ,18 shl 16+90,29 shl 16+27 push ebx - mcall ,121 shl 16+90, + mcall ,121 shl 16+90 xchg ebx,[esp] mcall ,,63 shl 16+27 pop ebx mcall + mcall ,179 shl 16+30,99 shl 16+15 xor edx,edx mov al,8 @@ -67,38 +63,38 @@ do_draw: mcall ,15 shl 16+87,60 shl 16+24,,0x9900 inc edx mcall ,118 shl 16+87,,,0xaaaaaa ;cccccc + inc edx + mcall ,175 shl 16+30,95 shl 16+15,,[sc.work_button] mov al,4 ; 0x00000004 = write text mov ebx,75*65536+10 mov ecx,[sc.work_text] ; 8b window nro - RR GG BB color - or ecx,0x10000000 + or ecx,0x90000000 mov edx,label1 ; pointer to text beginning - mov esi,label1_len ; text length int 0x40 - mov ecx,0xeeeeee ; 8b window nro - RR GG BB color - or ecx,0x10000000 + mov ebx,15*65536+101 + mov edx,label4 + int 0x40 + + mov ecx,0x90eeeeee ; 8b window nro - RR GG BB color mov ebx,25*65536+30 - mov edx,label2 ; pointer to text beginning - mov esi,label2_len ; text length + mov edx,label2 ; pointer to text beginning int 0x40 mov ebx,20*65536+64 - mov edx,label3 ; pointer to text beginning - mov esi,label3_len ; text length + mov edx,label3 int 0x40 mov ebx,45*65536+41 - mov edx,label4 ; pointer to text beginning - mov esi,label4_len ; text length + mov edx,label5 int 0x40 mov ebx,40*65536+75 - mov edx,label5 ; pointer to text beginning - mov esi,label5_len ; text length + mov edx,label6 int 0x40 - mov al,12 ; tell os about redraw end + mov al,12 ;end of redraw mov ebx,2 int 0x40 @@ -135,6 +131,8 @@ still: jz restart_kernel dec eax jz restart + dec eax + jnz run_rdsave ; we have only one button left, this is close button ; dec eax ; jnz still @@ -157,75 +155,67 @@ mcall_and_close: mcall 18,9 jmp close_1 +run_rdsave: + mov eax,70 + mov ebx,rdsave + int 0x40 + jmp still + data if lang eq ru - label1: - db 'ВАШ ВЫБОР:' - label1_len = $ - label1 - + db 'Ваш выбор:',0 label2: - db 'ВЫКЛЮЧИТЬ ЯДРО' - label2_len = $ - label2 - + db 'Выключить Ядро',0 label3: - db 'ПЕРЕЗАПУСК ОТМЕНА' - label3_len = $ - label3 + db 'Перезапуск Отмена',0 + label4: + db 'Сохранить настройки',0 else if lang eq en - label1: - db ' SELECT:' - label1_len = $ - label1 - + db ' SELECT:',0 label2: - db 'POWER OFF KERNEL' - label2_len = $ - label2 - + db 'POWER OFF KERNEL',0 label3: - db ' RESTART CANCEL' - label3_len = $ - label3 + db ' RESTART CANCEL',0 + label4: + db 'Save settings',0 else if lang eq et - label1: - db ' VALI:' - label1_len = $ - label1 - + db ' VALI:',0 label2: - db 'L▄LITA V─LJA KERNEL' - label2_len = $ - label2 - + db 'L▄LITA V─LJA KERNEL',0 label3: - db ' RESTART T▄HISTA' - label3_len = $ - label3 + db ' RESTART T▄HISTA',0 + label4: + db 'Save settings',0 else - label1: - db 'WAEHLEN:' - label1_len = $ - label1 - + db 'WAEHLEN:',0 label2: - db ' BEENDEN KERNEL' - label2_len = $ - label2 - + db ' BEENDEN KERNEL',0 label3: - db ' NEUSTART ABBRECHEN' - label3_len = $ - label3 + db ' NEUSTART ABBRECHEN',0 + label4: + db 'Save settings',0 end if - - label4: - db '(End) (Home)' - label4_len = $ - label4 - label5: - db '(Enter) (Esc)' - label5_len = $ - label5 - + db '(End) (Home)',0 + label6: + db '(Enter) (Esc)',0 +rdsave: + dd 7 + dd 0 + dd 0 + dd 0 + dd 0 + db '/rd/1/rdsave',0 udata sc system_colors diff --git a/programs/system/rdsave/trunk/editbox.inc b/programs/system/rdsave/trunk/editbox.inc new file mode 100644 index 000000000..28233e5d3 --- /dev/null +++ b/programs/system/rdsave/trunk/editbox.inc @@ -0,0 +1,978 @@ +; 01.02.2007 доработка edit_box, исправил баги. +; 26.01.2007 нормальная работа компонента исправил фукцию .check_offset +; 24.01.2007 пофиксил баги, вызванные неправильным кодом )). +; 22.01.2007 избавился от глюков при работе с выделением и удалением, корректная работа клавиш del & backspase +; 20.01.2007 реализовал выделение текста по shift +; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! +; 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а также алгоритм внесения символов. +; 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги +; 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода. +; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши +; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru +; Дата последних изменений: 13.06.06 10:40 +; Напишите в исходном коде своей программы use_edit_box, +; это вставит необходимые процедуры в код вашей программы. +; Процедуры: +; edit_box.draw - полная перерисовка; +; edit_box.key - обработка клавиатуры; +; edit_box.mouse - обработка мыши; +; edit_box.focus - установка фокуса; +; edit_box.blur - его размывание; +; edit_box.get_n - получить количество прорисовываемых символов. +; При вызове любых из этих процедур в регистре edi следует +; оставить указатель на структуру. +; Пример структуры: +; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text +; длина, высота, верх, цвет фона, цвет рамки, если выбран, +; цвет рамки, если не выбран, максимальное количество символов, +; указатель на буфер, где будут хранится символы. Буфер должен +; оканчиваться нулем, например если максимальное количество 255: +; some_edit_text: +; rb 256 ;255+1 + +; Пример вызова процедуры: +; mov edi,some_edit +; call edit_box.draw + +; При вызове процедуры edit_box.key код клавиши должен +; находится в ah, то есть перед вызовом этой процедуры надо вызвать +; 2-ую сисемную функцию, например: +; mov eax,2 +; int 0x40 +; mov edi,some_edit1 +; call edit_box.key +; mov edi,some_edit2 +; call edit_box.key +; Перед вызовом обработчика мыши следует проверить, является ли окно +; активным. +; Если щелчок мыши был пройзведен за пределами edit box +; фокус теряется. +macro use_edit_box +{ +edit_box: +ed_width equ [edi] ;ширина компонента +ed_left equ [edi+4] ;положение по оси х +ed_top equ [edi+8] ;положение по оси у +ed_color equ [edi+12] ;цвет фона компонента +ed_focus_border_color equ [edi+16] ;цвет рамки компонента +ed_blur_border_color equ [edi+20] ;цвет не активного компонента +ed_text_color equ [edi+24] ;цвет текста +ed_max equ [edi+28] ;кол-во символов которые можно максимально ввести +ed_text equ [edi+32] ;указатель на буфер +ed_flags equ [edi+36] ;флаги +ed_size equ [edi+38] ;кол-во символов +ed_pos equ [edi+42] ;позиция курсора +ed_offset equ [edi+46] ;смещение +cl_curs_x equ [edi+50] ;предыдущее координата курсора по х +cl_curs_y equ [edi+54] ;предыдущее координата курсора по у +ed_shift_pos equ [edi+58] +ed_height=14 ; высота +shift_color=0x6a9480 +ed_insert=10000b +ed_insert_cl=1111111111101111b +;========================================================== +;=== процедура прорисовки ================================= +;========================================================== +.draw: +pusha +;--- рисуем рамку --- + call .draw_border ; Функция стабильна +.draw_bg_cursor_text: +;--- изменяем смещение, если надо --- + call .check_offset ;вычисление позиции курсора стабильна +;--- рисуем внутреннюю область --- + call .draw_bg ;нарисовать прямоугольник рабочей области +.draw_cursor_text: +;--- рисуем курсор --- + ;--- может его не надо рисовать ---- + test word ed_flags,ed_focus + je @f + call .draw_cursor +@@: + call .draw_text +popa +ret + +;.str: +; mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число +; ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной +; cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax +; jb @f +; xor edx,edx ;очистить edx +; div ecx ;разделить - остаток в edx +; push edx ;положить в стек +; ;dec edi ;смещение необходимое для записи с конца строки +; call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx +; pop eax +; @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) +; ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает +; ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) +; or al,0x30 ;данная команда короче чем две выше +; stosb ;записать элемент из регистра al в ячеку памяти es:edi +; +; ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + +;---------------------------------------------------------- +;--- процедура прорисовки текста -------------------------- +;---------------------------------------------------------- +.draw_text: +;--- вычисляем, сколько помещается символов --- +;--- чтобы мусор не рисовать --- + call .get_n + mov esi,ed_size + mov ebx,ed_offset + sub esi,ebx + cmp eax,esi + jae @F + mov esi,eax ;чтобы не выходить за пределы экрана +;--- рисуем текст --- +@@: mov eax,4 + mov ebx,ed_left + mov edx,ed_offset + add ebx,2 + shl ebx,16 + mov bx,ed_top + add ebx,4 + mov ecx,ed_text_color + add edx,ed_text + int 0x40 +ret +;---------------------------------------------------------- +;--- процедура прорисовки фона ---------------------------- +;входные данные +;eax +;edx - color +;---------------------------------------------------------- +.draw_bg_eax: + mov ecx,ed_top + add ecx,1 + shl ecx,16 + mov cx,13 + mov eax,13 + int 0x40 +ret + + jmp @f +.draw_bg: + mov ebx,ed_left + add ebx,1 + shl ebx,16 + mov bx,ed_width + sub ebx,1 + +@@: + mov ecx,ed_top + mov eax,13 + add ecx,1 + shl ecx,16 + mov edx,ed_color + mov cx,ed_height + sub ecx,1 + int 0x40 +ret + +;---------------------------------------------------------- +;--- процедура получения количества символов в текущей щирине компонента -------------- +;---------------------------------------------------------- +.get_n: + mov eax,ed_width ;получем ширину компонента + xor edx,edx ;результат распологается в паре edx:eax в eax - остаток + sub eax,4 ;вычтим 4 + mov ebx,6 ;загрузми делитель + div ebx ;размделим на 6 +ret + +;---------------------------------------------------------- +;--- процедура рисования курсора -------------------------- +;---------------------------------------------------------- +.clear_cursor: + mov edx,ed_color + test word ed_flags,ed_shift + je @f + mov edx,shift_color +@@: + mov ebx,cl_curs_x + mov ecx,cl_curs_y + jmp .draw_curs +.draw_cursor: + + mov edx,ed_text_color +@@: + mov ebx,ed_pos + mov ecx,ed_offset + sub ebx,ecx + + lea ebx,[ebx*2+ebx] + shl ebx,1 + ;imul ebx,6 + add bx,ed_left + mov ecx,ed_top + inc ebx + add ecx,2 + mov ebp,ebx + shl ebx,16 + mov bx,bp + mov ebp,ecx + + shl ecx,16 + mov cx,bp + add cx,ed_height-4 + + mov cl_curs_x,ebx + mov cl_curs_y,ecx +.draw_curs: + mov eax,38 + int 0x40 +ret + +;---------------------------------------------------------- +;--- процедура рисования рамки ---------------------------- +;---------------------------------------------------------- +.draw_border: +;--- цвет рамки --- + test dword ed_flags,ed_focus + mov edx,ed_focus_border_color + jne @f + mov edx,ed_blur_border_color +@@: +;--- сверху --- + mov eax,38 + mov ebx,ed_left + mov ecx,ebx + shl ebx,16 + mov bx,cx + add bx,ed_width + mov ecx, ed_top + mov esi,ecx + shl ecx,16 + mov cx,si + int 0x40 + +;--- снизу --- + mov esi,ecx + add ecx,ed_height + mov ebp,ecx + shl ecx,16 + mov cx,bp + int 0x40 + +;--- слева --- + mov cx,si + mov ebp,ebx + sub bx,ed_width + int 0x40 + +;--- справа --- + mov ebx,ebp + shl ebx,16 + mov bx,bp + int 0x40 +ret +;---------------------------------------------------------- +;--- проверка, зашел ли курсор за границы и, если надо, --- +;--- изменяем смещение ------------------------------------ +;--- eax = -1, если не изменилось или eax = 0, если +; изменилось +;---------------------------------------------------------- +.check_offset: +pushad + mov ecx,ed_pos + mov ebx,ed_offset + cmp ebx,ecx + ja .sub_8 + + push ebx + call .get_n ;получим кол-во символов в паре регистров edx:eax + pop ebx + mov edx,ebx + add edx,eax ;ed_offset+width editbox + cmp edx,ecx + ja @f + + mov edx,ed_size + cmp edx,ecx + je .add_end + + sub edx,ecx + cmp edx,8 + jbe .add_8 + add ebx,8 + jmp .chk_d + +.sub_8: cmp ecx,0 + je .sub_min + cmp ebx,8 + jbe .sub_min + sub ebx,8 ;ebx=ed_offset + jmp .chk_d +.sub_min: + xor ebx,ebx + jmp .chk_d + +.add_end:sub edx,eax + mov ebx,edx + jmp .chk_d +.add_8: add ebx,edx + +; ;----------- отладка +; pushad +; mov [data_of_code],0 +; mov eax,ebx;ed_offset +; mov edi,data_of_code +; call .str +; ;рисование фона +; mov eax,13 +; mov ebx,178*65536+36 +; mov ecx,28*65536+10 +; xor edx,edx +; int 0x40 +; ;вывод значения на экран +; mov eax,4 +; mov ebx,180*65536+30 +; mov ecx,0x10DDBBCC +; mov edx,data_of_code +; mov esi,4 +; int 0x40 +; popad +; ;----------- отладка + +.chk_d: mov ed_offset,ebx + + call .draw_bg + mov dword [esp+28],-1 +popad + ret + +@@: + mov dword [esp+28],0 +popad + ret + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; mov ebx,eax +; mov eax,ed_pos +; xor edx,edx +; idiv ebx +; xor edx,edx +; imul eax,ebx +; mov ed_offset,eax +; pop ebx +; cmp ax,bx +; je @f +;;;;;;;; данные для закрашивания всей полосы прямоугольника +; mov ebx,ed_left +; inc ebx +; shl ebx,16 +; mov bx,ed_width +; dec ebx +; mov edx,ed_color +; call .draw_bg_eax +; mov dword [esp+28],0 +;@@: popad +; ret +;========================================================== +;=== обработка клавиатуры ================================= +;========================================================== +.key: +pusha + test word ed_flags,ed_focus ; если не в фокусе, выходим + je .no_figure ;@f + + xor ecx,ecx + push eax + inc ecx + mov eax,66 + mov ebx,3 + int 0x40 + test al,0x03 + je @f + or word ed_flags,ed_shift + +@@: pop eax +;---------------------------------------------------------- +;--- проверяем, что нажато -------------------------------- +;---------------------------------------------------------- + cmp ah,8 + jz .backspace + cmp ah,0xb6 + jz .delete + cmp ah,176 + jz .left + cmp ah,179 + jz .right + cmp ah,180 + jz .home + cmp ah,181 + jz .end + cmp ah,185 ;insert + jz .insert +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Заглушка на обработку клавиш вверх и вниз +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + cmp ah,177 + jz .no_figure + cmp ah,178 + jz .no_figure + cmp ah,27 ;ESC - клавиша )) + jz .no_figure +;--- нажата другая клавиша --- + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb .no_figure + cmp ah,'9' + ja .no_figure + + +;проверка на shift +@@: test word ed_flags,ed_shift_on + je @f + ;Входные данные edx=ed_size;ecx=ed_pos + push eax + mov edx,ed_size + mov ecx,ed_pos + call .del_char +;;;; + mov eax,ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + pop eax + + ; проверяем, находится ли курсор в конце +@@: mov ecx,ed_size + mov edx, ed_max + cmp ecx,edx + jae .no_figure + mov ebx, ed_pos + cmp ebx,edx + jl @f ; если меньше или равно +.no_figure: + popa + ret +.insert: test word ed_flags,ed_insert ;not word ed_insert + je .insert_1 + and word ed_flags,ed_insert_cl + jmp .no_figure +.insert_1: + or word ed_flags,ed_insert + jmp .no_figure +.ins_v: + dec dword [ebp+38];ed_size ;processing is insert + sub esi,ecx + add esi,ebx + mov edi,esi + jmp .In_k +@@: ; сдвигаем символы после курсора вправо + mov ecx,ed_size + push edi eax + mov ebp,edi + mov esi,ed_text ; Указатель на буфер + ;Будем работать со строкой + add esi,ecx ;add ed_size добавим max size + mov edi,esi + + cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + je .In_k + + test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp + jne .ins_v + + sub ecx,ebx ;Найдем кол-во символов для передвижения. + inc edi ;Сместим наши символы в право + std + inc ecx + @@: + ;-------- + lodsb + stosb + ;-------- + loop @b +.In_k: cld + pop eax + mov al,ah + stosb + pop edi +; вставляем код клавиши туда, где курсор + ; увеличиваем значение размера и позиции + inc dword ed_size + inc dword ed_pos + call .draw_all2 + jmp .shift;.draw_cursor_text +.delete: + mov edx,ed_size + mov ecx,ed_pos + cmp edx,ecx + jg .bac_del + test word ed_flags,ed_shift_on + jne .del_bac + popa + ret +.bac_del: + call .del_char + jmp .draw_all + +;--- нажата клавиша backspace --- +.backspace: + ; проверяем, курсор у левого края ? + mov edx,ed_size + mov ecx,ed_pos + test ecx,ecx + jnz .del_bac + test word ed_flags,ed_shift_on + jne .bac_del + popa + ret +.del_bac: + cmp edx,ecx ;if ed_pos=ed_size + je @f + dec ecx + call .del_char +@@: test word ed_flags,ed_shift_on + jne .bac_del + dec dword ed_pos + +.draw_all: + push .shift;.draw_cursor_text;eax + + test word ed_flags,ed_shift_on + je @f + mov eax,ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + jmp .draw_all2 + +@@: dec dword ed_size + +.draw_all2: + and word ed_flags,ed_shift_cl + call .clear_cursor + call .check_offset +;;;;;;;;;;;;;;; + test eax,eax + jne @f + call .draw_bg + ret +;;;;;;;;;;;;;;; +@@: call .get_n + push eax + mov ebx,ed_offset + add eax,ebx ;eax = w_off= ed_offset+width + mov ebx,ed_size + + cmp eax,ebx + jb @f + mov eax,ed_pos + sub ebx,eax + mov ecx,ed_offset + sub eax,ecx + jmp .nxt +@@: mov ebx,ed_pos + push ebx + sub eax,ebx + mov ebx,eax ;It is don't optimal + + pop eax ;ed_pos + mov ecx,ed_offset + sub eax,ecx + +.nxt: + mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины + add ebp,ebx + pop edx + cmp ebp,edx + je @f + inc ebx + +@@: mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,ed_color + call .draw_bg_eax + ret +; jmp .shift +;--- нажата клавиша left --- +.left: call .sh_enable + mov ebx,ed_pos + test ebx,ebx + jz .nd_k + call .clear_cursor + dec dword ed_pos + jmp .nd_k +;--- нажата клавиша right --- +.right: call .sh_enable + mov ebx,ed_pos + cmp ebx,ed_size + je .nd_k + call .clear_cursor + inc dword ed_pos + jmp .nd_k +.home: call .sh_enable + mov ebx,ed_pos + test ebx,ebx + jz .nd_k + call .clear_cursor + xor eax,eax + mov ed_pos,eax + jmp .nd_k + +.end: call .sh_enable + mov ebx,ed_pos + cmp ebx,dword ed_size + je .nd_k + call .clear_cursor + mov eax,ed_size + mov ed_pos,eax +.nd_k: call .check_offset + ;test eax,eax + ;jz .draw_bg_cursor_text + call .draw_cursor + +.shift: ;;;;;;;SHIFT + + call .draw_bg ;не оптимально + test word ed_flags,ed_shift + je .f_exit +;;;;;;SHIFT end + mov eax,dword ed_pos + mov ebx,dword ed_shift_pos + cmp eax,ebx + jae .sh_n + push eax ;меньшее в eax + push ebx ;большее + jmp .sh_n1 + ;если иначе +.sh_n: push ebx + push eax +.sh_n1: +; jmp .draw_all2 +;;;;;;;;;;;;;;;;;;;;;;;;; + ;call .clear_cursor + call .check_offset + call .get_n + mov edx,eax ;size of ed_box +; push eax + mov ecx,ed_offset + add eax,ecx ;eax = w_off= ed_offset+width + mov ebp,eax ;save + pop ebx ;большее + pop eax ;меньшее + + + cmp eax,ecx ;сравнение с меньшего с offset. + jae .f_f ;если больше + xor eax,eax + cmp ebp,ebx ;cравним размер w_off с большим + jb @f + sub ebx,ecx + jmp .nxt_f +@@: mov ebx,ebp + sub ebx,ecx + jmp .nxt_f + +.f_f: + sub eax,ecx + cmp ebp,ebx ;cравним размер w_off с большим + jle @f + sub ebx,ecx + sub ebx,eax + jmp .nxt_f +@@: + mov ebx,ebp + sub ebx,ecx + sub ebx,eax +.nxt_f: + mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,shift_color + call .draw_bg_eax + and word ed_flags,1111111111111011b + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;; + +.f_exit: and word ed_flags,ed_shift_cl + jmp .draw_cursor_text + +;проверка состояния shift был ли он нажат раньше? +.sh_enable: + test word ed_flags,ed_shift + je @f + test word ed_flags,ed_shift_on + jne .sh_ext_en + push dword ed_pos + pop dword ed_shift_pos + or word ed_flags,ed_shift_on + ret + +@@: and word ed_flags,ed_shift_cl +.sh_ext_en: ret + + ;- удаление символа + ;Входные данные edx=ed_size;ecx=ed_pos +.del_char: + mov esi,ed_text + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,esi + cmp eax,ecx + jae .dh_n + + mov ed_pos,eax ;что бы не было убегания курсора + mov ebp,ecx + sub ebp,eax + add ebx,eax ;eax меньше + sub edx,ecx + add esi,ecx + + + mov ed_shift_pos,ebp + jmp .del_ch_sh + ;если иначе +.dh_n: + mov ebp,eax + sub ebp,ecx + add ebx,ecx + sub edx,eax + add esi,eax + mov ed_shift_pos,ebp + jmp .del_ch_sh + +@@: add esi,ecx ;указатель + смещение к реальному буфферу + mov ebx,esi + inc esi + cld + + sub edx,ecx +.del_ch_sh: + + push edi + mov edi,ebx +@@: + lodsb + stosb + dec edx + jns @b + + pop edi + ret +;========================================================== +;=== обработка мыши ======================================= +;========================================================== +.mouse: +pusha +;---------------------------------------------------------- +;--- получаем состояние кнопок мыши ----------------------- +;---------------------------------------------------------- + mov eax,37 + mov ebx,2 + int 0x40 +;---------------------------------------------------------- +;--- проверяем состояние ---------------------------------- +;---------------------------------------------------------- + test eax,1 + jnz .mouse_left_button +@@: popa + ret + +.mouse_left_button: +;---------------------------------------------------------- +;--- получаем координаты мыши ----------------------------- +;---------------------------------------------------------- + mov eax,37 + xor ebx,ebx + inc ebx + int 0x40 +;---------------------------------------------------------- +;--- проверяем, попадает ли курсор в edit box ------------- +;---------------------------------------------------------- + mov ebx,ed_top + cmp ax,bx + jl ._blur;.mouse_end_no_focus + + add bx,ed_height + cmp ax,bx + jg ._blur;.mouse_end_no_focus + + shr eax,16 + + mov bx,ed_left + cmp ax,bx + jl ._blur;.mouse_end_no_focus + + add bx,ed_width + cmp ax,bx + jg ._blur;.mouse_end_no_focus +;--- изменяем позицию курсора --- + push eax + call .clear_cursor + pop eax + xor dx,dx + sub ax,ed_left + add ax,2 + mov bx,6 + div bx + add ax,ed_offset + cmp ax,ed_size + jna @f + mov ax,ed_size +@@: + mov ed_pos,ax + call .check_offset + call .draw_cursor +;---------------------------------------------------------- +;--- процедура установки фокуса --------------------------- +;---------------------------------------------------------- + bts word ed_flags,1 + jc .mouse_pressed + call .draw_cursor + call .draw_border +.mouse_pressed: +popa +ret +;.mouse_end_no_focus: +; call .blur +;popa +;ret +;.blur: +;pusha +._blur: + test word ed_flags,ed_always_focus + jne @f + btr word ed_flags,1 ; если не в фокусе, выходим + jnc @f + call .clear_cursor + call .draw_border +@@: +popa +ret + +;---------------------------------------------------------- +;--- процедура размывания фокуса -------------------------- +;---------------------------------------------------------- +;.blur: +;pusha +;._blur: + ;btr ed_flags,1 + ;jnc @f + ;call .draw_border + ;call .clear_cursor +;@@: +;popa +;ret +} +ed_figure_only=1000000000000000b +ed_always_focus=100000000000000b +ed_focus=10b +ed_shift_on=1000b +ed_shift=100b +ed_shift_cl=1111111111110011b +macro draw_edit_boxes start,end +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) +@@: + call edit_box.draw + add edi,ed_struc_size + loop @b +} + +macro mouse_edit_boxes start,end +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) +@@: + call edit_box.mouse + add edi,ed_struc_size + loop @b +} + +macro key_edit_boxes start,end +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) +@@: + call edit_box.key + add edi,ed_struc_size + loop @b +} +ed_struc_size=62 +struc edit_box width,left,top,color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size +{ +.width dd width +.left dd left +.top dd top +.color dd color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dw flags+0 +.size dd size+0 +.pos dd 0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +} + +macro edit_boxes_set_sys_color start,end,color_table +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) + mov esi,color_table +@@: + mov eax,[esi+36] + mov ebx,[esi+20] + mov ed_focus_border_color,eax + shr bh,1 + shr bl,1 + shr ah,1 + shr al,1 + add ah,bh + add al,bl + ror eax,16 + ror ebx,16 + shr bl,1 + shr al,1 + add al,bl + ror eax,16 + mov ed_blur_border_color,eax + add edi,ed_struc_size + loop @b +} + +macro draw_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.draw +} + +macro mouse_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.mouse +} + +macro key_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.key +} \ No newline at end of file diff --git a/programs/system/rdsave/trunk/rdsave.asm b/programs/system/rdsave/trunk/rdsave.asm index 352c42b38..6d6bdcbad 100644 --- a/programs/system/rdsave/trunk/rdsave.asm +++ b/programs/system/rdsave/trunk/rdsave.asm @@ -1,212 +1,334 @@ ; -; Save Ramdisk to HD and FD +; RDsave для Kolibri (0.6.5.0 и старше) +; ; Mario79 2005 -; Compile with FASM for Menuet +; Heavyiron 12.02.2007 ; - +; Компилировать FASM'ом +; +;--------------------------------------------------------------------- include 'lang.inc' include 'macros.inc' appname equ 'RDsave ' -version equ '1.1' +version equ '1.2' + + use32 ; включить 32-битный режим ассемблера + org 0x0 ; адресация с нуля - use32 - org 0x0 + db 'MENUET01' ; 8-байтный идентификатор MenuetOS + dd 0x01 ; версия заголовка (всегда 1) + dd START ; адрес первой команды + dd I_END ; размер программы + dd 0x1000 ; количество памяти + dd 0x1000 ; адрес вершины стэка + dd 0x0 ; адрес буфера для параметров (не используется) + dd 0x0 ; зарезервировано - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd 0x1000 ; memory for app - dd 0x1000 ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon +include 'editbox.inc' +use_edit_box +;--------------------------------------------------------------------- +;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- -;****************************************************************************** +START: + mov eax, 40 + mov ebx, 100111b + int 0x40 +red: ; перерисовать окно + call draw_window ; вызываем процедуру отрисовки окна - -START: ; start of execution - xor eax,eax - mov edi,bootpath - mov ecx,128 - rep stosd - - mcall 6,filename,0,-1,bootpath - - mov esi,bootpath+1 - mov cx,512 - start_search: - lodsb - cmp al,"'" - jz set_end_path - dec cx - cmp cx,0 - ja start_search - set_end_path: - mov [esi-1],byte 0 - - mov eax,40 - mov ebx,101b - int 0x40 - -red: - call draw_window +;--------------------------------------------------------------------- +;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- +;--------------------------------------------------------------------- still: - mov eax, 10 ; wait here for event + 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 - dec eax ; redraw request ? - je red -; dec eax -; dec eax ; button in buffer ? -; je button - - - button: ; button - mov eax,17 ; get id + cmp ah,1 ; кнопка с id=1("закрыть")? + jne noclose + or eax,-1 ; функция -1: завершить программу int 0x40 + +noclose: cmp ah,2 - jne ah_3 - mcall 18,6,1 - jmp red - ah_3: + 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 ah_4 - mcall 18,6,2 - jmp red - ah_4: + 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 ah_5 - mcall 18,6,3,bootpath+1 - jmp red - ah_5: - cmp ah,5 - jne ah_6 - mcall 16,1 - jmp red - ah_6: - cmp ah,6 - jne ah_1 - mcall 16,2 - jmp red - - ah_1: - cmp ah,1 - je exit + 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 - exit: - or eax,-1 ; close this program +key: + mov al,2 int 0x40 + key_edit_boxes editbox,editbox_end + jmp still -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* +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,48 + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + int 0x40 - mov eax, 12 ; function 12:tell os about windowdraw - mov ebx, 1 ; 1, start of draw - int 0x40 - ; DRAW WINDOW - mov eax, 0 ; function 0 : define and draw window - mov ebx, 200*65536+230 ; [x start] *65536 + [x size] - mov ecx, 200*65536+260 ; [y start] *65536 + [y size] - mov edx, [sc.work] ; color of work area RRGGBB,8->color gl - or edx,0x33000000 - mov edi,header ; WINDOW LABEL - int 0x40 + mov eax,12 ; функция 12: сообщить ОС об отрисовке окна + mov bl,1 ; 1 - начинаем рисовать + int 0x40 - mcall 8,<11,17>,<26,17>,2,[sc.work_button] - inc edx - mcall , ,<56,17>, , - inc edx - mcall , ,<86,17>, , - inc edx - mcall , ,<166,17>, , - inc edx - mcall , ,<196,17>, , + ; СОЗДАЁМ ОКНО + 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 - mov ecx,[sc.work_button_text] - or ecx,0x10000000 - mcall 4,<17,31>, ,text_123,1 - add ebx,30 - add edx,1 - mcall - add ebx,30 - add edx,1 - mcall - add ebx,80 - add edx,1 - mcall - add ebx,30 - add edx,1 - mcall +draw_edit_boxes editbox,editbox_end ;рисование edit box'ов - mov ecx,[sc.work_text] - or ecx,0x80000000 - mcall ,<40,31>, ,text_1, - add ebx,30 - mcall , , ,text_2, - add ebx,30 - mcall , , ,text_3, - mcall ,<15,115>, ,text_4, - mcall ,<35,125>, ,text_5, + mov al,13 ;отрисовка теней кнопок + mov ebx,194 shl 16 + 60 + mov ecx,34 shl 16 +15 + mov edx,0x444444 + int 0x40 - mcall ,<35,41>, ,text_6, - mcall ,<35,101>, ,text_6, - mcall ,<40,171>, ,text_7, - mcall ,<40,201>, ,text_8, - mcall ,<25,10>, ,text_9, - mcall ,<25,150>, ,text_10, + add ecx,20 shl 16 + int 0x40 - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - int 0x40 -ret + 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 +;--------------------------------------------------------------------- +;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- -text_123 db '12345' +header db appname,version,0 + +editbox: +edit1 edit_box 170,10,113,0xffffff,0,0,0,1024,path4,ed_focus +editbox_end: + +path1 db '/fd/1/',0 +path2 db '/fd/2/',0 +path3 db '/hd0/1/kolibri.img',0 if lang eq ru - -text_1 db 'В папку С:\KOLIBRI',0 -text_2 db 'В корень диска С',0 -text_3 db 'Путь в файле RD2HD.TXT',0 -text_4 db 'п.3 для резервного сохранения',0 -text_5 db 'т.к. в ядре его нет.',0 -text_6 db '(папка должна присутствовать)',0 -text_7 db 'На /FD/1',0 -text_8 db 'На /FD/2',0 -text_9 db 'Сохранение на жесткий диск:',0 -text_10 db 'Сохранение на дискету:',0 +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 - -text_1 db 'To the folder C:\KOLIBRI',0 -text_2 db 'To the root of C',0 -text_3 db 'To path in the file RD2HD.TXT',0 -text_4 db 'p.3 for backup, as the kernel',0 -text_5 db 'can not boot from there.',0 -text_6 db '(folder must exist)',0 -text_7 db 'To /FD/1',0 -text_8 db 'To /FD/2',0 -text_9 db 'Save to hard disk:',0 -text_10 db 'Save to floppy:',0 +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 -filename db 'RD2HD TXT' -I_END: -sc system_colors -bootpath: +;--------------------------------------------------------------------- + +I_END: ; метка конца программы + +sc system_colors +path4 rb 1025;1024+1 \ No newline at end of file