Я тут ещё в декабре снимал дамп видеопамяти (точнее системной памяти, которая отображена на видеопамять) - несколько строк в текстовом режиме (с какими то ошмётками графики по видимому) записал в файл - по ним уже можно поглядеть на внутреннее устройство видеопамяти:
Code: Select all
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: Select all
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: Select all
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: Select all
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: Select all
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:
Значится так - каждый "квадратик" представлен в области описателя экрана (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: Select all
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: Select all
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: Select all
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 (чёрным по чёрному)