Код для преобразования данных.

Applications development, KoOS API questions
  • Leency wrote:Может быть, как это сделать?
    Надо вызывать ф.30.1 когда меняется текущая директория.
  • Leency
    Текущий рабочий каталог определяется через 30.1 и устанавливается через 30.2
    Это не то же, что путь к исполняемому файлу.
  • В первый раз слышу)) А на что этот каталог влияет?
    Из хаоса в космос
  • Leency wrote:В первый раз слышу)) А на что этот каталог влияет?
    В ф.70 вызов файла без пути "/"? например просто filename.kex, приводит по умолчанию к обращению /rd/1/filename.kex - если же установить другой путь ф. 30, например /pathname, то при обращении просто filename.kex будет происходить обращение /pathname/filename.kex на уровне драйвера файловой системы.

    Другими словами часть головной боли прикладного программиста перекладывается на драйвер файловой системы, хотя с точки зрения производительности дисковой операции ничего не меняется. Это просто удобство, типа макроса mcall вместо int 0x40, для сравнения.
  • Ясно, спасибо.
    Из хаоса в космос
  • johnfound wrote:Кстати, сделал в FreshLib, чтобы программа устанавливала текущую директорию там где находится исполнимый файл.
    И возникает вопрос - а не лучше ли это сделать в ядре?
    Версии под Windows и Linux делают так же?

    Текущая директория предназначена не для программы, а для пользователя. Чтобы пользователь мог запустить команду fasm example.asm bin/example вместо fasm /absolute/path/to/example.asm /absolute/path/to/bin/example. Упражнение на понимание: что будет с первой командой, если fasm первым делом будет менять текущую директорию на папку с бинарником, а потом открывать и создавать файлы?
    Сделаем мир лучше!
  • CleverMouse, теперь ясно, что надо менять файловые менажеры и shell, чтобы они правильно устанавливали текущую директорию. Конечно, я этот код не буду включать в библиотеку.
  • Я только что сделал очень плохую имитацию таймеров:

    Code: Select all

    proc __TimerThreadProc
    begin
    .main_timer_loop:
            cmp     [__timer_stop], 0
            jne     .end_thread
    
            mov     eax, 5
            mov     ebx, 1
            int     $40
    
    ; do something on every 10ms :D
    
            jmp     .main_timer_loop
    
    .end_thread:
            mov     eax, -1
            int     $40
    endp
    Можно ли сделать лучше и как?
    Мне необходимо чтобы вызывалась некоторая процедура каждые 10мс, независимо от время выполнения этой процедуре. (конечно время должно быть меньше 10мс).
  • лучше использовать ф 68.1
  • Хм, а как собственно сделать так что поток получит управление ровно 10мс после этого? Или проверять ф.26.9?
  • Наконец сделал и получилось как всегда неплохо. :) Использую ф.26.9 для измерение времени и ф.68.1 чтобы разгружать процессор. Процедура таймера будет вызываться всегда правильное количество раз, даже и если поток не сумел вовремя исполнится:
    Spoiler:

    Code: Select all

    proc __TimerProc
    begin
    
            mov     eax, sys_getsetup
            mov     ebx, 9
            int     $40
            mov     edi, eax
    
    .main_timer_loop:
            cmp     [__timer_stop], 0
            jne     .end_thread
    
            mov     eax, sys_getsetup
            mov     ebx, 9
            int     $40
    
            cmp     edi, eax
            jne     .process_timers
    
            mov     eax, sys_f68
            mov     ebx, 1
            int     $40
            jmp     .main_timer_loop
    
    .process_timers:
            mov     ebx, eax
            sub     ebx, edi
            imul    ebx, __sys_time_slice
            mov     edi, eax
    
            lea     eax, [__ptrFirstTimer]
    
    .loop:
            mov     eax, [eax+TTimer.next]
    .loop2:
            test    eax, eax
            jz      .main_timer_loop
    
            test    [eax+TTimer.flags], tmfRunning
            jz      .loop
    
            mov     ecx, [eax+TTimer.value]
            add     ecx, ebx
            mov     [eax+TTimer.value], ecx
    
            cmp     ecx, [eax+TTimer.interval]
            jl      .loop
    
    .exploop:
            inc     [eax+TTimer.Expired]
    
            mov     ecx, [eax+TTimer.interval]
            sub     [eax+TTimer.value], ecx
            cmp     [eax+TTimer.value], ecx
            jge     .exploop
    
            cmp     [eax+TTimer.Callback], 0
            je      .end_event
    
            mov     ecx, [eax+TTimer.flags]
            and     ecx, $0f
            cmp     ecx, tmfDoNothing
            je      .end_event
    
    ; call the callback procedure.
    .execloop:
            pushad
            stdcall [eax+TTimer.Callback], eax
            popad
    
            sub     [eax+TTimer.Expired], 1
            jg      .execloop
    
    .end_event:
            test    [eax+TTimer.flags], tmfSyncDestroy
            jz      .loop
    
            push    eax
            mov     eax, [eax+TTimer.next]  ; after the destruction, this pointer will be lost.
            stdcall TimerDestroy ; pointer from the stack.
            jmp     .loop2
    
    .end_thread:
            mov     [__timer_stop], 0
            mov     eax, sys_end
            int     $40
    endp
  • Начал юзать 30.1, потом переделаю свои проги под неё.
    Из хаоса в космос
  • Who is online

    Users browsing this forum: No registered users and 2 guests