PDA

Просмотр полной версии : Estex API



Smalovsky
11.07.2021, 17:00
Есть ли описание функций естекса? Надо бы знать на будущее для написания игрушки.

Shaos
12.07.2021, 01:52
Я вот тут давал кое-какие линки: https://zx-pk.ru/threads/33340-rabota-s-obychnoj-sprinterovskoj-grafikoj-(i-hello-world).html

В частности вот:


Функции DSS v1.60 и выше: https://web.archive.org/web/20030820211758/http://www.petersplus.com/sprinter/dsslist1_60.htm

Функции BIOS v3.00 и выше: https://web.archive.org/web/20030820212547/http://www.petersplus.com/sprinter/bioslist.htm

Работа с Акселератором: https://web.archive.org/web/20030815191337/http://www.petersplus.com/sprinter/accel.htm

Smalovsky
12.07.2021, 17:08
Shaos, ух... на английском. Долго ковыряться...

Shaos
12.07.2021, 19:12
Есть старая документашка на русском, но там могут быть ошибки - я больше верю англоязычному варианту ;)

Smalovsky
19.07.2021, 15:56
Shaos, возник вопрос по Memory Management Functions.
Что такое memory block handle? Индекс блока?
В блоке номера страниц свои абстрактные от 0 до n? А как узнать из системы номера свободных физических страниц?

Shaos
19.07.2021, 20:37
> А как узнать из системы номера свободных физических страниц?

ну тут принято просить память у системы - тебе надо N страниц по 16кб - выделяешь столько через систему и потом берёшь у неё список физических номеров выделенных блоков, с которыми далее и работаешь (т.е. нет такого типа "дайте номера свободных" - есть "дайте сколько надо").

> Что такое memory block handle? Индекс блока?

Это идентификатор памяти, запрошенной у системы - он используется для обращения к отдельным страницам этой памяти по индексу через DSS.

P.S. Список страниц через биос забирается (см. 0C5h - EMM_FN5), а так можно всё через DSS API делать не заморачиваясь с физическими номерами страниц - типа:


ld bc,033Dh ; allocate 3 pages
rst 10h
jr c,error
ld (handle),a
ld bc,003Bh ; page #0 to window 3
rst 10h
jr c,error

Smalovsky
21.07.2021, 17:20
Shaos, получается, блок выделяем через ОС, а физические номера страниц блока узнаём через БИОС?
Для хорошей игры надо бы иметь все 4 окна в памяти, и это значит, что к обращение к ОС будет затруднительно, поэтому лучше работать с физическими страницами, а не с логическими через ОС.
Как использовать все 4 окна в памяти не мешая ОС? То есть как используя все 4 окна для своей программы вызвать функцию ОС? Что там надо - вернуть системную страницу в нулевое окно и восстановить системный стек?

Shaos
21.07.2021, 19:25
можешь исходники поглядеть DSS - все эти вызовы затем перевызывают BIOS - можно и только через биос с аллокациями работать:
https://gitlab.com/sprinter-computer/dos/-/tree/v1.60R
для обращения к биос надо в своём нулевом окне поставить небольшую программку в определённых адресах - она будет переключать ОЗУ на ПЗУ при передаче управления и возвращать всё обратно при возвращении

Sayman
21.07.2021, 20:01
Shaos, получается, блок выделяем через ОС, а физические номера страниц блока узнаём через БИОС?
Для хорошей игры надо бы иметь все 4 окна в памяти, и это значит, что к обращение к ОС будет затруднительно, поэтому лучше работать с физическими страницами, а не с логическими через ОС.
Как использовать все 4 окна в памяти не мешая ОС? То есть как используя все 4 окна для своей программы вызвать функцию ОС? Что там надо - вернуть системную страницу в нулевое окно и восстановить системный стек?

а в чём сложность?
вызвать ОС для запроса нужного кол-ва страниц.
вызвать БИОС для декодирования (получения) полученного ИД в номера страниц.
запомнить страницу окна0 в переменную.
включить туда нужную страницу.
при необходимости повторного обращения к ОС, обменять текущее значение окна0 на значение из переменной. отработав, вернуть туда свою страницу.
при выходе из программы, восстановить страницу Ос из переменной в окно0, сделать ld bc,0x0041:rst 0x10:jp $ (глюкоуловитель).
ничего сложного.

Smalovsky
25.07.2021, 11:23
для обращения к биос надо в своём нулевом окне поставить небольшую программку в определённых адресах - она будет переключать ОЗУ на ПЗУ при передаче управления и возвращать всё обратно при возвращении
Можешь привести пример в кодах?

Sayman, а со стеком что? ОС использует стек программы?

Sayman
25.07.2021, 17:19
а со стеком что? ОС использует стек программы?
в текущей версии да. но, можно переделать так, чтобы ОС использовала только свой буфер под стек. сейчас важно. чтобы стек не лежал в mmu3 (третье окно). это основная переключаемая область для дос и биос. если стек лежит там, то будет печально.

Shaos
26.07.2021, 00:10
Можешь привести пример в кодах?
Вот цитата из Иванмаковского INFO_012.TXT


Вызов из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна
располагаться такая программа:
PUSH AF
LD A,0
OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и
; программа уйдет в него.
POP AF ; На эту команду происходит возврат при таком
; вызове биоса.
RET
; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить
; две команды XOR A и DI

Я сам это не пробовал, но в DSS (которое также работает из ОЗУ) вроде тоже самое для вызова функций BIOS стоит по адресу #0008:

https://gitlab.com/sprinter-computer/dos/-/blob/v1.60R/DOS-MAIN.ASM

При возврате управления оно должно само вернуть всё обратно.