| | |
| Shaos wrote: Можно на счёт знакомест графики отвести отдельную цепочку счётчиков, которая будет стартовать в нужном месте строки, а основная цепочка счётчиков может считать не знакоместа, как в оригинале, а пикселы - в этом случае можно более точно подогнаться под тайминги SVGA оставаясь в пределах более доставаемого кварца 56 МГц (28 х 2): 480 пикселов в строке можно добавить как один из графических режимов, выбираемых программно: для 384 видеопамять имеет размер #3000 для 480 - #3C00 для 512 - #4000 для текстового режима 80x32 - #A00 начало видеопамяти по умолчанию как известно #9000 для 480 пикселов в строке начало надо сдвинуть до #8400 для 512 пикселов в строке - до #8000 а для текстового режима видеопамять может подняться до #B600, освободив тем самым 9.5 килобайт для программы пользователя. P.S. Если символы в текстовой видеопамяти располагать не линейно, а вертикальными колонками, и знакогенератор зашить в отдельно стоящий 2Кб ПЗУ, то наверное можно даже и на рассыпухе его организовать P.P.S. Новые цифры для счётчиков: 0...559 - видимая часть экрана (до #22F = 10 0010 1111) - для режима 512 cчётчик адресов стартует после 23 (#017 = 00 0001 0111) и считает 64 знакоместа (до #3F = 11 1111) - для режима 480 cчётчик адресов стартует после 39 (#027 = 00 0010 0111) и считает 60 знакомест (до #3B = 11 1011) - для режима 384 счётчик адресов стартует после 87 (#057 = 00 0101 0111) и считает 48 знакомест (до #2F = 10 1111) 560...587 - передний порожек (до #24B = 10 0100 1011) 588...677 - синхроипульс (до #2A5 = 10 1010 0101) 678...738 - задний порожек (до #2E2 = 10 1110 0010) | |
| | |
Для начала можно внимательно поглядеть как считают счётчики в MX^2.
Первый счётчик принимающий 40 МГц выдаёт 20M,10M,5M и 2M5 сигналы.
Второй и третий счётчики принимает на счётный вход 2M5 (однако в моей вариации схемы почему-то туда идёт N2M которые есть инвертированные 2.5 МГц) и выдают биты счётчика знакомест X0,X1,X2,X3,X4,X5,X6.
Второй и третий счётчики сбрасываются путём подачи сигнала HRS=!(X0&X6) на вход синхронной загрузки нулей - это значит, что оно сбросится на 65м знакоместе, просчитав 66 раз, что вполне соотносится с времянками 800x600@60 (см.выше) - 1056/2/8=66.
Ну и далее цепочка из трёх счётчиков считает строки, принимая в качестве счётного входа по спаду сигнал HS (на моей схеме это HSYN - горизонтальный синхроимпульс) и сбрасываясь по VRS в результате получаются биты номера строки Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8 (причём самый младший бит счётчика игнорируется, а Y0 это уже на самом деле первый бит - т.е. строки повторяются по 2).
В формировании логики графического контроллера принимает участие сигнал ALD, который в схеме от Fifan-а просто идёт с выхода переполнения первого счётчика, а в моей схеме как-то хитро замешан 2M & !5M & 10M & 20M - видимо это из-за того, что далее на счётчики идёт инверсный 2M, поэтому будем придерживаться схемы (в том числе нумерации микросхем), которую нарисовал Fifan т.е. ALD = 2M5 & 5M & 10M & 20M и далее на счётчики идёт прямой 2M5.
Видимая часть изображения должна составлять 48 знакомест и оно похоже смещено на 16 от начала счёта (см. ниже) плюс по одному знакоместу слева и справа должен быть бордюр, который является частью видимых 800 пикселов (400 при пиксельклоке 20 МГц, что на 16 больше, чем стандартные 384).
Триггер DD10.1 устанавливается по фронту сигнала X4 и асинхронно сбрасывается по !(ALD & X6) выдавая на инверсном выходе сигнал HBL.
Триггер DD10.2 устанавливается по фронту сигнала X0 & X3 и асинхронно сбрасывается по !(X0 & !X6 & !X3 & HBL) выдавая на прямом выходе сигнал HS.
Вот примерно что получается:
Точками я пометил места где должно начинаться и заканчиваться видимое поле в случае полных 800 пикселов - т.к. там по одному знакоместу слева и справа расположен бордюр (который всегда чёрный в схеме MX^2). В нашем случае горизонтальный бордюр будет сильно шире (т.к. частота больше) и его ширина будет разной для разных видеорежимов. И кстати не совсем понятно, почему импульс HS получается отрицательный т.к. в описании к 800x600@60 написано, что оба синхроимпульса - положительные.
Для наших целей надо поменять только логику счёта горизонтальных счётчиков плюс добавить генерацию сигнала бордюра в вертикальных. Вертикальные пределы в MX^2 получаются на триггерах DD17.1 и DD17.2 - в обоих случаях тактируются они сигналом X3. Сигнал VRS (сбрасывающий вертикальные счётчики) получается с инверсного выхода триггера DD17.2, на вход D которого подаётся !(Y8 & Y5 & Y4 & Y3 & Y1), т.е. сигнал сброса получается на 100111010й строке, что есть 314 пар или 628 строк (что соответствует описанным выше времянкам разрешения 800x600@60). Сигнал вертикального синхроимпульса VS получается с прямого выхода триггера DD17.1, на вход D которого подано !(Y1 & Y2 & !Y3 & Y4 & !Y5 & Y8) что должно срабатывать на номерах 1xx01011x:
100010110 = 278
100010111 = 279
101010110 = 342
101010111 = 343
110010110 = 406
110010111 = 407
111010110 = 470
111010111 = 471
но т.к. счётчики сбрасываются на номере 314 (628 строк), то отрабатывают только номера 278 и 279, что в строках означает 556,557,558 и 559, хотя если считать от начала видимых 600 строк оно должно начинаться на 601й строке (после одной строки "front porch") - значит изображение начинает показываться в 601-556=45й строке т.е. первые 45 видимых на мониторе строк это чёрный бордюр (на нашей смещённой шкале они расположены в самом конце на строках 582...627, что есть номера от 291 до 313) и также чёрный бордюр идёт после показа 256 раздвоенных строк (512 видимых), что есть номера от 256 и до 277 (причём последняя линия это тот самый единичный "back porch") - нам надо выделить сигнал бордюра в правильных номерах, чтобы подавать цвет бордюра вместо черноты там, где это будет нужно, а именно в 256...276 и в 291...313 номерах:
1 0000 0000
...
1 0001 0100
и
1 0010 0011
...
1 0011 1001 (последний номер в шкале счёта).
По ходу надо сплошной сигнал бордюра иметь для краёв экрана, поэтому его надо получать на триггере, который взводится на 1 0010 0011 и сбрасывается на 1 0001 0100.
P.S. Тут выходит что ширина бордюра сверху выше на пару строк, а снизу - меньше на пару строк, т.е. видимое изображение сдвинуто вниз на 2 строки - по идее это можно "починить" пересчитав номера, а можно пока оставить как есть, чтобы не трогать основную часть логики вертикальных счётчиков ( а так поставить бы галки вместо логики - сэкономилось бы куча корпусов ; )