Д.Ю. Усенков
Электронное зеркало
Один из интересных эффектов, который можно применить в программах на Бейсике, - превращение картинки на экране в её зеркальное отображение. Этого можно легко добиться, перебирая все точки построчно по их координатам в цикле и изменяя соответственно их цвета с помощью операторов PSET и POINT. Но для работы такой программы требуется довольно много времени - сказывается низкое быстродействие Бейсика (и это на специально созданного для БК-0010.01 Быстрого Бейсика, построенного по типу компилятора; сколько же времени потребовалось бы для работы интерпретирующего языка!). Безуспешно попытавшись ускорить процесс путём оптимизации Бейсик-программы, я составил подпрограмму в машинных кодах. Кроме того, в ней я вообще отказался от алгоритма перебора по координатам и замены цвета (это истребовало бы составления программы-аналога POINT). Вместо этого я использовал алгоритм работы с ячейками экранного ОЗУ: производится последовательный построчный перебор пар ячеек, расположенных симметрично относительно середины экрана; выбранные значения помещаются в регистры и преобразуются в свои зеркальные отражения при помощи несложного алгоритма:
MOV #10,R0 в R0 записано число битов в байте 1$: RORB R4 ROLВ R1 в R1 после выполнения этой последовательности команд находится зеркальная копия R4 SOB R0,1$
После этого преобразованные значения меняем местами и возвращаем в выбранные ячейки памяти. При работе этой подпрограммы зеркально отражается верхняя, информационная строка и меняется цвет точек синий на зелёный и обратно. Вот текст в восьмеричных кодах.
010046 |
010146 |
010246 |
010346 |
010446 |
012704 |
077700 |
012703 |
000037 |
010346 |
010446 |
061603 |
010346 |
111303 |
012700 |
000010 |
106003 |
106102 |
077003 |
012603 |
062704 |
000077 |
166604 |
000002 |
010446 |
111404 |
012700 |
000010 |
106004 |
106101 |
077003 |
012604 |
110113 |
110214 |
012604 |
012603 |
005303 |
002343 |
162704 |
000100 |
020427 |
040000 |
002334 |
012604 |
012603 |
012602 |
012601 |
012600 |
000207 |
000000 |
000000 |
000000 |
|
|
|
|
Длина: 1508. Начальный адрес может быть любым, например 370008. Контрольная сумма: 1331148.
Эта подпрограмма без всяких изменений может быть использована и в кодах и даже в Фокале, если найдётся способ её вызвать. Ввести её можно либо с помощью операторов РОКЕ в цикле, либо в режиме ТС (после этого её надо записать на магнитофон с именем, допустимым в Бейсике, например, "ЗЕРКАЛО.BIN").
Хочу дополнить информацию, помещённую в "Вычислительной технике" № 5 за 1990 г., стр.34. В статье Синягина C.Ю. он рекомендует работать с системами МИРАЖ и МИКРО. Ничего не имея против них, особенно против системы МИРАЖ, работающей в ОЗУ экрана и оставляющей программисту всю оперативную память, я хочу порекомендовать вашему вниманию весьма распространённую среди давно программирующих БК пользователей (у одного из них мне и удалось её списать рижскую программу ОТЛАДЧИК. Фактически это микроассемблер (дизассемблер с возможностью отладки и пошагового прохождения программ.
Программа ОТЛАДЧИК занимает 10 кБ памяти, что всё же позволяет создавать довольно большие программы.
Заключение рецензента
Подпрограмма работоспособна и может быть опубликована. Читатели могут попробовать написать аналогичные программы для зеркального переворота изображения относительно обеих диагоналей экрана и по вертикали. Подобные программы могут быть полезны для создания экранных эффектов в игровых программах.
Жариков Л.Н.