Графические возможности компьютера Спринтер позволяют выводить довольно таки качественную картинку с богатой палитрой цветов, не смотря на то, что машина всё таки восьмибитная. Как я писал ранее, объем доступной видеопамяти равен 256 килобайтам, что позволяет выводить изображение размером 320*256 точек при 256 цветах из палитры в 16 миллионов цветов, поскольку разрядность ЦАП 24 бита, по восемь бит на канал (RGB). Либо 640*256 точек при 16 цветах, всё из той же палитры в 16 миллионов цветов. Но здесь уже нюансы. Поскольку объем видеопамяти остается тот же, то в данном режиме пиксель как бы делится на две части, где одна часть окрашивается одним цветом, а вторая другим. Просто байт отвечающий за номер цвета в палитре, делится на две части, на старшие и младшие четыре бита. Не стану утверждать, могу ошибаться. Но как говориться проверим.
Для того что бы выводить что либо на экран, нужно иметь представление о том, как в целом компьютер работает с экранной областью. Как выясняется, ничего из ряда вон непонятного тут нет. Для компьютера экран, это работа с памятью (в общих чертах). Просто эта память отображается на экране монитора с помощью графического адаптера. Но что бы увидеть на экране что то вменяемое, нужно иметь представление как графический адаптер работает с данной памятью, для чего предлагаю посмотреть на блок схему/ рисунок...
На изображении я сознательно не описал все области видеопамяти, так как на текущем этапе они мне не понадобятся. Они нужны для описания так называемых квадратиков, что то вроде тайлов. Вообще экран компьютера Спринтер устроен несколько сложнее, чем я описал в данном рисунке, но это не для сегодняшней темы.
Как видно из изображения, видеопамять делится на несколько частей. Первые два прямоугольника, это первая и вторая экранные области, собственно с ними я и буду работать, а также область палитр. На всё про всё как видно из рисунка, выделено 1 килобайт. Но где же обещанные 256 килобайт видеопамяти?! Дело в том, что процессор Z80 не может адресовать память объемом более 64 килобайт из за своей шестнадцатибитной адресной шины, поэтому разработчикам машины пришлось идти на ухищрение. Данный рисунок представляет лишь одну экранную строку, чтобы заполнить следующую, нужно изменить значение порта #89 (Port_Y), который собственно и отвечает за вывод строк от 0 - 255. Собственно по 1 килобайту 256 строк и выходит 256 килобайт.
Правда для формирования картинки 320*256 точек было бы достаточно 81920 байт. Но видеопамять устроена несколько сложнее, однако на данном этапе мне это не нужно.
Так же по этим строкам записаны цвета палитры от 0 до 255, т.е. номер строки отвечает за номер цвета в палитре.
В итоге, что нужно сделать что бы вывести хоть что нибудь на экран? Пускай даже банальную точку... А нужно произвести следующие действия:
- Задать необходимый видео режим;
- Установить в нужное окно процессора страницу видео памяти;
- установить номер палитры;
- выбрать номер отображаемой страницы экрана;
- заполнить видеопамять данными...
Теперь расшифрую.
Видеорежим.
- #02 - текстовый 40*32 символа - 16 цветов
- #03 - текстовый 80*32 символа - 16 цветов
- #81 - графический режим 320*256 - 256 цветов
- #82- графический режим 640*256 - 16 цветов
Задается функцией DOS - SETVMOD, где в регистре А указывается видеорежим, в регистре В - указывается активная страница экрана (0/1).
Страницу экрана впоследствии можно менять функцией DOS - SELPAGE, где в регистре В всё также указывается номер необходимой страницы.
Оговорюсь, что все эти действия можно делать напрямую с портами графического адаптера.
Теперь нужно задать в нужном окне требуемую страницу памяти, которая отвечает за вывод картинки. Здесь также есть момент, который нужно рассмотреть. Что бы что то попадало на экран, в одно из окон процессора нужно установить одну из страниц памяти с номерами #50...#5F, они являются графическими. Но установкой одной из этих страниц, я могу для графического адаптера включить один из подрежимов работы. Если быть точнее, то за эти подрежимы отвечают отдельные биты.
Если будет активен бит 3, то данный подрежим позволяет выводить прозрачный цвет, коим является 255 байт палитры. При установки этого бита, байт палитры с номером 255 на экран выводиться не будет, т.е. станет прозрачным.
При активном 2 бите, будет разрешен временный вывод изображения на экран. т.е. картинка будет писаться только в видео память, но не будет запоминаться в текущей установленной странице памяти.
Стоит оговориться, что страница памяти #50-#5F - это не одно и тоже что и видео память. Видеопамять, это что то вроде проекции с основной памяти. Поэтому их содержимое может не совпадать. Установленный второй бит позволяет выводить например спрайты, курсоры и прочее, не запоминая в основной памяти, что в последствии позволит быстро восстанавливать фоновую за ними картинку.
Надеюсь никого не запутал.
После чего устанавливаю номер палитры, заполняю палитру цветами, можно составить свою, а можно установить стандартную для DOS.
Четвертый пункт на самом деле не обязателен, так как номер активного экрана устанавливается при выборе видеорежима. Но мало ли какая потребность может возникнуть.
Ну и последнее, заполнить Видеопамять содержимым.
Что же, пришло время реализовать это в программе.
Для начала просто постараюсь закрасить экран произвольным цветом. Например красным.
Что в данной программе я сделал: Вначале через директивы ассемблера описал номер видеостраницы, порт строк (Y_PORT), а также порт подключения страницы памяти в третье окно процессора. Затем с помощью функции DOS - SETVMOD установил графический режим 320*256, через порт WIN_3 подключил страницу памяти с номером #50 в третье окно процессора (с адреса #c000 по адрес #ffff). С помощью порта Y_PORT выбрал нулевую строку и она же по совместительству 0 номер в палитре, куда и прописал по адресам начиная с #c3e0 по #c3e2 красный цвет. (ну т.е. в RED я записал число #ff, а в Blue & Green #00). Поскольку данная страница у меня ничем не была заполнена, и везде был прописан ноль, что соответствует нулевому цвету палитры, то экран закрасился красным цветом. На самом деле так делать нельзя! Так как память может оказаться заполненной различным мусором и соответственно его я мог бы увидеть на экране.
Немного усложнив программу и добавив еще один цвет под номером 1, сразу после установки нулевого номера палитры и перед функцией WAITKEY, и не меняя строки с адреса #с000 нарисовать в цикле 100 точек, то получу линию салатового(?) цвета...
Результат:
В следующей статье постараюсь вывести что нибудь сложнее чем полоска на экране. Также стоит уходить от формата скриншотов, но в Яндекс Дзене я пока не придумал, как это сделать красиво... Ещё возможно стоит подумать о формате видеороликов.