С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Нашел некоторые несоответствия описания видеоконтроллера с тем, что есть на самом деле.
1) Самый первый отрезок в строке тоже должен отображаться по принципу 'бордюр, затем сам отрезок'. Возможно, бордюр у него будет нестандартным, однако бордюр должен быть.
2) Для режима 2 цвета и 4 цвета, палитра используется иначе, чем описано. В описании сказано, что для двухцветного режима цвета находятся в 14 и 15 цвете палитры, а для четырехцветного в 12, 13, 14 и 15 цветах.
На самом деле для двухцветного режима цвет-0 должен находиться в цветах палитры 7, 11, 13 и 14, а цвет-1 в 15-м цвете.
Для четырехцветного режима цвет-0 находится в 3 и 12 цвете палитры, цвет-1 в 7 и 13, цвет-2 в 11 и 14, цвет-3 в 15-м цвете палитры.
Расшифровывая подобную особенность, становится понятно, с чем это связано:
Во всех режимах (1, 2 или 4 цвета), видеоконтроллер оперирует тетрадами (4-битными блоками), информацию в которых для 1 и 2 цветных режимах он не сдвигает, чтобы получить нужные биты, а маскирует ненужные биты, накладывая по 'OR' маску 1110, 1101, 1011 и 0111 для выбора бита в двухцветном режиме, и маску 1100 и 0011 для выбора пары бит для 2-х цветного режима. Получившиееся тетрада и есть номер цвета в палитре.
Отсюда выходит интересная потенциальная возможность раскраски пикселей разными цветами в 1 и 2-цветных режимах, в зависимости от позиции пикселя на экране. Не знаю, использовал ли кто-нибудь эту особенность, но она есть.
---------- Post added at 19:01 ---------- Previous post was at 18:57 ----------
Да. В табличке очередь, где каждый элемент указывает на следующий и предыдущий. Как только в очереди появляется один или несколько запросов, контроллер извлекает самый последний поступивший, вычисляет вектор, а очередь сдвигает. Если в очереди ничего не осталось, он сбрасывает флаг VIRQ' (это байт в ОЗУ, по которому ориентируется ядро, выставлять ли VIRQ при переключении управления на очередной процесс).
Да вы что? Представляете как это схемотехнически надо реализовать? Вот на КМД ДВК (MY) для ПДП используются аж три 1801ВП1. А тут ещё анализировать и двигать надо. Да, в Неоне стоят 1804ВУ1, но они используются в видеоконтроллере. А ведь есть подпрограмма обработки VIRQ в ПЗУ. Не знаю, почему вы её не увидели.
Еще немножко надо пошлифовать, ибо миллионы строк отладочных сообщений и всяких варнингов по записи в несуществующие регистры лезут в окно. Подчищу и выложу.
---------- Post added at 19:49 ---------- Previous post was at 19:49 ----------
Можно даже без обьяснения сперва, просто адрес.
Без объяснения сложно понять суть. Я ещё конечно не дошёл до обработки векторов ВПО с помощью запросов, но это в принципе и не важно. Важно то, что при появлении запросов в таблице, ВПО сбрасывает в регистре PPIC (161034) бит 3, в результате чего на процессор 1806ВМ2 подаётся сигнал запроса на прерывание VIRQ. Как только по приоритету процессора обработка VIRQ будет разрешена, то вектор текущего прерываемого процесса положится в стек (то есть PC и PSW), ну и далее процессор выставит сигнал IAKO для чтения вектора с шины. А вот далее начинается самое интересное. На самом деле передать вектор некому, процессор прощелкает 64 такта, ничего не получит, да и прервётся по фатальному исключению неполучения вектора прерывания. Его адрес обработки равен SEL274, ну а в нашем случае просто 0274, т.к. SEL=0. В ячейках 0274 и 0276 ПЗУ содержаться соответственно значения 01446 и 0600. Ну теперь собственно и подпрограмма:
Ну как я ранее писал, вектор прерванного процесса находится уже в стеке. Поэтому остается осмотреть нашу таблицу с прерываниями, если она закончилась, то установить бит 3 в PPIC, тем самым прекратив требовать VIRQ. Ну и если что есть, то записать содержимое нового вектора в CPC и CPSW и запустить с помощью STEP новый процесс.Код:1446$: MOV R5,@#100052 MOV R0,@#100040 MOV @#100146,R5 MOV (R5)+,R0 CMP @R5,R0 BNE 1512$ BIC #10,@#100036 BIS #10,@#161034 CMP #100150,R5 BEQ 1536$ 1512$: MOV R0,@(R5)+ MOV -(R5),2(R0) CLR -(R5) SUB #100072,R5 MFUS WCPC MFUS WCPS 1536$: MOV @#100040,R0 MOV @#100052,R5 STEP
Эта же подпрограмма обрабатывает и DOUBLE BUS ERROR, единственно, что в новом PSW стоит 0601, т.е. установлен бит C, но нигде его обработки не идет. Весьма вероятно, что в Союз-Неон нету TRAP4.
Вот что значит знать нюансы этих процессоров)
А я уж придумал аппаратный контроллер, который, кстати, исправно работает)))
---------- Post added at 20:41 ---------- Previous post was at 20:20 ----------
Но вообще, не понятно, как я мог проглядеть эту подпрограмму. Просто на самом видном месте лежит, и сразу видно, что обрабатывает таблицу векторов. Да уж.
Теперь осталось убрать из EmuStudio супер-пупер навороченный аппаратный контроллер, сделать обработку отсутствия АВП и посмотреть как всё будет работать.
А вот и тормознутость - во-первых пустое ожидание 64 тактов, во-вторых прерывание в HALT, ну и третье - программная обработка очереди. Все это занимает довольно продолжительное время, по сравнению с аппаратной реализацией. Плюс только в том, что прерывания происходят не очень часто. Ну а минус в том, если бы Com-порт был со скоростью 57600, то его запросы на прерывания в реальном времени уже было бы обработать нереально, на 9600 ещё наверно справиться можно.
А разве TRAP4 и TRAP10 - это не внутренние дела процессора?
---------- Post added at 20:53 ---------- Previous post was at 20:50 ----------
Даже в этом случае не очень тормознуто. Обработка очереди тоже весьма быстрая. Да и прерывания в системе используются только в основном от системного таймера, а это 50Hz, да ответы от HDD/FDD, да почти и все.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)