|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
Last visit was: 06 Oct 2024 00:50
|
It is currently 06 Oct 2024 00:50
|
Работа с текстовым режимом (и квадратиками видеопамяти)
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Можно прикинуть как быстро программка из первого поста будет работать, будучи запущенной из основной памяти, памяти ISA или быстрой памяти (aka "кэшъ"): | | | | Code: Xor A ;+4=4 Ld Bc,0xC301 ;+10=14 Ld De,sTextLine ;+10=24 Ld H,0x00 ;+7=31 Ld L,A ;+4=35 Add Hl,Hl ;+11=46 Add Hl,Hl ;+11=57 Add Hl,Bc ;+11=68
Ld A,0x81 ;+7=75 Out (0x89),A ;+11=86
Di ;+4=90 Ld D,D ;+4=94 Ld A,0x50 ;+7=101 Ld B,B ;+4=105 Ld L,L ;+4=109 Ld A,(DE) ;+7=116 +80bytesAccel Ld B,B ;+4=120 Ld A,A ;+4=124 Ld (Hl),A ;+10=134 +80bytesAccel Ld B,B ;+4=138 Ei ;+4=142
80bytesAccel = 80/7000000s = 11.43us x2 = 22.43us MainMem: 142/10000000 ~ 14.20us -> 44.86us with Accel ~ 22292 times/sec ISA-Mem: 142/14000000 = 10.13us -> 32.56us with Accel = 30712 times/sec FastMem: 142/21000000 = 6.76us -> 29.19us with Accel = 34258 times/sec
| | | | |
Для каждой текстовой строки надо выполнить такое копирование дважды - один раз для символов и второй раз для атрибутов, соответственно - для обычной памяти это примерно 348 полных текстовых экранов в секунду
- для ISA памяти - 479 полных текстовых экранов в секунду
- для быстрой памяти - 535 полных текстовых экранов в секунду
Также получается, что копирование через аксель будет быстрее чем LDIR при копировании 3 и более байт
|
02 Apr 2021 22:40 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Я тут ещё в декабре снимал дамп видеопамяти (точнее системной памяти, которая отображена на видеопамять) - несколько строк в текстовом режиме (с какими то ошмётками графики по видимому) записал в файл - по ним уже можно поглядеть на внутреннее устройство видеопамяти: это было 1024 байта из нулевой строки - далее теже семые 1024 байта далее строка 1 далее строка 2: далее строка 15: Смещение от 0 до 703 (0x000...0x2BF) это область графики; Смещение от 704 до 767 (0x2C0...0x2FF) это область шрифтов; Смещение от 768 до 927 (0x300...0x39F) это область описателя графического экрана (лежит на боку); Смещение от 928 до 991 (0x3A0...0x3DF) не используется; Смещение от 992 до 1023 (0x3E0...0x3FF) это область палитр. | | | | Shaos wrote: Значится так - каждый "квадратик" представлен в области описателя экрана (Screen Description Area) прямоугольником 4x2 байта (4 по горизонтали, 2 по вертикали) - описатель, как и текстовый экран, положен "на бок" и "отзеркалирован" - первая строчка это левый столбик у которого лево это верх. Далее первые 4 байта в каждом таком прямоугольнике описывают основной режим, а вторые 4 байта - дополнительный если в графической строке 640 точек вместо 320 (режим повышенной чёткости). Четвёртый байт пока не используется (ни в основном описателе, ни в дополнительном), а первые три описаны так: байт 0: - биты 0,1,2,3 - задают биты 4...1 адреса блока данных (бит 0 берется из 3го бита порта #7FFD для текстового режима либо из байта 1 для графического где это всё формально задаёт старшие биты номера квадратика по горизонтали); - бит 4 - "1" для текстового режима, "0" для графического режима; - бит 5 - "1" для 320 точек в строке, "0" для 640 точек в строке (режим повышенной чёткости, который требует использования второй четвёрки байтов описателя); - биты 6,7 - задают биты 12...11 адреса данных в блоке (палитра для графического режима), однако если их значение 11 вместе с 11 в битах 4 и 5, то смысл этого байта меняется - в этом случае если биты 2 и 3 имеют значение 11 то этот квадратик - гашение, а если ещё и бит 0 имеет значение 1, то это прерывание. байт 1 в текстовом режиме: младшие 8 бит адреса (7...1), а недостающие 3 бита 10...8 берутся из номера линии в квадратике (в текстовом режиме это просто отсылка в знакогенератор и на самом деле тут сидит код символа!). байт 1 в графическом режиме: - биты 0,1 - дополнительный адрес в в блоке (чтобы адресовать квадратик по горизонтали); - бит 2 - младший бит номера блока (чтобы адресовать квадратик по горизонтали); - бит 3,4,5,6,7 - адрес квадратика по вертикали. байт 2: младшие 8 бит адреса атрибутов для спектрумовского режима (с замешиванием), но представляют сам атрибут в случае текстового режима. байт 3: не используется В документации указано, что запутывание адреса квадратика вызвано необходимостью уменьшить размер прошивки для альтеры. Координаты квадратика в видеопамяти для графического режима соответственно будет: X=0.3|0.2|0.1|0.0|1.2|1.1|1.0 (0...95 т.к. старшие 2 бита не могут быть единицами одновременно если это не гашение), Y=1.7|1.6|1.5|1.4|1.3 (0...31). Получается, что графический режим можно рассматривать как текстовый 80x32 с многоцветным шрифтом в 3072 символов (тайлов) | | | | |
Нулевая строка в описателе описывает левую колонку знакомест (невидимую), состоящую из 40 4-байтовых описателей: видно, что все 4-байтовые описатели имеют в нулевом байте #F8, кроме нескольких в конце (33й, 34й, 35й, 36й и 37й), которые имеют в нулевом байте #FC, что судя по описанию выше значит "гашение" интересно, что уже в 1й строке идут какие-то данные: и вот 2я строка (вторые символы в том же самом знакоместе: странно, что тут задействован последний байт в четвёрке, хотя в описании сверху написано что он не используется и в 1м байте (который второй) чото записано (#20, #28, #30, #38), как будто это графический режим, однако это текстовый - возможно там ничего не видно т.к. атрибут стоит #00 (чёрным по чёрному)
|
03 Apr 2021 21:26 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Разбираюсь с настройками квадратиков-описателей графического режима: Это дамп квадратиков из зоны описателя графики поcтавленный с боку на ноги и отзеркалированный (колонка слева это смещение от начала области описателя по горизонтали, а цифры в строке это четвёрки байтов описателя, но выташенные из вертикали и выписанные в строку - на второй фотке со смещением). Первый байт в четвёрке за пределами изображения: F8 (1111 1000) - бордюр FC (1111 1100) - гашение FD (1111 1101) - прерывание FE (1111 1110) - должно останавливать счётчик строк и переключать кадр? но НЕ переключает...В последнем байте четвёрки - мусор (не используется) В предпоследнем - атрибуты текстового режима (в графическом режиме не используется) Первые 2 байта задают адрес квадратика в видеопамяти (если старшие 2 бита первого байта не 11):
You do not have the required permissions to view the files attached to this post.
|
13 Apr 2021 08:47 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Результаты моих вчерашних экспериментов с запредельными видеорежимами Спринтера, подключенного через белый скандаблер RGB2VGA: со сброшенным смещением в сетапе квадратики за пределами зоны видимости можно нагородить вот так: отцентровав видео на моём VGA-мониторе: получаем следующюю городёжку: по итогам отсмотренного предлагается новый видеорежим 83h 352x280 256 цветов (84h 704x280 16 цветов): когда слева и справа добавляются по 2 квадратика, сверху 2 и снизу 1 (они в любом случае будут целыми и непокоцанными) - причём при этом можно сохранить линейную адресацию пикселов в видеопамяти для основной части экрана: http://www.nedopc.org/forum/viewtopic.php?f=60&t=20375P.S. на широких телевизорах без возможности подгонки видимых размеров изображения расширенные квадратики будут выглядеть примерно вот так (спасибо Hard):
You do not have the required permissions to view the files attached to this post.
|
14 Apr 2021 20:17 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Из дампов интересны ещё текстовые палитры, которые нулевой цвет (чёрный): первый цвет (синий): второй цвет (зелёный): ну и пятнадцатый цвет (белый): видно, что задаётся только "text palette 1" и "text palette 3", которые устанавливаются одинаковыми
|
21 Apr 2021 00:32 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Подпрограмма быстрой очистки текстового экрана с помощью акселератора от ИванМака: | | | | Code: ; FASTCLS - Thanks to Ivan Mak (forth.exe)
fastcls: LD D,D LD A, #50 LD B,B LD E, #20 LD A,(curatr) LD D,A IN A,(PORT_PAGE1) EX AF,AF';' LD A, #50 OUT (PORT_PAGE1),A LD HL, #4301 LD A, #80 AND #80 INC A fcloop: OUT (#89),A LD E,E LD (HL),E ; !!! LD B,B INC L OUT (#89),A LD E,E LD (HL),D ; !!! LD B,B INC L INC L INC L BIT 7,l JR Z,fcloop EX AF,AF';' OUT (PORT_PAGE1),A ret
| | | | |
|
03 Jul 2021 02:23 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Тут в телеге КряКря, анализирующий исходники прошивки большой альтеры Спринтера, на днях выяснил, что байт mode2 описателя квадратика не только в текстовом режиме используется (как атрибут), но и в графическом (как зум) - вот моё описание этой фичи после некоторых экспериментов - каждый квадратик бъётся на четвертинки и можно увеличить любую из этих четвертинок до размеров квадратика путём манипулирования тремя младшими битиками mode2 (там где в текстовом режиме сидят атрибуты символа), но в 16-цветном режиме оно увеличивается путём дублирования каждой пары колонок пикселов (т.к. 1 байт теперь 2 пиксела) - в 256-цветном оно по идее тоже путём дублирования зумица, но т.к. в 1 байте 1 пиксел дублирование выглядит как зум. Я хочу попробовать это использовать для анимированный тайлов - такой тайл будет иметь в 2 раза меньшее разрешение (4х4 вместо 8х8) и возможность иметь до 4 кадров анимации без манипуляций с палитрой - кадры переключаются путём записи байта в mode2 такого квадратика: 0 - нет зума (обычный режим) 4 - левый верхний угол увеличен до размеров квадратика 5 - правый верхний угол увеличен до размеров квадратика 6 - левый нижний угол увеличен до размеров квадратика 7 - правый нижний угол увеличен до размеров квадратика (режим зума включается битом 2 байта mode2). Вот фотки с экрана для режима 640x256 - обращаем внимание на растянутый квадратик 16x8 слева, который задаётся двумя описателями справа (байты mode2 подсвечены): Как это выглядит для разных значений mode2: В случае режима 320x256 второй описатель не используется и этот квадратик будет 8х8 с правильным зумом (пока не проверял)
You do not have the required permissions to view the files attached to this post.
|
30 Sep 2021 08:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
| | | | Shaos wrote: Значится так - каждый "квадратик" представлен в области описателя экрана (Screen Description Area) прямоугольником 4x2 байта (4 по горизонтали, 2 по вертикали) - описатель, как и текстовый экран, положен "на бок" и "отзеркалирован" - первая строчка это левый столбик у которого лево это верх. Далее первые 4 байта в каждом таком прямоугольнике описывают основной режим, а вторые 4 байта - дополнительный если в графической строке 640 точек вместо 320 (режим повышенной чёткости). Четвёртый байт пока не используется (ни в основном описателе, ни в дополнительном), а первые три описаны так: байт 0: - биты 0,1,2,3 - задают биты 4...1 адреса блока данных (бит 0 берется из 3го бита порта #7FFD для текстового режима либо из байта 1 для графического где это всё формально задаёт старшие биты номера квадратика по горизонтали); - бит 4 - "1" для текстового режима, "0" для графического режима; - бит 5 - "1" для 320 точек в строке, "0" для 640 точек в строке (режим повышенной чёткости, который требует использования второй четвёрки байтов описателя); - биты 6,7 - задают биты 12...11 адреса данных в блоке (палитра для графического режима), однако если их значение 11 вместе с 11 в битах 4 и 5, то смысл этого байта меняется - в этом случае если биты 2 и 3 имеют значение 11 то этот квадратик - гашение, а если ещё и бит 0 имеет значение 1, то это прерывание. байт 1 в текстовом режиме: младшие 8 бит адреса (7...1), а недостающие 3 бита 10...8 берутся из номера линии в квадратике (в текстовом режиме это просто отсылка в знакогенератор и на самом деле тут сидит код символа!). байт 1 в графическом режиме: - биты 0,1 - дополнительный адрес в в блоке (чтобы адресовать квадратик по горизонтали); - бит 2 - младший бит номера блока (чтобы адресовать квадратик по горизонтали); - бит 3,4,5,6,7 - адрес квадратика по вертикали. байт 2: младшие 8 бит адреса атрибутов для спектрумовского режима (с замешиванием), но представляют сам атрибут в случае текстового режима. 24 сентября 2021 года в телеге появилась информация, что 3 бита этого байта используются и в графическом режиме - бит 2 включает режим увеличения четвертинки квадрата, а биты 0 и 1 задают какая четвертинка увеличивается до размеров квадрата.байт 3: не используется В документации указано, что запутывание адреса квадратика вызвано необходимостью уменьшить размер прошивки для альтеры. Координаты квадратика в видеопамяти для графического режима соответственно будет: X=0.3|0.2|0.1|0.0|1.2|1.1|1.0 (0...95 т.к. старшие 2 бита не могут быть единицами одновременно если это не гашение), Y=1.7|1.6|1.5|1.4|1.3 (0...31). Получается, что графический режим можно рассматривать как текстовый 80x32 с многоцветным шрифтом в 3072 символов (тайлов) | | | | |
В случае игровой прошивки, которая использовалась в игре "Thunder in the Deep", биты в описателях порезаны несколько иначе:
|
12 Oct 2021 22:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Дампы видеопамяти выше сняты в графическом режиме - переснял в текстовом. В текстовом режиме 80x32 самый первый байт каждой четвёрки содержит 0x1B, а в режиме 40x32 - 0x3B. Это вполне соотносится с описанием этого байта: | | | | Shaos wrote: байт 0: - биты 0,1,2,3 - задают биты 4...1 адреса блока данных (бит 0 берется из 3го бита порта #7FFD для текстового режима либо из байта 1 для графического где это всё формально задаёт старшие биты номера квадратика по горизонтали); - бит 4 - "1" для текстового режима, "0" для графического режима; - бит 5 - "1" для 320 точек в строке, "0" для 640 точек в строке (режим повышенной чёткости, который требует использования второй четвёрки байтов описателя); - биты 6,7 - задают биты 12...11 адреса данных в блоке (палитра для графического режима), однако если их значение 11 вместе с 11 в битах 4 и 5, то смысл этого байта меняется - в этом случае если биты 2 и 3 имеют значение 11 то этот квадратик - гашение, а если ещё и бит 0 имеет значение 1, то это прерывание.
| | | | |
0x1B -> 0001 1011 0x3B -> 0011 1011 т.е. адрес блока данных в данном случае - 0xB (11) P.S. в INFO_012.TXT есть такое описание: а также указывается, что шрифты выбираются битами 7...6 и 3...0 нулевого байта описателя: экспериментально установлено, что если указать в третьем бите порта 7FFD единицу (этот бит в ZX-128K переключает видимую графическую страницу), то шрифт по умолчанию будет браться не по смещению 704, а по смещению 736 (смещение 704 как раз и есть начало 11 блока восьмёрок шрифтов, как написано выше) также эксперименты подтвердили, что вариант когда биты 6 и 7 оба равны 1 не выбирает шрифт - в таких знакоместах в этом случае просвечивает бордюр (хотя исходник говорит про то, что единицы должны быть в четырёх битах 7...4 для включения бордюра)
|
30 Jan 2022 01:19 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Получается, что текстовая палитра (палитры) это не 16 цветов и даже не 64 цвета (4 палитры), а 1024 цвета!!! Все цвета по всем 256 позициям ЗАДЕЙСТВОВАНЫ!!! P.S. Правда чтобы небыло мерцания пары цветов должны быть одинаковыми, т.е. количество активных цветов в этом случае уменьшается с 1024 до 512, что тоже неплохо...
P.P.S. С другой стороны пары цветов отвечающие за передний фон и бекграунд не могут быть совсем уж любыми - чтобы использовать все 512 цветов надо специально готовить графику...
|
30 Jan 2022 16:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Некто Сергей в дискорде помог разобраться с атрибутами - чтобы второй байт описателя был равен атрибутам, надо чтобы в блоке шрифтов в соответствующей колонке атрибутов были записаны значения 0x00, 0x01, 0x02 ... 0xFF - в этом случае даже с подменённым шрифтом текстовые атрибуты в области описателя экранов продолжают работать как текстовые атрибуты. Я проверил в случае с альтернативными шрифтами - работает
|
30 Jan 2022 18:36 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
накидал утилиту loadfnt.exe которая подменяет шрифт корректно, через систему, не дёргая "квадратики" (не насилуя машину). шрифт сохраняется даже при ребуте через CAD.
You do not have the required permissions to view the files attached to this post.
|
16 Feb 2022 03:01 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23356 Location: Silicon Valley
|
Нашёл описание хитрого оклоспектрумовского режима 704/736/768x288 (со знакоместами 8x8 как на ZX) выдуманного мною в январе 2022 года - этот режим можно получить на оригинальном железе Спринтера и я его тогда назвал "Mode 0x01": Столбики из 36 знакомест (288 плашек с атрибутами для квадратов 8х8) формируют в видеопамяти 2 поля размером 2048x288 пикселов (мы можем получать доступ к любой из 256 вертикальных столбиков одномоментно через окно доступа к видеопамяти, т.е. пикселов по горизонтали будет 8x256=2048) с горизонтальным скроллом - 2 поля потому что основное и теневое (т.е. уже как бы 2048x576 пикселов), которые можно мерцать гигаскрином, повышая эффективное вертикальное разрешение, либо просто можно принять, что мы имеем 4 статических экрана, между которыми можно переключаться мгновенно (по спринтеровски, и по спектрумовски): (маленькими прямоугольниками тут показаны обычные ZX-экраны 256x192) В этом режиме например можно получить вот такие пере-спектрумовские картинки 768x288 пикселов (причём с 8-пиксельным горизонтальным скроллом по ширине в 2048 пикселов): Или 736x288 (т.к. 768 скорее всего будет выходить за пределы видимой части экрана большинства мониторов): Такие картинки лучше смотреть на дисплее с соотношением сторон 16:9 и к примеру обычное окно ZX будет выглядеть в таком разрешении так: (спешу заметить, что в Спринтере любой квадратик экрана можно превратить в бордюр, через который будут бежать полоски при загрузке данных с магнитофона) P.S. Перерисовал расположение экранов в видеопамяти с указанием основного и теневого поля для пущей понятности...
You do not have the required permissions to view the files attached to this post.
|
10 Sep 2023 01:47 |
|
Who is online |
Users browsing this forum: No registered users and 0 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|