05 июля 2015 |
|
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 21 November