iS-DOS/TASiS ч.3
Работа с палитрой и переключение
графических режимов в TASiS
В предыдущем разделе разобраны примеры,
универсальные для всех типов iS-DOS. Этот
и следующий разделы будут посвящены допол─
нительным возможностям TASiS. Так,в систе─
ме поддержана работа с графическими режи─
мами и палитрой на уровне системных реста─
ртов, и нам не надо обращаться к портам,
чтобы всё это переключать.
Все процедуры работы с дополнительными
системными вызовами TASiS можно оформлять
в виде подпрограмм с условным переходом по
результатам проверки на тип системы.
Например:
LD A,I;проверка нахождения в TASiS по
OR A;CP 0;значению вектора прерываний
CALL Z,scrpal;переход на"графическую"
;подпрограмму, если мы там
Рестарт$pal (регистр C=#79 ). Работа с
палитрой. Входные данные зависят от регис─
траA:
A=#00 - установить стандартную палитру.
A=#FF - обновить палитру пользователя. На
входе в регистреHLтогда - адрес 16
байт (числа от 0 до 63) палитры
пользователя для установки.
Иное значение регистра A палитру не
меняет, но на выходе возвращает:
В альтернативном регистреHL'- указа─
тель на адрес системной палитры, использу─
емой в оболочке,а точнее -блока специаль─
ных системных переменных TASiS, первые 16
байт которых - системная палитра.
В альтернативном регистреDE'- указа─
тель на адрес стандартной ("спектрумов─
ской") палитры, находящейся вне блока сис─
темных переменных TASiS в неизменяемой ча─
сти системы (в блоке кодов в ОЗУ по адре─
сам #0000-#ЗFFF).
Системная палитра принудительно устано─
вится при выходе из программы пользователя
обратно в оболочку, поэтому можно изменять
палитру как угодно, не заботясь о сохране─
нии первоначальной. В нашем же случае для
игры нам нужно сделать следующее:
XOR A;стандартная палитра
LD C,$pal;или LD C,#79
RST #10
С графическими режимами немного слож─
нее. Отдельного рестарта для управления
графикой нет. Но графический режим (а точ─
нее, значение теневого системного порта
#FF77 ATM Turbo 2/2+) прописан в упомяну─
том вышеблоке специальных системных пере─
менных TASiS по смещениям:
+54 (1 байт) - переменная sysscr. Байт
системного порта для системных нужд.Именно
по этому байту восстанавливается экранный
режим по умолчанию при выходе из программы
пользователя в оболочку.Стандартное значе─
ние=#AE(%10101110). Биты 7..4 должны быть
всегда такими. Бит3 - турборежим включен.
Биты2..0 - тип экрана.В данном случае тут
значение 6 - текстовая консоль 80х25. В
текущих версиях TASiS это значение посто─
янно, однако в дальнейшем, при разработке
иных графических сред,может быть изменено.
+55 (1 байт) - переменная usescr. Биты
2..0 системного порта для использования в
программах пользователя.Если тут 0 - испо─
льзовать sysscr. Все использующие систем─
ный порт рестарты ориентируются по этому
признаку.При выходе из программы пользова─
теля в оболочку принудительно сбрасывается
в 0. Биты 7..3 игнорируются (берутся из
переменной sysscr ). Значения для выбора
типа экрана следующие:
#08(установлен игнорируемый бит 3 для
ненулевого значения) - EGA экран 320х200,
#02 -аппаратный мультиколор 640х200,
#03 -256х192 (6912),
#06 -текстовая консоль 80х25.
Другие сочетания битов2..0 также воз─
можны и приведут к включению нелинейных,
т.н. "технологических" экранов. При реали─
зации в железе дополнительных экранных ре─
жимов возможен их вызов через эти дополни─
тельные комбинации.
Чтобы сменить графический режим, надо
занести соответствующее значение в пере─
менную sysscr или usescr, а затем вызвать
один из рестартов TASiS, использующих сис─
темный порт. Для наших нужд подходит ре─
старт SET_PG (#7B) - конфигуратор диспет─
чера памяти. Вызовем его так, чтобы не ме─
нять конфигурацию памяти:
XOR A;восстановление системной
;страницы ОЗУ TASiS
LD B,A;0 ;в области #0000
LD C,#7B;реально без дополнительных
;данных (в системных
;переменных) ничего не меняется
RST #10;нужно только для смены экрана
Подводя итог,напишем подпрограмму вклю─
чения палитры и экрана для использования в
загруженной игрушке:
scrpal
XOR A;признак стандартной палитры
LD C,$pal;или LD C,#79
RST #10
XOR A
INC A ;A!=#00 и !=#FF
LD C,$pal;для получения
RST #10;адреса переменных TASiS в HL'
EXX
PUSH HL;перебросим адрес
POP IX ;в IX для удобства
LD (IX+55),#03;ставим 6912 экран
;в переменную usescr
XOR A
LD B,A;0
LD C,#7B;можно сразу LD BC,#007B
RST #10
RET
В итоге всё получается не просто, а
очень просто.
Управление страницами ОЗУ в TASiS
В предыдущих разделах дана исчерпыва─
ющая информация для того, чтобы пользо─
ватель мог смело взяться за ассемблер и
написать загрузчик для своей игрушки.Здесь
же бегло освещается информация сверх это─
го - ведь в стороне от внимания остались
мощнейшие возможности ОС TASiS по уп─
равлению диспетчером памяти, а по сути,
созданного в этой системе страничного ме─
неджера, открывающего широчайшие перспек─
тивы по развитию программных приложений
и построения многозадачной среды. Это тема
отдельного большого исследования. А пока
лишь приведу краткий обзор рестартов с ми─
нимумом комментариев, давая читателю воз─
можность самому оценить масштаб открыва─
ющихся возможностей.
Рестартpage (#7A) позволит пользовате─
лю (а в перспективе и системе) работать
со всеми страницами ОЗУ.
Параметры на входе:
B - номер страницы,
A=0 - освободить страницу,
A=#FF - занять страницу.
На выходе:
Признак NC - O.K.
Признак C - уже занята (HL'=адрес в таб─
лице,штатно располагающейся в неизменя─
емой части ядра системы в ОЗУ по адресу
#3800)
----------
Иначе на входе:
A - номер страницы (любой, кроме 0 и #FF),
B - смещение в ней (адрес блока) в битах
5..0и команда в бите6:
0=читать, 1=писать
(бит7- резерв для модификаций байт),
HL - откуда/куда,
DE - сколько байт.
Другими словами, можно вообще не пере─
ключать страницы, а просто указать блок
кодов в основном поле памяти и номер стра─
ницы и вызвать рестарт, который сам всё
скопирует.
Таблица страниц - 32 байта по биту на
страницу (итого 256 страниц) - находится в
is_dos.rom и может модифицироватьсядо пе─
резагрузки. По умолчанию в ней заняты0,2,
3, 5, 7, #1F, #1E, #1D,#1C,#1B страницы, и
при попытке занять их вы получите адрес в
таблице (пока #3800) и признакC. Послед─
ние 4 страницы зарезервированы за резиден─
том и нижней страницей системы. Работать с
ними можно, но освобождать не надо!
Вообще, на перспективу, желательно ис─
пользовать хотя бы минимальный "прото─
кол" - проверка занятости страницы, поиск
свободной страницы памяти, использование
её и освобождение, если занимали. Это поз─
волит корректно работать в будущем, ког─
да система (или проги) будет занимать при
необходимости дополнительные страницы или
для корректной работы менеджера загружен─
ных приложений в будущей многозадачной
среде.
В этой версии доступность страниц огра─
ничена размером ОЗУ в 1024 КБ - 64 страни─
цы, но при адаптации системы под ZX Evolu─
tion ничто не мешает организовать поддерж─
ку всех 4 МБ его ОЗУ и управление через
данный рестарт всеми 256 страницами.
Понятно, что последний рестарт позволит
написать новые процедуры для копировщиков,
упаковщиков, загрузчиков и т.д. Он освобо─
ждает от необходимости контроля за порта─
ми. И вообще, с ним идеология работы с па─
мятью может радикально измениться.
И ещё один рестарт работы со страницами
ОЗУ:
SET_PG (#7B) - установка страницы, вос─
становление системной страницы, вызов из
страницы. Ранее был упомянут в примерах с
переключением экранных режимов.
На входе:
A - команда,
B - страница или область,
HL - адрес (если нужен).
Команд всего четыре:
A=#00 - восстановить системную страницу,
B: биты 7 и 6 - область (#4000, #8000).
На место ставятся штатно 2-я или 5-я
страница ОЗУ из значений, хранящихся в
ранее упоминавшемся блоке системных пе─
ременных TASiS. Но занеся в эти систем─
ные переменные свои значения,можно "на─
значить" системными иные страницы.
Возможно восстанавливать также сис─
темную страницу 0-й области (ROM2=0) и
системную страницу ПЗУ (ROM2=1). Для
этого при команде восстановления систе─
мных страниц биты7 и 6 регистра B дол─
жны быть сброшены (восстановление сис─
темной ОЗУ) или подняты (восстановление
системной ПЗУ). Теперь для переключения
на eXtra ПЗУ (например,чтобы войти не в
TR-DOS,а в vTR-DOS) достаточно заменить
байт системной страницы ПЗУ (#83 по
умолчанию) на#87 и вызвать восстанов─
ление её через рестарт (по схеме,приве─
дённой при переключении экранов). Для
сторонних кодеров, не знающих тонкостей
и аппаратных особенностей компьютера,
этот вариант оптимален.
A=#80 - установить страницу в области па─
мяти #8000-#BFFF,B - номер страницы.
A=#40 - установить страницу в области па─
мяти #4000-#7FFF,B - номер страницы.
A=#FF - самое интересное: вызвать процеду─
ру из страницы по адресу вHL, в B -
номер страницы. Вызывается процедура из
страницы и по возвратуRET восстанавли─
вается (!) системная страница. Любое
другое число в аккумуляторе - возврат
с признакомC - ошибка. При вызове про─
цедур из страницы рестарт ориентируется
по адресу в HL. При ошибке адреса
(#4000-#BFFF) в аккумуляторе возвращае─
тся0 и признак C, иначе - код (и флаг)
пользовательской ошибки.
Значения для устанавливаемых страниц
лежат в области переменных TASiS в блоке
из 8 байтsyspg по смещению +32 и достают─
ся через рестартPAL (#79) точно так же,
как и переменные экрана. Структура этого
блока:
+32 (8 байт) - переменные syspg. 8 байт
номеров страниц в областях системы. Снача─
ла идут 4 байта для режима BASIC-128
(ROM2=0), затем 4 байта для BASIC-48
(ROM2=1). В каждой из этих четвёрок первый
байт - копия значения, выдаваемого в стра─
ничный порт (т. е. со всеми нужными инвер─
тированиями), остальные - просто номера
страниц. Штатные (по умолчанию) значения
следующие:
Для BASIC-128:
+32 - байт#62(ОЗУ #1D) для #0000 -
просто значение для порта
+33 - страница5для #4000(номер страницы)
+34 - страница2для #8000(номер страницы)
+35 - страница0для #C000(номер страницы)
Для BASIC-48:
+36 - байт#83(ПЗУ BAS-48) для #0000 -
просто значение для порта
+37 - страница5для #4000(номер страницы)
+38 - страница2для #8000(номер страницы)
+39 - страница0для #C000(номер страницы)
Заключение
Некоторые комментарии напоследок:
Как видите, можно ставить страницу и
работать с её процедурами и вызывать про─
цедуры в ней, не заботясь о восстановлении
на место системной страницы. О занятии и
освобождении страниц тоже лучше не забы─
вать. По сути, мы подошли к свободному ис─
пользованию всей доступной памяти, и всё
это - оставаясь в системе!!! А сама систе─
ма превратилась в удобный "трамплин" для
загрузки иной среды. Кто знает, может, в
будущем, появится какая-нибудь WINiS, ко─
торая, как и первые версии Windows, будет
грузиться из-под системы. Но это потом.
А для начала, опираясь на данный труд, не─
плохо было бы перебороть себя, свои сте─
реотипы и фобии и сделать первый шаг в
программировании под Систему, чтобы отвя─
заться, наконец, от проклятия Спектрума -
TR-DOS. Зачем? - возвращаясь к началу
статьи,спросите вы. Да хотя бы потому, что
это просто интересно - это до сих пор ещё
неизведанная область на спектруме, где
возможно качественное развитие. То самое
развитие, которое на том же "любительском"
энтузиазме и интересе привело к большому
прогрессу в ОСестроительстве - и я не про
старичка CP/M и ему подобных. В спину
спектрумистам дышит реально многозадачная
и графическая ОС SymbOS, написанная для
компьютеров с процессорами Z80. Она запус─
кается на MSX2 и Amstrad CPC. Вполне веро─
ятно,что однажды появится версия и для АТМ
Turbo 2/2+ - параметры этих клонов Спект─
рума вполне позволяют это. Но это значит,
что опять разработки и стандарты придут на
Спектрум извне,со стороны. И не спектруми─
сты будут определять направление развития
программной среды. Что будет очень обидно
и стыдно, учитывая, какой огромный задел в
90-е и "нулевые" оставили энтузиасты спек─
трум-сообщества, в частности,в виде iS-DOS
и TASiS. Я считаю, что нам всем вполне по
силам сдвинуть дело с мёртвой точки. А
пока проект TASiS остаётся открытым для
всех заинтересованных кодеров и юзеров.
Other articles: