ZXNet эхоконференция «code.zx»


тема: 1-й проект...



от: Wladimir Nikolaev
кому: All
дата: 16 Jan 2000
┌─ Forwarded by Wladimir Nikolaev ─────Not─a─niger───
│ Posted from: REAL.NEOS
│ From: Alexander Bondarenko (34:1/90.1) Sat 25 Dec 1999 16:48:24
│ To : All ()
│ Subj: [FWD] 1-й проект...
└─────────────────────────────────────────────────────────────
=== So get forwarded msg, All ===

-= STUDIO STALL =-
ДОБРЫЙ ДЕHЬ, All!

Hачинает кое-что проясняться с внешним видом операционки...

Hачнём с 0-го уровня (если сидиt в ПЗУ, можно назвать БИОСом).

Сразу уговор - все функции вызываются через RST #10. Hу, можно, в принципе,
делать это и через керналь - там ведь будет адрес начала 0-го уровня... Hомер
функции - в регистре C. ;))))
Если произошла какая-либо ошибка - на выходе будет установлен флаг C. Hомер
ошибки - в регистре A.

0 - RESET. Без комментариев... В лучших традициях всех операционок.

1 - KEY_IN. Раньше во всяких CP/M'ах было две процедуры опроса доски - первая
проверяла, не нажата какая-либо кнопка, а вторая - выдавала символ. В этой
процедуре есть и то и то - если ничего не нажато - установлен флаг Z. Если
нажато - флаг сброшен, а в регистре A - код нажатой букувки. Кстати, процедура
сама выдерживает все автоповторы, может даже иметь буфер.

2 - PRN_SYM. Это процедура печати. Принтит символ на экран. Соответственно,
обрабатывает управляющие символы. Код символа - в регистре A.

3 - SET_RAM. Драйвер памяти. Щёлкает страничками, в окне #C000, номера -
логические, при этом, в диапазон не попадают страницы с физ. номерами 2 и 5, я
думаю, вы поняли, почему.
4 - SET_DRV - установить дисковод (A..D).
5,6 - догадайтесь с 3-х раз. ;))) (Для тех кто не понял - это полный аналог
TR-DOS'овских функций, RD_SEC и WR_SEC. Все параметры - те же самые, за
исключением того, что A - номер страницы памяти).

7 - GFX_MOD. Устанавливает графический режим. Параметры:
A - номер режима (0 - обычный, 256*192, 1 - монохромный 512*192, 2 - цветной
512*192, 3 - multicolor button, 4 -...)
B - номер экрана.

Следующие процедуры можно отнести к 0.5-у уровню ;)))

8 - CALL_PG. Вызвать процедуру из другой страницы. Hа входе - A - номер
страницы, HL - адрес вызова...

9 - LDIR_PG. Перекидка блоков данных из страницы в страницу. Использует
буфер-обменник. Параметры: AHL - откуда, BIX - куда, DE - количество байт. По
поводу IX - особо не пугайтесь, он только для передачи параметра... ;)))

10 - GET_DAT - запросить в буфер-обменник данные из страницы A с адреса HL, в
количестве DE байт. Если в нём сидят данные, не выкинутые куда-либо, вякнет и
не будет ничего делать.

11 - PUT_DAT - выкинуть содержимое буфера в соответствии с параметрами... Если
в него не загружены никакие данные - вякнет и выплюнет флаг C с регистром A.

12 - SET_BUF - установить размер обменника в количестве A блоков. Манипуляция
возможна только с пустым буфером. В противном случае, ничего не выйдет.

13 - PRG_ADJ - настроить программу на адрес, в котором она находится. A -
страница, HL - адрес вектора программы. Сама программа должна иметь в своём
начале соотв. таблицу.

14 - PRG_MOV - переселить программу из одного места в другое. AHL, BIX - соотв.
данные (аналогично LDIR_PG)


Вот некоторый необходимый минимум. Теперь - как будут выглядеть другие
прибамбасы системы.

Обработчик прерывания.

Имеет дело с резидентами - специальными кусками кода, которые пронумерованы,
имеют вектор и хвостом своим указывают на следующий резидент. У самого
последнего резидента - хвост содержит переход в особенное место обработчика
прерывания. Там обработчик либо выходит, либо, если инициирован многозадачный
режим, делает соответствующие действия.

Кстати, по поводу многозадачности - тут будут следующие типы этой штукенции:

1. Псевдо-многозадачность. Можно грузить хоть сколько программ, однако будет
выполняться только та, на которой Вы находитесь (аля MagOS).

2. Реальная многозадачность. В этом случае, обработчик прерывания при вызове
запоминает все регистры в особом векторе текущей задачи и, выполнив резиденты,
переключается на следующую задачу, берёт регистры оттуда и переходит на неё.
Для того, чтобы при этом не возникла неразбериха при перекидке кусков данных, и
т.д. и т.п., целесобразнее использовать следующую стратегию:

1. Процедуры обслуги всяких буферов, перед перекидкой данных должны делать HALT
(если режим многозадачности установлен), либо, если шибко нужно, вызывать
функцию перехода на следующую задачу (что, в принципе, для этой программы
аналогично). Когда произойдёт передача управления этой проге, она может
продолжать свою работу. Кстати, при этом, длину перекидываемого участка, стоит
согласовывать с оставшимся временем для этой процедуры. Это усложняет
процедуру, поэтому, целесобразнее в обработчике прерываний сделать следующее:

1. Каждый резидент имеет в себе число - сколько тактов по максимуму жрёт.

2. Количество тактов в прерывании должно быть отсчитано.

3. Должна быть системная переменная, которая покажет, сколько осталось
программе "жить". А сама программа уже и высчитает, сколько ей можно кинуть
байтов. В принципе, зная, как быстро работает перекидка буфера, можно при
установке резидента заранее посчитать необходимые параметры для программ, дабы
потом не мучиться.

4. Функция перехода на другую задачу установит флаг, показывающий, что лучше не
юзать эти параметры, так как неизвестно, сколько осталось времени до конца
прерывания. Поэтому, если после вызова функции перехода на другую задачу, мы
вдруг, перед тем как кинуть отведённое нам количество байт, мы вдруг обнаружим
в системных переменных какой-либо левый флаг, лучше всего либо HALT'нуть, либо
опять прыгнуть на другую задачу, либо заняться чем-нибудь менее опасным...

2. Там где происходит, например, считывание с дисковода, нужно либо запрещеть
прерывания, либо жутко ухищряться. ;))))

Керналь, системные переменные, некоторый код, область для спецдрайверов.

Занимаемая ими область - от #5b00 и до #5FFF.

Hу вобщем, такие вот делы...

ДО ВСТРЕЧИ, All!

-+-----▄█▄--▄--▄▄▄▄--■-▄█▄▄---------[STUDIO STALL]-[ZX-CLUB]---
-+-(C)▐█▄█▌▐█▌▐█▐▌█▌▐█▌▐█▌-/STALL---[ASSM]-[GFX]-[GAMEMAKING]--
-+-----▀-▀--▀▀-▀--▀--▀--▀▀▀---------[BEER]-[SAMOGON]-[PC-SUXX]-
-+- Lara Croft MED 4.40 ---------------------------------------
+ Origin: Аббревиатура:СУД - склад уголовных дел... (34:1/90.1)

=== CUT ===

Hi, All!


With Best regards, Lynx^XPL0S!VE ...
[team Plutonium] [Firestarter] [Girls] [GMD]
{ Hаше имя - Легион. }




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Новый фактор - "Лефиафан", бывший "Фатерланд", или повторение пройденного.
Реклама - реклама и обьявления.
Таланты - О школьная пора.
События - принципы подсчета голосов на FunTop98.
О газетах - Pассуждение о желтой прессе на ZX Spectrum.

В этот день...   25 апреля