Просмотр полной версии : Реконструкция CGLIB для использования из OMSI Pascal
Oleg N. Cher
03.03.2020, 22:01
Я здесь решил немного поковырять УК-НЦ. Уже рисую из Паскаля точки :-)
http://i.piccy_.info/i9/421fd424b11789452c256fb2bfad45d1/1583204219/286041/1320134/Graph40.png
Я реконструирую графическую библиотеку CGLIB (https://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=694870&viewfull=1#post694870) и попутно адаптирую её для работы с кодом на OMSI Pascal. Выбор этого Паскаля оправдан тем, что на нём получаются самые маленькие .SAV (3 блока для пустой программы).
Трудности: в приложенном Хоботом архиве описание версии 2.01, а сам объектник - версии 1.0. В описании есть такие процедуры (а кода для них в объектнике нет):
int Palette(int n)
Функция устанавливает палитру из стандартного набора. В стандартном
наборе имеется 4 палитры, соответствие логического цвета
и физического цвета приведено ниже. 0<=n<=3.
Стандартные палитры:
Палитра 0: 0 -- черный
1 -- зеленый
2 -- красный
3 -- желтый
Палитра 1: 0 -- синий
1 -- голубой
2 -- фиолетовый
3 -- белый
Палитра 2: 0 -- черный
1 -- темно-зеленый
2 -- темно-красный
3 -- коричневый
Палитра 3: 0 -- темно-синий
1 -- темно-голубой (серый)
2 -- темно-фиолетовый
3 -- бледно-белый
int SetPalette(int c0, c1, c2, c3)
Функция позволяет создавать произвольную палитру. Числа c0,c1,c2,c3
представляют собой последовательность физических номеров в палитре,
при этом 0<=cN<=15. c0 - номер физ.цвета с лог.номером 0, c1 - номер
физ.цвета с лог.номером 1 и т.д. Соответствие физ.номеров цветам:
0 -- черный
1 -- темно-синий
2 -- темно-зеленый
3 -- серый
4 -- темно-красный
5 -- темно-фиолетовый
6 -- коричневый
7 -- бледно-белый
8 -- черный
9 -- синий
10-- зеленый
11-- голубой
12-- красный
13-- фиолетовый
14-- желтый
15-- белый
Нужно повторить функциональность этих двух процедур на асме.
P.S. Форум на тему изменения палитр смотрел. Г-н Зимин устанавливает их по-холодному через Esc-последовательности (а нам нужна горячая замена на лету, как я понимаю). А работать с ячейками 2470 и 2472 у меня не получилось. Код ничего не делает:
PROCEDURE Palette; (* Здесь по идее палитра обнуляется во все чёрные цвета *)
BEGIN /*$C
MOV #^O2470, R0
CLR R0
CLR 2(R0)
*/
END {Palette};Вообще при обращении к этим ячейкам ничего не происходит. Вот такая команда (https://zx-pk.ru/threads/29643-portirovanie-igry-quot-last-mission-quot-na-uknts.html?p=1034138&viewfull=1#post1034138), предложенная S_V_B для перевода в 320 строк, тоже ничего не делает:
BIS #20,@#2462
Что я делаю не так? Буду рад любой помощи.
Что я делаю не так? Буду рад любой помощи.
Ваша программа исполняется в ОЗУ центрального процессора, а данные ячейки находятся в ОЗУ периферийного процессора. Так что лучше Esc-последовательностями.
Oleg N. Cher
03.03.2020, 22:56
А какими последовательностями меняется палитра? Смотрел в исходники игр Никиты Зимина, там почти нихрена не понял ;-)
Или ткните доку, где почитать про палитры.
В оглавлении хламника Хобота есть вот такой файл, может это оно?
CGLIB .OBJ 29 12-Jul-1991 14'848
Указано что он на диске ukncbtlwebcomplekt\VAMOS_C_BOOT\disk30_cc.BOOT.dsk , но самого диска я не нашёл.
- - - Updated - - -
А какими последовательностями меняется палитра? Смотрел в исходники игр Никиты Зимина, там почти нихрена не понял ;-)
Или ткните доку, где почитать про палитры.
http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_RAM.LST_app
Обычно передаём на вывод вот такую строку, и затем ставим задержку чтобы ПП очистил экран, заполнив его новыми цветами.
GAMESC: ; Строка подготовки игрового экрана
.BYTE 33,246,62 ; Формат экрана 40x24
.BYTE 33,240,60 ; Цвет символа
.BYTE 33,241,61 ; Цвет знакоместа
.BYTE 33,242,61 ; Цвет фона
.BYTE 14 ; Clear screen
.BYTE 0
.EVEN
Oleg N. Cher
03.03.2020, 23:10
Спасибо.
А как будет выглядеть последовательность в случае, когда у нас уже установлен графический режим и нужно просто щёлкать палитры?
Сопоставить "цвет символа, цвет знакоместа и цвет фона" с палитрами у меня не хватило фантазии. Хотя примерно понял, куда рыть.
В УКНЦ есть набор предустановленных палитр, о которых упоминается в описании функции Palette?
- - - Добавлено - - -
В оглавлении хламника Хобота есть вот такой файл, может это оно?
CGLIB .OBJ 29 12-Jul-1991 14'848Сам диск-то есть (http://hobot.pdp-11.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/VAMOS_C_BOOT/), но увы - это не оно. Это другая совершенно библиотека с тем же именем. Набор функций внутри неё тоже другой.
Oleg N. Cher
04.03.2020, 01:23
Прокомментируйте, пожалуйста. Это Esc-последовательность, которую вызывает InitGraph:
.BYTE ^O33, ^O246, ^O62 ; 40x24 mode (эти коды прилепил уже я - для перехода в режим 320)
.BYTE ^O33, ^O45, ^O41, ^O61 ; Term mode
.BYTE ^O33, ^O133, ^O60, ^O73, ^O60, ^O162 ; Здесь, похоже, гасится служебная надпись РУС/ЛАТ.
.BYTE ^O33, ^O45, ^O41, ^O60 ; Graph
CloseGraph:
.BYTE ^O14
.BYTE ^O33, ^O45, ^O41, ^O63
.BYTE ^O33, ^O246, ^O61 ; 80x24 mode (это тоже прилепил я)
После вызова CloseGraph надо корректно выйти в текстовый режим RT-11, у меня есть сомнения, что эти последовательности правильно это делают. РУС/ЛАТ по идее надо восстановить обратно.
но самого диска я не нашёл.
спасибо, Никита! папка с дискетой от Vamos - в корне нет, она в \Other\ (оглавление поправил).
Поглядел поставку Си к РАФОС - там граф.модуля вообще нет. Наверное надо делать выбор в пользу варианта библиотеки максимально большого размера и копаться-разбираться с ней, пример по изучение списка "глобальных" LIBR'ом я Олегу кидал, у него все шпаргалки на руках ) С Си вообще много непонятного на наших машинках - скорее всего очень много "местечковых под свои задачи" наработок на местах, откуда скопированы библиотеки.
Прочёл про данную библиотеку. Да, она работает напрямую с планами памяти 1 и 2 через регистры центрального процессора. Потому и кол-во цветов в палитре ограничено четырьмя. Так что, чтобы менять палитру, надо изменять ячейки 2470 и 2472 в ОЗУ ПП. В данных ячейках находится регистр управления цветом для экрана пользователя. Программу в ОЗУ ПП грузить необязательно. Можно их прочесть и записать через канал К2. Необходимо прочесть УКНЦ. Работа с внешними устройствами (https://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=425577#post425577).
Перевод на черновую библиотеки CGLIB.
Oleg N. Cher
04.03.2020, 16:40
Alex_K, благодарю. Чётко то, что надо) Чем Вы так красиво .OBJ расковыряли?) Я дизасмлю IDA Pro, но он не совсем такое выдаёт.
Думаю ограничиться 4-мя цветами. А то, видимо, аксакалы, которые тут обитаются, не зря избегают лезть в ПП-шный битплан. Krakout от BlaireCas использует больше цветов, но там, видимо, устанавливается палитра для каждой строки, я так не умею, ну и пока неинтересно. Надо для начала что-то более штатное.
Программу в ОЗУ ПП грузить необязательно. Можно их прочесть и записать через канал К2.Тёмный совершенно лес. Был бы рад готовому примеру кода, который устанавливает палитру таким способом, вот просто аж до небес)
Наверное надо делать выбор в пользу варианта библиотеки максимально большого размера и копаться-разбираться с нейХоботярыч, там у тебя в архиве все CGLIB разные. Не в том смысле, что разные версии - вообще разные библиотеки. А та, что мы сейчас ковыряем, только одна - самой первой версии с описанием от второй. Только реконструировать, без вариантов. Если знаешь ещё какие-то библиотеки для работы со спрайтами/картинками, кидай.
Ещё вопрос по MACRO-11: как оформить подпрограммы, чтобы при линковке из объектника подключались только нужные? (сейчас у меня подключаются тупо все).
Чем Вы так красиво .OBJ расковыряли?)
С помощью LIBR.SAV вытягивал отдельные модули командой LIBR/EXT. А объектники в MACRO-11 переводились программой DECOBJ.SAV.
- - - Добавлено - - -
Ещё вопрос по MACRO-11: как оформить подпрограммы, чтобы при линковке из объектника подключались только нужные? (сейчас у меня подключаются тупо все).
Это надо каждую подпрограмму оформить в виде отдельного объектного файла, а потом собрать их всех в библиотеку. Как раз CGLIB.OBJ является не объектным файлом, а библиотекой.
Oleg N. Cher
04.03.2020, 17:04
А умеет ли MACRO-11 создавать несколько объектных файлов (или библиотеку) из одного ассемблерного исходника? Или нужно этот исходник для начала порезать на кусочки по подпрограммам?
Обычно передаём на вывод вот такую строку, и затем ставим задержку чтобы ПП очистил экран, заполнив его новыми цветами.Дурацкий вопрос из разряда "а шо если засунуть пальцы в розетку": а шо будет, если не поставить эту задержку?
- - - Добавлено - - -
Я к чему спросил. InitGraph и CloseGraph пихают Esc-последовательности, но не используют задержек.
А умеет ли MACRO-11 создавать несколько объектных файлов (или библиотеку) из одного ассемблерного исходника? Или нужно этот исходник для начала порезать на кусочки по подпрограммам?
Библиотеку создаёт программа LIBR.SAV, потому придётся порезать по кусочкам.
А умеет ли MACRO-11 создавать несколько объектных файлов (или библиотеку) из одного ассемблерного исходника? Или нужно этот исходник для начала порезать на кусочки по подпрограммам?
MACRO создаёт один .OBJ файл, из одного или нескольких текстовых исходников.
а шо будет, если не поставить эту задержку?
Если сразу начать рисовать на экране после команды его очистки - то ПП будет стирать экран пока ЦП что-то рисует, может просто стереться часть того что вы пытаетесь нарисовать.
Oleg N. Cher
04.03.2020, 19:46
ОК. А каким кодом ждём ПП?
Видимо, я порежу Паскаль-исходник на кусочки по процедурам и буду их компилировать и ассемблировать уже по кусочкам. Думаю, что с этим разберусь. Гораздо хуже всё с палитрами обстоит. Чёрная магия, никто не знает как это сделать.
- - - Добавлено - - -
Кстати, я уже столкнулся с тем, что ПП затирает часть изображения, сформированного ЦП. Так что да, всё верно. Но тогда непонятно почему автор CGLIB, явно системщик со стажем, не ждёт ПП в конце процедур InitGraph/CloseGraph. Или этого не требуется в данном случае?
Гораздо хуже всё с палитрами обстоит. Чёрная магия, никто не знает как это сделать.
Ну не такая и чёрная. Читайте литературу, всё описано.
Маленький пример. Числа по умолчанию восьмеричные, R0 - адрес в ОЗУ ЦП, R1 - адрес в ОЗУ ПП, R2 - кол-во слов (2 байта) для обмена.
; Сохранить старый регистр
MOV #2470,R0
MOV #SVPAL,R1
MOV #2,R2
CALL RDPP
; Установить новый
MOV #2470,R0
MOV #NEWPAL,R1
MOV #2,R2
CALL WRPP
; Восстановить старый
MOV #2470,R0
MOV #SVPAL,R1
MOV #2,R2
CALL WRPP
RDPP: MOV #10*400,BLK
MOV R0,BLK+4
MOV R1,BLK+6
MOV R2,BLK+10
CALL CHAN2
RETURN
WRPP: MOV #20*400,BLK
MOV R0,BLK+4
MOV R1,BLK+6
MOV R2,BLK+10
CALL CHAN2
RETURN
CHAN2: MOV #BUF0,R0
MOV #5,R1
MTPS #200
BR 2$
1$: MOVB (R0)+,@#176676
2$: TSTB @#176674
BPL 2$
SOB R1,1$
MTPS #0
RETURN
BLK: .WORD 10*400,32,0,0,0
BUF0: .WORD BLK,-1
SVPAL: .BLKW 2
NEWPAL: .WORD ^B1110111011001100, ^B1010101010001000
Oleg N. Cher
04.03.2020, 23:06
Alex_K, весьма ценный пост, спасибо.
Родил такую процедуру установки цветов палитры:
/*$C
PALET:
MOV #BUF0, R0
MOV #5, R1
MTPS #^O200
BR 2$
1$: MOVB (R0)+,@#^O176676
2$: TSTB @#^O176674
BPL 2$
SOB R1, 1$
MTPS #0
RETURN
BLK: .WORD ^O20*^O400,^O32,^O2470,NEWPAL,2
BUF0: .WORD BLK,-1
NEWPAL: .WORD ^B1110111011001100, ^B1010101010001000
*/
PROCEDURE SetPalette (c0, c1, c2, c3: INTEGER);
BEGIN /*$C
MOVB 8(SP), NEWPAL
MOVB 6(SP), NEWPAL+1
MOVB 4(SP), NEWPAL+2
MOVB 2(SP), NEWPAL+3
CALL PALET
*/
END {SetPalette};
Трудности:
1. перепутанный RGB/GRB (нужно ориентироваться на GRB, т.к. таких машинок сильно больше?)
2. я так понимаю, цвета 1..7 с низкой яркостью не очень пользуется спросом на УКНЦ?
3. процедура понимает на входе значения типа #11, #33, #FF. нужно превращать 1 в #11, т.е. размножить младший полубайт на старший. Подскажите, как закодировать. На Z80 я бы скопировал его в другой регистр, сдвинул бы влево на тетраду и наложил бы по OR
3. процедура понимает на входе значения типа #11, #33, #FF. нужно превращать 1 в #11, т.е. размножить младший полубайт на старший. Подскажите, как закодировать. На Z80 я бы скопировал его в другой регистр, сдвинул бы влево на тетраду и наложил бы по OR
В техническом описании (http://www.emuverse.ru/downloads/computers/UKNC/docs/uknc-to.pdf) описана структура регистра управления цветом, страница 46. Надо, чтобы чётная и нечётная тетрады были одинаковыми, т.к. вы не используете план 0.
Например пусть у нас будут яркие цвета чёрный (00), зелёный (01), красный (10), жёлтый (11). Соответственно:
2470: 1010 1010 1000 1000
2472: 1110 1110 1100 1100
Да, и не забудьте восстановить старое значение при выходе.
Oleg N. Cher
04.03.2020, 23:52
Ну, я и сейчас не уверен, что выход обратно в текстмод RT-11 у меня сделан правильно. Но учту, спасибо.
Норм, если я вместо запоминания палитры и её восстановления после перехода в текстовый режим просто выведу?
.BYTE 33,246,61 ; 80x24 mode
.BYTE 33,240,60 ; Цвет символа
.BYTE 33,241,61 ; Цвет знакоместа
.BYTE 33,242,61 ; Цвет фона
.BYTE 14 ; Clear screen
.BYTE 0
Да, после вывода этих кодов надо ждать ПП или не надо?
Норм, если я вместо запоминания палитры и её восстановления после перехода в текстовый режим просто выведу?
Регистры управления цветом не восстановятся.
.BYTE 14 ; Clear screen - это не очистка экрана!!!
- это не очистка экрана!!!
Да ну!!!:eek_std: А что же это?
Oleg N. Cher
05.03.2020, 00:31
Кстати, в графическом режиме действительно не очистка. В текстовом не знаю.
Хоботыч, ты бы мне сготовил нормальный образ чистой системы, на котором есть только всё минимально для автозапуска DURAK.SAV, и после того, как он отработает, выход обратно в RT-11? Плиз. А то я даже не могу проверить восстанавливается ли обратно надпись РУС/ЛАТ или нет - зациклено.
Я в долгу не останусь, сделаю тебе работу с картинками и спрайтами из OMSI Pascal, особенно если вы мне все будете помогать.
Кстати, в графическом режиме действительно не очистка. В текстовом не знаю.
Так как вы обращаетесь непосредственно к видеопамяти в планах 1 и 2 ЦП, то переводить терминал в графический режим и не надо. Это используется, если вы пользуетесь Esc-последовательностями графики. Но так как вы ими не пользуетесь, то и переводить не надо.
Я говорю про последовательности <Esc>%!0 <Esc>%!1 и <Esc>%!3.
Oleg N. Cher
05.03.2020, 01:49
Alex_K, а можно увидеть корректные последовательности для перехода в графический режим 320x264 (как я понимаю, именно 264, а не 288) и потом обратно из него в текстовый, который принят в RT-11? Терминологию использую в общепринятом смысле, а не в специфически-УКНЦ-шном.
Ещё было бы интересно узнать, какими последовательностями гасится и восстанавливается служебная строка РУС-ЛАТ.
- - - Добавлено - - -
Так, всё оказалось сильно хитрее, чем я думал. Итак, отдельного графического режима у нас нет, есть нечто смешанное. Для общего развития спрошу: что делают эти последовательности кодов? (я их проверил, вроде бы ничего не меняется)
Esc %! (033 045 041) - установка режима работы терминала:
Из четвертого символа используются два младших бита
Esc %!0 - графический режим;
Esc %!1 \
Esc %!2 ! - текстовый режим (система команд VT-52).
Esc %13 /
- - - Добавлено - - -
Вдогонку. Так РУС/ЛАТ не гасится, а вообще уплывает за экран, когда включается ширина 40? Интересно.
- - - Добавлено - - -
Ещё вопрос: если инструкция
BIS #^O10000, @#^O44 ; Disable Ctrl-C
запрещает Ctrl+C, то как разрешить его обратно?
Нужно ли в графической игре запрещать Ctrl+C ?
Хоботыч, ты бы мне сготовил нормальный образ чистой системы,
так сделай просто копию той что у тебя есть PASCAL.DSK - удали всё лишнее,а DURAK.SAV или как он там пропиши в стартовый файл
STARTS.COM - ??? переименуй образ в какой-нибудь DURAK_RELIZ.DSK ) Дел то >0 )
Кстати, в графическом режиме действительно не очистка. В текстовом не знаю
Нигде не очистка! )
Правильную очистку
PROCEDURE CLS;
BEGIN
WRITE(CHR(27),'H',CHR(27),'J');
END;
я тебе стока шпор накидал, всё мимо что ли?
А в графическом хорошо бы пробежаться по экрану циклом обнуления RD экрана )
- - - Добавлено - - -
Вдогонку. Так РУС/ЛАТ не гасится, а вообще уплывает за экран, когда включается ширина 40? Интересно.
https://s8.hostingkartinok.com/uploads/thumbs/2020/03/c630685895d9d608070408eee058d98e.png (https://hostingkartinok.com/show-image.php?id=c630685895d9d608070408eee058d98e)
https://s8.hostingkartinok.com/uploads/thumbs/2020/03/4d065c3807a1abd456112dc4a8c3c367.png (https://hostingkartinok.com/show-image.php?id=4d065c3807a1abd456112dc4a8c3c367)
Нигде не очистка! )
Правильную очистку
PROCEDURE CLS;
BEGIN
WRITE(CHR(27),'H',CHR(27),'J');
END;
В графическом и эта не очистка. В графическом режиме только отрабатывают специальные Esc-последовательности графического режима (рисование точек, линий и т.д. и т.п.). Для выхода из графического режима служит Esc-последовательность <Esc>%!3, в восьмеричных кодах это 033 045 041 063.
А вот в текстовом режиме в УКНЦ для очистки экрана ОБЯЗАТЕЛЬНО надо чистить с помощью кода 014 (восьмеричный, десятичный 12), или Esc-последовательностью <Esc>[r (033 133 162). Это не только очищает экран, но и возвращает таблицу видеострок на начало видеопамяти. А если очищать экран с помощью <Esc>H<Esc>J (033 110 033 112), то экран очистится, но адрес начала видеопамяти 0100000 окажется не в верхнем левом углу, а где-то посередине экрана.
А вот в текстовом режиме в УКНЦ для очистки экрана ОБЯЗАТЕЛЬНО надо чистить с помощью кода 014
но в 7-ке не работает write(chr(12)) - она как раз странным образом крутит рулон и в итоге курсор висит на середине экрана, в то время как h+J работает в любой версии монитора - исхожу из этого.
- - - Добавлено - - -
В графическом и эта не очистка.
дело в том, что не имею опыта работы в этом режиме, вообще ничего про него не знаю,
я работаю с обычным экраном системы в обычной рабочей среде ) Что даёт этот граф.режим - примитивы рисовать (круги,точки,линии???) - да ну их, окошки и без них можно делать, графику я не пишу.
Будет спрайтовый движок - вернёмся к предметному разговору )))
но в 7-ке не работает write(chr(12)) - она как раз странным образом крутит рулон и в итоге курсор висит на середине экрана, в то время как h+J работает в любой версии монитора - исхожу из этого.
В семёрке не работает, это что в Windows 7 :biggrin:
Ну ладно, пошутили и хватит. Всё дело в том, что Паскаль для вывода использует средства операционной системы, а ОС при выводе управляющих символов делает некоторую обработку. В RT-11 V05.07 есть такая команда SET TT [NO]FORM. После подачи команды SET TT FORM код 12 будет спокойно выводится.
После подачи команды SET TT FORM код 12 будет спокойно выводится.
но страдают другие экранчики же!!! для каждой писать командный файл??? ) Есть стандартная вещь HOME - левый верхний угол, J - очистка от курсора и до конца экрана - я пока не видел что бы не работала а не рабочую chr(14B) - видел )))
это справедливо и для ДВК и для УК-НЦ ) Что бывает важно для программы без графики под RT-11.
это справедливо и для ДВК и для УК-НЦ ) Что бывает важно для программы без графики под RT-11.
Если программа чисто текстовая и предназначена и для ДВК, то тогда <Esc>H<Esc>J. А вот если графическая для УКНЦ, то тогда только кодом 12 или <Esc>[r.
Если программа чисто текстовая и предназначена и для ДВК, то тогда <Esc>H<Esc>J.
Если КЦГД - она может быть и графическая. Но насколько я помню, там EHEJ наманно отрабатывается
Если КЦГД - она может быть и графическая. Но насколько я помню, там EHEJ наманно отрабатывается
Я говорил про чистый текст. А <Esc>H<Esc>J нормально будет отрабатываться на УКНЦ, КСМ. На 15ИЭ-00-013 только если он в системе команд VT-52, да и КЦГД можно перевести в систему команд VT-100.
А вот если графическая для УКНЦ, то тогда только кодом 12 или <Esc>[r.
Что я делаю не так? ) Запустил в системе под 7-ркой такой вод код(UKNCBTL) :
! Apxивны дeл ЖД ! ЛAТ
MUZ .MAC 19 09-Mar-1992 121 TEXP .MAC 36 23-Jan-2020 150
CLSTST.MAC 1 05-Mar-2020 212 < UNUSED > 1387 213
7 Files, 66 Blocks
1387 Free blocks
L07>mac CLSTST
L07>lin CLSTST
L07>RU CLSTST
r
L07>TY CLSTST.MAC
START: MOV #<33>, @#177566
MOV #'[, @#177566
MOV #'r, @#177566
CLR R0
EMT 350
.END START
L07>
! Apxивный paздeл ЖД !
Что я делаю не так?
А кто будет ждать готовности в регистре 177564?
А может проще так:
.PRINT #CLSSTR
CLSSTR: .ASCII <33>/[r/<200>
Что я делаю не так? )
Всё
.PRINT #yok
.EXIT
YOK:
.ASCIZ <33>/[r/
А может проще так
получается - этот код очистки лучше всего на ук-нц применять? работает в системе и годен для граф. режима?
Oleg N. Cher
05.03.2020, 21:13
Шото вы ещё больше всё запутали, господа. Хобот, ты как истинный оператор ДВК и знаток Esc-последовательностей и хочешь нормальную реализацию GCLIB - бери её и тесть на предмет нормального переключения в граф. режим и нормального из него выхода. А по поводу граф. движка мне и самому интересно чего можно там закодить. Пока я в недоумении чешу репу, созерцая странные подпрограммы, работающие с теневым буфером. А мне бы пригодилось что-то вроде рисования спрайта, заданного константным массивом.
Впечатления от работы на асме двоякие. Удивило, что BICB не устанавливает флаг нуля. Долго не мог понять почему не работает BICB #^O17, 6(SP) - пока не поменял её на BICB 6(SP), #^O17
Но зато стало понятно, откуда растут уши у языка Си. Это в точности калька с команд PDP-11. Даже грустно как-то.
Вопрос: какая команда быстрее работает - BICB или BIC? В целом, работа со словами предположительно быстрее, чем с байтами, но лучше уточнить. Нигде в доках пока не нашёл времени исполнения разных команд.
В эмулятор Патрона вшита какая-то странная версия LIBR, которая не соответствует описанию, найденному в сети. Вызываю её так:
rt11.exe LIBR CGLIB CG001
rt11.exe LIBR CGLIB CG002
rt11.exe LIBR CGLIB CG003
...
Для пересоздания библиотеки ей надо передать ключик /C (очевидно - CREATE), иначе просто идёт добавление объектников в существующую библиотеку. Как передать ей сразу несколько файлов - пока не понял.
Другая найденная на просторах версия LIBR работает так, как и указано в документации. Вызываю её так:
rt11.exe RUN LIBR CGLIB=CG001,CG002,CG003,CG004,CG005,CG006
При попытке добавить ,CG007 либр кочевряжится (видимо, количество символов ограничено). С этой версией я не понял как добавлять в существующую библиотеку, она всегда пересоздаёт.
Обе версии ругаются матом на дублирование имени MAIN, хотя вроде бы делают то, что нужно.
?LIBR-W-Duplicate module name of .MAIN.
Это странно - никакого глобального символа MAIN в ассемблерном листинге нет.
Но, в целом, терпимо. Жить можно.
Это странно - никакого глобального символа MAIN в ассемблерном листинге нет.
Это не глобальный символ, это название модуля. .TITLE надо добавить
- - - Добавлено - - -
Долго не мог понять почему не работает BICB #^O17, 6(SP) - пока не поменял её на BICB 6(SP), #^O17
Это что то странное. По логике, должно быть именно BICB #^O17, 6(SP) - сбросить младшие четыре бита в байте (или слове - в данном случае без разницы) по адресу 6(SP). И флаг N должен выставиться - только есть нюанс - для BICB - в байте 6(SP) получился полностью ноль, если в байте 7(SP) не ноль - всё равно выставится, а для BIC - только если получится полностью нулевое слово по адресу 6(SP).
А BICB 6(SP), #17 - это сбросить в байте, где лежит 17 те биты, которые установлены в байте, который хранится по адресу 6(SP)
хочешь нормальную реализацию GCLIB
??? с чего ты взял ???
ОПИСАНИЕ МОДУЛЕЙ БИБЛИОТЕКИ TERPAS.OBJ
______________________________________
БИБЛИОТЕКА TURBO ФИРМЫ BUSINESS Universal.
Описание процедур и функций библиотеки TURBO.OBJ V03.00
(расширение стандартной библиотеки PASCAL)
Процедуры:
CLRSCR - очистить от курсора до конца экрана
CLREOL - очистить от курсора до конца строки
GOTOXY(X,Y) - перемещение курсора в позицию X,Y
COLORS(L,S,P) - установка цвета символа (L) ,экрана (S) ,зна-
коместа (P);
PUT8(N) - печать псевдографических символов N=240B-277B
SBROS - применяется перед использованием оператора
READ для сброса спецрежима , установленного
функциями KEYPRESSED и READKEY, когда при на-
жатии на клавишу на экране ничего не отобра-
жается.
Функции:
KEYPRESSED - принимает значения TRUE и FALSE ,в зависимос-
ти от того,была нажата клавиша (TRUE) или нет
(FALSE);
READKEY - выдает код нажатой клавиши;
ENTER(L,U,X,Y) - используется для ввода чисел с контролем
на допустимость значения . L - нижний предел,
U - верхний предел .Режим ввода будет поддер-
живаться пока вводимое число не будет вхо-
дить в указанные рамки . Перед использованием
применение процедуры SBROS не требуется .Если
число не входит в интервал , то независимо от
количества набранных символов происходит сти-
рание первых восьми позиций и курсор переме-
щается в позицию X,Y (кординаты курсора).
Перед использованием процедур и функций данной библиотеки в на-
чале программы необходимо описать их:
PROCEDURE CLRSCR;EXTERNAL;
PROCEDURE CLREOL;EXTERNAL;
PROCEDURE GOTOXY(X,Y:INTEGER);EXTERNAL;
PROCEDURE SBROS;EXTERNAL;
PROCEDURE COLORS(L,S,P:INTEGER);EXTERNAL;
PROCEDURE PUTB(N:INTEGER);EXTERNAL;
FUNCTION KEYPRESSED:BOOLEAN;EXTERNAL;
FUNCTION READKEY:INTEGER;EXTERNAL;
FUNCTION ENTER(L,U:REAL;X,Y:INTEGER):REAL;EXTERNAL;
Координаты курсора находятся в пределах : X=0-79, Y=0-23 .Нача-
лом координат является верхний левый угол экрана (X=0,Y=0). При
достижении 79-й позиции в строке происходит автоматический пере-
ход в начало следующей строки.
- 2 -
Распределение цветов следующее:
0 - цвет фона (прозрачный);
1 - синий;
2 - красный;
3 - сиреневый;
4 - зеленый
5 - голубой;
6 - желтый;
7 - белый.
Отзывы и предложения направляйте в фирму BUSINESS Universal по
тел.470-29-46.
ОСНОВНЫЕ ПРОЦЕДУРЫ
ГРАФИЧЕСКОГО РЕЖИМА ДИСПЛЕЯ "УК-НЦ",
НАПИСАННЫЕ НА ЯЗЫКЕ ПАСКАЛЬ.
1.OCH ........................... - очистка экрана
2.GRAF .......................... - переход в граф.режим
3.SIMV .......................... - переход в симв.режим
4.KOORD(X,Y:INTEGER) ............ - перевод координат в АЦЭ
5.ONE(C:INTEGER) ................ - перевод целого числа в АЦЭ
6.USTCOL(L,P,S:INTEGER) ......... - установка цвета символа,
знакоместа,экрана
7.COLLIN(CL:INTEGER) ............ - установка цвета для прямой
8.COLKON(CK:INTEGER) ............ - установка цвета заполнения
контура
9.ZAPR(X1,Y1,X2,Y2,CZ:INTEGER) - заполнение прямоугольной
области
( левый нижний угол (X1,Y1),
правый верхний угол (X2,Y2),
цвет заполнения - CZ)
10.USTKUR(C1,C2:INTEGER) ......... - установка индексов цвета
алфавитного курсора
11.ZAPOBL ........................ - заполнение области цветом,
установленным в COLKON
12.PEROBL ........................ - перекрашивание области
13.TEKTOC(X,Y:INTEGER) ........... - установка координат текущей
точки ( от которой рисуются
линии и т.д. )
- 3 -
14.VECTOR(X,Y:INTEGER) ........... - рисование вектора
(вектор рисуется от текущей
точки до точки X,Y )
15.TOCH(X,Y:INTEGER) ............. - рисование точки
16.PRAM(X1,Y1,X2,Y2,C:INTEGER) ... - нарисовать прямоугольник
( левый нижний угол (X1,Y1),
правый верхний угол (X2,Y2),
цвет рамки - C ).
17.OBN(X1,Y1,X2,Y2:INTEGER) ...... - очистка окна с символьными
координатами
18.WIN(X1,Y1,X2,Y2,C:INTEGER) .... - прорисовка окна с символьными
координатами
Координаты находятся в пределах X=0-639, Y=0-263 . Началом отсчета
координат является нижний левый угол экрана (X=0,Y=0).
ОСНОВНЫЕ ПРОЦЕДУРЫ
СИМВОЛЬНОГО РЕЖИМА ДИСПЛЕЯ "УК-НЦ",
НАПИСАННЫЕ НА ЯЗЫКЕ ПАСКАЛЬ.
1.KUR(X,Y:INTEGER) .............. - установить курсор в позицию X,Y
2.RKL(VAR A:CHAR) ............... - считать символ без нажатия ВК
3.ZADER(T:INTEGER) .............. - задержка выполнения
4.PER(N:INTEGER) ................ - передача кода символа на дисплей
(целесообразно применять для
8-битных кодов)
5.LPS(L,P,S:INTEGER) ............ - установка цвета сивола,
знакоместа и экрана
(L,P,S=48-55 или 60B-67B)
6.INV ........................... - включение инверсии символа
7.OTMINV ........................ - отмена инверсии символа
8.POD ........................... - включение подчеркивания
символа
9.OTMPOD ........................ - выключение подчеркивания
символа
10.SIZSCR(N:INTEGER) ............. - установка формата экрана
(N=1 - 80x24,
2 - 40x24,
3 - 20x24,
4 - 10x24.)
- 4 -
11.COPYS(Y1,X1,Y2,Y3,DL:INTEGER) - перенос строки экрана в самую
нижнюю (верхнюю) строку,где:
Y1 - номер строки;
X1 - номер столбца;
Y2 - 1 - верхняя строка,
0 - нижняя строка;
Y3 - номер позиции для вывода;
DL - кол-во позиций для вывода.
* Длина нижней(верхней) строки
40 символов
12.COLCUR(C:INTEGER) ............. - установка цвета курсора
(C=48-55 или 60B-67B)
13.CREWIN(X,Y,SX,SY,CB,CS,REV:INTEGER) - прорисовка окна в символьном
режиме :
X,Y - координаты верхнего
левого угла,
SX,SY - ширина по X и Y,
CB - цвет рамки окна
CB=48-55(60B-67B),
CS - цвет символов в окне
CS=48-55(60B-67B),
REV - признак инверсии рамки
(0-нет,1-есть).
Oleg N. Cher
06.03.2020, 02:54
Норм библиотека, но с картинками не работает. Хотя объектник я бы поглядел, чтобы не велосипедить.
??? с чего ты взял ???А, не хочешь? Ну как хочешь. Ты сам где-то тут писал, что хотел бы с картинками работать из Паскаля.
Другая найденная на просторах версия LIBR работает так, как и указано в документации. Вызываю её так:
rt11.exe RUN LIBR CGLIB=CG001,CG002,CG003,CG004,CG005,CG006
При попытке добавить ,CG007 либр кочевряжится (видимо, количество символов ограничено). С этой версией я не понял как добавлять в существующую библиотеку, она всегда пересоздаёт.
В командной строке CSI передаются максимум шесть файлов. Если надо больше, то программы обычно поддерживают ключ //.
А зачем такие сложности. Лучше в RT-11 собрать, удобнее.
LIBRARY Создание и обслуживание объектных и макро библиотек
SYNTAX
LIBRARY[/OPTIONS] библиотека файлы[/OPTIONS]
SEMANTICS
Библиотека - имя библиотечного файла, который создает или
модифицируется. Файлы содержат имена файлов разделенных
запятыми (,). По умолчанию тип выходного файла для листинга
.LST, .MLB для макробиблиотек, и .OBJ для объектных библиотек.
По умолчанию типы входных файлов .OBJ и .MAC.
OPTIONS
ALLOCATE:размер
Резервирует место для выходного файла
CREATE
Создает новую объектную библиотеку
DELETE
Удаляет объектный модуль из библиотеки
EXTRACT
Извлекает объектный модуль из библиотеки и сохраняет его в OBJ-файле
INSERT
Вставляет объектный модуль в библиотеку
LIST[:файл]
Выводит каталог объектной библиотеки
MACRO
Создает макробиблиотеку
NOOBJECT
Запрещает создавать новую объектную библиотеку
OBJECT[:файл]
Задает имя объектной библиотеки
PROMPT
Выдать приглашение программы LIBR, для ввода большо числа имен
файлов (более шести). Завершается вводом //
REMOVE
Удаляет заданный глобальный символ (и соответствующий модуль)
из каталога библиотеки
REPLACE
Замещает существующий модуль более новым
UPDATE
Комбинация ключей /INSERT и /REPLACE
EXAMPLES
LIBRARY/CREATE NEWLIB FIRST,SECOND
LIBRARY/EXTRACT NEWLIB MZ1:ATAN
LIBRARY/INSERT/OBJECT:NEWLIB OLDLIB THIRD,FOURTH
LIBRARY/LIST:TT: OLDLIB
Лучше в RT-11 собрать, удобнее.
Я так думаю, тут вопрос в том, что есть команда RT LIBRARY (сокращённый вариант написания LIBR), а есть программа LIBR.SAV (которая запускается командой LIBRARY с передачей параметров). И если ввести LIBR - то это обращение к команде, а если R LIBR или RUN LIBR - то это запуск программы LIBR.SAV (если команда RUN LIBR FILE1 FILE2 - то это ещё и передача в LIBR .SAV строки команды LIBR2=LIBR1, то по сути это запуск в таком виде RUN LIBR FILE2=FILE1)
Oleg N. Cher
11.03.2020, 12:19
Осилил реализацию Palette и SetPalette. Критика очень приветствуется.
PROCEDURE Palette (n: INTEGER);
BEGIN /*$C
.TITLE CG004
MOV #^O146000, R0 ; #CC00
MOV #^O167252, R1 ; #EEAA
TSTB 2(SP)
BEQ PALET$
MOV #^O135631, R0 ; #BB99
MOV #^O177735, R1 ; #FFDD
DEC 2(SP)
BEQ PALET$
MOV #^O42000, R0 ; #4400
MOV #^O21146, R1 ; #2266
DEC 2(SP)
BEQ PALET$
MOV #^O31421, R0 ; #3311
MOV #^O73525, R1 ; #7755
PALET$: CALL PALET
*/
END {Palette};
/*------------------------------- Cut here --------------------------------*/
PROCEDURE SetPalette (c0, c1, c2, c3: INTEGER);
BEGIN /*$C
.TITLE CG005
BICB 8(SP), #^O17
BICB 6(SP), #^O17
MOVB 6(SP), R0
ASH #4, R0
ADD 6(SP), R0
ASH #4, R0
ADD 8(SP), R0
ASH #4, R0
ADD 8(SP), R0
BICB 4(SP), #^O17
BICB 2(SP), #^O17
MOVB 2(SP), R1
ASH #4, R1
ADD 2(SP), R1
ASH #4, R1
ADD 4(SP), R1
ASH #4, R1
ADD 4(SP), R1
CALL PALET
*/
END {SetPalette};
/*$C
.GLOBL NEWPAL
.GLOBL PALET
PALET: MOV R0, NEWPAL
MOV R1, NEWPAL+2
MOV #BUF0, R0
MOV #5, R1
MTPS #^O200
BR 2$
1$: MOVB (R0)+, @#^O176676
2$: TSTB @#^O176674
BPL 2$
SOB R1, 1$
MTPS #0
RETURN
BLK: .WORD ^O20*^O400, ^O32, ^O2470, NEWPAL, 2
BUF0: .WORD BLK, -1
NEWPAL: .WORD ^B1110111011001100, ^B1010101010001000
*/
Хотел сделать в Palette BICB #3, 2(SP) вместо TSTB 2(SP), но похоже, что оно не устанавливает флаг нуля. Или надо писать BICB 2(SP), #3 ? Или это у меня MACRO неправильный? Так нормальный же. Этот же тот, что в эмуль Патрона вшит.
Кстати, мне так и не ответили по поводу: на PDP-11 какие операции более быстрые - с байтами или со словами?
2 NZeemin: есть основания предположить, что Ваша утилитка rt11dsk [Jan 18 2020 07:46:18] не работает в Windows 10. Вы её там тестировали? Интересует ли больше информации по этому вопросу?
BICB 8(SP), #^O17
Данная команда никаких полезных действия не делает.
Oleg N. Cher, что вы хотели от этой команды?
на PDP-11 какие операции более быстрые - с байтами или со словами?
Смотря для какой конкретной М-ЭВМ.
Для 1801ВМ1 - одинаково.
ВМ2 - целесообразно работать со словами.
ВМ3 на МС1201 - чипсет имеет очень медленную поддержку байтовых операций в ДОЗУ .
Ваша утилитка rt11dsk
если пользуешься Totalom 32-bit - ставь плагин Патрона, будешь .DSK открывать как обычные архивы.
2 NZeemin: есть основания предположить, что Ваша утилитка rt11dsk [Jan 18 2020 07:46:18] не работает в Windows 10. Вы её там тестировали? Интересует ли больше информации по этому вопросу?
Я её и писал под Windows 10.
У других работает.
Не работает у вас - пишите в чём конкретно проблема, конкретно КАК не работает.
Oleg N. Cher
11.03.2020, 23:01
Данная команда никаких полезных действия не делает.
Oleg N. Cher, что вы хотели от этой команды?Лежащий на стеке по заданному смещению байт маскируется по AND #F, т.е. выделяются 4 младших бита. Это так и работает, проверено. Тут было упомянуто, что надо поменять операнды местами, но если так сделать, тогда не работает.
- - - Добавлено - - -
если пользуешься Totalom 32-bit - ставь плагин Патрона, будешь .DSK открывать как обычные архивы.Уже юзаю, спасибо. Мне из батника нужно.
Лежащий на стеке по заданному смещению байт маскируется по AND #F, т.е. выделяются 4 младших бита. Это так и работает, проверено. Тут было упомянуто, что надо поменять операнды местами, но если так сделать, тогда не работает.
Всё дело в том, что команда BIC очищает заданные биты, т.е. делается операция dst := dst .and. not(src). Поэтому если вам надо оставить какие-то биты, то src надо задавать инверсным, т.е. BIC #^O177760,8(SP). Можно иначе BIC #^C^O17,8(SP).
Oleg N. Cher
12.03.2020, 11:36
Не работает у вас - пишите в чём конкретно проблема, конкретно КАК не работает.Это не у меня. Без аргументов запускается, но не делает, как минимум, операций удаления файла из образа и записи файла в образ. Без любого вывода. Я запросил побольше инфы у человека.
Такой вопрос. Вывод тайла, кратного по горизонтали восьми, я уже даже, пожалуй, осилю написать сам. Интересует вывод спрайта/тайла по любым произвольным координатам. Ну, пусть даже кратным 2 или 4 (по X). В четырёхцветном режиме. Есть уже где-то такое реализовано? Чтобы велосипед не изобретать.
Также интересуют другие способы вывода графических примитивов, на данном этапе больше блочных, чем по точкам. Задуманный мной порт игры будет работать в тайловом разрешении Спектрума 32x24, соответственно, хорошо ляжет на УКНЦ в виде размера тайла 10x11. Есть ли реализованный вывод такого размера тайлов?
Oleg N. Cher
13.03.2020, 15:20
Никита, ложная тревога. Проблемка была не в утилите. Сейчас сложно сказать в чём, но самое разумное, что я могу придумать, это что образ .DSK был заблокирован эмулятором. Сейчас всё работает хорошо.
Все, кто пишет игры для УКНЦ. Давайте разработаем подпрограмму, которая выводит двухцветный спрайт указанного размера указанными цветами (из четырёх). Если такого конечно ещё нет. Эта подпрограмма будет полезна, в играх для УКНЦ много подобной графики. Также ею можно будет выводить буквы и другие символы. Координаты в идеале сделать произвольными. Высоту и ширину в идеале тоже. Если это слишком сложно, можно сделать координату X и ширину кратными 2, 4 или хотя бы 8, хотя это серьёзно снизит ценность данной подпрограммы. Есть ли у кого подобные наработки? Понятно, что для скорости нужны маски и битовые сдвиги. У меня с асмом пока не очень получается, а попиксельно будет слишком медленно.
Конечно интересует вывод и 4-цветной картинки.
ПП вывода спрайта в любую точку:
(Формат спарйтов: первое слово ширина-высота последующие планы 1,2)
PTSPR:
; R5 - указатель на спрайт
MOV R0,-(SP)
MOV R1,-(SP)
1$:
4$: CALL XYTOSC ; R3 адрес видеобуф. R4.. сдвиг
MOV R3, @#176640
MOV (R5)+,R0 ; размеры спрайта
CLR R1
BISB R0,R1 ; ширина спр
BIC #177400, R1
SWAB R0
BIC #177400, R0 ;высота спр
MOV R1,R3
MOV R0,3$+2
MOV R4,R0
ADD R0,R0
ADD #MASK,R0
MOV (R0),5$+2
22$: MOV R3,-(SP) ; Сохранить R3 на стеке
MOV @#176640,-(SP) ; Сохранить регистр адреса планов 1,2 на стеке
11$:
CLR R0 ; R0 = 0
MOV (R5)+,R1 ; (R5)+ -> R1
ASHC R4,R0 ; R0.R1 << R4
BIS R0,R1 ; R1 = (R5)+ rol R4
MOV R1,R0 ;
5$: BIC #7417,R0 ; Оставить старшие части сдвинутых байт 0x0f0f
BIS R0,@#176642 ; (план 1,2) = (план 1,2) | R0
INC @#176640 ; Прирастить регистр адреса планов 1,2
BIC R0,R1 ; Оставить младшие части сдвинутых байт
SWAB R1
BIS R1,@#176642 ; (план 1,2) = (план 1,2) | R1
SOB R3,11$ ; Цикл на R3 итераций
MOV (SP)+,@#176640
ADD #80.,@#176640
MOV (SP)+,R3
3$: DEC #0
BNE 22$;
;----------------------------------------------
6$:
MOV (SP)+,R1
MOV (SP)+,R0
RETURN
;----------------------------------------------------------------
MASK:
.WORD ^B0000000000000000
.WORD ^B0000000100000001
.WORD ^B0000001100000011
.WORD ^B0000011100000111
.WORD ^B0000111100001111
.WORD ^B0001111100011111
.WORD ^B0011111100111111
.WORD ^B0111111101111111
.WORD ^B1111111111111111
;----------------------------------------------------------------
; Подпрограмма: преобразовать координаты X,Y в адрес на экране R3 и смещение R4
; Вход: R3 = Y R4=X)
; Выход: R3 = адрес на экране, R4 = смещение 0..7
;----------------------------------------------------------------
XYTOSC:
MOV R0,-(SP)
MOV R2,-(SP)
MOV @#SCRADR,R0 ;начало видеопамяти
2$: MOV R4, R2 ; берём X
ASR R2
ASR R2
ASR R2 ; получаем номер байта в строке
ADD R2, R0 ; получили готовый адрес на экране
BIC #177770, R4 ; оставляем только смещение 0..7
MOV R3,R2
BIC #177400, R3 ; байт Y теперь в нижнем байте R3
MUL #80.,R2
ADD R0,R3
1$:
MOV (SP)+,R2
MOV (SP)+,R0
RETURN
;----------------------------------------------------------------
SuperMax
14.03.2020, 09:13
Никита, ложная тревога. Проблемка была не в утилите. Сейчас сложно сказать в чём, но самое разумное, что я могу придумать, это что образ .DSK был заблокирован эмулятором. Сейчас всё работает хорошо.
Все, кто пишет игры для УКНЦ. Давайте разработаем подпрограмму, которая выводит двухцветный спрайт .
вопрос - откуда фиксация на двухцветности ? УКНЦ таки может 16цветов
которая выводит двухцветный спрайт .
Наверное не двухцветный (однобитный), а четырехцветный в двух планах. (потому что нет доступа к ПП)
УКНЦ таки может 16цветов
16 цветов в одной строке не получится, только если выделить область экрана с другой яркостью.
Oleg N. Cher
14.03.2020, 10:56
Двухцветность нужна, чтобы экономить память. На Спеке двухцветные тайлы, других и нет. Раз я буду портировать со Спека :-)
На Спеке двухцветные тайлы
Тайлы-то однобитные зато атрибуты цветные. Все равно придется в два плана хотя бы перекрашивать поскольку в возу передается слово (1 и 2й планы сразу).
Oleg N. Cher
14.03.2020, 11:31
Ну можно парочкой вызовов двухцветных тайлов с прозрачным фоном нарисовать несколько цветов, если понадобится. Памяти-то мало. Экономить нужно. А то под все карты не хватит ;-)
Экономить нужно. А то под все карты не хватит ;-)
Экономить нужно не на цветности спрайтов, а на способе хранения и отрисовке.. как я выше тебе говорил. Там на все про все уйдет несколько килобайт.
Ну можно парочкой вызовов двухцветных тайлов с прозрачным фоном нарисовать несколько цветов, если понадобится.
Интересно каким образом? И в чем смысл? Когда ты можешь в два раза быстрее отрисовывать.
Oleg N. Cher
14.03.2020, 13:35
Ладно, уговорил) Будем хранить всё четырёхцветным. Пока не упрёмся рогом в ограничения данного способа. ;-)
Oleg N. Cher
15.03.2020, 08:22
Можете объяснить, что делает инструкция DEC #0 ?
вопрос - откуда фиксация на двухцветности ? УКНЦ таки может 16цветовВ графике? Точно 16, не 8? Или имеется в виду цветность через палитры? Тогда вроде даже больше.
В старых машинках при минимуме цветов было общепринято юзать графику, которая исполнена одним цветом. Поэтому можно такую графику хранить в виде битов, где 1 - цвет (выбранный из), и 0 - либо прозрачность, либо цвет фона, либо ещё один цвет (выбранный из). Ессно, я не предлагаю это для динамических объектов, только для статики и прочей декоративной графики.
Можете объяснить, что делает инструкция DEC #0 ?
Выше записывается счетчик цикла: MOV R0,3$+2
Oleg N. Cher
16.03.2020, 20:03
Выложил работающую процедуру вывода спрайта, адаптированную для работы из OMSI Pascal:
• https://github.com/Oleg-N-Cher/UkncDev
http://i.piccy_.info/i9/35235849db3c7d787a252c4d71ba5d6f/1584377986/64296/1320134/auJzyh97bfU.jpg
- - - Добавлено - - -
По ссылке будет храниться вся подсистема с текущим снапом. Вызывается всё из XDev. Там есть батники, по которым можно понять как собирать. Цель, которую я преследую: не только разобраться с графическими примитивами в УКНЦ, но и сделать более лёгкий старт для желающих покодить для УКНЦ (а может и для БК/ДВК) тем людям, которые точно не будут копаться в ассемблере.
Сейчас стоит задача адаптировать вывод спрайта под произвольную ширину. При этом ширина должна задаваться не в байтах, а в пикселях. Возражения слышал, пусть в байте будут незначащие разряды. Всё равно такой вывод спрайта очень нужен. Помощи буду рад.
Oleg N. Cher
17.03.2020, 11:07
Как оказалось, данная процедура вывода спрайта выводит только по OR. Приделать AND и XOR не составит особого труда, но мне бы пригодился вывод с чисткой именно пиксельной, а не знакоместной маской. Т.е. как я себе это представляю: первый и последний байт строки в экранной памяти обрабатывается специальной маской, которая чистит пространство под вывод спрайта нужного размера. Средние строки выводятся просто по MOVB, т.е. замещают собой содержимое экрана. Для упрощения можно минимальную ширину спрайта сделать 8 пикселей (1 байт).
Есть сочувствующие и желающие мне помочь в этом деле? Чтобы в итоге получилась нормальная универсальная подпрограмма вывода спрайтов. Только без антимонии и философии типа "нафиг оно надо", ок? Это контрпродуктивно.
Остаётся удивляться, почему у вас нет такой нормальной готовой процедуры вывода спрайтов.
Средние строки выводятся просто по MOVB,
Какой MOVB???? Ты выводишь слово в первый и второй план сразу.
Остаётся удивляться, почему у вас нет такой нормальной готовой процедуры вывода спрайтов.
Потому что это не нормальная, а извратная процедура.. все делается гораздо проще с помощью маски без всяких затираний.
Oleg N. Cher
17.03.2020, 11:38
Ладно. Формулирую требования к процедуре вывода спрайта:
1. Спрайт четырёхцветный для работы из ЦП. Формат: ширина (в пикселях); высота (в пикселях); данные спрайта
2. Координаты задаются в пикселях
3. Длина и ширина спрайта задаётся в пикселях. Если ширина не кратна 8, то незначащие биты данных спрайта при выводе игнорируются: допустим, при ширине 12 [XXXXXXXX][XXXXOOOO]: X заюзанная точка, O игнорируемая.
4. Экранное место под вывод спрайта длина*ширина чистится. Вывод по XOR, OR и AND не нужен (собственно, нужен, но для него процедура уже есть)
Экранное место под вывод спрайта длина*ширина чистится.
Когда ты выводишь BISом под спрайтом тоже все чистится, поставь между первым и вторым BISом CLR и проверку на последний байт по ширине (его не стирай):)
Если ты уже вывел спрайт и тебе нужно передвинуть его на одну точку, согласно твоему ТЗ как ты сотрешь предыдущий???
Oleg N. Cher
17.03.2020, 12:04
Согласно моему ТЗ, вывод спрайта будет затирать весь прямоугольник под спрайтом, т.е. я его выведу сразу поверх старого. Если был сдвиг на 1 пиксель вправо или влево, то останется затереть только вертикальную линию слева или справа. Но у меня в игре такого вывода не будет.
Ты видел бегающего чувачка в 71853? Там 4 спрайта в разных фазах. Просто познакоместный вывод одной фазы спрайта поверх спрайта в другой фазе.
FOR x := -2 TO 30 BY 2 DO
FOR phase := 1 TO 4 DO
gr.PTBL(x, 0, phase);
b.PAUSE(5);
END;
END;
С выводом по OR так не получится. А если перед выводом каждой файзы вначале чистить прямоугольник, то да, будет мерцать. Поэтому чистку надо совместить с выводом.
- - - Добавлено - - -
Когда ты выводишь BISом под спрайтом тоже все чиститсяРазве? А, по-моему, нет. BIS делает наложение данных спрайта по OR с данными, уже находящимися на экране. Тогда как чистка подразумевает их замещение. Т.е. если на экране единицы, а в спрайте нули, то это нули должны затереть единицы.
поставь между первым и вторым BISом CLR и проверку на последний байт по ширине (его не стирай):)А что это даст? Судя по моим прикидкам, всё обстоит сложнее. Но я не очень досконально понимаю как оно работает. Всё ещё плаваю. :(
А что это даст? Судя по моим прикидкам, всё обстоит сложнее.
До цикла вывода нужно сделать BIC (NOT(от счетчика сдвига)), а после BIC(маску от счетчика сдвига).
в середине CLR. Проще сразу маску на весь спрайт использовать.
Логичнее сделать отдельную процедуру очистки заданного участка, а не пихать ее в вывод спрайта, поскольку она не всегда нужна будет.
Разве? А, по-моему, нет. BIS делает наложение данных спрайта по OR с данными, уже находящимися на экране. Тогда как чистка подразумевает их замещение. Т.е. если на экране единицы, а в спрайте нули, то это нули должны затереть единицы.
поставь между первым и вторым BISом CLR и проверку на последний байт по ширине (его не стирай)
см выше.
- - - Добавлено - - -
Остаётся удивляться, почему у вас нет такой нормальной готовой процедуры вывода спрайтов.
Такая процедура нужна только под конкретное приложение (для тебя), чтобы карты в стопочку сложить друг на друга :)
У меня обычно если спрайты накладываются они должны бабахнуть :)
- - - Добавлено - - -
В твоем случае карты же не будут двигаться?
1. сделай ширину кратную байту
2. выводить только видимую часть карты (смысл накладывать, стирать - делать кучу лишних тормозов).
Действительно полезная процедура - вывод части спрайта.
Oleg N. Cher
17.03.2020, 13:54
С картами я разберусь, тут бы со спрайтами сперва разобраться. Делать ширину, кратную байту, не с руки. Придётся перепланировать всю графику, получится уже другая игра.
Вопрос актуален именно в исходной формулировке.
Про пользу от вывода части спрайта не спорю. Но как - тоже по OR?
- - - Добавлено - - -
Логичнее сделать отдельную процедуру очистки заданного участка, а не пихать ее в вывод спрайта, поскольку она не всегда нужна будет.Думал об этом. Но с предварительной чисткой будет сильнее мерцать. А если совместить чистку с выводом линии, то не так.
Иногда так делают для монохрома:
Берут по XOR накладывают спрайт на экран... Потом его же накладывают ещё раз по XOR и фон восстановлен.
Не уверен точно, насколько эта метода применима тут...
Так когда-то "живой курсор" реализовывал на графиках.
Вывод по XOR, OR и AND не нужен
как-то так.
Мерцать будет сильно.
Да и в первом случае, если двигать полосы пойдут (если не привязывать к КСИ)
Oleg N. Cher
17.03.2020, 14:15
... потому что уже есть.
- вот так звучит контекст полностью.
Alex, да. Знаю об этом способе.
- - - Добавлено - - -
Для человека, далёкого от УКНЦ, самым естественным способом вывода спрайта или картинки будет именно такой, как я запросил выше. Но нет, мне предлагают извращаться ;-)
- - - Добавлено - - -
Хитрые способы я не отрицаю, но они вспомогательные. Основной... ну, мне нужен быстрый вывод тайлов 10x11 с перекрытием одной поверх другой, и отнюдь не по OR. Так вот, универсальная процедура могла бы делать и такой вывод, пусть и не столь быстро, как узко заточенная именно под этот размер тайла.
1. Не делай дырок внутри спрайта или заполни их другим цветом.
2. Продемонстрируй на своем примере (со своими тайлами), что именно не устраивает.
Тогда уже можно будет разбираться, а то только разговоры разговариваешь. Сначала у тебя вообще процедуры вывода спрайта не было, теперь есть.. опять не нравится.. то "гранаты не той системы" :)
- - - Добавлено - - -
Если у тебя тайлы 10х11 проще и быстрее сделать наоборот спец процедуру с заготовленной маской на каждый сдвиг. Будет летать, а универсальная с таким подходом - это как раз изврат.
BlaireCas
17.03.2020, 17:24
Молодец что выложил на гитхаб. А то я долго-бы разбирался как запустить чортов паскуаль под RT-11 и как там делать вставки на макро.
ТЗ норм - вывод спрайта с ЦП. Спрайт пусть буден кратен 8-ми пикселям по X. Вывод в любое место.
Чужие пиксели не трогать при выводе.
Кроме mov R0,@#176642 никаких других записей в планы. (никаких bic R0, @#176642 - иначе может мигать).
От себя добавлю - никаких "круглых" спрайтов (то-есть скругленные углы карт например БУДУТ оставлять черные дырки, иначе вместе со спрайтом хранить маску, некруто). Для начала "квадратный спрайт", но вывод в любое место до пикселя.
(да, надо будет читать планы, читать графоний, шифтить цвета, складывать, записывать обратно в планы mov-ом, но думается это не архимегасложно, правда это будет тормозно, но вообщем попробую помочь там переделать твое PutSpr, я конечно не спец по оптимизации)
никаких bic R0, @#176642 - иначе может мигать
Там будет и BIC и BIS и COM, а в варианте до 16 пикселей, только они и будут. (MOV будет если >16 пикселей).
Спрайт пусть буден кратен 8-ми пикселям по X
мне нужен быстрый вывод тайлов 10x11 с перекрытием
Поэтому я и говорю, что лучше сделать до 16 ти пикселей отдельную процедуру.
- - - Добавлено - - -
(да, надо будет читать планы, читать графоний, шифтить цвета, складывать, записывать обратно в планы mov-ом, но думается это не архимегасложно, правда это будет тормозно, но вообщем попробую помочь там переделать твое PutSpr, я конечно не спец по оптимизации)
Не нужно читать планы, просто нужна маска (в PutSpr сдвиговая маска уже есть- ее можно использовать), зачем в дебри лезть.
- - - Добавлено - - -
мне нужен быстрый вывод тайлов 10x11 с перекрытием одной поверх другой, и отнюдь не по OR.
И каким же волшебным способом ты их будешь накладывать?
BlaireCas
17.03.2020, 18:46
https://i.imgur.com/M0ORIeM.png
Попробовал на 8-ми пикселях. (сама карта полного размера как спрайт, просто отрисовывается первые 8 пикс (столбец) но с любым сдвигом по x, y.
PutSpr(21, 20, Spr);
PutSpr(25, 26, Spr);
Как видно "уголок" второй карты затер первую черным цветом. Но остальное норм.
Теперь надо как-то зациклить до полной карты и нарисовать отдельно "задник".
Там только команды mov при записи в планы (чтение есть, но при записи используется только mov).
Жутко нехватает регистров, да и больше извраты паскаля приходится изучать.
Как видно "уголок" второй карты затер первую черным цветом.
У "универсальной" процедуры так и будет. (можно обойтись без чтения)
Oleg N. Cher
19.03.2020, 10:28
Молодец что выложил на гитхаб. А то я долго-бы разбирался как запустить чортов паскуаль под RT-11 и как там делать вставки на макро.Ну да, чуть-чуть поморочились, но там всё цивильно - вполне можно юзать. Порождаемый асм-файл легко посмотреть, вставки на асме организованы хорошо, поэтому OMSI Pascal признаем вполне годным инструментом.
ТЗ норм - вывод спрайта с ЦП. Спрайт пусть буден кратен 8-ми пикселям по X. Вывод в любое место.
Чужие пиксели не трогать при выводе.Согласен, но полезность подпрограммы будет сильно выше для спрайтов, не кратных 8 по ширине. Пусть он лучше будет по ширине >= 8 пикселей, т.е. гарантированно байт - для упрощения вывода. Более узкие спрайты, пожалуй, вряд ли понадобятся, по крайней мере, для задуманной игры.
При выводе спрайта через логические операции AND/OR/XOR подпрограммой S_V_B кратность ширины спрайта восьми некритична, поскольку чужие пиксели не затираются, а происходит наложение данных спрайта на данные на экране. Но при замещении точек на экране точками спрайта гораздо полезнее (хотя и сложнее в реализации, и даже несколько медленнее) будет вывод спрайта любой ширины, не обязательно кратной восьми. Хотя конечно первую версию подпрограммы можно сделать и с кратной.
Просто если портировать со спека, то тайловая карта 32x24 в разрешении УКНЦ диктует размер тайла 10x11. Тут есть по сути два подхода:
1. Придерживаться оригинального Спеко-разрешения, как следствие - мириться с неполным заполнением экрана и некоторым искажением пропорций графики из-за нарушения соотношения точек - из-за их неквадратности.
2. Вариант с адаптацией графики под разрешение УКНЦ, что конечно потребует её доработки, но в целом видится более желательным.
От себя добавлю - никаких "круглых" спрайтов (то-есть скругленные углы карт например БУДУТ оставлять черные дырки, иначе вместе со спрайтом хранить маску, некруто).Согласен. Для круглых спрайтов у нас есть вывод с логическими операциями. Подпрограмма S_V_B здесь очень подходит.
но вообщем попробую помочь там переделать твое PutSpr, я конечно не спец по оптимизации)Не страшно, если будет не прям супер-мега-оптимально, главное чтобы работало. Скорости для карточной игры должно хватить.
сделать и с кратной.
просто добавлю для инф.
в редакторе спрайтов "Магнифайер" минимальный шаг по X был 8, то есть выделение прямоугольника
для трансляции в МАКРО было по ширине всегда кратно 8, а по высоте любым , хоть с весь экран рабочий )
Не нужно читать планы, просто нужна маска (в PutSpr сдвиговая маска уже есть- ее можно использовать), зачем в дебри лезть.
Выше я пытался сказать, что нужно сделать что-то типа такого:
; так сделано у меня, потому что я стираю предыдущий спрайт, у себя можешь использовать
значения после вызова XYTOSC
MOV (R2)+,@#176640; адрес
MOV (R2)+,R1 ;ширина
MOV (R2)+,3$+2 ;высота
MOV (R2)+,R3 ;Сдвиг
;-----------------------------
ADD R3,R3
ADD #MASK,R3
MOV (R3),R0
;------------------------------
111$:
MOV R1,-(SP)
MOV @#176640,-(SP)
2$:
COM R0
BIC R0, @#176642
INC @#176640
COM R0
BIC R0, @#176642
SOB R1,2$
MOV (SP)+,@#176640
MOV (SP)+,R1
4$:
ADD #80.,@#176640
3$: DEC #0
BNE 111$
;---------------------------------
; Маска есть уже в PUTSPR
MASK:
.WORD ^B0000000000000000
.WORD ^B0000000100000001
.WORD ^B0000001100000011
.WORD ^B0000011100000111
.WORD ^B0000111100001111
.WORD ^B0001111100011111
.WORD ^B0011111100111111
.WORD ^B0111111101111111
.WORD ^B1111111111111111
Можно вынести в отдельную процедуру или
COM R0
BIC R0, @#176642
.........
.........
COM R0
BIC R0, @#176642
Вставить в PUTSPR перед записью в планы
Oleg N. Cher
19.03.2020, 22:07
Хобот, кратность восьми по ширине логична, потому что данные спрайтов задаются в байтах. Но нам нужна универсальная процедура вывода некратных по ширине восьми спрайтов, тогда справа просто будут незначащие биты:
[XXXXXXXX] [XXXXXXXX] [XXXXOOOO] - где биты O, допустим, не используются. Вот такую процедуру надо, много где пригодится.
BlaireCas обнадёжил, вот с нетерпением жду, чего накодит. :-)
SuperMax
20.03.2020, 07:45
Хобот, кратность восьми по ширине логична, потому что данные спрайтов задаются в байтах. Но нам нужна универсальная процедура вывода некратных по ширине восьми спрайтов, тогда справа просто будут незначащие биты:
[XXXXXXXX] [XXXXXXXX] [XXXXOOOO] - где биты O, допустим, не используются. Вот такую процедуру надо, много где пригодится.
BlaireCas обнадёжил, вот с нетерпением жду, чего накодит. :-)
совет - не делать универсальную
делать набор процедур оптимизированных под разную ширину
те на байт - одна
на два байта - другая
и с некратной шириной другая
ибо у универсальной
- объем кода вырастает
- скорость падает
BlaireCas
20.03.2020, 11:38
Накодил:
PROCEDURE PutSpr (x, y: INTEGER; PROCEDURE spr);
BEGIN /*$C
.TITLE CG008
MOV R2, -(SP)
MOV R3, -(SP)
MOV R4, -(SP)
MOV R5, -(SP)
MOV 16(SP), R4 ; X
MOV 14(SP), R3 ; Y
MOV 10(SP), R5 ; R5 - pointer to sprite
mov (R5), -(SP) ; DX
mov (R5)+, -(SP) ; DX
mov (R5)+, -(SP) ; DY
mov R5, -(SP) ; spraddr w/o dx, dy
tst -(SP) ; reserving for vaddr
;----------------------------------------------
mov R3, R1 ; R0 = DY*80
ash #3, R1 ; ^_^
mov R1, R0 ; change to mul
mov R3, R1 ; it's just for fun
ash #1, R1 ; dunno will it be faster
add R1, R0 ;
ash #3, R0 ;
mov R4, R1 ;
ash #-3, R1 ;
add R1, R0 ; R0 += DX/8
add #^O100000, R0
mov R0, @#^O176640 ; vaddr
mov R0, (SP) ; vaddr -> (SP)
mov R4, R0 ; shift value
bic #^B1111111111111000, R0 ; if it = 0 - use simple sprite out
bne 10$
; // sprite out with X aligned to 8 pix //
mov #^O176642, R0
mov #^O176640, R1
mov #80., R3
sub 6(SP), R3
2$: mov 6(SP), R2 ; DX
4$: mov (R5)+, (R0)
inc (R1)
sob R2, 4$ ; cycle by DX
add R3, (R1)
dec 4(SP) ; cycle by DY
bne 2$
jmp 99$
; // sprite out with arbitrary X //
10$: mov R0, R3 ; R3 = shift value
asl R0 ;
mov MASK(R0), R4 ; R4 = mask value
asl 6(SP) ; DX = DX * 2
20$:
; // draw first DY part //
mov (SP), @#^O176640 ; vaddr
mov 2(SP), R5 ; spraddr
mov 4(SP), R2 ; DY
30$: mov (R5), R1
ash R3, R1
bic R4, R1
com R4
mov @#^O176642, R0
bic R4, R0
com R4
bis R1, R0
mov R0, @#^O176642
add #80, @#^O176640
add 6(SP), R5 ; R5 = R5+DX2
sob R2, 30$
inc (SP) ; inc vaddr
; // draw second DY part //
mov (SP), @#^O176640 ; vaddr
mov 2(SP), R5 ; spraddr
mov 4(SP), R2 ; DY
com R4 ; invert mask
40$: mov (R5), R1
swab R1
movb R1, R0
ashc R3, R0 ; R0:R1 << R3
bic R4, R0 ; apply mask
com R4
mov @#^O176642, R1
bic R4, R1
com R4
bis R0, R1
mov R1, @#^O176642
add #80, @#^O176640
add 6(SP), R5
sob R2, 40$
com R4 ; invert mask
add #2, 2(SP) ; spraddr += 2
dec 8(SP) ; cycle by DX
bne 20$
;----------------------------------------------
99$: tst (SP)+
tst (SP)+
tst (SP)+
tst (SP)+
tst (SP)+
MOV (SP)+, R5
MOV (SP)+, R4
MOV (SP)+, R3
MOV (SP)+, R2
*/
END {PutSpr};
https://i.imgur.com/yfgBILs.png
Сделано НУ ОЧЕНЬ неоптимально и тормозно. Я не пытался ничего оптимизировать. Просто как заготовка - дальше можно самому там оптимальности добавлять.
Что поменял - размеры спрайта не в байтах, а в словах в дата для спрайта (ну это легко подправить, я просто не любитель байтов)
Также вывод как видите без маски - то-есть если нужно делать скажем круглую картинку (скругленные края и т.д.) - нужно будет еще и маску в спрайте держать, как-то не хочется.
Исходники и .sav : 71879
Oleg N. Cher
20.03.2020, 15:07
BlaireCas, скорость очень хорошая. В идеале очень бы хотелось добавить в этот вывод некратность спрайтов восьми (чтобы ширина задавалась в пикселях). Не настаиваю, попробую сам закодить. Хотя не знаю, как пойдёт...
Процедуру S_V_B тоже оставим в библиотеке и переименуем в PutOr.
Процедуру S_V_B тоже оставим в библиотеке и переименуем в PutOr.
Добавь то о чем я распинался выше (стирание прямоугольника с любой точки), пригодится для PutOR.
Oleg N. Cher
20.03.2020, 18:05
Извини, я не очень разобрался как это работает. Опишешь подробнее?
А то вроде PutOr и так работает нормально и ожидаемо.
Работает точно так же как PutOr только проще. Должна предшествовать PutOr, после вызова XYTOSC если ты хочешь стереть область под спрайтом.
Присмотрись к маске.. получив сдвиг ты выбираешь нужное слово для двух планов, стираешь точки для первого байта и соответственно инвертируя стираешь точки для второго байта. (надеюсь ты понимаешь, что если ты байт сдвинул то он всенепременно вылезет в следующий байт)..
- - - Добавлено - - -
Или несколькими строчками вставить в PutOr, но тогда ты лишишься чистого OR и получишь "вожделенную" универсальную процедуру.
- - - Добавлено - - -
Это максимум, что можно сделать для универсальной процедуры, дальше уже идет специфика.. т.е. нужно думать, что и как ты хочешь вывести.. если однотипные тайлы то нужно писать спец. процедуру под них, которая будет в разы быстрее.
Oleg N. Cher
20.03.2020, 19:03
S_V_B, ок. То есть, ты предлагаешь модификацию процедуры Put так, что она будет чистить прямоугольник нужного нам размера (кратного по ширине восьми, насколько я понимаю). И можно будет использовать её чтобы чистить место перед выводом спрайта по OR. Нормальное решение. Хотя идея чистить и выводить каждую линию сразу кажется мне более интересной. Но норм.
Не будет ли большой наглостью с моей стороны попросить готовый протестированный код? У меня сейчас такое восприятие асма: на уровне отдельных команд вроде всё понятно, а целиком - теряюсь. Вроде бы понял как обращаться к экранной памяти, а всё равно гляжу в ваш с BlaireCas код и теряюсь.
Спасибо заранее.
Вот ты вроде продвинутый.. шестнадцатиричные числа читать умеешь, а простых вещей понять не можешь.., а говоришь, что паскаль - вершина языков программирования.. (понятная для всех неофитов).
Как грустно созерцать что случилось с мечтами идеалистов..(в белых халатах на лету читающих перфоленты)..Интернет.. для "мгновенного общения" ученых (обмен результатами акспереминтов).. результат - запись задниц в 8K, вместить в 2к программу "Апалон"...в итоге языки для "ДОМОХОЗЯЕК"... +БОЛЬШЕ ПОКУПАЕШЬ - МЕНЬШЕ ТРАТИШЬ...(но сцука законы природы не обмануть - сколько вложил - столько плучил)
Oleg N. Cher
20.03.2020, 19:13
Или несколькими строчками вставить в PutOr, но тогда ты лишишься чистого OR и получишь "вожделенную" универсальную процедуру.Хочешь сказать, что такую же процедуру, как написал BlaireCas, можно получить гораздо проще и короче? Да, это интересно. Ты точно уверен, что всё учёл?)
- - - Добавлено - - -
Вот ты вроде продвинутый.. шестнадцатиричные числа читать умеешьА ты вот вроде тоже продвинутый, а не понимаешь, что любое написание кода на асме требует практики. Много практики. Даже если ты пересел с одного асма на другой, то другой для тебя в чём-то terra incognita.
Паскаль да. Простой язык для всех, кто любит программировать. Лёгкий и быстрый старт. Проверено.
Не будет ли с моей стороны наглостью попросить прочитать хотя бы пару книжек про УКНЦ.. тогда можно будет говорить предметно.
Или ты думаешь, что на паскале 79 года можно сотворить "нетленку", на машине которая для него не предназначалась?
Я вот тоже хотел пройти мимо УКНЦ.. но вот блин уже два года парюсь":)
Oleg N. Cher
20.03.2020, 19:25
Не собираюсь творить "нетленку", к чему ты мне это приписываешь?
Книги по УКНЦ не художественная литература. Плююсь, но использую в качестве справочников. Но плююсь.
- - - Добавлено - - -
Меня УКНЦ интересует исключительно как машинка из моего детства. Компьютерный класс, чёрно-белые экраны, дискеты, машина учителя, машины учеников, загружаемые по сети... игры, Паскаль.
Ну или как "ещё одна платформа", для которой можно покодить. Но фанатеть именно как Хобот я от УКНЦ не буду.
Фанатеть не нужно, в те давние времена, когда про ЯВУ еще никто не слышал, инженеры DEC придумали ассемблер "для людей".. и говорить, что он не понятен - нонсенс. (с учетом что ты знал другие ассемблеры)...ты все время тычешь каким-то "непонятным OR", а тут тебе говорят BITSET - установи нужные биты, BIC - очисти нужные биты...... этож просто сказка.. почитай, а через пару месяцев... поговорим :)
- - - Добавлено - - -
Кстати я уже немножко начал вкуривать "дзен".. и уже отличаю людей которые называют "адрес экраннной памяти" - знакоместом. - таким никогда не сделать крутой геймы :)
Oleg N. Cher
20.03.2020, 19:45
Я конечно постараюсь, но был бы рад, если бы кто-то написал этот низкоуровневый код за меня. Как-то не мечталось мне писать графический вывод для УКНЦ, правда. Тем более, не хочется изобретать велосипед, если это всё уже написано.
Я писать игру на ЯВУ это моя принципиальная позиция. Тем более, что мощностей ЯВУ для этого с избытком. Я и удовольствия так больше получу.
А от настроения "мы тут крутые УКНЦ-шники, будь как мы" попахивает чем-то армейским, да, деды? ;-)
- - - Добавлено - - -
уже отличаю людей которые называют "адрес экраннной памяти" - знакоместом. - таким никогда не сделать крутой геймы :)Знакоместом я называю байт в экранной памяти. Для УКНЦ это два байта. Странный у тебя критерий крутости гейммейкера, дед) Впрочем, идти меряться писками мне и у спектрумистов надоело
А от настроения "мы тут крутые УКНЦ-шники, будь как мы" попахивает чем-то армейским, да, деды? ;-)
Правда??? Я уже два года пытаюсь высосать крупицы знаний.. и после многочисленных, бесполезных, бестолковых и порой контрпродуктивных словесных баталий.. выяснил - RTFM
(для тупых - читай ебанный мануал).... даю сразу справку (по поводу программирования).. из вменяемых.. Titus, Ale_K, nzemin (Hunta будет долго и упорно трахать тебе мозг, кончится - RTFM)
Oleg N. Cher
20.03.2020, 20:02
Да я уже примерно оценил расклад сил, спасибо. Просто некоторые товарищи помешаны на самоутверждении. Я с Epsilon'ом поссорился из-за этого, вернее, просто предупредил, что мне не нравится его манера общаться в таком ключе, а он меня забанил. Но и без него таких хватает. Это так, отступление.
Сейчас же хочу искренне поблагодарить BlaireCas, hobot, Alex_K, SuperMax, Hunta (за дельные советы) да и тебя, S_V_B тоже. Сорян, кого забыл упомнить. А nzeemin и Patron - за очень полезные утилиты и эмуляторы. Вообще довольно продуктивно общаемся, это для меня приятная перемена от Спектрума - как хобби-деятельность.
Но книжки все равно почитай (я тоже хочу чтоб под эту рухлядь, хоть кто-то что-то написал) :)
... я к тому, что выложил тебе готовый код, а ты напишите мне...
Единственный человек который дал мне кусочек кода - это Titus..., остальные только языком треплют.. :(
А ты сразу...здрасте, приехали...напишите за меня ВСЕ
RTFM
Hunta будет долго и упорно трахать тебе мозг, кончится - RTFM
Ибо там есть ВСЁ.
А повторяющиеся одни и те же вопросы в конце концов надоедают.
А ты сразу...здрасте, приехали...напишите за меня ВСЕ
Ну ты тоже - практически с этого начинал
Насчет RTFM, любимый мною HUNTA, пожалуйста не путайй любителей DEC , и товарищей которые оказались случайными (или злонамеренными) владельцами УКНЦ, это сильло разные весчи...и ваши отсылки к документации DEC немного не корректны..только RT SJ, которая для данной машинки нафиг не уперлась... сделаю свой образ несовместимяый.. и х. с ним.. н УКНЦ будет запускаться
- - - Добавлено - - -
Ну ты тоже - практически с этого начинал
Я был более скромным :)
- - - Добавлено - - -
Ну ты тоже - практически с этого начинал
Мне очень понравился стиль ALEX_.. без лишних слов и выебонов... носом ткнул.. и все
- - - Добавлено - - -
От тебя Хунта по программированию я от тебя ни разу хинтов не получил... разве что когда измерять экран хотели.. и то это была картинка.
Не путай PDP и УКНЦ.... это совсем разные вещи.. и единственное, что RT11, их связывает... чаще нафиг не уперлось, вместе со всей обильной документацией... :(
Oleg N. Cher
20.03.2020, 20:55
Ладно, не ссорьтесь, горячие парни :-)
Disclaimer: сейчас моя текущая цель - покодить на Паскале с асм-вставками, а чтобы был повод - я беру игру, с которой ковыряюсь уже много лет с переписыванием её на Оберон. Я НЕ ставлю цели стать гуру кодинга для PDP-11 или всех поразить крутой игрой. Это нет.
Кстати, я предлагал подобный стиль разработки для Спека тем, кто не знает асма: чел, допустим, пишет игру на Обероне, а я ему помогаю с кодовыми процедурами на Z80-асме. Сейчас я тоже посильно занимаюсь подобной деятельностью - оказываю поддержку пользователям ZXDev и моего транслятора Ofront+. Но вот именно здесь у вас мне тоже нужна своего рода подобная помощь. Ведь зачем люди пишут и портируют игры для УКНЦ? Наверно из-за любви к этой машинке. А почему именно на асме? Из-за любви к асму, видимо. И из желания выдавить все возможности из железки.
А мне это не нужно, я просто прикинул, что скорости Паскаля мне хватит. А здесь мечтаю обрести знакомство с самураем кодинга, с которым можно пообщаться на темы около-УКНЦ и ассемблера PDP-11.
Мне очень понравился стиль ALEX_.. без лишних слов и выебонов... носом ткнул.. и все
Хотя любой поисковик при упоминании DEC PDP-11 выдает http://bitsavers.informatik.uni-stuttgart.de
Судя по твоей фразе - вроде как тыкать не надо было? И ссылки НА КОНКРЕТНЫЕ книжки оттуда были - дальше сложно догадаться рядом посмотреть, да?
Не путай PDP и УКНЦ.... это совсем разные вещи.. и единственное, что RT11, их связывает
RT-11 идёт на ней БЕЗ ДОРАБОТКИ (в отличии от, скажем, БК) - так что вполне себе PDP-11. Да, графика у неё есть - вот удивишься, на PDP-11 графика тоже была - в том числе и с отображением в память ЦП (самый яркий пример - PRO/350-380 ака Электроника-85), и ЕМНИП - что то и у DEC было. Ну и никто не мешает свой вариант забебенить
И даже если писать софт под голое железо - всё равно, общая архитектура очень ложится на стандартную PDP-11
Я был более скромным
Не спорю - поэтому и написал - практически. Вот только тут у всех свои интересы и время будет тратится на них, так что кто то что то тебе напишет только в момент совпадения. Вот не занимаюсь я сейчас графикой на PDP, так что как оно там работает в УК-НЦ или Э85 - да с высокой колокольни. Когда будет руках плата, способная выводить на монитор (или в очередной раз начну мучить DE10) - тогда может быть (!) и посмотрю - как оно в УК-НЦ. А пока я с ПДП трах имею (с SD вроде разобрался). И все ваши спрайты и фанты мне - до лпч.
Oleg N. Cher
20.03.2020, 20:59
Единственный человек который дал мне кусочек кода - это Titus..., остальные только языком треплют.. :(Titus, вау! Titus, я тоже хочу кусочек кода, плииззз! Особенно в плане вывода графики и тайлов.
А ты сразу...здрасте, приехали...напишите за меня ВСЕНе, ну зачем прямо всё. Просто общеупотребительные вещи, которые нужны в работе много где. Спросил, ну мало ли. Вдруг уже какой-то гуру кодинга закодил, а я тут буду со своим детским знанием асма его переплёвывать ;-)
Я тебе дал все что знал... прости... но ты не хочешь думать
но ты не хочешь думать
ГЫГЫГЫ :)
Oleg N. Cher
20.03.2020, 21:19
Да уж, куда мне до крутых дедов) "Аспиранты, а раз вы такие умные, то почему строем не ходите, как я" (c) Прапорщик
;-)
BlaireCas, мне понравилась процедура :-) Классно работает. Наверно можно и оптимизнуть, но и так супер.
Вот тоже человек, реально помог кодом.
- - - Добавлено - - -
S_V_B, я тебе намекаю на "думай как я, а если ты не думаешь как я, то ты не думаешь вообще" ;-)
ГЫГЫГЫ
Ты мне дал меньший из всех...Обидно что вы мыслите только RT-11 - железо знают еденицы
Ты мне дал меньший из всех
Аха. Думать самому заставил. И разбираться.
ГЫГЫГЫ
Ты мне дал меньший из всех...Обидно что вы мыслите только RT-11 - железо знают еденицы
Аха. Думать самому заставил. И разбираться.
Дрочи сам на сою прелесть...
железо знают еденицы
Ну да, написанные только три драйвера - мало знаю железо
Дрочи сам на сою прелесть..
Ты в своей уже разочаровался. Пичалька
Ты в своей уже разочаровался. Пичалька
Напротив-узнал гораздо больше.. и руки опустились, поскольку понял, что переписывть придется 80% кода.
Это с учетом, что я не сосем тупил и "вражины" отрабатываются в отдельном цикле, а нужно было делать все вместе... (поэтому и говорю, что старайтесь все унифицировать)
"Пасквилянтам" этого не понять..
- - - Добавлено - - -
Я же все уже опробовал на СИ (х86) - все работает.. про СИ для УКНЦ мысли даже не было (посмотрел как компилит простейшие вещи).
Если хочешь чтобы все было красиво - нужно изначально все правильно делать, а не по дороге вставлять "красивые" хаки.
BlaireCas
21.03.2020, 08:28
Похоже пятница неплохо прошла. Напрогра...ммировались все ) Или напаскалились.
Кстати только сейчас заметил что я там протупил с *80 ведь *80 = *(64+16) итого должно быть <<6 + <<4
Интересно насколько mul быстро работает в укнц (но тормоза вывода спрайтов конечно не в нем в укнц)
И еще сейчас код свой пересмотрел... ууух, ну и жути понаписал тормозной. Если делать бы с .asect= то в команды типа add 6(SP), (R0) можно заранее вставить нужное число на место 6(SP), модификация кода при исполнении. Ну проще сразу туда записать нужное чем ходить по адресам. Просто я глуп как пробка в паскале и не знаю как оно там работать будет.
Просто я глуп как пробка в паскале и не знаю как оно там работать будет.
Все что напишешь то и выполнится :)
Интересно насколько mul быстро работает в укнц (но тормоза вывода спрайтов конечно не в нем в укнц)
Patron, тотальное исследование проводил, сразе несколько плат зарядил прогонами, у меня к сож. скрины с живой платы не сохр. по видимому, это UKNCBTL
→ ЛAТ
Memory Top: 135252
BUF words: 22199
CPU KHz: 5300 > 8300
CPU KHz: 8300
1: Nop Evt: 11 ; Run: 9397 ; Res: 9408 ; CLC: 17.6
R2/177777 ; R1/000377 ; R0/177777
1: Mul R2, R0 Evt: 1 ; Run: 1647 ; Res: 1648 ; CLC: 100.7
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
R2/177777 ; R1/000000 ; R0/000000
1: Mul R2, R0 Evt: 1 ; Run: 1647 ; Res: 1648 ; CLC: 100.7
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
R2/000001 ; R1/000377
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
R2/000017 ; R1/000377
1: Mul R2, R1 Evt: 1 ; Run: 1647 ; Res: 1648 ; CLC: 100.7
R2/000177 ; R1/000377
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
R2/001777 ; R1/000377
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
R2/017777 ; R1/000377
1: Mul R2, R1 Evt: 0 ; Run: 1647 ; Res: 1647 ; CLC: 100.8
BlaireCas
21.03.2020, 09:19
Я не очень понял, но видимо mul работает довольно быстро. Nop быстрее в 9 раз что-ли? Ну окей. Но собственно на сам вывод спрайта это не влияет. Там надо лишь 1 раз умножить для определения адреса вывода.
(и кстати с таймингами я бы не доверял ни ukncbtl ни emustudio) - проверял на том коде для определения быстродействия процессоров. Реальная укнц отличается. Но если "на глаз" - то можно.
Но с реальной укнц с таймингами процессора я помучался. Огромное спасибо Titus и Alex_K - ибо когда делать на ней звук - там любой скрипач раздавит программу и скажет что тут не си-бемоль.
Patron, тотальное исследование проводил
https://zx-pk.ru/threads/14702-raschjot-tochnogo-vremeni-vypolneniya-komand-razlichnymi-protsessorami-arkhitektury-pdp-11.html
Oleg N. Cher
21.03.2020, 10:34
"Пасквилянтам" этого не понять..А не было мысли, что "пасквилянты" могут быть на всю башку перфекционистами, и делать код с самого начала настолько долго и тщательно, насколько возможно - годами. И такой код до релиза даже еле доживает. Но железячникам и машкодерам, пишущим странное, этого не понять ;-)
Ну проще сразу туда записать нужное чем ходить по адресам. Просто я глуп как пробка в паскале и не знаю как оно там работать будет.Да какой там Паскаль? Паскаль только требует сохранить регистры R2-R5, да и это под вопросом. Я для перестраховки сохраняю. Ну и даёт аргументы в стеке. Всё. Дальше асм.
Против самомодифицируемого быстрого кода ничего не имею. Но в данный момент сильно важнее реализовать некратность ширины спрайта восьми, чем любая оптимизация. Надо как-то стимульнуть человека, который согласился перерисовать графику под разрешение УКНЦ.
Когда будет руках плата, способная выводить на монитор (или в очередной раз начну мучить DE10) - тогда может быть (!) и посмотрю - как оно в УК-НЦ. А пока я с ПДП трах имею (с SD вроде разобрался). И все ваши спрайты и фанты мне - до лпч.
У тебя же вроде есть такая плата? Я вот тоскую по утраченным возможностям... в 90-е активно продвигал замену Э-80 на 286е...мог бы парочку поиметь.. знал бы что так мозг переклинит. :(
- - - Добавлено - - -
Но в данный момент сильно важнее реализовать некратность ширины спрайта восьми
Тут к тебе подкралась маска... нужно выделять память
Oleg N. Cher
21.03.2020, 10:51
Я уже думал про возможность вначале строку данных спрайта скопировать в буфер и сдвинуть её на нужное количество бит заранее, а потом уже выводить. Наверно так быстрее всего будет. Но кодить ещё не пробовал.
У тебя же вроде есть такая плата?
На VGA - пока только DE (это FPGA dev board, если что). В ближайшей перспективе - только новодельная КЦГД.
Я вот тоскую по утраченным возможностям..
"Эх, кабы раньше то знать!..." :) Я бы тоже много чего и спёр и сохранил :)
в 90-е активно продвигал замену Э-80
Может - Э-60?
Хунта - ты буквоед :) Тогда перли вагонами... и именно тогда рушилась моя детская мечта о людях в белых халатах.. и гермозонах....
Тогда перли вагонами
Для сдачи на драгметаллы. Чем я бы точно не занимался. А вот оставить себе для хобби - это легко.
Тем более, что в те времена работал именно с PDP-11-подобным.
Особенно жалею, что не всю коллекцию софта перенёс с лент на Квант...
BlaireCas
21.03.2020, 14:34
Но в данный момент сильно важнее реализовать некратность ширины спрайта восьми
А какой в этом смысл я чего-то не понимаю? Спрайт-то сам все-равно будет храниться по слову если на 4 цвета на 8 пикселей.
Ну там можно добавить рисовку с маской (если очень хочется например нарисовать кружок или "бублик" с дырой внутри).
Абсолютно не вижу смысла что-то делать на попиксельное хранения спрайта. Это уже VGA получится.
В УКНЦ не так много памяти, а с ПП из паскаля работать ну эт я не знаю. Там вон те карты если все сделаешь - всю память покушают. Имхо используй то что есть с ограниченными возможностями. Многие люди делали игры и причем хорошие игрухи с 8-пикселями алайн. Тот-же BLDR (да, хорошо сделан для тех времен)
Я вон в своей игре тупо сделал так что она кажется многоцветной (а там даже не 8 цветов, там лишь 5 причем цп рисует только с алайном 8 пикселей. Главное дело в дизайне)
Oleg N. Cher
21.03.2020, 15:11
Ну хорошо, BlaireCas. Я тогда буду выводить спрайты поточечно, хотя бы для макетной версии игры.
С прозрачностью или с маской выводить не требуется. Закругленные углы всё равно выводятся поверх.
У тебя совсем другая динамика в игре. Нет, кратность 8 меня вообще никак не устраивает, сорри. :-(
- - - Добавлено - - -
Карты всю память не покушают, я же в привате показал как они конструируются из кусочков. Сейчас игра для Спека на Обероне занимает 26 Кб. Графики в ней около 6 Кб. Если заниматься экономией памяти на графике, то надо думать в сторону сжатия и/или монохромных спрайтов.
- - - Добавлено - - -
P.S. Монохромных, т.е. двухцветных указанными цветами.
BlaireCas
21.03.2020, 15:32
Я тогда буду выводить спрайты поточечно
Вот это точно не нужно.
Oleg N. Cher
21.03.2020, 15:34
Ну упс. :-) Не могу просить тебя кодить для меня дальше. Если справлюсь, то справлюсь. Пока же приостанавливаюсь с УКНЦ и возвращаюсь к доработке версии игры для Спека.
с которой ковыряюсь уже много лет с переписыванием её на Оберон
Пока же приостанавливаюсь с УКНЦ и возвращаюсь к доработке версии игры для Спека.
Ни на Обероне, ни на Паскале, ни на Macro-11.
и именно тогда рушилась моя детская мечта о людях в белых халатах.. и гермозонах....
В Зеленограде пока есть 2 шт. цеха, где Делают кристаллики.
Почему только 2 шт. ?
1. Это для "7" и "9" приемок. ИС, от которых будет зависеть существование миллионов людей - управление зарядом бомбы, например.
2. Стойкое крипто для систем связи вояк - например, для передачи кота "пуск".
3. Управление боевым космосом - т.к. американские аналоги на порядок дороже и их стойкость к факторам еще проверять нужно.
( ну что аналоги привозят из США в карманчике - это судебно доказанный факт... ).
А по 1564 и др. - если на Юго-Востоке продают 100 мм ПМК с гарантией 90% ПВГ за пару $ - все остальное вторично - т.е. самодел будет стоить на порядок-другой дороже, а ИС простецкие и хорошо видны в мелкоскоп - "закладок нет !" ( наверное... ).
Oleg N. Cher
21.03.2020, 17:43
Ни на Обероне, ни на Паскале, ни на Macro-11.И на Обероне, и на Паскале. А с Макро-11 ковыряйтесь сами, кому надо ;-)
Шютка. Куда ж от него денешься. Hunta, я вообще не спешу никуда.
BlaireCas, если можно, набросай ещё вкратце свои соображения по оптимизации твоей процедуры вывода.
У тебя совсем другая динамика в игре. Нет, кратность 8 меня вообще никак не устраивает, сорри. :-( тебе по барабану должно быть, мин. спрайт любого цвета 8Х1 - смирись.
Для УК-НЦ так было всегда, ПКМ в упоминаемым неоднократно мною движке было так.
была процедура SETMODE - где программист выбирал тип вывода и SPROUT - по координатам и номеру спрайта в таблице )
Oleg N. Cher
22.03.2020, 14:19
Хобот, давай подробнее. SETMODE какие режимы поддерживал? Как была устроена таблица?
Не смирюсь, нужна полноэкранная игра в тайловом разрешении 32x24.
Хобот, давай подробнее.
я уже отвечал на этот вопрос со всеми подробностями,
паскалить там вообще не нужно, всё пишется на ассемблере,
из паскаля берутся только :
вызов процедуры инициализации (подготовка и очистка экрана, гарантия 0-вых в левый верхний, нумерация спрайтов по положению в таблице, уст. режима вывода по умолч. );
входящие значения и запуск соотв. подпрограмм на ассемблере.
Состыковка с Паскалем только на уровне LINK.
Про таблицу и прочее - я писал десятки раз - читай тему, я что зря писал?
Oleg N. Cher
23.03.2020, 11:46
Хорошо, Хобот. Если исходники этой библиотеки на асме не выжили, то может хотя бы есть какие-то программы, которые на ней написаны? При некотором умении можно попытаться восстановить исходник из их кода.
Может ты и не зря писал, но всё размазано по форуму, искать, перечитывая весь форум, конечно сильно затратно. Может давай отдельную тему заведём?
По некратному выводу спрайтов: я думаю, что в подпрограмме вывода спрайта от BlaireCas нужно модифицировать только один момент: уменьшать ширину строки спрайта в цикле не на 1 (в байтах), а на 8 (в пикселях), и если остаток пикселей < 8, то перед выводом в экран для чистки места наложить на экранные данные маску с вычисленным смещением, и только потом уже выводить данные спрайта. Дополнительная сложность здесь в том, что очищаемое справа от спрайта место на экране может быть разбито на два байта-знакоместа, соответственно, надо будет очистку делать два раза. Выводить спрайты шириной < 8 пикселей считаю не нужным.
Вот. Никто не хочет такое закодировать?
32x24.
24 строки - это рабочий экран , полный экран это 26 )))
как ты вообще считаешь сдачу в магазине? тебе уже кроме меня все написали,
что 8 и баста, что размер 1 го символа в УК-НЦ 8х11 )
в пикселях
откуда у тебя этот бред прилип, какие тебе пиксели, зочем пиксили !!!
не надо никакого смещения, положение спрайта внутри рамки(границ спрайта)
это работа художника в редакторе, программист всегда рисует прмоугольники
мин. размер 8х1 ))) кстати говоря от движка остался редактор покадровой анимации
что бы при кратности 8 эффект скольжения идущего человечка скажем побеждать
ну для всяких прочих анимаций )))
и да остались игры на нём написанные - например
EGG .SAV 40 07-Jul-1993 20'480
WELL .SAV 50 07-Jul-1993 25'600
TETRI2.SAV 41 06-Jul-1993 20'992
https://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=1051275&viewfull=1#post1051275
Oleg N. Cher
23.03.2020, 15:31
Хоботярыч, я по негласному соглашению со здешними разрабами под УКНЦ служебные строки не рассматриваю. К тому же я не знаю, как к ним организован доступ.
Не упорствуй. Привязка к ширине 8 только в головах. На Спеке тоже привязываются к 8, но там это хотя бы из-за клэшинга оправдано.
Тебя про движок спросили. А ты выражаешься как-то мутно и непонятно. Так есть его исходник или всё-таки утерян?
К тому же я не знаю, как к ним организован доступ.
как и к любой другой части экрана )))
Привязка к ширине 8 только в головах.
только в сильно умных головах и не спроста, наверное а ? думай твоя башка - Русский человек!
На Спеке
это слово по негласному соглашению в этом разделе ... ну ты понял...
Тебя про движок спросили. А ты выражаешься как-то мутно и непонятно.
чего ж тебе не понятно то родимый? помилуй, я ж прямую ссылочку уже дал тебе, список игр дал, шо тебе
ещё треба? ) ты в чудесном лесу, радуйся! полчаса!
https://youtu.be/YkY2Om-y_YI
Oleg N. Cher
23.03.2020, 17:30
чего ж тебе не понятно то родимый? помилуй, я ж прямую ссылочку уже дал тебеИзвини, не увидел... ГДЕ?
Про умные головы и привязку ширины к байту: ну да, если с привязкой, то вывод немного быстрее. И всё, других причин нет.
Вопрос к Сильно Умным Головам: почему не используете служебную строку, а?
Никита в своих портах не отошёл от оригинального разрешения, тем самым сильно упростив себе жизнь. Я отойду, куда деваться. Мы не боимся трудностей ;-)
BlaireCas
24.03.2020, 13:14
почему не используете служебную строку, а?
Чтобы использовать нормальным образом (скажем 640х288 с линейными адресами типа 0-я строка 100000 и т.д.) - нужно лезть в перефирийный проц и сделать нормально таблицу строк.
А туда не особо кто хочет лазить, вот и ...
Oleg N. Cher
24.03.2020, 13:17
Ага, понимаю. Спасибо за ответ.
Всё никак не решусь приступить к кодингу некратного вывода на основе твоей процедуры. Пока собираюсь с духом :-)
Oleg N. Cher
26.03.2020, 18:17
Стало не хватать длины командной строки RT-11. Напомните как удлинить? Конечно вопрос, главным образом, не по нативной работе в RT-11, а по эмулятору Патрона.
rt11.exe RUN LINK TSTKEY,CGLIB,PASDWK DURAK.SAV
- теперь понятно почему не работало - не хватало длины командной строки.
\ не работает.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot