С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Хм, а что, при входе в обработчик прерывания или исключения пользовательского режима происходит обнуление старшего байта PSW? Я тут нарыл что микрокод запуска обработчика пользовательского прерывания читает PSW из вектора и затем его старший байт обнуляет. Таким образом PSW10 и PSW11 сбрасываются при входе в обработчик.
Существенно обновил документ по 1801ВМ1, описан микроавтомат, заполнена таблица микропереходов (хотя описано далеко не все), уже понятно каких инструкций в ВМ1 точно нет - предварительно заполнена также таблица процессорных инструкций. Разобран и описан микрокод процедур начального старта, входа в обработчики пользовательских и пультовых прерываний. Выкладываю предварительную версию от 8-Jun-2018, потому что пока нет ясности когда у меня будет время и желание заниматься завершением документирования ВМ1.
PS. Буду рад если кто-нибудь этот документ хотя бы полистает и выскажет замечания, уточнения и предложения по его улучшению (в разумных пределах - и на эту то версию уйма времени ушла)
Vslav, Вы точно документ выложили? 404 ругаицца
4. Назначение выводов Нога 5.
Как-то оно не очень. Может лучше так?Вход запроса на доступ к магистрали для ведущего процессора с аппаратным номером 0, ведущий процессор никогда не использует данный вывод как выход.
Выход запроса на доступ к магистрали для процессоров с номерами 1-3 и других внешних модулей системы
Вход запроса на доступ к магистрали для ведущего процессора с аппаратным номером 0 от процессоров с номерами 1-3 и других внешних модулей
Выход запроса на доступ к магистрали для процессоров с номерами 1-3. Ведущий процессор (номер 0) никогда не использует данный вывод как выход.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
В моем варианте первый абзац описывает функционал для ведущего проца, второй - для ведомых. В предлагаемом варианте - чередование, что не есть совсем гут, хотя оно непринципиально. Дополнение "других внешних модулей" - да, лучше перенести, сделаю.
Инструкция RESET любопытно выполняется - активируется nINIT, потом в R12 заносится 3408, гонятся цикл с декрементом R12 на 2, по достижению нуля снимается nINIT, в R12 снова записывается 3408, цикл с декрементированием повторяется, по достижению нуля запускается выборка и исполнение следующей инструкции.
Спасибо. Я тоже пытался декодировать таблицу микрокода, но понял, что не осилю и забросил. Там у меня получались какие-то очень уж сложные, нетривиальные условия для значений IR чтобы переходить с одного микроадреса на другой.
Поэтому есть предложение, хоть ещё чу-чуточку дополнить таблицу описания переходов между адресами микроинструкций программного автомата 1801ВМ1А, чтобы можно было на основе того, что есть, доделать остальное.
Скрытый текст
Например, переход с 01 на 31:
Переход с 01 на 37, немного не как у вас:Код:[0x01](x0001xxxxx000111 001xxxxx) -> [0x31](0001100110011001001010010100011000) если опкоды CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC(B),TST(B),ROR(B),ROL(B),ASR(B),ASL(B),SXT с аргументом PC [0x01](x0001xxxxx000xxx 001xxxxx) -> [0x31](0001100110011101001010010100011000) если опкоды CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC(B),TST(B),ROR(B),ROL(B),ASR(B),ASL(B),SXT с аргументом R0-R6
Переход с 01 на 45:Код:[0x01](0000000000000001 001xxxxx) -> [0x37](0001100111111111001000110000011100) если опкод WAIT [0x01](0000000000000101 001xxxxx) -> [0x37](1111111111111111111110100110011100) если опкод RESET [0x01](00000000101xxxxx 001xxxxx) -> [0x37](0001100111011111001010010100011000) если опкоды CLxx, SExx [000240-000277] [0x01](0000110100xxxxxx 001xxxxx) -> [0x37](0001101001011011001000110000011100) если опкод MARK nn
Переход с 01 на 47:Код:[0x01](0000000001xxxxxx 001xxxxx) -> [0x45](1111111110111010101010111110111101) если опкоды [000110-000177] - JMP с допустимым аргументом [0x01](x000xxxxxxxxxxxx 001xxxxx) -> [0x45](0001111110111111011010111110111101) если опкоды SWAB,CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC(B),ROR(B),ROL(B),ASR(B),ASL(B),SXT,MFPS с нерегистровой адресацией (010-077) [0x01](0000100xxxxxxxxx 001xxxxx) -> [0x45](1111111110111011101010111110111101) если опкод JSR Rn с нерегистровой адресацией (010-077) [0x01](x000101111xxxxxx 001xxxxx) -> [0x45](0001111110111111001010111110111101) если опкод TST(B) с нерегистровой адресацией (010-077) [0x01](1000110100xxxxxx 001xxxxx) -> [0x45](0001111110111011001010111110111101) если опкод MTPS с нерегистровой адресацией (010-077)
Переход с 01 на 50:Код:[0x01](xx0xxxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011011110111110111101) если опкоды MOV(B),BIC(B),BIS(B) с нерегистровыми адресациями источника и адресацией приёмника PC, и с адресациями -(PC),Rn и не только. [0x01](xx0xxxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111011110111110111101) если опкоды MOV(B),BIC(B),BIS(B) с пока не понятными условиями. все те адресации, которые не попадают в предыдущий набор [0x01](x01xxxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011001110111110111101) если опкоды CMP(B),BIT(B) условия как для пары предыдущих наборов [0x01](x01xxxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111001110111110111101) если опкоды CMP(B),BIT(B) условия как для пары предыдущих наборов [0x01](x110xxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011111110111110111101) если опкоды ADD,SUB условия как для пары предыдущих наборов [0x01](x110xxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111111110111110111101) если опкоды ADD,SUB условия как для пары предыдущих наборов
Переход с 01 на 52:Код:[0x01](x000xx0x11000xxx 001xxxxx) -> [0x50](0001000110011101001010010100111001) если опкоды SWAB Rn [000300-000306], MFPS Rn [106700-106706] [0x01](x000xx0xxx000xxx 001xxxxx) -> [0x50](0001000110011001001010010100111001) если опкоды SWAB PC [000307], MTPS Rn [106400-106407], MFPS PC [106707]
Переход с 01 на 7b:Код:[0x01](xxxxxx0xxx000111 001xxxxx) -> [0x52](1111000111011001101111010101111011) если опкоды MUL R3,PC[070307], MFPD PC[106507], MTPD PC[106607] [0x01](xxxxxx0xxx000xxx 001xxxxx) -> [0x52](1111000111011101101111010101111011) если опкоды MUL R3,Rn[070300-070306], MFPD Rn[106500-106506], MTPD Rn[106600-106606]
в скобках слева: ir, mr(без битов адреса ячейки), входные параметры для vm1a_plm, справа - 34-битный выход для vm1a_plmКод:[0x01](x0000xxxxxxxxxxx 001xxxxx) -> [0x7b](1111111111111101110110110110011101) если команды ветвления [0x01](x0000xxxxx000xxx 001xxxxx) -> [0x7b](1111111111111001110110110110011101) если команды ветвления
[свернуть]
Т.е. получается частичное декодирование инструкции, и потом переход на следующий адрес и там дальнейшее декодирование и /или обработка. Но вот уже дальше пошли такие диапазоны, что я просто не смог определить маску или несколько масок, по которым бы отлавливать попадающие инструкции. После оптимизации для прошивки ПЛМ там очень уж не очевидные перекрытия стали получаться.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)