diff --git a/kernel/branches/gfx_kernel/blkdev/rd.inc b/kernel/branches/gfx_kernel/blkdev/rd.inc index 5e2f7c4219..ea37c5413f 100644 --- a/kernel/branches/gfx_kernel/blkdev/rd.inc +++ b/kernel/branches/gfx_kernel/blkdev/rd.inc @@ -1788,6 +1788,7 @@ fs_RamdiskRewrite: sub ebx, edx mov [edi+28], ebx add esp, 20 + mov [esp+16], ebx popad xor eax, eax ret @@ -1797,6 +1798,7 @@ fs_RamdiskRewrite: sub ebx, edx mov [edi+28], ebx add esp, 20 + mov [esp+16], ebx popad push ERROR_DISK_FULL pop eax @@ -1820,6 +1822,230 @@ fs_RamdiskRewrite: loop .read_symbols ret +;---------------------------------------------------------------- +; +; fs_RamdiskWrite - LFN variant for writing to sys floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- +@@: + push ERROR_ACCESS_DENIED +fs_RamdiskWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_RamdiskWrite: + cmp byte [esi], 0 + jz @b + pushad + call rd_find_lfn + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; must not be directory + test byte [edi+11], 10h + jz @f + popad + push ERROR_ACCESS_DENIED + jmp .ret0 +@@: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push 0 ; return value=0 + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call ramdisk_extend_file + jnc .length_ok +; ramdisk_extend_file can return two error codes: FAT table error or disk full. +; First case is fatal error, in second case we may write some data + mov [esp], eax + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + mov [esp+28], eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + pop eax + mov [esp+28], eax ; eax=return value + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret + movzx edi, word [edi+26] ; starting cluster +.write_loop: + sub ebx, 0x200 + jae .next_cluster + push ecx + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: + mov eax, edi + shl eax, 9 + add eax, 0x100000+31*512+0x200 + sub eax, ebx + mov ebx, eax + mov eax, edx + call memmove + xor ebx, ebx + add edx, ecx + sub [esp], ecx + pop ecx + jz .ret +.next_cluster: + movzx edi, word [edi*2+0x280000] + jmp .write_loop + +ramdisk_extend_file.zero_size: + xor eax, eax + jmp ramdisk_extend_file.start_extend + +; extends file on ramdisk to given size, new data area is filled by 0 +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL) +ramdisk_extend_file: + push ecx +; find the last cluster of file + movzx eax, word [edi+26] ; first cluster + mov ecx, [edi+28] + jecxz .zero_size +@@: + sub ecx, 0x200 + jbe @f + mov eax, [eax*2+0x280000] + and eax, 0xFFF + jz .fat_err + cmp eax, 0xFF8 + jb @b +.fat_err: + pop ecx + push ERROR_FAT_TABLE + pop eax + stc + ret +@@: + push eax + mov eax, [eax*2+0x280000] + and eax, 0xFFF + cmp eax, 0xFF8 + pop eax + jb .fat_err +; set length to full number of sectors and make sure that last sector is zero-padded + sub [edi+28], ecx + push eax edi + mov edi, eax + shl edi, 9 + lea edi, [edi+0x100000+31*512+0x200+ecx] + neg ecx + xor eax, eax + rep stosb + pop edi eax +.start_extend: + pop ecx +; now do extend + push edx esi + mov esi, 0x280000+2*2 ; start scan from cluster 2 + mov edx, 2847 ; number of clusters to scan +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new sector + push ecx + mov ecx, edx + push edi + mov edi, esi + jecxz .disk_full + push eax + xor eax, eax + repnz scasw + pop eax + jnz .disk_full + mov word [edi-2], 0xFFF + mov esi, edi + mov edx, ecx + sub edi, 0x280000 + shr edi, 1 + dec edi ; now edi=new cluster + test eax, eax + jz .first_cluster + mov [0x280000+eax*2], di + jmp @f +.first_cluster: + pop eax ; eax->direntry + push eax + mov [eax+26], di +@@: + push edi + shl edi, 9 + add edi, 0x100000+31*512 + xor eax, eax + mov ecx, 512/4 + rep stosd + pop eax ; eax=new cluster + pop edi ; edi->direntry + pop ecx ; ecx=required size + add dword [edi+28], 0x200 + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop esi edx + clc + ret +.disk_full: + pop edi ecx + pop esi edx + stc + push ERROR_DISK_FULL + pop eax + ret + fs_RamdiskGetFileInfo: cmp byte [esi], 0 jnz @f diff --git a/kernel/branches/gfx_kernel/docs/sysfuncr.txt b/kernel/branches/gfx_kernel/docs/sysfuncr.txt index 727e4163e0..7b716d0f01 100644 --- a/kernel/branches/gfx_kernel/docs/sysfuncr.txt +++ b/kernel/branches/gfx_kernel/docs/sysfuncr.txt @@ -29,7 +29,7 @@ (игнорируется для стиля Y=2) * X = DCBA (биты) * A = 1 - у окна есть заголовок; для стиля Y=3 адрес строки - заголовка зада╕тся в edi, для прочих стилей + заголовка задаётся в edi, для прочих стилей используется подфункция 1 функции 71 * B = 1 - координаты всех графических примитивов задаются относительно клиентской области окна @@ -89,11 +89,11 @@ * Вид окна стиля Y=1: * полностью определяется приложением * Вид окна типа II: - * рисуется внешняя рамка шириной 1 пиксель "затен╕нного" цвета + * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета edi (все составляющие цвета уменьшаются в два раза) * рисуется промежуточная рамка шириной 3 пикселя цвета edi * рисуется внутренняя рамка шириной 1 пиксель - "затен╕нного" цвета edi + "затенённого" цвета edi * рисуется заголовок - прямоугольник с левым верхним углом (4,4) и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi (с учетом градиента) @@ -151,7 +151,7 @@ Замечания: * Существует общесистемный буфер нажатых клавиш размером 120 байт, организованный как очередь. - * Существует ещ╕ один общесистемный буфер на 120 "горячих клавиш". + * Существует ещё один общесистемный буфер на 120 "горячих клавиш". * При вызове этой функции приложением с неактивным окном считается, что буфер нажатых клавиш пуст. * По умолчанию эта функция возвращает ASCII-коды; переключиться на @@ -200,7 +200,7 @@ Замечания: * Выводятся либо первые (esi and 0xFF) символов, либо все символы до (но не включая) завершающего нуля - (для ASCIIZ-строк) в зависимости от того, что произойд╕т раньше. + (для ASCIIZ-строк) в зависимости от того, что произойдёт раньше. * Первый системный шрифт считывается при загрузке из файла char.mt, второй - из char2.mt. * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта @@ -445,7 +445,7 @@ Возвращаемое значение: * функция не возвращает значения Замечания: - * Функция начала перерисовки удаляет все определ╕нные + * Функция начала перерисовки удаляет все определённые функцией 8 кнопки, их следует определить повторно. ====================================================================== @@ -489,7 +489,7 @@ * функция не возвращает значения Замечания: * Проверок на корректность не делается. Установка слишком больших - значений привед╕т к тому, что в фон войдут данные за границей + значений приведёт к тому, что в фон войдут данные за границей буфера фонового изображения. Размер буфера = 0x160000-0x10, что соответствует максимальным размерам 800*600. (800*600*3=0x15F900) * Для обновления экрана (после завершения серии команд, работающих с @@ -636,7 +636,7 @@ * Узнать, какое окно является активным, можно вызовом подфункции 7. ====================================================================== - Функция 18, подфункция 4 - получить сч╕тчик пустых тактов в секунду. + Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. ====================================================================== Под пустыми тактами понимается время, в которое процессор простаивает в ожидании прерывания (в инструкции hlt). @@ -645,7 +645,7 @@ * eax = 18 - номер функции * ebx = 4 - номер подфункции Возвращаемое значение: - * eax = значение сч╕тчика пустых тактов в секунду + * eax = значение счётчика пустых тактов в секунду ====================================================================== ======== Функция 18, подфункция 5 - получить тактовую частоту. ======= @@ -657,7 +657,7 @@ * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц) ====================================================================== - Функция 18, подфункция 6 - сохранить рамдиск в файл на ж╕стком диске. + Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. ====================================================================== Параметры: * eax = 18 - номер функции @@ -666,16 +666,16 @@ * 1 = в папке "/KOLIBRI" * 2 = в корневом каталоге * 3 = edx указывает на путь (имена папок в формате 8+3, - раздел╕нные '/') + разделённые '/') Возвращаемое значение: * eax = 0 - успешно * иначе eax = код ошибки файловой системы Замечания: * Имя файла фиксировано, "menuet.img" (глобальная переменная ядра image_save из preboot.inc) - * На каком разделе какого диска файл будет сохран╕н, определяется + * На каком разделе какого диска файл будет сохранён, определяется подфункцией 7 и подфункцией 8 функции 21. - * Все папки в указанном пути должны существовать, иначе верн╕тся + * Все папки в указанном пути должны существовать, иначе вернётся значение 5, "файл не найден". ====================================================================== @@ -689,14 +689,14 @@ активно) Замечания: * Активное окно находится вверху оконного стэка и получает - сообщения обо вс╕м вводе с клавиатуры. + сообщения обо всём вводе с клавиатуры. * Сделать окно активным можно вызовом подфункции 3. ====================================================================== ==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ==== ====================================================================== -При отключ╕нном звуке вызовы подфункции 55 функции 55 игнорируются. -При включ╕нном - направляются на встроенный спикер. +При отключённом звуке вызовы подфункции 55 функции 55 игнорируются. +При включённом - направляются на встроенный спикер. --------------- Подподфункция 1 - получить состояние. ---------------- Параметры: @@ -704,7 +704,7 @@ * ebx = 8 - номер подфункции * ecx = 1 - номер подподфункции Возвращаемое значение: - * eax = 0 - звук спикера разреш╕н; 1 - запрещ╕н + * eax = 0 - звук спикера разрешён; 1 - запрещён -------------- Подподфункция 2 - переключить состояние. -------------- Переключает состояния разрешения/запрещения. @@ -756,10 +756,10 @@ и размеры. * Восстановление окна приложения происходит при активизировании подфункцией 3. - * Обычно нет необходимости явно сворачивать/разворачивать сво╕ окно: + * Обычно нет необходимости явно сворачивать/разворачивать своё окно: сворачивание окна осуществляется системой при нажатии на кнопку минимизации (которая для окон со скином определяется автоматически - функцией 0, для окон без скина е╕ можно определить функцией 8), + функцией 0, для окон без скина её можно определить функцией 8), восстановление - приложением @panel. ====================================================================== @@ -777,7 +777,7 @@ * функция не возвращает значения Формат таблицы: короткая версия: * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB, - где AAAA зада╕т тип первого дисковода, BBBB - второго согласно + где AAAA задаёт тип первого дисковода, BBBB - второго согласно следующему списку: * 0 = нет дисковода * 1 = 360Kb, 5.25'' @@ -788,19 +788,19 @@ Например, для стандартной конфигурации из одного 1.44-дисковода здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B: значение оказывается 24h. - * +1: byte: информация о ж╕стких дисках и CD-приводах, AABBCCDD, + * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD, где AA соответствует контроллеру IDE0, ..., DD - IDE3: * 0 = устройство отсутствует - * 1 = ж╕сткий диск + * 1 = жёсткий диск * 2 = CD-привод Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h. - * +2: 4 db: число найденных разделов на ж╕стких дисках с + * +2: 4 db: число найденных разделов на жёстких дисках с соответственно IDE0,...,IDE3. - При отсутствии ж╕сткого диска на IDEx соответствующий байт + При отсутствии жёсткого диска на IDEx соответствующий байт нулевой, при наличии показывает число распознанных разделов, которых может и не быть (если носитель не отформатирован или если файловая система не поддерживается). В текущей версии ядра - для ж╕стких дисков поддерживаются только FAT16 и FAT32. + для жёстких дисков поддерживаются только FAT16 и FAT32. * +6: 4 db: зарезервировано Формат таблицы: полная версия: * +0: 10 db: такие же, как и в короткой версии @@ -871,7 +871,7 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 18, подфункция 14 ===================== -======= Ожидать начала обратного хода луча разв╕ртки монитора. ======= +======= Ожидать начала обратного хода луча развёртки монитора. ======= ====================================================================== Параметры: * eax = 18 - номер функции @@ -930,51 +930,65 @@ db 'Kolibri',0 процесса/потока по заданному слоту. ====================================================================== -====================== Функция 18, подфункция 19 ===================== -============= Получить/установить настройки мыши. =================== +=== Функция 18, подфункция 19 - получить/установить настройки мыши. == ====================================================================== + +------------- Подподфункция 0 - получить скорость мыши. -------------- Параметры: * eax = 18 - номер функции * ebx = 19 - номер подфункции - * ecx = номер пофункции 2-го уровня. + * ecx = 0 - номер подподфункции +Возвращаемое значение: + * eax = текущая скорость мыши - ecx = 0 - получить скорость мыши - Возвращаемое значение: - * eax = текущая скорость мыши +------------ Подподфункция 1 - установить скорость мыши. ------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 1 - номер подподфункции + * edx = новое значение скорости +Возвращаемое значение: + * функция не возвращает значения - ecx = 1 - установить скорость мыши - edx = устанавливаемое значение скорости - Возвращаемое значение: - * функция не возвращает значения +------------- Подподфункция 2 - получить задержку мыши. -------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 2 - номер подподфункции +Возвращаемое значение: + * eax = текущая задержка мыши - ecx = 2 - получить задержку ускорения - Возвращаемое значение: - * eax = текущая задержка ускорения - - ecx = 3 - установить задержку ускорения - edx = устанавливаемая задержка ускорения - Возвращаемое значение: - * функция не возвращает значения - - ecx = 4 - установить позицию курсора мыши на экране - edx = [координата по оси x]*65536 + [координата по оси y] - Возвращаемое значение: - * функция не возвращает значения +------------ Подподфункция 3 - установить задержку мыши. ------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 3 - номер подподфункции + * edx = новое значение задержки мыши +Возвращаемое значение: + * функция не возвращает значения +-------- Подподфункция 4 - установить положение курсора мыши. -------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 4 - номер подподфункции + * edx = [координата по оси x]*65536 + [координата по оси y] +Возвращаемое значение: + * функция не возвращает значения Замечания: - * Рекомендуемая скорость мыши (в подфункции 1) от 1 до 9. - Устанавливаемая величина не контролируется кодом ядра, по этому - используйте осторожно, при некорректном значении курсор может "замерзнуть". - Скорость мыши можно регулировать через приложение SETUP. - * Рекомендуемая величина задержки (в подфункции 3) = 10. Более низкое - значение не обрабатывается COM мышами. При очень больших значениях - невозможно передвижение мыши на 1 пиксель и курсор будет прыгать - на величину установленной скорости (подфункция 1). - Устанавливаемая величина не контролируется кодом ядра. - * В подфункции 4 устанавливаемая величина не контролируется кодом ядра. - Перед использованием необходимо узнать текущее разрешение экрана и - при установке позиции следить, чтобы величина позиции не выходила за - пределы экрана. + * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9. + Устанавливаемая величина не проверяется кодом ядра, поэтому + используйте осторожно, при некорректном значении курсор может + "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP. + * Рекомендуемая величина задержки (в подподфункции 3) = 10. + Меньшие значения не обрабатываются COM-мышами. При очень больших + значениях невозможно передвижение мыши на 1 пиксель и курсор будет + прыгать на величину установленной скорости (подподфункция 1). + Устанавливаемая величина не проверяется кодом ядра. + * Подподфункция 4 не проверяет переданное значение. Перед вызовом + необходимо узнать текущее разрешение экрана (подфункцией 14) + и проверить, что устанавливаемое положение не выходит за пределы + экрана. ====================================================================== ============ Функция 19 - запустить программу с рамдиска. ============ @@ -1009,9 +1023,9 @@ db 'Kolibri',0 * cl = байт для вывода Возвращаемое значение (одинаково для обеих подфункций): * eax = 0 - успешно - * eax = 1 - не определ╕н базовый порт + * eax = 1 - не определён базовый порт Замечания: - * Предварительно должен быть определ╕н базовый порт вызовом + * Предварительно должен быть определён базовый порт вызовом подфункции 1 функции 21. ====================================================================== @@ -1130,9 +1144,9 @@ db 'Kolibri',0 ====================================================================== =========== Функция 21, подфункция 7 - установить базу HD. =========== ====================================================================== -База HD нужна для определения, на какой ж╕сткий диск писать, при +База HD нужна для определения, на какой жёсткий диск писать, при использовании устаревших функций работы с файловой системой и функций, -неявно использующих ж╕сткий диск (типа подфункции 6 функции 18); +неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу. Параметры: @@ -1144,17 +1158,17 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить базу. * Не следует изменять базу, когда какое-нибудь приложение работает - с ж╕стким диском. Если не хотите глюков системы. + с жёстким диском. Если не хотите глюков системы. * Получить установленную базу можно вызовом подфункции 7 функции 26. - * Следует также определить используемый раздел ж╕сткого диска + * Следует также определить используемый раздел жёсткого диска подфункцией 8. ====================================================================== ========== Функция 21, подфункция 8 - установить раздел HD. ========== ====================================================================== -Раздел HD нужен для определения, на какой раздел ж╕сткого диска +Раздел HD нужен для определения, на какой раздел жёсткого диска писать, при использовании устаревших функций работы с файловой -системой и функций, неявно использующих ж╕сткий диск (типа +системой и функций, неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу и раздел. @@ -1167,13 +1181,13 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить раздел. * Не следует изменять раздел, когда какое-нибудь приложение работает - с ж╕стким диском. Если не хотите глюков системы. + с жёстким диском. Если не хотите глюков системы. * Получить установленный раздел можно вызовом подфункции 8 функции 26. * Проверок на корректность не делается. - * Узнать число разделов на ж╕стком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Следует также определить используемую базу ж╕сткого диска + * Следует также определить используемую базу жёсткого диска подфункцией 7. ====================================================================== @@ -1238,7 +1252,7 @@ db 'Kolibri',0 * если драйвер загружен: * eax = 'MDAZ' (в стиле fasm'а, т.е. 'M' - младший байт, 'Z' - старший) - сигнатура - * ebx = текущая частота разв╕ртки (в Гц) + * ebx = текущая частота развёртки (в Гц) * ecx разрушается * буфер, на который указывает edx, заполнен Формат буфера: @@ -1249,15 +1263,15 @@ db 'Kolibri',0 * +36 = +0x24: 7*dword: зарезервировано (0 в текущей реализации) * +64 = +0x40: 32*word: список поддерживаемых видеорежимов (каждое слово - номер видеорежима, после собственно списка идут нули) - * +128 = +0x80: 32*(5*word): список поддерживаемых частот разв╕рток + * +128 = +0x80: 32*(5*word): список поддерживаемых частот развёрток для видеорежимов: для каждого видеорежима, указанного в предыдущем поле, указано до 5 поддерживаемых частот (в неиспользуемых позициях записаны нули) Замечания: - * Функция инициализирует драйвер (если он ещ╕ не инициализирован) + * Функция инициализирует драйвер (если он ещё не инициализирован) и должна вызываться первой, перед остальными (иначе они будут возвращать -1, ничего не делая). - * В текущей реализации поддерживается только одна частота разв╕ртки + * В текущей реализации поддерживается только одна частота развёртки на видеорежим. ====================================================================== @@ -1272,13 +1286,13 @@ db 'Kolibri',0 * eax = -1 - драйвер не загружен или не инициализирован; ebx,ecx разрушаются * eax = [ширина]*65536 + [высота] - * ebx = частота вертикальной разв╕ртки (в Гц) + * ebx = частота вертикальной развёртки (в Гц) * ecx = номер текущего видеорежима Замечания: * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Если нужны только размеры экрана, целесообразней использовать - функцию 14 с уч╕том того, что она возвращает размеры на 1 меньше. + функцию 14 с учётом того, что она возвращает размеры на 1 меньше. ====================================================================== = Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. @@ -1287,7 +1301,7 @@ db 'Kolibri',0 * eax = 21 - номер функции * ebx = 13 - номер подфункции * ecx = 3 - номер функции драйвера - * edx = [частота разв╕ртки]*65536 + [номер видеорежима] + * edx = [частота развёртки]*65536 + [номер видеорежима] Возвращаемое значение: * eax = -1 - драйвер не загружен, не инициализирован или произошла ошибка @@ -1372,7 +1386,7 @@ db 'Kolibri',0 * Вообще-то CMOS поддерживает для будильника установку значения 0xFF в качестве одного из параметров и означает это, что соответствующий параметр игнорируется. Но в текущей реализации - это не пройд╕т (верн╕тся значение 1). + это не пройдёт (вернётся значение 1). * Будильник - глобальный системный ресурс; установка будильника автоматически отменяет предыдущую установку. Впрочем, на данный момент ни одна программа его не использует. @@ -1380,7 +1394,7 @@ db 'Kolibri',0 ====================================================================== ============== Функция 23 - ожидать события с таймаутом. ============= ====================================================================== -Если очередь сообщений пуста, жд╕т появления сообщения в очереди, +Если очередь сообщений пуста, ждёт появления сообщения в очереди, но не более указанного времени. Затем считывает сообщение из очереди. Параметры: @@ -1396,8 +1410,8 @@ db 'Kolibri',0 * Для проверки, есть ли сообщение в очереди, используйте функцию 11. Чтобы ждать сколь угодно долго, используйте функцию 10. * Передача ebx=0 приводит к моментальному возвращению eax=0. - * При текущей реализации произойд╕т немедленный возврат из функции - с eax=0, если сложение ebx с текущим значением сч╕тчика времени + * При текущей реализации произойдёт немедленный возврат из функции + с eax=0, если сложение ebx с текущим значением счётчика времени вызовет 32-битное переполнение. ====================================================================== @@ -1576,9 +1590,9 @@ db 'Kolibri',0 ====================================================================== ============ Функция 26, подфункция 7 - получить базу HD. ============ ====================================================================== -База HD нужна для определения, на какой ж╕сткий диск писать, при +База HD нужна для определения, на какой жёсткий диск писать, при использовании устаревших функций работы с файловой системой и функций, -неявно использующих ж╕сткий диск (типа подфункции 6 функции 18); +неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу. Параметры: @@ -1589,14 +1603,14 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить базу. * Установить базу можно вызовом подфункции 7 функции 21. - * Получить используемый раздел ж╕сткого диска можно подфункцией 8. + * Получить используемый раздел жёсткого диска можно подфункцией 8. ====================================================================== =========== Функция 26, подфункция 8 - получить раздел HD. =========== ====================================================================== -Раздел HD нужен для определения, на какой раздел ж╕сткого диска +Раздел HD нужен для определения, на какой раздел жёсткого диска писать, при использовании устаревших функций работы с файловой -системой и функций, неявно использующих ж╕сткий диск (типа +системой и функций, неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу и раздел. @@ -1608,12 +1622,12 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить раздел. * Установить раздел можно вызовом подфункции 8 функции 21. - * Узнать число разделов на ж╕стком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Получить используемую базу ж╕сткого диска можно подфункцией 7. + * Получить используемую базу жёсткого диска можно подфункцией 7. ====================================================================== -=== Функция 26, подфункция 9 - получить значение сч╕тчика времени. === +=== Функция 26, подфункция 9 - получить значение счётчика времени. === ====================================================================== Параметры: * eax = 26 - номер функции @@ -1622,7 +1636,7 @@ db 'Kolibri',0 * eax = число сотых долей секунды, прошедших с момента запуска системы Замечания: - * Сч╕тчик бер╕тся по модулю 2^32, что соответствует немногим более + * Счётчик берётся по модулю 2^32, что соответствует немногим более 497 суток. * Системное время можно получить функцией 3. @@ -1641,13 +1655,13 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 26, подфункция 11 ===================== -=========== Узнать, разреш╕н ли низкоуровневый доступ к HD. ========== +=========== Узнать, разрешён ли низкоуровневый доступ к HD. ========== ====================================================================== Параметры: * eax = 26 - номер функции * ebx = 11 - номер подфункции Возвращаемое значение: - * eax = 0/1 - запрещ╕н/разреш╕н + * eax = 0/1 - запрещён/разрешён Замечания: * Используется при LBA-чтении (подфункция 8 функции 58). * Установить текущее состояние можно вызовом @@ -1655,13 +1669,13 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 26, подфункция 12 ===================== -========== Узнать, разреш╕н ли низкоуровневый доступ к PCI. ========== +========== Узнать, разрешён ли низкоуровневый доступ к PCI. ========== ====================================================================== Параметры: * eax = 26 - номер функции * ebx = 12 - номер подфункции Возвращаемое значение: - * eax = 0/1 - запрещ╕н/разреш╕н + * eax = 0/1 - запрещён/разрешён Замечания: * Используется при работе с шиной PCI (функция 62). * Текущая реализация использует только младший бит ecx. @@ -1761,7 +1775,7 @@ db 'Kolibri',0 * Эта функция устарела; функция 70 позволяет выполнять те же действия с расширенными возможностями. * Если указать ненулевое значение в esi и на рамдиске уже есть - указанный файл, то будет создан ещ╕ один файл с тем же именем. + указанный файл, то будет создан ещё один файл с тем же именем. * В противном случае файл перезаписывается. * Имя файла должно быть либо в формате 8+3 символов (первые 8 символов - собственно имя, последние 3 - расширение, @@ -1813,7 +1827,7 @@ db 'Kolibri',0 Если y>=ywnd, то младшее слово неотрицательно и содержит относительную y-координату, а старшее - относительную x-координату (правильного знака). В противном случае младшее слово отрицательно - и вс╕ равно содержит относительную y-координату, + и всё равно содержит относительную y-координату, а к старшему слову следует прибавить 1. ----------------- Подфункция 2 - нажатые кнопки мыши ----------------- @@ -1890,7 +1904,7 @@ db 'Kolibri',0 ======== Функция 40 - установить маску для ожидаемых событий. ======== ====================================================================== Маска для ожидаемых событий влияет на функции работы с событиями 10, -11, 23 - они сообщают только о событиях, разреш╕нных этой маской. +11, 23 - они сообщают только о событиях, разрешённых этой маской. Параметры: * eax = 40 - номер функции * ebx = маска: бит i соответствует событию i+1 (см. список событий) @@ -1901,7 +1915,7 @@ db 'Kolibri',0 * Маска по умолчанию (7=111b) разрешает извещения о перерисовке и нажатиях клавиш и кнопок. Этого достаточно для большинства приложений. - * События, запрещ╕нные в маске, вс╕ равно сохраняются, если + * События, запрещённые в маске, всё равно сохраняются, если приходят; о них просто не извещают функции работы с событиями. * Функции работы с событиями учитывают маску на момент вызова функции, а не на момент поступления сообщения. @@ -1934,8 +1948,8 @@ db 'Kolibri',0 * eax = 0 * ecx = 1 * ebx разрушается - * если вс╕ в порядке и данные были: - * eax = размер данных, ещ╕ не прочитанных из буфера (в байтах) + * если всё в порядке и данные были: + * eax = размер данных, ещё не прочитанных из буфера (в байтах) * ecx = 0 * ebx = очередной байт Замечания: @@ -1963,7 +1977,7 @@ db 'Kolibri',0 * ebx игнорируется * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF) Возвращаемое значение: - * eax = 0 - успешно, при этом ebx = введ╕нный байт + * eax = 0 - успешно, при этом ebx = введённый байт * eax = 1 - поток не зарезервировал данный порт Замечания: * Предварительно поток должен зарезервировать за собой @@ -1971,7 +1985,7 @@ db 'Kolibri',0 * Для зарезервированных портов вместо вызова этих функций лучше использовать команды процессора in/out - это значительно быстрее и несколько короче и проще. Из незарезервированных - портов читать вс╕ равно нельзя. + портов читать всё равно нельзя. ====================================================================== ======== Функция 44 - определить действия при поступлении IRQ. ======= @@ -2101,7 +2115,7 @@ db 'Kolibri',0 * ebx = 1 - номер подфункции * ecx = тип кнопок: * 0 = плоские - * 1 = объ╕мные + * 1 = объёмные Возвращаемое значение: * функция не возвращает значения Замечания: @@ -2126,7 +2140,7 @@ db 'Kolibri',0 подфункцией 0. * Таблица стандартных цветов влияет только на приложения, которые эту таблицу явным образом получают (подфункцией 3) и - используют (указывая цвета из не╕ при вызовах функций рисования). + используют (указывая цвета из неё при вызовах функций рисования). * Таблица стандартных цветов входит в скин и устанавливается заново при установке скина (подфункции 8). * Таблицу цветов можно просматривать/изменять интерактивно с помощью @@ -2161,11 +2175,11 @@ dword- Замечания: * Структура таблицы цветов описана в стандартном включаемом файле macros.inc под названием system_colors; например, можно писать: - sc system_colors ; объявление переменной - ... ; где-то надо вызвать - ; описываемую функцию с ecx=sc - mov ecx, [sc.work_button_text] ; читаем цвет текста - ; на кнопке в рабочей области + sc system_colors ; объявление переменной + ... ; где-то надо вызвать + ; описываемую функцию с ecx=sc + mov ecx, [sc.work_button_text] ; читаем цвет текста + ; на кнопке в рабочей области * Использование/неиспользование этих цветов - дело исключительно самой программы. Для использования нужно просто при вызове функций рисования указывать цвет, взятый из этой таблицы. @@ -2272,7 +2286,7 @@ dword- поле промежуточного буфера и указано имя файла Возвращаемое значение: * eax = 0 - успешно - * иначе eax = код ошибки файловой системы; если файл не зада╕т скин, + * иначе eax = код ошибки файловой системы; если файл не задаёт скин, то возвращается ошибка 3 (неизвестная файловая система). Замечания: * При успешной загрузке скина все окна извещаются о необходимости @@ -2307,7 +2321,7 @@ dword- ================= Функция 50 - установка формы окна. ================= ====================================================================== Обычные окна представляют собой прямоугольники. С помощью этой функции -окну можно придать произвольную форму. Форма зада╕тся набором точек +окну можно придать произвольную форму. Форма задаётся набором точек внутри обрамляющего прямоугольника, принадлежащих окну. Положение и размеры обрамляющего прямоугольника задаются функцией 0 и изменяются функцией 67. @@ -2324,7 +2338,7 @@ dword- Параметры: * eax = 50 - номер функции * ebx = 1 - номер подфункции - * ecx зада╕т масштаб: каждый байт данных определяет + * ecx задаёт масштаб: каждый байт данных определяет (2^scale)*(2^scale) пикселей Возвращаемое значение: * функция не возвращает значения @@ -2518,8 +2532,8 @@ dword- * eax = 53 - номер функции * ebx = 0 - номер подфункции * ecx = локальный порт (учитывается только младшее слово) - * edx = удал╕нный порт (учитывается только младшее слово) - * esi = удал╕нный IP + * edx = удалённый порт (учитывается только младшее слово) + * esi = удалённый IP Возвращаемое значение: * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается * eax = хэндл сокета (некоторое число, однозначно идентифицирующее @@ -2600,8 +2614,8 @@ dword- * eax = 53 - номер функции * ebx = 5 - номер подфункции * ecx = локальный порт (учитывается только младшее слово) - * edx = удал╕нный порт (учитывается только младшее слово) - * esi = удал╕нный IP + * edx = удалённый порт (учитывается только младшее слово) + * esi = удалённый IP * edi = режим открытия: SOCKET_PASSIVE=0 или SOCKET_ACTIVE=1 Возвращаемое значение: * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается @@ -2706,7 +2720,7 @@ dword- * 201: размер таблицы ARP (в элементах) (20 в текущей версии) * 202: прочитать элемент edx таблицы ARP во временный буфер, откуда берут информацию 5 последующих типов; - в этом случае eax неопредел╕н + в этом случае eax неопределён * 203: IP-адрес, запомненный типом 202 * 204: старшее dword MAC-адреса, запомненного типом 202 * 205: младшее word MAC-адреса, запомненного типом 202 @@ -2742,9 +2756,9 @@ dword- * функция не возвращает значения Замечания: * Предварительно данные должны быть загружены подфункцией 0 и - определ╕н их формат подфункцией 2. + определён их формат подфункцией 2. * Функция возвращает управление, когда началось проигрывание данных; - после этого проигрывание ид╕т независимо от приложения (и вообще + после этого проигрывание идёт независимо от приложения (и вообще не требует загрузки процессора). * Предварительно должны быть определены базовый порт SB16 (подфункцией 4 функции 21) и канал DMA @@ -2782,18 +2796,18 @@ dword- * esi = указатель на данные Возвращаемое значение: * eax = 0 - успешно - * eax = 55 - ошибка (спикер отключ╕н или занят) + * eax = 55 - ошибка (спикер отключён или занят) Данные - это массив элементов переменной длины. Формат каждого элемента определяется первым байтом: * 0 = конец данных - * 1..0x80 = зада╕т длительность звучания в сотых долях секунды + * 1..0x80 = задаёт длительность звучания в сотых долях секунды ноты, определяемой непосредственным значением частоты * следующее слово (2 байта) содержит делитель частоты; частота определяется как 1193180/divider * 0x81 = invalid * 0x82..0xFF = нота, определяемая октавой и номером: * длительность в сотых долях секунды = (первый байт)-0x81 - * присутствует ещ╕ один байт; + * присутствует ещё один байт; * (второй байт)=0xFF - пауза * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1 до 12, a=номер октавы (считая с 0) @@ -2801,12 +2815,12 @@ dword- * Пищание спикером может быть запрещено/разрешено подфункцией 8 функции 18. * Функция возвращает управление, сообщив куда следует информацию - о запросе. Само проигрывание ид╕т независимо от программы. + о запросе. Само проигрывание идёт независимо от программы. * Данные должны сохраняться в памяти по крайней мере до конца проигрывания. ====================================================================== -============= Функция 56 - записать файл на ж╕сткий диск. ============ +============= Функция 56 - записать файл на жёсткий диск. ============ ====================================================================== Параметры: * eax = 56 - номер функции @@ -2819,11 +2833,11 @@ dword- Замечания: * Эта функция устарела; функция 70 позволяет выполнять те же действия с расширенными возможностями. - * Данная функция предполагает, что во время е╕ вызова одним + * Данная функция предполагает, что во время её вызова одним приложением никакое другое приложение не работает - с ж╕стким диском. + с жёстким диском. * Путь к файлу - ASCIIZ-строка, которая может быть пустой - (если файл созда╕тся в корневом каталоге) или иметь формат + (если файл создаётся в корневом каталоге) или иметь формат /d1/d2/.../dn, где все имена папок должны иметь формат 8+3, т.е. 8 символов имени и 3 символа расширения без разделителя, при необходимости дополненные пробелами; @@ -2858,7 +2872,7 @@ dword- * /RD/1 = /RAMDISK/1 для доступа к рамдиску * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода - * /HD/x = /HARDDISK/x - устаревший вариант доступа к ж╕сткому диску + * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску (в этом случае база определяется подфункцией 7 функции 21), x - номер раздела (считая с 1) * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно @@ -2907,7 +2921,7 @@ dword- * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы @@ -2922,7 +2936,7 @@ dword- документации по FAT. * Размер папки определяется по размеру цепочки кластеров в FAT. * Если файл кончился раньше, чем был прочитан последний запрошенный - блок, то функция прочитает, сколько сможет, после чего верн╕т + блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но в первых двух случаях текущая реализация не следует @@ -2936,7 +2950,7 @@ dword- 0x1C00=7168 байт; но возвращается ebx=0 (за исключением случая предыдущего пункта); * как ни странно, можно прочитать 14-й блок (там, вообще говоря, - мусор - напоминаю, сч╕т вед╕тся с 0); + мусор - напоминаю, счёт ведётся с 0); * если был запрошен хотя бы один блок с номером, не меньшим 14, то возвращается eax=6(EOF); иначе eax=0. Для /fd/x: @@ -2958,7 +2972,7 @@ dword- ====================================================================== ============ Функция 58, подфункция 1 - перезаписать файл. =========== ====================================================================== -Если файл не существует, он созда╕тся. +Если файл не существует, он создаётся. Если файл существует, он перезаписывается. Параметры: * eax = 58 - номер функции @@ -2970,7 +2984,7 @@ dword- * +12 = +0xC: dword: указатель на данные для записи * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы @@ -2991,14 +3005,14 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * При работе с дискетой не следует удалять непустую папку. - Код работы с ж╕стким диском непустые папки удаляет корректно + Код работы с жёстким диском непустые папки удаляет корректно (т.е. рекурсивно со всеми файлами и вложенными папками). Рамдиск папок не поддерживает. @@ -3015,20 +3029,21 @@ dword- * +12 = +0xC: dword: указатель на данные для записи * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: + * Эта функция устарела, используйте подфункцию 3 функции 70. * Рамдиск и дискеты не поддерживают эту функцию, она только для - ж╕стких дисков. + жёстких дисков. * Файл должен уже существовать (иначе возвращается 5, not found). Для создания файлов используйте подфункцию 1. * Если начальная позиция больше размера файла, возвращается eax=6(EOF). Если конечная позиция больше размера файла, файл расширяется. - * Код обработки записи данных для ж╕сткого диска интерпретирует + * Код обработки записи данных для жёсткого диска интерпретирует нулевое значение поля +8 как указание усечения файла до размера, указанного в поле +4. Однако код обработки 58-й функции блокирует эту возможность для приложений, сразу возвращая управление @@ -3047,14 +3062,14 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * Рамдиск и дискеты не поддерживают эту функцию, - она только для ж╕стких дисков. + она только для жёстких дисков. ====================================================================== == Функция 58, подфункция 5 - переименовать/переместить файл/папку. == @@ -3069,21 +3084,21 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании * +20+n: (сразу после завершающего нулевого символа) новое ASCIIZ-имя, должно начинаться с /hd/1, что интерпретируется как - ж╕сткий диск, указанный в первом имени + жёсткий диск, указанный в первом имени (перемещение с одного диска на другой не поддерживается) Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * Рамдиск и дискеты не поддерживают эту функцию, - она только для ж╕стких дисков. + она только для жёстких дисков. * Если новое ASCIIZ-имя сильно неправильное, т.е. не начинается с /hd/1, /hd/first, /harddisk/1, /harddisk/first или после этого - начала ид╕т пробел или символ с кодом 0, то функция возвращает, + начала идёт пробел или символ с кодом 0, то функция возвращает, как ни странно, код ошибки 4. Это единственная функция, которая вообще возвращает этот код. @@ -3115,7 +3130,7 @@ dword- (за исключением предыдущего случая): * eax = 5 * ebx не меняется - * если LBA-доступ запрещ╕н подфункцией 11 функции 21: + * если LBA-доступ запрещён подфункцией 11 функции 21: * eax = 2 * ebx разрушается * для рамдиска: попытка чтения блока за пределами рамдиска @@ -3128,17 +3143,17 @@ dword- * Размер блока - 512 байт; читается один блок. * Не следует полагаться на возвращаемое значение, оно может измениться в следующих версиях. - * Требуется, чтобы был разреш╕н LBA-доступ к устройствам + * Требуется, чтобы был разрешён LBA-доступ к устройствам подфункцией 11 функции 21. Узнать это можно вызовом подфункцией 11 функции 26. * LBA-чтение дискеты не поддерживается. - * Функция считывает данные физического ж╕сткого диска; + * Функция считывает данные физического жёсткого диска; если по каким-то причинам нужны данные конкретного раздела, - прид╕тся определять начальный сектор этого раздела + придётся определять начальный сектор этого раздела (либо напрямую через MBR, либо из расширенной структуры, возвращаемой той же подфункцией 11 функции 18). - * Функция не проверяет код ошибки ж╕сткого диска, так что запрос - несуществующего сектора вс╕ равно что-то прочитает + * Функция не проверяет код ошибки жёсткого диска, так что запрос + несуществующего сектора всё равно что-то прочитает (вероятнее всего, нули, но это определяется устройством) и это будет считаться успехом (eax=0). @@ -3165,7 +3180,7 @@ dword- * ebx = общее число кластеров = 2847 * ecx = число свободных кластеров * dword [fileinfo] = размер кластера = 512 - * для ж╕сткого диска: база и раздел определяются подфункциями 7 и 8 + * для жёсткого диска: база и раздел определяются подфункциями 7 и 8 функции 21: * eax = 0 (успех) * ebx = общее число кластеров @@ -3178,10 +3193,10 @@ dword- pushad-структуры, передающейся как аргумент системной функции). Теперь это исправлено, так что, возможно, имеет смысл возвращать размер кластера в edx, пока эту функцию не начали использовать. - * Вообще-то ещ╕ существует подфункция 11 функции 18, возвращающая + * Вообще-то ещё существует подфункция 11 функции 18, возвращающая информацию о файловой системе. По расширенной таблице дисковой подсистемы можно определить размер кластера (там он хранится - в секторах) и общее число кластеров для ж╕стких дисков. + в секторах) и общее число кластеров для жёстких дисков. ====================================================================== ========== Функция 58, подфункция 16 - запустить программу. ========== @@ -3198,7 +3213,7 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax > 0 - программа загружена, eax содержит PID @@ -3210,7 +3225,7 @@ dword- (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше. - * Если процесс запускается как отлаживаемый, он созда╕тся + * Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 функции 69. @@ -3248,7 +3263,7 @@ dword- из ядра убрать совсем, вместе с приложением systrace. * Информация о системных вызовах сохраняется в системном кольцевом буфере на 0x10 входов. - Эта функция просто копирует указанный объ╕м данных + Эта функция просто копирует указанный объём данных из упомянутого буфера по указанному адресу. * Какой из входов в буфере соответствует последнему вызову, можно определить по значению eax, а именно, @@ -3271,7 +3286,7 @@ IPC интерпретировать конкретное сообщение. -------- Подфункция 1 - установить область для получения IPC --------- -Вызывается процессом-при╕мником. +Вызывается процессом-приёмником. Параметры: * eax = 60 - номер функции * ebx = 1 - номер подфункции @@ -3298,21 +3313,21 @@ IPC Параметры: * eax = 60 - номер функции * ebx = 2 - номер подфункции - * ecx = PID при╕мника + * ecx = PID приёмника * edx = указатель на данные сообщения * esi = длина сообщения (в байтах) Возвращаемое значение: * eax = 0 - успешно - * eax = 1 - при╕мник не определил буфер для IPC-сообщений - (может быть, ещ╕ не успел, а может быть, это не тот поток, + * eax = 1 - приёмник не определил буфер для IPC-сообщений + (может быть, ещё не успел, а может быть, это не тот поток, который нужен) - * eax = 2 - при╕мник заблокировал IPC-буфер; + * eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать - * eax = 3 - переполнение IPC-буфера при╕мника + * eax = 3 - переполнение IPC-буфера приёмника * eax = 4 - процесса/потока с таким PID не существует Замечания: * Система сразу после записи IPC-сообщения в буфер посылает - потоку-при╕мнику событие с кодом 7 (см. коды событий). + потоку-приёмнику событие с кодом 7 (см. коды событий). ====================================================================== === Функция 61 - получить параметры для прямого доступа к графике. === @@ -3320,10 +3335,10 @@ IPC Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs: - mov eax, [gs:0] + mov eax, [gs:0] поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих). - mov [gs:0], eax + mov [gs:0], eax при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). @@ -3341,7 +3356,7 @@ IPC собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных - ядра, прич╕м все функции вывода на экран добросовестно выполняют + ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана @@ -3358,7 +3373,7 @@ IPC Возвращаемое значение: * eax = [разрешение по оси x]*65536 + [разрешение по оси y] Замечания: - * Можно использовать функцию 14 с уч╕том того, что она возвращает + * Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ. ------------------------ Число бит на пиксель ------------------------ @@ -3373,7 +3388,7 @@ IPC * eax = 61 - номер функции * ebx = 3 - номер подфункции Возвращаемое значение: - * eax = число байт, которое занимает одна строка разв╕ртки + * eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране) ====================================================================== @@ -3383,11 +3398,11 @@ IPC * eax = 62 - номер функции * bl = 0 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ╕н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия) * старшее слово eax обнулено Замечания: - * Предварительно должен быть разреш╕н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение ax неопределено. @@ -3398,10 +3413,10 @@ IPC * eax = 62 - номер функции * bl = 1 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ╕н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * al = номер последней PCI-шины; оставшиеся байты eax разрушаются Замечания: - * Предварительно должен быть разреш╕н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение al неопределено. @@ -3413,10 +3428,10 @@ IPC * eax = 62 - номер функции * bl = 2 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ╕н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * al = механизм (1 или 2); прочие байты eax разрушаются Замечания: - * Предварительно должен быть разреш╕н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм обращения выбирается в соответствии с характеристиками оборудования. @@ -3434,15 +3449,15 @@ IPC * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства - * cl = номер регистра (должен быть ч╕тным для bl=5, + * cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6) Возвращаемое значение: - * eax = -1 - ошибка (запрещ╕н доступ к PCI или + * eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе * al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается Замечания: - * Предварительно должен быть разреш╕н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом @@ -3465,16 +3480,16 @@ IPC * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства - * cl = номер регистра (должен быть ч╕тным для bl=9, + * cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10) * dl/dx/edx (в зависимости от запрошенного размера) содержит данные для записи Возвращаемое значение: - * eax = -1 - ошибка (запрещ╕н доступ к PCI или + * eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры) * eax = 0 - успешно Замечания: - * Предварительно должен быть разреш╕н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом @@ -3492,16 +3507,16 @@ IPC данные и из которого другая программа может эти данные прочитать. Есть соглашение, в соответствии с которым записываемые данные - текстовые строки, интерпретируемые как отладочные сообщения о ходе -выполнения программы. Ядро в определ╕нных ситуациях также записывает +выполнения программы. Ядро в определённых ситуациях также записывает на доску отладки сведения о выполнении некоторых функций; по соглашению сообщения ядра начинаются с префикса "K : ". Для просмотра доски отладки создано приложение board, -которое считывает данные из буфера и отображает их в сво╕м окне. board +которое считывает данные из буфера и отображает их в своём окне. board понимает последовательность кодов 13,10 как переход на новую строку. Символ с нулевым кодом в конце строки не обязателен, но и не мешает. В связи с появлением отладчика ценность доски отладки несколько снизилась, поскольку отладчик позволяет полностью контролировать ход -выполнения программы, прич╕м для этого не требуется никаких усилий +выполнения программы, причём для этого не требуется никаких усилий со стороны самой программы. Тем не менее во многих случаях доска отладки продолжает оставаться полезной. @@ -3548,7 +3563,7 @@ IPC ================= Функция 66 - работа с клавиатурой. ================= ====================================================================== Режим ввода влияет на результаты чтения клавиш функцией 2. -При загрузке программы для не╕ устанавливается ASCII-режим ввода. +При загрузке программы для неё устанавливается ASCII-режим ввода. -------- Подфункция 1 - установить режим ввода с клавиатуры. --------- Параметры: @@ -3579,14 +3594,14 @@ IPC * бит 3 (маска 8): правый Ctrl нажат * бит 4 (маска 0x10): левый Alt нажат * бит 5 (маска 0x20): правый Alt нажат - * бит 6 (маска 0x40): CapsLock включ╕н - * бит 7 (маска 0x80): NumLock включ╕н - * бит 8 (маска 0x100): ScrollLock включ╕н + * бит 6 (маска 0x40): CapsLock включён + * бит 7 (маска 0x80): NumLock включён + * бит 8 (маска 0x100): ScrollLock включён * прочие биты сброшены ----- Подфункция 4 - установить общесистемную "горячую клавишу". ----- О нажатии "горячей клавиши" извещаются только приложения, -установившие е╕; активное приложение (к которому поступает +установившие её; активное приложение (к которому поступает весь нормальный ввод) таких клавиш не получает. Извещение заключается в посылке события с кодом 2. Прочитать "горячую клавишу" можно так же, как и обычную, - @@ -3594,10 +3609,10 @@ IPC Параметры: * eax = 66 - номер функции * ebx = 4 - номер подфункции - * cl зада╕т сканкод клавиши; + * cl задаёт сканкод клавиши; используйте cl=0 для задания комбинаций типа Ctrl+Shift - * edx = 0xXYZ зада╕т возможные состояния управляющих клавиш: - * Z (младшие 4 бита) зада╕т состояние клавиш LShift и RShift: + * edx = 0xXYZ задаёт возможные состояния управляющих клавиш: + * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift: * 0 = ни одна из клавиш не должна быть нажата; * 1 = ровно одна из клавиш должна быть нажата; * 2 = обе клавиши должны быть нажаты; @@ -3645,7 +3660,7 @@ IPC * Значение -1 для параметра означает "не изменять"; например, для перемещения окна без изменения размеров можно указать edx=esi=-1. * Предварительно окно должно быть определено функцией 0. - Она же зада╕т начальные координаты и размеры окна. + Она же задаёт начальные координаты и размеры окна. * Размеры окна понимаются в смысле функции 0, т.е. на один пиксель меньше, чем реальные размеры. * Вызов функции для максимизированных окон просто игнорируется. @@ -3655,7 +3670,7 @@ IPC * Функция посылает окну событие перерисовки (с кодом 1). ====================================================================== -=== Функция 68, подфункция 0 - получить сч╕тчик переключений задач. == +=== Функция 68, подфункция 0 - получить счётчик переключений задач. == ====================================================================== Параметры: * eax = 68 - номер функции @@ -3671,7 +3686,7 @@ IPC Функция завершает текущий квант времени, выделенный потоку, и переключается на следующий. (Какой поток какого процесса будет следующим, предсказать нельзя). -Позднее, когда до текущего потока дойд╕т очередь, +Позднее, когда до текущего потока дойдёт очередь, выполнение возобновится. Параметры: * eax = 68 - номер функции @@ -3688,7 +3703,7 @@ IPC * ecx = требуемое действие: * ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters) - * ecx = 1 - узнать, включ╕н/выключен кэш + * ecx = 1 - узнать, включён/выключен кэш * ecx = 2 - включить кэш * ecx = 3 - выключить кэш Возвращаемое значение: @@ -3696,7 +3711,7 @@ IPC * eax = значение cr4 * для ecx=1: * eax = (cr0 and 0x60000000): - * eax = 0 - кэш включ╕н + * eax = 0 - кэш включён * eax <> 0 - кэш выключен * для ecx=2 и ecx=3: * функция не возвращает значения @@ -3707,7 +3722,7 @@ IPC MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); -каждое семейство процессоров имеет сво╕ подмножество MSR-регистров. +каждое семейство процессоров имеет своё подмножество MSR-регистров. Параметры: * eax = 68 - номер функции * ebx = 3 - номер подфункции @@ -3717,10 +3732,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ebx:eax = старший:младший dword результата Замечания: * Указание в ecx несуществующего или нереализованного для данного - процессора MSR повлеч╕т исключение в ядре, которое прибь╕т поток. + процессора MSR повлечёт исключение в ядре, которое прибьёт поток. * Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, - которое вс╕ равно прибь╕т поток. + которое всё равно прибьёт поток. ====================================================================== ========= Функция 68, подфункция 4 - записать в MSR-регистр. ========= @@ -3728,7 +3743,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); -каждое семейство процессоров имеет сво╕ подмножество MSR-регистров. +каждое семейство процессоров имеет своё подмножество MSR-регистров. Параметры: * eax = 68 - номер функции * ebx = 4 - номер подфункции @@ -3739,10 +3754,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ebx:eax = копия esi:edi Замечания: * Указание в ecx несуществующего или нереализованного для данного - процессора MSR повлеч╕т исключение в ядре, которое прибь╕т поток. + процессора MSR повлечёт исключение в ядре, которое прибьёт поток. * Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, - которое вс╕ равно прибь╕т поток. + которое всё равно прибьёт поток. ====================================================================== ======= Функция 68, подфункция 5 - выделить физическую память. ======= @@ -3759,7 +3774,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); устройством требуется разместить данные по известному физическому адресу. (В сущности, эта функция разрабатывалась для AC97WAV.) * Число блоков физической памяти ограничено (константой 24, - прич╕м эта константа включает и несколько блоков памяти + причём эта константа включает и несколько блоков памяти для надобностей ядра). * Освободить выделенную таким образом память можно подфункцией 6, копированием данных туда/обратно @@ -3830,7 +3845,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); У процесса может быть только один отладчик; один процесс может отлаживать несколько разных. Система уведомляет отладчик о событиях, происходящих с отлаживаемым процессом. Сообщения записываются в буфер, -определ╕нный подфункцией 0. +определённый подфункцией 0. Формат сообщения: * +0: dword: код сообщения * +4: dword: PID отлаживаемого процесса @@ -3838,14 +3853,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); определяемые кодом сообщения Коды сообщений: * 1 = исключение - * дополнительно переда╕тся dword-номер исключения + * дополнительно передаётся dword-номер исключения * процесс приостановлен * 2 = процесс завершился * приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком) * 3 = отладочное исключение int 1 = #DB - * дополнительно переда╕тся dword-образ регистра DR6: + * дополнительно передаётся dword-образ регистра DR6: * биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9) * бит 14: исключение произошло из-за режима @@ -3889,7 +3904,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки - neg [bufsize] + neg [bufsize] * Данные в буфере трактуются как массив элементов переменной длины - сообщений. Формат сообщения указан в общем описании. @@ -4054,7 +4069,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 01 = слово * 11 = двойное слово * esi = адрес точки останова; должен быть выровнен - соответственно длине (т.е. должен быть ч╕тным для + соответственно длине (т.е. должен быть чётным для точек останова на слово, кратен 4 для двойного слова) * если старший бит установлен - сбросить точку останова Возвращаемое значение: @@ -4074,10 +4089,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * Срабатывание точки останова заключается в генерировании отладочного исключения #DB, о котором система сообщает отладчику. * Точка останова на запись и чтение/запись срабатывает после - выполнения вызвавшей е╕ инструкции. + выполнения вызвавшей её инструкции. ====================================================================== -= Функция 70 - работа с файловой системой с поддержкой длинных им╕н. = += Функция 70 - работа с файловой системой с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 @@ -4107,7 +4122,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно - к ж╕стким дискам на IDE0 (Primary Master), IDE1 (Primary Slave), + к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave); x - номер раздела на выбранном винчестере, изменяется от 1 до 255 (на каждом из винчестеров нумерация начинается с 1) @@ -4123,6 +4138,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * подфункция 0 - чтение файла * подфункция 1 - чтение папки * подфункция 2 - создание/перезапись файла + * подфункция 3 - запись в существующий файл * подфункция 5 - получение атрибутов файла/папки * подфункция 6 - установка атрибутов файла/папки * подфункция 7 - запуск программы @@ -4131,7 +4147,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ошибкой с кодом 2. ====================================================================== -= Функция 70, подфункция 0 - чтение файла с поддержкой длинных им╕н. = += Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 - номер функции @@ -4142,7 +4158,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано под старший dword позиции) * +12 = +0xC: dword: сколько байт читать * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4153,13 +4169,13 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); -1=0xffffffff, если файл не найден Замечания: * Если файл кончился раньше, чем был прочитан последний запрошенный - блок, то функция прочитает, сколько сможет, после чего верн╕т + блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). * Функция не позволяет читать папки - (верн╕тся eax=10, access denied). + (вернётся eax=10, access denied). ====================================================================== -= Функция 70, подфункция 1 - чтение папки с поддержкой длинных им╕н. = += Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 - номер функции @@ -4175,7 +4191,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +12 = +0xC: dword: сколько блоков читать * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + [+12]*560 байт - * +20 = +0x14: ASCIIZ-имя папки, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4191,7 +4207,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ... Структура заголовка: * +0: dword: версия структуры (текущая версия = 1) - * +4: dword: количество размещ╕нных блоков; не больше, чем запрошено + * +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx) * +8: dword: общее число файлов в папке @@ -4248,7 +4264,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); данные содержат мусор. * Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, - после чего верн╕т eax=6 (EOF). + после чего вернёт eax=6 (EOF). * Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку. @@ -4259,7 +4275,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ====================================================================== ====================== Функция 70, подфункция 2 ====================== -======== Создание/перезапись файла с поддержкой длинных им╕н. ======== +======== Создание/перезапись файла с поддержкой длинных имён. ======== ====================================================================== Параметры: * eax = 70 - номер функции @@ -4270,7 +4286,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано) * +12 = +0xC: dword: сколько байт писать * +16 = +0x10: dword: указатель на данные - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4279,11 +4295,40 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * eax = 0 - успешно, иначе код ошибки файловой системы * ebx = число записанных байт (возможно, 0) Замечания: - * Если файл с таким именем не существовал, он созда╕тся; если + * Если файл с таким именем не существовал, он создаётся; если существовал, то перезаписывается. * Если свободного места на диске недостаточно, то функция запишет, - сколько сможет, после чего верн╕т код ошибки 8. - * Функция не поддерживается для CD (верн╕тся код ошибки 2). + сколько сможет, после чего вернёт код ошибки 8. + * Функция не поддерживается для CD (вернётся код ошибки 2). + +====================================================================== +====================== Функция 70, подфункция 3 ====================== +======== Запись в существующий файл с поддержкой длинных имён. ======= +====================================================================== +Параметры: + * eax = 70 - номер функции + * ebx = указатель на информационную структуру +Формат информационной структуры: + * +0: dword: 3 = номер подфункции + * +4: dword: позиция в файле (в байтах) + * +8: dword: старший dword позиции (должен быть 0 для FAT) + * +12 = +0xC: dword: сколько байт писать + * +16 = +0x10: dword: указатель на данные + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в + общем описании + или + * +20 = +0x14: db 0 + * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла +Возвращаемое значение: + * eax = 0 - успешно, иначе код ошибки файловой системы + * ebx = число записанных байт (возможно, 0) +Замечания: + * Файл должен уже существовать, иначе вернётся eax=5. + * Единственным результатом записи 0 байт является установка в + атрибутах файла даты/времени модификации и доступа в текущую. + * Если начальная и/или конечная позиция выходит за пределы файла + (за исключением предыдущего случая), файл расширяется до + необходимого размера нулевыми символами. ====================================================================== === Функция 70, подфункция 5 - получение информации о файле/папке. === @@ -4298,7 +4343,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4326,7 +4371,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано) * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4342,7 +4387,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); Замечания: * Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1. - * Функция не поддерживается для CD (верн╕тся код ошибки 2). + * Функция не поддерживается для CD (вернётся код ошибки 2). ====================================================================== ============ Функция 70, подфункция 7 - запуск программы. ============ @@ -4358,7 +4403,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: 0 (зарезервировано) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им╕н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4373,7 +4418,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше. - * Если процесс запускается как отлаживаемый, он созда╕тся + * Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 функции 69. @@ -4421,7 +4466,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 2 = нажата клавиша на клавиатуре (поступает, только когда окно активно) или нажата "горячая клавиша"; сбрасывается, когда все клавиши из буфера считаны функцией 2 - * 3 = нажата кнопка, определ╕нная ранее функцией 8 (или кнопка + * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка закрытия, созданная неявно функцией 0; кнопка минимизации обрабатывается системой и о ней сообщения не приходит; поступает, только когда окно активно; сбрасывается, когда все @@ -4430,7 +4475,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); при размаскировке функцией 40) * 5 = перерисовывается фон рабочего стола (сбрасывается автоматически после перерисовки, так что если во время перерисовки - фона программа не жд╕т и не проверяет события, то этого события + фона программа не ждёт и не проверяет события, то этого события она не заметит) * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) @@ -4447,7 +4492,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ==================== Коды ошибок файловой системы ==================== ====================================================================== * 0 = успешно - * 1 = не определена база и/или раздел ж╕сткого диска (подфункциями + * 1 = не определена база и/или раздел жёсткого диска (подфункциями 7, 8 функции 21) * 2 = функция не поддерживается для данной файловой системы * 3 = неизвестная файловая система @@ -4459,7 +4504,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 7 = указатель вне памяти приложения * 8 = диск заполнен * 9 = таблица FAT разрушена - * 10 = доступ запрещ╕н + * 10 = доступ запрещён * 11 = ошибка устройства При запуске программы возможны также следующие коды ошибок: * 30 = 0x1E = недостаточно памяти diff --git a/kernel/branches/gfx_kernel/docs/sysfuncs.txt b/kernel/branches/gfx_kernel/docs/sysfuncs.txt index b44da53481..46374b8498 100644 --- a/kernel/branches/gfx_kernel/docs/sysfuncs.txt +++ b/kernel/branches/gfx_kernel/docs/sysfuncs.txt @@ -10,7 +10,7 @@ All registers except explicitly declared in the returned value, ============== Function 0 - define and draw the window. ============== ====================================================================== Defines an application window. Draws a frame of the window, header and -working area. For windows with skin defines standard buttons for close +working area. For skinned windows defines standard buttons for close and minimize. Parameters: * eax = 0 - function number @@ -18,10 +18,10 @@ Parameters: * ecx = [coordinate on axis y]*65536 + [size on axis y] * edx = 0xXYRRGGBB, where: * Y = style of the window: - * Y=0 - type I - window of the fixed size + * Y=0 - type I - fixed-size window * Y=1 - only define window area, draw nothing - * Y=2 - type II - window of the variable size - * Y=3 - window with skin + * Y=2 - type II - variable-size window + * Y=3 - skinned window * other possible values (from 4 up to 15) are reserved, function call with such Y is ignored * RR, GG, BB = accordingly red, green, blue components of a color @@ -61,11 +61,11 @@ Remarks: * The window must fit on the screen. If the transferred coordinates and sizes do not satisfy to this condition, appropriate coordinate (or, probably, both) is considered as zero, - and if also it does not help, the appropriate size + and if it does not help too, the appropriate size (or, probably, both) is installed in a size of the screen. - Further we shall designate xpos,ypos,xsize,ysize - values - transmitted in ebx,ecx. The coordinates are resulted concerning + Further let us designate xpos,ypos,xsize,ysize - values passed + in ebx,ecx. The coordinates are resulted concerning the left upper corner of the window, which, thus, is set as (0,0), coordinates of the right lower corner essence (xsize,ysize). * The sizes of the window are understood in sence of coordinates @@ -289,7 +289,7 @@ Returned value: * function does not return value Remarks: * Sizes of the button must be more than 0 and less than 0x8000. - * For windows with skin definition of the window + * For skinned windows definition of the window (call of 0th function) creates two standard buttons - for close of the window with identifier 1 and for minimize of the window with identifier 0xffff. @@ -926,52 +926,66 @@ Remarks: process/thread by given slot. ====================================================================== -====================== Function 18, subfunction 19 ===================== -======================= Get/set mouse features. ====================== +======== Function 18, subfunction 19 - get/set mouse features. ======= ====================================================================== + +---------------- Subsubfunction 0 - get mouse speed. ----------------- Parameters: * eax = 18 - function number * ebx = 19 - subfunction number - * ecx = subsubfunction number + * ecx = 0 - subsubfunction number +Returned value: + * eax = current mouse speed - ecx = 0 - get mouse speed - Returned value: - * eax = current mouse speed +---------------- Subsubfunction 1 - set mouse speed. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 1 - subsubfunction number + * edx = new value for speed +Returned value: + * function does not return value - ecx = 1 - set mouse speed - edx = selected value of speed - Returned value: - * function does not return value +---------------- Subsubfunction 2 - get mouse delay. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 2 - subsubfunction number +Returned value: + * eax = current mouse delay - ecx = 2 - get mouse delay - Returned value: - * eax = current mouse delay - - ecx = 3 - set mouse delay - edx = selected value of delay - Returned value: - * function does not return value - - ecx = 4 - set mouse pointer position - edx = [coordinate on axis x]*65536 + [coordinate on axis y] - Returned value: - * function does not return value +---------------- Subsubfunction 3 - set mouse delay. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 3 - subsubfunction number + * edx = new value for mouse delay +Returned value: + * function does not return value +----------- Subsubfunction 4 - set mouse pointer position. ----------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 4 - subsubfunction number + * edx = [coordinate on axis x]*65536 + [coordinate on axis y] +Returned value: + * function does not return value Remarks: - * Recommended speed of the mouse (in subfunction 1) from 1 up to 9. - The installed value is not inspected by the code of a kernel, on this use - cautiously, at incorrect value the cursor can "freeze". - Speed of mouse can be regulated through the application SETUP. - * Recommended delay of the mouse (in subfunction 3) = 10. Lower value - is not handled COM by mice. At the very large values the movement of - the mouse on 1 pixel is impossible and the cursor will jump - on the value of the installed speed (subfunction 1). - The installed value is not inspected by the code of a kernel. - * In subfunction 4 the installed value is not inspected by - the code of a kernel. Before usage it is necessary to find out current - screen resolution and at installation of a position to watch, - that the value of a position should do not fall outside - the limits the screen. + * It is recommended to set speed of the mouse (in subsubfunction 1) + from 1 up to 9. The installed value is not inspected by the kernel + code, so set it carefully, at incorrect value the cursor + can "freeze". Speed of the mouse can be regulated through the + application SETUP. + * Recommended delay of the mouse (in subsubfunction 3) = 10. Lower + value is not handled by COM mice. At the very large values the + movement of the mouse on 1 pixel is impossible and the cursor will + jump on the value of installed speed (subsubfunction 1). The + installed value is not inspected by the kernel code. + * The subsubfunction 4 does not check the passed value. Before + its call find out current screen resolution (with function 14) + and check that the value of position is inside the limits of the + screen. ====================================================================== ============ Function 19 - start application from ramdisk. =========== @@ -2134,11 +2148,11 @@ Remarks: * Structure of the color table is described in the standard include file 'macros.inc' as 'system_colors'; for example, it is possible to write: - sc system_colors ; variable declaration - ... ; somewhere one must call - ; this function with ecx=sc - mov ecx, [sc.work_button_text] ; read text color on - ; buttin in working area + sc system_colors ; variable declaration + ... ; somewhere one must call + ; this function with ecx=sc + mov ecx, [sc.work_button_text] ; read text color on + ; buttin in working area * A program itself desides to use or not to use color table. For usage program must simply at calls to drawing functions select color taken from the table. @@ -2994,6 +3008,7 @@ Returned value: * eax = 0 - success, otherwise file system error code * ebx destroyed Remarks: + * This function is obsolete, use subfunction 3 of function 70. * Ramdisk and floppies do not support this function, it is only for hard disks. * File must already exist (otherwise function returns 5, not found). @@ -3288,11 +3303,11 @@ Remarks: The data of the graphics screen (the memory area which displays screen contents) are accessible to a program directly, without any system calls, through the selector gs: - mov eax, [gs:0] + mov eax, [gs:0] places in eax the first dword of the buffer, which contains information on color of the left upper point (and, possibly, colors of several following). - mov [gs:0], eax + mov [gs:0], eax by work in VESA modes with LFB sets color of the left upper point (and, possibly, colors of several following). To interpret the data of graphics screen program needs to know @@ -3854,7 +3869,7 @@ Remarks: and at arrival of new message the system will wait. For synchronization frame all work with the buffer by operations lock/unlock - neg [bufsize] + neg [bufsize] * Data in the buffer are considered as array of items with variable length - messages. Format of a message is explained in general description. @@ -4084,6 +4099,7 @@ Available subfunctions: * subfunction 0 - read file * subfunction 1 - read folder * subfunction 2 - create/rewrite file + * subfunction 3 - write to existing file * subfunction 5 - get attributes of file/folder * subfunction 6 - set attributes of file/folder * subfunction 7 - start application @@ -4243,6 +4259,35 @@ Remarks: write as many as can and then return error code 8. * The function is not supported for CD (returns error code 2). +====================================================================== +===================== Function 70, subfunction 3 ===================== +=========== Write to existing file with long names support. ========== +====================================================================== +Parameters: + * eax = 70 - function number + * ebx = pointer to the information structure +Format of the information structure: + * +0: dword: 3 = subfunction number + * +4: dword: file offset (in bytes) + * +8: dword: high dword of offset (must be 0 for FAT) + * +12 = +0xC: dword: number of bytes to write + * +16 = +0x10: dword: pointer to data + * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are + given in the general description + or + * +20 = +0x14: db 0 + * +21 = +0x15: dd pointer to ASCIIZ-string with file name +Returned value: + * eax = 0 - success, otherwise file system error code + * ebx = number of written bytes (possibly 0) +Remarks: + * The file must already exist, otherwise function returns eax=5. + * The only result of write 0 bytes is update in the file attributes + date/time of modification and access to the current date/time. + * If beginning and/or ending position is greater than file size + (except for the previous case), the file is expanded to needed + size with zero characters. + ====================================================================== ==== Function 70, subfunction 5 - get information on file/folder. ==== ====================================================================== @@ -4420,4 +4465,3 @@ Application start functions can return also following errors: * 30 = 0x1E = not enough memory * 31 = 0x1F = file is not executable * 32 = 0x20 = too many processes - diff --git a/kernel/branches/gfx_kernel/fs/fat12.inc b/kernel/branches/gfx_kernel/fs/fat12.inc index 079fed4832..1443ba12df 100644 --- a/kernel/branches/gfx_kernel/fs/fat12.inc +++ b/kernel/branches/gfx_kernel/fs/fat12.inc @@ -63,9 +63,9 @@ rdfs2_1: fdc_status_error_2: pop ecx ebx eax ret - - + + floppy_fileread: ;---------------------------------------------------------------- @@ -115,7 +115,7 @@ fr_do_1: ret fdc_status_error_1: mov [flp_status],0 - mov eax,10 + mov eax,10 mov ebx,-1 ret @@ -231,7 +231,7 @@ frfl8_1: sub [esp+24],dword 512 jmp frnew_1 -read_chs_sector: +read_chs_sector: call calculate_chs call ReadSectWithRetr ret @@ -273,7 +273,7 @@ read_flp_root: je unnecessary_root_read mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],1 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov edi,0x8000 call SeekTrack read_flp_root_1: @@ -302,7 +302,7 @@ read_flp_fat: je unnecessary_flp_fat mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov edi,0x8000 call SeekTrack read_flp_fat_1: @@ -358,7 +358,7 @@ calculatefatchain_flp: mov dword [edi],ecx add edi,4 mov dword [edi],edx - add edi,4 + add edi,4 add esi,12 cmp edi,0x282000+2856*2 ;2849 clusters @@ -366,12 +366,12 @@ calculatefatchain_flp: popad ret - + check_label: pushad mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],1 ; ╤хъЄюЁ + mov [FDD_Sector],1 ; ╤хъЄюЁ call SetUserInterrupts call FDDMotorON call RecalibrateFDD @@ -382,12 +382,12 @@ check_label: jne fdc_status_error call ReadSectWithRetr cmp [FDC_Status],0 - jne fdc_status_error + jne fdc_status_error mov esi,flp_label mov edi,0xD000+39 mov ecx,15 cld - rep cmpsb + rep cmpsb je same_label mov [root_read],0 mov [flp_fat],0 @@ -412,7 +412,7 @@ save_flp_root: je unnecessary_root_save mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],1 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov esi,0x8000 call SeekTrack save_flp_root_1: @@ -430,7 +430,7 @@ unnecessary_root_save: mov [fdc_irq_func],fdc_null popa ret - + save_flp_fat: pusha call check_label @@ -441,7 +441,7 @@ save_flp_fat: call restorefatchain_flp mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov esi,0x8000 call SeekTrack save_flp_fat_1: @@ -467,7 +467,7 @@ unnecessary_flp_fat_save: popa ret - + restorefatchain_flp: ; restore fat chain pushad @@ -563,7 +563,7 @@ fifoundd_1: mov ebx,[path_pointer_flp] add ebx,36 call get_cluster_of_a_path_flp - jc frnoreadd_1_1 + jc frnoreadd_1_1 mov edi,ebx add edi,11 jmp fifoundd_2_1 @@ -617,7 +617,7 @@ floppy_filesave: ; edi pointer to path /fd/1/...... - for all files in nested directories ; ; output : eax = 0 - ok -; 5 - file not found / directory not found +; 5 - file not found / directory not found ; 8 - disk full ; 10 - access denied ;----------------------------------------------------------- @@ -644,10 +644,10 @@ fsdel_1: ret fdc_status_error_6: - popa + popa add esp,32 jmp fdc_status_error_1 - + rd_do_save_1: push eax ebx ecx edx esi edi call read_flp_fat @@ -749,7 +749,7 @@ fifoundds_4: mov ebx,1 ; first cluster cmp [save_root_flag],0 jne frnewds_1 - call frnewds_2 + call frnewds_2 pusha call WriteSectWithRetr popa @@ -811,7 +811,7 @@ frnoreadds_1: fdc_status_error_7_1: cmp [FDC_Status],0 - je fdc_status_error_8 + je fdc_status_error_8 fdc_status_error_7: pop edi esi edx ecx ebx eax add esp,32 @@ -821,10 +821,10 @@ save_chs_sector: call calculate_chs call WriteSectWithRetr ret - + calculate_chs: mov bl,[FDD_Track] - mov [old_track],bl + mov [old_track],bl mov ebx,18 xor edx,edx div ebx @@ -846,7 +846,7 @@ no_head_2: no_seek_track_1: ret - + get_cluster_of_a_path_flp: ;--------------------------------------------------------- ; input : EBX = pointer to a path string @@ -892,7 +892,7 @@ directory_not_found_flp: pop edx stc ; errors occour ret - + analyze_directory_flp: ;-------------------------------- ; input : EAX = first cluster of the directory @@ -908,8 +908,8 @@ analyze_directory_flp: push edx push esi push edi - - + + adr56_flp: mov [clust_tmp_flp],eax add eax,31 @@ -921,7 +921,7 @@ adr56_flp: mov ecx,512/32 mov ebx,0xD000 - + adr1_analyze_flp: mov esi,edx ;[esp+16] mov edi,ebx @@ -931,10 +931,10 @@ adr1_analyze_flp: rep cmpsb pop ecx je found_file_analyze_flp - + add ebx,32 loop adr1_analyze_flp - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -942,7 +942,7 @@ adr1_analyze_flp: and eax,4095 cmp eax,0x0ff8 jb adr56_flp -not_found_file_analyze_flp: +not_found_file_analyze_flp: pop edi pop esi pop edx @@ -950,7 +950,7 @@ not_found_file_analyze_flp: add esp,4 stc ;file not found ret - + found_file_analyze_flp: pop edi pop esi @@ -959,8 +959,8 @@ found_file_analyze_flp: add esp,4 clc ;file found ret - - + + analyze_directory_to_write_flp: ;-------------------------------- ; input : EAX = first cluster of the directory @@ -970,33 +970,33 @@ analyze_directory_to_write_flp: ; ECX,EDX,EDI,EDI not changed ; IF CARRY=1 ;-------------------------------- - + push ecx push edx push esi - + adr561: mov [clust_tmp_flp],eax add eax,31 pusha - call read_chs_sector + call read_chs_sector popa cmp [FDC_Status],0 jne error_found_file_analyze1 mov ecx,512/32 mov ebx,0xD000 - + adr1_analyze1: cmp byte [ebx],0x00 je found_file_analyze1 cmp byte [ebx],0xe5 je found_file_analyze1 - + avanti: add ebx,32 loop adr1_analyze1 - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -1004,13 +1004,13 @@ avanti: and eax,4095 cmp eax,0x0ff8 jb adr561 - + call get_free_FAT ;this block of code add a new cluster ;for the directory because the directory ;is full mov [edi],word 0x0fff - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -1028,14 +1028,14 @@ avanti: mov eax,edi add eax,31 pusha - call save_chs_sector + call save_chs_sector popa cmp [FDC_Status],0 jne error_found_file_analyze1 mov ebx,0xD000 found_file_analyze1: - + pop esi pop edx pop ecx @@ -1047,15 +1047,15 @@ error_found_file_analyze1: pop edx pop ecx stc - ret - + ret + get_free_FAT_flp: ;------------------------------------------ ; input : EAX = # cluster for start the searching ; output : EAX = # first cluster found free ;------------------------------------------- push ebx - + mov ebx,1 check_new_flp: add ebx,1 @@ -1265,6 +1265,11 @@ fd_find_lfn: ret .found: mov eax, [esp+8] + add eax, 31 + cmp dword [esp], flp_root_next + jnz @f + add eax, -31+19 +@@: add esp, 16 ; CF=0 pop esi ret @@ -1915,6 +1920,304 @@ fs_FloppyRewrite: pop edi ecx jmp .ret +;---------------------------------------------------------------- +; +; fs_FloppyWrite - LFN variant for writing to floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- + +@@: + push ERROR_ACCESS_DENIED +fs_FloppyWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_FloppyWrite.ret11: + push 11 + jmp fs_FloppyWrite.ret0 + +fs_FloppyWrite: + cmp byte [esi], 0 + jz @b + call read_flp_fat + cmp [FDC_Status], 0 + jnz .ret11 + pushad + call fd_find_lfn + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push eax ; save directory cluster + push 0 ; return value=0 + + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + + push dword [edi+28] ; save current file size + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call floppy_extend_file + jnc .length_ok + mov [esp+4], eax +; floppy_extend_file can return two error codes: FAT table error or disk full. +; First case is fatal error, in second case we may write some data + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + pop eax + mov [esp+4+28], eax + pop eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + pop eax + pop eax + mov [esp+4+28], eax ; eax=return value + pop eax + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: +; save FAT & directory +; note that directory must be saved first because save_flp_fat uses buffer at 0xD000 + mov esi, [edi+28] + movzx edi, word [edi+26] ; starting cluster + mov eax, [esp+8] + pusha + call save_chs_sector + popa + cmp [FDC_Status], 0 + jnz .device_err + call save_flp_fat + cmp [FDC_Status], 0 + jz @f +.device_err: + mov byte [esp+4], 11 + jmp .ret +@@: + +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret + call SetUserInterrupts +.write_loop: + lea eax, [edi+31] ; current sector +; get length of data in current sector + push ecx + sub ebx, 0x200 + jb .hasdata + neg ebx + xor ecx, ecx + jmp @f +.hasdata: + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: +; load sector if needed + cmp dword [esp+4], 0 ; we don't need to read uninitialized data + jz .noread + cmp ecx, 0x200 ; we don't need to read sector if it is fully rewritten + jz .noread + cmp ecx, esi ; (same for the last sector) + jz .noread + pusha + call read_chs_sector + popa + cmp [FDC_Status], 0 + jz @f +.device_err2: + pop ecx + jmp .device_err +@@: +.noread: +; zero uninitialized data if file was extended (because floppy_extend_file does not this) + push eax ecx edi + xor eax, eax + mov ecx, 0x200 + sub ecx, [esp+4+12] + jbe @f + mov edi, 0xD000 + add edi, [esp+4+12] + rep stosb +@@: +; zero uninitialized data in the last sector + mov ecx, 0x200 + sub ecx, esi + jbe @f + mov edi, 0xD000 + add edi, esi + rep stosb +@@: + pop edi ecx eax +; copy new data + push eax + mov eax, edx + neg ebx + jecxz @f + add ebx, 0xD000+0x200 + call memmove + xor ebx, ebx +@@: + pop eax +; save sector + pusha + call save_chs_sector + popa + cmp [FDC_Status], 0 + jnz .device_err2 + add edx, ecx + sub [esp], ecx + pop ecx + jz .done +.next_cluster: + movzx edi, word [edi*2+0x282000] + sub esi, 0x200 + jae @f + xor esi, esi +@@: + sub dword [esp], 0x200 + jae .write_loop + and dword [esp], 0 + jmp .write_loop +.done: + mov [fdc_irq_func], fdc_null + jmp .ret + +floppy_extend_file.zero_size: + xor eax, eax + jmp floppy_extend_file.start_extend + +; extends file on floppy to given size (new data area is undefined) +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL) +floppy_extend_file: + push ecx +; find the last cluster of file + movzx eax, word [edi+26] ; first cluster + mov ecx, [edi+28] + jecxz .zero_size +@@: + sub ecx, 0x200 + jbe @f + mov eax, [eax*2+0x282000] + and eax, 0xFFF + jz .fat_err + cmp eax, 0xFF8 + jb @b +.fat_err: + pop ecx + push ERROR_FAT_TABLE + pop eax + stc + ret +@@: + push eax + mov eax, [eax*2+0x282000] + and eax, 0xFFF + cmp eax, 0xFF8 + pop eax + jb .fat_err +; set length to full number of sectors + sub [edi+28], ecx +.start_extend: + pop ecx +; now do extend + push edx esi + mov esi, 0x282000+2*2 ; start scan from cluster 2 + mov edx, 2847 ; number of clusters to scan +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new sector + push ecx + push edi +.scan: + mov ecx, edx + mov edi, esi + jecxz .disk_full + push eax + xor eax, eax + repnz scasw + pop eax + jnz .disk_full + mov word [edi-2], 0xFFF + mov esi, edi + mov edx, ecx + sub edi, 0x282000 + shr edi, 1 + dec edi ; now edi=new cluster + test eax, eax + jz .first_cluster + mov [0x282000+eax*2], di + jmp @f +.first_cluster: + pop eax ; eax->direntry + push eax + mov [eax+26], di +@@: + mov eax, edi ; eax=new cluster + pop edi ; edi->direntry + pop ecx ; ecx=required size + add dword [edi+28], 0x200 + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop esi edx + clc + ret +.disk_full: + pop edi ecx + pop esi edx + stc + push ERROR_DISK_FULL + pop eax + ret + fs_FloppyGetFileInfo: call read_flp_fat cmp [FDC_Status], 0 @@ -1951,16 +2254,9 @@ fs_FloppySetFileInfo: push eax call bdfe_to_fat_entry pop eax - test eax, eax - jz .root - add eax, 31 pusha call save_chs_sector popa - jmp .cmn -.root: - call save_flp_root -.cmn: pop edi xor eax, eax cmp [FDC_Status], 0 diff --git a/kernel/branches/gfx_kernel/fs/fat32.inc b/kernel/branches/gfx_kernel/fs/fat32.inc index ac4912dfa8..e99911d75f 100644 --- a/kernel/branches/gfx_kernel/fs/fat32.inc +++ b/kernel/branches/gfx_kernel/fs/fat32.inc @@ -2,11 +2,12 @@ ;; ;; ;; FAT32.INC ;; ;; ;; -;; FAT16/32 functions for MenuetOS ;; +;; FAT16/32 functions for KolibriOS ;; ;; ;; ;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;; ;; ;; ;; See file COPYING for details ;; +;; 17.08.2006 LFN write/append to file - diamond ;; ;; 23.06.2006 LFN start application - diamond ;; ;; 15.06.2006 LFN get/set file/folder info - diamond ;; ;; 27.05.2006 LFN create/rewrite file - diamond ;; @@ -104,7 +105,6 @@ uglobal startpath: times 255 db 0 fat16_root db 0 ; flag for fat16 rootdir - f_del db 0 ; 1=overwrite fat entry fat_change db 0 ; 1=fat has changed endg @@ -225,27 +225,12 @@ set_FAT: cmp [fat_type],16 jne sfc_test32 - cmp [f_del],1 ; overwrite previous value? - je sfc_set16 ; yes - cmp word [ebx+esi],0 ; is cluster free? - je sfc_set16 ; yes - mov dword [8*0x100000],0xffffff - mov edx,[ebx+esi] ; get old value - jmp sfc_nonzero - sfc_set16: xchg [ebx+esi],dx ; save new value and get old value jmp sfc_write sfc_test32: mov eax,[fatMASK] - cmp [f_del],1 ; overwrite previous value? - je sfc_set32 ; yes - test eax,[ebx+esi] ; is cluster free? - je sfc_set32 ; yes - mov dword [8*0x100000],0xffffff - mov edx,[ebx+esi] ; get old value - jmp sfc_nonzero sfc_set32: and edx,eax @@ -554,13 +539,10 @@ analyze_directory_to_write: push eax ; save new cluster mov edx,eax mov eax,[cluster_tmp] ; change last cluster to point new cluster - mov [f_del],1 call set_FAT cmp [hd_error],0 jne adw_not_found_1 - mov [f_del],0 - mov ecx,-1 ; remove 1 cluster from free disk space call add_disk_free_space cmp [hd_error],0 @@ -883,13 +865,10 @@ makedir: jne make_dir_error_1 mov eax,[cluster] ; directory cluster xor edx,edx ; free - mov [f_del],1 call set_FAT cmp [hd_error],0 jne make_dir_error_1 - mov [f_del],0 - popad call update_disk ; write all of cache and fat to hd make_dir_error_2: @@ -1238,12 +1217,10 @@ file_append: mov edx,eax mov eax,[cluster] - mov [f_del],1 call set_FAT ; update previous cluster cmp [hd_error],0 jne append_access_1 - mov [f_del],0 pop eax jmp append_remove_free @@ -1362,12 +1339,10 @@ file_append: truncate_pos_found: mov edx,[fatEND] ; new end for cluster chain - mov [f_del],1 call set_FAT cmp [hd_error],0 jne append_access - mov [f_del],0 mov eax,edx ; clear rest of chain truncate_clear_chain: @@ -1875,7 +1850,6 @@ clear_cluster_chain: ;----------------------------------------------------- push eax ecx edx xor ecx,ecx ; cluster count - mov [f_del],1 ; delete on clean_new_chain: cmp eax,[LAST_CLUSTER] ; end of file @@ -1897,7 +1871,6 @@ clear_cluster_chain: delete_OK: call add_disk_free_space ; add clusters to free disk space access_denied_01: - mov [f_del],0 pop edx ecx eax ret @@ -3288,7 +3261,6 @@ fat_notroot_extend_dir: mov eax, [esp+4] mov eax, [eax] push edx - mov [f_del], 1 call set_FAT pop edx cmp [hd_error], 0 @@ -3450,7 +3422,6 @@ fs_HdRewrite: mov word [edi+26], cx test eax, eax jz .done1 - mov [f_del], 1 @@: cmp eax, [fatRESERVED] jae .done1 @@ -3736,7 +3707,6 @@ fs_HdRewrite: mov ecx, eax call get_free_FAT jc .diskfull - mov [f_del], 1 push edx mov edx, [fatEND] call set_FAT @@ -3783,6 +3753,348 @@ fs_HdRewrite: popad ret +;---------------------------------------------------------------- +; +; fs_HdWrite - LFN variant for writing to floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- +fs_HdWrite.access_denied: + push ERROR_ACCESS_DENIED +fs_HdWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_HdWrite.ret11: + push 11 + jmp fs_HdWrite.ret0 + +fs_HdWrite: + cmp [fat_type], 0 + jnz @f + push ERROR_UNKNOWN_FS + jmp .ret0 +@@: + cmp byte [esi], 0 + jz .access_denied + pushad + call hd_find_lfn + pushfd + cmp [hd_error], 0 + jz @f + popfd + popad + push 11 + jmp .ret0 +@@: + popfd + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push eax ; save directory sector + push 0 ; return value=0 + + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + + push dword [edi+28] ; save current file size + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call hd_extend_file + jnc .length_ok + mov [esp+4], eax +; hd_extend_file can return three error codes: FAT table error, device error or disk full. +; First two cases are fatal errors, in third case we may write some data + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + pop eax + mov [esp+4+28], eax + pop eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + call update_disk + cmp [hd_error], 0 + jz @f + mov byte [esp+4], 11 +@@: + pop eax + pop eax + mov [esp+4+28], eax ; eax=return value + pop eax + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: + mov esi, [edi+28] + mov eax, [edi+20-2] + mov ax, [edi+26] + mov edi, eax ; edi=current cluster + xor ebp, ebp ; ebp=current sector in cluster +; save directory + mov eax, [esp+8] + push ebx + mov ebx, buffer + call hd_write + pop ebx + cmp [hd_error], 0 + jz @f +.device_err: + mov byte [esp+4], 11 + jmp .ret +@@: + +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret +.write_loop: +; get length of data in current sector + push ecx + sub ebx, 0x200 + jb .hasdata + neg ebx + xor ecx, ecx + jmp @f +.hasdata: + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: +; get current sector number + mov eax, edi + dec eax + dec eax + imul eax, [SECTORS_PER_CLUSTER] + add eax, [DATA_START] + add eax, ebp +; load sector if needed + cmp dword [esp+4], 0 ; we don't need to read uninitialized data + jz .noread + cmp ecx, 0x200 ; we don't need to read sector if it is fully rewritten + jz .noread + cmp ecx, esi ; (same for the last sector) + jz .noread + push ebx + mov ebx, buffer + call hd_read + pop ebx + cmp [hd_error], 0 + jz @f +.device_err2: + pop ecx + jmp .device_err +@@: +.noread: +; zero uninitialized data if file was extended (because hd_extend_file does not this) + push eax ecx edi + xor eax, eax + mov ecx, 0x200 + sub ecx, [esp+4+12] + jbe @f + mov edi, buffer + add edi, [esp+4+12] + rep stosb +@@: +; zero uninitialized data in the last sector + mov ecx, 0x200 + sub ecx, esi + jbe @f + mov edi, buffer + add edi, esi + rep stosb +@@: + pop edi ecx eax +; copy new data + push eax + mov eax, edx + neg ebx + jecxz @f + add ebx, buffer+0x200 + call memmove + xor ebx, ebx +@@: + pop eax +; save sector + push ebx + mov ebx, buffer + call hd_write + pop ebx + cmp [hd_error], 0 + jnz .device_err2 + add edx, ecx + sub [esp], ecx + pop ecx + jz .ret +; next sector + inc ebp + cmp ebp, [SECTORS_PER_CLUSTER] + jb @f + xor ebp, ebp + mov eax, edi + call get_FAT + mov edi, eax + cmp [hd_error], 0 + jnz .device_err +@@: + sub esi, 0x200 + jae @f + xor esi, esi +@@: + sub dword [esp], 0x200 + jae @f + and dword [esp], 0 +@@: jmp .write_loop + +hd_extend_file.zero_size: + xor eax, eax + jmp hd_extend_file.start_extend + +; extends file on hd to given size (new data area is undefined) +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL or 11) +hd_extend_file: + push ebp + mov ebp, [SECTORS_PER_CLUSTER] + imul ebp, [BYTES_PER_SECTOR] + push ecx +; find the last cluster of file + mov eax, [edi+20-2] + mov ax, [edi+26] + mov ecx, [edi+28] + jecxz .zero_size +.last_loop: + sub ecx, ebp + jbe .last_found + call get_FAT + cmp [hd_error], 0 + jz @f +.device_err: + pop ecx +.device_err2: + pop ebp + push 11 +.ret_err: + pop eax + stc + ret +@@: + cmp eax, 2 + jb .fat_err + cmp eax, [fatRESERVED] + jb .last_loop +.fat_err: + pop ecx ebp + push ERROR_FAT_TABLE + jmp .ret_err +.last_found: + push eax + call get_FAT + cmp [hd_error], 0 + jz @f + pop eax + jmp .device_err +@@: + cmp eax, [fatRESERVED] + pop eax + jb .fat_err +; set length to full number of clusters + sub [edi+28], ecx +.start_extend: + pop ecx +; now do extend + push edx + mov edx, 2 ; start scan from cluster 2 +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new cluster + push eax + mov eax, edx + call get_free_FAT + jc .disk_full + mov edx, [fatEND] + call set_FAT + mov edx, eax + pop eax + test eax, eax + jz .first_cluster + push edx + call set_FAT + pop edx + jmp @f +.first_cluster: + ror edx, 16 + mov [edi+20], dx + ror edx, 16 + mov [edi+26], dx +@@: + mov eax, edx + cmp [hd_error], 0 + jnz .device_err3 + add [edi+28], ebp + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop edx ebp + clc + ret +.device_err3: + pop edx + jmp .device_err2 +.disk_full: + pop eax edx ebp + push ERROR_DISK_FULL + pop eax + cmp [hd_error], 0 + jz @f + mov al, 11 +@@: stc + ret + fs_HdGetFileInfo: cmp [fat_type], 0 jnz @f diff --git a/kernel/branches/gfx_kernel/fs/fs_lfn.inc b/kernel/branches/gfx_kernel/fs/fs_lfn.inc index 8bdae2f0d9..2fe2a47137 100644 --- a/kernel/branches/gfx_kernel/fs/fs_lfn.inc +++ b/kernel/branches/gfx_kernel/fs/fs_lfn.inc @@ -347,7 +347,7 @@ fs_RamdiskServices: dd fs_RamdiskRead dd fs_RamdiskReadFolder dd fs_RamdiskRewrite - dd fs_NotImplemented + dd fs_RamdiskWrite dd fs_NotImplemented dd fs_RamdiskGetFileInfo dd fs_RamdiskSetFileInfo @@ -376,7 +376,7 @@ fs_FloppyServices: dd fs_FloppyRead dd fs_FloppyReadFolder dd fs_FloppyRewrite - dd fs_NotImplemented + dd fs_FloppyWrite dd fs_NotImplemented dd fs_FloppyGetFileInfo dd fs_FloppySetFileInfo @@ -447,7 +447,7 @@ fs_HdServices: dd fs_HdRead dd fs_HdReadFolder dd fs_HdRewrite - dd fs_NotImplemented + dd fs_HdWrite dd fs_NotImplemented dd fs_HdGetFileInfo dd fs_HdSetFileInfo diff --git a/kernel/trunk/blkdev/rd.inc b/kernel/trunk/blkdev/rd.inc index 5e2f7c4219..ea37c5413f 100644 --- a/kernel/trunk/blkdev/rd.inc +++ b/kernel/trunk/blkdev/rd.inc @@ -1788,6 +1788,7 @@ fs_RamdiskRewrite: sub ebx, edx mov [edi+28], ebx add esp, 20 + mov [esp+16], ebx popad xor eax, eax ret @@ -1797,6 +1798,7 @@ fs_RamdiskRewrite: sub ebx, edx mov [edi+28], ebx add esp, 20 + mov [esp+16], ebx popad push ERROR_DISK_FULL pop eax @@ -1820,6 +1822,230 @@ fs_RamdiskRewrite: loop .read_symbols ret +;---------------------------------------------------------------- +; +; fs_RamdiskWrite - LFN variant for writing to sys floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- +@@: + push ERROR_ACCESS_DENIED +fs_RamdiskWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_RamdiskWrite: + cmp byte [esi], 0 + jz @b + pushad + call rd_find_lfn + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; must not be directory + test byte [edi+11], 10h + jz @f + popad + push ERROR_ACCESS_DENIED + jmp .ret0 +@@: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push 0 ; return value=0 + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call ramdisk_extend_file + jnc .length_ok +; ramdisk_extend_file can return two error codes: FAT table error or disk full. +; First case is fatal error, in second case we may write some data + mov [esp], eax + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + mov [esp+28], eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + pop eax + mov [esp+28], eax ; eax=return value + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret + movzx edi, word [edi+26] ; starting cluster +.write_loop: + sub ebx, 0x200 + jae .next_cluster + push ecx + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: + mov eax, edi + shl eax, 9 + add eax, 0x100000+31*512+0x200 + sub eax, ebx + mov ebx, eax + mov eax, edx + call memmove + xor ebx, ebx + add edx, ecx + sub [esp], ecx + pop ecx + jz .ret +.next_cluster: + movzx edi, word [edi*2+0x280000] + jmp .write_loop + +ramdisk_extend_file.zero_size: + xor eax, eax + jmp ramdisk_extend_file.start_extend + +; extends file on ramdisk to given size, new data area is filled by 0 +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL) +ramdisk_extend_file: + push ecx +; find the last cluster of file + movzx eax, word [edi+26] ; first cluster + mov ecx, [edi+28] + jecxz .zero_size +@@: + sub ecx, 0x200 + jbe @f + mov eax, [eax*2+0x280000] + and eax, 0xFFF + jz .fat_err + cmp eax, 0xFF8 + jb @b +.fat_err: + pop ecx + push ERROR_FAT_TABLE + pop eax + stc + ret +@@: + push eax + mov eax, [eax*2+0x280000] + and eax, 0xFFF + cmp eax, 0xFF8 + pop eax + jb .fat_err +; set length to full number of sectors and make sure that last sector is zero-padded + sub [edi+28], ecx + push eax edi + mov edi, eax + shl edi, 9 + lea edi, [edi+0x100000+31*512+0x200+ecx] + neg ecx + xor eax, eax + rep stosb + pop edi eax +.start_extend: + pop ecx +; now do extend + push edx esi + mov esi, 0x280000+2*2 ; start scan from cluster 2 + mov edx, 2847 ; number of clusters to scan +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new sector + push ecx + mov ecx, edx + push edi + mov edi, esi + jecxz .disk_full + push eax + xor eax, eax + repnz scasw + pop eax + jnz .disk_full + mov word [edi-2], 0xFFF + mov esi, edi + mov edx, ecx + sub edi, 0x280000 + shr edi, 1 + dec edi ; now edi=new cluster + test eax, eax + jz .first_cluster + mov [0x280000+eax*2], di + jmp @f +.first_cluster: + pop eax ; eax->direntry + push eax + mov [eax+26], di +@@: + push edi + shl edi, 9 + add edi, 0x100000+31*512 + xor eax, eax + mov ecx, 512/4 + rep stosd + pop eax ; eax=new cluster + pop edi ; edi->direntry + pop ecx ; ecx=required size + add dword [edi+28], 0x200 + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop esi edx + clc + ret +.disk_full: + pop edi ecx + pop esi edx + stc + push ERROR_DISK_FULL + pop eax + ret + fs_RamdiskGetFileInfo: cmp byte [esi], 0 jnz @f diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 077099c6b1..7b716d0f01 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -29,7 +29,7 @@ (игнорируется для стиля Y=2) * X = DCBA (биты) * A = 1 - у окна есть заголовок; для стиля Y=3 адрес строки - заголовка зада+тся в edi, для прочих стилей + заголовка задаётся в edi, для прочих стилей используется подфункция 1 функции 71 * B = 1 - координаты всех графических примитивов задаются относительно клиентской области окна @@ -89,11 +89,11 @@ * Вид окна стиля Y=1: * полностью определяется приложением * Вид окна типа II: - * рисуется внешняя рамка шириной 1 пиксель "затен+нного" цвета + * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета edi (все составляющие цвета уменьшаются в два раза) * рисуется промежуточная рамка шириной 3 пикселя цвета edi * рисуется внутренняя рамка шириной 1 пиксель - "затен+нного" цвета edi + "затенённого" цвета edi * рисуется заголовок - прямоугольник с левым верхним углом (4,4) и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi (с учетом градиента) @@ -151,7 +151,7 @@ Замечания: * Существует общесистемный буфер нажатых клавиш размером 120 байт, организованный как очередь. - * Существует ещ+ один общесистемный буфер на 120 "горячих клавиш". + * Существует ещё один общесистемный буфер на 120 "горячих клавиш". * При вызове этой функции приложением с неактивным окном считается, что буфер нажатых клавиш пуст. * По умолчанию эта функция возвращает ASCII-коды; переключиться на @@ -200,7 +200,7 @@ Замечания: * Выводятся либо первые (esi and 0xFF) символов, либо все символы до (но не включая) завершающего нуля - (для ASCIIZ-строк) в зависимости от того, что произойд+т раньше. + (для ASCIIZ-строк) в зависимости от того, что произойдёт раньше. * Первый системный шрифт считывается при загрузке из файла char.mt, второй - из char2.mt. * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта @@ -445,7 +445,7 @@ Возвращаемое значение: * функция не возвращает значения Замечания: - * Функция начала перерисовки удаляет все определ+нные + * Функция начала перерисовки удаляет все определённые функцией 8 кнопки, их следует определить повторно. ====================================================================== @@ -489,7 +489,7 @@ * функция не возвращает значения Замечания: * Проверок на корректность не делается. Установка слишком больших - значений привед+т к тому, что в фон войдут данные за границей + значений приведёт к тому, что в фон войдут данные за границей буфера фонового изображения. Размер буфера = 0x160000-0x10, что соответствует максимальным размерам 800*600. (800*600*3=0x15F900) * Для обновления экрана (после завершения серии команд, работающих с @@ -636,7 +636,7 @@ * Узнать, какое окно является активным, можно вызовом подфункции 7. ====================================================================== - Функция 18, подфункция 4 - получить сч+тчик пустых тактов в секунду. + Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. ====================================================================== Под пустыми тактами понимается время, в которое процессор простаивает в ожидании прерывания (в инструкции hlt). @@ -645,7 +645,7 @@ * eax = 18 - номер функции * ebx = 4 - номер подфункции Возвращаемое значение: - * eax = значение сч+тчика пустых тактов в секунду + * eax = значение счётчика пустых тактов в секунду ====================================================================== ======== Функция 18, подфункция 5 - получить тактовую частоту. ======= @@ -657,7 +657,7 @@ * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц) ====================================================================== - Функция 18, подфункция 6 - сохранить рамдиск в файл на ж+стком диске. + Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. ====================================================================== Параметры: * eax = 18 - номер функции @@ -666,16 +666,16 @@ * 1 = в папке "/KOLIBRI" * 2 = в корневом каталоге * 3 = edx указывает на путь (имена папок в формате 8+3, - раздел+нные '/') + разделённые '/') Возвращаемое значение: * eax = 0 - успешно * иначе eax = код ошибки файловой системы Замечания: * Имя файла фиксировано, "menuet.img" (глобальная переменная ядра image_save из preboot.inc) - * На каком разделе какого диска файл будет сохран+н, определяется + * На каком разделе какого диска файл будет сохранён, определяется подфункцией 7 и подфункцией 8 функции 21. - * Все папки в указанном пути должны существовать, иначе верн+тся + * Все папки в указанном пути должны существовать, иначе вернётся значение 5, "файл не найден". ====================================================================== @@ -689,14 +689,14 @@ активно) Замечания: * Активное окно находится вверху оконного стэка и получает - сообщения обо вс+м вводе с клавиатуры. + сообщения обо всём вводе с клавиатуры. * Сделать окно активным можно вызовом подфункции 3. ====================================================================== ==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ==== ====================================================================== -При отключ+нном звуке вызовы подфункции 55 функции 55 игнорируются. -При включ+нном - направляются на встроенный спикер. +При отключённом звуке вызовы подфункции 55 функции 55 игнорируются. +При включённом - направляются на встроенный спикер. --------------- Подподфункция 1 - получить состояние. ---------------- Параметры: @@ -704,7 +704,7 @@ * ebx = 8 - номер подфункции * ecx = 1 - номер подподфункции Возвращаемое значение: - * eax = 0 - звук спикера разреш+н; 1 - запрещ+н + * eax = 0 - звук спикера разрешён; 1 - запрещён -------------- Подподфункция 2 - переключить состояние. -------------- Переключает состояния разрешения/запрещения. @@ -756,10 +756,10 @@ и размеры. * Восстановление окна приложения происходит при активизировании подфункцией 3. - * Обычно нет необходимости явно сворачивать/разворачивать сво+ окно: + * Обычно нет необходимости явно сворачивать/разворачивать своё окно: сворачивание окна осуществляется системой при нажатии на кнопку минимизации (которая для окон со скином определяется автоматически - функцией 0, для окон без скина е+ можно определить функцией 8), + функцией 0, для окон без скина её можно определить функцией 8), восстановление - приложением @panel. ====================================================================== @@ -777,7 +777,7 @@ * функция не возвращает значения Формат таблицы: короткая версия: * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB, - где AAAA зада+т тип первого дисковода, BBBB - второго согласно + где AAAA задаёт тип первого дисковода, BBBB - второго согласно следующему списку: * 0 = нет дисковода * 1 = 360Kb, 5.25'' @@ -788,19 +788,19 @@ Например, для стандартной конфигурации из одного 1.44-дисковода здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B: значение оказывается 24h. - * +1: byte: информация о ж+стких дисках и CD-приводах, AABBCCDD, + * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD, где AA соответствует контроллеру IDE0, ..., DD - IDE3: * 0 = устройство отсутствует - * 1 = ж+сткий диск + * 1 = жёсткий диск * 2 = CD-привод Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h. - * +2: 4 db: число найденных разделов на ж+стких дисках с + * +2: 4 db: число найденных разделов на жёстких дисках с соответственно IDE0,...,IDE3. - При отсутствии ж+сткого диска на IDEx соответствующий байт + При отсутствии жёсткого диска на IDEx соответствующий байт нулевой, при наличии показывает число распознанных разделов, которых может и не быть (если носитель не отформатирован или если файловая система не поддерживается). В текущей версии ядра - для ж+стких дисков поддерживаются только FAT16 и FAT32. + для жёстких дисков поддерживаются только FAT16 и FAT32. * +6: 4 db: зарезервировано Формат таблицы: полная версия: * +0: 10 db: такие же, как и в короткой версии @@ -871,7 +871,7 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 18, подфункция 14 ===================== -======= Ожидать начала обратного хода луча разв+ртки монитора. ======= +======= Ожидать начала обратного хода луча развёртки монитора. ======= ====================================================================== Параметры: * eax = 18 - номер функции @@ -930,52 +930,65 @@ db 'Kolibri',0 процесса/потока по заданному слоту. ====================================================================== -====================== Функция 18, подфункция 19 ===================== -============= Получить/установить настройки мыши. =================== +=== Функция 18, подфункция 19 - получить/установить настройки мыши. == ====================================================================== + +------------- Подподфункция 0 - получить скорость мыши. -------------- Параметры: * eax = 18 - номер функции * ebx = 19 - номер подфункции - * ecx = номер пофункции 2-го уровня. + * ecx = 0 - номер подподфункции +Возвращаемое значение: + * eax = текущая скорость мыши - ecx = 0 - получить скорость мыши - Возвращаемое значение: - * eax = текущая скорость мыши +------------ Подподфункция 1 - установить скорость мыши. ------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 1 - номер подподфункции + * edx = новое значение скорости +Возвращаемое значение: + * функция не возвращает значения - ecx = 1 - установить скорость мыши - edx = устанавливаемое значение скорости - Возвращаемое значение: - * функция не возвращает значения +------------- Подподфункция 2 - получить задержку мыши. -------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 2 - номер подподфункции +Возвращаемое значение: + * eax = текущая задержка мыши - ecx = 2 - получить задержку ускорения - Возвращаемое значение: - * eax = текущая задержка ускорения - - ecx = 3 - установить задержку ускорения - edx = устанавливаемая задержка ускорения - Возвращаемое значение: - * функция не возвращает значения - - ecx = 4 - установить позицию курсора мыши на экране - edx = [координата по оси x]*65536 + [координата по оси y] - Возвращаемое значение: - * функция не возвращает значения +------------ Подподфункция 3 - установить задержку мыши. ------------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 3 - номер подподфункции + * edx = новое значение задержки мыши +Возвращаемое значение: + * функция не возвращает значения +-------- Подподфункция 4 - установить положение курсора мыши. -------- +Параметры: + * eax = 18 - номер функции + * ebx = 19 - номер подфункции + * ecx = 4 - номер подподфункции + * edx = [координата по оси x]*65536 + [координата по оси y] +Возвращаемое значение: + * функция не возвращает значения Замечания: - * Рекомендуемая скорость мыши (в подфункции 1) от 1 до 9. - Устанавливаемая величина не контролируется кодом ядра, по этому - используйте осторожно, при некорректном значении курсор может "замерзнуть". - Скорость мыши можно регулировать через приложение SETUP. - * Рекомендуемая величина задержки (в подфункции 3) = 10. Более низкое - значение не обрабатывается COM мышами. При очень больших значениях - невозможно передвижение мыши на 1 пиксель и курсор будет прыгать - на величину установленной скорости (подфункция 1). - Величину задержки можно регулировать через приложение SETUP. - Устанавливаемая величина не контролируется кодом ядра. - * В подфункции 4 устанавливаемая величина не контролируется кодом ядра. - Перед использованием необходимо узнать текущее разрешение экрана и - при установке позиции следить, чтобы величина позиции не выходила за - пределы экрана. + * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9. + Устанавливаемая величина не проверяется кодом ядра, поэтому + используйте осторожно, при некорректном значении курсор может + "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP. + * Рекомендуемая величина задержки (в подподфункции 3) = 10. + Меньшие значения не обрабатываются COM-мышами. При очень больших + значениях невозможно передвижение мыши на 1 пиксель и курсор будет + прыгать на величину установленной скорости (подподфункция 1). + Устанавливаемая величина не проверяется кодом ядра. + * Подподфункция 4 не проверяет переданное значение. Перед вызовом + необходимо узнать текущее разрешение экрана (подфункцией 14) + и проверить, что устанавливаемое положение не выходит за пределы + экрана. ====================================================================== ============ Функция 19 - запустить программу с рамдиска. ============ @@ -1010,9 +1023,9 @@ db 'Kolibri',0 * cl = байт для вывода Возвращаемое значение (одинаково для обеих подфункций): * eax = 0 - успешно - * eax = 1 - не определ+н базовый порт + * eax = 1 - не определён базовый порт Замечания: - * Предварительно должен быть определ+н базовый порт вызовом + * Предварительно должен быть определён базовый порт вызовом подфункции 1 функции 21. ====================================================================== @@ -1131,9 +1144,9 @@ db 'Kolibri',0 ====================================================================== =========== Функция 21, подфункция 7 - установить базу HD. =========== ====================================================================== -База HD нужна для определения, на какой ж+сткий диск писать, при +База HD нужна для определения, на какой жёсткий диск писать, при использовании устаревших функций работы с файловой системой и функций, -неявно использующих ж+сткий диск (типа подфункции 6 функции 18); +неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу. Параметры: @@ -1145,17 +1158,17 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить базу. * Не следует изменять базу, когда какое-нибудь приложение работает - с ж+стким диском. Если не хотите глюков системы. + с жёстким диском. Если не хотите глюков системы. * Получить установленную базу можно вызовом подфункции 7 функции 26. - * Следует также определить используемый раздел ж+сткого диска + * Следует также определить используемый раздел жёсткого диска подфункцией 8. ====================================================================== ========== Функция 21, подфункция 8 - установить раздел HD. ========== ====================================================================== -Раздел HD нужен для определения, на какой раздел ж+сткого диска +Раздел HD нужен для определения, на какой раздел жёсткого диска писать, при использовании устаревших функций работы с файловой -системой и функций, неявно использующих ж+сткий диск (типа +системой и функций, неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу и раздел. @@ -1168,13 +1181,13 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить раздел. * Не следует изменять раздел, когда какое-нибудь приложение работает - с ж+стким диском. Если не хотите глюков системы. + с жёстким диском. Если не хотите глюков системы. * Получить установленный раздел можно вызовом подфункции 8 функции 26. * Проверок на корректность не делается. - * Узнать число разделов на ж+стком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Следует также определить используемую базу ж+сткого диска + * Следует также определить используемую базу жёсткого диска подфункцией 7. ====================================================================== @@ -1239,7 +1252,7 @@ db 'Kolibri',0 * если драйвер загружен: * eax = 'MDAZ' (в стиле fasm'а, т.е. 'M' - младший байт, 'Z' - старший) - сигнатура - * ebx = текущая частота разв+ртки (в Гц) + * ebx = текущая частота развёртки (в Гц) * ecx разрушается * буфер, на который указывает edx, заполнен Формат буфера: @@ -1250,15 +1263,15 @@ db 'Kolibri',0 * +36 = +0x24: 7*dword: зарезервировано (0 в текущей реализации) * +64 = +0x40: 32*word: список поддерживаемых видеорежимов (каждое слово - номер видеорежима, после собственно списка идут нули) - * +128 = +0x80: 32*(5*word): список поддерживаемых частот разв+рток + * +128 = +0x80: 32*(5*word): список поддерживаемых частот развёрток для видеорежимов: для каждого видеорежима, указанного в предыдущем поле, указано до 5 поддерживаемых частот (в неиспользуемых позициях записаны нули) Замечания: - * Функция инициализирует драйвер (если он ещ+ не инициализирован) + * Функция инициализирует драйвер (если он ещё не инициализирован) и должна вызываться первой, перед остальными (иначе они будут возвращать -1, ничего не делая). - * В текущей реализации поддерживается только одна частота разв+ртки + * В текущей реализации поддерживается только одна частота развёртки на видеорежим. ====================================================================== @@ -1273,13 +1286,13 @@ db 'Kolibri',0 * eax = -1 - драйвер не загружен или не инициализирован; ebx,ecx разрушаются * eax = [ширина]*65536 + [высота] - * ebx = частота вертикальной разв+ртки (в Гц) + * ebx = частота вертикальной развёртки (в Гц) * ecx = номер текущего видеорежима Замечания: * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Если нужны только размеры экрана, целесообразней использовать - функцию 14 с уч+том того, что она возвращает размеры на 1 меньше. + функцию 14 с учётом того, что она возвращает размеры на 1 меньше. ====================================================================== = Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. @@ -1288,7 +1301,7 @@ db 'Kolibri',0 * eax = 21 - номер функции * ebx = 13 - номер подфункции * ecx = 3 - номер функции драйвера - * edx = [частота разв+ртки]*65536 + [номер видеорежима] + * edx = [частота развёртки]*65536 + [номер видеорежима] Возвращаемое значение: * eax = -1 - драйвер не загружен, не инициализирован или произошла ошибка @@ -1373,7 +1386,7 @@ db 'Kolibri',0 * Вообще-то CMOS поддерживает для будильника установку значения 0xFF в качестве одного из параметров и означает это, что соответствующий параметр игнорируется. Но в текущей реализации - это не пройд+т (верн+тся значение 1). + это не пройдёт (вернётся значение 1). * Будильник - глобальный системный ресурс; установка будильника автоматически отменяет предыдущую установку. Впрочем, на данный момент ни одна программа его не использует. @@ -1381,7 +1394,7 @@ db 'Kolibri',0 ====================================================================== ============== Функция 23 - ожидать события с таймаутом. ============= ====================================================================== -Если очередь сообщений пуста, жд+т появления сообщения в очереди, +Если очередь сообщений пуста, ждёт появления сообщения в очереди, но не более указанного времени. Затем считывает сообщение из очереди. Параметры: @@ -1397,8 +1410,8 @@ db 'Kolibri',0 * Для проверки, есть ли сообщение в очереди, используйте функцию 11. Чтобы ждать сколь угодно долго, используйте функцию 10. * Передача ebx=0 приводит к моментальному возвращению eax=0. - * При текущей реализации произойд+т немедленный возврат из функции - с eax=0, если сложение ebx с текущим значением сч+тчика времени + * При текущей реализации произойдёт немедленный возврат из функции + с eax=0, если сложение ebx с текущим значением счётчика времени вызовет 32-битное переполнение. ====================================================================== @@ -1577,9 +1590,9 @@ db 'Kolibri',0 ====================================================================== ============ Функция 26, подфункция 7 - получить базу HD. ============ ====================================================================== -База HD нужна для определения, на какой ж+сткий диск писать, при +База HD нужна для определения, на какой жёсткий диск писать, при использовании устаревших функций работы с файловой системой и функций, -неявно использующих ж+сткий диск (типа подфункции 6 функции 18); +неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу. Параметры: @@ -1590,14 +1603,14 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить базу. * Установить базу можно вызовом подфункции 7 функции 21. - * Получить используемый раздел ж+сткого диска можно подфункцией 8. + * Получить используемый раздел жёсткого диска можно подфункцией 8. ====================================================================== =========== Функция 26, подфункция 8 - получить раздел HD. =========== ====================================================================== -Раздел HD нужен для определения, на какой раздел ж+сткого диска +Раздел HD нужен для определения, на какой раздел жёсткого диска писать, при использовании устаревших функций работы с файловой -системой и функций, неявно использующих ж+сткий диск (типа +системой и функций, неявно использующих жёсткий диск (типа подфункции 6 функции 18); при использовании функций 58 и 70 и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу и раздел. @@ -1609,12 +1622,12 @@ db 'Kolibri',0 Замечания: * Любое приложение в любой момент времени может изменить раздел. * Установить раздел можно вызовом подфункции 8 функции 21. - * Узнать число разделов на ж+стком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Получить используемую базу ж+сткого диска можно подфункцией 7. + * Получить используемую базу жёсткого диска можно подфункцией 7. ====================================================================== -=== Функция 26, подфункция 9 - получить значение сч+тчика времени. === +=== Функция 26, подфункция 9 - получить значение счётчика времени. === ====================================================================== Параметры: * eax = 26 - номер функции @@ -1623,7 +1636,7 @@ db 'Kolibri',0 * eax = число сотых долей секунды, прошедших с момента запуска системы Замечания: - * Сч+тчик бер+тся по модулю 2^32, что соответствует немногим более + * Счётчик берётся по модулю 2^32, что соответствует немногим более 497 суток. * Системное время можно получить функцией 3. @@ -1642,13 +1655,13 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 26, подфункция 11 ===================== -=========== Узнать, разреш+н ли низкоуровневый доступ к HD. ========== +=========== Узнать, разрешён ли низкоуровневый доступ к HD. ========== ====================================================================== Параметры: * eax = 26 - номер функции * ebx = 11 - номер подфункции Возвращаемое значение: - * eax = 0/1 - запрещ+н/разреш+н + * eax = 0/1 - запрещён/разрешён Замечания: * Используется при LBA-чтении (подфункция 8 функции 58). * Установить текущее состояние можно вызовом @@ -1656,13 +1669,13 @@ db 'Kolibri',0 ====================================================================== ====================== Функция 26, подфункция 12 ===================== -========== Узнать, разреш+н ли низкоуровневый доступ к PCI. ========== +========== Узнать, разрешён ли низкоуровневый доступ к PCI. ========== ====================================================================== Параметры: * eax = 26 - номер функции * ebx = 12 - номер подфункции Возвращаемое значение: - * eax = 0/1 - запрещ+н/разреш+н + * eax = 0/1 - запрещён/разрешён Замечания: * Используется при работе с шиной PCI (функция 62). * Текущая реализация использует только младший бит ecx. @@ -1762,7 +1775,7 @@ db 'Kolibri',0 * Эта функция устарела; функция 70 позволяет выполнять те же действия с расширенными возможностями. * Если указать ненулевое значение в esi и на рамдиске уже есть - указанный файл, то будет создан ещ+ один файл с тем же именем. + указанный файл, то будет создан ещё один файл с тем же именем. * В противном случае файл перезаписывается. * Имя файла должно быть либо в формате 8+3 символов (первые 8 символов - собственно имя, последние 3 - расширение, @@ -1814,7 +1827,7 @@ db 'Kolibri',0 Если y>=ywnd, то младшее слово неотрицательно и содержит относительную y-координату, а старшее - относительную x-координату (правильного знака). В противном случае младшее слово отрицательно - и вс+ равно содержит относительную y-координату, + и всё равно содержит относительную y-координату, а к старшему слову следует прибавить 1. ----------------- Подфункция 2 - нажатые кнопки мыши ----------------- @@ -1891,7 +1904,7 @@ db 'Kolibri',0 ======== Функция 40 - установить маску для ожидаемых событий. ======== ====================================================================== Маска для ожидаемых событий влияет на функции работы с событиями 10, -11, 23 - они сообщают только о событиях, разреш+нных этой маской. +11, 23 - они сообщают только о событиях, разрешённых этой маской. Параметры: * eax = 40 - номер функции * ebx = маска: бит i соответствует событию i+1 (см. список событий) @@ -1902,7 +1915,7 @@ db 'Kolibri',0 * Маска по умолчанию (7=111b) разрешает извещения о перерисовке и нажатиях клавиш и кнопок. Этого достаточно для большинства приложений. - * События, запрещ+нные в маске, вс+ равно сохраняются, если + * События, запрещённые в маске, всё равно сохраняются, если приходят; о них просто не извещают функции работы с событиями. * Функции работы с событиями учитывают маску на момент вызова функции, а не на момент поступления сообщения. @@ -1935,8 +1948,8 @@ db 'Kolibri',0 * eax = 0 * ecx = 1 * ebx разрушается - * если вс+ в порядке и данные были: - * eax = размер данных, ещ+ не прочитанных из буфера (в байтах) + * если всё в порядке и данные были: + * eax = размер данных, ещё не прочитанных из буфера (в байтах) * ecx = 0 * ebx = очередной байт Замечания: @@ -1964,7 +1977,7 @@ db 'Kolibri',0 * ebx игнорируется * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF) Возвращаемое значение: - * eax = 0 - успешно, при этом ebx = введ+нный байт + * eax = 0 - успешно, при этом ebx = введённый байт * eax = 1 - поток не зарезервировал данный порт Замечания: * Предварительно поток должен зарезервировать за собой @@ -1972,7 +1985,7 @@ db 'Kolibri',0 * Для зарезервированных портов вместо вызова этих функций лучше использовать команды процессора in/out - это значительно быстрее и несколько короче и проще. Из незарезервированных - портов читать вс+ равно нельзя. + портов читать всё равно нельзя. ====================================================================== ======== Функция 44 - определить действия при поступлении IRQ. ======= @@ -2102,7 +2115,7 @@ db 'Kolibri',0 * ebx = 1 - номер подфункции * ecx = тип кнопок: * 0 = плоские - * 1 = объ+мные + * 1 = объёмные Возвращаемое значение: * функция не возвращает значения Замечания: @@ -2127,7 +2140,7 @@ db 'Kolibri',0 подфункцией 0. * Таблица стандартных цветов влияет только на приложения, которые эту таблицу явным образом получают (подфункцией 3) и - используют (указывая цвета из не+ при вызовах функций рисования). + используют (указывая цвета из неё при вызовах функций рисования). * Таблица стандартных цветов входит в скин и устанавливается заново при установке скина (подфункции 8). * Таблицу цветов можно просматривать/изменять интерактивно с помощью @@ -2162,11 +2175,11 @@ dword- Замечания: * Структура таблицы цветов описана в стандартном включаемом файле macros.inc под названием system_colors; например, можно писать: - sc system_colors ; объявление переменной - ... ; где-то надо вызвать - ; описываемую функцию с ecx=sc - mov ecx, [sc.work_button_text] ; читаем цвет текста - ; на кнопке в рабочей области + sc system_colors ; объявление переменной + ... ; где-то надо вызвать + ; описываемую функцию с ecx=sc + mov ecx, [sc.work_button_text] ; читаем цвет текста + ; на кнопке в рабочей области * Использование/неиспользование этих цветов - дело исключительно самой программы. Для использования нужно просто при вызове функций рисования указывать цвет, взятый из этой таблицы. @@ -2273,7 +2286,7 @@ dword- поле промежуточного буфера и указано имя файла Возвращаемое значение: * eax = 0 - успешно - * иначе eax = код ошибки файловой системы; если файл не зада+т скин, + * иначе eax = код ошибки файловой системы; если файл не задаёт скин, то возвращается ошибка 3 (неизвестная файловая система). Замечания: * При успешной загрузке скина все окна извещаются о необходимости @@ -2308,7 +2321,7 @@ dword- ================= Функция 50 - установка формы окна. ================= ====================================================================== Обычные окна представляют собой прямоугольники. С помощью этой функции -окну можно придать произвольную форму. Форма зада+тся набором точек +окну можно придать произвольную форму. Форма задаётся набором точек внутри обрамляющего прямоугольника, принадлежащих окну. Положение и размеры обрамляющего прямоугольника задаются функцией 0 и изменяются функцией 67. @@ -2325,7 +2338,7 @@ dword- Параметры: * eax = 50 - номер функции * ebx = 1 - номер подфункции - * ecx зада+т масштаб: каждый байт данных определяет + * ecx задаёт масштаб: каждый байт данных определяет (2^scale)*(2^scale) пикселей Возвращаемое значение: * функция не возвращает значения @@ -2519,8 +2532,8 @@ dword- * eax = 53 - номер функции * ebx = 0 - номер подфункции * ecx = локальный порт (учитывается только младшее слово) - * edx = удал+нный порт (учитывается только младшее слово) - * esi = удал+нный IP + * edx = удалённый порт (учитывается только младшее слово) + * esi = удалённый IP Возвращаемое значение: * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается * eax = хэндл сокета (некоторое число, однозначно идентифицирующее @@ -2601,8 +2614,8 @@ dword- * eax = 53 - номер функции * ebx = 5 - номер подфункции * ecx = локальный порт (учитывается только младшее слово) - * edx = удал+нный порт (учитывается только младшее слово) - * esi = удал+нный IP + * edx = удалённый порт (учитывается только младшее слово) + * esi = удалённый IP * edi = режим открытия: SOCKET_PASSIVE=0 или SOCKET_ACTIVE=1 Возвращаемое значение: * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается @@ -2707,7 +2720,7 @@ dword- * 201: размер таблицы ARP (в элементах) (20 в текущей версии) * 202: прочитать элемент edx таблицы ARP во временный буфер, откуда берут информацию 5 последующих типов; - в этом случае eax неопредел+н + в этом случае eax неопределён * 203: IP-адрес, запомненный типом 202 * 204: старшее dword MAC-адреса, запомненного типом 202 * 205: младшее word MAC-адреса, запомненного типом 202 @@ -2743,9 +2756,9 @@ dword- * функция не возвращает значения Замечания: * Предварительно данные должны быть загружены подфункцией 0 и - определ+н их формат подфункцией 2. + определён их формат подфункцией 2. * Функция возвращает управление, когда началось проигрывание данных; - после этого проигрывание ид+т независимо от приложения (и вообще + после этого проигрывание идёт независимо от приложения (и вообще не требует загрузки процессора). * Предварительно должны быть определены базовый порт SB16 (подфункцией 4 функции 21) и канал DMA @@ -2783,18 +2796,18 @@ dword- * esi = указатель на данные Возвращаемое значение: * eax = 0 - успешно - * eax = 55 - ошибка (спикер отключ+н или занят) + * eax = 55 - ошибка (спикер отключён или занят) Данные - это массив элементов переменной длины. Формат каждого элемента определяется первым байтом: * 0 = конец данных - * 1..0x80 = зада+т длительность звучания в сотых долях секунды + * 1..0x80 = задаёт длительность звучания в сотых долях секунды ноты, определяемой непосредственным значением частоты * следующее слово (2 байта) содержит делитель частоты; частота определяется как 1193180/divider * 0x81 = invalid * 0x82..0xFF = нота, определяемая октавой и номером: * длительность в сотых долях секунды = (первый байт)-0x81 - * присутствует ещ+ один байт; + * присутствует ещё один байт; * (второй байт)=0xFF - пауза * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1 до 12, a=номер октавы (считая с 0) @@ -2802,12 +2815,12 @@ dword- * Пищание спикером может быть запрещено/разрешено подфункцией 8 функции 18. * Функция возвращает управление, сообщив куда следует информацию - о запросе. Само проигрывание ид+т независимо от программы. + о запросе. Само проигрывание идёт независимо от программы. * Данные должны сохраняться в памяти по крайней мере до конца проигрывания. ====================================================================== -============= Функция 56 - записать файл на ж+сткий диск. ============ +============= Функция 56 - записать файл на жёсткий диск. ============ ====================================================================== Параметры: * eax = 56 - номер функции @@ -2820,11 +2833,11 @@ dword- Замечания: * Эта функция устарела; функция 70 позволяет выполнять те же действия с расширенными возможностями. - * Данная функция предполагает, что во время е+ вызова одним + * Данная функция предполагает, что во время её вызова одним приложением никакое другое приложение не работает - с ж+стким диском. + с жёстким диском. * Путь к файлу - ASCIIZ-строка, которая может быть пустой - (если файл созда+тся в корневом каталоге) или иметь формат + (если файл создаётся в корневом каталоге) или иметь формат /d1/d2/.../dn, где все имена папок должны иметь формат 8+3, т.е. 8 символов имени и 3 символа расширения без разделителя, при необходимости дополненные пробелами; @@ -2859,7 +2872,7 @@ dword- * /RD/1 = /RAMDISK/1 для доступа к рамдиску * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода - * /HD/x = /HARDDISK/x - устаревший вариант доступа к ж+сткому диску + * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску (в этом случае база определяется подфункцией 7 функции 21), x - номер раздела (считая с 1) * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно @@ -2908,7 +2921,7 @@ dword- * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы @@ -2923,7 +2936,7 @@ dword- документации по FAT. * Размер папки определяется по размеру цепочки кластеров в FAT. * Если файл кончился раньше, чем был прочитан последний запрошенный - блок, то функция прочитает, сколько сможет, после чего верн+т + блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но в первых двух случаях текущая реализация не следует @@ -2937,7 +2950,7 @@ dword- 0x1C00=7168 байт; но возвращается ebx=0 (за исключением случая предыдущего пункта); * как ни странно, можно прочитать 14-й блок (там, вообще говоря, - мусор - напоминаю, сч+т вед+тся с 0); + мусор - напоминаю, счёт ведётся с 0); * если был запрошен хотя бы один блок с номером, не меньшим 14, то возвращается eax=6(EOF); иначе eax=0. Для /fd/x: @@ -2959,7 +2972,7 @@ dword- ====================================================================== ============ Функция 58, подфункция 1 - перезаписать файл. =========== ====================================================================== -Если файл не существует, он созда+тся. +Если файл не существует, он создаётся. Если файл существует, он перезаписывается. Параметры: * eax = 58 - номер функции @@ -2971,7 +2984,7 @@ dword- * +12 = +0xC: dword: указатель на данные для записи * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы @@ -2992,14 +3005,14 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * При работе с дискетой не следует удалять непустую папку. - Код работы с ж+стким диском непустые папки удаляет корректно + Код работы с жёстким диском непустые папки удаляет корректно (т.е. рекурсивно со всеми файлами и вложенными папками). Рамдиск папок не поддерживает. @@ -3016,20 +3029,21 @@ dword- * +12 = +0xC: dword: указатель на данные для записи * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: + * Эта функция устарела, используйте подфункцию 3 функции 70. * Рамдиск и дискеты не поддерживают эту функцию, она только для - ж+стких дисков. + жёстких дисков. * Файл должен уже существовать (иначе возвращается 5, not found). Для создания файлов используйте подфункцию 1. * Если начальная позиция больше размера файла, возвращается eax=6(EOF). Если конечная позиция больше размера файла, файл расширяется. - * Код обработки записи данных для ж+сткого диска интерпретирует + * Код обработки записи данных для жёсткого диска интерпретирует нулевое значение поля +8 как указание усечения файла до размера, указанного в поле +4. Однако код обработки 58-й функции блокирует эту возможность для приложений, сразу возвращая управление @@ -3048,14 +3062,14 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * Рамдиск и дискеты не поддерживают эту функцию, - она только для ж+стких дисков. + она только для жёстких дисков. ====================================================================== == Функция 58, подфункция 5 - переименовать/переместить файл/папку. == @@ -3070,21 +3084,21 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании * +20+n: (сразу после завершающего нулевого символа) новое ASCIIZ-имя, должно начинаться с /hd/1, что интерпретируется как - ж+сткий диск, указанный в первом имени + жёсткий диск, указанный в первом имени (перемещение с одного диска на другой не поддерживается) Возвращаемое значение: * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: * Рамдиск и дискеты не поддерживают эту функцию, - она только для ж+стких дисков. + она только для жёстких дисков. * Если новое ASCIIZ-имя сильно неправильное, т.е. не начинается с /hd/1, /hd/first, /harddisk/1, /harddisk/first или после этого - начала ид+т пробел или символ с кодом 0, то функция возвращает, + начала идёт пробел или символ с кодом 0, то функция возвращает, как ни странно, код ошибки 4. Это единственная функция, которая вообще возвращает этот код. @@ -3116,7 +3130,7 @@ dword- (за исключением предыдущего случая): * eax = 5 * ebx не меняется - * если LBA-доступ запрещ+н подфункцией 11 функции 21: + * если LBA-доступ запрещён подфункцией 11 функции 21: * eax = 2 * ebx разрушается * для рамдиска: попытка чтения блока за пределами рамдиска @@ -3129,17 +3143,17 @@ dword- * Размер блока - 512 байт; читается один блок. * Не следует полагаться на возвращаемое значение, оно может измениться в следующих версиях. - * Требуется, чтобы был разреш+н LBA-доступ к устройствам + * Требуется, чтобы был разрешён LBA-доступ к устройствам подфункцией 11 функции 21. Узнать это можно вызовом подфункцией 11 функции 26. * LBA-чтение дискеты не поддерживается. - * Функция считывает данные физического ж+сткого диска; + * Функция считывает данные физического жёсткого диска; если по каким-то причинам нужны данные конкретного раздела, - прид+тся определять начальный сектор этого раздела + придётся определять начальный сектор этого раздела (либо напрямую через MBR, либо из расширенной структуры, возвращаемой той же подфункцией 11 функции 18). - * Функция не проверяет код ошибки ж+сткого диска, так что запрос - несуществующего сектора вс+ равно что-то прочитает + * Функция не проверяет код ошибки жёсткого диска, так что запрос + несуществующего сектора всё равно что-то прочитает (вероятнее всего, нули, но это определяется устройством) и это будет считаться успехом (eax=0). @@ -3166,7 +3180,7 @@ dword- * ebx = общее число кластеров = 2847 * ecx = число свободных кластеров * dword [fileinfo] = размер кластера = 512 - * для ж+сткого диска: база и раздел определяются подфункциями 7 и 8 + * для жёсткого диска: база и раздел определяются подфункциями 7 и 8 функции 21: * eax = 0 (успех) * ebx = общее число кластеров @@ -3179,10 +3193,10 @@ dword- pushad-структуры, передающейся как аргумент системной функции). Теперь это исправлено, так что, возможно, имеет смысл возвращать размер кластера в edx, пока эту функцию не начали использовать. - * Вообще-то ещ+ существует подфункция 11 функции 18, возвращающая + * Вообще-то ещё существует подфункция 11 функции 18, возвращающая информацию о файловой системе. По расширенной таблице дисковой подсистемы можно определить размер кластера (там он хранится - в секторах) и общее число кластеров для ж+стких дисков. + в секторах) и общее число кластеров для жёстких дисков. ====================================================================== ========== Функция 58, подфункция 16 - запустить программу. ========== @@ -3199,7 +3213,7 @@ dword- * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании Возвращаемое значение: * eax > 0 - программа загружена, eax содержит PID @@ -3211,7 +3225,7 @@ dword- (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше. - * Если процесс запускается как отлаживаемый, он созда+тся + * Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 функции 69. @@ -3249,7 +3263,7 @@ dword- из ядра убрать совсем, вместе с приложением systrace. * Информация о системных вызовах сохраняется в системном кольцевом буфере на 0x10 входов. - Эта функция просто копирует указанный объ+м данных + Эта функция просто копирует указанный объём данных из упомянутого буфера по указанному адресу. * Какой из входов в буфере соответствует последнему вызову, можно определить по значению eax, а именно, @@ -3272,7 +3286,7 @@ IPC интерпретировать конкретное сообщение. -------- Подфункция 1 - установить область для получения IPC --------- -Вызывается процессом-при+мником. +Вызывается процессом-приёмником. Параметры: * eax = 60 - номер функции * ebx = 1 - номер подфункции @@ -3299,21 +3313,21 @@ IPC Параметры: * eax = 60 - номер функции * ebx = 2 - номер подфункции - * ecx = PID при+мника + * ecx = PID приёмника * edx = указатель на данные сообщения * esi = длина сообщения (в байтах) Возвращаемое значение: * eax = 0 - успешно - * eax = 1 - при+мник не определил буфер для IPC-сообщений - (может быть, ещ+ не успел, а может быть, это не тот поток, + * eax = 1 - приёмник не определил буфер для IPC-сообщений + (может быть, ещё не успел, а может быть, это не тот поток, который нужен) - * eax = 2 - при+мник заблокировал IPC-буфер; + * eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать - * eax = 3 - переполнение IPC-буфера при+мника + * eax = 3 - переполнение IPC-буфера приёмника * eax = 4 - процесса/потока с таким PID не существует Замечания: * Система сразу после записи IPC-сообщения в буфер посылает - потоку-при+мнику событие с кодом 7 (см. коды событий). + потоку-приёмнику событие с кодом 7 (см. коды событий). ====================================================================== === Функция 61 - получить параметры для прямого доступа к графике. === @@ -3321,10 +3335,10 @@ IPC Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs: - mov eax, [gs:0] + mov eax, [gs:0] поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих). - mov [gs:0], eax + mov [gs:0], eax при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). @@ -3342,7 +3356,7 @@ IPC собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных - ядра, прич+м все функции вывода на экран добросовестно выполняют + ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана @@ -3359,7 +3373,7 @@ IPC Возвращаемое значение: * eax = [разрешение по оси x]*65536 + [разрешение по оси y] Замечания: - * Можно использовать функцию 14 с уч+том того, что она возвращает + * Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ. ------------------------ Число бит на пиксель ------------------------ @@ -3374,7 +3388,7 @@ IPC * eax = 61 - номер функции * ebx = 3 - номер подфункции Возвращаемое значение: - * eax = число байт, которое занимает одна строка разв+ртки + * eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране) ====================================================================== @@ -3384,11 +3398,11 @@ IPC * eax = 62 - номер функции * bl = 0 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ+н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия) * старшее слово eax обнулено Замечания: - * Предварительно должен быть разреш+н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение ax неопределено. @@ -3399,10 +3413,10 @@ IPC * eax = 62 - номер функции * bl = 1 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ+н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * al = номер последней PCI-шины; оставшиеся байты eax разрушаются Замечания: - * Предварительно должен быть разреш+н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение al неопределено. @@ -3414,10 +3428,10 @@ IPC * eax = 62 - номер функции * bl = 2 - номер подфункции Возвращаемое значение: - * eax = -1 - доступ к PCI запрещ+н; иначе + * eax = -1 - доступ к PCI запрещён; иначе * al = механизм (1 или 2); прочие байты eax разрушаются Замечания: - * Предварительно должен быть разреш+н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм обращения выбирается в соответствии с характеристиками оборудования. @@ -3435,15 +3449,15 @@ IPC * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства - * cl = номер регистра (должен быть ч+тным для bl=5, + * cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6) Возвращаемое значение: - * eax = -1 - ошибка (запрещ+н доступ к PCI или + * eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе * al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается Замечания: - * Предварительно должен быть разреш+н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом @@ -3466,16 +3480,16 @@ IPC * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства - * cl = номер регистра (должен быть ч+тным для bl=9, + * cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10) * dl/dx/edx (в зависимости от запрошенного размера) содержит данные для записи Возвращаемое значение: - * eax = -1 - ошибка (запрещ+н доступ к PCI или + * eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры) * eax = 0 - успешно Замечания: - * Предварительно должен быть разреш+н низкоуровневый доступ к PCI + * Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом @@ -3493,16 +3507,16 @@ IPC данные и из которого другая программа может эти данные прочитать. Есть соглашение, в соответствии с которым записываемые данные - текстовые строки, интерпретируемые как отладочные сообщения о ходе -выполнения программы. Ядро в определ+нных ситуациях также записывает +выполнения программы. Ядро в определённых ситуациях также записывает на доску отладки сведения о выполнении некоторых функций; по соглашению сообщения ядра начинаются с префикса "K : ". Для просмотра доски отладки создано приложение board, -которое считывает данные из буфера и отображает их в сво+м окне. board +которое считывает данные из буфера и отображает их в своём окне. board понимает последовательность кодов 13,10 как переход на новую строку. Символ с нулевым кодом в конце строки не обязателен, но и не мешает. В связи с появлением отладчика ценность доски отладки несколько снизилась, поскольку отладчик позволяет полностью контролировать ход -выполнения программы, прич+м для этого не требуется никаких усилий +выполнения программы, причём для этого не требуется никаких усилий со стороны самой программы. Тем не менее во многих случаях доска отладки продолжает оставаться полезной. @@ -3549,7 +3563,7 @@ IPC ================= Функция 66 - работа с клавиатурой. ================= ====================================================================== Режим ввода влияет на результаты чтения клавиш функцией 2. -При загрузке программы для не+ устанавливается ASCII-режим ввода. +При загрузке программы для неё устанавливается ASCII-режим ввода. -------- Подфункция 1 - установить режим ввода с клавиатуры. --------- Параметры: @@ -3580,14 +3594,14 @@ IPC * бит 3 (маска 8): правый Ctrl нажат * бит 4 (маска 0x10): левый Alt нажат * бит 5 (маска 0x20): правый Alt нажат - * бит 6 (маска 0x40): CapsLock включ+н - * бит 7 (маска 0x80): NumLock включ+н - * бит 8 (маска 0x100): ScrollLock включ+н + * бит 6 (маска 0x40): CapsLock включён + * бит 7 (маска 0x80): NumLock включён + * бит 8 (маска 0x100): ScrollLock включён * прочие биты сброшены ----- Подфункция 4 - установить общесистемную "горячую клавишу". ----- О нажатии "горячей клавиши" извещаются только приложения, -установившие е+; активное приложение (к которому поступает +установившие её; активное приложение (к которому поступает весь нормальный ввод) таких клавиш не получает. Извещение заключается в посылке события с кодом 2. Прочитать "горячую клавишу" можно так же, как и обычную, - @@ -3595,10 +3609,10 @@ IPC Параметры: * eax = 66 - номер функции * ebx = 4 - номер подфункции - * cl зада+т сканкод клавиши; + * cl задаёт сканкод клавиши; используйте cl=0 для задания комбинаций типа Ctrl+Shift - * edx = 0xXYZ зада+т возможные состояния управляющих клавиш: - * Z (младшие 4 бита) зада+т состояние клавиш LShift и RShift: + * edx = 0xXYZ задаёт возможные состояния управляющих клавиш: + * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift: * 0 = ни одна из клавиш не должна быть нажата; * 1 = ровно одна из клавиш должна быть нажата; * 2 = обе клавиши должны быть нажаты; @@ -3646,7 +3660,7 @@ IPC * Значение -1 для параметра означает "не изменять"; например, для перемещения окна без изменения размеров можно указать edx=esi=-1. * Предварительно окно должно быть определено функцией 0. - Она же зада+т начальные координаты и размеры окна. + Она же задаёт начальные координаты и размеры окна. * Размеры окна понимаются в смысле функции 0, т.е. на один пиксель меньше, чем реальные размеры. * Вызов функции для максимизированных окон просто игнорируется. @@ -3656,7 +3670,7 @@ IPC * Функция посылает окну событие перерисовки (с кодом 1). ====================================================================== -=== Функция 68, подфункция 0 - получить сч+тчик переключений задач. == +=== Функция 68, подфункция 0 - получить счётчик переключений задач. == ====================================================================== Параметры: * eax = 68 - номер функции @@ -3672,7 +3686,7 @@ IPC Функция завершает текущий квант времени, выделенный потоку, и переключается на следующий. (Какой поток какого процесса будет следующим, предсказать нельзя). -Позднее, когда до текущего потока дойд+т очередь, +Позднее, когда до текущего потока дойдёт очередь, выполнение возобновится. Параметры: * eax = 68 - номер функции @@ -3689,7 +3703,7 @@ IPC * ecx = требуемое действие: * ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters) - * ecx = 1 - узнать, включ+н/выключен кэш + * ecx = 1 - узнать, включён/выключен кэш * ecx = 2 - включить кэш * ecx = 3 - выключить кэш Возвращаемое значение: @@ -3697,7 +3711,7 @@ IPC * eax = значение cr4 * для ecx=1: * eax = (cr0 and 0x60000000): - * eax = 0 - кэш включ+н + * eax = 0 - кэш включён * eax <> 0 - кэш выключен * для ecx=2 и ecx=3: * функция не возвращает значения @@ -3708,7 +3722,7 @@ IPC MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); -каждое семейство процессоров имеет сво+ подмножество MSR-регистров. +каждое семейство процессоров имеет своё подмножество MSR-регистров. Параметры: * eax = 68 - номер функции * ebx = 3 - номер подфункции @@ -3718,10 +3732,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ebx:eax = старший:младший dword результата Замечания: * Указание в ecx несуществующего или нереализованного для данного - процессора MSR повлеч+т исключение в ядре, которое прибь+т поток. + процессора MSR повлечёт исключение в ядре, которое прибьёт поток. * Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, - которое вс+ равно прибь+т поток. + которое всё равно прибьёт поток. ====================================================================== ========= Функция 68, подфункция 4 - записать в MSR-регистр. ========= @@ -3729,7 +3743,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); -каждое семейство процессоров имеет сво+ подмножество MSR-регистров. +каждое семейство процессоров имеет своё подмножество MSR-регистров. Параметры: * eax = 68 - номер функции * ebx = 4 - номер подфункции @@ -3740,10 +3754,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ebx:eax = копия esi:edi Замечания: * Указание в ecx несуществующего или нереализованного для данного - процессора MSR повлеч+т исключение в ядре, которое прибь+т поток. + процессора MSR повлечёт исключение в ядре, которое прибьёт поток. * Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, - которое вс+ равно прибь+т поток. + которое всё равно прибьёт поток. ====================================================================== ======= Функция 68, подфункция 5 - выделить физическую память. ======= @@ -3760,7 +3774,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); устройством требуется разместить данные по известному физическому адресу. (В сущности, эта функция разрабатывалась для AC97WAV.) * Число блоков физической памяти ограничено (константой 24, - прич+м эта константа включает и несколько блоков памяти + причём эта константа включает и несколько блоков памяти для надобностей ядра). * Освободить выделенную таким образом память можно подфункцией 6, копированием данных туда/обратно @@ -3831,7 +3845,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); У процесса может быть только один отладчик; один процесс может отлаживать несколько разных. Система уведомляет отладчик о событиях, происходящих с отлаживаемым процессом. Сообщения записываются в буфер, -определ+нный подфункцией 0. +определённый подфункцией 0. Формат сообщения: * +0: dword: код сообщения * +4: dword: PID отлаживаемого процесса @@ -3839,14 +3853,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); определяемые кодом сообщения Коды сообщений: * 1 = исключение - * дополнительно переда+тся dword-номер исключения + * дополнительно передаётся dword-номер исключения * процесс приостановлен * 2 = процесс завершился * приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком) * 3 = отладочное исключение int 1 = #DB - * дополнительно переда+тся dword-образ регистра DR6: + * дополнительно передаётся dword-образ регистра DR6: * биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9) * бит 14: исключение произошло из-за режима @@ -3890,7 +3904,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки - neg [bufsize] + neg [bufsize] * Данные в буфере трактуются как массив элементов переменной длины - сообщений. Формат сообщения указан в общем описании. @@ -4055,7 +4069,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 01 = слово * 11 = двойное слово * esi = адрес точки останова; должен быть выровнен - соответственно длине (т.е. должен быть ч+тным для + соответственно длине (т.е. должен быть чётным для точек останова на слово, кратен 4 для двойного слова) * если старший бит установлен - сбросить точку останова Возвращаемое значение: @@ -4075,10 +4089,10 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * Срабатывание точки останова заключается в генерировании отладочного исключения #DB, о котором система сообщает отладчику. * Точка останова на запись и чтение/запись срабатывает после - выполнения вызвавшей е+ инструкции. + выполнения вызвавшей её инструкции. ====================================================================== -= Функция 70 - работа с файловой системой с поддержкой длинных им+н. = += Функция 70 - работа с файловой системой с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 @@ -4108,7 +4122,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно - к ж+стким дискам на IDE0 (Primary Master), IDE1 (Primary Slave), + к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave); x - номер раздела на выбранном винчестере, изменяется от 1 до 255 (на каждом из винчестеров нумерация начинается с 1) @@ -4124,6 +4138,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * подфункция 0 - чтение файла * подфункция 1 - чтение папки * подфункция 2 - создание/перезапись файла + * подфункция 3 - запись в существующий файл * подфункция 5 - получение атрибутов файла/папки * подфункция 6 - установка атрибутов файла/папки * подфункция 7 - запуск программы @@ -4132,7 +4147,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ошибкой с кодом 2. ====================================================================== -= Функция 70, подфункция 0 - чтение файла с поддержкой длинных им+н. = += Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 - номер функции @@ -4143,7 +4158,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано под старший dword позиции) * +12 = +0xC: dword: сколько байт читать * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4154,13 +4169,13 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); -1=0xffffffff, если файл не найден Замечания: * Если файл кончился раньше, чем был прочитан последний запрошенный - блок, то функция прочитает, сколько сможет, после чего верн+т + блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). * Функция не позволяет читать папки - (верн+тся eax=10, access denied). + (вернётся eax=10, access denied). ====================================================================== -= Функция 70, подфункция 1 - чтение папки с поддержкой длинных им+н. = += Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. = ====================================================================== Параметры: * eax = 70 - номер функции @@ -4176,7 +4191,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +12 = +0xC: dword: сколько блоков читать * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + [+12]*560 байт - * +20 = +0x14: ASCIIZ-имя папки, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4192,7 +4207,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * ... Структура заголовка: * +0: dword: версия структуры (текущая версия = 1) - * +4: dword: количество размещ+нных блоков; не больше, чем запрошено + * +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx) * +8: dword: общее число файлов в папке @@ -4249,7 +4264,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); данные содержат мусор. * Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, - после чего верн+т eax=6 (EOF). + после чего вернёт eax=6 (EOF). * Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку. @@ -4260,7 +4275,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ====================================================================== ====================== Функция 70, подфункция 2 ====================== -======== Создание/перезапись файла с поддержкой длинных им+н. ======== +======== Создание/перезапись файла с поддержкой длинных имён. ======== ====================================================================== Параметры: * eax = 70 - номер функции @@ -4271,7 +4286,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано) * +12 = +0xC: dword: сколько байт писать * +16 = +0x10: dword: указатель на данные - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4280,11 +4295,40 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * eax = 0 - успешно, иначе код ошибки файловой системы * ebx = число записанных байт (возможно, 0) Замечания: - * Если файл с таким именем не существовал, он созда+тся; если + * Если файл с таким именем не существовал, он создаётся; если существовал, то перезаписывается. * Если свободного места на диске недостаточно, то функция запишет, - сколько сможет, после чего верн+т код ошибки 8. - * Функция не поддерживается для CD (верн+тся код ошибки 2). + сколько сможет, после чего вернёт код ошибки 8. + * Функция не поддерживается для CD (вернётся код ошибки 2). + +====================================================================== +====================== Функция 70, подфункция 3 ====================== +======== Запись в существующий файл с поддержкой длинных имён. ======= +====================================================================== +Параметры: + * eax = 70 - номер функции + * ebx = указатель на информационную структуру +Формат информационной структуры: + * +0: dword: 3 = номер подфункции + * +4: dword: позиция в файле (в байтах) + * +8: dword: старший dword позиции (должен быть 0 для FAT) + * +12 = +0xC: dword: сколько байт писать + * +16 = +0x10: dword: указатель на данные + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в + общем описании + или + * +20 = +0x14: db 0 + * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла +Возвращаемое значение: + * eax = 0 - успешно, иначе код ошибки файловой системы + * ebx = число записанных байт (возможно, 0) +Замечания: + * Файл должен уже существовать, иначе вернётся eax=5. + * Единственным результатом записи 0 байт является установка в + атрибутах файла даты/времени модификации и доступа в текущую. + * Если начальная и/или конечная позиция выходит за пределы файла + (за исключением предыдущего случая), файл расширяется до + необходимого размера нулевыми символами. ====================================================================== === Функция 70, подфункция 5 - получение информации о файле/папке. === @@ -4299,7 +4343,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4327,7 +4371,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 (зарезервировано) * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4343,7 +4387,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); Замечания: * Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1. - * Функция не поддерживается для CD (верн+тся код ошибки 2). + * Функция не поддерживается для CD (вернётся код ошибки 2). ====================================================================== ============ Функция 70, подфункция 7 - запуск программы. ============ @@ -4359,7 +4403,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: 0 (зарезервировано) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования им+н указаны в + * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или * +20 = +0x14: db 0 @@ -4374,7 +4418,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше. - * Если процесс запускается как отлаживаемый, он созда+тся + * Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 функции 69. @@ -4422,7 +4466,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 2 = нажата клавиша на клавиатуре (поступает, только когда окно активно) или нажата "горячая клавиша"; сбрасывается, когда все клавиши из буфера считаны функцией 2 - * 3 = нажата кнопка, определ+нная ранее функцией 8 (или кнопка + * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка закрытия, созданная неявно функцией 0; кнопка минимизации обрабатывается системой и о ней сообщения не приходит; поступает, только когда окно активно; сбрасывается, когда все @@ -4431,7 +4475,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); при размаскировке функцией 40) * 5 = перерисовывается фон рабочего стола (сбрасывается автоматически после перерисовки, так что если во время перерисовки - фона программа не жд+т и не проверяет события, то этого события + фона программа не ждёт и не проверяет события, то этого события она не заметит) * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) @@ -4448,7 +4492,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); ==================== Коды ошибок файловой системы ==================== ====================================================================== * 0 = успешно - * 1 = не определена база и/или раздел ж+сткого диска (подфункциями + * 1 = не определена база и/или раздел жёсткого диска (подфункциями 7, 8 функции 21) * 2 = функция не поддерживается для данной файловой системы * 3 = неизвестная файловая система @@ -4460,7 +4504,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * 7 = указатель вне памяти приложения * 8 = диск заполнен * 9 = таблица FAT разрушена - * 10 = доступ запрещ+н + * 10 = доступ запрещён * 11 = ошибка устройства При запуске программы возможны также следующие коды ошибок: * 30 = 0x1E = недостаточно памяти diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 742760c9af..46374b8498 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -10,7 +10,7 @@ All registers except explicitly declared in the returned value, ============== Function 0 - define and draw the window. ============== ====================================================================== Defines an application window. Draws a frame of the window, header and -working area. For windows with skin defines standard buttons for close +working area. For skinned windows defines standard buttons for close and minimize. Parameters: * eax = 0 - function number @@ -18,10 +18,10 @@ Parameters: * ecx = [coordinate on axis y]*65536 + [size on axis y] * edx = 0xXYRRGGBB, where: * Y = style of the window: - * Y=0 - type I - window of the fixed size + * Y=0 - type I - fixed-size window * Y=1 - only define window area, draw nothing - * Y=2 - type II - window of the variable size - * Y=3 - window with skin + * Y=2 - type II - variable-size window + * Y=3 - skinned window * other possible values (from 4 up to 15) are reserved, function call with such Y is ignored * RR, GG, BB = accordingly red, green, blue components of a color @@ -61,11 +61,11 @@ Remarks: * The window must fit on the screen. If the transferred coordinates and sizes do not satisfy to this condition, appropriate coordinate (or, probably, both) is considered as zero, - and if also it does not help, the appropriate size + and if it does not help too, the appropriate size (or, probably, both) is installed in a size of the screen. - Further we shall designate xpos,ypos,xsize,ysize - values - transmitted in ebx,ecx. The coordinates are resulted concerning + Further let us designate xpos,ypos,xsize,ysize - values passed + in ebx,ecx. The coordinates are resulted concerning the left upper corner of the window, which, thus, is set as (0,0), coordinates of the right lower corner essence (xsize,ysize). * The sizes of the window are understood in sence of coordinates @@ -289,7 +289,7 @@ Returned value: * function does not return value Remarks: * Sizes of the button must be more than 0 and less than 0x8000. - * For windows with skin definition of the window + * For skinned windows definition of the window (call of 0th function) creates two standard buttons - for close of the window with identifier 1 and for minimize of the window with identifier 0xffff. @@ -926,53 +926,66 @@ Remarks: process/thread by given slot. ====================================================================== -====================== Function 18, subfunction 19 ===================== -======================= Get/set mouse features. ====================== +======== Function 18, subfunction 19 - get/set mouse features. ======= ====================================================================== + +---------------- Subsubfunction 0 - get mouse speed. ----------------- Parameters: * eax = 18 - function number * ebx = 19 - subfunction number - * ecx = subsubfunction number + * ecx = 0 - subsubfunction number +Returned value: + * eax = current mouse speed - ecx = 0 - get mouse speed - Returned value: - * eax = current mouse speed +---------------- Subsubfunction 1 - set mouse speed. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 1 - subsubfunction number + * edx = new value for speed +Returned value: + * function does not return value - ecx = 1 - set mouse speed - edx = selected value of speed - Returned value: - * function does not return value +---------------- Subsubfunction 2 - get mouse delay. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 2 - subsubfunction number +Returned value: + * eax = current mouse delay - ecx = 2 - get mouse delay - Returned value: - * eax = current mouse delay - - ecx = 3 - set mouse delay - edx = selected value of delay - Returned value: - * function does not return value - - ecx = 4 - set mouse pointer position - edx = [coordinate on axis x]*65536 + [coordinate on axis y] - Returned value: - * function does not return value +---------------- Subsubfunction 3 - set mouse delay. ----------------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 3 - subsubfunction number + * edx = new value for mouse delay +Returned value: + * function does not return value +----------- Subsubfunction 4 - set mouse pointer position. ----------- +Parameters: + * eax = 18 - function number + * ebx = 19 - subfunction number + * ecx = 4 - subsubfunction number + * edx = [coordinate on axis x]*65536 + [coordinate on axis y] +Returned value: + * function does not return value Remarks: - * Recommended speed of the mouse (in subfunction 1) from 1 up to 9. - The installed value is not inspected by the code of a kernel, on this use - cautiously, at incorrect value the cursor can "freeze". - Speed of mouse can be regulated through the application SETUP. - * Recommended delay of the mouse (in subfunction 3) = 10. Lower value - is not handled COM by mice. At the very large values the movement of - the mouse on 1 pixel is impossible and the cursor will jump - on the value of the installed speed (subfunction 1). - Delay of mouse can be regulated through the application SETUP. - The installed value is not inspected by the code of a kernel. - * In subfunction 4 the installed value is not inspected by - the code of a kernel. Before usage it is necessary to find out current - screen resolution and at installation of a position to watch, - that the value of a position should do not fall outside - the limits the screen. + * It is recommended to set speed of the mouse (in subsubfunction 1) + from 1 up to 9. The installed value is not inspected by the kernel + code, so set it carefully, at incorrect value the cursor + can "freeze". Speed of the mouse can be regulated through the + application SETUP. + * Recommended delay of the mouse (in subsubfunction 3) = 10. Lower + value is not handled by COM mice. At the very large values the + movement of the mouse on 1 pixel is impossible and the cursor will + jump on the value of installed speed (subsubfunction 1). The + installed value is not inspected by the kernel code. + * The subsubfunction 4 does not check the passed value. Before + its call find out current screen resolution (with function 14) + and check that the value of position is inside the limits of the + screen. ====================================================================== ============ Function 19 - start application from ramdisk. =========== @@ -2135,11 +2148,11 @@ Remarks: * Structure of the color table is described in the standard include file 'macros.inc' as 'system_colors'; for example, it is possible to write: - sc system_colors ; variable declaration - ... ; somewhere one must call - ; this function with ecx=sc - mov ecx, [sc.work_button_text] ; read text color on - ; buttin in working area + sc system_colors ; variable declaration + ... ; somewhere one must call + ; this function with ecx=sc + mov ecx, [sc.work_button_text] ; read text color on + ; buttin in working area * A program itself desides to use or not to use color table. For usage program must simply at calls to drawing functions select color taken from the table. @@ -2995,6 +3008,7 @@ Returned value: * eax = 0 - success, otherwise file system error code * ebx destroyed Remarks: + * This function is obsolete, use subfunction 3 of function 70. * Ramdisk and floppies do not support this function, it is only for hard disks. * File must already exist (otherwise function returns 5, not found). @@ -3289,11 +3303,11 @@ Remarks: The data of the graphics screen (the memory area which displays screen contents) are accessible to a program directly, without any system calls, through the selector gs: - mov eax, [gs:0] + mov eax, [gs:0] places in eax the first dword of the buffer, which contains information on color of the left upper point (and, possibly, colors of several following). - mov [gs:0], eax + mov [gs:0], eax by work in VESA modes with LFB sets color of the left upper point (and, possibly, colors of several following). To interpret the data of graphics screen program needs to know @@ -3855,7 +3869,7 @@ Remarks: and at arrival of new message the system will wait. For synchronization frame all work with the buffer by operations lock/unlock - neg [bufsize] + neg [bufsize] * Data in the buffer are considered as array of items with variable length - messages. Format of a message is explained in general description. @@ -4085,6 +4099,7 @@ Available subfunctions: * subfunction 0 - read file * subfunction 1 - read folder * subfunction 2 - create/rewrite file + * subfunction 3 - write to existing file * subfunction 5 - get attributes of file/folder * subfunction 6 - set attributes of file/folder * subfunction 7 - start application @@ -4244,6 +4259,35 @@ Remarks: write as many as can and then return error code 8. * The function is not supported for CD (returns error code 2). +====================================================================== +===================== Function 70, subfunction 3 ===================== +=========== Write to existing file with long names support. ========== +====================================================================== +Parameters: + * eax = 70 - function number + * ebx = pointer to the information structure +Format of the information structure: + * +0: dword: 3 = subfunction number + * +4: dword: file offset (in bytes) + * +8: dword: high dword of offset (must be 0 for FAT) + * +12 = +0xC: dword: number of bytes to write + * +16 = +0x10: dword: pointer to data + * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are + given in the general description + or + * +20 = +0x14: db 0 + * +21 = +0x15: dd pointer to ASCIIZ-string with file name +Returned value: + * eax = 0 - success, otherwise file system error code + * ebx = number of written bytes (possibly 0) +Remarks: + * The file must already exist, otherwise function returns eax=5. + * The only result of write 0 bytes is update in the file attributes + date/time of modification and access to the current date/time. + * If beginning and/or ending position is greater than file size + (except for the previous case), the file is expanded to needed + size with zero characters. + ====================================================================== ==== Function 70, subfunction 5 - get information on file/folder. ==== ====================================================================== @@ -4421,4 +4465,3 @@ Application start functions can return also following errors: * 30 = 0x1E = not enough memory * 31 = 0x1F = file is not executable * 32 = 0x20 = too many processes - diff --git a/kernel/trunk/fs/fat12.inc b/kernel/trunk/fs/fat12.inc index 079fed4832..1443ba12df 100644 --- a/kernel/trunk/fs/fat12.inc +++ b/kernel/trunk/fs/fat12.inc @@ -63,9 +63,9 @@ rdfs2_1: fdc_status_error_2: pop ecx ebx eax ret - - + + floppy_fileread: ;---------------------------------------------------------------- @@ -115,7 +115,7 @@ fr_do_1: ret fdc_status_error_1: mov [flp_status],0 - mov eax,10 + mov eax,10 mov ebx,-1 ret @@ -231,7 +231,7 @@ frfl8_1: sub [esp+24],dword 512 jmp frnew_1 -read_chs_sector: +read_chs_sector: call calculate_chs call ReadSectWithRetr ret @@ -273,7 +273,7 @@ read_flp_root: je unnecessary_root_read mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],1 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov edi,0x8000 call SeekTrack read_flp_root_1: @@ -302,7 +302,7 @@ read_flp_fat: je unnecessary_flp_fat mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov edi,0x8000 call SeekTrack read_flp_fat_1: @@ -358,7 +358,7 @@ calculatefatchain_flp: mov dword [edi],ecx add edi,4 mov dword [edi],edx - add edi,4 + add edi,4 add esi,12 cmp edi,0x282000+2856*2 ;2849 clusters @@ -366,12 +366,12 @@ calculatefatchain_flp: popad ret - + check_label: pushad mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],1 ; ╤хъЄюЁ + mov [FDD_Sector],1 ; ╤хъЄюЁ call SetUserInterrupts call FDDMotorON call RecalibrateFDD @@ -382,12 +382,12 @@ check_label: jne fdc_status_error call ReadSectWithRetr cmp [FDC_Status],0 - jne fdc_status_error + jne fdc_status_error mov esi,flp_label mov edi,0xD000+39 mov ecx,15 cld - rep cmpsb + rep cmpsb je same_label mov [root_read],0 mov [flp_fat],0 @@ -412,7 +412,7 @@ save_flp_root: je unnecessary_root_save mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],1 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov esi,0x8000 call SeekTrack save_flp_root_1: @@ -430,7 +430,7 @@ unnecessary_root_save: mov [fdc_irq_func],fdc_null popa ret - + save_flp_fat: pusha call check_label @@ -441,7 +441,7 @@ save_flp_fat: call restorefatchain_flp mov [FDD_Track],0 ; ╓шышэфЁ mov [FDD_Head],0 ; ╤ЄюЁюэр - mov [FDD_Sector],2 ; ╤хъЄюЁ + mov [FDD_Sector],2 ; ╤хъЄюЁ mov esi,0x8000 call SeekTrack save_flp_fat_1: @@ -467,7 +467,7 @@ unnecessary_flp_fat_save: popa ret - + restorefatchain_flp: ; restore fat chain pushad @@ -563,7 +563,7 @@ fifoundd_1: mov ebx,[path_pointer_flp] add ebx,36 call get_cluster_of_a_path_flp - jc frnoreadd_1_1 + jc frnoreadd_1_1 mov edi,ebx add edi,11 jmp fifoundd_2_1 @@ -617,7 +617,7 @@ floppy_filesave: ; edi pointer to path /fd/1/...... - for all files in nested directories ; ; output : eax = 0 - ok -; 5 - file not found / directory not found +; 5 - file not found / directory not found ; 8 - disk full ; 10 - access denied ;----------------------------------------------------------- @@ -644,10 +644,10 @@ fsdel_1: ret fdc_status_error_6: - popa + popa add esp,32 jmp fdc_status_error_1 - + rd_do_save_1: push eax ebx ecx edx esi edi call read_flp_fat @@ -749,7 +749,7 @@ fifoundds_4: mov ebx,1 ; first cluster cmp [save_root_flag],0 jne frnewds_1 - call frnewds_2 + call frnewds_2 pusha call WriteSectWithRetr popa @@ -811,7 +811,7 @@ frnoreadds_1: fdc_status_error_7_1: cmp [FDC_Status],0 - je fdc_status_error_8 + je fdc_status_error_8 fdc_status_error_7: pop edi esi edx ecx ebx eax add esp,32 @@ -821,10 +821,10 @@ save_chs_sector: call calculate_chs call WriteSectWithRetr ret - + calculate_chs: mov bl,[FDD_Track] - mov [old_track],bl + mov [old_track],bl mov ebx,18 xor edx,edx div ebx @@ -846,7 +846,7 @@ no_head_2: no_seek_track_1: ret - + get_cluster_of_a_path_flp: ;--------------------------------------------------------- ; input : EBX = pointer to a path string @@ -892,7 +892,7 @@ directory_not_found_flp: pop edx stc ; errors occour ret - + analyze_directory_flp: ;-------------------------------- ; input : EAX = first cluster of the directory @@ -908,8 +908,8 @@ analyze_directory_flp: push edx push esi push edi - - + + adr56_flp: mov [clust_tmp_flp],eax add eax,31 @@ -921,7 +921,7 @@ adr56_flp: mov ecx,512/32 mov ebx,0xD000 - + adr1_analyze_flp: mov esi,edx ;[esp+16] mov edi,ebx @@ -931,10 +931,10 @@ adr1_analyze_flp: rep cmpsb pop ecx je found_file_analyze_flp - + add ebx,32 loop adr1_analyze_flp - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -942,7 +942,7 @@ adr1_analyze_flp: and eax,4095 cmp eax,0x0ff8 jb adr56_flp -not_found_file_analyze_flp: +not_found_file_analyze_flp: pop edi pop esi pop edx @@ -950,7 +950,7 @@ not_found_file_analyze_flp: add esp,4 stc ;file not found ret - + found_file_analyze_flp: pop edi pop esi @@ -959,8 +959,8 @@ found_file_analyze_flp: add esp,4 clc ;file found ret - - + + analyze_directory_to_write_flp: ;-------------------------------- ; input : EAX = first cluster of the directory @@ -970,33 +970,33 @@ analyze_directory_to_write_flp: ; ECX,EDX,EDI,EDI not changed ; IF CARRY=1 ;-------------------------------- - + push ecx push edx push esi - + adr561: mov [clust_tmp_flp],eax add eax,31 pusha - call read_chs_sector + call read_chs_sector popa cmp [FDC_Status],0 jne error_found_file_analyze1 mov ecx,512/32 mov ebx,0xD000 - + adr1_analyze1: cmp byte [ebx],0x00 je found_file_analyze1 cmp byte [ebx],0xe5 je found_file_analyze1 - + avanti: add ebx,32 loop adr1_analyze1 - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -1004,13 +1004,13 @@ avanti: and eax,4095 cmp eax,0x0ff8 jb adr561 - + call get_free_FAT ;this block of code add a new cluster ;for the directory because the directory ;is full mov [edi],word 0x0fff - + mov eax,[clust_tmp_flp] shl eax,1 ;find next cluster from FAT add eax,0x282000 @@ -1028,14 +1028,14 @@ avanti: mov eax,edi add eax,31 pusha - call save_chs_sector + call save_chs_sector popa cmp [FDC_Status],0 jne error_found_file_analyze1 mov ebx,0xD000 found_file_analyze1: - + pop esi pop edx pop ecx @@ -1047,15 +1047,15 @@ error_found_file_analyze1: pop edx pop ecx stc - ret - + ret + get_free_FAT_flp: ;------------------------------------------ ; input : EAX = # cluster for start the searching ; output : EAX = # first cluster found free ;------------------------------------------- push ebx - + mov ebx,1 check_new_flp: add ebx,1 @@ -1265,6 +1265,11 @@ fd_find_lfn: ret .found: mov eax, [esp+8] + add eax, 31 + cmp dword [esp], flp_root_next + jnz @f + add eax, -31+19 +@@: add esp, 16 ; CF=0 pop esi ret @@ -1915,6 +1920,304 @@ fs_FloppyRewrite: pop edi ecx jmp .ret +;---------------------------------------------------------------- +; +; fs_FloppyWrite - LFN variant for writing to floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- + +@@: + push ERROR_ACCESS_DENIED +fs_FloppyWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_FloppyWrite.ret11: + push 11 + jmp fs_FloppyWrite.ret0 + +fs_FloppyWrite: + cmp byte [esi], 0 + jz @b + call read_flp_fat + cmp [FDC_Status], 0 + jnz .ret11 + pushad + call fd_find_lfn + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push eax ; save directory cluster + push 0 ; return value=0 + + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + + push dword [edi+28] ; save current file size + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call floppy_extend_file + jnc .length_ok + mov [esp+4], eax +; floppy_extend_file can return two error codes: FAT table error or disk full. +; First case is fatal error, in second case we may write some data + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + pop eax + mov [esp+4+28], eax + pop eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + pop eax + pop eax + mov [esp+4+28], eax ; eax=return value + pop eax + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: +; save FAT & directory +; note that directory must be saved first because save_flp_fat uses buffer at 0xD000 + mov esi, [edi+28] + movzx edi, word [edi+26] ; starting cluster + mov eax, [esp+8] + pusha + call save_chs_sector + popa + cmp [FDC_Status], 0 + jnz .device_err + call save_flp_fat + cmp [FDC_Status], 0 + jz @f +.device_err: + mov byte [esp+4], 11 + jmp .ret +@@: + +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret + call SetUserInterrupts +.write_loop: + lea eax, [edi+31] ; current sector +; get length of data in current sector + push ecx + sub ebx, 0x200 + jb .hasdata + neg ebx + xor ecx, ecx + jmp @f +.hasdata: + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: +; load sector if needed + cmp dword [esp+4], 0 ; we don't need to read uninitialized data + jz .noread + cmp ecx, 0x200 ; we don't need to read sector if it is fully rewritten + jz .noread + cmp ecx, esi ; (same for the last sector) + jz .noread + pusha + call read_chs_sector + popa + cmp [FDC_Status], 0 + jz @f +.device_err2: + pop ecx + jmp .device_err +@@: +.noread: +; zero uninitialized data if file was extended (because floppy_extend_file does not this) + push eax ecx edi + xor eax, eax + mov ecx, 0x200 + sub ecx, [esp+4+12] + jbe @f + mov edi, 0xD000 + add edi, [esp+4+12] + rep stosb +@@: +; zero uninitialized data in the last sector + mov ecx, 0x200 + sub ecx, esi + jbe @f + mov edi, 0xD000 + add edi, esi + rep stosb +@@: + pop edi ecx eax +; copy new data + push eax + mov eax, edx + neg ebx + jecxz @f + add ebx, 0xD000+0x200 + call memmove + xor ebx, ebx +@@: + pop eax +; save sector + pusha + call save_chs_sector + popa + cmp [FDC_Status], 0 + jnz .device_err2 + add edx, ecx + sub [esp], ecx + pop ecx + jz .done +.next_cluster: + movzx edi, word [edi*2+0x282000] + sub esi, 0x200 + jae @f + xor esi, esi +@@: + sub dword [esp], 0x200 + jae .write_loop + and dword [esp], 0 + jmp .write_loop +.done: + mov [fdc_irq_func], fdc_null + jmp .ret + +floppy_extend_file.zero_size: + xor eax, eax + jmp floppy_extend_file.start_extend + +; extends file on floppy to given size (new data area is undefined) +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL) +floppy_extend_file: + push ecx +; find the last cluster of file + movzx eax, word [edi+26] ; first cluster + mov ecx, [edi+28] + jecxz .zero_size +@@: + sub ecx, 0x200 + jbe @f + mov eax, [eax*2+0x282000] + and eax, 0xFFF + jz .fat_err + cmp eax, 0xFF8 + jb @b +.fat_err: + pop ecx + push ERROR_FAT_TABLE + pop eax + stc + ret +@@: + push eax + mov eax, [eax*2+0x282000] + and eax, 0xFFF + cmp eax, 0xFF8 + pop eax + jb .fat_err +; set length to full number of sectors + sub [edi+28], ecx +.start_extend: + pop ecx +; now do extend + push edx esi + mov esi, 0x282000+2*2 ; start scan from cluster 2 + mov edx, 2847 ; number of clusters to scan +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new sector + push ecx + push edi +.scan: + mov ecx, edx + mov edi, esi + jecxz .disk_full + push eax + xor eax, eax + repnz scasw + pop eax + jnz .disk_full + mov word [edi-2], 0xFFF + mov esi, edi + mov edx, ecx + sub edi, 0x282000 + shr edi, 1 + dec edi ; now edi=new cluster + test eax, eax + jz .first_cluster + mov [0x282000+eax*2], di + jmp @f +.first_cluster: + pop eax ; eax->direntry + push eax + mov [eax+26], di +@@: + mov eax, edi ; eax=new cluster + pop edi ; edi->direntry + pop ecx ; ecx=required size + add dword [edi+28], 0x200 + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop esi edx + clc + ret +.disk_full: + pop edi ecx + pop esi edx + stc + push ERROR_DISK_FULL + pop eax + ret + fs_FloppyGetFileInfo: call read_flp_fat cmp [FDC_Status], 0 @@ -1951,16 +2254,9 @@ fs_FloppySetFileInfo: push eax call bdfe_to_fat_entry pop eax - test eax, eax - jz .root - add eax, 31 pusha call save_chs_sector popa - jmp .cmn -.root: - call save_flp_root -.cmn: pop edi xor eax, eax cmp [FDC_Status], 0 diff --git a/kernel/trunk/fs/fat32.inc b/kernel/trunk/fs/fat32.inc index ac4912dfa8..e99911d75f 100644 --- a/kernel/trunk/fs/fat32.inc +++ b/kernel/trunk/fs/fat32.inc @@ -2,11 +2,12 @@ ;; ;; ;; FAT32.INC ;; ;; ;; -;; FAT16/32 functions for MenuetOS ;; +;; FAT16/32 functions for KolibriOS ;; ;; ;; ;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;; ;; ;; ;; See file COPYING for details ;; +;; 17.08.2006 LFN write/append to file - diamond ;; ;; 23.06.2006 LFN start application - diamond ;; ;; 15.06.2006 LFN get/set file/folder info - diamond ;; ;; 27.05.2006 LFN create/rewrite file - diamond ;; @@ -104,7 +105,6 @@ uglobal startpath: times 255 db 0 fat16_root db 0 ; flag for fat16 rootdir - f_del db 0 ; 1=overwrite fat entry fat_change db 0 ; 1=fat has changed endg @@ -225,27 +225,12 @@ set_FAT: cmp [fat_type],16 jne sfc_test32 - cmp [f_del],1 ; overwrite previous value? - je sfc_set16 ; yes - cmp word [ebx+esi],0 ; is cluster free? - je sfc_set16 ; yes - mov dword [8*0x100000],0xffffff - mov edx,[ebx+esi] ; get old value - jmp sfc_nonzero - sfc_set16: xchg [ebx+esi],dx ; save new value and get old value jmp sfc_write sfc_test32: mov eax,[fatMASK] - cmp [f_del],1 ; overwrite previous value? - je sfc_set32 ; yes - test eax,[ebx+esi] ; is cluster free? - je sfc_set32 ; yes - mov dword [8*0x100000],0xffffff - mov edx,[ebx+esi] ; get old value - jmp sfc_nonzero sfc_set32: and edx,eax @@ -554,13 +539,10 @@ analyze_directory_to_write: push eax ; save new cluster mov edx,eax mov eax,[cluster_tmp] ; change last cluster to point new cluster - mov [f_del],1 call set_FAT cmp [hd_error],0 jne adw_not_found_1 - mov [f_del],0 - mov ecx,-1 ; remove 1 cluster from free disk space call add_disk_free_space cmp [hd_error],0 @@ -883,13 +865,10 @@ makedir: jne make_dir_error_1 mov eax,[cluster] ; directory cluster xor edx,edx ; free - mov [f_del],1 call set_FAT cmp [hd_error],0 jne make_dir_error_1 - mov [f_del],0 - popad call update_disk ; write all of cache and fat to hd make_dir_error_2: @@ -1238,12 +1217,10 @@ file_append: mov edx,eax mov eax,[cluster] - mov [f_del],1 call set_FAT ; update previous cluster cmp [hd_error],0 jne append_access_1 - mov [f_del],0 pop eax jmp append_remove_free @@ -1362,12 +1339,10 @@ file_append: truncate_pos_found: mov edx,[fatEND] ; new end for cluster chain - mov [f_del],1 call set_FAT cmp [hd_error],0 jne append_access - mov [f_del],0 mov eax,edx ; clear rest of chain truncate_clear_chain: @@ -1875,7 +1850,6 @@ clear_cluster_chain: ;----------------------------------------------------- push eax ecx edx xor ecx,ecx ; cluster count - mov [f_del],1 ; delete on clean_new_chain: cmp eax,[LAST_CLUSTER] ; end of file @@ -1897,7 +1871,6 @@ clear_cluster_chain: delete_OK: call add_disk_free_space ; add clusters to free disk space access_denied_01: - mov [f_del],0 pop edx ecx eax ret @@ -3288,7 +3261,6 @@ fat_notroot_extend_dir: mov eax, [esp+4] mov eax, [eax] push edx - mov [f_del], 1 call set_FAT pop edx cmp [hd_error], 0 @@ -3450,7 +3422,6 @@ fs_HdRewrite: mov word [edi+26], cx test eax, eax jz .done1 - mov [f_del], 1 @@: cmp eax, [fatRESERVED] jae .done1 @@ -3736,7 +3707,6 @@ fs_HdRewrite: mov ecx, eax call get_free_FAT jc .diskfull - mov [f_del], 1 push edx mov edx, [fatEND] call set_FAT @@ -3783,6 +3753,348 @@ fs_HdRewrite: popad ret +;---------------------------------------------------------------- +; +; fs_HdWrite - LFN variant for writing to floppy +; +; esi points to filename +; ebx pointer to 64-bit number = first wanted byte, 0+ +; may be ebx=0 - start from first byte +; ecx number of bytes to write, 0+ +; edx mem location to data +; +; ret ebx = bytes written (maybe 0) +; eax = 0 ok write or other = errormsg +; +;-------------------------------------------------------------- +fs_HdWrite.access_denied: + push ERROR_ACCESS_DENIED +fs_HdWrite.ret0: + pop eax + xor ebx, ebx + ret + +fs_HdWrite.ret11: + push 11 + jmp fs_HdWrite.ret0 + +fs_HdWrite: + cmp [fat_type], 0 + jnz @f + push ERROR_UNKNOWN_FS + jmp .ret0 +@@: + cmp byte [esi], 0 + jz .access_denied + pushad + call hd_find_lfn + pushfd + cmp [hd_error], 0 + jz @f + popfd + popad + push 11 + jmp .ret0 +@@: + popfd + jnc .found + popad + push ERROR_FILE_NOT_FOUND + jmp .ret0 +.found: +; FAT does not support files larger than 4GB + test ebx, ebx + jz .l1 + cmp dword [ebx+4], 0 + jz @f +.eof: + popad + push ERROR_END_OF_FILE + jmp .ret0 +@@: + mov ebx, [ebx] +.l1: +; now edi points to direntry, ebx=start byte to write, +; ecx=number of bytes to write, edx=data pointer + +; extend file if needed + add ecx, ebx + jc .eof ; FAT does not support files larger than 4GB + push eax ; save directory sector + push 0 ; return value=0 + + call get_time_for_file + mov [edi+22], ax ; last write time + call get_date_for_file + mov [edi+24], ax ; last write date + mov [edi+18], ax ; last access date + + push dword [edi+28] ; save current file size + cmp ecx, [edi+28] + jbe .length_ok + cmp ecx, ebx + jz .length_ok + call hd_extend_file + jnc .length_ok + mov [esp+4], eax +; hd_extend_file can return three error codes: FAT table error, device error or disk full. +; First two cases are fatal errors, in third case we may write some data + cmp al, ERROR_DISK_FULL + jz .disk_full + pop eax + pop eax + mov [esp+4+28], eax + pop eax + popad + xor ebx, ebx + ret +.disk_full: +; correct number of bytes to write + mov ecx, [edi+28] + cmp ecx, ebx + ja .length_ok +.ret: + call update_disk + cmp [hd_error], 0 + jz @f + mov byte [esp+4], 11 +@@: + pop eax + pop eax + mov [esp+4+28], eax ; eax=return value + pop eax + sub edx, [esp+20] + mov [esp+16], edx ; ebx=number of written bytes + popad + ret +.length_ok: + mov esi, [edi+28] + mov eax, [edi+20-2] + mov ax, [edi+26] + mov edi, eax ; edi=current cluster + xor ebp, ebp ; ebp=current sector in cluster +; save directory + mov eax, [esp+8] + push ebx + mov ebx, buffer + call hd_write + pop ebx + cmp [hd_error], 0 + jz @f +.device_err: + mov byte [esp+4], 11 + jmp .ret +@@: + +; now ebx=start pos, ecx=end pos, both lie inside file + sub ecx, ebx + jz .ret +.write_loop: +; get length of data in current sector + push ecx + sub ebx, 0x200 + jb .hasdata + neg ebx + xor ecx, ecx + jmp @f +.hasdata: + neg ebx + cmp ecx, ebx + jbe @f + mov ecx, ebx +@@: +; get current sector number + mov eax, edi + dec eax + dec eax + imul eax, [SECTORS_PER_CLUSTER] + add eax, [DATA_START] + add eax, ebp +; load sector if needed + cmp dword [esp+4], 0 ; we don't need to read uninitialized data + jz .noread + cmp ecx, 0x200 ; we don't need to read sector if it is fully rewritten + jz .noread + cmp ecx, esi ; (same for the last sector) + jz .noread + push ebx + mov ebx, buffer + call hd_read + pop ebx + cmp [hd_error], 0 + jz @f +.device_err2: + pop ecx + jmp .device_err +@@: +.noread: +; zero uninitialized data if file was extended (because hd_extend_file does not this) + push eax ecx edi + xor eax, eax + mov ecx, 0x200 + sub ecx, [esp+4+12] + jbe @f + mov edi, buffer + add edi, [esp+4+12] + rep stosb +@@: +; zero uninitialized data in the last sector + mov ecx, 0x200 + sub ecx, esi + jbe @f + mov edi, buffer + add edi, esi + rep stosb +@@: + pop edi ecx eax +; copy new data + push eax + mov eax, edx + neg ebx + jecxz @f + add ebx, buffer+0x200 + call memmove + xor ebx, ebx +@@: + pop eax +; save sector + push ebx + mov ebx, buffer + call hd_write + pop ebx + cmp [hd_error], 0 + jnz .device_err2 + add edx, ecx + sub [esp], ecx + pop ecx + jz .ret +; next sector + inc ebp + cmp ebp, [SECTORS_PER_CLUSTER] + jb @f + xor ebp, ebp + mov eax, edi + call get_FAT + mov edi, eax + cmp [hd_error], 0 + jnz .device_err +@@: + sub esi, 0x200 + jae @f + xor esi, esi +@@: + sub dword [esp], 0x200 + jae @f + and dword [esp], 0 +@@: jmp .write_loop + +hd_extend_file.zero_size: + xor eax, eax + jmp hd_extend_file.start_extend + +; extends file on hd to given size (new data area is undefined) +; in: edi->direntry, ecx=new size +; out: CF=0 => OK, eax destroyed +; CF=1 => error, eax=code (ERROR_FAT_TABLE or ERROR_DISK_FULL or 11) +hd_extend_file: + push ebp + mov ebp, [SECTORS_PER_CLUSTER] + imul ebp, [BYTES_PER_SECTOR] + push ecx +; find the last cluster of file + mov eax, [edi+20-2] + mov ax, [edi+26] + mov ecx, [edi+28] + jecxz .zero_size +.last_loop: + sub ecx, ebp + jbe .last_found + call get_FAT + cmp [hd_error], 0 + jz @f +.device_err: + pop ecx +.device_err2: + pop ebp + push 11 +.ret_err: + pop eax + stc + ret +@@: + cmp eax, 2 + jb .fat_err + cmp eax, [fatRESERVED] + jb .last_loop +.fat_err: + pop ecx ebp + push ERROR_FAT_TABLE + jmp .ret_err +.last_found: + push eax + call get_FAT + cmp [hd_error], 0 + jz @f + pop eax + jmp .device_err +@@: + cmp eax, [fatRESERVED] + pop eax + jb .fat_err +; set length to full number of clusters + sub [edi+28], ecx +.start_extend: + pop ecx +; now do extend + push edx + mov edx, 2 ; start scan from cluster 2 +.extend_loop: + cmp [edi+28], ecx + jae .extend_done +; add new cluster + push eax + mov eax, edx + call get_free_FAT + jc .disk_full + mov edx, [fatEND] + call set_FAT + mov edx, eax + pop eax + test eax, eax + jz .first_cluster + push edx + call set_FAT + pop edx + jmp @f +.first_cluster: + ror edx, 16 + mov [edi+20], dx + ror edx, 16 + mov [edi+26], dx +@@: + mov eax, edx + cmp [hd_error], 0 + jnz .device_err3 + add [edi+28], ebp + jmp .extend_loop +.extend_done: + mov [edi+28], ecx + pop edx ebp + clc + ret +.device_err3: + pop edx + jmp .device_err2 +.disk_full: + pop eax edx ebp + push ERROR_DISK_FULL + pop eax + cmp [hd_error], 0 + jz @f + mov al, 11 +@@: stc + ret + fs_HdGetFileInfo: cmp [fat_type], 0 jnz @f diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index 8bdae2f0d9..2fe2a47137 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -347,7 +347,7 @@ fs_RamdiskServices: dd fs_RamdiskRead dd fs_RamdiskReadFolder dd fs_RamdiskRewrite - dd fs_NotImplemented + dd fs_RamdiskWrite dd fs_NotImplemented dd fs_RamdiskGetFileInfo dd fs_RamdiskSetFileInfo @@ -376,7 +376,7 @@ fs_FloppyServices: dd fs_FloppyRead dd fs_FloppyReadFolder dd fs_FloppyRewrite - dd fs_NotImplemented + dd fs_FloppyWrite dd fs_NotImplemented dd fs_FloppyGetFileInfo dd fs_FloppySetFileInfo @@ -447,7 +447,7 @@ fs_HdServices: dd fs_HdRead dd fs_HdReadFolder dd fs_HdRewrite - dd fs_NotImplemented + dd fs_HdWrite dd fs_NotImplemented dd fs_HdGetFileInfo dd fs_HdSetFileInfo diff --git a/programs/demos/bgitest/trunk/bgifont.inc b/programs/demos/bgitest/trunk/bgifont.inc index 331c9ef9e5..745b83c992 100644 --- a/programs/demos/bgitest/trunk/bgifont.inc +++ b/programs/demos/bgitest/trunk/bgifont.inc @@ -570,6 +570,12 @@ if ~ BGI_LEVEL eq KERNEL jg .nobold end if mov edx,[.color] +; \begin{diamond}[18.08.2006] +; starting from K0530 kernel interprets flag 0x1000000 as +; negate existing pixels colors, disregarding passed color +; we do not want this + and edx, 0xFFFFFF +; \end{diamond}[18.08.2006] mov eax,38 int 0x40 test ebp,BGI_BOLD diff --git a/programs/demos/bgitest/trunk/bgitest.asm b/programs/demos/bgitest/trunk/bgitest.asm index a3cfe7b1ce..aef9e8c62e 100644 --- a/programs/demos/bgitest/trunk/bgitest.asm +++ b/programs/demos/bgitest/trunk/bgitest.asm @@ -68,11 +68,10 @@ use32 dd 0x0 not1strun dd 0x0 -include 'lang.inc' +include 'lang.inc' include 'macros.inc' ;include 'debug.inc' include 'bgifont.inc' -lang equ en;ru;en START: mov [help],0 diff --git a/programs/demos/numcalc/trunk/@numcalc.asm b/programs/develop/examples/numcalc/trunk/@numcalc.asm similarity index 100% rename from programs/demos/numcalc/trunk/@numcalc.asm rename to programs/develop/examples/numcalc/trunk/@numcalc.asm diff --git a/programs/demos/numcalc/trunk/build.bat b/programs/develop/examples/numcalc/trunk/build.bat similarity index 100% rename from programs/demos/numcalc/trunk/build.bat rename to programs/develop/examples/numcalc/trunk/build.bat diff --git a/programs/develop/heed/trunk/heed.asm b/programs/develop/heed/trunk/heed.asm index 83374f986c..e51ddd55c0 100644 --- a/programs/develop/heed/trunk/heed.asm +++ b/programs/develop/heed/trunk/heed.asm @@ -1159,7 +1159,7 @@ help_window: add edx,14 ;help_text addr. add esi,37 ; = 51 - length 1 line mov ecx,0x00ffffff - mov edi,15 + mov edi,(help_end-help_text)/51 @@: add ebx,0x10 int 0x40 @@ -1329,6 +1329,7 @@ db 0xEC,0xED,0xEE,0xEF ;text for help_window help_label: db 'Help for HeEd.' help_text: +if lang eq ru db '1.HeEd в состоянии открыть файл только один раз и ' db ' нужное число раз сохранить его. ' db '2.При открытии файла без расширения надо это расши-' @@ -1344,12 +1345,27 @@ help_text: db ' дится память с адреса 0х80000, но размер файла ' db ' равен 0xFFFFFFFF. ' db ' (см. инфо "About") ' +else + db '1.HeEd can once open file and many times save it. ' + db '2.To open file without extension it is required to ' + db ' specify anyway as three spaces after a dot. ' + db '3.File is opened when the button "Go" is pressed. ' + db '4.Creation of new files in the menu is not provided' + db ' but you can edit... ' + db '5.Only number of bytes which was file size when ' + db ' opening is written to file. ' + db '6.If you press "Go" with empty filename field, ' + db ' memory starting from address 0x80000 is output, ' + db ' but file size equals to 0xFFFFFFFF. ' + db ' (see info "About") ' +end if help_end: ;text for about_window about_label: db 'About this funny.' about_text: +if lang eq ru db 'Некоторая информация для тех, кто захочет дописать ' - db 'сюда что-то свое: код практичкски не оптимизирован,' + db 'сюда что-то свое: код практически не оптимизирован,' db 'так что разобраться будет не так уж сложно. Строки ' db 'для кнопок меню должны идти прямо друг за другом, ' db 'т. к. я при выводе использую не mov esi,размер и ' @@ -1363,6 +1379,23 @@ about_text: db 'рок с GUI MeOS и поэтому не претендует на что-то ' db 'большее, чем пример. Просто надоела эта тема, а вы-' db 'кинуть жалко. mailto:babalbes@yandex.ru ' +else + db 'Some information for those who want add to this ' + db 'something their own: the code is practically not ' + db 'optimized, so investigation is not complicated. ' + db 'Strings for menu buttons must rank after each other' + db 'as I use not mov esi,size and mov edx,address when ' + db 'output but simply add offsets. For encodins and ' + db 'file sizes for save, it remains only add buttons ' + db 'with text in menu (at addition one should take into' + db 'account that buttons ID are recognized as dec ah ' + db 'rather than cmp ah,ID). Nevertheless if study is ' + db 'unpleasant, you can write and ask. This program has' + db 'been written in course of study GUI MeOS and does ' + db 'not therefore pretend on some more than example. ' + db 'Just this theme bothers, but I regret to delete. ' + db ' mailto:babalbes@yandex.ru ' +end if about_end: I_END: diff --git a/programs/fs/sysxtree/trunk/ascgl.inc b/programs/fs/sysxtree/trunk/ascgl.inc index 6cb56c2782..57f01e8543 100644 --- a/programs/fs/sysxtree/trunk/ascgl.inc +++ b/programs/fs/sysxtree/trunk/ascgl.inc @@ -20,8 +20,8 @@ lang equ ru ;0.07 convbmp ~13.05.2004 ;0.08 fps ~14.05.2004 ;0.09 drawfbox ~03.06.2004 -;0.10 all macros optimized by halyavin, add at ~07.06.2004 -;0.11 many macros optimized by halyavin, add at ~30.08.2004 +;0.10 all macros optimized by Halyavin A., add at ~07.06.2004 +;0.11 many macros optimized by Halyavin A., add at ~30.08.2004 ;0.12 bmptoimg ~07.09.2004 ;0.13 imgtoimg ~08.09.2004 ;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004 @@ -369,8 +369,8 @@ end if ;DrawBox macro drawfbox x,y,xs,ys,color { - wordstoreg ebx,x,xs ;x*65536+xs - wordstoreg ecx,y,ys ;y*65536+ys + words2reg ebx,x,xs ;x*65536+xs + words2reg ecx,y,ys ;y*65536+ys mov edx,color mov eax,13 int 0x40 @@ -385,8 +385,8 @@ local no_out_fps jmp spdat savetime dd 0 fps_cntr dd 0 -fps dd 0 -ttt dd 0 +fps dd 0 +ttt dd 0 spdat: get_time: mov eax,3 @@ -395,7 +395,7 @@ get_time: jne new_time inc [fps_cntr] cmp dword [ttt],0 - je out_fps + je out_fps dec dword [ttt] jmp no_out_fps new_time: @@ -405,7 +405,7 @@ new_time: mov [fps_cntr],0 out_fps: if ~(delcolor eq ) - mov ebx,x*65536+30 + mov ebx,x*65536+36 mov ecx,y*65536+7 mov edx,delcolor mov eax,13 @@ -413,7 +413,7 @@ if ~(delcolor eq ) end if mov dword [ttt],fps_show_frequency mov eax,47 - mov ebx,5*65536 + mov ebx,6*65536 ; mov bl,0 mov edx,x*65536+y mov esi,color @@ -427,44 +427,44 @@ _1dbounce_count=0; macro collimg img1_off,x1,y1,img2_off,x2,y2,otv { local bounce,exit,anot,bc,nbc - mov esi,[img1_off] ;xs1 - mov edi,[img2_off] ;ys2 - mov eax,x1 ; - mov ebx,x2 ; - call _1dbounce - mov edx,ecx - mov esi,[img1_off+4] ;ys1 - mov edi,[img2_off+4] ;ys2 - mov eax,y1 ; - mov ebx,y2 ; - call _1dbounce - add edx,ecx - cmp edx,2 - je bounce - mov otv,0 - jmp exit + mov esi,[img1_off] ;xs1 + mov edi,[img2_off] ;ys2 + mov eax,x1 ; + mov ebx,x2 ; + call _1dbounce + mov edx,ecx + mov esi,[img1_off+4] ;ys1 + mov edi,[img2_off+4] ;ys2 + mov eax,y1 ; + mov ebx,y2 ; + call _1dbounce + add edx,ecx + cmp edx,2 + je bounce + mov otv,0 + jmp exit _1dbounce_count=_1dbounce_count+1 if _1dbounce_count = 1 _1dbounce: - cmp ebx,eax - jb anot - add eax,esi - cmp eax,ebx - jbe nbc + cmp ebx,eax + jb anot + add eax,esi + cmp eax,ebx + jbe nbc bc: - mov ecx,1 - ret + mov ecx,1 + ret anot: add ebx,edi - cmp ebx,eax - ja bc + cmp ebx,eax + ja bc nbc: - xor ecx,ecx - ret + xor ecx,ecx + ret end if -bounce: - mov otv,1 -exit: +bounce: + mov otv,1 +exit: } macro rgbtobgr image @@ -495,7 +495,7 @@ macro setimg x , y ,arg3 shl ecx,16 add cx,[arg3+4] ; wordstoreg ecx,[arg3],[arg3+4] - wordstoreg edx, x , y ;arg1*65536+arg2 + words2reg edx, x , y ;arg1*65536+arg2 int 0x40 } @@ -504,7 +504,7 @@ macro setframe x , y ,arg3 mov eax,7 mov ebx,arg3 add ebx,8 - wordstoreg edx, x , y ;arg1*65536+arg2 + words2reg edx, x , y ;arg1*65536+arg2 add edx,dword [arg3] mov ecx,dword [arg3+4] int 0x40 @@ -697,7 +697,7 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize sub esi,dword [bmptoimg_data_area_bps] sub esi,dword [bmptoimg_data_area_bps] cmp esi,dword [bmptoimg_data_area_sop] - jb end_bmp + jb end_bmp add edi,eax add ebp,eax jmp nextstring @@ -705,7 +705,7 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize convertno32: mov ebx,bmp_load_area add ebx, [bmp_load_area+14] - add ebx,14 ;start of color table + add ebx,14 ;start of color table push esi add esi,dword [bmptoimg_data_area_bps] mov dword [bmptoimg_data_area_eos],esi @@ -714,9 +714,9 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize push eax movzx eax,byte [esi] cmp word [bmp_load_area+28],4 - je convert4bpp + je convert4bpp cmp word [bmp_load_area+28],1 - je convert1bpp + je convert1bpp call converttable convert2: @@ -750,7 +750,7 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize mov edx,7 nextbit: xor eax,eax - bt ecx,edx + bt ecx,edx jnc noaddelem inc eax noaddelem: @@ -758,7 +758,7 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize call converttable pop edx dec edx - js convert2 + js convert2 add edi,3 add ebp,3 @@ -776,12 +776,12 @@ local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize bmptoimg_data_area_count=bmptoimg_data_area_count+1 if bmptoimg_data_area_count = 1 ; DATA AREA -bmptoimg_soi dd 0 -bmptoimg_data_area_bps dd 0 +bmptoimg_soi dd 0 +bmptoimg_data_area_bps dd 0 bmptoimg_data_area_dwps dd 0 -bmptoimg_data_area_sop dd 0 -bmptoimg_data_area_eop dd 0 -bmptoimg_data_area_eos dd 0 +bmptoimg_data_area_sop dd 0 +bmptoimg_data_area_eop dd 0 +bmptoimg_data_area_eos dd 0 end if end_bmp: @@ -806,7 +806,7 @@ local notintable, er, zend, nxt, continue, ex, Gif_skipmap local Gif_get_sym, shift, nextbl, noblock, loop1, exx local Gif_output, next, loop2 -_null equ 0x1000 ; 0x1000 +_null = 0x1000 ; 0x1000 ; jmp sss ; if defined gif_hash_offset @@ -816,13 +816,13 @@ _null equ 0x1000 ; 0x1000 ; end if ;sss: - mov esi,gifsrc ;Указатель на ГИФ фаил в памяти - mov edi,imgsrc ;Указатель на список картинок + mov esi,gifsrc ;Указатель на ГИФ фаил в памяти + mov edi,imgsrc ;Указатель на список картинок if defined gif_hash_offset - mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт + mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт else - mov eax,hasharea ;Рабочая область минимум 4096*4 байт + mov eax,hasharea ;Рабочая область минимум 4096*4 байт end if call ReadGIF @@ -845,12 +845,12 @@ ReadGIF: mov [img_count],eax inc eax cmp dword[esi],'GIF8' - jne er ; signature + jne er ; signature mov ecx,[esi+0xa] inc eax add esi,0xd mov edi,esi - bt ecx,7 + bt ecx,7 jnc nextblock mov [globalColor],esi call Gif_skipmap @@ -891,8 +891,8 @@ noextblock: push edi movzx ecx,word[esi] inc esi - bt ecx,7 - jc uselocal + bt ecx,7 + jc uselocal push [globalColor] mov edi,esi jmp setPal @@ -909,7 +909,7 @@ setPal: mov edi,[table_ptr] xor eax,eax cld - lodsb ; eax - block_count + lodsb ; eax - block_count add eax,esi mov [block_ofs],eax mov [bit_count],8 @@ -933,7 +933,7 @@ reinit: pop [compsize] call Gif_get_sym cmp eax,[CC] - je reinit + je reinit call Gif_output cycle: movzx ebx,ax @@ -941,9 +941,9 @@ cycle: cmp eax,edx jae notintable cmp eax,[CC] - je reinit + je reinit cmp eax,[EOI] - je zend + je zend call Gif_output zadd: push eax @@ -997,7 +997,7 @@ Gif_skipmap: ; out: edi - pointer to area after colormap and ecx,111b - inc ecx ; color map size + inc ecx ; color map size mov ebx,1 shl ebx,cl lea ebx,[ebx*2+ebx] @@ -1015,7 +1015,7 @@ shift: jnz loop1 inc esi cmp esi,[block_ofs] - jb noblock + jb noblock push eax xor eax,eax lodsb @@ -1057,14 +1057,14 @@ loop2: add esi,[Palette] if COLOR_ORDER eq MENUETOS - mov esi,[esi] - bswap esi - shr esi,8 - mov [edi],esi - add edi,3 + mov esi,[esi] + bswap esi + shr esi,8 + mov [edi],esi + add edi,3 else - movsw - movsb + movsw + movsb end if loop loop2 @@ -1073,7 +1073,7 @@ loop2: globalColor dd 1 img_count dd 1 - cur_info dd 1 ; image table pointer + cur_info dd 1 ; image table pointer img_start dd 1 codesize dd 1 compsize dd 1 @@ -1101,15 +1101,15 @@ local notintable, er, zend, nxt, continue, ex, Gif_skipmap local Gif_get_sym, shift, nextbl, noblock, loop1, exx local Gif_output, next, loop2 -_null fix 0x1000 ; 0x1000 +_null = 0x1000 ; 0x1000 - mov esi,gifsrc ;Указатель на ГИФ фаил в памяти - mov edi,imgsrc ;Указатель на список картинок + mov esi,gifsrc ;Указатель на ГИФ фаил в памяти + mov edi,imgsrc ;Указатель на список картинок if defined gif_hash_offset - mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт + mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт else - mov eax,hasharea ;Рабочая область минимум 4096*4 байт + mov eax,hasharea ;Рабочая область минимум 4096*4 байт end if call ReadGIF @@ -1130,12 +1130,12 @@ ReadGIF: mov [img_count],eax inc eax cmp dword[esi],'GIF8' - jne er ; signature + jne er ; signature mov ecx,[esi+0xa] inc eax add esi,0xd mov edi,esi - bt ecx,7 + bt ecx,7 jnc nextblock mov [globalColor],esi call Gif_skipmap @@ -1187,8 +1187,8 @@ noextblock: push edi movzx ecx,word[esi] inc esi - bt ecx,7 - jc uselocal + bt ecx,7 + jc uselocal push [globalColor] mov edi,esi jmp setPal @@ -1205,7 +1205,7 @@ setPal: mov edi,[table_ptr] xor eax,eax cld - lodsb ; eax - block_count + lodsb ; eax - block_count add eax,esi mov [block_ofs],eax mov [bit_count],8 @@ -1229,7 +1229,7 @@ reinit: pop [compsize] call Gif_get_sym cmp eax,[CC] - je reinit + je reinit call Gif_output cycle: movzx ebx,ax @@ -1237,9 +1237,9 @@ cycle: cmp eax,edx jae notintable cmp eax,[CC] - je reinit + je reinit cmp eax,[EOI] - je zend + je zend call Gif_output zadd: push eax @@ -1291,9 +1291,8 @@ ex: Gif_skipmap: ; in: ecx - image descriptor, esi - pointer to colormap ; out: edi - pointer to area after colormap - and ecx,111b - inc ecx ; color map size + inc ecx ; color map size mov ebx,1 shl ebx,cl lea ebx,[ebx*2+ebx] @@ -1311,7 +1310,7 @@ shift: jnz loop1 inc esi cmp esi,[block_ofs] - jb noblock + jb noblock push eax xor eax,eax lodsb @@ -1353,14 +1352,14 @@ loop2: add esi,[Palette] if COLOR_ORDER eq MENUETOS - mov esi,[esi] - bswap esi - shr esi,8 - mov [edi],esi - add edi,3 + mov esi,[esi] + bswap esi + shr esi,8 + mov [edi],esi + add edi,3 else - movsw - movsb + movsw + movsb end if loop loop2 @@ -1369,7 +1368,7 @@ loop2: globalColor dd 1 img_count dd 1 - cur_info dd 1 ; image table pointer + cur_info dd 1 ; image table pointer img_start dd 1 codesize dd 1 compsize dd 1 diff --git a/programs/fs/sysxtree/trunk/ascgml.inc b/programs/fs/sysxtree/trunk/ascgml.inc new file mode 100644 index 0000000000..18d501e4da --- /dev/null +++ b/programs/fs/sysxtree/trunk/ascgml.inc @@ -0,0 +1,49 @@ +lang equ ru + +; +; Assembler +; SMALL +; CODE +; GaMe +; Libary +; +; Ver 0.03 By Pavlushin Evgeni (RUSSIA) +; www.waptap@mail.ru + +;InfoList +;0.01 correct +;0.02 control ~14.05.2004 +;0.03 all macros optimized by halyavin, add at ~07.06.2004 + + +; corectiryemoe,corectnoe,step +macro correct arg1,arg2,arg3 +{ +local plus,minus,equal + mov eax,arg2 + cmp arg1,eax + je equal + mov eax,arg3 + ja minus +plus: + add arg1,eax + jmp equal +minus: + sub arg1,eax +equal: +} + +macro control min,max,arg +{ +local gr,low,norm + mov eax,max + cmp arg,eax + jg gr + mov eax,min + cmp arg,eax + jnl norm +gr: +low: + mov arg,eax +norm: +} diff --git a/programs/fs/sysxtree/trunk/ascl.inc b/programs/fs/sysxtree/trunk/ascl.inc index a07fd81a15..515a4520a8 100644 --- a/programs/fs/sysxtree/trunk/ascl.inc +++ b/programs/fs/sysxtree/trunk/ascl.inc @@ -27,11 +27,13 @@ lang equ ru ; ru en fr ge fi ;0.12 open/save dialog ~13.09.2004 ;0.13 dialogs bugs deleted ;0.14 drawlbut ~03.10.2004 +;0.15 extendet label! ; LOADFILE ; (SYNTAX) LOADFILE 'full_path_to_file',file_load_area,file_temp_area ; (SAMPLE) LOADFILE '/rd/1/clock.bmp',load_area,temp_area + macro loadfile file_name,file_load_area,file_temp_area { local open,fileinfo,string @@ -59,24 +61,74 @@ open: } -macro wordstoreg reg,hiword,loword +;macro wordstoreg reg,hiword,loword +;{ +;if hiword eqtype 0 & loword eqtype 0 +; mov reg,dword hiword*65536+loword +;else if hiword eqtype 12 & loword eqtype eax +; mov reg,dword hiword*65536 +; add reg,dword loword +;else if hiword eqtype 12 & loword eqtype [123] +; mov reg,dword hiword*65536 +; add reg,dword loword +;else +; mov reg,dword hiword +; shl reg,16 +; add reg,dword loword +;end if +;} + +macro dword2reg reg,doubleword { -if hiword eqtype 0 & loword eqtype 0 - mov reg,(hiword)*65536+(loword) -else if hiword eqtype 12 & loword eqtype eax - mov reg,(hiword)*65536 - add reg,loword -else if hiword eqtype 0 & loword eqtype [123] - mov reg,(hiword)*65536 - add reg,loword -else if (hiword eq ) & (loword eq ) +if doubleword eq + ; not changes else - mov reg,hiword - shl reg,16 - add reg,loword + mov reg,dword doubleword end if } +macro words2reg reg,hiword,lowword +{ +if hiword eq + if lowword eq + ; not changes + else + if lowword eqtype 12 + and reg,dword 0xffff0000 + add reg,dword lowword + else + and reg,dword 0xffff0000 + add reg,dword lowword + end if + end if +else + if lowword eq + if hiword eqtype 12 + and reg,dword 0x0000ffff + add reg,dword hiword*65536 + else + shl reg,16 + add reg,dword hiword + ror reg,16 + end if + else + if lowword eqtype 12 & hiword eqtype 12 + if lowword eq 0 & hiword eq 0 + xor reg,reg + else + mov reg,dword hiword*65536+lowword + end if + else + mov reg,dword hiword + shl reg,16 + add reg,dword lowword + end if + end if +end if +} + + + ; DRAW BUTTON with label @@ -86,8 +138,8 @@ local asd,lab jmp asd lab db text ;arg label asd: - wordstoreg ebx,x,xs - wordstoreg ecx,y,ys + words2reg ebx,x,xs + words2reg ecx,y,ys mov edx,id mov esi,bcolor mov eax,8 @@ -328,7 +380,7 @@ run_fileinfo: db '/RD/1/SYSXTREE',0 procinfo: -times 256 db 0 +times 1024 db 0 } @@ -390,7 +442,7 @@ new_d: mov eax,60 mov ebx,1 ; define IPC mov ecx,path ; offset of area - mov edx,120 ; size 150 bytes + mov edx,150 ; size 150 bytes int 0x40 ; change wanted events list 7-bit IPC event @@ -458,6 +510,7 @@ mred: call redproc jmp getmesloop mkey: + mov eax,2 int 0x40 ; read (eax=2) jmp getmesloop mbutton: @@ -526,8 +579,8 @@ dlg_pid_get dd 0 DLGPID dd 0 param: - rb 4 ; My dec PID - rb 6 ; Type of dialog + dd 0 ; My dec PID + dd 0,0 ; Type of dialog run_fileinfo: dd 16 @@ -535,11 +588,11 @@ run_fileinfo: dd param dd 0 dd procinfo -run_filepath: +;run_filepath: db '/RD/1/SYSXTREE',0 procinfo: -times 256 db 0 +times 1024 db 0 } @@ -635,10 +688,15 @@ macro puttxt x,y,offs,size,color ; mov ebx,x ; shl ebx,16 ; add ebx,y - wordstoreg ebx,x,y - mov ecx,color - mov edx,offs - mov esi,size + words2reg ebx,x,y + + dword2reg ecx,color + dword2reg edx,offs + dword2reg esi,size + +; mov ecx,color +; mov edx,offs +; mov esi,size mov eax,4 int 0x40 } @@ -649,7 +707,7 @@ macro outcount data, x, y, color, numtype mov ebx,numtype mov bl,0 ; mov edx,x*65536+y - wordstoreg edx,x,y + words2reg edx,x,y mov esi,color mov eax,47 int 0x40 @@ -728,8 +786,8 @@ macro window arg1,arg2,arg3,arg4,arg5 { ; mov ebx,arg1*65536+arg3 ; mov ecx,arg2*65536+arg4 - wordstoreg ebx,arg1,arg3 - wordstoreg ecx,arg2,arg4 + words2reg ebx,arg1,arg3 + words2reg ecx,arg2,arg4 mov edx,arg5 mov eax,0 int 0x40 @@ -769,7 +827,7 @@ macro endwd ; (SYNTAX) LABEL Xstart,Ystart,'Text',Color ; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big -macro label arg1,arg2,arg3,arg4 +macro glabel arg1,arg2,arg3,arg4 { local asd,lab jmp asd @@ -778,10 +836,11 @@ asd: ; mov ebx,arg1 ;arg1=y arg2=x ; shl ebx,16 ; add ebx,arg2 - wordstoreg ebx,arg1,arg2 -if ~(arg4 eq ) - mov ecx,arg4 ;arg4 color -end if + + words2reg ebx,arg1,arg2 + + dword2reg ecx,arg4 + mov edx,lab mov esi,asd-lab ;calc size mov eax,4 diff --git a/programs/fs/sysxtree/trunk/ascml.inc b/programs/fs/sysxtree/trunk/ascml.inc new file mode 100644 index 0000000000..c84669031d --- /dev/null +++ b/programs/fs/sysxtree/trunk/ascml.inc @@ -0,0 +1,93 @@ +lang equ ru + +; +; Assembler +; SMALL +; CODE +; Massive operation +; Libary +; +; Ver 0.1 By Pavlushin Evgeni (RUSSIA) +; www.waptap@mail.ru + +;InfoList +;0.01 readmas,compmas,findmas + +macro readmas masoff,obroff +{ +local loo + mov edi,masoff + add edi,8 + mov ebp,[masoff] ;elements + mov edx,[masoff+4] ;elemsize + mov eax,0 ;count +loo: + pushad + call obroff + popad + add edi,edx + inc eax + cmp eax,ebp + jne loo +} + +macro compmas masoff1,masoff2,obroff +{ +local loo,loo2 + mov esi,masoff2 + add esi,8 + mov ecx,[masoff2] + mov ebx,[masoff2+4] + mov eax,0 + +loo2: + push eax + + mov edi,masoff1 + add edi,8 + mov ebp,[masoff1] ;elements1 + mov edx,[masoff1+4] ;elemsize1 + mov eax,0 ;count +loo: + pushad + call obroff + popad + add edi,edx + inc eax + cmp eax,ebp + jne loo + + add esi,ebx + pop eax + inc eax + cmp eax,ecx + jne loo2 +} + + +macro findmas masoff,obroff +{ +local loo,looend,lend + mov edi,masoff + add edi,8 + mov ebp,[masoff] ;elements + mov edx,[masoff+4] ;elemsize + mov eax,0 ;count +loo: + pushad + mov eax,0 + call obroff + cmp eax,1 + je looend + popad + add edi,edx + inc eax + cmp eax,ebp + jne loo + stc + jmp lend +looend: + popad + clc +lend: +} \ No newline at end of file diff --git a/programs/fs/sysxtree/trunk/macros.inc b/programs/fs/sysxtree/trunk/macros.inc index 5527ff55c1..9c0841da62 100644 --- a/programs/fs/sysxtree/trunk/macros.inc +++ b/programs/fs/sysxtree/trunk/macros.inc @@ -1,3 +1,15 @@ +; language for programs +lang fix en ; ru en fr ge fi + +@^ fix macro comment { +^@ fix } + + +macro m2m dest,src { + push src + pop dest +} + ; new application structure macro meos_app_start { @@ -74,36 +86,73 @@ struc mstr [sstring] ; strings -macro sz name,[data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if used name - db data - end if - common - if used name - .size = $-name - end if +macro sz name,[data] { ; from MFAR [mike.dld] + common + if used name + name db data + .size = $-name + end if } macro lsz name,[lng,data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if (used name)&(lang eq lng) - db data - end if - common - if used name - .size = $-name - end if + common + if used name + label name + forward + if lang eq lng + db data + end if + common + .size = $-name + end if } +macro szc name,elsz,[data] { ; from MFAR [mike.dld] + common + local s,m + m = 0 + if used name + label name + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + .size = $-name + .maxl = m + end if +} + +macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld] + common + local s,m,c + m = 0 + c = 0 + if used name + label name + forward + if lang eq lng + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + c = c+1 + end if + common + .size = $-name + .maxl = m + .count = c + end if +} ; easy system call macro @@ -123,8 +172,16 @@ macro mpack dest, hsrc, lsrc end if } -macro __mov reg,a { ; mike.dld - if ~a eq +;macro __mov reg,a { ; mike.dld +; if ~a eq +; mov reg,a +; end if +;} + +macro __mov reg,a,b { ; mike.dld + if (~a eq)&(~b eq) + mpack reg,a,b + else if (~a eq)&(b eq) mov reg,a end if } @@ -140,11 +197,71 @@ macro mcall a,b,c,d,e,f { ; mike.dld } +; ------------------------- +macro header a,[b] { + common + use32 + org 0 + db 'MENUET',a + forward + if b eq + dd 0 + else + dd b + end if } +macro section name { align 16 + label name } +macro func name { + if ~used name + display 'FUNC NOT USED: ',`name,13,10 + else + align 4 + name: +;pushad +;pushfd +;dps `name +;newline +;mcall 5,1 +;popfd +;popad +} +macro endf { end if } -; language for programs -lang fix ru ; ru en fr ge fi - +macro diff16 title,l1,l2 + { + local s,d + s = l2-l1 + display title,': 0x' + repeat 8 + d = '0' + s shr ((8-%) shl 2) and $0F + if d > '9' + d = d + 'A'-'9'-1 + end if + display d + end repeat + display 13,10 + } +macro diff10 title,l1,l2 + { + local s,d,z,m + s = l2-l1 + z = 0 + m = 1000000000 + display title,': ' + repeat 10 + d = '0' + s / m + s = s - (s/m)*m + m = m / 10 + if d <> '0' + z = 1 + end if + if z <> 0 + display d + end if + end repeat + display 13,10 + } ; optimize the code for size __regs fix @@ -153,9 +270,9 @@ macro add arg1,arg2 { if (arg2 eqtype 0) if (arg2) = 1 - inc arg1 + inc arg1 else - add arg1,arg2 + add arg1,arg2 end if else add arg1,arg2 @@ -166,9 +283,9 @@ macro sub arg1,arg2 { if (arg2 eqtype 0) if (arg2) = 1 - dec arg1 + dec arg1 else - sub arg1,arg2 + sub arg1,arg2 end if else sub arg1,arg2 @@ -179,17 +296,17 @@ macro mov arg1,arg2 { if (arg1 in __regs) & (arg2 eqtype 0) if (arg2) = 0 - xor arg1,arg1 + xor arg1,arg1 else if (arg2) = 1 - xor arg1,arg1 - inc arg1 + xor arg1,arg1 + inc arg1 else if (arg2) = -1 - or arg1,-1 + or arg1,-1 else if (arg2) > -128 & (arg2) < 128 - push arg2 - pop arg1 + push arg2 + pop arg1 else - mov arg1,arg2 + mov arg1,arg2 end if else mov arg1,arg2 @@ -197,48 +314,230 @@ macro mov arg1,arg2 } +macro RGB [a] { + common + match (r=,g=,b),a \{ + \dd ((r) shl 16) or ((g) shl 8) or (b) + \} +} + + +struc POINT _t,_dx,_dy { + .x _t _dx + .y _t _dy +} + + +; Macroinstructions for defining data structures + macro struct name - { - virtual at 0 - name name - sizeof.#name = $ - name - end virtual - } + { fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common fields@struct equ fields@struct,.,db, \} + struc dw [val] \{ \common fields@struct equ fields@struct,.,dw, \} + struc du [val] \{ \common fields@struct equ fields@struct,.,du, \} + struc dd [val] \{ \common fields@struct equ fields@struct,.,dd, \} + struc dp [val] \{ \common fields@struct equ fields@struct,.,dp, \} + struc dq [val] \{ \common fields@struct equ fields@struct,.,dq, \} + struc dt [val] \{ \common fields@struct equ fields@struct,.,dt, \} + struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \} + struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \} + struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \} + struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \} + struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \} + struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \} + macro db [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,db, \} + macro dw [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dw, \} + macro du [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,du, \} + macro dd [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dd, \} + macro dp [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dp, \} + macro dq [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dq, \} + macro dt [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dt, \} + macro rb count \{ \local anonymous + fields@struct equ fields@struct,anonymous,db,count dup (?) \} + macro rw count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dw,count dup (?) \} + macro rd count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dd,count dup (?) \} + macro rp count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dp,count dup (?) \} + macro rq count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dq,count dup (?) \} + macro rt count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dt,count dup (?) \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} + virtual at 0 } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + fields@\\#name equ fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + if $ + display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah + err + end if + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label . + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,name,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + virtual at 0 + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ + rb sizeof.#parent#field - $ + end if + else if sizeof.#type > $ + rb sizeof.#type - $ + end if + common + sizeof.#name = $ + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + rb sizeof.#type + end if + local value + common + sizeof.#name = $ + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} } ; structures used in MeOS -struc process_information - { - .cpu_usage dd ? ; +0 - .window_stack_position dw ? ; +4 - .window_stack_value dw ? ; +6 - .not_used1 dw ? ; +8 - .process_name rb 12 ; +10 - .memory_start dd ? ; +22 - .used_memory dd ? ; +26 - .PID dd ? ; +30 - .x_start dd ? ; +34 - .y_start dd ? ; +38 - .x_size dd ? ; +42 - .y_size dd ? ; +46 - .slot_state dw ? ; +50 - rb (1024-52) - } struct process_information + cpu_usage dd ? ; +0 + window_stack_position dw ? ; +4 + window_stack_value dw ? ; +6 + not_used1 dw ? ; +8 + process_name rb 12 ; +10 + memory_start dd ? ; +22 + used_memory dd ? ; +26 + PID dd ? ; +30 + x_start dd ? ; +34 + y_start dd ? ; +38 + x_size dd ? ; +42 + y_size dd ? ; +46 + slot_state dw ? ; +50 + rb (1024-52) +ends -struc system_colors - { - .frame dd ? - .grab dd ? - .grab_button dd ? - .grab_button_text dd ? - .grab_text dd ? - .work dd ? - .work_button dd ? - .work_button_text dd ? - .work_text dd ? - .work_graph dd ? - } struct system_colors + frame dd ? + grab dd ? + grab_button dd ? + grab_button_text dd ? + grab_text dd ? + work dd ? + work_button dd ? + work_button_text dd ? + work_text dd ? + work_graph dd ? +ends ; constants @@ -247,20 +546,20 @@ struct system_colors EV_IDLE = 0 EV_TIMER = 0 EV_REDRAW = 1 -EV_KEY = 2 +EV_KEY = 2 EV_BUTTON = 3 EV_EXIT = 4 EV_BACKGROUND = 5 EV_MOUSE = 6 -EV_IPC = 7 +EV_IPC = 7 EV_STACK = 8 ; event mask bits for function 40 -EVM_REDRAW = 1b +EVM_REDRAW = 1b EVM_KEY = 10b EVM_BUTTON = 100b EVM_EXIT = 1000b EVM_BACKGROUND = 10000b EVM_MOUSE = 100000b EVM_IPC = 1000000b -EVM_STACK = 10000000b \ No newline at end of file +EVM_STACK = 10000000b diff --git a/programs/fs/sysxtree/trunk/SYSTR12.GIF b/programs/fs/sysxtree/trunk/systr12.GIF similarity index 100% rename from programs/fs/sysxtree/trunk/SYSTR12.GIF rename to programs/fs/sysxtree/trunk/systr12.GIF diff --git a/programs/fs/sysxtree/trunk/sysxtree.asm b/programs/fs/sysxtree/trunk/sysxtree.asm index 8ba77242f0..ad73a4bc23 100644 --- a/programs/fs/sysxtree/trunk/sysxtree.asm +++ b/programs/fs/sysxtree/trunk/sysxtree.asm @@ -31,41 +31,67 @@ ;****************************************************************************** use32 - org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; program start - dd I_END ; program image size - dd RAM_END ; memory - dd RAM_END ; stack - dd param_area ,0x0 ; param,icon + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; program start + dd I_END ; program image size + dd RAM_END ; memory + dd RAM_END ; stack + dd param_area ,0x0 ; param,icon ; dd 0,0 ;****************************************************************************** -include 'lang.inc' include 'macros.inc' include 'ascl.inc' include 'ascgl.inc' + gif_hash_offset = gif_hash -START: ; start of execution +START: ; start of execution ; //// Willow - mov eax,58 - mov ebx,MRUfile - int 0x40 +; mov eax,58 +; mov ebx,MRUfile +; int 0x40 ; //// Willow + mcall 18,11,1,table_area + mov edi,hdimg+62*2 + cmp [table_area+2],byte 0 + je no_hdpartition_on_hd0 + mov esi,hdimg1 + mov ecx,62 + rep movsb + no_hdpartition_on_hd0: + cmp [table_area+3],byte 0 + je no_hdpartition_on_hd1 + mov esi,hdimg2 + mov ecx,62 + rep movsb + no_hdpartition_on_hd1: + cmp [table_area+4],byte 0 + je no_hdpartition_on_hd2 + mov esi,hdimg3 + mov ecx,62 + rep movsb + no_hdpartition_on_hd2: + cmp [table_area+5],byte 0 + je no_hdpartition_on_hd3 + mov esi,hdimg4 + mov ecx,62 + rep movsb + no_hdpartition_on_hd3: mov eax,40 mov ebx,0100111b int 0x40 cmp byte [param_area],0 ;test parameters line - jne no_brow ;it's dialog + jne no_brow ;it's dialog mov [browser],dword 1 ;it's browser no_brow: cmp [browser],dword 1 - je no_dlg + je no_dlg mov al,byte [param_area+5] mov [dlg_type],al @@ -119,9 +145,9 @@ no_dlg: ;************************ mov eax,0 ;x - mov ebx,0 ;y + mov ebx,0 ;y mov esi,286 ;xs - mov edi,16 ;ys + mov edi,16 ;ys mov ecx,tempimg ;src mov edx,butimg ;dest call getimgproc @@ -130,14 +156,14 @@ no_dlg: mov edx,logoimg ;dest call getimgproc mov eax,0 ;x - mov ebx,16 ;y - mov esi,51 ;xs + mov ebx,16 ;y + mov esi,51 ;xs mov edi,esi ;ys - mov edx,logoinfimg ;dest + mov edx,logoinfimg ;dest call getimgproc - mov eax,51 ;x - mov esi,8 ;xs - mov edi,9 ;ys + mov eax,51 ;x + mov esi,8 ;xs + mov edi,9 ;ys mov edx,upsb ;dest call getimgproc mov eax,51+8 ;x @@ -145,9 +171,9 @@ no_dlg: call getimgproc mov eax,51+16 ;x - mov ebx,16 ;y - mov esi,12 ;xs - mov edi,9 ;ys + mov ebx,16 ;y + mov esi,12 ;xs + mov edi,9 ;ys mov ecx,tempimg ;src mov edx,hdico ;dest @@ -209,7 +235,7 @@ endgip: call read_directory ; call convertation red: - call draw_window ; at first, draw the window + call draw_window ; at first, draw the window still: mov eax,9 @@ -231,7 +257,7 @@ scrl: mov ebx,1 int 0x40 mov ebx,eax - shr eax,16 ;x + shr eax,16 ;x and ebx,0xffff ;y mov ebp,eax @@ -245,7 +271,7 @@ scrl: sub ebp,[listy] ;76 ;up scroll sub ebp,[scrollbutsize] cmp ebp,0 - jl menu_test + jl menu_test mov [mousey],ebp push eax ebx edx @@ -258,7 +284,7 @@ scrl: mov [filelistsize],eax mov ebx,eax cmp ebx,[listsize] ;filelistsize in ebx - ja notusescrl + ja notusescrl mov edx,0 mov eax,[listysize] @@ -287,7 +313,7 @@ scrl: sub ebx,[filelistsize] cmp eax,ebx jnae no_cor - mov eax,[listsize] ;correction for full dirs (1000 files) + mov eax,[listsize] ;correction for full dirs (1000 files) sub eax,[filelistsize] no_cor: mov [filecursor],eax @@ -309,7 +335,7 @@ usescrl: sub esi,ebp inc esi ;correction cmp ebx,esi - ja menu_test ;still + ja menu_test ;still oks: mov [flick],1 @@ -319,7 +345,7 @@ menu_test: cmp [pmenu_draw],1 ;if menu is show, update all jne still mov [pmenu_draw],0 - jmp red ;update all window + jmp red ;update all window ;this function not use in dialog when poup menu's is not used ;in dialog's @@ -327,7 +353,7 @@ menu_test: ;=================== ; Test keyboard ;=================== -key: ; key +key: ; key mov eax,2 int 0x40 cmp dword [focus],0 @@ -357,19 +383,19 @@ no_pgdown: jmp kfad no_k_ent: cmp ah,key_Bspace - je back + je back cmp ah,key_F2 - je viewset + je viewset cmp ah,key_F3 - je textopen + je textopen cmp ah,key_F5 - je copy_to_clip + je copy_to_clip cmp ah,key_F6 - je paste_from_clip + je paste_from_clip cmp ah,key_F11 - je edit_prompt + je edit_prompt cmp ah,key_F12 - je update + je update jmp still ; test input string @@ -397,7 +423,7 @@ no_con_right: mov ecx,[cursor] cmp ecx,0 - je still + je still dec ecx mov ebp,[cursor] lobsp: @@ -423,7 +449,7 @@ losx: mov ebp, [cursor] cmp ebp,100 - ja still + ja still mov byte [path+ebp],ah inc dword [cursor] @@ -436,12 +462,12 @@ losx: ;Test on mouse button ;----------------------------- - button: ; button + button: ; button mov eax,17 int 0x40 - cmp ah,2 ;Edit prompt line? - je edit_prompt + cmp ah,2 ;Edit prompt line? + je edit_prompt cmp ah,4 jne no_filelist @@ -451,7 +477,7 @@ mousetest: mov ebx,1 int 0x40 mov ebx,eax - shr eax,16 ;x + shr eax,16 ;x and ebx,0xffff ;y sub ebx,[listy] ;80 @@ -459,10 +485,10 @@ mousetest: mov ecx,[listx] cmp eax,ecx - jl still + jl still add ecx,[listxsize] cmp eax,ecx - jg still + jg still filexadd: @@ -492,9 +518,9 @@ no_kfad: lll2: mov al,byte [path+esi] cmp al,byte 0 ;' '; '/' - je fis2 + je fis2 cmp al,byte ' '; '/' - je fis2 + je fis2 inc esi cmp esi,100 jna lll2 @@ -508,10 +534,10 @@ fis2: inc esi mov ebp,8 -los: ;directory extension bug fix +los: ;directory extension bug fix mov al,[convinfo+edi] cmp al,' ' - jz skip_name_space + jz skip_name_space mov [path+esi],al inc esi skip_name_space: @@ -522,12 +548,12 @@ los: ;directory extension bug fix cmp byte [convinfo+edi],'.' jnz dir_name_end cmp byte [convinfo+edi+1],' ' - jz dir_name_end + jz dir_name_end mov ebp,4 dir_ext_char: mov al,[convinfo+edi] cmp al,' ' - jz dir_name_end + jz dir_name_end mov [path+esi],al inc esi inc edi @@ -556,17 +582,17 @@ los: ;directory extension bug fix ;Savetest savetest: cmp byte [dlg_type],'S' - je savetest_yes + je savetest_yes jmp still savetest_yes: mov ecx,100 savetestloop: cmp [path+ecx],byte 0 - je next_byte + je next_byte cmp [path+ecx],byte 32 - je next_byte + je next_byte cmp [path+ecx],byte '.' - je openf ;it's file + je openf ;it's file ; cmp [path+ecx],byte '/' ; je no_save ;it's dir next_byte: @@ -653,7 +679,7 @@ jpg_jpe: jmp run nojv: cmp eax,'.JPE' - je jpg_jpe + je jpg_jpe cmp eax,'.GIF' jne nojv1 mov ebx,gifview @@ -664,6 +690,11 @@ nojv1: mov ebx,ac97wav jmp run nojv12: + cmp eax,'.MID' + jne nojv13 + mov ebx,midamp + jmp run +nojv13: cmp eax,'.BMP' jne nobv mov ebx,bmpview @@ -676,14 +707,17 @@ nobv: jmp run nopngv: ; //// Willow + cmp eax,'.RTF' + jne nortf + mov ebx,rtfread + jmp run +nortf: cmp eax,'.ASM' je edit cmp eax,'.TXT' je edit cmp eax,'.INC' je edit - cmp eax,'.DAT' - je edit jmp still edit: mov ebx,editor @@ -729,16 +763,16 @@ run: no_filelist: - cmp ah,5 ;OPEN/SAVE button - je kfad + cmp ah,5 ;OPEN/SAVE button + je kfad - cmp ah,6 ;Scroll up + cmp ah,6 ;Scroll up jne no_scrlup mov ebx,1 jmp up no_scrlup: - cmp ah,7 ;Scroll down + cmp ah,7 ;Scroll down jne no_scrldown mov ebx,1 jmp down @@ -768,7 +802,7 @@ xlll2: xfis2: mov al,byte [path+esi] cmp al,byte ' ' - je xaa2 + je xaa2 inc esi cmp esi,12*20 jnae xfis2 @@ -779,7 +813,7 @@ xaa2: mul ebx mov edi,eax cmp [convinfo+edi+26],dword 'FOL ' - je still + je still mov ecx,12*20 xlopt: mov al,[path+ecx] @@ -822,7 +856,7 @@ not_cm: jmp still no_view: - cmp ah,12 ;move back + cmp ah,12 ;move back jne no_back back: mov esi,12*20 @@ -838,7 +872,7 @@ findsl: fis: mov al,byte [path+esi] cmp al,byte '/' - je aa + je aa mov [path+esi],byte 0 ;' ' dec esi jnz fis @@ -852,9 +886,9 @@ aa: jmp still no_back: - cmp ah,13 ;string up? + cmp ah,13 ;string up? jne no_up - mov ebx,1 ;step + mov ebx,1 ;step up: mov [downstop],0 sub [filecursor],ebx @@ -864,18 +898,18 @@ up: cr_ok: jmp draw_wd no_up: - cmp ah,14 ;string down? + cmp ah,14 ;string down? jne no_dn - mov ebx,1 ;step + mov ebx,1 ;step down: cmp [downstop],1 - je no_dn + je no_dn add [filecursor],ebx jmp draw_wd no_dn: cmp ah,15 - jne no_copyclip ;copy to clipboard + jne no_copyclip ;copy to clipboard copy_to_clip: mov ebx,param_area ;clipfilp mov eax,32 @@ -892,7 +926,7 @@ wlll2: wfis2: mov al,byte [path+esi] cmp al,byte ' ' - je waa2 + je waa2 inc esi cmp esi,12*20 jnae wfis2 @@ -903,7 +937,7 @@ waa2: mul ebx mov edi,eax cmp [convinfo+edi+26],dword 'FOL ' - je still + je still mov ecx,12*20 wlopt: mov al,[path+ecx] @@ -960,7 +994,7 @@ zlll2: zfis2: mov al,byte [destpath+esi] cmp al,byte ' ' - je zaa2 + je zaa2 inc esi cmp esi,100 jnae zfis2 @@ -973,7 +1007,7 @@ zaa2: qlll2: mov al,byte [sourcepath+edi] cmp al,byte '.' - je qfis2 + je qfis2 inc edi cmp edi,100 jnae qlll2 @@ -985,7 +1019,7 @@ qfis2: cfname: mov al,[sourcepath+edi] cmp al,byte ' ' - je dar + je dar mov [destpath+esi],al inc esi dar: @@ -1008,15 +1042,15 @@ nor: cmp [browser],dword 1 jne no_outpath - mov eax,4 ; function 4 : write text to window - mov ebx,10*65536+67 ; [x start] *65536 + [y start] + mov eax,4 ; function 4 : write text to window + mov ebx,10*65536+67 ; [x start] *65536 + [y start] mov ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB - mov edx,sourcepath ; pointer to text beginning + mov edx,sourcepath ; pointer to text beginning mov esi,100 ;12*20 ; text length int 0x40 - mov ebx,250*65536+67 ; [x start] *65536 + [y start] + mov ebx,250*65536+67 ; [x start] *65536 + [y start] mov ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB - mov edx,destpath ; pointer to text beginning + mov edx,destpath ; pointer to text beginning mov esi,100 ;12*20 ; text length int 0x40 no_outpath: @@ -1029,7 +1063,7 @@ no_outpath: jmp update ;still no_clippaste: - cmp ah,19 ;Delete from floppy + cmp ah,19 ;Delete from floppy delete_file: jne no_delt cmp dword [path],'/RD/' @@ -1056,8 +1090,8 @@ delete_file: jmp update no_delt: - cmp ah,20 ;I - Help - je help_scr + cmp ah,20 ;I - Help + je help_scr cmp ah,22 jne no_headfile @@ -1091,71 +1125,71 @@ no_headinfo: je kfad cmp ah,31 - je copy_to_clip ;Copy + je copy_to_clip ;Copy cmp ah,32 - je paste_from_clip ;Paste + je paste_from_clip ;Paste cmp ah,33 - je delete_file ;Delte + je delete_file ;Delte cmp ah,34 - je textopen ;Edit in Tinypad + je textopen ;Edit in Tinypad cmp ah,37 - je exit + je exit ;VIEW MENU - cmp ah,40 ;Sort by name show del + cmp ah,40 ;Sort by name show del jne no_sn ; mov dword [viewmode],0 and dword [viewmode],100b jmp update no_sn: - cmp ah,41 ;Sort by extension show del + cmp ah,41 ;Sort by extension show del jne no_se and dword [viewmode],1101b - or dword [viewmode],0001b + or dword [viewmode],0001b jmp update no_se: - cmp ah,42 ;Sort by size show del + cmp ah,42 ;Sort by size show del jne no_ss and dword [viewmode],1110b - or dword [viewmode],0010b + or dword [viewmode],0010b jmp update no_ss: - cmp ah,43 ;Sort by date show del + cmp ah,43 ;Sort by date show del jne no_sd - or dword [viewmode],0011b + or dword [viewmode],0011b jmp update no_sd: - cmp ah,44 ;Show del files + cmp ah,44 ;Show del files jne no_ds - or dword [viewmode],0100b + or dword [viewmode],0100b jmp update no_ds: - cmp ah,45 ;Fade del files + cmp ah,45 ;Fade del files jne no_df and dword [viewmode],11111011b jmp update no_df: ;HELP MENU - cmp ah,50 ;Help? - je help_scr + cmp ah,50 ;Help? + je help_scr - cmp ah,51 ;Info? - je info_scr + cmp ah,51 ;Info? + je info_scr cmp ah,83 - ja no_hd_part + ja no_hd_part cmp ah,80 - jb no_hd_part + jb no_hd_part mov ecx,0 sub ah,80 inc ah @@ -1166,18 +1200,18 @@ no_df: no_hd_part: - cmp ah,1 ; test on exit button - je exit + cmp ah,1 ; test on exit button + je exit jmp still exit: ; //// Willow - mov eax,58 - mov ebx,MRUfile - mov dword[ebx+8],255 - inc dword[ebx] - int 0x40 +; mov eax,58 +; mov ebx,MRUfile +; mov dword[ebx+8],255 +; inc dword[ebx] +; int 0x40 ; //// Willow mov eax,-1 int 0x40 @@ -1230,7 +1264,7 @@ dialogscr: mov ecx,cl_Black mov edx,ebp ;help_text -outlab: ;out labels +outlab: ;out labels mov eax,4 mov esi,40 helploo: @@ -1299,25 +1333,25 @@ draw_window: mov eax,[sc.work_button] mov [b_color],eax - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,1 ; 1, start of draw + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,1 ; 1, start of draw int 0x40 ;Window - xor eax,eax ; function 0 : define and draw window + xor eax,eax ; function 0 : define and draw window cmp [browser],dword 1 ;it's browser jne nob1 - mov ebx,140*65536+400 ; [x start] *65536 + [x size] - mov ecx,160*65536+280 ; [y start] *65536 + [y size] + mov ebx,140*65536+400 ; [x start] *65536 + [x size] + mov ecx,160*65536+280 ; [y start] *65536 + [y size] jmp isb1 nob1: - mov ebx,140*65536+320 ; [x start] *65536 + [x size] - mov ecx,260*65536+240 ; [y start] *65536 + [y size] + mov ebx,140*65536+320 ; [x start] *65536 + [x size] + mov ecx,260*65536+240 ; [y start] *65536 + [y size] isb1: ; mov edx,[sc.work] ; color of work area RRGGBB - or edx,0x03ffffff;000000 + or edx,0x03ffffff;000000 int 0x40 ;Get proc info @@ -1328,7 +1362,7 @@ isb1: mov eax,[procinfo.x_size] cmp eax,66 - jg temp12345 + jg temp12345 ret temp12345: @@ -1363,16 +1397,16 @@ isb9: cmp [browser],dword 1 ;it's browser jne nob2 - mov eax,[sc.grab_text] ; color of text RRGGBB - or eax,0x10000000 - label 8,8,'SYSTEM X-TREE FILE BROWSER',eax + mov eax,[sc.grab_text] ; color of text RRGGBB + or eax,0x10000000 + glabel 8,8,'SYSTEM X-TREE FILE BROWSER',eax ;Draw buttons headers mov eax,8 mov ebx,8*65536+(6*8-1) ;start pos x mov ecx,23*65536+10 ;start pos y mov edx,22;+1000000000000000000000000000000b ;spoke butt - mov edi,3 ;draw 13 button's + mov edi,3 ;draw 13 button's mov esi,0x00339933 int 0x40 dec edi @@ -1388,7 +1422,7 @@ nexthbut: mov ebx,340*65536+5 ;start pos x mov ecx,24*65536+8 ;start pos y mov edx,80;+1000000000000000000000000000000b ;spoke butt - mov edi,4 ;draw 13 button's + mov edi,4 ;draw 13 button's mov esi,0x00339933 int 0x40 dec edi @@ -1400,10 +1434,10 @@ nextpbut: jnz nextpbut ;DRAW PARTITON TEXT - label 341,25,'1234',cl_White;Black + glabel 341,25,'1234',cl_White;Black ;File STRING - label 8,25,' FILE VIEW INFO ', ;cl_White ;Black + glabel 8,25,' FILE VIEW INFO ', ;cl_White ;Black ;BlackLine mov eax,[procinfo.x_size] @@ -1422,20 +1456,20 @@ nextpbut: ;Set logo img setimg 34,88,logoinfimg - label 20,165,'SYSTEM X-TREE',cl_Black + glabel 20,165,'SYSTEM X-TREE',cl_Black add ebx,10 - label ,,'FOR MENUETOS', + glabel ,,'FOR MENUETOS', add ebx,9*65536+20 - label ,,'welcome to',cl_Green + glabel ,,'welcome to',cl_Green add ebx,-15*65536+10 - label ,,'www.menuetos.org',cl_Green + glabel ,,'www.menuetos.org',cl_Green -; label ,,'Create by',cl_Green +; glabel ,,'Create by',cl_Green ; add ebx,10 -; label ,,' Pavlushin', +; glabel ,,' Pavlushin', ; add ebx,10 -; label ,,' Evgeni', +; glabel ,,' Evgeni', ;Draw head->file buttons @@ -1444,7 +1478,7 @@ nextpbut: mov ebx,8*65536+6*12 ;start pos x mov ecx,35*65536+10 ;start pos y mov edx,30 ;spoke butt - mov edi,8 ;draw 4 button's + mov edi,8 ;draw 4 button's mov esi,cl_Grey call menubutton no_drawhf: @@ -1455,7 +1489,7 @@ no_drawhf: mov ebx,(8+6*8)*65536+6*12 ;start pos x mov ecx,35*65536+10 ;start pos y mov edx,40 ;spoke butt - mov edi,6 ;draw 4 button's + mov edi,6 ;draw 4 button's mov esi,cl_Grey call menubutton no_drawhv: @@ -1466,7 +1500,7 @@ no_drawhv: mov ebx,(8+12*8)*65536+6*12 ;start pos x mov ecx,35*65536+10 ;start pos y mov edx,50 ;spoke butt - mov edi,2 ;draw 2 button's + mov edi,2 ;draw 2 button's mov esi,cl_Grey call menubutton no_drawhi: @@ -1485,7 +1519,7 @@ nob3: mov ecx,29*65536+15 ;start pos y isb3: mov edx,8;+1000000000000000000000000000000b ;spoke butt - mov edi,13 ;draw 13 button's + mov edi,13 ;draw 13 button's mov esi,cl_Grey int 0x40 dec edi @@ -1522,7 +1556,7 @@ isb4: mov [urlxsize],eax mov [urlysize],12 - label 20,57,"URL:",cl_Black + glabel 20,57,"URL:",cl_Black ;Out view mode info mov eax,[viewmode] @@ -1541,9 +1575,9 @@ isb4: jmp isb5 head_dlg: db 'OPEN FILE' - db 'SAVE FILE' + db 'SAVE FILE' but_dlg: db 'OPEN' - db 'SAVE' + db 'SAVE' nob5: @@ -1556,18 +1590,18 @@ nob5: mov [urlxsize],eax mov [urlysize],12 - cmp byte [dlg_type],'O' ;if byte O - is Open dialog + cmp byte [dlg_type],'O' ;if byte O - is Open dialog jne no_openh - mov edx,head_dlg ;draw in head OPEN FILE + mov edx,head_dlg ;draw in head OPEN FILE jmp out_laby no_openh: - cmp byte [dlg_type],'S' ;if byte S - is Save dialog + cmp byte [dlg_type],'S' ;if byte S - is Save dialog jne no_saveh - mov edx,head_dlg+9 ;draw in head SAVE FILE + mov edx,head_dlg+9 ;draw in head SAVE FILE out_laby: mov ebx,8*65536+8 - mov ecx,[sc.grab_text] ; color of text RRGGBB - or ecx,0x10000000 + mov ecx,[sc.grab_text] ; color of text RRGGBB + or ecx,0x10000000 mov esi,9 mov eax,4 int 0x40 @@ -1598,14 +1632,14 @@ no_saveh: shl ebx,16 add ebx,eax - cmp byte [dlg_type],'O' ;if byte O - is Open dialog + cmp byte [dlg_type],'O' ;if byte O - is Open dialog jne no_openb - mov edx,but_dlg ;draw in head OPEN FILE + mov edx,but_dlg ;draw in head OPEN FILE jmp out_labx no_openb: - cmp byte [dlg_type],'S' ;if byte S - is Save dialog + cmp byte [dlg_type],'S' ;if byte S - is Save dialog jne no_saveb - mov edx,but_dlg+4 ;draw in head SAVE FILE + mov edx,but_dlg+4 ;draw in head SAVE FILE out_labx: mov ecx,cl_White mov esi,4 @@ -1666,7 +1700,7 @@ draw_url: int 0x40 ; OUT TEXT - mov eax,[urlxsize] ;calculating text leight + mov eax,[urlxsize] ;calculating text leight sub eax,8 mov ebx,6 div ebx @@ -1676,9 +1710,9 @@ draw_url: shl ebx,16 add ebx,[urly] add ebx,3*65536+2 - mov eax,4 ; function 4 : write text to window + mov eax,4 ; function 4 : write text to window mov ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB - mov edx,path ; pointer to text beginning + mov edx,path ; pointer to text beginning int 0x40 cmp [flick],2 @@ -1718,8 +1752,8 @@ no_flick_url: mov edx,0 mov ebx,eax - cmp ebx,[listsize] ;filelistsize in ebx - ja notusescroll + cmp ebx,[listsize] ;filelistsize in ebx + ja notusescroll ;usescroll mov eax,[listysize] sub eax,[scrollbutsize] @@ -1751,7 +1785,7 @@ notusescroll: mov ebx,[listx] shl ebx,16 add ebx,[listxsize] - sub ebx,15 ;right free zone + sub ebx,15 ;right free zone sub ebx,[scrollsize] mov ecx,[listy] shl ecx,16 @@ -1775,7 +1809,7 @@ notusescroll: mov ecx,[listy] shl ecx,16 add ecx,[scrollbutsize] - dec ecx ;correction + dec ecx ;correction mov eax,8 mov edx,6+1000000000000000000000000000000b ;spoke butt int 0x40 @@ -1799,7 +1833,7 @@ notusescroll: popad - dec ecx ;correction + dec ecx ;correction mov edx,7+1000000000000000000000000000000b ;spoke butt mov eax,[listysize] sub eax,[scrollbutsize] @@ -1848,7 +1882,7 @@ notusescroll: mov [filelistsize],eax ;dword 40 ; OUT FILE DATA - mov eax,[filecursor] ;calc cursor position + mov eax,[filecursor] ;calc cursor position mov ebx,62 mul ebx @@ -1868,30 +1902,34 @@ nb: mov eax,[edx+8] ;Color set cmp eax,dword '.TXT' ;text's blue - je itx + je itx cmp eax,dword '.INC' - je itx + je itx cmp eax,dword '.ASM' - je itx + je itx + cmp eax,dword '.RTF' + je itx jmp nt itx: mov ecx,0x00446666 jmp cset nt: cmp eax,dword '.BMP' ;picture's pure - je ipic + je ipic cmp eax,dword '.JPG' - je ipic + je ipic cmp eax,dword '.JPE' - je ipic + je ipic cmp eax,dword '.GIF' - je ipic + je ipic ; //// Willow cmp eax,dword '.PNG' - je ipic + je ipic ; //// Willow cmp eax,dword '.WAV' - je ipic + je ipic + cmp eax,dword '.MID' + je ipic jmp np ipic: mov ecx,0x00226688 @@ -1929,39 +1967,49 @@ no_hdico: push rdico+8 jmp out_ico no_rdico: + cmp [edx+9],dword 'FLOP' + jne no_fdico + push rdico+8 + jmp out_ico +no_fdico: push folico+8 jmp out_ico no_folico: cmp [edx+8],dword '.BMP' - je is_imgico + je is_imgico cmp [edx+8],dword '.JPG' - je is_imgico + je is_imgico cmp [edx+8],dword '.JPE' - je is_imgico + je is_imgico cmp [edx+8],dword '.GIF' - je is_imgico + je is_imgico ; //// Willow cmp [edx+8],dword '.PNG' - je is_imgico + je is_imgico ; //// Willow cmp [edx+8],dword '.WAV' - je is_imgico + je is_imgico + cmp [edx+8],dword '.MID' + je is_imgico jmp no_imgico is_imgico: push imgico+8 jmp out_ico no_imgico: cmp [edx+8],dword '.ASM' - je is_asmincico + je is_asmincico cmp [edx+8],dword '.INC' - je is_asmincico + je is_asmincico jmp no_asmincico is_asmincico: push asmincico+8 jmp out_ico no_asmincico: + cmp [edx+8],dword '.RTF' + je @f cmp [edx+8],dword '.TXT' jne no_txtico + @@: push txtico+8 jmp out_ico no_txtico: @@ -1998,7 +2046,7 @@ noout: dec [filelistsize] cmp [filelistsize],dword 0 - je extloo + je extloo dec ebp jnz loo @@ -2024,14 +2072,14 @@ extloo: jmp no_drawhftext file_text_label: - db ' Open ' - db ' Copy ' - db ' Paste ' - db ' Delete ' - db ' Tinypad ' - db ' Edit ' - db ' ' - db ' Exit ' + db ' Open ' + db ' Copy ' + db ' Paste ' + db ' Delete ' + db ' Tinypad ' + db ' Edit ' + db ' ' + db ' Exit ' no_drawhftext: @@ -2049,12 +2097,12 @@ no_drawhftext: jmp no_drawhvtext view_text_label: - db ' Name sort ' - db ' Ext. sort ' - db ' Size sort ' - db ' Date sort ' - db ' Show DEL ' - db ' Fade DEL ' + db ' Name sort ' + db ' Ext. sort ' + db ' Size sort ' + db ' Date sort ' + db ' Show DEL ' + db ' Fade DEL ' no_drawhvtext: @@ -2073,8 +2121,8 @@ no_drawhvtext: jmp no_drawhitext info_text_label: - db ' Help ' - db ' About ' + db ' Help ' + db ' About ' no_drawhitext: @@ -2085,16 +2133,16 @@ nob8: jmp still no_flick: - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw int 0x40 ret ;FILE LIST PARAMETRS -listx dd 15 -listy dd 72 +listx dd 15 +listy dd 72 listxsize dd 350 listysize dd 41 @@ -2110,8 +2158,8 @@ usescroll dd 1 ;URL LINE PARAMETRS -urlx dd 10 -urly dd 20 +urlx dd 10 +urly dd 20 urlxsize dd 350 urlysize dd 12 @@ -2205,7 +2253,7 @@ sortset: ;STEP 2 TEST ON HD OR PARTITION cmp [path],byte '/' je nstep - mov ecx,61+62 + mov ecx,61+62*5 loxhd: mov al,[hdimg+ecx] mov [convinfo+ecx],al @@ -2216,7 +2264,53 @@ loxhd: nstep: cmp [path+3],byte '/' je nstep2 + cmp [path+4],byte '/' + je nstep2 + cmp [path+1],word 'RD' + jne nostep_RD + mov ecx,61 + jmp loxpt +nostep_RD: + cmp [path+1],word 'FD' + jne nostep_FD mov ecx,61+62 + jmp loxpt +nostep_FD: + cmp [path+1],dword 'HD0' + jne nostep_HD0 + mov cl,[table_area+2] + movzx ecx,cl + imul ecx,62 + dec ecx + jmp loxpt +nostep_HD0: + cmp [path+1],dword 'HD1' + jne nostep_HD1 + mov cl,[table_area+3] + movzx ecx,cl + imul ecx,62 + dec ecx + jmp loxpt +nostep_HD1: + cmp [path+1],dword 'HD2' + jne nostep_HD2 + mov cl,[table_area+4] + movzx ecx,cl + imul ecx,62 + dec ecx + jmp loxpt +nostep_HD2: + cmp [path+1],dword 'HD3' + jne nostep_HD3 + mov cl,[table_area+5] + movzx ecx,cl + imul ecx,62 + dec ecx + jmp loxpt +nostep_HD3: + + mov ecx,61+62 ;+496 + loxpt: mov al,[ptimg+ecx] mov [convinfo+ecx],al @@ -2256,18 +2350,18 @@ hd_err: mov dword [blocksread],ebx ; for quick resorting cmp eax,5 - je end_of_dir + je end_of_dir ; It's erorr's test is poor code cmp eax,1 jne no_inv_part - label 10,10,'Invalid partition or hd base',cl_Red+font_Big + glabel 10,10,'Invalid partition or hd base',cl_Red+font_Big jmp end_of_dir no_inv_part: cmp eax,3 jne no_unk_fs - label 10,10,'Unknow file system',cl_Red+font_Big + glabel 10,10,'Unknow file system',cl_Red+font_Big jmp end_of_dir no_unk_fs: @@ -2284,7 +2378,7 @@ end_of_dir: mov edi,fileinfo+11 - pushad ; clear + pushad ; clear mov al,32 mov ecx,58 sub edi,11 @@ -2292,7 +2386,7 @@ end_of_dir: rep stosb popad - mov cl,[esi] ; end of entries ? + mov cl,[esi] ; end of entries ? cmp cl,6 jnz noib0 @@ -2305,9 +2399,9 @@ end_of_dir: mov cl,[esi+0] cmp cl,0xe5 - je yesdelfil + je yesdelfil - mov cl,[esi+11] ; long fat32 name ? + mov cl,[esi+11] ; long fat32 name ? cmp cl,0xf jnz noib1 @@ -2318,13 +2412,13 @@ end_of_dir: noib1: - mov eax,'DAT ' ; data or .. ? + mov eax,'DAT ' ; data or .. ? - mov cl,[esi+0] ; deleted file + mov cl,[esi+0] ; deleted file cmp cl,0xe5 - je yesdelfil + je yesdelfil cmp cl,0x0 - je yesdelfil + je yesdelfil jmp nodelfil yesdelfil: mov eax,'DEL ' @@ -2332,21 +2426,21 @@ end_of_dir: nodelfil: - mov cl,[esi+11] ; folder + mov cl,[esi+11] ; folder and cl,0x10 - jz ffile + jz ffile mov eax,'FOL ' mov [edi+26],eax jmp nosize ffile: ; Asko patch for v79 - mov cl,[esi+11] ; fold + mov cl,[esi+11] ; fold and cl,0xf - cmp cl,0xf ; skip long filename - jz novol - test cl,0x8 ; is it fold label? - jz novol ; no + cmp cl,0xf ; skip long filename + jz novol + test cl,0x8 ; is it fold label? + jz novol ; no mov eax,'Fvol' mov [edi+26],eax jmp nosize @@ -2354,7 +2448,7 @@ end_of_dir: mov [edi+26],eax - pusha ; size + pusha ; size mov eax,[esi+28] mov esi,edi add esi,37 @@ -2366,18 +2460,18 @@ end_of_dir: add dl,48 mov [esi],dl test eax,eax - jz zernum + jz zernum dec esi loop newnum zernum: popa nosize: - pusha ; date + pusha ; date mov [edi+17],dword '. .' movzx eax,word [esi+24] - shr eax,9 ; year + shr eax,9 ; year add eax,1980 mov ecx,4 newdel1: @@ -2391,7 +2485,7 @@ end_of_dir: jnz newdel1 movzx eax,word [esi+24] - shr eax,5 ; month + shr eax,5 ; month and eax,0x0f mov ecx,2 newdel2: @@ -2420,7 +2514,7 @@ end_of_dir: popa - pusha ; number + pusha ; number mov eax,edx sub eax,4096 neg eax @@ -2429,25 +2523,25 @@ end_of_dir: mov ebx,10 div ebx add dl,48 - mov [edi+43],dl ;0001 + mov [edi+43],dl ;0001 xor edx,edx div ebx add dl,48 - mov [edi+42],dl ;0010 + mov [edi+42],dl ;0010 xor edx,edx div ebx add al,48 add dl,48 - mov [edi+41],dl ;0100 + mov [edi+41],dl ;0100 mov [edi+40],byte 0 ;1000 popa - mov ecx,8 ; first 8 + mov ecx,8 ; first 8 cld rep movsb mov [edi],byte '.' inc edi - mov ecx,3 ; last 3 + mov ecx,3 ; last 3 cld rep movsb @@ -2464,25 +2558,25 @@ looo: ; Delete del, eoe, f32 and another head-names cmp [viewmode],3 ;0-3 no outdel - ja del_out + ja del_out cmp [edx+26],dword 'DEL ' - je nextfl + je nextfl del_out: cmp [edx+26],dword 'DEL ' jne no_del cmp [edx],dword 0 ;431 ;435 ;484 +10% speed - je nextfl + je nextfl no_del: cmp [edx+26],dword 'EOE ' - je nextfl - cmp [edx+26],dword 'F32 ' ;F32 not useles - je nextfl + je nextfl + cmp [edx+26],dword 'F32 ' ;F32 not useles + je nextfl cmp [edx],dword '. ' - je nextfl + je nextfl cmp [edx],dword '.. ' - je nextfl + je nextfl cmp [edx],dword 'FIRS' - je nextfl + je nextfl ; ---------_______-------_______ --------_________----------- ; SORT by name and del deletet files or f32 headers from list @@ -2498,14 +2592,14 @@ xxx: ftestname: cmp byte [fileinfo+11+26],'F' - je F + je F cmp byte [fileinfo+11+26],'D' - je D + je D jmp add_element D: cmp byte [convinfo+esi+26],'D' - je add_element + je add_element cmp byte [convinfo+esi+26],'F' - je skipfile + je skipfile jmp add_element F: cmp byte [convinfo+esi+26],'D' je writenow @@ -2516,8 +2610,8 @@ F: cmp byte [convinfo+esi+26],'D' add_element: mov al,[fileinfo+ebx+11] cmp al,[convinfo+esi+ebx] - je equal - jb writenow + je equal + jb writenow skipfile: add esi,62 mov ebx,[start] ;0 @@ -2526,11 +2620,11 @@ skipfile: equal: inc ebx cmp ebx,[x0] - je writefile + je writefile cmp ebx,[x1] - je x1p + je x1p cmp ebx,[x2] - je x2p + je x2p cmp ebx,[x3] jae x3p jmp add_element @@ -2607,30 +2701,57 @@ endgs: ; DATA AREA pmenu_draw dd 0 ;if poup menu is draw,update all window -flick dd 0 ;anti flick on ? -drawhf dd 0 ;draw file menu? -drawhv dd 0 ;draw view menu? -drawhi dd 0 ;draw info menu? +flick dd 0 ;anti flick on ? +drawhf dd 0 ;draw file menu? +drawhv dd 0 ;draw view menu? +drawhi dd 0 ;draw info menu? browser dd 0 ;0-dialog, 1-browser -cursor dd 0 ;cursor in prompt line -focus dd 0 ;prompt edit or window? +cursor dd 0 ;cursor in prompt line +focus dd 0 ;prompt edit or window? viewmode dd 0 ;folder sort & not del downstop dd 0 filecursor dd 0 -mousex dd 0 -mousey dd 0 +mousex dd 0 +mousey dd 0 blocksread dd 0 listsize dd 0 ;num of files in directory -temp dd 0 +temp dd 0 readblock dd 1 dlg_type db 0 ;S-save O-open - ;01234567890123456789012345678901234567890123456789012345678912 -hdimg db 'HD HARDDISK FOL ' - db 'RD RAMDISK FOL ' +hdimg1 db 'HD0 HARDDISK FOL ' +hdimg2 db 'HD1 HARDDISK FOL ' +hdimg3 db 'HD2 HARDDISK FOL ' +hdimg4 db 'HD3 HARDDISK FOL ' + + ;01234567890123456789012345678901234567890123456789012345678912 +hdimg db 'RD RAMDISK FOL ' + db 'FD FLOPPYDISK FOL ' + db ' ' + db ' ' + db ' ' + db ' ' ptimg db '1 FIRST PARTITION FOL ' db '2 SECOND PARTITION FOL ' + db '3 NEXT PARTITION FOL ' + db '4 NEXT PARTITION FOL ' + db '5 NEXT PARTITION FOL ' + db '6 NEXT PARTITION FOL ' + db '7 NEXT PARTITION FOL ' + db '8 NEXT PARTITION FOL ' + db '9 NEXT PARTITION FOL ' + db '10 NEXT PARTITION FOL ' + db '11 NEXT PARTITION FOL ' + db '12 NEXT PARTITION FOL ' + db '13 NEXT PARTITION FOL ' + db '14 NEXT PARTITION FOL ' + db '15 NEXT PARTITION FOL ' + db '16 NEXT PARTITION FOL ' + db '17 NEXT PARTITION FOL ' + db '18 NEXT PARTITION FOL ' + db '19 NEXT PARTITION FOL ' + db '20 NEXT PARTITION FOL ' modetext: ;0123456789012345 @@ -2643,29 +2764,31 @@ modetext: db 'DEL SORT SIZE 6' ;type sort db 'DEL SORT DATE 7' -dirlen dd 0x1 +dirlen dd 0x1 b_color dd 0x6677cc ; //// Willow -MRUfile: - dd 0x0 - dd 0x0 - dd 0x1 - dd path - dd tempzone - db '/RD/1/MRU.LST',0 +;MRUfile: +; dd 0x0 +; dd 0x0 +; dd 0x1 +; dd path +; dd tempzone +; db '/RD/1/MRU.LST',0 ; //// Willow ;Name of programs -editor db 'TINYPAD ' +editor db 'TINYPAD ' bmpview db 'MV ' jpgview db 'JPEGVIEW ' gifview db 'GIFVIEW ' ac97wav db 'AC97WAV ' copyrfile db 'COPYR ' +rtfread db 'RTFREAD ' ; //// Willow pngview db '@RCHER ' ; //// Willow +midamp db 'MIDAMP ' fileinfo_start: dd 16 @@ -2674,30 +2797,34 @@ dd 0 ;tempzone+1000; dd 0 dd tempzone ;0x10000 open_path: -times 256 db 0 ;run app path +times 256 db 0 ;run app path fileinfoblock: - dd 0x0 ; read - dd 0x0 ; first block - dd 0x1 ; number of blocks to read + dd 0x0 ; read + dd 0x0 ; first block + dd 0x1 ; number of blocks to read farea: - dd outinfo ; ret offset - dd tempzone ; work size of sytemram + dd outinfo ; ret offset + dd tempzone ; work size of sytemram path: -times 256 db 0 ;path +times 256 db 0 ;path + +table_area: +rb 10 + ;rb 256 but_file: file 'systr12.GIF' butimg: -rb 400*16*3+8 ;buttons (left pice of picture) +rb 400*16*3+8 ;buttons (left pice of picture) logoimg: -rb 70*16*3+8 ;logo (right pice of picture) +rb 70*16*3+8 ;logo (right pice of picture) logoinfimg: -rb 60*60*3+8 ;logoinfo (right pice of picture) +rb 60*60*3+8 ;logoinfo (right pice of picture) upsb: -rb 8*9*3+8 ;up scroll button +rb 8*9*3+8 ;up scroll button dnsb: -rb 8*9*3+8 ;down scroll button +rb 8*9*3+8 ;down scroll button ;ICONS RESERVE AREA hdico: @@ -2719,8 +2846,8 @@ rb 12*9*3+8 execico: rb 12*9*3+8 -tempimg: ;reserve ram for images -rb 400*100*3+8 ;for picture +tempimg: ;reserve ram for images +rb 400*100*3+8 ;for picture rb 8000 gif_hash: diff --git a/programs/fs/sysxtree/trunk/xtree.bmp b/programs/fs/sysxtree/trunk/xtree.bmp new file mode 100644 index 0000000000..11dfc0fddd Binary files /dev/null and b/programs/fs/sysxtree/trunk/xtree.bmp differ diff --git a/programs/fs/sysxtree/trunk/xtree.ico b/programs/fs/sysxtree/trunk/xtree.ico new file mode 100644 index 0000000000..a11b1d1542 Binary files /dev/null and b/programs/fs/sysxtree/trunk/xtree.ico differ diff --git a/programs/fs/sysxtree/trunk/xtreeinf.txt b/programs/fs/sysxtree/trunk/xtreeinf.txt new file mode 100644 index 0000000000..f2ced92717 --- /dev/null +++ b/programs/fs/sysxtree/trunk/xtreeinf.txt @@ -0,0 +1,87 @@ +SYSTEM X-TREE + +The new file browser with support sorting file by name, extension, size, date +Develop by Pavlushin Evgeni for Menuet OS e-mail: waptap@mail.ru + site (slow update) : www.deck4.narod.ru + +~~~Manuals~~~ + +Copy program COPYR to ramdisk !!! for work feuters - copy and paste file's + +~~~Keys~~~ +PageUp\PageDown , Up Arrow/Down Arrow -Navigation +Blackspace - goto to previous folder +Enter - enter to folder or run/view/edit file +F2 - change sort mode (name,extension,size,date,sohw/fade del files) +F3 - view file in notepad +F5 - copy file to clipboard +F6 - paste file from clipboard +F12 - update source + +SYSTEM X-TREE + +═ют√щ Їрщыют√щ сЁрєчхЁ яюфхЁЁцштр■∙шщ ёюЁЄшЁютъє Їюшыют яю шьхэш, +Ёрё°шЁхэш■, ЁрчьхЁє ш фрЄх. +╨рчЁрсюЄры ╧рты■°шэ ┼тухэшщ фы  Menuet OS e-mail: waptap@mail.ru + ёрщЄ (ьхфыхээю юсэюты хЄё ) : www.deck4.narod.ru + +~~~╚эёЄЁєъЎш ~~~ + +╤ъюяшЁєщЄх яЁюує COPYR эр ramdisk !!! фы  тючьюцэюёЄш ъюяшЁютрЄ№ ш тёЄрты Є№ Їршы√ + +~~~╩ыртш°ш~~~ +PageUp\PageDown , Up Arrow/Down Arrow - ═ртшурЎш  +Blackspace - ╧хЁхщЄш ъ яЁхфшфє∙хщ яряъх +Enter - ╟рщЄш т яряъє шыш чряєёЄшЄ№/яЁюёьюЄЁхЄ№/ЁхфръЄшЁютрЄ№ Їршы +F2 - ╤ьхэшЄ№ Ёхцшь ёюЁЄшЁютъш (╧ю шьхэш,Ёрё°шЁхэш■,ЁрчьхЁє,фрЄх,яюърч√трЄ№ єфры. Їршы√) +F3 - ╧ЁюёьюЄЁхЄ№ Їршы т ЄхъёЄютюь сыюъэюЄх +F5 - ъюяшЁютрЄ№ Їршы т clipboard +F6 - тёЄртшЄ№ Їршы шч clipboard'р +F12 - ╬сэютшЄ№ ёюфхЁцшьюх юъэр + +Translate of russian documentation for xtree +Sorry i'm write in English very poor. + +The new concept of dialogues, now dialogues +is made do not use file system for an exchange +with the client, and use IPC - Inter process comunication +(Support since 52 Versions). +52 Version support IPC of dialogues +53 Version is added protection dialogs from +external processes. +Test with TESTOPDG 54 Version IPC protection it is +improved Test with TESTOPD2 That testing dialogues +copy SYSTRE54 on ramdisk under name SYSXTREE and start TESTOPD2 + +In window TESTOPD2 the following information is displayed: +In heading at the left??? +Below parameters transferred SYSTEM XTREE, +namely PID TESTOPD2, the blank and +type of dialogue of one byte (O-Open, S-Save) +is even lower PID SYSTEM XTREE and current num of the +started processes After file will be open in dialogue, +it will be displayed in window TESTOPD2 below heading, +and dialogue will be closed. + +Protection TESTOPD2: +1) If at start SYSTEM XTREE from XTREE don't it is +received it PID during 2 sec, 54 version XTREE or +not XTREE at all means on ramdisk not, TESTOPD2 +comes to the end. +2) If worked SYSTEM XTREE it was closed not +having sent path to file (itself or from CPU programs) +TESTOPD2 comes to the end since parameters from XTREE +have not been received and since XTREE is closed +that already and don't are received. + +;78Ver input in dir whith extension (for example TEST.DIR\XT\) bug deleted +;64Ver Run file from HD bug deleted. +;65Ver The bad scroll realization +;66Ver The good scroll realization, url line anti-flick +;67Ver Url line monolith procedure +;68Ver Mini icon on left of file name +;69Ver Getimg proc size minus 900 bytes +;70Ver Del data area ramsize minus 140000 bytes +;72Ver Quick sort, ramsize minus 200000 bytes +;73Ver Url flick and out bugs delete +;sort type in headmenu bug del \ No newline at end of file diff --git a/programs/fs/sysxtree/trunk/xtreinfo.txt b/programs/fs/sysxtree/trunk/xtreinfo.txt new file mode 100644 index 0000000000..b1e2cdfd3a --- /dev/null +++ b/programs/fs/sysxtree/trunk/xtreinfo.txt @@ -0,0 +1,80 @@ +╤фхырэр эютр  ъюэЎхяЎш  фшрыюуют, ЄхяхЁ№ фшрыюуш эх шёяюы№чє■Є +Їрщыютє■ ёшёЄхьє фы  юсьхэр ё ъышхэЄюь, р шёяюы№чє■Є IPC - +Inter process comunication (╧юффхЁцър эрўшэр  ё 52 ┬хЁёшш). + +52 ┬хЁёш  яюффхЁцър IPC фшрыюуют +53 ┬хЁёш  фюсртыхэр чр∙шЄ√ фшюыюуют юЄ тэх°эшї яЁюЎхёёют. +╥хёЄшЁєщЄх ё TESTOPDG + +54 ┬хЁёш  IPC чр∙шЄр єыєў°хэр +╥хёЄшЁєщЄх ё TESTOPD2 + +╫Єю-с√ яЁюЄхёЄшЄ№ фшрыюуш ёъюяшЁєщЄх SYSTRE54 эр Ёрьфшёъ яюф +шьхэхь SYSXTREE ш чряєёЄшЄх TESTOPD2 + +┬ юъэх TESTOPD2 юЄюсЁрцрхЄё  ёыхфє■∙р  шэЇюЁьрЎш : +┬ чруюыютъх ёыхтр ??? +═шцх ярЁрьхЄЁ√ яхЁхфрээ√х SYSTEM XTREE , р шьхээю PID TESTOPD2, +яЁюсхы ш Єшя фшрыюур юфшэ срщЄ (O-Open,S-Save) +┼∙х эшцх PID SYSTEM XTREE ш Єхъє∙хх ъюы-тю чряє∙хээ√ї яЁюЎхёёют + +╧юёых Єюую ъръ Їршы сєфхЄ юЄъЁ√Є т фшрыюух, юэ юЄюсЁрчшЄё  т +юъэх TESTOPD2 эшцх чруюыютър, р фшрыюу чръЁюхЄё . + +╟р∙шЄр TESTOPD2: +1) ┼ёыш яЁш чряєёъх SYSTEM XTREE юЄ XTREE эхс√ы яюыєўхэ хую PID +т Єхўхэшш 2 ёхъ, чэрўшЄ эр Ёрьфшёъх эх 54 тхЁёш  XTREE шыш эх XTREE +тютёх, TESTOPD2 чртхЁ°рхЄё . +2) ┼ёыш чряє∙хэ√щ SYSTEM XTREE чръЁ√ыё  эх юЄюёырт яєЄ№Їршыр(ёрь шыш +юЄ CPU яЁюуш),Єю TESTOPD2 чртхЁ°рхЄё  Є.ъ. ярЁрьхЄЁ√ юЄ XTREE эх +с√ыш яюыєўхэ√ р Є.ъ. XTREE чръЁ√Є Єю єцх ш эхсєфєЄ яюыєўхэ√. + +68 ┬хЁёш  + +╟р фтр фэ    фюсшыё  яЁшышўэ√ї єёяхїют яю ьюфхЁэшчрЎшш X-TREE +╚ Єръ °ю эютюую... + +60Ver ╥хяхЁ№ FileList ш т фшрыюух ш т сЁрєчхЁх т√тюфшЄё  юфэющ +яЁюЎхфєЁющ эєцэю Єюы№ъю єърчрЄ№ ъююЁфшэрЄ√ ш ЁрчьхЁ ышёЄр юЄёыхцштрэшх +ш яЁюЁшёютър ёъЁюыысрЁр т√яюыэ хЄё  яЁюЎхфєЁющ. + +61Ver ═рёЄЁюшы ъююЁфшэрЄ√ ╘ршы╦шёЄр + +62Ver ─рсртшы ярэхы№ъє ёыхтр т юъэх (ъръ т ┬шэфрї) фы  ъЁрёюЄ√ + +63Ver ╚чьхэшы ёъшэ ш фюсртшы ърЁЄшэъш эр ъэюяюўъш ёъЁюыысрЁр + +64Ver ╙фрышы ёЄрЁ√щ фюсЁ√щ сру - ю°шсър чряєёър яЁюу ё HD ъюЄюЁр  +т√эюёшЄ ╠хюё эрЇшу эх шёъы■ўр■, ўЄю ¤ЄюЄ сру єфрыхэ эх фю ъюэЎр + +65Ver ╚чьхэшы юсЁрсюЄъє ш яЁюЁшёютъє ёъЁюыыр + +66Ver ─ютхы фю ъюэЎр яЁюЁшёютъє ёъЁюыыр, фюсртшы яЁюЄштюьшур■∙шщ +ъюф фы  URL ёЄЁюъш + +67Ver ╥хяхЁ№ URL ёЄЁюър ш т фшрыюух ш т сЁрєчхЁх т√тюфшЄё  юфэющ +яЁюЎхфєЁющ эєцэю Єюы№ъю єърчрЄ№ ъююЁфшэрЄ√ ш ЁрчьхЁ ёЄЁюъш. + +68Ver ─юсртшы ьшэш шъюэъш ёыхтр юЄ Їршы эхщьр (юўхэ№ яЁшъюы№эю ёьюЄЁшЄё ). + + +73 ┬хЁёш  + +69Ver Getimg т√яюыэшы т тшфх яЁюЎхёёр, р эх ьръЁюёр ъюф єьхэ№°шыё  +эр 900 срщЄ + +70Ver data_area ЄхяхЁ№ эх шёяюфы№чєхЄё , р чэрўшЄ ярь Єш ЄЁхсєхЄё  +ЄхяхЁ№ эр 140000 срщЄ ьхэ№°х! + +72Ver ┴юыхх с√ёЄЁр  ёюЁЄшЁютър , fileinfo ЄЁхсєЄ Єюы№ъю 200 срщЄ, +р чэрўшЄ ярь Єш ЄхяЁ№ ЄЁхсєхЄё  эр 200000 срщЄ ьхэ№°х! + +73Ver ╠шурэшх Url ёЄЁюъш сру шёяЁртыхэ. + +╚Єюую ъюф єьхэ№°хэ уфх-Єю эр 900 срщЄ. ┼ёыш Ёрэ№°х ЄЁхсютрыюё№ ярь Єш + 1 ╠┴, Єю ЄхяхЁ№ тёхую 600╩с, р ¤Єю яюўЄш т фтр Ёрчр ьхэ№°х. + + +80Ver ─шрыюуш юя Є№ ЁрсюЄр■Є, єфрыхэ сру ЁхфръЄшЁютрэхш  ёЄЁюъш URL + +81Ver Save фшрыюу ЁрсюЄрхЄ сюыхх ъюЁЁхъЄэю \ No newline at end of file diff --git a/programs/games/c4/trunk/c4.asm b/programs/games/c4/trunk/c4.asm index 441e3817c7..290a8ec984 100644 --- a/programs/games/c4/trunk/c4.asm +++ b/programs/games/c4/trunk/c4.asm @@ -69,7 +69,7 @@ LABEL_PL2TYPE_Y equ LABEL_PL2_Y LABEL_STATUS_X equ 14 LABEL_STATUS_Y equ 279 LABEL_STATUS_WIDTH equ 220 -LABEL_STATUS_HEIGHT equ 8 +LABEL_STATUS_HEIGHT equ 12 diff --git a/programs/games/tetris/trunk/block.inc b/programs/games/tetris/trunk/block.inc deleted file mode 100644 index ec8491c295..0000000000 --- a/programs/games/tetris/trunk/block.inc +++ /dev/null @@ -1,376 +0,0 @@ -;-------------------------------------------------------------- -;DRAW BLOCK -; -;-------------------------------------------------------------- -draw_block: mov eax,13 - mov edx,[color_table+edx*4] - - mov ebx,[current_block_x] - mov ecx,[current_block_y] - mov edi,[current_block_pointer] - - sub ebx,BORDER_LEFT - imul ebx,ADOBE_SIZE - add ebx,X_LOCATION - shl ebx,16 - mov bx,ADOBE_SIZE - - sub ecx,BORDER_TOP - imul ecx,ADOBE_SIZE - add ecx,Y_LOCATION - shl ecx,16 - mov cx,ADOBE_SIZE - - mov dword [TMP_1],4 -adr_122: mov dword [TMP_0],4 -adr_121: cmp byte [edi],0 - je adr_120 - - int 040h - - call draw_frames - -adr_120: inc edi - add ebx,ADOBE_SIZE*65536 - dec dword [TMP_0] - jnz adr_121 - sub ebx,4*ADOBE_SIZE*65536 - add ecx,ADOBE_SIZE*65536 - dec dword [TMP_1] - jnz adr_122 - - ret - -draw_frames: - cmp edx,0 - jne df1 - ret - df1: - pusha - mov bx,1 - add edx,0x282828 - mov eax,13 - int 0x40 - popa - - pusha - mov cx,1 - add edx,0x282828 - mov eax,13 - int 0x40 - popa - - pusha - push ebx - sub bx,1 - add [esp+2],bx - pop ebx - mov bx,1 - shr edx,1 - and edx,0x7f7f7f - mov eax,13 - int 0x40 - popa - - pusha - push ecx - sub cx,1 - add [esp+2],cx - pop ecx - mov cx,1 - shr edx,1 - and edx,0x7f7f7f - mov eax,13 - int 0x40 - popa - - ret - -;------------------------------------------------------------- -; FIX BLOCK -;------------------------------------------------------------- -fix_block: mov ebx,[current_block_pointer] - - mov edx,[current_block_y] - imul edx,LEN_X - add edx,[current_block_x] ;find the offset in tetris_t - - add edx,table_tetris - - mov ecx,4 - mov al,[current_block_color] - -adr_21: cmp byte [ebx],1 - jne adr_22 - mov [edx],al -adr_22: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_23 - mov [edx],al -adr_23: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_24 - mov [edx],al -adr_24: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_25 - mov [edx],al -adr_25: inc ebx - add edx,LEN_X-3 - - loop adr_21 - ret - -;------------------------------------------------------------- -;NEW BLOCK -;------------------------------------------------------------- -new_block: mov dword [current_block_y],1 - mov dword [current_block_x],7 - - mov eax,dword [next_block_pointer] - mov dword [current_block_pointer],eax - - mov eax,dword [next_block_color] - mov dword [current_block_color],eax - - call random - and al,7 - setz ah - add al,ah - mov [next_block_color],al - - call random - ;and eax,15 - ; ---- Ivan ---- - and eax,0xff - @@: - cmp eax,_MAXBLOCKS_ - jl @f - add eax,-(_MAXBLOCKS_) - jmp @b - @@: - ; ---- Ivan ---- - mov edx,[block_table+eax*4] - mov [next_block_pointer],edx - - mov dword[delay],5 - sub dword[delay],speed - - ret - - -;------------------------------------------------------------- -;DRAW TITLE BLOCK -;------------------------------------------------------------- -draw_title_block: -; movzx edx,byte [current_block_color] - mov eax,13 - -; mov edx,[color_table+edx*4] - -; mov ebx,[current_block_x] -; mov ecx,[current_block_y] -; mov edi,[current_block_pointer] - - sub ebx,BORDER_LEFT - imul ebx,ADOBE_SIZE - add ebx,X_LOCATION - shl ebx,16 - mov bx,ADOBE_SIZE - - sub ecx,BORDER_TOP - imul ecx,ADOBE_SIZE - add ecx,Y_LOCATION - shl ecx,16 - mov cx,ADOBE_SIZE - - mov dword [TMP_1],5 - call adr_122 - -ret - -;------------------------------------------------------------- -;FIRST BLOCK -;------------------------------------------------------------- -first_block: call random - and al,7 - setz ah - add al,ah - mov [next_block_color],al - - call random - ;and eax,15 - ; ---- Ivan ---- - and eax,0xff - @@: - cmp eax,_MAXBLOCKS_ - jl @f - add eax,-(_MAXBLOCKS_) - jmp @b - @@: - ; ---- Ivan ---- - mov edx,[block_table+eax*4] - mov [next_block_pointer],edx - -; call draw_next_block - -; mov byte [delay],5 ;19 ;!!! 15 - ret -ret - -;------------------------------------------------------------- -;DRAW NEXT BLOCK -;------------------------------------------------------------- - -draw_next_block: - movzx edx,byte [next_block_color] - mov eax,13 - mov edx,[color_table+edx*4] - - mov ebx,LEN_X+1 - mov ecx,5 - mov edi,[next_block_pointer] - - sub ebx,BORDER_LEFT - imul ebx,ADOBE_SIZE - add ebx,X_LOCATION - shl ebx,16 - mov bx,ADOBE_SIZE - - sub ecx,BORDER_TOP - imul ecx,ADOBE_SIZE - add ecx,Y_LOCATION - shl ecx,16 - mov cx,ADOBE_SIZE - - mov dword [TMP_1],4 - jmp adr_122 - -ret - -;------------------------------------------------------------- -; ROTATE BLOCK -;------------------------------------------------------------- - -rotate_block: - mov edx,[current_block_pointer] - mov edx,[edx+16] - mov esi,[current_block_pointer] - mov [current_block_pointer],edx - call check_crash - call attesa - mov [current_block_pointer],esi - -ret - - -;------------------------------------------------------------- -; CHECK CRASH -; output Z flag => OK -; NZ flag => NO -;------------------------------------------------------------- - -check_crash: mov ebx,[current_block_pointer] - - mov edx,[current_block_y] - imul edx,LEN_X - add edx,[current_block_x] ;find the offset in tetris_t - - add edx,table_tetris - - mov ecx,4 - xor ax,ax - -adr_1: cmp byte [ebx],1 - jne adr_2 - add al,[edx] - adc ah,0 -adr_2: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_3 - add al,[edx] - adc ah,0 -adr_3: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_4 - add al,[edx] - adc ah,0 -adr_4: inc ebx - inc edx - - cmp byte [ebx],1 - jne adr_5 - add al,[edx] - adc ah,0 -adr_5: inc ebx - add edx,LEN_X-3 - - loop adr_1 - or ax,ax - ret - -;-------------------------------------------------------------- -;CHECK LINE -;-------------------------------------------------------------- -;edx = pointer -;ebx = contatore -check_full_line: - std - mov al,0 - mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1 - mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X - -adr_5000: mov edi,edx - mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT - repne scasb - jz no_full_line - - lea esi,[edx-LEN_X] - mov edi,edx - mov ecx,ebx - rep movsb - sub edi,BORDER_RIGHT - mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT - rep stosb - - add dword [score],100 - add dword [lines],1 - -; mov esi,dword[score] -; -; -; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; mov esi,dword [speed] -; imul esi,linestonewlevel -; add esi,linestonewlevel -; cmp dword [lines],esi -; jne adr_5000 1 line : 100 -; cmp dword[speed],4 2 lines: 300 -; je adr_51 3 lines: 700 -; inc dword[speed] 4 lines:1500 -; jmp adr_5000 -; adr_51: -; mov dword[speed],0 -; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - - jmp adr_5000 - -no_full_line: sub edx,LEN_X - sub ebx,LEN_X - jnz adr_5000 - - ret \ No newline at end of file diff --git a/programs/games/tetris/trunk/blocks.inc b/programs/games/tetris/trunk/blocks.inc deleted file mode 100644 index db3d86b63f..0000000000 --- a/programs/games/tetris/trunk/blocks.inc +++ /dev/null @@ -1,235 +0,0 @@ -;+---------------------------------+ -;| DEFINITION BLOCKS | -;+---------------------------------+ - -t_block_0: -db 0,0,0,0 -db 1,1,1,0 -db 0,1,0,0 -db 0,0,0,0 -dd t_block_3 - -t_block_1: -db 0,1,0,0 -db 1,1,0,0 -db 0,1,0,0 -db 0,0,0,0 -dd t_block_0 - -t_block_2: -db 0,1,0,0 -db 1,1,1,0 -db 0,0,0,0 -db 0,0,0,0 -dd t_block_1 - -t_block_3: -db 0,1,0,0 -db 0,1,1,0 -db 0,1,0,0 -db 0,0,0,0 -dd t_block_2 - -;----------------------------------- - -i_block_0: -db 0,1,0,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,1,0,0 -dd i_block_1 - -i_block_1: -db 0,0,0,0 -db 1,1,1,1 -db 0,0,0,0 -db 0,0,0,0 -dd i_block_0 -;----------------------------------- - -q_block_0: -db 0,1,1,0 -db 0,1,1,0 -db 0,0,0,0 -db 0,0,0,0 -dd q_block_0 - -;----------------------------------- - -s_block_0: -db 0,0,0,0 -db 0,1,1,0 -db 1,1,0,0 -db 0,0,0,0 -dd s_block_1 - -s_block_1: -db 1,0,0,0 -db 1,1,0,0 -db 0,1,0,0 -db 0,0,0,0 -dd s_block_0 - -;----------------------------------- - -l_block_0: -db 0,0,0,0 -db 1,1,1,0 -db 1,0,0,0 -db 0,0,0,0 -dd l_block_3 - -l_block_1: -db 1,1,0,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,0,0,0 -dd l_block_0 - -l_block_2: -db 0,0,1,0 -db 1,1,1,0 -db 0,0,0,0 -db 0,0,0,0 -dd l_block_1 - -l_block_3: -db 0,1,0,0 -db 0,1,0,0 -db 0,1,1,0 -db 0,0,0,0 -dd l_block_2 - -;----------------------------------- - -g_block_0: - -db 0,1,0,0 -db 0,1,0,0 -db 1,1,0,0 -db 0,0,0,0 -dd g_block_1 - -g_block_1: -db 0,0,0,0 -db 1,1,1,0 -db 0,0,1,0 -db 0,0,0,0 -dd g_block_2 - -g_block_2: -db 0,1,1,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,0,0,0 -dd g_block_3 - -g_block_3: -db 1,0,0,0 -db 1,1,1,0 -db 0,0,0,0 -db 0,0,0,0 -dd g_block_0 - -;----------------------------------- - -k_block_0: -db 0,0,0,0 -db 1,1,0,0 -db 0,1,1,0 -db 0,0,0,0 -dd k_block_1 - -k_block_1: -db 0,1,0,0 -db 1,1,0,0 -db 1,0,0,0 -db 0,0,0,0 -dd k_block_0 - -;----------------------------------- -;logo blocks -;----------------------------------- - -tetris_t: -db 1,1,1,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,1,0,0 - -tetris_e: -db 1,1,1,0 -db 1,0,0,0 -db 1,1,0,0 -db 1,0,0,0 -db 1,1,1,0 - -tetris_r: -db 1,1,0,0 -db 1,0,1,0 -db 1,1,0,0 -db 1,0,1,0 -db 1,0,1,0 - -tetris_i: -db 0,1,0,0 -db 0,0,0,0 -db 0,1,0,0 -db 0,1,0,0 -db 0,1,0,0 - -tetris_s: -db 0,1,1,1 -db 1,0,0,0 -db 0,1,1,0 -db 0,0,0,1 -db 1,1,1,0 - -tetris_II: -db 1,1,1,1 -db 0,1,1,0 -db 0,1,1,0 -db 0,1,1,0 -db 1,1,1,1 - -;----------------------------------- -block_table: - dd t_block_0 ; t - dd t_block_1 - dd t_block_2 - dd t_block_3 - dd i_block_0 ; i - dd i_block_1 - dd i_block_0 - dd i_block_1 - dd q_block_0 ; q - dd q_block_0 - dd q_block_0 - dd q_block_0 - dd s_block_0 ; s - dd s_block_1 - dd s_block_0 - dd s_block_1 - dd l_block_0 ; l - dd l_block_1 - dd l_block_2 - dd l_block_3 - dd g_block_0 ; g - dd g_block_1 - dd g_block_2 - dd g_block_3 - dd k_block_0 ; k - dd k_block_1 - dd k_block_0 - dd k_block_1 - -color_table: - dd 00000000h ;black 0 - dd 00cccccch ;white 1 - dd 00cc0000h ;red 2 - dd 0000cc00h ;green 3 - dd 000000cch ;blue 4 - dd 00cccc00h ;yellow 5 - dd 0000cccch ;cyan 6 - dd 00cc00cch ;pink 7 \ No newline at end of file diff --git a/programs/games/tetris/trunk/key.inc b/programs/games/tetris/trunk/key.inc deleted file mode 100644 index 4e2e4f282a..0000000000 --- a/programs/games/tetris/trunk/key.inc +++ /dev/null @@ -1,161 +0,0 @@ -UP_KEY equ 178 ; the ascii keycodes of some keys -DOWN_KEY equ 177 -LEFT_KEY equ 176 -RIGHT_KEY equ 179 -ENTER_KEY equ 13 -ESCAPE_KEY equ 27 - -key: - mov eax,2 ; Read key ascii and store it into ah - int 0x40 - - cmp ah,LEFT_KEY ; Check if left key is pressed - jne no_left - - cmp byte[status],'1' - jne no_left - go_left: - dec dword [current_block_x] - call check_crash - jz no_left - inc dword [current_block_x] - -no_left: - cmp ah,RIGHT_KEY ; Check if right key is pressed - jne no_right - - cmp byte[status],'1' - jne no_right - go_right: - inc dword [current_block_x] - call check_crash - jz no_right - dec dword [current_block_x] - -no_right: - cmp ah,UP_KEY ; Compare pressed key with up key - jne no_up ; Jump to nu_up if up key isnt pressed - - cmp byte[status],'0' ; Check if menu is running - jne no_menu2 ; Jump to no_up ifgame isnt running - - cmp byte[menu],'0' ; Compare menu state with 0 - jne no_menu0 ; Jump to no_menu0 if menu state isnt zero - - mov byte[menu],'3' ; Change menu state to 2 - call draw_window ; Redraw the window - jmp no_menu2 ; Jump to no_menu2 - - no_menu0: - dec byte[menu] ; menu state = menu state - 1 - call draw_window ; Redraw the window - - no_menu2: - cmp byte[status],'1' ; Compare game state with 1 - jne no_up ; Jump to no_up if game state isnt 1 (if game isnt running) - - call rotate_block - -no_up: - cmp ah,DOWN_KEY ; Check if down key is pressed - jne no_down - - cmp byte[status],'0' - jne no_menu3 - - cmp byte[menu],'3' - jne no_menu1 - - mov byte[menu],'0' - call draw_window - jmp no_menu3 - - no_menu1: - inc byte[menu] - call draw_window - - no_menu3: - cmp byte[status],'1' - jne no_down - - inc dword [current_block_y] - call check_crash - jne block_crash - jmp still - - -no_down: - cmp ah,'n' ; Check if n key is pressed - jne no_n - jmp new_game - -no_n: - cmp ah,'p' ; Check if p key is pressed - jne no_p - cmp byte[status],'2' - je unpause - cmp byte[status],'1' ; add this two line or p will work - jne no_p ; when your still in the menu - mov byte[status],'2' - call draw_window - jmp attesa - unpause: - mov byte[status],'1' - call draw_window - jmp still - -no_p: - cmp byte[status],'0' - jne no_menu - -no_menu: - cmp byte[status],'1' - jne no_game - -no_game: - cmp byte[status],'2' - jne no_pause1 - -no_pause1: - cmp ah,ENTER_KEY ; Check if enter key is pressed - jne no_enter - cmp byte[status],'0' - jne no_enter - call exemenu - -no_enter: - cmp ah,ESCAPE_KEY ; Check if escape key is pressed - jne no_escape - - - cmp byte[status],'0' - jne no_instr1 - mov eax,-1 - int 0x40 - - no_instr1: - cmp byte[status],'1' - jne no_menu4 - mov byte[status],'0' - call draw_window - - no_menu4: - cmp byte[status],'3' - jne no_menu5 - mov byte[status],'0' - call draw_window - - no_menu5: - cmp byte[status],'4' - jne no_escape - mov byte[status],'0' - call draw_window - -no_escape: - - cmp byte[status],'1' - jne still - jmp scendi - -ret - diff --git a/programs/games/tetris/trunk/menu.inc b/programs/games/tetris/trunk/menu.inc deleted file mode 100644 index 6fc48dba08..0000000000 --- a/programs/games/tetris/trunk/menu.inc +++ /dev/null @@ -1,137 +0,0 @@ -draw_menu: - - cmp byte[menu],'0' - jne menu1 - - mov eax,4 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4) - mov ecx,0x10ffff00 - mov edx,startgame - mov esi,instr-startgame - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5) - mov ecx,0x10ff0000 - mov edx,instr - mov esi,hist-instr - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6) - mov ecx,0x10ff0000 - mov edx,hist - mov esi,quit-hist - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7) - mov ecx,0x10ff0000 - mov edx,quit - mov esi,paused-quit - int 0x40 - -menu1: - cmp byte[menu],'1' - jne menu2 - - - mov eax,4 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4) - mov ecx,0x10ff0000 - mov edx,startgame - mov esi,instr-startgame - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5) - mov ecx,0x10ffff00 - mov edx,instr - mov esi,hist-instr - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6) - mov ecx,0x10ff0000 - mov edx,hist - mov esi,quit-hist - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7) - mov ecx,0x10ff0000 - mov edx,quit - mov esi,paused-quit - int 0x40 - -menu2: - cmp byte[menu],'2' - jne menu3 - - mov eax,4 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4) - mov ecx,0x10ff0000 - mov edx,startgame - mov esi,instr-startgame - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5) - mov ecx,0x10ff0000 - mov edx,instr - mov esi,hist-instr - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6) - mov ecx,0x10ffff00 - mov edx,hist - mov esi,quit-hist - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7) - mov ecx,0x10ff0000 - mov edx,quit - mov esi,paused-quit - int 0x40 - -menu3: - cmp byte[menu],'3' - jne menu4 - - mov eax,4 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4) - mov ecx,0x10ff0000 - mov edx,startgame - mov esi,instr-startgame - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5) - mov ecx,0x10ff0000 - mov edx,instr - mov esi,hist-instr - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6) - mov ecx,0x10ff0000 - mov edx,hist - mov esi,quit-hist - int 0x40 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7) - mov ecx,0x10ffff00 - mov edx,quit - mov esi,paused-quit - int 0x40 - -menu4: - - -ret - -exemenu: - cmp byte[menu],'0' ;start - jne exemenu1 - call new_game - -exemenu1: - cmp byte[menu],'1' ;instr - jne exemenu2 - mov byte[status],'4' - call draw_window - -exemenu2: - cmp byte[menu],'2' ;history - jne exemenu3 - mov byte[status],'3' - call draw_window - -exemenu3: - cmp byte[menu],'3' ;exit - jne exemenu4 - mov eax,-1 - int 0x40 - -exemenu4: - -ret diff --git a/programs/games/tetris/trunk/mouse.inc b/programs/games/tetris/trunk/mouse.inc deleted file mode 100644 index 356b3ec0ae..0000000000 --- a/programs/games/tetris/trunk/mouse.inc +++ /dev/null @@ -1,87 +0,0 @@ -mouse: - - - mov eax,37 ; get mouse position ; EXPERIMENTAL !!! - mov ebx,1 ; window relative ; - int 0x40 ; ; - shr eax,16 ; we only need to know the x position ; - sub eax,X_LOCATION ; - ; - cmp eax,ADOBE_SIZE*(LEN_X-2) ; check to see if mouse is in field ; - jg no_mouse ; ; - cmp eax,0 ; ; - jl no_mouse ; ; - ; - mov ebx,0 ; - ; - mouseloop: ; - cmp eax,ADOBE_SIZE ; - jl yes_mouse ; - sub eax,ADOBE_SIZE ; - inc ebx ; - jmp mouseloop ; - ; - yes_mouse: ; - cmp ebx,[current_block_x] - jg go_right - jl go_left -; mov dword[current_block_x],ebx ; - - mov eax,37 ; get mouse position ; - mov ebx,2 ; buttons pressed (1=left, 2=right, 3=both) ; - int 0x40 ; - ; - cmp eax,0 ; - jne yes_mouse_button ; - mov byte[lastmousebutton],0 ; - jmp no_mouse ; - yes_mouse_button: ; - ; - cmp eax,2 ; - jne no_left_mouse ; - cmp byte[status],'1' ; - jne no_left_mouse ; - mov byte[lastmousebutton],2 ; - inc dword [current_block_y] ; - call check_crash ; - jne block_crash ; - jmp no_mouse ; - ; - no_left_mouse: ; - ; - ; - cmp eax,1 ; - jne no_right_mouse ; - cmp byte[status],'1' ; - jne no_right_mouse ; - cmp byte[lastmousebutton],1 ; - mov byte[lastmousebutton],1 ; - je no_right_mouse ; - call rotate_block ; - call check_crash ; - jne block_crash ; - call draw_block ; - jmp scendi ; - ; - no_right_mouse: ; - ; - ; - cmp eax,3 ; - jne no_mouse ; - cmp byte[lastmousebutton],3 ; - mov byte[lastmousebutton],3 ; - je no_mouse ; - cmp byte[status],'2' ; - je unpause ; - mov byte[status],'2' ; - call draw_window ; - jmp attesa ; -; unpause: ; -; mov byte[status],'1' ; -; call draw_window ; -; jmp still ; - ; - ; ; - no_mouse: ; - -ret \ No newline at end of file diff --git a/programs/games/tetris/trunk/random.inc b/programs/games/tetris/trunk/random.inc deleted file mode 100644 index 4aedfed426..0000000000 --- a/programs/games/tetris/trunk/random.inc +++ /dev/null @@ -1,18 +0,0 @@ -;-------------------------------------------------------------- - -random: mov eax,[generator] - add eax,-43ab45b5h - ror eax,1 - xor eax,32c4324fh - ror eax,1 - mov [generator],eax - ; --- IVAN --- - push ebx - mov eax,22 - mov ebx,9 - int 0x40 - pop ebx - xor eax,0xdeadbeef - add eax,[generator] - ; --- IVAN --- - ret \ No newline at end of file diff --git a/programs/games/tetris/trunk/score.inc b/programs/games/tetris/trunk/score.inc deleted file mode 100644 index 31c89d68b4..0000000000 --- a/programs/games/tetris/trunk/score.inc +++ /dev/null @@ -1,100 +0,0 @@ -write_score: - - mov eax,13 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-3)*65536+95 ;clear box to write new score - mov ecx,20*65536+((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-20) - mov edx,0x00000000 - int 40h - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+25 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,scoretext - mov esi,linestext-scoretext - mov eax,4 - int 0x40 - - mov eax,[score] - call number_to_str - - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+25 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,number_str - mov esi,[size_of_number_str] - mov eax,4 - int 0x40 - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+35 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,linestext - mov esi,speedtext-linestext - mov eax,4 - int 0x40 - - mov eax,[lines] - call number_to_str - - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+35 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,number_str - mov esi,[size_of_number_str] - mov eax,4 - int 0x40 - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+45 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,speedtext - mov esi,leveltext-speedtext - mov eax,4 - int 0x40 - - mov eax,[speed] - call number_to_str - - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+45 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,number_str - mov esi,[size_of_number_str] - mov eax,4 - int 0x40 - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+55 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,leveltext - mov esi,startgame-leveltext - mov eax,4 - int 0x40 - - mov eax,[level] - call number_to_str - - - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+55 ; draw info text with function 4 - mov ecx,0xffff00 ; color - mov edx,number_str - mov esi,[size_of_number_str] - mov eax,4 - int 0x40 - - call draw_next_block - -ret - - -number_to_str: - - mov edi,end_number_str-1 - mov ecx,9;size_of_number_str - mov ebx,10 - cld - new_digit: - xor edx,edx - div ebx - add dl,'0' - mov [edi],dl - dec edi - loop new_digit - -ret \ No newline at end of file diff --git a/programs/games/tetris/trunk/table.inc b/programs/games/tetris/trunk/table.inc deleted file mode 100644 index 191d4f2267..0000000000 --- a/programs/games/tetris/trunk/table.inc +++ /dev/null @@ -1,56 +0,0 @@ -;-------------------------------------------------------------- -; DRAW_TABLE -;-------------------------------------------------------------- -draw_table: mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT - - mov ebx,X_LOCATION*65536+ADOBE_SIZE - mov ecx,Y_LOCATION*65536+ADOBE_SIZE - mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM -y_draw: push edi - - mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT -x_draw: push edi - mov ax,13 - movzx edx,byte [esi] - mov edx,[color_table+edx*4] - int 0x40 - call draw_frames - inc esi - add ebx,65536*ADOBE_SIZE - pop edi - dec edi - jnz x_draw - - add esi,BORDER_LEFT+BORDER_RIGHT - mov ebx,X_LOCATION*65536+ADOBE_SIZE - add ecx,65536*ADOBE_SIZE - pop edi - dec edi - jnz y_draw - - ret - -;-------------------------------------------------------------- - -clear_table_tetris: - cld - mov al,1 - mov edi,table_tetris - mov ecx,LEN_X*BORDER_TOP - rep stosb - - mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM -adr300: mov cl,BORDER_LEFT - rep stosb - dec ax ;AL=0 - mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT - rep stosb - inc ax ;AL=1 - mov cl,BORDER_RIGHT - rep stosb - dec dx - jne adr300 - - mov ecx,LEN_X*BORDER_BOTTOM - rep stosb - ret diff --git a/programs/games/tetris/trunk/tetris.asm b/programs/games/tetris/trunk/tetris.asm index 16b8cbca02..a2698e2d6f 100644 --- a/programs/games/tetris/trunk/tetris.asm +++ b/programs/games/tetris/trunk/tetris.asm @@ -16,238 +16,870 @@ ; ; ; Changelog: -; -; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa -; 31.10.2001 - rdtsc replaced - quickcode +; 09.11.2005 - fix for work under MeosDebug & better random - Andrey Halyavin +; 23.09.2005 - fixed bug, when 011111111111111-like sequence interpreted +; as _11111111111111 in check_full_line - Sergey Kuzmin aka Wildwest +; 18.09.2005 - added 'Pause' button and made appropriate code and interface redesign +; BTW, you can MOVE and ROTATE block during Pause ;) - Sergey Kuzmin aka Wildwest ; 03.11.2003 - added new blocks & random - Ivan Poddubny +; 31.10.2001 - rdtsc replaced - quickcode +; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa +; ; -LEN_X equ 14 -LEN_Y equ 24 -BORDER_LEFT equ 2 -BORDER_RIGHT equ 2 +LEN_X equ 19 ;width of table +LEN_Y equ 29 ; height of table +BORDER_LEFT equ 1 +BORDER_RIGHT equ 1 BORDER_TOP equ 1 BORDER_BOTTOM equ 1 ADOBE_SIZE equ 12 -X_LOCATION equ 6 -Y_LOCATION equ 21 -_MAXBLOCKS_ = 7*4 -SCORE_TO_NEW_LEVEL equ 100000 +X_LOCATION equ 30 ; distance to table from left side +Y_LOCATION equ 50 ; distance to table from header + +UP_KEY equ 130+48 +DOWN_KEY equ 129+48 +LEFT_KEY equ 128+48 +RIGHT_KEY equ 131+48 +BACKGROUND equ 03000080h + +_MAXBLOCKS_ = 7*4 use32 - org 0x0 + org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; program start - dd I_END ; program image size - dd IM_END ; reguired amount of memory - dd IM_END ; esp - dd 0x0,0x0 ; I_PARAM, I_ICON + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; program start + dd I_END ; program image size + dd I_END+1024 ; reguired amount of memory + dd I_END+1024 ; esp + dd 0x0,0x0 ; I_PARAM, I_ICON include 'lang.inc' -START: ; start of execution +include 'macros.inc' - mov eax,3 ; - int 0x40 ; - mov cl,16 ; - ror eax,cl ; to make seconds more significant - mov [generator],eax ; - call random ; - mov byte[status],'0' - mov byte[menu],'0' - call draw_window ; at first, draw the window +START: ; start of execution + + + ; -- quickcode - start + + mov eax,3 + int 0x40 + mov cl,16 + ror eax,cl ; to make seconds more significant + mov [generator],eax + call random + + ; -- quickcode - end + + + call clear_table_tetris + call new_block + call draw_window ; at first, draw the window still: - - cmp byte[status],'2' - je attesa - - cmp byte[status],'1' - - jne attesa xor edx,edx - call draw_block - attesa: - call mouse - ;disabled because of bug - ;EDIT: the bug is somewhere else.. - ;NOTE: dont release this without fixing the bug you lazy bastard! - - mov eax,11 ; get event + mov eax,11 ; get event int 0x40 - cmp eax,1 ; redraw request ? - jz red - cmp eax,2 ; key in buffer ? + cmp eax,1 ; redraw request ? + jz red + cmp eax,2 ; key in buffer ? jnz check_button jmp key check_button: - cmp eax,3 ; button in buffer ? + cmp eax,3 ; button in buffer ? jnz scendi - mov eax,-1 ; close this program - int 0x40 + jmp button - red: ; redraw + red: ; redraw call draw_window jmp still -parallel dd 1 - -scendi: cmp byte[status],'1' - jne still - - cmp byte[blabla],10 - je blabla_0 - inc byte[blabla] - jmp blabla_1 - blabla_0: - mov byte[blabla],0 - inc dword [current_block_y] - call check_crash - jne block_crash - blabla_1: -draw: movzx edx,byte [current_block_color] - call draw_block - mov eax,5 - mov ebx,5 - sub ebx,[speed] - int 0x40 - jmp still +scendi: +;///////////////////////////////////////////////// Wildwest + cmp dword [pauses], 0 + je ok + jne not_ok +not_ok: + inc dword [current_block_y] + dec dword [current_block_y] + call check_crash + jne block_crash + jmp draw +ok: + ;///////////////////////////////////////////////// + inc dword [current_block_y] + call check_crash + jne block_crash +draw: movzx edx,byte [current_block_color] + call draw_block + mov eax,5 + movzx ebx,byte [delay] + int 0x40 + jmp still -block_crash: dec dword [current_block_y] - movzx edx,byte [current_block_color] - call draw_block - call fix_block - call check_full_line - call draw_table - call new_block - call write_score - call check_crash - jz adr400 -aspetta: mov eax,10 - int 0x40 - cmp eax,1 - jne adr10000 - call draw_window -adr10000: cmp eax,3 - jne aspetta +block_crash: dec dword [current_block_y] + movzx edx,byte [current_block_color] + call draw_block + call fix_block + call check_full_line + call draw_table + call new_block + inc dword [score] + call write_score + call check_crash + jz adr400 +aspetta: mov eax,10 + int 0x40 + cmp eax,1 + jne adr10000 + call draw_window +adr10000: cmp eax,3 + jne aspetta +new_game: mov eax,17 + int 0x40 + cmp ah,1 + jnz adr401 + jmp end_program +adr401: +;///////////////////////////////////////////////////// Wildwest + mov dword [pauses], 0 +;//////////////////////////////////////////////////// + mov dword [score],0 + call clear_table_tetris + call new_block + call draw_window -new_game: mov dword [score],0 - mov dword [lines],0 - mov dword [level],0 - mov dword [speed],0 - mov byte [status],'1' - call clear_table_tetris - call first_block - call new_block - call draw_window +adr400: movzx edx,byte [current_block_color] + call draw_block + mov eax,5 + movzx ebx,byte [delay] + int 0x40 + jmp still -adr400: movzx edx,byte [current_block_color] - call draw_block - jmp still +key: mov eax,2 + int 0x40 -include 'key.inc' -include 'mouse.inc' -include 'menu.inc' -include 'window.inc' -include 'block.inc' -include 'table.inc' -include 'random.inc' -include 'score.inc' +adr32: cmp ah,LEFT_KEY + jne adr_30 + dec dword [current_block_x] + call check_crash + jz adr4000 + inc dword [current_block_x] +adr4000: jmp scendi + +adr_30: cmp ah,RIGHT_KEY + jne adr_31 + inc dword [current_block_x] + call check_crash + jz adr3000 + dec dword [current_block_x] +adr3000: jmp scendi + +adr_31: cmp ah,UP_KEY + jne adr51 + mov edx,[current_block_pointer] + mov edx,[edx+16] + mov esi,[current_block_pointer] + mov [current_block_pointer],edx + call check_crash + jz adr50 + mov [current_block_pointer],esi +adr50: jmp scendi + +adr51: cmp ah,DOWN_KEY + jne adr61 + mov byte [delay],5 ;!!! 2 +adr52: jmp scendi + +adr61: cmp ah,' ' + jne adr62 + mov byte [delay],5 ;!!! 2 +adr62: jmp scendi + + +button: ; button + mov eax,17 + int 0x40 + cmp ah,1 ; button id=1 ? + jz end_program + cmp ah,2 + jz go_new_game + cmp ah,3 ; button id=3 ? ///Wildwest's 'Pause' button + jz pause_program + jmp still + +end_program: + mov eax,0xffffffff ; close this program + int 0x40 + +go_new_game: + jmp new_game +;//////////////////////////////////////////////////// Wildwest +pause_program: +cmp dword [pauses], 0 +je incr +mov dword [pauses], 0 + jmp still +incr: +mov dword [pauses], 1 +jmp still +;//////////////////////////////////////////////////// +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* +draw_window: + + + 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,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2 + mov ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30 + mov edx,BACKGROUND ; color of work area RRGGBB + mov esi,0x006688ee;99bbff ; color of grab bar RRGGBB,8->col + mov edi,0x007799ff;99bbee ; color of frames RRGGBB + int 0x40 + + ; WINDOW LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,8*65536+8 ; [x start] *65536 + [y start] + mov ecx,0x10ffffff ; color of text RRGGBB + mov edx,labelt ; pointer to text beginning + mov esi,labellen-labelt ; text length + int 0x40 + + ; CLOSE BUTTON +; mov eax,8 ; function 8 : define and draw button +; mov ebx,243*65536+12 ; [x start] *65536 + [x size] +; mov ecx,5*65536+12 ; [y start] *65536 + [y size] +; mov edx,1 ; button id +; mov esi,0x5580cc;22aacc ; button color RRGGBB +; int 0x40 + + mov eax,8 + mov ebx,30*65536+102 + mov ecx,378*65536+18 + mov edx,2 + mov esi,0xA24466;5580cc;22aacc + int 0x40 +;/////////////////////////////////////////////// Wildwest's 'Pause' button + mov eax,8 + mov ebx,132*65536+102 + mov ecx,378*65536+18 + mov edx,3 + mov esi,0x0FA0F0; + int 0x40 + + mov eax,4 ; function 4 : write text to window + mov ebx,164*65536+384 ; [x start] *65536 + [y start] + mov ecx,0x10ffffff ; color of text RRGGBB + mov edx,labe ; pointer to text beginning + mov esi,labelen-labe ; text length + int 0x40 +;/////////////////////////////////////////////// + mov eax,4 + mov ebx,49*65536+384 + xor ecx,ecx + mov ecx,0x10ffffff + mov edx,game_finished + mov esi,size_of_game_finished-game_finished + int 0x40 + + call draw_table + + movzx edx,byte [current_block_color] + call draw_block + + cld + mov ebx,38*65536+35 ; draw info text with function 4 + mov ecx,0x10ffffff ; color + mov edx,text + mov esi,7 + mov eax,4 + int 0x40 + + call write_score + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw + int 0x40 + + ret + +;------------------------------------------------------------- +; CHECK CRASH +; output Z flag => OK +; NZ flag => NO +;------------------------------------------------------------- + +check_crash: mov ebx,[current_block_pointer] + + mov edx,[current_block_y] + imul edx,LEN_X + add edx,[current_block_x] ;find the offset in tetris_t + + add edx,table_tetris + + mov ecx,4 + xor ax,ax + +adr_1: cmp byte [ebx],1 + jne adr_2 + add al,[edx] + adc ah,0 +adr_2: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_3 + add al,[edx] + adc ah,0 +adr_3: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_4 + add al,[edx] + adc ah,0 +adr_4: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_5 + add al,[edx] + adc ah,0 +adr_5: inc ebx + add edx,LEN_X-3 + + loop adr_1 + or ax,ax + ret +;------------------------------------------------------------- +;NEW BLOCK +;------------------------------------------------------------- +new_block: mov dword [current_block_y],1 + mov dword [current_block_x],7 + + call random + and al,7 + setz ah + add al,ah + mov [current_block_color],al + + call random + ;and eax,15 + ; ---- Ivan ---- + and eax,0xff + @@: + cmp eax,_MAXBLOCKS_ + jl @f + add eax,-(_MAXBLOCKS_) + jmp @b + @@: + ; ---- Ivan ---- + mov edx,[block_table+eax*4] + mov [current_block_pointer],edx + + mov byte [delay],22 ;19 ;!!! 15 + ret +;------------------------------------------------------------- +; FIX BLOCK +;------------------------------------------------------------- +fix_block: mov ebx,[current_block_pointer] + + mov edx,[current_block_y] + imul edx,LEN_X + add edx,[current_block_x] ;find the offset in tetris_t + + add edx,table_tetris + + mov ecx,4 + mov al,[current_block_color] + +adr_21: cmp byte [ebx],1 + jne adr_22 + mov [edx],al +adr_22: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_23 + mov [edx],al +adr_23: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_24 + mov [edx],al +adr_24: inc ebx + inc edx + + cmp byte [ebx],1 + jne adr_25 + mov [edx],al +adr_25: inc ebx + add edx,LEN_X-3 + + loop adr_21 + ret + +;-------------------------------------------------------------- +; DRAW_TABLE +;-------------------------------------------------------------- +draw_table: mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT + + mov ebx,X_LOCATION*65536+ADOBE_SIZE + mov ecx,Y_LOCATION*65536+ADOBE_SIZE + mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM +y_draw: push edi + + mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT +x_draw: push edi + ; pusha + ; mov eax,5 + ; mov ebx,10 + ; int 0x40 + ; popa + mov ax,13 + movzx edx,byte [esi] + mov edx,[color_table+edx*4] + int 0x40 + call draw_frames + inc esi + add ebx,65536*ADOBE_SIZE + pop edi + dec edi + jnz x_draw + + add esi,BORDER_LEFT+BORDER_RIGHT + mov ebx,X_LOCATION*65536+ADOBE_SIZE + add ecx,65536*ADOBE_SIZE + pop edi + dec edi + jnz y_draw + + ret +;-------------------------------------------------------------- +;DRAW BLOCK +; +; ebx=x [0..LEN_X-1] +; ecx=y [0..LEN_Y-1] +; edi=pointer block +;-------------------------------------------------------------- +draw_block: + + mov eax,13 + mov edx,[color_table+edx*4] + + mov ebx,[current_block_x] + mov ecx,[current_block_y] + mov edi,[current_block_pointer] + + sub ebx,BORDER_LEFT + imul ebx,ADOBE_SIZE + add ebx,X_LOCATION + shl ebx,16 + mov bx,ADOBE_SIZE + + sub ecx,BORDER_TOP + imul ecx,ADOBE_SIZE + add ecx,Y_LOCATION + shl ecx,16 + mov cx,ADOBE_SIZE + + mov dword [TMP_1],4 +adr_122: mov dword [TMP_0],4 +adr_121: cmp byte [edi],0 + je adr_120 + + int 040h + + call draw_frames + +adr_120: inc edi + add ebx,ADOBE_SIZE*65536 + dec dword [TMP_0] + jnz adr_121 + sub ebx,4*ADOBE_SIZE*65536 + add ecx,ADOBE_SIZE*65536 + dec dword [TMP_1] + jnz adr_122 + + ret + +draw_frames: + cmp edx,0 + jne df1 + ret + df1: + pusha + mov bx,1 + add edx,0x282828 + mov eax,13 + int 0x40 + popa + + pusha + mov cx,1 + add edx,0x282828 + mov eax,13 + int 0x40 + popa + + pusha + push ebx + sub bx,1 + add [esp+2],bx + pop ebx + mov bx,1 + shr edx,1 + and edx,0x7f7f7f + mov eax,13 + int 0x40 + popa + + pusha + push ecx + sub cx,1 + add [esp+2],cx + pop ecx + mov cx,1 + shr edx,1 + and edx,0x7f7f7f + mov eax,13 + int 0x40 + popa + + ret + + +;-------------------------------------------------------------- +clear_table_tetris: + cld + mov al,1 + mov edi,table_tetris + mov ecx,LEN_X*BORDER_TOP + rep stosb + + mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM +adr300: mov cl,BORDER_LEFT + rep stosb + dec ax ;AL=0 + mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT + rep stosb + inc ax ;AL=1 + mov cl,BORDER_RIGHT + rep stosb + dec dx + jne adr300 + + mov ecx,LEN_X*BORDER_BOTTOM + rep stosb + ret +;-------------------------------------------------------------- +;edx = pointer +;ebx = contatore +check_full_line: + std + mov al,0 + mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1 + mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X + +adr_5000: mov edi,edx + mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug + ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT) + repne scasb + jz no_full_line + + lea esi,[edx-LEN_X] + mov edi,edx + mov ecx,ebx + rep movsb + sub edi,BORDER_RIGHT + mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT + rep stosb + add dword [score],50 + jmp adr_5000 + +no_full_line: sub edx,LEN_X + sub ebx,LEN_X + jnz adr_5000 + + ret +;-------------------------------------------------------------- +random: mov eax,[generator] + add eax,-43ab45b5h + ror eax,1 + xor eax,32c4324fh + ror eax,1 + mov [generator],eax + ; --- IVAN --- + push ebx + mov eax,26 + mov ebx,9 + int 0x40 + pop ebx + xor eax,0xdeadbeef + add eax,[generator] + ; --- IVAN --- + mov [generator],eax ; Halyavin + ret +;-------------------------------------------------------------- +number_to_str: mov edi,end_number_str-1 + mov ecx,9;size_of_number_str + mov ebx,10 + cld +new_digit: xor edx,edx + div ebx + add dl,'0' + mov [edi],dl + dec edi + loop new_digit + ret +;-------------------------------------------------------------- +write_score: + mov eax,[score] + call number_to_str + + mov ebx,100*65536+100 ;clear box to write new score + mov ecx,35*65536+15 + mov edx,BACKGROUND + mov eax,13 + int 40h + + mov ebx,100*65536+35 ; draw info text with function 4 + mov ecx,0xffff00 ; color + mov edx,number_str + mov esi,[size_of_number_str] + mov eax,4 + int 0x40 + ret ; DATA AREA -include 'blocks.inc' +;-------------------------------------------------------------- +;DEFINITION BLOCKS +;-------------------------------------------------------------- +t_block_0: db 0,0,0,0 + db 1,1,1,0 + db 0,1,0,0 + db 0,0,0,0 + dd t_block_3 - labelt: db 'TETRIS II' - scoretext: db 'Score:' - linestext: db 'Lines:' - speedtext: db 'Speed:' - leveltext: db 'Level:' - startgame: db 'START' - instr: db 'INSTRUCTIONS' - hist: db 'HISTORY' - quit: db 'EXIT' - paused: db 'PAUSED' - txt_end: +t_block_1: db 0,1,0,0 + db 1,1,0,0 + db 0,1,0,0 + db 0,0,0,0 + dd t_block_0 -history: - db 'TETRIS for MENUET v2.0 ' - db ' ' - db ' ' - db 'Originally made ' - db ' by Paolo Minazzi ' - db ' ' - db 'Port & framed blocks ' - db ' by Ville Turjanmaa ' - db ' ' - db 'RDTSC replaced ' - db ' by quickcode ' - db ' ' - db 'New blocks & better random ' - db ' by Ivan Poddubny ' - db ' ' - db 'Better control, logo, menu, pause ' - db ' by Jeffrey Amelynck' +t_block_2: db 0,1,0,0 + db 1,1,1,0 + db 0,0,0,0 + db 0,0,0,0 + dd t_block_1 - db 'x <- END MARKER, DONT DELETE ' +t_block_3 db 0,1,0,0 + db 0,1,1,0 + db 0,1,0,0 + db 0,0,0,0 + dd t_block_2 +;-------------------------------------------------------------- +i_block_0: db 0,1,0,0 + db 0,1,0,0 + db 0,1,0,0 + db 0,1,0,0 + dd i_block_1 -instructions: - db 'TETRIS for MENUET v2.0 ' - db ' ' - db 'Controls: ' - db ' ' - db 'Use left & right key to navigate ' - db 'Use up key to turn the block ' - db 'Use down key to make block fall ' - db 'Use P to pause game ' - db 'Use N to start a new game ' - db 'Use ESC to go back to menu or exit' - db 'You can also use the mouse to move' - db 'the blocks, left button to let the' - db 'blocks fall and right button to ' - db 'rotate them ' - db 'you can pause the game by pressing' - db 'both mouse buttons ' - db ' ' - db 'DONT FORGET: move mouse out of the' - db 'window if you want to use keyboard' +i_block_1: db 0,0,0,0 + db 1,1,1,1 + db 0,0,0,0 + db 0,0,0,0 + dd i_block_0 +;-------------------------------------------------------------- +q_block_0: db 0,1,1,0 + db 0,1,1,0 + db 0,0,0,0 + db 0,0,0,0 + dd q_block_0 +;-------------------------------------------------------------- +s_block_0: + db 0,0,0,0 + db 0,1,1,0 + db 1,1,0,0 + db 0,0,0,0 + dd s_block_1 - db 'x <- END MARKER, DONT DELETE ' +s_block_1: db 1,0,0,0 + db 1,1,0,0 + db 0,1,0,0 + db 0,0,0,0 + dd s_block_0 +;-------------------------------------------------------------- +l_block_0: db 0,0,0,0 + db 1,1,1,0 + db 1,0,0,0 + db 0,0,0,0 + dd l_block_3 + +l_block_1: db 1,1,0,0 + db 0,1,0,0 + db 0,1,0,0 + db 0,0,0,0 + dd l_block_0 + +l_block_2: db 0,0,1,0 + db 1,1,1,0 + db 0,0,0,0 + db 0,0,0,0 + dd l_block_1 + +l_block_3: db 0,1,0,0 + db 0,1,0,0 + db 0,1,1,0 + db 0,0,0,0 + dd l_block_2 +;----------------------------------------------- + +g_block_0: + +db 0,1,0,0 +db 0,1,0,0 +db 1,1,0,0 +db 0,0,0,0 +dd g_block_1 + +g_block_1: +db 0,0,0,0 +db 1,1,1,0 +db 0,0,1,0 +db 0,0,0,0 +dd g_block_2 + +g_block_2: +db 0,1,1,0 +db 0,1,0,0 +db 0,1,0,0 +db 0,0,0,0 +dd g_block_3 + +g_block_3: +db 1,0,0,0 +db 1,1,1,0 +db 0,0,0,0 +db 0,0,0,0 +dd g_block_0 + +;----------------------------------- + +k_block_0: + db 0,0,0,0 + db 1,1,0,0 + db 0,1,1,0 + db 0,0,0,0 + dd k_block_1 + +k_block_1: + db 0,1,0,0 + db 1,1,0,0 + db 1,0,0,0 + db 0,0,0,0 + dd k_block_0 + +;----------------------------------- + +color_table: dd 00000000h ;black 0 + dd 00cccccch ;white 1 + dd 00cc0000h ;red 2 + dd 0000cc00h ;green 3 + dd 000000cch ;blue 4 + dd 00cccc00h ;yellow 5 + dd 0000cccch ;cyan 6 + dd 00cc00cch ;pink 7 + +block_table: + dd t_block_0 ; t + dd t_block_1 + dd t_block_2 + dd t_block_3 + dd i_block_0 ; i + dd i_block_1 + dd i_block_0 + dd i_block_1 + dd q_block_0 ; q + dd q_block_0 + dd q_block_0 + dd q_block_0 + dd s_block_0 ; s + dd s_block_1 + dd s_block_0 + dd s_block_1 + dd l_block_0 ; l + dd l_block_1 + dd l_block_2 + dd l_block_3 + dd g_block_0 ; g + dd g_block_1 + dd g_block_2 + dd g_block_3 + dd k_block_0 ; k + dd k_block_1 + dd k_block_0 + dd k_block_1 + +if lang eq ru + + labelt: + db 'ТЕТРИС 1.6 - СТРЕЛКИ И ПРОБЕЛ' + labellen: + labe: + db 'ПАУЗА' + labelen: + text: db 'Очки: ' + game_finished: db ' НАЧАТЬ' + size_of_game_finished: + +else + + labelt: + db 'TETRIS 1.6 - ARROWS & SPACE' + labellen: + labe: + db 'PAUSE' + labelen: + text: db 'Score: ' + game_finished: db 'NEW GAME' + size_of_game_finished: + +end if + +pauses dd 0 ;/// Wildwest +parallel dd 1 +score: dd 0 +TMP_0: dd 0 +TMP_1: dd 0 +generator: dd 0 +current_block_x: dd 0 +current_block_y: dd 0 +current_block_pointer: dd 0 +current_block_color: db 0 +number_str: db 0,0,0,0,0,0,0,0,0 +end_number_str: +size_of_number_str dd 9 +delay: db 40 +table_tetris: I_END: - -score: dd 0 -level: dd 0 -speed: dd 0 -lines: dd 0 -TMP_0: dd 0 -TMP_1: dd 0 -generator: dd 0 -current_block_x: dd 0 -current_block_y: dd 0 -current_block_pointer: dd 0 -current_block_color: db 0 -next_block_pointer: dd 0 -next_block_color: db 0 -blabla dd 0 -lastmousebutton dd 0 -number_str: db 0,0,0,0,0,0,0,0,0 -end_number_str: -size_of_number_str dd 7 -delay: dd 5 -status: dd 0 ; 0=menu, 1=playing, 2=paused, 3=history , 4=instructions -menu: dd 0 ; 0=start, 1=instructions, 2=history, 3=exit - -table_tetris: rb 2048+55 - -IM_END: diff --git a/programs/games/tetris/trunk/window.inc b/programs/games/tetris/trunk/window.inc deleted file mode 100644 index 85472a639a..0000000000 --- a/programs/games/tetris/trunk/window.inc +++ /dev/null @@ -1,142 +0,0 @@ -draw_window: - - - 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,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98 - mov ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+4 - mov edx,0x03000000 ; color of work area RRGGBB - mov esi,0x006688ee ; color of grab bar RRGGBB,8->col - mov edi,0x007799ff ; color of frames RRGGBB - int 0x40 - - ; WINDOW LABEL - mov eax,4 ; function 4 : write text to window - mov ebx,8*65536+5 ; [x start] *65536 + [y start] - mov ecx,0x00ffffff ; color of text RRGGBB - mov edx,labelt ; pointer to text beginning - mov esi,scoretext-labelt ; text length - int 0x40 - - cmp byte[status],'0' - jne status1 - call draw_logo - call draw_menu - - status1: - cmp byte[status],'1' - jne status2 - - call draw_game - - status2: - cmp byte[status],'2' - jne status3 - - call draw_game - - mov eax,4 ; function 4 : write text to window - mov ebx,80*65536+170 ; [x start] *65536 + [y start] - mov ecx,0x10ff0000 ; color of text RRGGBB - mov edx,paused ; pointer to text beginning - mov esi,txt_end-paused ; text length - int 0x40 - - status3: - cmp byte[status],'3' - jne status4 - - call draw_logo - mov edx,history - call show_text - - status4: - cmp byte[status],'4' - jne status5 - - call draw_logo - mov edx,instructions - call show_text - - status5: - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - int 0x40 - -ret - -draw_game: - - call draw_table - movzx edx,byte [current_block_color] - call draw_block - - call write_score - - mov eax,38 - mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-4) shl 16 + ((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-4) - mov ecx,20 shl 16 + ((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+2-4) - mov edx,0x00ffffff - int 0x40 - -ret - -draw_logo: - - mov ebx,2 - mov ecx,2 - mov edx,[color_table+1*4] - mov edi,tetris_t - call draw_title_block - mov ebx,5 - mov ecx,3 - mov edx,[color_table+2*4] - mov edi,tetris_e - call draw_title_block - mov ebx,8 - mov ecx,2 - mov edx,[color_table+3*4] - mov edi,tetris_t - call draw_title_block - mov ebx,11 - mov ecx,3 - mov edx,[color_table+4*4] - mov edi,tetris_r - call draw_title_block - mov ebx,13 - mov ecx,2 - mov edx,[color_table+5*4] - mov edi,tetris_i - call draw_title_block - mov ebx,15 - mov ecx,3 - mov edx,[color_table+6*4] - mov edi,tetris_s - call draw_title_block - mov ebx,20 - mov ecx,2 - mov edx,[color_table+7*4] - mov edi,tetris_II - call draw_title_block - -ret - -show_text: - mov ebx,6*65536+120 ; draw info text with function 4 - mov ecx,0xff0000 - mov esi,34 - newline: - mov eax,4 - int 0x40 - add ebx,10 - add edx,34 - cmp [edx],byte 'x' - jne newline -ret - - diff --git a/programs/network/netsendc/trunk/netsendc.asm b/programs/network/netsendc/trunk/netsendc.asm index ed3a7219eb..0427272eee 100644 --- a/programs/network/netsendc/trunk/netsendc.asm +++ b/programs/network/netsendc/trunk/netsendc.asm @@ -16,14 +16,15 @@ use32 org 0x0 - db 'MENUET00' ; 8 byte id - dd 38 ; required os + db 'MENUET01' ; 8 byte id + dd 1 ; header version dd START ; program start dd I_END ; program image size - dd 0x100000 ; required amount of memory - dd 0x00000000 ; reserved=no extended header - -include 'lang.inc' + dd mem ; required amount of memory + dd mem ; stack pointer + dd 0, 0 ; param, icon + +include 'lang.inc' include 'macros.inc' START: ; start of execution @@ -36,38 +37,30 @@ START: ; start of execution int 0x40 mov [socketNum], eax - + +red: call draw_window ; at first, draw the window still: - mov eax,23 ; wait here for event - mov ebx,1 + mov eax,10 ; wait here for event int 0x40 - - cmp eax,1 ; redraw request ? + + dec eax jz red - cmp eax,2 ; key in buffer ? - jz key - cmp eax,3 ; button in buffer ? - jz button - - jmp still - -red: - call draw_window - jmp still - + dec eax + jnz button + key: - mov eax,2 + mov al,2 int 0x40 jmp still button: - mov eax,17 + mov al,17 int 0x40 - cmp ah,1 ; button id=1 ? + dec ah ; button id=1 ? jnz noclose mov eax, 53 mov ebx, 1 @@ -76,14 +69,8 @@ button: mov eax,-1 int 0x40 noclose: - - cmp ah,2 ; SEND CODE ? - je send_xcode - +; it was not close button, so it must be send code button - jmp still - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; SEND CODE TO REMOTE ;; @@ -92,19 +79,13 @@ button: send_xcode: - mov esi,send_data ; header - mov edi,I_END - mov ecx,end_message-send_data - cld - rep movsb - mov eax,53 ; SEND CODE TO REMOTE mov ebx,4 mov ecx,[socketNum] mov edx,end_message-send_data - mov esi,I_END + mov esi,send_data int 0x40 - + jmp still @@ -124,8 +105,6 @@ draw_window: mov ebx,100*65536+250 ; [x start] *65536 + [x size] mov ecx,60*65536+150 ; [y start] *65536 + [y size] mov edx,0x03ffffff ; color of work area RRGGBB - mov esi,0x80aabbcc ; color of grab bar RRGGBB,8->color gl - mov edi,0x00aabbcc ; color of frames RRGGBB int 0x40 ; WINDOW LABEL @@ -143,7 +122,6 @@ draw_window: mov esi,0x667788 int 0x40 - cld mov ebx,25*65536+50 ; draw info text with function 4 mov ecx,0x000000 mov edx,text @@ -152,7 +130,7 @@ draw_window: mov eax,4 int 0x40 add ebx,16 - add edx,40 + add edx,esi cmp [edx],byte 'x' jnz newline @@ -165,34 +143,38 @@ draw_window: ; DATA AREA - +if lang eq ru text: db ' Послать сообщение ' db ' ' db ' Локальный адрес : 192.168.0.1 ' db ' Удалённый адрес : 192.168.0.2 ' db 'Текст и адрес в конце исходника ' - db 'x <- END MARKER, DONT DELETE ' - + db 'x' ; <- END MARKER, DONT DELETE +else +text: + db ' Send message ' + db ' ' + db ' Local address : 192.168.0.1 ' + db ' Remote address : 192.168.0.2 ' + db 'Text and address in end of source ' + db 'x' ; <- END MARKER, DONT DELETE +end if labeltext: db 'NetSend(Client)' ; lte: -socketNum dd 0x0 - remote_ip db 192,168,1,2 -picture_position dd 0x0 - send_data db 'Привет,это тест!Hello,this is a test!' end_message: I_END: - - - - - - - \ No newline at end of file +align 4 +socketNum dd ? + +rb 32 ; this is for stack + +mem: + diff --git a/programs/network/netsends/trunk/netsends.asm b/programs/network/netsends/trunk/netsends.asm index 0aabf78818..3d36b6bcc8 100644 --- a/programs/network/netsends/trunk/netsends.asm +++ b/programs/network/netsends/trunk/netsends.asm @@ -183,13 +183,19 @@ draw_window: ; DATA AREA - +if lang eq ru text: db 'Данный адрес : 192.168.0.2 ' db 'Прослушиваемый порт : 0x5000 ' db 'Присланные сообщения: ' - db 'x <- END MARKER, DONT DELETE ' - + db 'x' ; <- END MARKER, DONT DELETE +else +text: + db 'This address : 192.168.0.2 ' + db 'Used port : 0x5000 ' + db 'Received messages: ' + db 'x' ; <- END MARKER, DONT DELETE +end if labeltext: db 'NetSend(Server)' lte: @@ -198,10 +204,3 @@ socketNum dd 0x0 I_END: - - - - - - - \ No newline at end of file diff --git a/programs/other/archer/trunk/@RCHER.ASM b/programs/other/archer/trunk/@RCHER.ASM index e9c63067f5..0d255a756e 100644 --- a/programs/other/archer/trunk/@RCHER.ASM +++ b/programs/other/archer/trunk/@RCHER.ASM @@ -1,4 +1,4 @@ -; @RCHER - DEflate unpacker v1.0 +; @RCHER - Deflate unpacker v2.0 beta ; ; Written in pure assembler by Ivushkin Andrey aka Willow ; @@ -8,15 +8,17 @@ ; ; Compile with FASM - SYS equ meos -PARAM_PTR equ png_image +OUTBUF equ 4*1024*1024 +png_imag = output+OUTBUF +PARAM_PTR = os_work;png_image +MEMINIT=next_code;output DUMPFILE equ '/hd/1/out.txt' SHOW_RBLOCK equ 0;1 SHOW_PNG_SEC equ 0;1 SHOW_METH equ 0;1 -FILE_NUM equ 0 +FILE_NUM equ 15;8 MEMORY equ 0x800000 BITS equ 16 @@ -28,7 +30,6 @@ NO_STOPS equ 1 SHOW_CHARS equ 0 BSIZE equ 512 INBUF equ BUFSIZE*BSIZE*2 -OUTBUF equ 4*1024*1024 IGNORE_DIRS equ 0 MOVE_SLINE_LEV equ 8 @@ -40,6 +41,9 @@ STAY_MODE equ 10000b IPC_MODE equ 100000b RAW_MODE equ 1000000b THREAD_YES equ 10000000b +LIST_MODE equ 100000000b +MEM_MODE equ 1000000000b +FIND_MODE equ 10000000000b if SYS eq win format PE console @@ -57,34 +61,36 @@ use32 dd 0x01 dd start dd I_END - dd MEMORY - dd MEMORY-2048 + dd MEMINIT + dd main_stack;MEMORY-2048 if PARAM_PTR eq param dd 0 else dd PARAM_PTR end if dd 0x0 -include "lang.inc" if PARAM_PTR eq param - param db 'RQ' - db '000037' - db '/hd/1/zip/png.zip',0 + param db 'N' + db '000015' + db '/hd/1/zip/gz/fasm-1~1.tgz',0 end if ;match =meos,SYS ;{ include "macros.inc" ; purge mov include "debug.inc" + include 'dump.inc' ;} end if -language equ en +include 'lang.inc' +language equ lang if SYS eq win section '.text' code readable executable writeable end if + include "arcmacro.inc" include "parser.inc" include "deflate.inc" @@ -107,6 +113,12 @@ else mcall 40,10000101b ; jmp again CmdLine + cmdl: + test [Flags],LIST_MODE + jz red + +; Dump [lpath],[lpath_len],os_work +; ud2 red: call draw_window mcall 12,2 @@ -134,12 +146,15 @@ else mcall -1 .noquit: mcall 17 + mcall 64,1,MEMINIT QueryFile - and [FileNum],0 + mov [FileNum],FILE_NUM test eax,eax jnz still end if again: +; Dump Flags,4,os_work + mov [fat_],fat Newline xor eax,eax ; and [Flags],STAY_MODE @@ -153,6 +168,11 @@ again: Msg 14 jmp quit .sizeok2: + call KillViewer + xor eax,eax + mov ecx,(child_stack-fat)/4 + mov edi,fat + rep stosd mov [filesize],ebx test [Flags],RAW_MODE jz .norawm @@ -213,13 +233,37 @@ again: jmp exit .sizeok1: if ~ SYS eq win - call KillViewer end if - Msg 39 + Msg 39 ; unpacking PNG + mov ecx,[unp_size] + add ecx,output + mov [png_],ecx + mov eax,[PNG_info.Width] + imul eax,[PNG_info.Height] + lea eax,[eax+eax*2] + add ecx,eax +; dps 'Mem=' +; dpd ecx + mcall 64,1 + test eax,eax + jz .ok + Msg 41 + jmp exit + .ok: mov edi,[outp] call Deflate.blkbegin jmp .defl_end .sizeok: + mov ecx,[unp_size] + dpd ecx + add ecx,output +; mov [png_],ecx + mcall 64,1 + test eax,eax + jz .ok2 + Msg 41 + jmp exit + .ok2: call Deflate ; <=========== .defl_end: test [bits],7 @@ -252,6 +296,8 @@ again: pop ecx esi jmp .skipAdler .skipCRC: +; dps 'Out=' +; dpd ecx call UAdler Msg 10 mov eax,[Adler32] @@ -283,15 +329,20 @@ if SYS eq win else test [Flags],PNG_MODE jnz .nosave + test [Flags],LIST_MODE + jnz quit + test [Flags],TAR_MODE jnz .nomsg Msg 37 .nomsg: mov [outfile.out],ebx mcall 58,outfile +; dps 'Before Quit1' +; ud2 test [Flags],TAR_MODE - jnz .nosave - call StartPad + jz exit.pad +; call StartPad .nosave: end if test [Flags],PNG_MODE @@ -300,7 +351,7 @@ end if mov edi,filters mov ecx,6 rep stosd - mov edi,png_image + mov edi,[png_] mov esi,output ;// mov [outp],edi @@ -310,34 +361,37 @@ end if mov [outfile.size],edi mov ebx,[outp];png_image if SYS eq win -exit: + exit: Msg 12 invoke CreateFile,outfile,GENERIC_WRITE, FILE_SHARE_WRITE, NULL, \ CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL mov [hnd],eax invoke WriteFile, eax,ebx,[outfile.size],cparam1,NULL invoke CloseHandle, [hnd] - call RunViewer - and [arc_base],0 + call RunViewer + and [arc_base],0 and [Flags],STAY_MODE - -quit: +; dps 'Before Quit2' + quit: QueryFile test eax,eax jnz again invoke ExitProcess,0 else -exit: + exit: mov [outfile.out],ebx test [Flags],TAR_MODE jz .notar Msg 37 + test [Flags],LIST_MODE + jne quit mcall 58,outfile + .pad: call StartPad - .notar: + .notar: Msg 12 - call RunViewer - and [arc_base],0 + call RunViewer + and [arc_base],0 and [Flags],STAY_MODE quit: test [Flags],STAY_MODE @@ -352,16 +406,19 @@ NoPng: else jz still end if - mov ecx,dumpf_len - mov esi,dumpfile - mov edi,filename - rep movsb - call OpenFile - test ebx,ebx - jz again.sizebadq +; Dump output,255,os_work +; ud2 +; mov ecx,dumpf_len +; mov esi,dumpfile +; mov edi,filename +; rep movsb +; call OpenFile +; test ebx,ebx +; jz again.sizebadq call TarParse mov ecx,[FileNum] call TarFindN +; dpd [outfile.size] cmp [outfile.size],0 jz again.sizebadq mov ebx,esi @@ -397,22 +454,22 @@ section '.idata' import data readable writeable WriteFile,'WriteFile',\ SetFilePointer,'SetFilePointer',\ CloseHandle,'CloseHandle',\ - GetStdHandle,'GetStdHandle',\ - WriteConsole,'WriteConsoleA',\ - ReadConsole,'ReadConsoleA',\ - CreateProcess,'CreateProcessA',\ - WritePrivateProfileString,'WritePrivateProfileStringA',\ - ExitProcess,'ExitProcess' + GetStdHandle,'GetStdHandle',\ + WriteConsole,'WriteConsoleA',\ + ReadConsole,'ReadConsoleA',\ + CreateProcess,'CreateProcessA',\ + WritePrivateProfileString,'WritePrivateProfileStringA',\ + ExitProcess,'ExitProcess' import comdlg,\ GetOpenFileName,'GetOpenFileNameA' import user,\ - wsprintf,'wsprintfA',\ - SendMessage,'SendMessageA',\ - FindWindowEx,'FindWindowExA',\ - WaitForInputIdle,'WaitForInputIdle' - + wsprintf,'wsprintfA',\ + SendMessage,'SendMessageA',\ + FindWindowEx,'FindWindowExA',\ + WaitForInputIdle,'WaitForInputIdle' + section '.reloc' fixups data readable discardable end if diff --git a/programs/other/archer/trunk/arcmacro.inc b/programs/other/archer/trunk/arcmacro.inc index 6d5da3c5ff..9ef9237dfb 100644 --- a/programs/other/archer/trunk/arcmacro.inc +++ b/programs/other/archer/trunk/arcmacro.inc @@ -177,7 +177,7 @@ str_table \ ' ',\ ;38 <'Подготовка изображения...',13,10>,\ ;39 <'Укажите "R" для обработки сырых данных. Отмена.',13,10>,\ ;40 - ' ',\ ; + <'Не хватает памяти! Отмена.',13,10>,\ ; 41 ' ',\ ; ' ',\ ; ' ',\ ; @@ -232,7 +232,7 @@ str_table \ ' ',\ ;38 <'Preparing bitmap...',13,10>,\ ;39 <'Specify "R" to force raw data. Abort.',13,10>,\ ;40 - ' ',\ ; + <'Not enough memory! Abort.',13,10>,\ ; ' ',\ ; ' ',\ ; ' ',\ ; diff --git a/programs/other/archer/trunk/data.inc b/programs/other/archer/trunk/data.inc index ffa0635ae2..f95041d87b 100644 --- a/programs/other/archer/trunk/data.inc +++ b/programs/other/archer/trunk/data.inc @@ -61,7 +61,7 @@ db 'png\absolut0.png',0 else if ~ FNAME eq db FNAME - end if + end if ; db '/hd/1/zip/png.zip',0 ; db '/hd/1/zip/files/opossum.png' ; db '/rd/1/www.zip',0 @@ -84,6 +84,11 @@ DKeys rd 3 Dheader rb 12 Dpassword rb PASSW_LEN +png_ dd ? +fat_ dd ? +fat_fnum dd ? +lpath dd ? +lpath_len dd ? png_bpp dd ? sline_len dd ? IDATcount dd ? @@ -120,6 +125,15 @@ tblLen dw ? hclen db ? max_len dw ? +fat: + rb 4096;512 +child_stack: + rb 1024 +main_stack: +area: + rb INBUF +os_work rb 4*1024 + bl_count rb BITS next_code rw BITS @@ -143,16 +157,10 @@ hdist db ? Distance rw 32 Dist_c rw 32 - -area: - rb INBUF - -os_work rb 4*1024 - output: -rb OUTBUF +;rb OUTBUF -png_image: +;png_image: if SYS eq win rb OUTBUF end if diff --git a/programs/other/archer/trunk/debug.inc b/programs/other/archer/trunk/debug.inc index 45ae9f90c6..f967f36cbe 100644 --- a/programs/other/archer/trunk/debug.inc +++ b/programs/other/archer/trunk/debug.inc @@ -73,10 +73,16 @@ debug_outstr: @@: ret +_debug_crlf db 13, 10, 0 macro newline { - dps <13,10> + pushf + pushad + mov edx, _debug_crlf + call debug_outstr + popad + popf } macro print message diff --git a/programs/other/archer/trunk/deflate.inc b/programs/other/archer/trunk/deflate.inc index ef0eb07a24..fef982d85c 100644 --- a/programs/other/archer/trunk/deflate.inc +++ b/programs/other/archer/trunk/deflate.inc @@ -113,7 +113,7 @@ end if jb .no81 add eax,0x58 jmp .noend - .no81: + .no81: sub eax,0x30 stosb jmp .next @@ -128,7 +128,7 @@ if SHOW_METH eq 1 end if pusha xor eax,eax - mov ecx,(area-bl_count) / 4 + mov ecx,(output-bl_count) / 4 mov edi,bl_count rep stosd popa diff --git a/programs/other/archer/trunk/dump.inc b/programs/other/archer/trunk/dump.inc new file mode 100644 index 0000000000..6261f43b74 --- /dev/null +++ b/programs/other/archer/trunk/dump.inc @@ -0,0 +1,55 @@ +; Include file for dumping user apps' memory through new debug BOARD + +; Max amount of bytes to be dumped +IPC_BUF equ 160 + +; Dump macro parameters: +; ptr - pointer to memory dumped +; len - dump length +; workarea - any work area for sysfunc 9 +; run_new - if not empty, run BOARD unless it is running already + +macro Dump ptr, len, workarea,run_new +{ + local .exist,.lt + pusha + mov ebx,workarea + call Board_seek +if ~ run_new eq + test edx,edx + jne .exist + mcall 19,Board_seek.board_fn,0 + mov edx,eax + mcall 5,20 +end if + .exist: + mov esi,len + cmp esi,IPC_BUF + jbe .lt + mov esi,IPC_BUF + .lt: + mcall 60,2,edx,ptr + popa +} + +if used Board_seek +Board_seek: +; ebx - prcinfo + xor edx,edx + mcall 9,,-1 + mov ecx,eax + mov esi,dword[.board_fn] +.lp: + mcall 9 + cmp dword[ebx+10],esi +; jne .no +; cmp dword[ebx+42],399 + je .ok +.no: + loop .lp + ret +.ok: + mov edx,[ebx+30] + ret +.board_fn db 'BOARD ' +end if diff --git a/programs/other/archer/trunk/macros.inc b/programs/other/archer/trunk/macros.inc index 1d153e8723..ab45d183d4 100644 --- a/programs/other/archer/trunk/macros.inc +++ b/programs/other/archer/trunk/macros.inc @@ -143,9 +143,6 @@ macro mcall a,b,c,d,e,f { ; mike.dld - - - ; optimize the code for size __regs fix @@ -177,7 +174,7 @@ macro sub arg1,arg2 macro mov arg1,arg2 { - if (arg1 in __regs) & (arg2 eqtype 0) + if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0')) if (arg2) = 0 xor arg1,arg1 else if (arg2) = 1 diff --git a/programs/other/archer/trunk/parser.inc b/programs/other/archer/trunk/parser.inc index 7fc11ddabc..8a4b9e544d 100644 --- a/programs/other/archer/trunk/parser.inc +++ b/programs/other/archer/trunk/parser.inc @@ -22,11 +22,85 @@ PrintFilename: rep movsb mov dword[edi],0x00a0d call DebugPrint -; mcall 10 -; mcall 2 + popa + call Add2Fat + ret + +Add2Fat: +; edx - ptr, ecx - len + + pusha + test [Flags],LIST_MODE + jz .ex + mov ebp,8 + mov edi,edx + lea ebx,[edx+ecx] + mov ecx,[lpath_len] + cmp ecx,1 + je .lbl + mov esi,[lpath] + repe cmpsb + jne .full + mov eax,[lpath_len] + sub dword[esp+24],eax;path_len-path + cmp edi,ebx + je .full + mov edx,edi + .lbl: + mov ecx,[esp+24] + mov al,'/' + repne scasb + mov eax,[fat_] + mov ecx,[esp+24] + jne .nofol + cmp edi,ebx + jne .full + lea ecx,[edi-1] + sub ecx,edx + or byte[eax+11],0x10 +; sub edx,ecx + .nofol: + + push [fat_fnum] + pop dword[eax+12] + mov edi,eax + mov esi,edx + .lp1: + + mov bl,[esi] + lea edx,[eax+ebp] + inc esi + cmp bl,'.' + jne .nodot + lea edi,[eax+ebp] + mov ebp,11 + jmp .ll + .nodot: + cmp edi,edx + jae .ll + mov [edi],bl + inc edi + .ll: + loop .lp1 + mov ecx,11 + dec eax + .lp2: + cmp byte[eax+ecx],0 + jne .no0 + mov byte[eax+ecx],' ' + .no0: + loop .lp2 + cmp eax,child_stack-1 + jae .full + add [fat_],32 + .full: + inc [fat_fnum] + .ex: popa ret +;path db '/';'fasm/examples/elfexe/' +;path_len: ; Parse routines: ; out: edx= 0 if all ok, 1 - central dir, 2-EOD @@ -78,16 +152,19 @@ end if popa end if Newline +; Dump fat,160,os_work ret ZipFindN: ; ecx - file # Msg 33 + or [Flags],FIND_MODE cmp ecx,[file_count] jae .err push ecx call ResetFile .nxt: + call ZipCrawl cmp edx,51 je .ok2 @@ -111,6 +188,7 @@ ZipFindN: add esi,eax mov edx,5 .ex: + and [Flags],-1-FIND_MODE push edx Msg edx pop edx @@ -159,6 +237,8 @@ if IGNORE_DIRS eq 1 cmp byte[edx+ecx-1],'/' je .skipdp end if + test [Flags],FIND_MODE + jnz .skipdp call PrintFilename .skipdp: movzx ecx,word[esi+28] @@ -252,7 +332,19 @@ PngParse: mov [PNG_info.Width],eax mov eax,[PNG_info.Height] bswap eax + mov ebx,eax mov [PNG_info.Height],eax + call scanline_calc +; dps 'All=' + cmp [PNG_info.Color_type],3 + jne .nopal + shl eax,3 + inc eax + .nopal: + inc eax + imul eax,ebx + mov [unp_size],eax +; dpd eax add esi,25 cmp byte[esi-5],0 rep_err e,52,29 @@ -423,7 +515,8 @@ setcurb: ret TarParse: - call ResetFile + mov esi,output +; call ResetFile .nxt: call TarCrawl ; wait @@ -436,8 +529,9 @@ end if inc [file_count] .skipinc: add eax,ecx - mov ebx,1 - call FileSeek +; mov ebx,1 + add esi,eax +; call FileSeek jmp .nxt TarFindN: @@ -447,7 +541,8 @@ TarFindN: cmp ecx,[file_count] jae .err push ecx - call ResetFile + mov esi,output +; call ResetFile .nxt: call TarCrawl if IGNORE_DIRS eq 1 @@ -461,8 +556,9 @@ end if dec dword[esp] .seek: add eax,ecx - mov ebx,1 - call FileSeek +; mov ebx,1 + add esi,eax +; call FileSeek jmp .nxt .err: mov edx,4 @@ -559,13 +655,8 @@ SfxParse: .err: ret -; Created: May 31, 2005 -FiltCall: -dd PngFilter.nofilt,Filt_sub,Filt_up,Filt_av,Filt_paeth,PngFilter.nofilt -PngFilter: -; esi - filtered uncompressed image data -; edi - destination - mov cl,[PNG_info.Color_type] +scanline_calc: + movzx ecx,byte[PNG_info.Color_type] mov eax,1 cmp cl,3 je .palette @@ -594,6 +685,15 @@ PngFilter: jnz .noz2 inc eax .noz2: + ret + +; Created: May 31, 2005 +FiltCall: +dd PngFilter.nofilt,Filt_sub,Filt_up,Filt_av,Filt_paeth,PngFilter.nofilt +PngFilter: +; esi - filtered uncompressed image data +; edi - destination + call scanline_calc mov [sline_len],eax ; scanline length push edi and [Flags],not 1 diff --git a/programs/other/archer/trunk/sys.inc b/programs/other/archer/trunk/sys.inc index 9ac4c94547..c54cde1c35 100644 --- a/programs/other/archer/trunk/sys.inc +++ b/programs/other/archer/trunk/sys.inc @@ -105,7 +105,7 @@ RunViewer: else test [Flags],THREAD_YES jnz .ex - mcall 51,1,thread,MEMORY + mcall 51,1,thread,child_stack;MEMORY mov [child],eax end if .ex: @@ -191,7 +191,7 @@ thread: mov ecx,[PNG_info.Width] shl ecx,16 add ecx,[PNG_info.Height] - mcall 7,png_image,,10 shl 16+25 + mcall 7,[png_],,10 shl 16+25 mcall 12,2 .still: mcall 10 @@ -208,6 +208,7 @@ thread: jne .still .close: and [child],0 + mcall 64,1,MEMINIT mcall -1 KillViewer: @@ -256,7 +257,68 @@ macro CmdLine mov ecx,255 mov edi,filename rep movsb - jmp again +; test [Flags],LIST_MODE +; jz again + xor eax,eax + mov edi,filename + mov ecx,255 + repne scasb + cmp byte[edi-2],'/' + je .slash + mov byte[edi-1],'/' + inc edi + .slash: +; Dump filename,255,os_work +; ud2 + mov ecx,edi +; dec ecx + mov edx,ecx + mov dword[Finfo],13 +; mov dword[Finfo.count],1 + mov edi,filename+5 + sub ecx,edi + .lp: + mov al,'/' + repne scasb +; jne .ex +; dpd ecx + and byte[edi-1],0 + mcall 58,Finfo + mov byte[edi-1],'/' + test ebx,32 + jz .lp + test [Flags],LIST_MODE + jne .listm + and byte[edi-1],0 +; Dump filename,255,os_work + jmp .agg +; ud2 + .listm: + lea esi,[edi-1+ecx] + lea edi,[esi+1] + std + rep movsb + and byte[edi],0 + cld +; dpd filename + + inc edi + dpd edi + cmp edx,edi + jne .slash2 +; cmp byte[edi],'/' +; je .slash2 + mov byte[edi],'/' + inc edx + .slash2: + sub edx,edi + mov [lpath],edi + mov [lpath_len],edx + dpd edx + .agg: + mov dword[Finfo],0 +; ud2 + jmp again;cmdl .yespar: cmp al,'N' jne .nonum @@ -291,7 +353,7 @@ macro CmdLine cmp al,'q' jne .noofs lodsd - .fofs: + .fofs: mov [arc_base],eax jmp .parse .noofs: @@ -299,7 +361,11 @@ macro CmdLine jne .noofs2 call get_6ASCII_num jmp .fofs - .noofs2: + .noofs2: + cmp al,'L' + jne .nolist + or [Flags],LIST_MODE + .nolist: jmp .parse get_6ASCII_num: @@ -319,8 +385,20 @@ get_6ASCII_num: } StartPad: - mcall 19,editorcmd,dumpfile +; mcall 19,editorcmd,dumpfile + pusha + mov esi,[outfile.size] +; dpd esi + mov [par_fsize],esi + mcall 19,editorcmd,editor_par + mov ecx,eax + mcall 5,20 + mcall 60,2,,[outfile.out];output + mcall 64,1,MEMINIT + popa ret editorcmd db 'TINYPAD ' +editor_par db '*' +par_fsize dd ? end if \ No newline at end of file diff --git a/programs/system/board/trunk/board.asm b/programs/system/board/trunk/board.asm index 5125d36707..6dfea2a995 100644 --- a/programs/system/board/trunk/board.asm +++ b/programs/system/board/trunk/board.asm @@ -5,9 +5,16 @@ ; ; Compile with FASM for Menuet ; +LMARGIN equ (15+5) +TMARGIN equ (35+5) +HSPACE equ 16 +VSPACE equ 12 +IPC_BUF equ 160 +DR_GRID equ 0;1 + +FL_KRNL equ 1 include 'lang.inc' -include 'macros.inc' use32 org 0x0 @@ -15,18 +22,20 @@ include 'macros.inc' dd 0x01 ; header version dd START ; start of code dd I_END ; size of image - dd 0x2000 ; memory for app (4 Kb) - dd 0x2000 ; esp + dd i_end+0x2000 ; memory for app (4 Kb) + dd i_end+0x2000 ; esp dd 0x0 , 0x0 ; I_Param , I_Icon - +include 'MACROS.INC' +include 'debug.inc' +purge newline MAXSTRINGS = 16 - -xpos dd 0x0 -ypos dd 0 - +TMP = 80*(MAXSTRINGS+1) START: ; start of execution + mcall 60,1,ipcbuff,IPC_BUF+20 + mcall 40,1000111b + mov [ipcbuff+4],8 mov ecx,1024 flush: mov eax,63 @@ -34,20 +43,21 @@ START: ; start of execution int 0x40 loop flush - mov ecx, 80*(MAXSTRINGS+1) + mov ecx, TMP xor eax, eax - mov edi, text + mov edi, [targ] rep stosb - mov [tmp],'x' + mov [tmp1],'x' + mov [tmp2],'x' mov eax,14 int 0x40 and eax,0xffff0000 - sub eax,400 shl 16 - add eax,400 + sub eax,399 shl 16 + add eax,399 mov [xstart],eax - + red: call draw_window still: @@ -62,53 +72,70 @@ still: je key cmp eax,3 ; button in buffer ? je button - + cmp eax,7 + je ipc mov eax,63 mov ebx,2 int 0x40 cmp ebx,1 jne still - + new_data: - + mov ebp,[targ] + .no4: cmp al,13 jne no13 - mov [xpos],0 + and dword[ebp-8],0 jmp new_check no13: cmp al,10 jne no10 - inc [ypos] - cmp [ypos],MAXSTRINGS - jbe noypos - mov [ypos],MAXSTRINGS - mov esi,text+80 - mov edi,text + inc dword[ebp-4] + cmp dword[ebp-4],MAXSTRINGS + jbe .noypos + mov dword[ebp-4],MAXSTRINGS + lea esi,[ebp+80] + mov edi,ebp mov ecx,80*(MAXSTRINGS) cld rep movsb - mov esi,[ypos] + mov esi,[ebp-4] imul esi,80 - add esi,[xpos] - add esi,text + add esi,[ebp-8] + add esi,ebp mov ecx,80 xor al,al rep stosb - noypos: + .noypos: + mov [targ],text2 + and [krnl_cnt],0 jmp new_check no10: - - mov esi,[ypos] - imul esi,80 - add esi,[xpos] - mov [text+esi],al - inc [xpos] - cmp [xpos],80 - jb xposok - mov [xpos],79 - xposok: + cmp ebp,text1 + je add2 + mov ecx,[krnl_cnt] + cmp al,[krnl_msg+ecx] + jne .noknl + inc [krnl_cnt] + cmp [krnl_cnt],4 + jne new_check + mov [targ],text1 + .noknl: + mov ebp,[targ] + jecxz .add + push eax + mov esi,krnl_msg + .l1: + lodsb + call add_char + loop .l1 + pop eax + .add: + and [krnl_cnt],0 + add2: + call add_char new_check: @@ -119,35 +146,126 @@ still: cmp ebx,1 je new_data + cmp [vmode],2 + je still call draw_window jmp still - - red: ; redraw - call draw_window - jmp still - + ipc: + mov [vmode],2 + mov eax,ipcbuff + mov esi,[eax+8] + mov byte[eax],1 + push dword[eax+12] + pop [dump_len] + mcall 9,work,-1 + mov ecx,eax + .lp: + mcall 9 + cmp [ebx+30],esi + je .ok + loop .lp + and [dump_len],0 + jmp red + .ok: + mov [pid],esi + lea esi,[ebx+10] + mov edi,dump_title+10 + mov ecx,12 + rep movsb + jmp red key: ; key mov eax,2 ; just read it and ignore int 0x40 + cmp ah,' ' + je button.no_krnl_flt + cmp [vmode],2 + jne still + cmp ah,176 ;left + jb still + cmp ah,179 ;right + ja still + mov ecx,[offs] + shr eax,8 + sub eax,176 + add ecx,[arrows+eax*4] + shl ecx,12 + shr cx,12 + jmp button.check_sel + .nol: jmp still +arrows dd -1,16,-16,1 + button: ; button mov eax,17 ; get id int 0x40 cmp ah,1 ; button id=1 ? - jne noclose + jne .noclose mov eax,-1 ; close this program int 0x40 - noclose: + .noclose: + shr eax,8 + cmp eax,10 + jb .nodump + lea edi,[eax-10] + mcall 37,1 + sub eax,[edi*4+dump_cell_marg] + sub eax,TMARGIN+VSPACE + push eax + and eax,0xffff + xor edx,edx + div word[edi*4+dump_cell_size+2] + mov ecx,eax + shl ecx,16 + xor edx,edx + pop eax + shr eax,16 + div word[edi*4+dump_cell_size] + mov cx,ax + .check_sel: + mov eax,ecx + shl ax,12 + shr eax,12 + inc eax + cmp eax,[dump_len] + ja still;.nosel + mov dword[sel_byte],ecx + dec eax + mov [offs],eax + jmp red + .nodump: + cmp eax,2 + jne .no_krnl_flt + xor [flag],FL_KRNL jmp still + .no_krnl_flt: + mov [ipcbuff+4],8 + and byte[ipcbuff],0 + inc [vmode] + cmp [vmode],3 + jb .vmok + and [vmode],0 + .vmok: + jmp red - - +add_char: + push esi + mov esi,[ebp-4] + imul esi,80 + add esi,[ebp-8] + mov [ebp+esi],al + inc dword[ebp-8] + cmp dword[ebp-8],80 + jb .ok + mov dword[ebp-8],79 + .ok: + pop esi + ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** @@ -170,7 +288,7 @@ draw_window: mov eax,0 ; function 0 : define and draw window ; mov ebx,50*65536+400 ; [x start] *65536 + [x size] mov ebx,[xstart] - mov ecx,MAXSTRINGS*10+40 ; [y start] *65536 + [y size] + mov ecx,MAXSTRINGS*10+45 ; [y start] *65536 + [y size] mov edx,[sc.work] ; color of work area RRGGBB,8->color gl or edx,0x03000000 int 0x40 @@ -184,9 +302,24 @@ draw_window: mov esi,header.len ; text length int 0x40 + mov ecx,4 + mov esi,[sc.work] + mov ebx,316 shl 16+5*6 + mov edx,3;+1 shl 30 + mcall 8,,<5,12> + mov edx,[vmode] + lea edx,[edx*4+duk] + mcall 4,<320,8>,,,4 + + cmp [vmode],2 + je no_mdbg mov ebx,15*65536+33 ; draw info text with function 4 mov ecx,[sc.work_text] - mov edx,text + mov edx,text1 + cmp [vmode],0 + je .kern + mov edx,text2 + .kern: mov esi,80 newline: mov eax,4 @@ -195,16 +328,199 @@ draw_window: add edx,80 cmp [edx],byte 'x' jne newline - + jmp enddraw + no_mdbg: + if DUMP_TEST eq 1 + mov esi,0 + mov [dump_len],100;IPC_BUF + else + mov esi,ipcbuff+16 + end if + mov ecx,[dump_len] + call dump_btn + call draw_dump + enddraw: mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw int 0x40 ret +if DR_GRID eq 1 +draw_grid: + mov ecx,11 + mov edi,(TMARGIN+VSPACE)shl 16+TMARGIN+VSPACE + .l1: + push ecx + mov ebx,LMARGIN shl 16+LMARGIN+16*HSPACE + mcall 38,,edi,0 + add edi,VSPACE shl 16+VSPACE + pop ecx + loop .l1 + mov ecx,17 + mov edi,(TMARGIN+VSPACE)shl 16+TMARGIN+VSPACE*10 + mov ebx,LMARGIN shl 16+LMARGIN + .l2: + push ecx + mcall 38,,edi,0 + add ebx,HSPACE shl 16+HSPACE + pop ecx + loop .l2 + ret +end if + +draw_numbers: + mcall 4,(LMARGIN+2) shl 16+180,0,numb,numb_len-numb + mov eax,dword[sel_byte] + shl ax,12 + shr eax,12 + mov edi,eax +if ~ DUMP_TEST eq 1 + add edi,ipcbuff+16 +end if + mov edx,(LMARGIN+2+6*6)shl 16+180 + mov ebx,0x30000 + movzx ecx,byte[edi] + mcall 47,,,,0x4e00e7 + add ebx,0x20000 + add edx,(6*10)shl 16 + movzx ecx,word[edi] + mcall + add ebx,0x50000 + add edx,(6*13)shl 16 + mov ecx,[edi] + mcall + mov ebx,0x80100 + add edx,(6*19)shl 16 + mcall +.ex: + ret + +draw_dump: +; esi - data ptr, ecx - length + jecxz draw_numbers.ex + pusha + call draw_numbers + mcall 4,(LMARGIN+2) shl 16+27,0,dump_title,dump_t_len-dump_title + mcall 47,0x30101,ipcbuff+8,(LMARGIN+2+6*29)shl 16+27 + add edx,(6*27) shl 16 + mov ecx,offs + mcall + sub edx,(5*6)shl 16 + mcall ,0x30001 + mov ecx,16 + mov edi,HSPACE shl 16 + mov ebx,(LMARGIN+5)shl 16+42 + call draw_marks + mov ecx,[esp+24] + dec ecx + shr ecx,4 + inc ecx + mov ebx,(LMARGIN-10)shl 16+TMARGIN+2+VSPACE + mov edi,VSPACE + call draw_marks + popa + mov edx,TMARGIN+2 + mov edi,ecx + .lp: + add edx,(LMARGIN+2) shl 16+VSPACE + mov ecx,16 + cmp edi,ecx + jae .less + mov ecx,edi + .less: + sub edi,ecx + push esi ecx + mov ebx,0x20100 + .lp1: + push ecx esi + movzx ecx,byte[esi] + mcall 47,,,,0 + add edx,HSPACE shl 16 + pop esi ecx + inc esi + loop .lp1 + pusha + mov ebx,edx + and ebx,0xffff + add ebx,(LMARGIN+16*HSPACE+15)shl 16 + mov edx,[esp+36] + mov esi,[esp+32] + mcall 4,,0 + popa + add esp,8 + and edx,0xffff + test edi,edi + jnz .lp +.ex: + ret + +draw_marks: +; ebx -xy, edi-addition, ecx -cycles + pusha + mov edx,__hexdigits + mov eax,4 + mov esi,1 +.tt: + push ecx + mcall ,,0xffffff + add ebx,edi + inc edx + pop ecx + loop .tt + popa + ret + +dump_btn: ; ecx-length + jecxz draw_dump.ex + pusha + test ecx,0xffff + je .even + add ecx,16 + .even: + shr ecx,4 + imul ecx,VSPACE + add ecx,(TMARGIN+VSPACE)shl 16-5 + mcall 8,LMARGIN shl 16+16*HSPACE-5,,10+3 shl 29,[sc.work] + inc edx + mcall ,(LMARGIN+16*HSPACE+15)shl 16+6*16 + mov edx,0xff0000 + mov esi,dump_cell_size + xor eax,eax + movzx ebx,[sel_byte] + lodsw + imul bx,ax + shl ebx,16 + lea ebx,[ebx+eax+LMARGIN shl 16] + movzx ecx,[sel_byte+2] + lodsw + imul cx,ax + shl ecx,16 + lea ecx,[ecx+eax+(TMARGIN+VSPACE) shl 16] + mcall 13 + movzx ebx,[sel_byte] + lodsw + imul bx,ax + shl ebx,16 + lea ebx,[ebx+eax+(LMARGIN+16*HSPACE+15)shl 16] + mcall 13 + popa +.ex: + ret + +krnl_msg db 'K : ' +duk db 'KernUserDump' +numb db 'Byte: Word: Dword: Hex:' +numb_len: +dump_title db 'Dump from (pid= h) Offset: ( h)' +dump_t_len: ; DATA AREA +dump_cell_marg dd LMARGIN shl 16,(LMARGIN+16*HSPACE+15)shl 16 +dump_cell_size dw HSPACE,VSPACE,6,VSPACE +; 11,11 > 0,-1 +; 5,11 > 0,-1 if lang eq ru header: db 'ДОСКА ОТЛАДКИ И СООБЩЕНИЙ' @@ -214,8 +530,27 @@ else db 'GENERAL DEBUG & MESSAGE BOARD' .len = $ - header end if + krnl_cnt dd 0 + vmode dd 0 + targ dd text2 I_END: - text rb 80*(MAXSTRINGS+1) - tmp db ? + offs dd ? + flag rb 1 + ipcbuff rb IPC_BUF+20 + rd 2 +; x1pos dd ? +; y1pos dd ? + text1 rb 80*(MAXSTRINGS+1) + tmp1 db ? + rd 2 +; x2pos dd ? +; y2pos dd ? + text2 rb 80*(MAXSTRINGS+1) + tmp2 db ? + work rb 4096 + sel_byte dw ?,? + pid dd ? xstart dd ? - sc system_colors \ No newline at end of file + dump_len dd ? + sc system_colors +i_end: diff --git a/programs/system/panel/trunk/@PANEL.ASM b/programs/system/panel/trunk/@PANEL.ASM index 4c20aad48a..f3b8dae12e 100644 --- a/programs/system/panel/trunk/@PANEL.ASM +++ b/programs/system/panel/trunk/@PANEL.ASM @@ -1982,7 +1982,7 @@ exec_fileinfo: end_name db '/RD/1/END',0 menu_name db '/RD/1/MENU',0 calendar_name db '/RD/1/CALENDAR',0 -sysmeter_name db '/RD/1/SYSMETER',0 +sysmeter_name db '/RD/1/GMON',0 dat_fileinfo: dd 0 diff --git a/programs/system/pic4/trunk/pic4.asm b/programs/system/pic4/trunk/pic4.asm index 1cf8924004..09cb29f3f9 100644 --- a/programs/system/pic4/trunk/pic4.asm +++ b/programs/system/pic4/trunk/pic4.asm @@ -107,29 +107,6 @@ still: jmp bg2 -set_default_colours: - - pusha - - mov eax,6 ; load default color map - mov ebx,defcol - mov ecx,0 - mov edx,-1 - mov esi,0x8000 - int 0x40 - - mov eax,48 ; set default color map - mov ebx,2 - mov ecx,0x8000 - mov edx,10*4 - int 0x40 - - popa - ret - -defcol db 'DEFAULT.DTP' - - check_parameters: cmp [I_Param],dword 'BOOT' @@ -137,7 +114,6 @@ check_parameters: ret @@: - call set_default_colours call load_texture mov eax,15 @@ -148,7 +124,8 @@ check_parameters: mov eax,15 mov ebx,5 - mov ecx,0x40000+1 + mov ecx,0x40000 ; <<< 0x40000 for blue, 0x40000+1 for red, + ; <<< 0x40000+2 for green background at boot mov edx,0 mov esi,256*3*256 int 0x40 @@ -308,7 +285,7 @@ gentexture: ylup: mov ebx,0 - call precalcbar +; call precalcbar xlup: push edi @@ -342,10 +319,10 @@ gentexture: mov eax,esi ; now evaluate color... - cmp eax,255*24 - jbe ok2 +; cmp eax,255*24 +; jbe ok2 ; imul eax,12 - ok2: +; ok2: mov edi,24 ; 50 = max shaded distance idiv edi @@ -376,21 +353,21 @@ wrappit: nowrap: ret -precalcbar: - pusha - mov eax,1 - mov ebx,ecx - add ebx,18 - mov ecx,44 - mov edx,0x00000060 - bar: - add ecx,2 - add edx,0x00020100 +;precalcbar: +; pusha +; mov eax,1 +; mov ebx,ecx +; add ebx,18 +; mov ecx,44 +; mov edx,0x00000060 +; bar: +; add ecx,2 +; add edx,0x00020100 ; int 0x40 - cmp ecx,298 - jb bar - popa - ret +; cmp ecx,298 +; jb bar +; popa +; ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ********* @@ -517,12 +494,7 @@ draw_window: mov ecx,(y_add2+40)*65536+14 ; button start y & size newcb: - push edx - sub edx,14 - shl edx,2 - add edx,colors - mov esi,[edx] - pop edx + mov esi,[(edx-14)*4+colors] mov eax,8 int 0x40 diff --git a/programs/system/vrr/trunk/vrr.asm b/programs/system/vrr/trunk/vrr.asm index a1e4373b11..2506917e26 100644 --- a/programs/system/vrr/trunk/vrr.asm +++ b/programs/system/vrr/trunk/vrr.asm @@ -11,15 +11,14 @@ use32 org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version dd START ; start of code dd I_END ; size of image - dd 0x5000 ; memory for app + dd 0x5000 ; memory for app dd 0x4ff0 ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon + dd 0x0 , 0x0 ; I_Param , I_Icon -include 'lang.inc' include 'macros.inc' START: ; start of execution @@ -204,7 +203,7 @@ dw_continue: mov eax,0 ; function 0 : define and draw window mov ebx,100*65536+400 ; [x start] *65536 + [x size] mov ecx,100*65536+200 ; [y start] *65536 + [y size] - mov edx,0x030020C0;0x00000040 ; color of work area RRGGBB,8->color glide + mov edx,0x020020C0;0x00000040 ; color of work area RRGGBB,8->color glide mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color glide mov edi,0x00ffffff ; color of frames RRGGBB int 0x40 @@ -212,7 +211,14 @@ dw_continue: ; WINDOW LABEL call print_my_title - + ; CLOSE BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(400-19)*65536+12 ; [x start] *65536 + [x size] + mov ecx,5*65536+12 ; [y start] *65536 + [y size] + mov edx,1 ; button id + mov esi,0x5599cc ; button color RRGGBB + int 0x40 + ; BUTTONS xor eax,eax mov edx,eax @@ -1016,7 +1022,7 @@ warning_window: warning_loop: mov eax,5 - mov ebx,10 + mov ebx,13 int 0x40 mov eax,11 int 40h