From 822a9715c4c461e2b2d8e417a91402ee9175dcd8 Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Fri, 2 Feb 2007 15:09:14 +0000 Subject: [PATCH] * Modified sysfunction 65 (see documentation), use new KFAR * Deleted useless sysfunction 59 (syscalls trace) * Load vmode.mdr via new file subsystem * KFar 0.2 git-svn-id: svn://kolibrios.org@314 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/const.inc | 2 - kernel/trunk/core/syscall.inc | 41 +--- kernel/trunk/docs/sysfuncr.txt | 79 +++---- kernel/trunk/docs/sysfuncs.txt | 78 +++---- kernel/trunk/kernel.asm | 57 +++--- kernel/trunk/memmap.inc | 3 +- kernel/trunk/video/vesa12.inc | 1 + kernel/trunk/video/vesa20.inc | 8 + kernel/trunk/vmodeld.inc | 14 +- programs/fs/kfar/trunk/dialogs.inc | 262 +++++++++++++++++++++--- programs/fs/kfar/trunk/kfar.asm | 317 +++++++++++++++++++++++------ programs/fs/kfar/trunk/tools.inc | 69 +++++++ 12 files changed, 658 insertions(+), 273 deletions(-) create mode 100644 programs/fs/kfar/trunk/tools.inc diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index b91a305336..be73d6594c 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -138,8 +138,6 @@ TASK_BASE equ OS_BASE+0x0003010 TASK_DATA equ OS_BASE+0x0003020 TASK_EVENT equ OS_BASE+0x0003020 -save_syscall_data equ OS_BASE+0x0005000 - ;mouseunder equ OS_BASE+0x0006900 FLOPPY_BUFF equ OS_BASE+0x0008000 ACTIVE_PROC_STACK equ OS_BASE+0x000A400 diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index 12ddc73e48..b739c182f3 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -14,16 +14,13 @@ i40: mov ds,ax mov es,ax - ; for syscall trace function - call save_registers - ; load all registers in crossed order - mov edi,[esp+28] ; eax - mov eax,[esp+16] ; ebx - mov ebx,[esp+24] ; ecx - mov ecx,[esp+20] ; edx - mov edx,[esp+4] ; esi - mov esi,[esp+0] ; edi + mov eax, ebx + mov ebx, ecx + mov ecx, edx + mov edx, esi + mov esi, edi + mov edi, [esp+28] ; enable interupts - a task switch or an IRQ _CAN_ interrupt i40 handler sti @@ -31,34 +28,12 @@ i40: and edi,0xff call dword [servetable+edi*4] pop eax - cli +; cli popad pop es ds iretd -align 4 -save_registers: - mov esi, [0x3010] - mov eax, [esi+TASKDATA.pid] ; load PID - lea esi, [esp+4] - inc [save_syscall_count] - mov edi,[save_syscall_count] - and edi,0xF - shl edi,6 - add edi,save_syscall_data+32 - mov [edi-32],eax - mov ecx,32 / 4 - cld - rep movsd - ret - -uglobal - save_syscall_count dd 0x0 -endg - -;label save_syscall_data dword at 0x5000 - iglobal ;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -127,7 +102,7 @@ iglobal dd undefined_syscall ; 56-reserved dd undefined_syscall ; 57-reserved dd file_system ; 58-Common file system interface - dd sys_trace ; 59-System call trace + dd undefined_syscall ; 59-reserved dd sys_IPC ; 60-Inter Process Communication dd sys_gs ; 61-Direct graphics access dd sys_pci ; 62-PCI functions diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 63e61289f9..1f112283f2 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1,4 +1,4 @@ -СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.6.3.0 +СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.6.4.0 Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". @@ -851,8 +851,8 @@ db a,b,c,d для версии a.b.c.d db UID_xxx: одно из UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 db 'name',0 - ASCIIZ-строка с именем -Для ядра Kolibri 0.6.3.0: -db 0,6,3,0 +Для ядра Kolibri 0.6.4.0: +db 0,6,4,0 db 2 db 'Kolibri',0 @@ -2716,6 +2716,21 @@ dword- * eax = 1 - порт свободен * ebx разрушается +====================================================================== +==== Функция 53, подфункция 10 - получить статус кабеля Ethernet. ==== +====================================================================== +Параметры: + * eax = 53 - номер функции + * ebx = 10 - номер подфункции +Возвращаемое значение: + * al = -1 - драйвер сетевой карты не загружен или + не поддерживает эту функцию + * al = 0 - кабель не подключён + * al = 1 - кабель подключён +Замечания: + * Текущая реализация ядра поддерживает эту функцию + только для сетевых карт RTL8139. + ====================================================================== Функция 53, подфункция 255 - отладочная информация сетевого драйвера. ====================================================================== @@ -3128,55 +3143,6 @@ dword- подсистемы можно определить размер кластера (там он хранится в секторах) и общее число кластеров для жёстких дисков. -====================================================================== -=== Функция 59 - получить информацию о последних системных вызовах. == -====================================================================== -Получает данные о всех системных вызовах всех процессов. -Параметры: - * eax = 59 - номер функции - * ebx = 0 - единственная подфункция - * ecx = указатель на буфер - * edx = размер буфера -Возвращаемое значение: - * eax = общее число системных вызовов, - сделанных с момента загрузки системы (по модулю 2^32) - * ebx = 0 -Формат информации об одном вызове: (размер = 0x40 = 64 байта) - * +0: dword: PID процесса/потока - * +4: 7*dword: мусор - * +32 = +0x20: dword: значение edi при вызове - * +36 = +0x24: dword: esi - * +40 = +0x28: dword: ebp - * +44 = +0x2C: dword: указатель стэка обработчика ядра - * +48 = +0x30: dword: ebx - * +52 = +0x34: dword: edx - * +56 = +0x38: dword: ecx - * +60 = +0x3C: dword: eax (=номер системной функции) -Замечания: - * Функция используется только в приложении systrace. - Довольно трудно представить ситуацию, в которой это приложение - или эта функция действительно полезны, а вот все системные вызовы - для поддержки этой функции несколько замедляются - (хотя и ненамного)... - * В связи с этим есть предложение поддержку этой функции - из ядра убрать совсем, вместе с приложением systrace. - * Информация о системных вызовах сохраняется в - системном кольцевом буфере на 0x10 входов. - Эта функция просто копирует указанный объём данных - из упомянутого буфера по указанному адресу. - * Какой из входов в буфере соответствует последнему вызову, - можно определить по значению eax, а именно, - вход (eax and 0xF) (по смещению (eax and 0xF)*0x40). - * В текущей реализации возможны редко встречающиеся - проблемы рассинхронизации, когда о некоторых вызовах - информация устаревает. - * Под системный буфер выделена страница, 4Кб. - Размер входа = 64 байта. - Почему используется только 16 входов - непонятно. - * Значение esp в момент системного вызова - этой функцией узнать нельзя. - * Проверки корректности edx в текущей реализации не делается. - ====================================================================== =========== Функция 60 - Inter Process Communication (IPC). ========== ====================================================================== @@ -3469,8 +3435,11 @@ IPC * ebx = указатель на изображение * ecx = [размер по оси x]*65536 + [размер по оси y] * edx = [координата по оси x]*65536 + [координата по оси y] - * esi = число бит на пиксель, должно быть 8 в текущей реализации - * edi = указатель на палитру (256 цветов 0x00RRGGBB) + * esi = число бит на пиксель, должно быть 8, 24 или 32 + * edi = указатель на палитру (256 цветов 0x00RRGGBB); + игнорируется при esi = 24 и 32 + * ebp = смещение данных каждой следующей строки изображения + относительно предыдущей Возвращаемое значение: * функция не возвращает значения Замечания: @@ -3480,6 +3449,8 @@ IPC * Каждый байт изображения рассматривается как индекс в палитре. * Если изображение использует не все 256 цветов, а меньше, размер палитры может быть меньше 256. + * Вызов функции 7 эквивалентен вызову этой функции с параметрами + esi=24, ebp=0. ====================================================================== ================= Функция 66 - работа с клавиатурой. ================= diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 2a9fdb4c32..514214d17b 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1,4 +1,4 @@ -SYSTEM FUNCTIONS of OS Kolibri 0.6.3.0 +SYSTEM FUNCTIONS of OS Kolibri 0.6.4.0 Number of the function is located in the register eax. The call of the system function is executed by "int 0x40" command. @@ -850,8 +850,8 @@ Structure of the buffer: db a,b,c,d for version a.b.c.d db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 db 'name',0 - ASCIIZ-string with the name -For Kolibri 0.6.3.0 kernel: -db 0,6,3,0 +For Kolibri 0.6.4.0 kernel: +db 0,6,4,0 db 2 db 'Kolibri',0 @@ -2692,6 +2692,21 @@ Returned value: * eax = 1 - port is free * ebx destroyed +====================================================================== +===== Function 53, subfunction 10 - query Ethernet cable status. ===== +====================================================================== +Parameters: + * eax = 53 - function number + * ebx = 10 - subfunction number +Returned value: + * al = -1 - a network driver is not loaded or + does not support this function + * al = 0 - Ethernet cable is unplugged + * al = 1 - Ethernet cable is plugged +Remarks: + * The current kernel implementation supports this function + only for RTL8139 network cards. + ====================================================================== = Function 53, subfunction 255 - debug information of network driver. ====================================================================== @@ -3100,55 +3115,6 @@ Remarks: it is stored in sectors) and total number of clusters for hard disks. -====================================================================== -=============== Function 59 - trace last system calls. =============== -====================================================================== -Gets data on all system calls of all processes. -Parameters: - * eax = 59 - function number - * ebx = 0 - unique subfunction - * ecx = pointer to the buffer - * edx = size of the buffer -Returned value: - * eax = total number of system calls made from system boot - (modulo 2^32) - * ebx = 0 -Format of information on one call: (size = 0x40 = 64 bytes) - * +0: dword: PID of process/thread - * +4: 7*dword: garbage - * +32 = +0x20: dword: value of edi at the call - * +36 = +0x24: dword: esi - * +40 = +0x28: dword: ebp - * +44 = +0x2C: dword: stack pointer of the kernel handler - * +48 = +0x30: dword: ebx - * +52 = +0x34: dword: edx - * +56 = +0x38: dword: ecx - * +60 = +0x3C: dword: eax (=number of system function) -Remarks: - * The function is used only in the application 'systrace'. - It is rather difficult to imagine a situation, in which - this application or this function are really useful; - and all system calls for support of this function are a little - decelerated (though not strongly)... - * So there is a proposition to delete from the kernel - support of this function, together with application 'systrace'. - * The information on system calls saves in the system - ring buffer with 0x10 entries. - This function simply copies the given size of data - from this buffer to the given address. - * One can determine, which entry in the buffer corresponds to - last system call, by value of eax, namely, it is the entry - (eax and 0xF) (at offset (eax and 0xF)*0x40). - * In the current implementation there can be the seldom - meeting problems of unsynchronization, when the information - on some calls becomes outdated. - * Under the system buffer one page, 4Kb, is allocated. - Size of an entry = 64 bytes. Why only 16 entries are used, - is not clearly. - * The value of esp at the moment of system call cannot - be determined by this function. - * The current implementation does not check edx for correctness. - ====================================================================== ========== Function 60 - Inter Process Communication (IPC). ========== ====================================================================== @@ -3436,8 +3402,10 @@ Parameters: * ebx = pointer to the image * ecx = [size on axis x]*65536 + [size on axis y] * edx = [coordinate on axis x]*65536 + [coordinate on axis y] - * esi = number of bits per pixel, must be 8 - * edi = pointer to palette (256 colors 0x00RRGGBB) + * esi = number of bits per pixel, must be 8, 24 or 32 + * edi = pointer to palette (256 colors 0x00RRGGBB); + ignored when esi = 24 and 32 + * ebp = offset of next row data relative to previous row data Returned value: * function does not return value Remarks: @@ -3447,6 +3415,8 @@ Remarks: * Each byte of image is index in the palette. * If the image uses less than 256 colors, palette size may be less than 256 too. + * The call to function 7 is equivalent to call to this function + with esi=24, ebp=0. ====================================================================== ================== Function 66 - work with keyboard. ================= diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 55bf26bc9a..7e116128ae 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -231,7 +231,7 @@ iglobal char2 db 'FONTS/CHAR2.MT',0 bootpath db '/KOLIBRI ' bootpath2 db 0 - vmode db 'VMODE MDR' + vmode db 'VMODE.MDR',0 vrr_m db '/rd/1/VRR_M',0 endg @@ -3977,7 +3977,7 @@ sys_putimage: add dx,word[edi+0x80000+APPDATA.wnd_clientbox.left] rol edx,16 .forced: - push esi ebp + push ebp esi 0 mov ebp, putimage_get24bpp mov esi, putimage_init24bpp sys_putimage_bpp: @@ -3996,7 +3996,7 @@ sys_putimage_bpp: inc [mouse_pause] call eax dec [mouse_pause] - pop ebp esi + pop ebp esi ebp jmp [draw_pointer] syscall_putimage_palette: @@ -4009,8 +4009,9 @@ sys_putimage_palette: ; ebx = pointer to image ; ecx = [xsize]*65536 + [ysize] ; edx = [xstart]*65536 + [ystart] -; esi = number of bits per pixel, must be 8 +; esi = number of bits per pixel, must be 8, 24 or 32 ; edi = pointer to palette +; ebp = row delta mov eax, [0x3000] shl eax, 8 add dx, word [eax+0x80000+APPDATA.wnd_clientbox.top] @@ -4018,10 +4019,27 @@ sys_putimage_palette: add dx, word [eax+0x80000+APPDATA.wnd_clientbox.left] rol edx, 16 .forced: - push esi ebp + push ebp esi ebp + cmp esi, 8 + jnz @f mov ebp, putimage_get8bpp mov esi, putimage_init8bpp jmp sys_putimage_bpp +@@: + cmp esi, 24 + jnz @f + mov ebp, putimage_get24bpp + mov esi, putimage_init24bpp + jmp sys_putimage_bpp +@@: + cmp esi, 32 + jnz @f + mov ebp, putimage_get32bpp + mov esi, putimage_init32bpp + jmp sys_putimage_bpp +@@: + pop ebp esi + ret putimage_init24bpp: lea eax, [eax*3] @@ -4041,6 +4059,13 @@ putimage_get8bpp: inc esi ret 4 +putimage_init32bpp: + shl eax, 2 + ret +putimage_get32bpp: + lodsd + ret 4 + ; eax x beginning ; ebx y beginning ; ecx x end @@ -4417,28 +4442,6 @@ sys_msg_board: -sys_trace: - - test eax, eax ; get event data - jnz no_get_sys_events - - mov esi,save_syscall_data ; data - mov edi,[0x3010] - mov edi,[edi+TASKDATA.mem_start] - add edi,ebx - cld - rep movsb - - mov [esp+24],dword 0 - mov eax,[save_syscall_count] ; count - mov [esp+36],eax - ret - - no_get_sys_events: - - ret - - sys_process_def: mov edi, [0x3000] diff --git a/kernel/trunk/memmap.inc b/kernel/trunk/memmap.inc index e7e0a3baf4..8f18ea6439 100644 --- a/kernel/trunk/memmap.inc +++ b/kernel/trunk/memmap.inc @@ -54,8 +54,7 @@ ; 3c dword cpu usage in cpu timer tics ; ; -; 5000 -> 5FFF save_syscall_data - syscall trace -; 6000 -> 68FF free +; 5000 -> 68FF free ; 6900 -> 6EFF saved picture under mouse pointer ; ; 6F00 -> 6FFF free diff --git a/kernel/trunk/video/vesa12.inc b/kernel/trunk/video/vesa12.inc index fb04d2b90a..380aa0836c 100644 --- a/kernel/trunk/video/vesa12.inc +++ b/kernel/trunk/video/vesa12.inc @@ -844,6 +844,7 @@ vesa12_putimage: pop edi add edi,[0xfe08] + add esi,[esp+32] dec ebx jnz newpi12 diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc index b673c6ff2f..eef05ffeed 100644 --- a/kernel/trunk/video/vesa20.inc +++ b/kernel/trunk/video/vesa20.inc @@ -82,6 +82,13 @@ virtual at esp .edi dd ? .esi dd ? .ebp dd ? + .esp dd ? + .ebx dd ? + .edx dd ? + .ecx dd ? + .eax dd ? + .ret_addr dd ? + .arg_0 dd ? end virtual align 16 @@ -164,6 +171,7 @@ vesa20_putimage: ;; imul eax, [putimg.source_bpp] ; lea eax, [eax + eax * 2] call esi + add eax, [putimg.arg_0] mov [putimg.line_increment], eax ; winmap new line increment diff --git a/kernel/trunk/vmodeld.inc b/kernel/trunk/vmodeld.inc index 0382221070..c84dcea7d8 100644 --- a/kernel/trunk/vmodeld.inc +++ b/kernel/trunk/vmodeld.inc @@ -10,18 +10,14 @@ ; -;vmode db 'VMODE MDR' ; MDR - Menuet Driver -; must be located after fonts filenames in kernel.asm - ; LOAD VIDEOMODE DRIVER ; If vmode.mdr file not found or eax,-1 ; Driver ID = -1 (not present in system) mov [0x760000],eax ; mov [0x760100],byte 0xC3 ; Instruction RETN - driver loop - mov eax,vmode ; File name of driver - mov esi,12 - mov ebx,0 - mov ecx,26000 - mov edx,0x760000 ; Memory position of driver - call fileread \ No newline at end of file + mov esi, vmode + xor ebx, ebx + mov ecx, 0x8000 ; size of memory area for driver + mov edx, 0x760000 ; Memory position of driver + call fs_RamdiskRead \ No newline at end of file diff --git a/programs/fs/kfar/trunk/dialogs.inc b/programs/fs/kfar/trunk/dialogs.inc index d6e115f709..f1f30ed0c2 100644 --- a/programs/fs/kfar/trunk/dialogs.inc +++ b/programs/fs/kfar/trunk/dialogs.inc @@ -3,6 +3,11 @@ virtual at 0 dlgtemplate: +; Флаги: +; бит 0: использовать стандартные цвета диалога +; бит 1: использовать стандартные цвета предупреждения/ошибки +; (если любой из этих битов установлен, поля main_color,border_color,header_color +; игнорируются) .flags dd ? .x dd ? .y dd ? @@ -58,7 +63,28 @@ GenericBox: or eax, -1 ret 8 .sizeok: +; set color if required + test byte [ebx+dlgtemplate.flags], 1 + jz @f + mov edi, dialog_colors + jmp .setcolor +@@: + test byte [ebx+dlgtemplate.flags], 2 + jz @f + mov edi, warning_colors +.setcolor: + mov al, [dialog_main_color-dialog_colors+edi] + mov [ebx+dlgtemplate.main_color], al + mov al, [dialog_border_color-dialog_colors+edi] + mov [ebx+dlgtemplate.border_color], al + mov al, [dialog_header_color-dialog_colors+edi] + mov [ebx+dlgtemplate.header_color], al +@@: ; allocate memory for data under dialog +; for 'No memory' dialog use static data area + mov ebp, nomem_dlgsavearea + cmp ebx, nomem_dlgdata + jz .allocated mov eax, [ebx+dlgtemplate.width] add eax, [ebx+dlgtemplate.border_size_x] add eax, [ebx+dlgtemplate.border_size_x] @@ -73,12 +99,12 @@ GenericBox: call mf_alloc test eax, eax jnz @f -; TODO: add error message popad or eax, -1 ret 8 @@: mov ebp, eax +.allocated: ; save data mov eax, [ebx+dlgtemplate.y] add eax, [ebx+dlgtemplate.height] @@ -402,8 +428,11 @@ GenericBox: push eax call restore_console_data call draw_keybar + cmp ebx, nomem_dlgdata + jz @f mov eax, ebp call mf_free +@@: or [cursor_x], -1 or [cursor_y], -1 call draw_image @@ -526,7 +555,7 @@ menu_centered_in: ; +44: dd begin_variant ; +48: dd end_variant ; +52: dd cur_variant_idx - call mf_alloc + call xmalloc test eax, eax jnz @f .ret_bad: @@ -995,9 +1024,10 @@ DialogBox: push ManagerDlgProc push dword [esp+8] call GenericBox - ret 8 + ret 4 ManagerDlgProc: + mov ebp, ebx mov eax, [esp+8] dec eax jz .draw @@ -1052,8 +1082,7 @@ ManagerDlgProc: mov eax, ebx ret 16 @@: - mov ebx, [esp+4] - add ebx, dlgtemplate.size+12 + lea ebx, [ebp+dlgtemplate.size+12] .enter_find: cmp [ebx+dlgitemtemplate.type], 2 jnz @f @@ -1077,8 +1106,7 @@ ManagerDlgProc: jnz .btn_found loop @b .find_first_btn: - mov ebx, [esp+4] - add ebx, dlgtemplate.size+12 + lea ebx, [ebp+dlgtemplate.size+12] @@: test [ebx+dlgitemtemplate.flags], 8 jnz .btn_found @@ -1087,7 +1115,7 @@ ManagerDlgProc: .btn_found: or byte [ebx+dlgitemtemplate.flags], 4 .ret_draw: - mov ebx, [esp+4] + mov ebx, ebp call .dodraw call draw_image xor eax, eax @@ -1097,8 +1125,7 @@ ManagerDlgProc: .up: jecxz .ret0 and byte [ebx+dlgitemtemplate.flags], not 4 - mov eax, [esp+4] - sub ecx, [eax+dlgtemplate.size+8] + sub ecx, [ebp+dlgtemplate.size+8] neg ecx jz .find_last_btn @@: @@ -1107,9 +1134,9 @@ ManagerDlgProc: loopz @b jnz .btn_found .find_last_btn: - mov ebx, [eax+dlgtemplate.size+8] + mov ebx, [ebp+dlgtemplate.size+8] imul ebx, dlgitemtemplate.size - lea ebx, [ebx+eax+dlgtemplate.size+12] + lea ebx, [ebx+ebp+dlgtemplate.size+12] @@: sub ebx, dlgitemtemplate.size test [ebx+dlgitemtemplate.flags], 8 @@ -1262,6 +1289,9 @@ ManagerDlgProc: draw_static_text: ; рисуем статический текст mov ah, [dialog_main_color] + test byte [ebp+dlgtemplate.flags], 2 + jz draw_text + mov ah, [warning_main_color] draw_text: ; определяем длину строки mov esi, [ebx+dlgitemtemplate.data] @@ -1299,13 +1329,12 @@ draw_text_esi: xor eax, eax .text_draw: push ecx - mov ecx, [esp+24] push eax mov eax, [ebx+dlgitemtemplate.x1] - add eax, [ecx+dlgtemplate.x] + add eax, [ebp+dlgtemplate.x] push edx mov edx, [ebx+dlgitemtemplate.y1] - add edx, [ecx+dlgtemplate.y] + add edx, [ebp+dlgtemplate.y] call get_console_ptr pop edx pop ecx @@ -1337,9 +1366,8 @@ draw_text_esi: stosw loop @b .ret: - mov ecx, [esp+20] - mov eax, [ecx+dlgtemplate.x] - mov edx, [ecx+dlgtemplate.y] + mov eax, [ebp+dlgtemplate.x] + mov edx, [ebp+dlgtemplate.y] add eax, [ebx+dlgitemtemplate.x2] inc eax add edx, [ebx+dlgitemtemplate.y1] @@ -1354,10 +1382,15 @@ draw_text_esi: ret draw_button: - mov ah, [dialog_normal_btn_color] + mov ecx, dialog_colors + test byte [ebp+dlgtemplate.flags], 2 + jz @f + mov ecx, warning_colors +@@: + mov ah, [dialog_normal_btn_color-dialog_colors+ecx] test [ebx+dlgitemtemplate.flags], 4 jz @f - mov ah, [dialog_selected_btn_color] + mov ah, [dialog_selected_btn_color-dialog_colors+ecx] @@: jmp draw_text @@ -1368,19 +1401,198 @@ draw_editbox: mov eax, [ebx+dlgitemtemplate.x1] add eax, [edx+4] sub eax, [edx+8] - mov ecx, [esp+16] - add eax, [ecx+dlgtemplate.x] + add eax, [ebp+dlgtemplate.x] mov [cursor_x], eax mov eax, [ebx+dlgitemtemplate.y1] - add eax, [ecx+dlgtemplate.y] + add eax, [ebp+dlgtemplate.y] mov [cursor_y], eax @@: - mov ah, [dialog_edit_color] + mov ecx, dialog_colors + test byte [ebp+dlgtemplate.flags], 2 + jz @f + mov ecx, warning_colors +@@: + mov ah, [dialog_edit_color-dialog_colors+ecx] test [ebx+dlgitemtemplate.flags], 10h jnz @f - mov ah, [dialog_unmodified_edit_color] + mov ah, [dialog_unmodified_edit_color-dialog_colors+ecx] @@: mov esi, [ebx+dlgitemtemplate.data] add esi, [edx+8] add esi, 12 jmp draw_text_esi + +; void __stdcall SayNoMem(void); +SayNoMem: + or dword [nomem_dlgdata+4], -1 + or dword [nomem_dlgdata+8], -1 + push nomem_dlgdata + call DialogBox + ret + +; int __stdcall SayErr(const char* title, int x, int y, +; int num_strings, const char* strings[], +; int num_buttons, const char* buttons[]); +; may be x=-1 and/or y=-1 +; [esp+4] = title +; [esp+8] = x +; [esp+12] = y +; [esp+16] = num_strings +; [esp+20] = strings +; [esp+24] = num_buttons +; [esp+28] = buttons +SayErr: + mov eax, [esp+16] + add eax, [esp+24] + imul eax, dlgitemtemplate.size + add eax, dlgtemplate.size+12 + call xmalloc + test eax, eax + jnz @f + or eax, -1 + ret 28 +@@: + pushad + mov ebx, eax + mov edi, eax + mov eax, 2 + stosd ; dlgtemplate.flags + mov eax, [esp+32+8] + stosd ; dlgtemplate.x + mov eax, [esp+32+12] + stosd ; dlgtemplate.y +; calculate width + mov ecx, [esp+32+16] + mov esi, [esp+32+20] + xor edx, edx +.calcwidth: + lodsd +@@: + inc eax + cmp byte [eax-1], 0 + jnz @b + sub eax, [esi-4] + inc eax + cmp edx, eax + ja @f + mov edx, eax +@@: + loop .calcwidth + mov ecx, [esp+32+24] + mov esi, [esp+32+28] + xor ebp, ebp +.calcwidth2: + lodsd +@@: + inc eax + cmp byte [eax-1], 0 + jnz @b + sub eax, [esi-4] + inc eax + add ebp, eax + loop .calcwidth2 + inc ebp + inc ebp + cmp edx, ebp + ja @f + mov edx, ebp +@@: + mov eax, [cur_width] + sub eax, 8 + cmp edx, eax + jb @f + mov edx, eax +@@: + mov eax, edx + stosd ; dlgtemplate.width + mov eax, [esp+32+16] + inc eax + stosd ; dlgtemplate.height + mov eax, 3 + stosd ; dlgtemplate.border_size_x + mov al, 2 + stosd ; dlgtemplate.border_size_y + mov eax, [esp+32+4] + stosd ; dlgtemplate.title + xor eax, eax + stosd ; (ignored) + stosd ; DlgProc + stosd ; userdata + mov eax, [esp+32+16] + add eax, [esp+32+24] + stosd ; num_items +; fill strings + xor ecx, ecx + mov esi, [esp+32+20] +@@: + mov eax, 1 + stosd ; dlgitemtemplate.type + dec eax + stosd ; dlgitemtemplate.x1 + mov eax, ecx + stosd ; dlgitemtemplate.y1 + lea eax, [edx-1] + stosd ; dlgitemtemplate.x2 + mov eax, ecx + stosd ; dlgitemtemplate.y2 + movsd ; dlgitemtemplate.data + mov eax, 1 + stosd ; dlgitemtemplate.flags + inc ecx + cmp ecx, [esp+32+16] + jb @b +; fill buttons + mov ecx, [esp+32+24] + mov esi, [esp+32+28] + sub edx, ebp + jc .big + shr edx, 1 + inc edx + jmp .fillbtns +.big: + xor edx, edx +.fillbtns: + mov eax, 2 + stosd ; dlgitemtemplate.type + mov eax, edx + stosd ; dlgitemtemplate.x1 + mov eax, [ebx+dlgtemplate.height] + dec eax + stosd ; dlgitemtemplate.y1 + push eax + lodsd + sub eax, edx +@@: + inc edx + cmp byte [eax+edx-1], 0 + jnz @b + mov eax, edx + inc edx + stosd ; dlgitemtemplate.x2 + pop eax + stosd ; dlgitemtemplate.y2 + mov eax, [esi-4] + stosd ; dlgitemtemplate.data + mov eax, 9 + cmp ecx, [esp+32+24] + jnz @f + or al, 4 +@@: + stosd ; dlgitemtemplate.flags + loop .fillbtns + push ebx + call DialogBox + cmp eax, -1 + jz @f + sub eax, ebx + sub eax, dlgtemplate.size+12 + xor edx, edx + mov ecx, dlgitemtemplate.size + div ecx + sub eax, [esp+32+16] +@@: + mov [esp+28], eax + mov eax, ebx + call mf_free + popad + ret 28 diff --git a/programs/fs/kfar/trunk/kfar.asm b/programs/fs/kfar/trunk/kfar.asm index 878bf23720..3651f5464c 100644 --- a/programs/fs/kfar/trunk/kfar.asm +++ b/programs/fs/kfar/trunk/kfar.asm @@ -14,6 +14,7 @@ include 'kglobals.inc' include 'memalloc.inc' include 'dialogs.inc' include 'viewer.inc' +include 'tools.inc' start: mov eax, mem @@ -61,14 +62,18 @@ start: mov eax, 8 call mf_alloc mov [screens], eax + test eax, eax + jz exit mov ecx, panels_vtable mov [eax], ecx mov [active_screen_vtable], ecx call draw_keybar call draw_cmdbar + mov [prev_dir], 0 mov ebp, panel1_data call read_folder call draw_panel + mov [bSilentFolderMode], 1 mov ebp, panel2_data call read_folder call draw_panel @@ -112,7 +117,7 @@ redraw: int 0x40 xor eax, eax ; ebx, ecx, edi are ignored by function 0 after first redraw - mov edx, 0x13000000 + mov edx, 0x53000000 int 0x40 mov al, 12 inc ebx @@ -121,6 +126,7 @@ redraw: @@: xor ecx, ecx mov eax, [ebx+42] + mov [wnd_width], eax sub eax, 5*2-1 jae @f xor eax, eax @@ -143,8 +149,10 @@ redraw: setnz cl or cl, ch test edx, edx + mov [fill_width], edx setnz ch mov eax, [ebx+46] + mov [wnd_height], eax sub eax, [skinh] sub eax, 5-1 jns @f @@ -163,6 +171,7 @@ redraw: mov eax, 255 mov cl, 1 @@: + mov [fill_height], edx cmp eax, [cur_height] mov [cur_height], eax jnz .resize @@ -405,9 +414,8 @@ ctrlkey_test4: setz al ret -; TODO: add "no memory" error handling new_screen: - call mf_alloc + call xmalloc test eax, eax jnz @f ret @@ -417,7 +425,7 @@ new_screen: inc ebx shl ebx, 3 mov eax, [screens] - call mf_realloc + call xrealloc test eax, eax jnz @f mov eax, ebp @@ -461,7 +469,7 @@ delete_active_screen: mov ebx, [num_screens] shl ebx, 3 mov eax, [screens] - call mf_realloc + call mf_realloc ; must succeed, because we decrease size pop eax call mf_free and [active_screen], 0 @@ -484,7 +492,7 @@ F12: add eax, 8 mov esi, eax mul [num_screens] - call mf_alloc + call xmalloc test eax, eax jnz @f ret @@ -737,11 +745,16 @@ panels_OnKey: cmp byte [esi+2], 0 jz .dotdot @@: - lea edi, [ebp + panel1_dir - panel1_data] - mov al, 0 - or ecx, -1 - repnz scasb - dec edi + push esi + lea esi, [ebp + panel1_dir - panel1_data] + mov edi, prev_dir +@@: + lodsb + stosb + test al, al + jnz @b + lea edi, [esi-1] + pop esi mov al, '/' cmp [edi-1], al jz @f @@ -879,7 +892,7 @@ panels_OnKey: test eax, eax jnz .drive_loop_i_done mov eax, 32+8 - call mf_alloc + call xmalloc test eax, eax jz .drive_loop_i_done jecxz @f @@ -951,6 +964,12 @@ panels_OnKey: jz .ret2 lea esi, [eax+8] lea edi, [ebp + panel1_dir - panel1_data] + push ecx esi edi + mov esi, edi + mov edi, prev_dir + mov ecx, 1024/4 + rep movsd + pop edi esi ecx @@: lodsb stosb @@ -1068,12 +1087,6 @@ panels_OnKey: mov [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax add eax, aCancelBLength - 1 mov [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax - mov al, [dialog_border_color] - mov [ebx + dlgtemplate.border_color], al - mov al, [dialog_header_color] - mov [ebx + dlgtemplate.header_color], al - mov al, [dialog_main_color] - mov [ebx + dlgtemplate.main_color], al mov byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC and byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4 and byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4 @@ -1292,12 +1305,6 @@ panels_OnKey: mov [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.cnl_x1], eax add eax, aCancelLength - 1 mov [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.cnl_x2], eax - mov al, [dialog_border_color] - mov [ebx + dlgtemplate.border_color], al - mov al, [dialog_header_color] - mov [ebx + dlgtemplate.header_color], al - mov al, [dialog_main_color] - mov [ebx + dlgtemplate.main_color], al or byte [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.flags1], 4 and byte [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.flags2], not 4 push ebx @@ -1428,7 +1435,7 @@ panels_OnKey: mov eax, ecx @@: add eax, 12 - call mf_alloc + call xmalloc test eax, eax jz .menucreated add eax, 4 @@ -1661,28 +1668,38 @@ draw_window: imul ecx, font_height lea ecx, [eax+ecx+5-1+100*65536] xor eax, eax - mov edx, 0x13000000 + mov edx, 0x53000000 mov edi, header int 40h - mov al, 48 - push 3 - pop ebx - mov ecx, std_colors - push 40 - pop edx - int 40h -; mov bl, 7 -; int 40h -; xor ax, ax -; shr ebx, 16 -; or ebx, eax -; mov ecx, [std_colors+16] -; mov edx, header -; push header.length -; pop esi -; push 4 -; pop eax -; int 40h + mov al, 13 + xor edx, edx + cmp [fill_width], 0 + jz @f + mov ebx, [wnd_width] + sub ebx, [fill_width] + sub ebx, 5-1 + shl ebx, 16 + mov bx, word [fill_width] + mov ecx, [skinh-2] + mov cx, word [wnd_height] + sub cx, word [skinh] + sub cx, 5-1 + int 0x40 +@@: + cmp [fill_height], 0 + jz @f + mov al, 13 + xor edx, edx + mov ebx, 50000h + mov bx, word [wnd_width] + sub ebx, 9 + mov ecx, [wnd_height] + sub ecx, [fill_height] + sub ecx, 5-1 + shl ecx, 16 + mov cx, word [fill_height] + int 0x40 +@@: ; xor ecx, ecx ; call draw_image and [min_x], 0 @@ -1935,6 +1952,7 @@ end if push 8 pop esi mov edi, console_colors + xor ebp, ebp int 0x40 push 64 pop eax @@ -2611,6 +2629,7 @@ read_folder: mov [dirinfo.dirdata], eax lea eax, [ebp + panel1_dir - panel1_data] mov [dirinfo.name], eax +.retry: push 70 pop eax mov ebx, dirinfo @@ -2619,23 +2638,77 @@ read_folder: jz .ok cmp eax, 6 jz .ok -; TODO: add error handling - mov [ebp + panel1_numfiles - panel1_data], 2 - mov eax, [ebp + panel1_nfa - panel1_data] - shl eax, 2 - add eax, [ebp + panel1_files - panel1_data] - add eax, 32+40 - mov word [eax], '..' - mov byte [eax+2], 0 - add eax, 304 - mov dword [eax], 'Read' - mov dword [eax+4], ' err' - mov dword [eax+8], 'or' - mov eax, [ebp + panel1_files - panel1_data] - mov dword [eax], 0 - mov dword [eax+4], 304 +; Failed to read folder, notify user + cmp [bSilentFolderMode], 0 + jnz .dont_notify + push aContinue + push aRetry + mov edx, esp + call get_error_msg + push [dirinfo.name] + push aCannotReadFolder + push eax + mov eax, esp + push edx + push 2 + push eax + push 3 + push -1 + push -1 + push aError + call SayErr + add esp, 5*4 + test eax, eax + jz .retry +.dont_notify: + mov esi, prev_dir + cmp byte [esi], 0 + jz @f + lea edi, [ebp + panel1_dir - panel1_data] + mov ecx, 1024/4 + rep movsd + mov byte [prev_dir], 0 + ret +@@: + mov [bSilentFolderMode], 1 ; enter silent mode + mov esi, [dirinfo.name] + xor edx, edx +.up1: + lodsb + test al, al + jz .up1done + cmp al, '/' + jnz .up1 + inc edx + lea edi, [esi-1] + jmp .up1 +.up1done: + cmp edx, 2 + jbe .noup + stosb + jmp read_folder +.noup: + mov esi, [dirinfo.name] + mov edi, esi + lodsd + or eax, 0x00202000 + cmp eax, '/rd/' + jnz @f + lodsw + cmp ax, '1' + jz .nosetrd +@@: + mov eax, '/rd/' + stosd + mov ax, '1' + stosw + jmp read_folder +.nosetrd: +; Даже рамдиск не прочитался. Значит, не судьба... + and dword [ebp + panel1_numfiles - panel1_data], 0 and dword [ebp + panel1_index - panel1_data], 0 and dword [ebp + panel1_start - panel1_data], 0 + mov [bSilentFolderMode], 0 ; leave silent mode ret .ok: mov eax, [dirinfo.dirdata] @@ -2651,11 +2724,10 @@ read_folder: push eax imul eax, 4+304 add eax, 32 - call mf_alloc + call xmalloc test eax, eax jnz .succ1 pop eax -; TODO: add error handling jmp .readdone .succ1: mov [ebp + panel1_files - panel1_data], eax @@ -2746,6 +2818,7 @@ sort_files: mov edx, [ebp + panel1_files - panel1_data] mov ecx, [ebp + panel1_numfiles - panel1_data] call sort + mov [bSilentFolderMode], 0 ; leave silent mode ret compare_name: @@ -3934,7 +4007,7 @@ find_extension: pop esi ret -header db 'Kolibri Far 0.19',0 +header db 'Kolibri Far 0.2',0 nomem_draw db 'No memory for redraw.',0 .size = $ - nomem_draw @@ -3942,6 +4015,8 @@ nomem_draw db 'No memory for redraw.',0 def_left_dir db '/rd/1',0 def_right_dir db '/hd0/1',0 +bSilentFolderMode db 1 + if lang eq ru aFolder db 'Папка' .size = $-aFolder @@ -4310,6 +4385,8 @@ cur_width dd 80 cur_height dd 25 saved_width dd -1 saved_height dd -1 +fill_width dd 0 +fill_height dd 0 max_width = 256 max_height = 256 console_data_ptr dd 0 @@ -4368,6 +4445,25 @@ viewer_vtable: dd keybar_viewer dd viewer_getname +; additions to this table require changes in tools.inc::get_error_msg +errors1: + dd error0msg + dd error1msg + dd error2msg + dd error3msg + dd error4msg + dd error5msg + dd error6msg + dd error7msg + dd error8msg + dd error9msg + dd error10msg + dd error11msg +errors2: + dd error30msg + dd error31msg + dd error32msg + encodings: .cp866 = 0 .cp1251 = 1 @@ -4565,13 +4661,24 @@ panel_active_header_color db 30h column_header_color db 1Eh panel_nscreens_color db 0Bh ; Диалоги +dialog_colors: dialog_main_color db 70h dialog_border_color db 70h dialog_header_color db 70h -dialog_normal_btn_color db 70h -dialog_selected_btn_color db 30h dialog_edit_color db 30h dialog_unmodified_edit_color db 38h +dialog_normal_btn_color db 70h +dialog_selected_btn_color db 30h +; Предупреждения и ошибки +warning_colors: +; !!! должны быть те же поля и в том же порядке, что и для обычных диалогов !!! +warning_main_color db 4Fh +warning_border_color db 4Fh +warning_header_color db 4Fh +warning_edit_color db 30h +warning_unmodified_edit_color db 38h +warning_normal_btn_color db 4Fh +warning_selected_btn_color db 70h ; Меню menu_normal_color db 3Fh menu_selected_color db 0Fh @@ -4754,8 +4861,33 @@ bWasE0 db 0 ctrlstate db 0 align 4 -f8_confirm_dlgdata: +; Сообщение о обломе при выделении памяти +nomem_dlgdata: + dd 2 + dd -1 + dd -1 + dd 12 + dd 2 + dd 1 + dd 1 + dd aError + rb 4 dd 0 + dd 0 + dd 2 +; строка "No memory" + dd 1 + dd 1,0,10,0 + dd aNoMemory + dd 1 +; кнопка "Ok" + dd 2 + dd 4,1,7,1 + dd aOk + dd 0xD + +f8_confirm_dlgdata: + dd 1 .x dd -1 .y dd -1 .width dd ? @@ -4804,7 +4936,7 @@ f8_confirm_dlgdata: ; диалог копирования copy_dlgdata: - dd 0 + dd 1 .x dd -1 .y dd -1 .width dd ? @@ -4869,6 +5001,26 @@ aCopy db '[ aCopyLength = $ - aCopy - 1 aCopy1 db 'Копировать "',0 aCopy2 db '" в:',0 +aError db 'Ошибка',0 +aContinue db 'Продолжить',0 +aRetry db 'Повторить',0 +error0msg db 'Странно... Нет ошибки',0 +error1msg db 'Странно... Не определена база и/или раздел жёсткого диска',0 +error2msg db 'Функция не поддерживается для данной файловой системы',0 +error3msg db 'Неизвестная файловая система',0 +error4msg db 'Странно... Ошибка 4',0 +error5msg db 'Файл не найден',0 +error6msg db 'Файл закончился',0 +error7msg db 'Странно... Указатель вне памяти приложения',0 +error8msg db 'Диск заполнен',0 +error9msg db 'Файловая структура разрушена',0 +error10msg db 'Доступ запрещён',0 +error11msg db 'Ошибка устройства',0 +error30msg db 'Недостаточно памяти',0 +error31msg db 'Файл не является исполняемым',0 +error32msg db 'Слишком много процессов',0 +aUnknownError db 'Неизвестный код ошибки: ',0 +aCannotReadFolder db 'Не могу прочитать папку',0 else aDeleteCaption db 'Delete',0 aConfirmDeleteText db 'Do you wish to delete ',0 @@ -4886,7 +5038,29 @@ aCopy db '[ Copy ]',0 aCopyLength = $ - aCopy - 1 aCopy1 db 'Copy "',0 aCopy2 db '" to:',0 +aError db 'Error',0 +aContinue db 'Continue',0 +aRetry db 'Retry',0 +error0msg db 'Strange... No error',0 +error1msg db 'Strange... Hard disk base and/or partition not defined',0 +error2msg db 'The file system does not support this function',0 +error3msg db 'Unknown file system',0 +error4msg db 'Strange... Error 4',0 +error5msg db 'File not found',0 +error6msg db 'End of file',0 +error7msg db 'Strange... Pointer lies outside of application memory',0 +error8msg db 'Disk is full',0 +error9msg db 'File structure is destroyed',0 +error10msg db 'Access denied',0 +error11msg db 'Device error',0 +error30msg db 'Not enough memory',0 +error31msg db 'File is not executable',0 +error32msg db 'Too many processes',0 +aUnknownError db 'Unknown error code: ',0 +aCannotReadFolder db 'Cannot read folder',0 end if +aOk db 'OK',0 +aNoMemory db 'No memory!',0 execinfo: dd 7 @@ -4941,6 +5115,8 @@ panel2_dir rb 1024 ;console_data rb max_width*max_height*2 +nomem_dlgsavearea rb (12+4)*(3+3)*2 + cur_header rb max_width tmp dd ? @@ -4954,6 +5130,9 @@ max_x dd ? used_width dd ? used_height dd ? +wnd_width dd ? +wnd_height dd ? + column_left dd ? column_top dd ? column_width dd ? @@ -4967,6 +5146,10 @@ saved_file_name: procinfo rb 1024 lower_file_name = procinfo + 512 +error_msg rb 128 + +prev_dir rb 1024 + driveinfo rb 32+304 tmpname rb 32 diff --git a/programs/fs/kfar/trunk/tools.inc b/programs/fs/kfar/trunk/tools.inc new file mode 100644 index 0000000000..527299cf6b --- /dev/null +++ b/programs/fs/kfar/trunk/tools.inc @@ -0,0 +1,69 @@ +xmalloc: +; in: eax=size +; out: eax=pointer or NULL + call mf_alloc +.common: + test eax, eax + jnz @f + call SayNoMem + xor eax, eax +@@: + ret + +xrealloc: +; in: eax=pointer, ebx=new size +; out: eax=pointer or NULL + call mf_realloc + jmp xmalloc.common + +get_error_msg: +; in: eax=error code +; out: eax=pointer to message (in static buffer) + push esi edi + mov edi, error_msg + cmp eax, 11 + ja .no1 + mov esi, [errors1+eax*4] + jmp .copy +.no1: + cmp eax, 30 + jb .no2 + cmp eax, 32 + ja .no2 + mov esi, [errors2+(eax-30)*4] +.copy: + lodsb + stosb + test al, al + jnz .copy +.ret: + mov eax, error_msg + pop edi esi + ret +.no2: + mov esi, aUnknownError + push eax +@@: + lodsb + stosb + test al, al + jnz @b + pop eax + push edx ecx + test eax, eax + jns @f + mov byte [edi], '-' + inc edi + neg eax +@@: + xor edx, edx + mov ecx, 10 + div ecx + add edx, '0' + mov byte [edi], dl + inc edi + test eax, eax + jnz @b + pop ecx edx + stosb + jmp .ret