А как грамотней организовать доступ к библиотеке?
я вижу три варианта :
1.В начале либы пачка JP
2.Передавать номер функции через регистр
3.Номер функции в следующем байте после CALL
А как грамотней организовать доступ к библиотеке?
я вижу три варианта :
1.В начале либы пачка JP
2.Передавать номер функции через регистр
3.Номер функции в следующем байте после CALL
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Мой тебе совет - забей с либами для ZX-a, и линкуй "руками" сразу компилируя под фиксированные адреса.
Потому-что:
1. либы сохраняют место на диске (но по факту сейчас нет проблем с нехваткой места на диске);
2. либы сохраняют место в памяти (но только если система может грузить сразу более одного приложения, по факту для классического спекки это не актуально);
3. либы могут настраиваться на адреса куда они загруженны и позволять делать всякие трюки с релокацией для управления свободной памятью (это для спекки не актуально изза того что алгоритм автоматического распределения памяти сам по себе требует кучу места для для своих кода и данных, короче для спекки он сильно жирный);
4. либы можно поставлять в бинарнике и просто использовать не парясь с компиляцией (это типа удобно но имея либу в исходнике можно ее подхачить легко что более важно!)
ну и это еще не все... это так на вскидку написал
Для большего понимания предложенной мной архитектуры проги я тут примерно интерфейс kernel-a выложу:
/* тут лежит номер текущей, включенной в адресное пространство страницы
в системных переменных басика 128 есть этот байт можно его использовать */
BYTE currenPageNumber;
/* эта функция должна: включить pageNumber, провести операцию обмена содежанием
между областями памяти address1 и address2 длинна блока lenght, включить обратно
currenPageNumber */
void swapDataBlock(BYTE pageNumber, SHORT address1, SHORT address2, SHORT lenght);
/*эта фукция для перехода на код в другой странице, включает pageNumber, обновляет
currenPageNumber, делает jp на address1*/
void jmpFar(BYTE pageNumber, SHORT address1);
/*эта функция для call-a на код в другой странице, включает pageNumber, обновляет
currenPageNumber но сохраняет старое значение у себя на стеке, делает call на address1
по возврату ставит старое значение pageNumber и делает ret*/
void callFar(BYTE pageNumber, SHORT address1);
/*это обработчик int-a, запрещает прерывания, включает нужную сраницу где находится код обработки прерывания но сохраняет старое значение на стеке, вызывает обработчик, после возврата высталяет старый pageNumber разрешает прерывания делает reti*/
void intHandler();
Последний раз редактировалось bigral; 26.07.2011 в 12:02.
128 нелья назвать лучшей концепцией развития Спека, но время вспять не повернуть - что получилось, то и стало Спектрумом128, т.е. стало стандартом Спектрума128, от которого пошли другие клоны
. ПентЭво к этому никакого отношения не имеет, т.к. является клоном АТМ.
ВМ в основном предназначались для спековского софта, т.к. он не может нормально работать под классической ОС. Весь остальной софт не имеет таких ограничений и должен будет работать исключительно из под ОС с софтовой многозадачностью.
такая возможность предусмотрена
просто ради интереса:
1. когда придет нми - адрес возврата упадет в стек, регистры надо сохранить куда-то. а если нельзя стек портить?
2. как работать с дисководом/магнитофоном, которые требует полный реалтайм? цифровой звук? тут разделение работы вм во времени не покатит.
DimkaM, Если хочется, как у людей, то "Linkers and loaders".
Если изобретать собственный велосипед, то придётся много думать. Потому как для существования библиотек нужно существование формата исполняемых файлов, а загружать их должна хоть прото-, но ОСь.
А без виртуальной памяти(окно пока не в счёт) и с ограниченным адресным пространством проблем вообще куча выходит.
---------- Post added at 14:11 ---------- Previous post was at 14:09 ----------
Ну в таких случаях обычно подставляют в адресное пространство "системную" память.
а голова зачем? Никто не заставляет всё запускать обязательно в реалтайме
А зачем это делать в реалтайме? Кроме того, при создании ВМ, ей сразу задаются её права на неразделяемые ресурсы. Поэтому пользоваться каждым неразделяемым ресурсом в реалтайме сможет только одна адача, для которой этот ресурс разрешён.
это понятно. вы выше хотели нми не кратный инту. допустим, вы не попортили стек, но чтобы все работало без глюков, восстановить контекст нужно будет точно там, где он был сохранен (время относительно инта). и речь даже не о мультиколорах. геморрой, да и только
причем реалтайм, когда речь шла про инт?
а каким образом ты будешь грузиться с ленты НЕ в реалтайме? там тормозить нельзя, любой нми нафиг собьет синхронизацию. или как это обойти-то?
Вообще-то и с дисковода тоже надо успевать прочитывать регистр пока трек разматывается (хотя времени для маневра конечно несколько больше).
Вопрос в другом - а кому нужны все эти магнитофоны, дисководы? Равно как и софт, съедающий все такты и критичный к порче стека, и все лишь для вращения кубика и скролла с факами?
Как я понимаю, концепция строго противоположная строительству "парусника в бутылке" - т.е. демоделанию.
---------- Post added at 15:29 ---------- Previous post was at 15:21 ----------
Посмотрите как это реализовано в Uzix (подобно же и реализовано). Там тоже диспетчер системных вызовов с номерами функций, система передачи параметров в регистрах, и, кстати, весь LIBC есть в исходниках, и не только libc. Не обязательно же гнаться за многозадачностью, а идеи - они и в Африке...
С многобанковостью есть одна единственная закавыка - как обрабатывать память в другой странице, на которую передан указатель. Медленно (через копирование), или подгонять сегмент данных (чтобы гарантированно попадало в окно диспетчера, но тут надо писать свой компилятор) или как-то еще? Аналогично и со стеком (если пишем на С). Или вообще не использовать передачу указателем (чему, кстати, удовлетворяет большинство вызовов LIBC)?
Я для себя так и не решил.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)