[uquote="Paguo-86PK",url="/forum/viewtopic.php?p=3751049#p3751049"]Кстaти, у меня было идейка сделать игру-скроллер, используя эти способности ВГ75.
То есть, экран двигать не программно весь (78x30), а добавить в ПДП лишнюю строку (78x31), чтобы изображение поплыло вниз.
А перерисовывать в каждом кадре только самую верхнюю строку, адрес которой тоже плывёт вверх.
И с переходом на новый уровень, количество строк у ПДП возрастает и скроллинг ускоряется.

[/uquote]Этo, оказывается, в АПОГЕЕ было уже…
Так как
меня забанили, появилось уйма времени на работу мозгами!
Так как средства
онлайн-эмулятора предоставляют ассемблер, консоль с отладчиком и возможность
прошивки ПЗУ, то это вполне достаточно для
бывалых!
Так как программу МОНИТОР автор написал не очень оптимально, то я занялся его оптимизацией.
В первую очередь, я освободил 8 байтов:
Было
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F830 C3 52 FF C3 56 FF .. .. .. .. .. .. .. .. .. ..
FF52 .. .. 2A 31 76 C9 22 31 76 C9 .. .. .. .. .. ..
стало
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F830 2A 31 76 22 31 76 C9 .. .. .. .. .. .. .. .. ..
FF52 .. .. <- -- -- -- -- -- -- -> .. .. .. .. .. .. <-- 8 байтов себе в карман
Хотя, где-то это я уже видел. По-моему, в дампах для ОРИОНа…
Но, из-за этого необходимо подкорректировать стартовый код МОНИТОРа:
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F830 2A 31 76 22 31 76 C9 3A 8A 32 03 80 31 CF 76 CD
F840 CE FA 21 00 76 11 5F 76 4D .. .. .. .. .. .. .. <-- меняем MVI E,0 на MOV E,L
Но я решил не останавливаться и взяться за оптимизацию головой, переосмысливая весь код…
В итоге я переработал его сначала так:
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 40 F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 <- -- -- -- -- -- -- -- -> <-- 9 байтов себе в карман
F840 21 03 80 36 8A AF 2B 77-7C FE 75 C2 45 F8 22 31
F850 76 21 1D 22 22 2F 76 2A-6D F8 22 1C 76 F9 CD CE
F860 FA 21 5A FF CD 22 F9 3E-C3 32 26 76 .. .. .. ..
Но потом доработал до
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 40 F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 <- -- -- -- -- -> 21 03 80 <-- 6 байтов после уступок
F840 0D 0A 2D 2D 3E 00 2B 77-7C FE 75 C2 44 F8 22 31 <-- но вклинил текст прямо в код
F850 76 21 1D 22 22 2F 76 2A-6D F8 22 1C 76 F9 CD CE
F860 FA 21 5A FF CD 22 F9 3E-C3 32 26 76 31 CF 76 21
F870 F8 40 .. .. .. .. .. .. .. .. .. .. .. .. .. .. <-- и здесь подкорректировал адрес
FF60 .. .. .. .. .. .. <- -- -- -- -- -> .. .. .. .. <-- 6 байтов ещё освободив этим
Изучая код дальше, обнаружил ещё одно
безобразие:
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0A CA 8E F9 FE 2C C8 FE 20 CA 5D FD D6 30 FA AE <-- ссылка на STC-безобразие
F970 FA FE 0A FA 82 F9 FE 11 FA AE FA FE 17 F2 AE FA <-- слишком много FAAE
F980 D6 07 4F 29 29 29 29 DA AE FA 09 C3 5D F9 37 C9 <-- STC-безобразие
И переписал это дело как:
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20-CA 5D F9 01 AE FA C5 D6 <-- STC отлично вписывается!
F970 30 F8 FE 0A FA 7F F9 FE-11 F8 FE 17 F0 D6 07 4F <-- и FAAE теперь в стеке
F980 29 29 29 29 D8 06 00 09-C1 C3 5D F9 <- -- -- -> <-- освободили 4 байта
И теперь освобождённое пространство стало больше:
Код: Выделить всё
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F8E0 .. .. .. 21 8C F9 .. .. .. .. .. .. .. .. .. .. <-- корректируем
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20-CA 5D F9 01 AE FA C5 D6 <-- STC отлично вписывается!
F970 30 F8 FE 0A FA 7F F9 FE-11 F8 FE 17 F0 D6 07 4F <-- и FAAE теперь в стеке
F980 29 29 29 29 D8 06 00 09-C1 C3 5D F9 08 20 08 00 <-- переносим
FF90 .. .. .. .. .. .. .. .. .. .. .. .. .. .. <- -- <-- освобождаем 4 байта
FFA0 -- -> .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Ну, в общем, Вы поняли…
Увлёкся процессом и ушёл в него с головой на все выходные!
Ещё мне всегда не нравилось, что по «G<start>,<break>» в отладочных целях, у программы портились ячейки 0038…003A.
Для «PC/M-80» это не проблема, а вот в РАДИО-86РК такой приём - не очень красивый!
И я это также подкорректировал и МОНИТОР за собой подчищает хорошо, используя вместо четырёх байтов «RST+JMP» в разных точках, всего три байта «CALL» в точке отладки…
Затем я вспомнил журнальный статьи «Моделист-Конструктор» - "Монитор открывает окна" для ПК "Специалист".
А потом ещё и журнал РАДИО с «Оконным Менеджером» для РАДИО-86РК.
И подумал. ведь всё - костыльно!
Нельзя ли саму подпрограмму вывода символа в ПЗУ переписать так, чтобы она поддерживала вьюпорт произвольного размера?
И я тут написал…
WINDOWS'86
Большинство игровых программ эмулятора работает…
Но…
- Вулкан сильно гонет из-за неправильной ESC-последовательности: Вместо «ESC+Y» почему-то попадаются «ESC+A». Может с ленты считан с ошибками?
- Ксоникс выводит статусную строку в самой нижней части экран методом хака - переписывая служебные ячейки монитора 7600…7601. Моя подпрограмма в ПЗУ утрамбована максимально и защиты от дурака не имеет в этом плане. Легче подпилить сам КСОНИКС…
- Цирк практически работает, но отрисовка рамок глючит…
В остальном, всё работает…
И, как вы уже поняли, МОНИТОР поддерживает и произвольную ESCAPE-последовательность, передавая управление по адресу 7620 код, отличный от «Esc+Y». Именно потому Вулкан глючит и я вычислил - почему, но ещё не
раскручивал стек до выяснения проблемного места в программе…
Ниже прилагаю исходный листинг на ассемблере, который следует вставить на сайте
эмулятора в ассемблер и залить в память, после чего нажать кнопку «RESET», чтобы увидеть в углу мой текст…
Естественно, в ОЗУ загружается моя пробная библиотека с Escape-драйвером.
В отличии от ANSI.SYS с его «Esc+[n;m…БУКВА», у меня просто - «Esc+n,m…БУКВА».
Но, аргументы можно разделять символом ПРОБЕЛа или «+», а также и символом «-» для отрицательных величин.
Да, они поддерживаются! То есть нельзя писать «Esc+255X», так как нужно «Esc-1X»…
- Esc+S(ave) - сохраняет окно в оконный стек
- ESC+R(estore) - восстанавливает окно из оконного стека
- Esc+left+top+width+height+V - изменяет текущий вьюпорт под параметры
- Esc+offset_x+offset_y+width+height+Q - организует дочерний вьюпорт внутри текущего. Можно вкладывать окошки друг в друга, предварительно сохраняя родителей в стек
- Esc+hor+ver+T - рисует рамку вокруг текущей области, где hor/ver - коды символов для боковых краёв и горизонтальных границ соответственно. Имеется слабая защита: Если окно касается краёв экрана, в тех границах ничего не рисуется
В общем, можете запустить всё это дело одним из следующих способов:
- «G0»: Режим максимального окна - 78×30. Довольно любопытно посмотреть, как работают некоторые директивы МОНИТОРа в этом режиме
- «G1»: Стандартное окошечко - 64×25. Просто это должно быть встроенным
- «G2»: Вывод содержимого памяти ASCII-дампом
- «G3»: Среднее окошечко
- «G4»: Маленький менеджер окон… Нажатием TAB переключает окна; Курсорные клавиши двигают окна; Пробелом выбирается опция в окне с вопросом; «ВК» подтверждает опцию; Другие клавиши - переход в режим МОНИТОРа
- «G5»: Тестер Escape-последовательностей. Так как в эмуляторе клавиша Esc выполняет функцию «Рус/Lat», чтобы не мучаться пальцами, клавиша «Забой» (BkSp) и отправляет код 1B на вывод. А в нижнем правом краю экрана выходит подсказка из нескольких ячеек Escape-параметров…
P.S.: В общем, вот так то…
Кое-где влепили бан и я исполнил давнюю мечту детства!
Интересно, если реально ПЗУ прошить и вставить в реальный РАДИО-86РК, как он отреагирует тогда…
