nedoPC.org

Community of electronics hobbyists established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 21 Oct 2021 01:35



Reply to topic  [ 23 posts ]  Go to page Previous  1, 2
Работа с текстовым режимом (и квадратиками видеопамяти) 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Можно прикинуть как быстро программка из первого поста будет работать, будучи запущенной из основной памяти, памяти 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 и более байт

_________________
:eugeek: https://twitter.com/Shaos1973


02 Apr 2021 23:40
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Я тут ещё в декабре снимал дамп видеопамяти (точнее системной памяти, которая отображена на видеопамять) - несколько строк в текстовом режиме (с какими то ошмётками графики по видимому) записал в файл - по ним уже можно поглядеть на внутреннее устройство видеопамяти:
Code:
00000000  ff ff ff 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000140  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
000002c0  00 00 00 00 00 00 00 01  ff ff ff ff ff ff ff ff  |................|
000002d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000300  f8 00 00 ff f8 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
*
00000380  f8 00 00 ff fc 00 00 ff  fc 00 00 ff fc 00 00 ff  |................|
00000390  fc 00 00 ff fc 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
000003a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
000003e0  00 00 00 00 ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
000003f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
это было 1024 байта из нулевой строки - далее теже семые 1024 байта
Code:
00000400  ff ff ff 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000540  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
000006c0  00 00 00 00 00 00 00 01  ff ff ff ff ff ff ff ff  |................|
000006d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000700  f8 00 00 ff f8 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
*
00000780  f8 00 00 ff fc 00 00 ff  fc 00 00 ff fc 00 00 ff  |................|
00000790  fc 00 00 ff fc 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
000007a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
000007e0  00 00 00 00 ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
000007f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
далее строка 1
Code:
00000800  fe fe fe 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000940  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000ac0  55 aa 7d e6 e5 be 55 aa  ff ff ff ff ff ff ff ff  |U.}...U.........|
00000ad0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000b00  00 00 00 ff 00 08 00 ff  00 10 00 ff 00 18 00 ff  |................|
00000b10  00 20 00 ff 00 28 00 ff  00 30 00 ff 00 38 00 ff  |. ...(...0...8..|
00000b20  00 40 00 ff 00 48 00 ff  00 50 00 ff 00 58 00 ff  |.@...H...P...X..|
00000b30  00 60 00 ff 00 68 00 ff  00 70 00 ff 00 78 00 ff  |.`...h...p...x..|
00000b40  00 80 00 ff 00 88 00 ff  00 90 00 ff 00 98 00 ff  |................|
00000b50  00 a0 00 ff 00 a8 00 ff  00 b0 00 ff 00 b8 00 ff  |................|
00000b60  00 c0 00 ff 00 c8 00 ff  00 d0 00 ff 00 d8 00 ff  |................|
00000b70  00 e0 00 ff 00 e8 00 ff  00 f0 00 ff 00 f8 00 ff  |................|
00000b80  f8 00 00 ff fc 00 00 ff  fc 00 00 ff fc 00 00 ff  |................|
00000b90  fc 00 00 ff fc 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
00000ba0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000be0  ff 00 00 00 ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000bf0  00 00 00 00 00 00 a8 00  00 00 00 00 00 00 a8 00  |................|
далее строка 2:
Code:
00000c00  fd fd fd 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000c10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000d40  40 08 01 00 00 00 00 06  40 00 05 00 40 00 00 04  |@.......@...@...|
00000d50  40 08 01 00 00 00 00 04  40 08 05 20 00 00 00 04  |@.......@.. ....|
00000d60  40 08 01 00 00 00 00 04  00 00 01 04 00 00 00 04  |@...............|
00000d70  42 00 00 04 00 00 00 06  40 00 00 00 00 00 00 04  |B.......@.......|
00000d80  40 00 00 04 00 00 00 04  40 08 00 00 04 00 00 04  |@.......@.......|
00000d90  40 08 01 20 00 00 00 04  40 00 00 04 00 00 00 04  |@.. ....@.......|
00000da0  60 08 01 00 00 00 00 06  50 00 05 20 00 00 00 04  |`.......P.. ....|
00000db0  40 08 00 00 00 00 00 04  40 00 01 20 40 00 00 06  |@.......@.. @...|
00000dc0  40 08 05 00 00 00 00 04  40 00 01 04 00 00 00 04  |@.......@.......|
00000dd0  00 08 01 04 00 00 00 06  40 00 00 00 00 00 00 04  |........@.......|
00000de0  40 00 01 00 00 00 00 04  40 00 00 04 00 00 00 04  |@.......@.......|
00000df0  60 08 01 04 40 00 00 06  40 08 00 20 00 00 00 04  |`...@...@.. ....|
00000e00  40 00 01 00 00 00 00 04  40 08 01 20 00 00 00 04  |@.......@.. ....|
00000e10  40 08 00 00 00 00 00 06  40 08 01 00 00 00 00 04  |@.......@.......|
00000e20  00 08 00 20 00 00 00 04  40 00 01 00 40 00 00 04  |... ....@...@...|
00000e30  40 08 01 00 04 00 00 06  40 00 05 00 00 00 00 04  |@.......@.......|
00000e40  40 08 00 00 00 00 00 04  40 00 00 00 00 00 00 04  |@.......@.......|
00000e50  40 08 01 20 00 00 00 04  40 00 00 00 00 00 00 04  |@.. ....@.......|
00000e60  40 00 01 00 00 00 00 04  40 08 00 00 00 00 00 04  |@.......@.......|
00000e70  00 00 00 20 00 00 00 04  40 08 00 00 00 00 00 04  |... ....@.......|
00000e80  00 08 01 20 00 00 00 04  40 00 00 04 00 00 00 06  |... ....@.......|
00000e90  00 00 01 00 00 00 00 04  40 00 05 00 00 00 00 04  |........@.......|
00000ea0  40 08 00 00 00 00 00 04  40 00 01 00 00 00 00 04  |@.......@.......|
00000eb0  40 08 00 00 40 00 00 04  40 08 00 20 00 00 00 04  |@...@...@.. ....|
00000ec0  55 aa 7d a7 67 be 55 aa  40 08 01 00 00 00 00 04  |U.}.g.U.@.......|
00000ed0  40 08 01 20 00 00 00 04  40 08 00 00 00 00 00 04  |@.. ....@.......|
00000ee0  40 00 01 00 00 00 00 04  00 08 01 20 00 00 00 04  |@.......... ....|
00000ef0  00 08 01 00 00 00 00 04  40 00 05 04 00 00 00 06  |........@.......|
00000f00  00 00 00 00 00 08 00 04  00 10 00 00 00 18 00 04  |................|
00000f10  00 20 00 00 00 28 00 04  00 30 00 20 00 38 00 04  |. ...(...0. .8..|
00000f20  00 40 00 04 00 48 00 04  00 50 00 00 00 58 00 04  |.@...H...P...X..|
00000f30  00 60 00 00 00 68 00 04  00 70 00 20 00 78 00 04  |.`...h...p. .x..|
00000f40  00 80 00 00 00 88 00 04  00 90 00 20 00 98 00 06  |........... ....|
00000f50  00 a0 00 00 00 a8 00 04  00 b0 00 00 00 b8 00 04  |................|
00000f60  00 c0 00 00 00 c8 00 04  00 d0 00 04 00 d8 00 04  |................|
00000f70  00 e0 00 00 00 e8 00 04  00 f0 00 20 00 f8 00 04  |........... ....|
00000f80  f8 00 00 00 fc 00 00 04  fc 00 00 00 fc 00 00 06  |................|
00000f90  fc 00 00 24 fc 00 00 04  f8 00 00 00 f8 00 00 04  |...$............|
00000fa0  40 08 01 04 00 00 00 04  00 08 00 20 00 00 00 04  |@.......... ....|
00000fb0  40 00 01 00 00 00 00 04  00 08 01 00 04 00 00 06  |@...............|
00000fc0  40 00 01 00 00 00 00 04  40 08 00 20 00 00 00 06  |@.......@.. ....|
00000fd0  40 00 00 00 00 00 00 04  40 08 00 00 00 00 00 04  |@.......@.......|
00000fe0  00 80 00 00 00 00 00 04  40 00 01 04 00 00 00 04  |........@.......|
00000ff0  00 00 00 00 00 a8 00 00  00 00 00 00 00 a8 00 00  |................|
далее строка 15:
Code:
00001000  f0 f0 f0 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001140  40 00 00 06 00 01 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
00001150  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
00001160  40 00 00 86 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
00001170  40 00 00 06 00 00 00 00  40 00 00 86 00 00 00 00  |@.......@.......|
*
00001190  40 00 00 06 00 00 00 00  44 00 00 06 00 00 00 00  |@.......D.......|
000011a0  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
000011c0  40 00 00 06 00 00 00 00  40 00 00 86 00 00 00 00  |@.......@.......|
000011d0  40 00 00 06 00 00 00 00  40 00 00 06 00 01 00 00  |@.......@.......|
000011e0  40 00 00 06 00 00 00 00  40 00 00 86 00 00 00 00  |@.......@.......|
*
00001200  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
00001240  40 00 00 06 00 00 00 00  40 00 00 02 54 01 a5 02  |@.......@...T...|
00001250  40 00 00 82 00 01 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
00001260  40 00 00 06 00 00 00 00  40 00 00 06 00 01 00 00  |@.......@.......|
00001270  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
000012a0  40 00 00 86 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
000012c0  10 08 3c e7 e7 3c 10 08  40 00 00 06 00 01 00 00  |..<..<..@.......|
000012d0  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
000012f0  40 00 00 86 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
00001300  00 07 00 06 00 0f 00 00  00 17 00 02 00 1f 00 00  |................|
00001310  00 27 00 86 00 2f 00 00  00 37 00 06 00 3f 00 00  |.'.../...7...?..|
00001320  00 47 00 06 00 4f 00 00  00 57 00 06 00 5f 00 00  |.G...O...W..._..|
00001330  00 67 00 06 00 6f 00 00  00 77 00 06 00 7f 00 00  |.g...o...w......|
00001340  00 87 00 06 00 8f 00 00  00 97 00 06 00 9f 00 00  |................|
00001350  00 a7 00 06 00 af 00 00  00 b7 00 06 00 bf 00 00  |................|
00001360  00 c7 00 86 00 cf 00 00  00 d7 00 06 00 df 00 00  |................|
00001370  00 e7 00 06 00 ef 00 00  00 f7 00 86 00 ff 00 00  |................|
00001380  f8 00 00 06 fc 00 00 00  fc 00 00 06 fc 00 00 00  |................|
00001390  fc 00 00 06 fc 00 00 00  f8 00 00 06 f8 00 00 00  |................|
000013a0  40 00 00 06 00 00 00 00  40 00 00 06 00 00 00 00  |@.......@.......|
*
000013d0  40 00 00 06 00 00 00 00  40 00 00 86 00 00 00 00  |@.......@.......|
000013e0  ff ff ff 00 00 00 00 00  40 00 00 86 50 00 00 00  |........@...P...|
000013f0  00 00 00 00 fc fc fc 00  00 00 00 00 fc fc fc 00  |................|

Смещение от 0 до 703 (0x000...0x2BF) это область графики;
Смещение от 704 до 767 (0x2C0...0x2FF) это область шрифтов;
Смещение от 768 до 927 (0x300...0x39F) это область описателя графического экрана (лежит на боку);
Смещение от 928 до 991 (0x3A0...0x3DF) не используется;
Смещение от 992 до 1023 (0x3E0...0x3FF) это область палитр.

Shaos wrote:
Image

Значится так - каждый "квадратик" представлен в области описателя экрана (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-байтовых описателей:
Code:
00000300  f8 00 00 ff f8 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
*
00000380  f8 00 00 ff fc 00 00 ff  fc 00 00 ff fc 00 00 ff  |................|
00000390  fc 00 00 ff fc 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|

видно, что все 4-байтовые описатели имеют в нулевом байте #F8, кроме нескольких в конце (33й, 34й, 35й, 36й и 37й), которые имеют в нулевом байте #FC, что судя по описанию выше значит "гашение"

интересно, что уже в 1й строке идут какие-то данные:
Code:
00000b00  00 00 00 ff 00 08 00 ff  00 10 00 ff 00 18 00 ff  |................|
00000b10  00 20 00 ff 00 28 00 ff  00 30 00 ff 00 38 00 ff  |. ...(...0...8..|
00000b20  00 40 00 ff 00 48 00 ff  00 50 00 ff 00 58 00 ff  |.@...H...P...X..|
00000b30  00 60 00 ff 00 68 00 ff  00 70 00 ff 00 78 00 ff  |.`...h...p...x..|
00000b40  00 80 00 ff 00 88 00 ff  00 90 00 ff 00 98 00 ff  |................|
00000b50  00 a0 00 ff 00 a8 00 ff  00 b0 00 ff 00 b8 00 ff  |................|
00000b60  00 c0 00 ff 00 c8 00 ff  00 d0 00 ff 00 d8 00 ff  |................|
00000b70  00 e0 00 ff 00 e8 00 ff  00 f0 00 ff 00 f8 00 ff  |................|
00000b80  f8 00 00 ff fc 00 00 ff  fc 00 00 ff fc 00 00 ff  |................|
00000b90  fc 00 00 ff fc 00 00 ff  f8 00 00 ff f8 00 00 ff  |................|
и вот 2я строка (вторые символы в том же самом знакоместе:
Code:
00000f00  00 00 00 00 00 08 00 04  00 10 00 00 00 18 00 04  |................|
00000f10  00 20 00 00 00 28 00 04  00 30 00 20 00 38 00 04  |. ...(...0. .8..|
00000f20  00 40 00 04 00 48 00 04  00 50 00 00 00 58 00 04  |.@...H...P...X..|
00000f30  00 60 00 00 00 68 00 04  00 70 00 20 00 78 00 04  |.`...h...p. .x..|
00000f40  00 80 00 00 00 88 00 04  00 90 00 20 00 98 00 06  |........... ....|
00000f50  00 a0 00 00 00 a8 00 04  00 b0 00 00 00 b8 00 04  |................|
00000f60  00 c0 00 00 00 c8 00 04  00 d0 00 04 00 d8 00 04  |................|
00000f70  00 e0 00 00 00 e8 00 04  00 f0 00 20 00 f8 00 04  |........... ....|
00000f80  f8 00 00 00 fc 00 00 04  fc 00 00 00 fc 00 00 06  |................|
00000f90  fc 00 00 24 fc 00 00 04  f8 00 00 00 f8 00 00 04  |...$............|
странно, что тут задействован последний байт в четвёрке, хотя в описании сверху написано что он не используется

и в 1м байте (который второй) чото записано (#20, #28, #30, #38), как будто это графический режим, однако это текстовый - возможно там ничего не видно т.к. атрибут стоит #00 (чёрным по чёрному)

_________________
:eugeek: https://twitter.com/Shaos1973


03 Apr 2021 22:26
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Разбираюсь с настройками квадратиков-описателей графического режима:

Attachment:
vmem-dump1.jpg
vmem-dump1.jpg [ 299.37 KiB | Viewed 1508 times ]


Attachment:
vmem-dump2.jpg
vmem-dump2.jpg [ 322.53 KiB | Viewed 1508 times ]

Это дамп квадратиков из зоны описателя графики поcтавленный с боку на ноги и отзеркалированный (колонка слева это смещение от начала области описателя по горизонтали, а цифры в строке это четвёрки байтов описателя, но выташенные из вертикали и выписанные в строку - на второй фотке со смещением). Первый байт в четвёрке за пределами изображения:
F8 (1111 1000) - бордюр
FC (1111 1100) - гашение (или синхра?)
FD (1111 1101) - прерывание?
FE (1111 1110) - должно останавливать счётчик строк и переключать кадр? но НЕ переключает...
В последнем байте четвёрки - мусор (не используется)
В предпоследнем - атрибуты текстового режима (в графическом режиме не используется)
Первые 2 байта задают адрес квадратика в видеопамяти (если старшие 2 бита первого байта не 11):
Quote:
X=0.3|0.2|0.1|0.0|1.2|1.1|1.0 (0...95),
Y=1.7|1.6|1.5|1.4|1.3 (0...31).

_________________
:eugeek: https://twitter.com/Shaos1973


13 Apr 2021 09:47
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Результаты моих вчерашних экспериментов с запредельными видеорежимами Спринтера, подключенного через белый скандаблер RGB2VGA:

со сброшенным смещением в сетапе квадратики за пределами зоны видимости можно нагородить вот так:

Attachment:
Beyond-NoShift.jpg
Beyond-NoShift.jpg [ 226.16 KiB | Viewed 1469 times ]

отцентровав видео на моём VGA-мониторе:

Attachment:
Beyond-WithShift-setup.jpg
Beyond-WithShift-setup.jpg [ 220.14 KiB | Viewed 1469 times ]

получаем следующюю городёжку:

Attachment:
Beyond-WithShift.jpg
Beyond-WithShift.jpg [ 234.92 KiB | Viewed 1469 times ]

по итогам отсмотренного предлагается новый видеорежим 83h 352x280 256 цветов (84h 704x280 16 цветов):

Attachment:
Mode-83h-84h.jpg
Mode-83h-84h.jpg [ 239.36 KiB | Viewed 1469 times ]

когда слева и справа добавляются по 2 квадратика, сверху 2 и снизу 1 (они в любом случае будут целыми и непокоцанными) - причём при этом можно сохранить линейную адресацию пикселов в видеопамяти для основной части экрана:

http://www.nedopc.org/forum/viewtopic.php?f=60&t=20375

P.S. на широких телевизорах без возможности подгонки видимых размеров изображения расширенные квадратики будут выглядеть примерно вот так (спасибо Hard):

Attachment:
Beyond-Hard.jpg
Beyond-Hard.jpg [ 171.03 KiB | Viewed 1376 times ]

_________________
:eugeek: https://twitter.com/Shaos1973


14 Apr 2021 21:17
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Из дампов интересны ещё текстовые палитры, которые
Code:
#03F0..#03F2 -- text palette 0 -- background colour
#03F4..#03F6 -- text palette 1 -- ink colour
#03F8..#03FA -- text palette 2 -- background flash colour
#03FC..#03FE -- text palette 3 -- ink flash colour

нулевой цвет (чёрный):
Code:
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00

первый цвет (синий):
Code:
00 00 00 00 00 00 a8 00  00 00 00 00 00 00 a8 00

второй цвет (зелёный):
Code:
00 00 00 00 00 a8 00 00  00 00 00 00 00 a8 00 00

ну и пятнадцатый цвет (белый):
Code:
00 00 00 00 fc fc fc 00  00 00 00 00 fc fc fc 00

видно, что задаётся только "text palette 1" и "text palette 3", которые устанавливаются одинаковыми

_________________
:eugeek: https://twitter.com/Shaos1973


21 Apr 2021 01:32
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Подпрограмма быстрой очистки текстового экрана с помощью акселератора от ИванМака:
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

_________________
:eugeek: https://twitter.com/Shaos1973


03 Jul 2021 03:23
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Тут в телеге КряКря, анализирующий исходники прошивки большой альтеры Спринтера, на днях выяснил, что байт 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 подсвечены):

Attachment:
Zoom640x256.jpg
Zoom640x256.jpg [ 70.94 KiB | Viewed 208 times ]


Как это выглядит для разных значений mode2:

Attachment:
Zoom640x256-0.jpg
Zoom640x256-0.jpg [ 90.27 KiB | Viewed 208 times ]

Attachment:
Zoom640x256-4.jpg
Zoom640x256-4.jpg [ 85.93 KiB | Viewed 208 times ]

Attachment:
Zoom640x256-5.jpg
Zoom640x256-5.jpg [ 100.28 KiB | Viewed 208 times ]

Attachment:
Zoom640x256-6.jpg
Zoom640x256-6.jpg [ 88.98 KiB | Viewed 208 times ]

Attachment:
Zoom640x256-7.jpg
Zoom640x256-7.jpg [ 87.6 KiB | Viewed 208 times ]


В случае режима 320x256 второй описатель не используется и этот квадратик будет 8х8 с правильным зумом (пока не проверял)

_________________
:eugeek: https://twitter.com/Shaos1973


30 Sep 2021 09:42
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19933
Location: Silicon Valley
Reply with quote
Shaos wrote:
Image

Значится так - каждый "квадратик" представлен в области описателя экрана (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", биты в описателях порезаны несколько иначе:
Code:
;       Байт 0
;               bit 7..6 - номер палитры
;               bit 5 - графика/текст, должно быть 0 (текста нет)
;               bit 4 - режим 640/320 точек в линии
;               bit 3 - резерв - должны быть 0
;               bit 2 - разрешение смещения сетки
;               bit 1..0 - 2 старших бита координаты X
;
;       Байт 1  8 младших бит координаты X
;
;       Байт 2  координата Y
;
;       Байт 3  смещение сетки координат
;               bit 3..0 - смещение по X
;               bit 7..4 - смещение по Y

_________________
:eugeek: https://twitter.com/Shaos1973


12 Oct 2021 23:36
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 23 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 4 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

Search for:
Jump to:  

Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.