DLL для Спринтера (LIBMAN)

Компьютер "Спринтер" http://sprinter.nedopc.org

Moderator: Shaos

Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: DLL для Спринтера (LIBMAN)

Post by Sayman »

Свободные места для расположения всяких хуков:

Code: Select all

;RST 10h
		jp sys			; вектор ДОС-а
		ds 0x18-$, -1		;свободно

;RST 20h, заглушка
		jp empty__		;свободно
		ds 0x28-$, -1		;свободно


;RST 28h, свободный
		jp empty__		; заглушка, свободно
		ds 0x30-$, -1		;свободно
загрузка либ можно пока оставить на system.exe, а вот L_CALL, L_INFO и L_FREE можно скрыть под досом, в 0м окне. чтобы корректно вылетать из них в либу, можно использовать стэк, с адреса 0x10 в странице с вызывалкой либы (L_CALL, L_INFO и L_FREE) поставить возврат страницы с досом. Либман в шелле может узнать эту страницу через In a,(0x82) и подставив в возвратную процедуру ld a,dss_page:out (0x82),a. следующим байтом будет стоять ret который откинет нас в страницу и адрес с либой. конечно, она должна быть предварительно уже включена, с запоминанием страницы юзера. и т.д.
но это всё, конечно, будет накладывать лишний тормоз. но это пока... мы же пока тренируемся)))
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: DLL для Спринтера (LIBMAN)

Post by Shaos »

да я уже примерно разметил где там код раскидать между #0020 и #002F
щас простой тест напишу, чтобы проверить, что на лету по живому коду можно страницами ОЗУ щёлкать
Я тут за главного - если что шлите мыло на me собака shaos точка net
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: DLL для Спринтера (LIBMAN)

Post by Sayman »

а у меня вопрос возник - получается, либы закрыты в рамки одного окна? если какая-то либа будет большой, как тогда она будет погружаться? например. оконная либа, всяко уплывёт за пределы 16к.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: DLL для Спринтера (LIBMAN)

Post by Shaos »

Sayman wrote:а у меня вопрос возник - получается, либы закрыты в рамки одного окна? если какая-то либа будет большой, как тогда она будет погружаться? например. оконная либа, всяко уплывёт за пределы 16к.
Должен быть механизм самодокачки как с EXE (другой вопрос, что сейчас этот механизм в либмане сломан т.к. регистр A перетирается при вызове L_CALL из L_LOAD - надо пофиксить). Для либмана все точки входа либы будут в одной странице, а большая либа сама будет знать сколько у неё ещё страниц и что с ними делать.

Кстати вполне возможно существование DLL-ек чисто состоящих из одних данных, которые могут открываться в любом окне и не требует релокации - для них обязательные функции 0 и 1 будут содержать XOR A и RET, а всё остальное будут данные, к которым можно получить полный доступ через будущий вызов L_FREEZE. Плюс такого способа хранения данных - они будут храниться на диске в сжатом виде (сейчас сжимаются только последовательности нулей, однако в будущем возможны другие варианты компресси, например SHAFF). Чтобы не путать никого, у таких файлов расширение вместо .DLL можно сделать .DLD ( Dynamically Loaded Data ; )
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: DLL для Спринтера (LIBMAN)

Post by Shaos »

Вот нашёл в архивах кусок моей беседы про DLL на Спринтере предположительно с Горячевым в июне 2002:

Code: Select all

> Формально exe-формат это совмещение кода библиотеки и ее инсталятора

проще сделать отдельно библиотеку и инсталятор в виде exe - так мы сможем
избежать путаницы

> Ну если встраивать в систему механизм библиотек, то и управлять ими
> должна система

когда система сможет ими управлять? тогда, когда выйдет новая версия,
а предварительную поддержку внутри приложений я могу сделать за один вечер

> библиотеки будут занимать около 16Kb и здесь хватить экономии в пределах
> страниц

Библиотека размером 16К - это ОЧЕНЬ большая библиотека (конечно же в понятиях z80 :)
Достаточно сказать, что программа на ассемблере, размером 3 тысячи строк
компилируется в код размером порядка 5-6 килобайт. Так что без перемещаемости
не обойтись!

> Предлагаю вариант, при котором можно будет
> сообщить системе являеться ли код библиотеки
> перемещаемый или же нет

Перемещаемым - однозначно! даже если она будет занимать ровно 16К и будет
открываться в окне #C000, все равно, рано или поздно, появится необходимость
открыть ее где-нибудь в другом месте - #4000 например. Перемещаемость это даст.
Причем код привязывается к адресам при загрузке - это не сильно напрягает
процессор. Напомню, что наиболее часто используемым способом перемещаемости
на i8080-z80 (начиная с CP/M-80) является так называемая BitMap таблица,
которая занимает 1/8 от размера кода - по одному биту на байт и определяет
какие байты должны быть смещены при смещении блока кода в памяти.

> Также есть идея указывать может ли библиотека быть shared

Разделяемость библиотеки влечет за собой много накладных расходов по контролю
непересекаемости блоков данных для разных вызовов и т.д. Проще загрузть
несколько библиотек со своими статическими данными. Хотя такой контроль
можно отнести на саму библиотеку и, действительно, взвести соответствующий
флажок в атрибутах, чтобы система не расходовала память попусту.

> это требует более конкретных примеров с исходными кодами 

пример - выделение арифметических операций, например с фиксированной точкой
произвольной точности (FRACTALS.EXE), в отдельную библиотеку.
Это было за пару дней до выхода LIBMAN версии 0.0
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: DLL для Спринтера (LIBMAN)

Post by Shaos »

Что-то я подумал, что целый RST либману ненужен - я могу также легко и непринуждённо поставить точки входа в либман на свободные функции DSS, например #Dx:

#DA - DLL_FREEZE
#DB - DLL_UNFREEZE
#DC - DLL_INFO
#DD - DLL_CALL
#DE - DLL_LOAD
#DF - DLL_FREE

А вот RST #20 можно отдать под эксперименты с кооперативной многозадачностью, а RST #28 под брекпоинты в отладчике...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: DLL для Спринтера (LIBMAN)

Post by Sayman »

Shaos wrote:Что-то я подумал, что целый RST либману ненужен - я могу также легко и непринуждённо поставить точки входа в либман на свободные функции DSS, например #Dx:

#DA - DLL_FREEZE
#DB - DLL_UNFREEZE
#DC - DLL_INFO
#DD - DLL_CALL
#DE - DLL_LOAD
#DF - DLL_FREE

А вот RST #20 можно отдать под эксперименты с кооперативной многозадачностью, а RST #28 под брекпоинты в отладчике...
хочешь свой вариант доса выпустить? в 1.62 ты никак не воткнёшь, законно конечно. а потом выходит 1.63 или что там дальше будет. там тоже адреса съедут. опять рыскать и править будешь? занимай #20 пока есть...
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: DLL для Спринтера (LIBMAN)

Post by Shaos »

Sayman wrote:хочешь свой вариант доса выпустить? в 1.62 ты никак не воткнёшь, законно конечно. а потом выходит 1.63 или что там дальше будет. там тоже адреса съедут. опять рыскать и править будешь? занимай #20 пока есть...
Найти таблицу не проблема - я же уже описывал алгоритм - трассируем с адреса #10 и ищем подпрограмму перепрыга
Свой вариант доса выпустить не хочу - хочу уметь цепляться к любой версии доса
А #20 я тоже займу - не волнуйся :mrgreen:
Я тут за главного - если что шлите мыло на me собака shaos точка net