Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср ноя 21, 2018 12:59 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 73 сообщения ]  На страницу Пред. 1 2 3 4 5 След.
Автор Сообщение
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Ср мар 14, 2018 11:31 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 637
Проект прогрессирует :)
Педполагается ли и рабочий стол КолибриОС поддержать?

P.S. Cubeline у меня отображается медленно, в сравнении с KlbrnWin, а Invaders почему то не стартует.
У игры 2048 сообщение о атрибутах write памяти. Lode Runer стартует не в полном своём окне,
но это пока всё мелочи.


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 1:20 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
Kopa писал(а):
Cubeline у меня отображается медленно, в сравнении с KlbrnWin,
Чтобы проверить, в чём дело, собрал версию с DEBUG_OUTPUT с помощью make(debug).bat.
После запуска в консоли можно обнаружить
Код:
EIP    = $000001F2; EAX    = $0000001A; EBX    = $00000009; ECX    = $0190017C
EDX    = $00000014; ESI    = $00000000; EDI    = $00000000; EBP    = $0412FE68
ESP    = $0412FE30; EFLAGS = $00010202
!UNDEFINED!
Это вызов функции
Код:
{26.9}    Function  GetTickCount: Dword; StdCall; External 'KolibriOS';
которая сейчас не поддерживается(хотя добавить элементарно).
Kopa писал(а):
Invaders почему то не стартует
Как оказалась, современная версия требует libimg, а более старая не требует, она запускается
Вложение:
INVADERS [41.23 КБ]
27 скачиваний
Kopa писал(а):
Lode Runer стартует не в полном своём окне
Скорее всего, используется SetWindowPos, это сейчас тоже не поддерживается.


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 11:47 am 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 637
Вопрос,
Почему отдано предпочтение dll варианту кода программы? (в ReactOS, возможно, какие то проблемы связаны с ним при проверке работоспособности программ)

P.S. Какие шансы запустить эмулятор на не XP Windows.
Ещё, управление в игре Tetris несколько инерционно.


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 3:43 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 251
На Windows 7 x64 не работает, ReadFile error


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 7:12 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
Kopa писал(а):
Почему отдано предпочтение dll варианту кода программы?
Ответ вообще-то выше уже есть.
В первом сообщении viewtopic.php?f=37&t=3679#p70011
И в этом viewtopic.php?f=37&t=3679#p70077
Смысл копировать одно и тоже? Ну ладно:
Цитата:
Да, как видно, память чуть выше уже занята, и её использовать сейчас не получится
Цитата:
вот если бы можно было вставить в самое начало большой кусок ненужных данных или кода, которые можно было бы потом затереть...
Цитата:
компилятор позволяет собрать приложение с ImageBase = 64 K:
Цитата:
тогда можно сделать сам эмулятор как библиотеку и запустить её из приложения с ImageBase = 64K(сам этот загрузчик можно искусственно раздуть до нужных размеров, чтобы потом после запуска самого эмулятора можно было благополучно затереть), загрузить kex, проверить сколько реально нужно, ненужное освободить.
Цитата:
Сделал DLL-версию.
"Загрузчик", резервирующий 64 мегабайта памяти(константа MEM_SIZE в исходнике), загружается по адресу 64K.
С помощью VirtualProtect устанавливаются атрибуты PAGE_EXECUTE_READWRITE. После чего управление передаётся в Main, которая находится в DLL.
В дальнейшем "загрузчик" можно затереть кодом или данными загруженного KolibriOS приложения.


Kopa писал(а):
Какие шансы запустить эмулятор на не XP Windows.
pavelyakov писал(а):
На Windows 7 x64 не работает
Опять же, выше уже говорилось об этом.
И в первом сообщении
Цитата:
Обнаружил ограничения этого:
Цитата:
NULL page mitigations for Windows 8 (both x86 and x64), and even backported the mitigation to Vista+
и в этом viewtopic.php?f=37&t=3679&start=15#p70089
Цитата:
Насколько я смог нагуглить, это появилось в одном из обновлений безопасности на семёрке.
То есть, теоретически, на каких-то семёрках оно может работать.
Возможно на висте работает.
Мой вариант не использует SetLDTEntries, и, по идее(если я ничего больше не упустил :roll: ) должен на x64 тоже запуститься.
Хорошо бы проверить XP 64 bit, Vista 32 bit и 64 bit.


Но всё зависит от конечной цели.
Я так полагаю, эмулятор только ради эмулятора — это немного странная цель.
Если же цель — использование для разработки программ, то на период тестирования\отладки своей программы можно её скомпилировать не с "org 0", а, скажем с 'org 64K' и грузить эмулятором по этому адресу.

Сделал в связи с этим экспериментальную версию, позволяющую указать куда грузить: опция -base.
Также добавлено GetTickCount, Cubeline теперь должен работать правильно.

Вложение:
KEm.7z [44.39 КБ]
30 скачиваний


Но надо понимать, что делаешь, и на что это влияет.
Например, берём FREE3D04, указываем вместо org 0x0 другое значение(доступное для загрузки) org 65536.
Компилируем и грузим в эмуляторе, указав в командной строке
Цитата:
KEm -base 65536 FREE3D04


Проблемы могут быть при использовании абсолютных значений адресов.
Код:
               org    0x0

               db     'MENUET01'              ; 8 byte id
               dd     0x01                    ; header version
               dd     START                   ; start of code
               dd     I_END                   ; size of image
               dd     APP_MEM;0x100000        ; memory for app
               dd     APP_MEM;0x100000        ; esp
               dd     0x0 , 0x0               ; I_Param , I_Icon
Вместо вот этого
Код:
               dd     APP_MEM;0x100000        ; memory for app
               dd     APP_MEM;0x100000        ; esp
желательно делать(в 3dsheart примерно так и сделано)
Код:
               dd     I_END + нужное значение 
               dd     I_END + нужное значение       
Почему сейчас и так работает без этого? Потому что при загрузке резервируется целых 64 мегабайта памяти, сама KolibriOS, разумеется, так не делает, но этого вполне хватит, чтобы запустить и посмотреть, как оно выглядит.
Такой способ должен работать и в Win8 тоже.

Но мне всё равно остаётся интересно XP 64 bit, Vista 32 bit и 64 bit. :)


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 8:38 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 637
0CodErr писал(а):
Такой способ должен работать и в Win8 тоже.. :)


Да, проверил работает :)
указал в 3dsheart заголовке при сборке такие значения
Код:
                    org 65536

                   dd     I_END+ 100000
                   dd     I_END+ 100000       


P.S. При перемещении демо-сердца заметил, что текстовая информация исчезла.
Вложение:
3dsheart [49.55 КБ]
27 скачиваний

для запуска
Код:
 kem -base 65536 3dsheart


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 9:32 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
Kopa писал(а):
dd I_END+ 100000
Там + 100000 не обязательно, главное, чтобы это было относительное значение, но некоторые пишут абсолютное mem dd 100500
Kopa писал(а):
P.S. При перемещении демо-сердца заметил, что текстовая информация исчезла.
Да, было при изменении размеров, но это не связано со способом запуска -base 65536. В предыдущих версиях эмулятора так же.
Kopa писал(а):
У игры 2048 сообщение о атрибутах write памяти.
Там вызывается неподдерживаемая SysFn70, происходит работа с файлом 2048.dat.


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 9:32 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 251
org 65536
kem -base 65536 3dsheart
Вот так работает в Windows 7 x64
Вот если бы еще решить вопрос со смещением, то цены бы не было))


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Чт мар 15, 2018 10:14 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 637
pavelyakov писал(а):
Вот если бы еще решить вопрос со смещением, то цены бы не было))

И таким способом можно использовать софт из KolibriOS в разных Windows + какой то "функционал" из возможностей самой Windows. В таком варианте может оказаться полезным загрузка несколько "утилит' по разным адресам.
Отлаживать можно под какими нибудь Windows отладчиками.
Почти ОС внутри ОС. :) Антивирусам прибавится работы.

P.S. Только добавить поддержку значимых API из KolibriOS. Может добавится и улучшится софт для КолибриОС.
А CPUID или PCIDEV заработают?


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Пн мар 19, 2018 5:56 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
0CodErr,
Если адрес загрузки теперь можно указать в параметрах эмулятора, то может быть, вместо нуля надо написать адрес исполняемого файла?
Код:
Function  GetThreadInfo(Slot: Dword; Buffer: PThreadInfo): Dword;

...

          MemAddress   := 0;


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Вт мар 20, 2018 1:10 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
akron1, трудно сказать, как правильно.
В настоящей KolibriOS всегда грузится в 0.
Но даже если указать реальный адрес загрузки, то он всё равно мало что даст приложениям(насколько знаю, ни одно приложение не использует это значение, разве только tinfo, но лишь для вывода его на экран, не более).
Хотя формально, наверное, ты всё-таки прав :)
Kopa писал(а):
Отлаживать можно под какими нибудь Windows отладчиками.
Да, один из плюсов, кстати.
Kopa писал(а):
А CPUID или PCIDEV заработают?
CPUID — должен, там ведь используется инструкция процессора cpuid. Хотя и не только.
С PCIDEV ситуация сложнее.

Есть некоторое различие при субпиксельном(fontSmoothing: Byte = 2; ) сглаживании:
Вложение:
difference.PNG
difference.PNG [ 957 байт | 1201 просмотр ]
Верхняя(KolibriOS) и нижняя(эмулятор) строки действительно отличаются.
Несмотря на то, что основной цвет передаётся верный(перед передачей происходит преобразование rgb2bgr), цвет сглаживания рассчитывается внутри самой функции dtext в соответствии с правилами KolibriOS.
Думаю, надо сделать rgb2bgr где-то внутри dtext.

Вообще, иногда бывает и при обычном сглаживании небольшие проблемы, например, цвет сглаживания становится темнее, чем нужно.
Где-то на форуме встречались сообщения про похожую проблему в самой KolibriOS.
Вроде бы у меня все необходимые регистры сохраняются, пробовал даже флаги сохранять.
Если только хитрым образом пишется\читается ещё в какой-нибудь [esp + ...] ?
Не исключено, что проявляется баг в самом алгоритме отрисовки текста(но я ничего не утверждаю).

Есть намного поменьше проект DrawText.
Только использование одной функции вывода текста средствами WinAPI.
Я им пользовался на период отладки функции.
Просто выводится в окно текст:
Спойлер: Показать
Вложение:
scr.PNG
scr.PNG [ 8.78 КБ | 1201 просмотр ]

Там в коде не убрано, но если кому интересно:
Вложение:
DrawText_MT.7z [27.46 КБ]
26 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Вт мар 20, 2018 4:06 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
0CodErr
Это я, собственно, вот к чему: я немного модифицировал компилятор oberon-07, чтобы получить исполняемый файл с базовым адресом 64 Кб, который теоретически можно выполнить в твоем эмуляторе под Win8.1-64. HelloWorld запустился (!), но для чего-то более серьезного, в эмуляторе еще не хватает многих функций. Тут я вспомнил, что от адреса загрузки зависит еще кое-что:
Код:
PROCEDURE GetCommandLine*(): INTEGER;
VAR param: INTEGER;
BEGIN
  sys.GET(28, param)
  RETURN param
END GetCommandLine;

Программа считывает адрес строки параметров по адресу 28, так как считается, что файл всегда грузится в 0.
Поэтому, приложению может быть полезно знать адрес своего заголовка:
Код:
PROCEDURE GetCommandLine*(): INTEGER;
VAR param: INTEGER;
BEGIN
  sys.GET(28 + AppAdr(), param)
  RETURN param
END GetCommandLine;

Да, параметры в эмуляторе сейчас не работают, но...


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Вт мар 20, 2018 8:57 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
akron1 писал(а):
от адреса загрузки зависит еще кое-что
Да, есть нюансы.
Но в ассемблерных программах некоторые делают так(из heed.asm):
Код:
   db   'MENUET01'
   dd   0x1
   dd   START   ;program start
   dd   I_END   ;program image   size
   dd   (D_END+0x600) and not 3   ;required amount of memory
   dd   (D_END+0x600) and not 3   ;stack
   dd   fname_buf
   dd   cur_dir_path
........................................................
START:
........................................................
mov   esi,fname_buf
........................................................
cmp   [fname_buf],byte 0
........................................................
mov   esi,cur_dir_path
........................................................
I_END:
........................................................
cur_dir_path   rb 4096
........................................................
fname_buf:
   rb 4096
........................................................
D_END:
а некоторые так:
Код:
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd START
program.end    dd END
program.memory dd END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.stack  dd END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.params dd END + PATH_SIZE
program.path   dd END
........................................................
START:
........................................................
        mov    esi, [program.path]
........................................................       
        cmp      [program.params], byte 0
........................................................
END:
В линкер-скриптах для GNU линкера LD тоже можно определять свои символы, например здесь END и $END:
Код:
SECTIONS
{
  .all : AT(0){
    LONG(0x554e454D);
    LONG(0x31305445);
    LONG(1);
    LONG("Main");
    LONG(END);
    LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
    LONG($END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
    LONG($END + PATH_SIZE);
    LONG($END);
    *(.text)
    *(CONST)
    *(CONST2)
    *(.data)
  }
END = .; 
  .bss ALIGN(16) : {*(.bss)}
$END = .;
}


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Ср мар 21, 2018 11:36 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
Проект DrawNumber, похожий на предыдущий DrawText viewtopic.php?t=3679&p=70165#p70165
Спойлер: Показать
Вложение:
scr.PNG
scr.PNG [ 12.1 КБ | 1107 просмотров ]
Хотя KolibriOS.lib сейчас не содержит функции DrawNumber, но здесь она реализована :)
Эта функция принимает значения Flags такие же, как и DrawText, но кроме этого ещё есть Params.
Думаю, теперь можно добавить в эмулятор и эту функцию тоже.
Вложение:
DrawNumber_MT.7z [29.76 КБ]
27 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: Эмуляция KolibriOS API
СообщениеДобавлено: Пт мар 23, 2018 2:08 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
Начал делать поддержку файловых функций.
Сейчас поддерживаются только указатели на имя файла.
Имена непосредственно в структурах не поддерживаются.
Также не поддерживаются относительные пути.
Но обычно программы используют как раз относительные пути.
Однако тестовые примеры(с указателями) работали.

Добавил загрузку библиотек.
Некоторый код был взят из KlbrInWin.
Валидации COFF сейчас нет, но можно взять нужный код из проекта CoffDump viewtopic.php?f=9&t=3577
Работает программа h2d2b, использующая EditBox из box_lib.
Можно вводить числа и по нажатию клавиши Enter получать результат.
Также работает RUN(она тоже использует EditBox из box_lib).
Можно ввести имя программы(например, /sys/calc) и запустить её клавишей Enter.
Большинство других программ помимо библиотек используют неподдерживаемые возможности файловых функций, поэтому такие программы вылетают.

Для сборки сейчас есть три варианта:
  • make.bat — обычное исполнение программы
  • make(debug).bat — с выводом информации о регистрах и параметрах системных функций в консоль.
  • make(debug_by_step).bat — выполнение останавливается на каждой системной функции, информация также выводится в консоль, чтобы продолжить выполнение нужно в консоли нажать Enter.

Сейчас можно задать соответствие файловых путей Windows и KolibriOS.
При запуске создаётся такой ключ реестра(если он ещё не был создан):
HKEY_LOCAL_MACHINE\Software\KEm(KolibriOS API Emulator)\Partitions
В качестве параметров — пути KolibriOS, в качестве значений — пути Windows.
Чтобы сопоставить пути нужно задать нужные значения для соответствующих параметров.
У меня вот так:
Спойлер: Показать
Вложение:
registry.PNG
registry.PNG [ 8.41 КБ | 1076 просмотров ]
0CodErr писал(а):
Kopa писал(а):
P.S. При перемещении демо-сердца заметил, что текстовая информация исчезла.
Да, было при изменении размеров
Проявляется обычно так: засунуть окно под другое окно, взять за заголовок и не отпуская вытащить из-под другого окна.
Но если просто активировать окно кликом мыши, то оно перерисовывается.
Скорее всего в этот момент WM_PAINT отправляется напрямую в оконную процедуру, минуя очередь сообщений.
Соответственно, это сообщение не отлавливается в GetMessage\PeekMessage.
Надо, вероятно, добавить обработку WM_PAINT в оконной процедуре(делать UpdateWindow).

При запуске программы если необходимо, то копируются переданные параметры командной строки и путь к программе.
Но только если этот путь имеет соответствие(KolibriOS <-> Windows) в реестре. Иначе не копируется.
GetThreadInfo теперь пишет в MemAddress адрес загрузки.
Теперь работает SetWindowPos, например, в cubeline по клавише F, в heliothryx в settings(x1, x2, x3).

Теперь, кстати, можно поиграть в 2048 :)
Вложение:
KEm.7z [52.22 КБ]
34 скачивания


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 73 сообщения ]  На страницу Пред. 1 2 3 4 5 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB