nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Mar 2024 21:17



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

Joined: 08 Jan 2003 23:22
Posts: 22379
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 и более байт

_________________
:dj: https://mastodon.social/@Shaos


02 Apr 2021 22:40
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
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 (чёрным по чёрному)

_________________
:dj: https://mastodon.social/@Shaos


03 Apr 2021 21:26
Profile WWW
Admin
User avatar

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

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


Attachment:
vmem-dump2.jpg
vmem-dump2.jpg [ 322.53 KiB | Viewed 10199 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).

_________________
:dj: https://mastodon.social/@Shaos


13 Apr 2021 08:47
Profile WWW
Admin
User avatar

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

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

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

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

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

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

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

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

Attachment:
Mode-83h-84h.jpg
Mode-83h-84h.jpg [ 239.36 KiB | Viewed 10160 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 10067 times ]

_________________
:dj: https://mastodon.social/@Shaos


14 Apr 2021 20:17
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
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", которые устанавливаются одинаковыми

_________________
:dj: https://mastodon.social/@Shaos


21 Apr 2021 00:32
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
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

_________________
:dj: https://mastodon.social/@Shaos


03 Jul 2021 02:23
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
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 8899 times ]


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

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

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

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

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

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


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

_________________
:dj: https://mastodon.social/@Shaos


30 Sep 2021 08:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
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

_________________
:dj: https://mastodon.social/@Shaos


12 Oct 2021 22:36
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
Location: Silicon Valley
Reply with quote
Дампы видеопамяти выше сняты в графическом режиме - переснял в текстовом.
В текстовом режиме 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 есть такое описание:
Code:
; При использовании какого либо знакогенератора, он занимает часть поля
; графики по координатам
; (координаты в знакоместах, т.е. в значениях байта IX+6 описателя окна)
; X = (8 * ( bit3..0 режима ))..(8 * ( bit3..0 режима ) + 7)
; По Y занимаются все положения.
; Таким образом, при использовании нескольких знакогенераторов сначала
; следует использовать знакогенераторы с номерами меняющимися в Bit7..6,
; так как они попадают в одни и те же координаты поля графики

; При открытии графических окон следует помнить, что в этот момент
; информация текстового экрана находящаяся в этом месте будет утеряна.
; При открытии текстового окна изменяется информация только в поле графики
; знакогенератора соответствующему этому текствовому экрану. Если эта
; информация и информация графического окна не пересекались, то при
; повторном открытии графического экрана, на нем автоматически
; восстановится графическая картинка

а также указывается, что шрифты выбираются битами 7...6 и 3...0 нулевого байта описателя:
Code:
    ;                       text_mode bit7..6,3..0 - номер знакогенератора
    ;                                 исключение: bit7..6=B"11" -> бордер

экспериментально установлено, что если указать в третьем бите порта 7FFD единицу (этот бит в ZX-128K переключает видимую графическую страницу), то шрифт по умолчанию будет браться не по смещению 704, а по смещению 736 (смещение 704 как раз и есть начало 11 блока восьмёрок шрифтов, как написано выше)

также эксперименты подтвердили, что вариант когда биты 6 и 7 оба равны 1 не выбирает шрифт - в таких знакоместах в этом случае просвечивает бордюр (хотя исходник говорит про то, что единицы должны быть в четырёх битах 7...4 для включения бордюра)

_________________
:dj: https://mastodon.social/@Shaos


30 Jan 2022 01:19
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
Location: Silicon Valley
Reply with quote
Получается, что текстовая палитра (палитры) это не 16 цветов и даже не 64 цвета (4 палитры), а 1024 цвета!!!
Code:
; Страницы 4..7 соответствуют текстовому режиму и режиму "Спектрум"
; В странице 4 задается цвет paper для каждого атрибута. В странице 5
; задается цвет ink для каждого атрибута.
; В странице 6 задается цвет paper, которым он будет моргать в режиме flash
; В странице 7 задается цвет ink, которым он будет моргать в режиме flash
; Таким образом, для каждого из 256-ти атрибутов задается четыре цвета
; если цвета 4,5 совпадают с цветами 6,7 то режим flash оказывается
; отключенным. Для его включения в спектрумовском режиме надо поменять
; местами цвета 6 и 7. Если надо включить flash в режим IBM-CGA, следует
; установить цвета 6 и 7 одинаковыми и равными цвету 4
; по сути режим flash всегда включен и на экране постоянно меняются цвета
; paper с 4-го на 6-й, а цвета ink с 5 на 7-й. Если эти пары цветов для
; атрибута знакоместа устанавливаются одинаковыми, то flash в этом месте
; не виден.
; Используя подобное задание цветов текстового режима можно легко добиться
; совместимости по цветам как со Спектрумом, так и с IBM

Все цвета по всем 256 позициям ЗАДЕЙСТВОВАНЫ!!!

P.S. Правда чтобы небыло мерцания пары цветов должны быть одинаковыми, т.е. количество активных цветов в этом случае уменьшается с 1024 до 512, что тоже неплохо...

P.P.S. С другой стороны пары цветов отвечающие за передний фон и бекграунд не могут быть совсем уж любыми - чтобы использовать все 512 цветов надо специально готовить графику...

_________________
:dj: https://mastodon.social/@Shaos


30 Jan 2022 16:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
Location: Silicon Valley
Reply with quote
Некто Сергей в дискорде помог разобраться с атрибутами - чтобы второй байт описателя был равен атрибутам, надо чтобы в блоке шрифтов в соответствующей колонке атрибутов были записаны значения 0x00, 0x01, 0x02 ... 0xFF - в этом случае даже с подменённым шрифтом текстовые атрибуты в области описателя экранов продолжают работать как текстовые атрибуты. Я проверил в случае с альтернативными шрифтами - работает ;)

_________________
:dj: https://mastodon.social/@Shaos


30 Jan 2022 18:36
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
накидал утилиту loadfnt.exe которая подменяет шрифт корректно, через систему, не дёргая "квадратики" (не насилуя машину). шрифт сохраняется даже при ребуте через CAD.


Attachments:
FM_fnt_small.jpg
FM_fnt_small.jpg [ 139.65 KiB | Viewed 2540 times ]
16 Feb 2022 03:01
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22379
Location: Silicon Valley
Reply with quote
Нашёл описание хитрого оклоспектрумовского режима 704/736/768x288 (со знакоместами 8x8 как на ZX) выдуманного мною в январе 2022 года - этот режим можно получить на оригинальном железе Спринтера и я его тогда назвал "Mode 0x01":

Code:
Каждый столбик из 288 плашек по 8 пикселов (36 знакомест) доступен одномоментно,
но из-за особенностей устройства квадратиков доступ к этим плашкам будет такой
(при открытии графики с адреса 0xC000):

0xC000...0xC007 - 8 байт графики для самого верхнего знакоместа (номер 0)
0xC008...0xC00F - 8 байт графики для знакоместа номер 1
0xC010...0xC017 - 8 байт графики для знакоместа номер 2

а далее необычно:

0xC018 - ZX-атрибут для знакоместа 0
0xC019 - ZX-атрибут для знакоместа 1
0xC01A - ZX-атрибут для знакоместа 2
0xC01B...0xC01F - 5 неиспользуемых байт

Далее идёт всё тоже самое, но для скрытого поля графики (которое становится
видимым при записи единицы в бит 3 порта 7FFD):

0xC020...0xC027 - 8 байт графики для самого верхнего знакоместа (номер 0) скрытого поля графики
0xC028...0xC02F - 8 байт графики для знакоместа номер 1 скрытого поля графики
0xC030...0xC037 - 8 байт графики для знакоместа номер 2 скрытого поля графики
0xC038 - ZX-атрибут для знакоместа 0 скрытого поля графики
0xC039 - ZX-атрибут для знакоместа 1 скрытого поля графики
0xC03A - ZX-атрибут для знакоместа 2 скрытого поля графики
0xC03B...0xC03F - 5 неиспользуемых байт

Далее следующие 3 знакоместа основного поля графики:

0xC040...0xC047 - 8 байт графики для знакоместа номер 3
0xC048...0xC04F - 8 байт графики для знакоместа номер 4
0xC050...0xC057 - 8 байт графики для знакоместа номер 5
0xC058 - ZX-атрибут для знакоместа 3
0xC059 - ZX-атрибут для знакоместа 4
0xC05A - ZX-атрибут для знакоместа 5
0xC05B...0xC05F - 5 неиспользуемых байт

и т.д. вплоть до 35го знакоместа (для основного и спрятанного полей) - последние
5 байт также будут неиспользуемыми (0xC2FB...0xC2FF)

Столбики из 36 знакомест (288 плашек с атрибутами для квадратов 8х8) формируют в видеопамяти 2 поля размером 2048x288 пикселов (мы можем получать доступ к любой из 256 вертикальных столбиков одномоментно через окно доступа к видеопамяти, т.е. пикселов по горизонтали будет 8x256=2048) с горизонтальным скроллом - 2 поля потому что основное и теневое (т.е. уже как бы 2048x576 пикселов), которые можно мерцать гигаскрином, повышая эффективное вертикальное разрешение, либо просто можно принять, что мы имеем 4 статических экрана, между которыми можно переключаться мгновенно (по спринтеровски, и по спектрумовски):

Attachment:
Mode0x01-VM-mapping.gif
Mode0x01-VM-mapping.gif [ 15.26 KiB | Viewed 2534 times ]

(маленькими прямоугольниками тут показаны обычные ZX-экраны 256x192)

В этом режиме например можно получить вот такие пере-спектрумовские картинки 768x288 пикселов (причём с 8-пиксельным горизонтальным скроллом по ширине в 2048 пикселов):

Attachment:
Mode0x01-768x288-color.png
Mode0x01-768x288-color.png [ 227.89 KiB | Viewed 2550 times ]

Или 736x288 (т.к. 768 скорее всего будет выходить за пределы видимой части экрана большинства мониторов):

Attachment:
miami2048-736x288-small.png
miami2048-736x288-small.png [ 171.46 KiB | Viewed 2541 times ]

Такие картинки лучше смотреть на дисплее с соотношением сторон 16:9 и к примеру обычное окно ZX будет выглядеть в таком разрешении так:

Attachment:
Mode0x01-736x288-ZX-16x9-small.jpg
Mode0x01-736x288-ZX-16x9-small.jpg [ 156.29 KiB | Viewed 2541 times ]

(спешу заметить, что в Спринтере любой квадратик экрана можно превратить в бордюр, через который будут бежать полоски при загрузке данных с магнитофона)

P.S. Перерисовал расположение экранов в видеопамяти с указанием основного и теневого поля для пущей понятности...

_________________
:dj: https://mastodon.social/@Shaos


10 Sep 2023 01:47
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 28 posts ]  Go to page Previous  1, 2

Who is online

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