Info Guide #11
05 июля 2015

Системки - iS-DOS/TASiS: Работа с палитрой и переключение графических режимов в TASiS (часть 3).

      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-#3FFF). 
   Системная палитра принудительно устано─
вится при выходе из программы пользователя
обратно в оболочку, поэтому можно изменять
палитру как угодно, не заботясь о сохране─
нии  первоначальной. В нашем же случае для
игры нам нужно сделать следующее:

   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  остаётся открытым для
всех заинтересованных кодеров и юзеров.



Другие статьи номера:

Об оболочке - журнал состоит из разделов, а разделы из статей.

От авторов - предисловие: Прошло 8 лет с момента выхода прошлого номера Info Guide. Что изменилось на Спектруме за это время?

Комьюнити - Spectrum в глубинке: в городе, население которого не превышает 15 тысяч человек, появление компьютера было сравнимо с изготовлением атомной бомбы в гараже.

Комьюнити - Forever 2015: отчет с демопати для всех 8-битных компьютеров.

Комьюнити - DiHalt 2015: отзывы от Lilka и Louisa.

Комьюнити - Как это было в Бразилии: история развития Спектрума в Бразилии от Paulo Silva.

Комьюнити - Беседа с Tiboh/Debris - программистом из Красноярска, долгие годы занимавшимся обработкой архивов спектрумовских программ.

Комьюнити - интервью с Raver/Phantasy взятое на irc.forestnet.org

Code - Этюды: Вызов функции по номеру, Поиск текста по номеру, Определение наличия музыкального сопроцессора, Установка пикселя на ATM Turbo 2, Библиотеки процедур в ALASM, Короткий генератор случайных чисел, Ускорение LD:PUSH.

Code - точка зрения: проекция пространства на экран из одной точки.

Code - чанковый эффект: Magnets stretching

Code - О мерцающем бордере: использование мерцание для повышения разрешения на бордере.

Code - Скриптование в демо: синхронизация эффектов под музыку и не только.

Графика - режиссура в демо: палитра изобразительных средств в Демомейкинге.

Графика - Мини-опрос художников: Dimidrol, Einar Saukas, Sand, Rion, riskej.

Графика - интервью с художником RayNoa/MAYhEM.

Музыка - Синхронизация музыки: nq рассказывает о создании треков под таймлайн.

Музыка - Беседа с MmcM/Sage group, известным AY-музыкантом, о его знаменитой технике.

Музыка - Беседа с Manwe/SandS - известным композитором, одним из старейших демосценеров России.

Музыка - Однобитная музыка: почему бипер ZX Spectrum продолжает вызывать восхищение?

Музыка - Горизонты турбосаунда: Cj Splinter делится опытом работы с TurboSound.

Музыка - Снова о плейерах Pro Tracker 3.x

Музыка - Музыкальный движок Muse 128b.

Системки - Как приручить IAR C Compiler.

Системки - Оберон для ZX Spectrum: Тонкости при разработке на Обероне в среде ZXDev (часть 1).

Системки - Оберон и ассемблер: Сопряжение с ассемблером (часть 2).

Системки - ZX-Basic Compiler: расширяемый кросс-компилятор.

Системки - Программы с поддержкой HDD, или "Linux" для Спектрума с винтом (или SD-картой).

Системки - iS-DOS/TASiS: о базовых принципах программирования под ОС iS-DOS/TASiS (часть 1).

Системки - iS-DOS/TASiS: как писать игры под iS-DOS/TASiS (часть 2).

Системки - iS-DOS/TASiS: Работа с палитрой и переключение графических режимов в TASiS (часть 3).

Металлолом - о строении экрана 6912 с аппаратной точки зрения.

Металлолом - Палитра для ZX Spectrum в различных графических режимах.

Металлолом - Эмуляция контроллера дисковода 1818ВГ93.

Дикий ум - Генерация и оптимизация кода в компилятора (часть 1)

Дикий ум - Генерация и оптимизация кода в компилятора (часть 2).

Дикий ум - ловля багов: самые типичные ошибки, при разработке на ассемблере Z80 (часть 1).

Дикий ум - ловля багов: самые типичные ошибки, при разработке на ассемблере Z80 (часть 2).

Дикий ум - алгоритм сжатия видео - 16 цветов на точку.

Игрушки - Разработка игр на Evo SDK (часть 1).

Игрушки - Разработка игр на Evo SDK (часть 2).

Игрушки - секрет успеха игры Jet Set Willy выпущенной в 1984 году.

Игрушки - Metal Man Reloaded: История создания от Oleg Origin.

Игрушки - Строение скриптового движка игры на примере L7 script engine.

Мыльница - Секретные кнопки в играх: Project ROBO, Ninjajar!, Uwol, Quest for Money, Zooming Secretary, Game About Squares.

Мыльница - письма: Kq, elfh, mig'95, wbr^NOT-Soft.

Мыльница - errata: Работа над ошибками.

Мыльница - об авторах журнала.


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

Похожие статьи:
Новости - О новинках ПО: Военная зона, Mech War, Gambit.
Обзор - Обзор новинок: Awaken demo version, Pussy demo version, Wacky Races, Best View v2.8, Hobby #1, Amazing #2.
IS-DOS - программистам: Оконная система IS-DOS

В этот день...   20 февраля