PDA

Просмотр полной версии : Резидент в ТR-DOS на ATM Turbo2+



artice
02.03.2011, 09:15
Уважаемые программисты, поделитесь как мне повесить резидентом boot (или, например, STS) в ТR-DOS на ATM Turbo2+, чтобы по reset выходил в него?:v2_dizzy_coder:

John North
02.03.2011, 09:37
Quick Commander сам всё делает вроде.

artice
02.03.2011, 09:47
Quick Commander сам всё делает вроде.

Мне интересен сам принцип размещения резидента в памяти.

Максагор
02.03.2011, 20:20
Мне интересен сам принцип размещения резидента в памяти.

Все очень просто. В книжке - описании xBIOS (на сайте http://atmturbo.nedopc.com) есть исчерпывающее описание резидента. Привожу оттуда копипасту соответствующей главы:
=======


Работа с резидентом в xBIOS v1.32LE/1.33XT

Понятие резидента

В ПЗУ xBIOS реализована так называемая функция резидента. Суть ее заключается в программном перехвате нажатия кнопки RESET или обращения к адресу #0000 в ПЗУ TR-DOS и vTR-DOS и передаче управления специальной резидентной программе, сохраненной особым образом в верхней памяти, если таковая, естественно, там обнаружится. И только в случае отсутствия в памяти резидентной программы, ПЗУ будет выполнять стандартную процедуру запуска стартового меню (в случае нажатия RESET), или автозапуска файла boot <B> в случае рестарта TR-DOS или vTR-DOS. Функция резидента не является нововведением именно xBIOS. Она была реализована в ПЗУ еще на ПК ATM-turbo 1, и только потом была перенесена на ATM-turbo 2/2+, где успешно применялась в стандартных ПЗУ 1.07.1x.

Самой известной программой, еще со времен ATM-1 использующей функцию резидента, по праву является файловая оболочка Honey Commander. При запуске какой-нибудь программы она сохраняет себя в качестве резидента в верхней памяти, а потом перезапускается автоматически по нажатию на RESET (что является очень удобным, учитывая тот факт, что большинство программ под ZX48/128 не имеют нормального выхода в систему), одновременно сохраняя копию экрана последнего момента перед сбросом.

Однако, несмотря на давнее существование данной функции, более менее понятного описания ее использования с программной точки зрения так и не было создано. В результате желающие разобраться в ее работе с целью использования в своих программах, вынуждены были дизассемблировать ПЗУ и разбираться в процедурах обработчика резидента, что не всегда удобно, а для начинающих программистов слишком трудно. С выходом данной книги эта досадная историческая ошибка, наконец, исправлена.

Итак, резидент хранится в странице ОЗУ #1F. Когда-то давно, на компьютерах ATM-turbo 1 (v4.xx) и ATM-turbo 2 (v6.xx), у которых было всего 512Кб ОЗУ, это была самая последняя страница памяти. Но с появлением ATM-turbo 2+ (v7.xx) память увеличилась до 1024Кб и последней страницей ОЗУ стала #3F. Но резидент для совместимости со старыми программами править не стали (тем более, что не всегда на ATM-turbo 2+ ставили все 1024Кб. Часто по различным причинам обходились только 512Кб). Так и располагается сейчас резидент посреди всего ОЗУ в странице #1F.


Структура резидентной страницы

Чтобы программа, помещенная в страницу #1F была распознана как резидент, она должна быть оформлена специальным образом. В соответствие с этим, страница имеет следующую структуру (далее указывается смещение от начала страницы):

Байт #0000 – код #C3 (команда JP nnnn)
Байты #0001-#0002 – адрес перехода для JP nnnn (рассчитывается по формуле: #C000+относительный адрес начало программы в странице).
Байты #0003-#3FFC – свободное место непосредственно под программу.
Байт #3FFD – контрольная сумма (КС) всей страницы(то есть, с #0000 до #3FFF)
При создании резидента КС рассчитывается путем сложения без учета переноса (то есть, по команде ADD) одного за другим всех байтов страницы, а затем вычитания полученной суммы из нуля (по команде NEG процессора). При этом, так как в процессе расчета контрольной суммы, она еще не занесена в байт #3FFD, он перед началом подсчета КС должен быть равен #00(!). И этот момент обязательно должен быть учтен при возникновении необходимости пересчета КС.
Байт #3FFE – всегда должен быть равен #55.
Байт #3FFF – всегда должен быть равен #AA.

Скомпонованная таким образом страница будет успешно распознана как резидентная и будет начата процедура запуска резидента, которая состоит из следующего:

1) По адресу #C000 включается резидентная страница #1F.
2) Передается управление резиденту на адрес #С000, где должна располагаться команда резидента JP nnnn.
3) Перед передачей управления по адресу #8000 в обеих картах памяти (и при ROM2=0, и при ROM2=1) включается страница #02 ОЗУ.

После передачи управления резиденту архитектура выглядит так:

1) Расположение стека (значение SP) – не определено. Остается на усмотрение резидента.
2) Карта памяти помимо адреса #8000 - #BFFF (и страницы #1F запущенным резидентом по адресу #С000) – не определена. Также остается на усмотрение резидента.
3) Состояние палитры не определено. Также остается на усмотрение резидента.

Прерывания находятся в режиме 2. Включены. Вектор прерывания равен #82FF (I=#82). Таким образом прерывания должны быть либо запрещены, либо, если работа с ними в короткий период работы резидента (пока он устанавливает основную программу) необходима, например, для установки палитры, то необходимо установить по адресу #82FF-#8300 адрес подпрограммы обработчика прерываний (в резиденте Honey Commander там стоит указатель на ближайший RET).

Таким образом, программист при разработке резидента не связан никаким правилами и ограничениями, так как резидент не привязан ни к какой операционной системе и нее обязан учитывать ее особенности. Какова будет конфигурация компьютера после рестарта в резидент, определяется самим резидентом.

Самое частое и перспективное применение резидента – сохранение с последующим восстановлением после рестарта различных ОС или оболочек. Однако в таких случаях объема одной страницы #1F может не хватить. Тогда для хранения избыточной информации используются соседние страницы. Например, Honey Commander использует под резидент страницы #1F, #1E, #1D и #1C. А в vTR-DOS под резидент на всякий случай зарезервированы 5 страниц (исключены из RAM-диска): #1F, #1E, #1D, #1C и #1B.

artice
03.03.2011, 07:03
Огромное спасибо за исчерпывающий ответ! Это описание у меня было, а я дурень его не прочитал! Ещё раз спасибо!

Максагор
03.03.2011, 22:11
Огромное спасибо за исчерпывающий ответ! Это описание у меня было, а я дурень его не прочитал! Ещё раз спасибо!

Ну, дык, вот так всегда бывает - я в свое время это описание составлял-составлял, а его потом - никто не читает!
:v2_dizzy_facepalm: