Описание самого конкретного устройства здесь. А так - вся тема "Эмулятор ДВК", ссылка на последнюю версию должна быть на первой странице и есть на последней в момент выкладывания, кажется, на 111-й или 110-й.
Описание самого конкретного устройства здесь. А так - вся тема "Эмулятор ДВК", ссылка на последнюю версию должна быть на первой странице и есть на последней в момент выкладывания, кажется, на 111-й или 110-й.
Последний раз редактировалось AFZ; 22.04.2016 в 08:39.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
Зачем? Со стороны УКНЦ там обычный 1801ВП1-065, а что там со стороны УКНЦ-шной локалки, пока неважно. Нам достаточно достать ту программулю, которую ПП пересылает в память ЦП для загрузки по сети, отдизасмить ее и разобраться, как с ее помощью загрузить в любое наперед заданное место несколько десятков байтов кода и передать туда управление.
Подозреваю, всё что это давно сделано...
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
Ну да, дизассемблированное ПЗУ УК-НЦ давно есть. Я видел соответствующую часть кода, который производит загрузку из сети. Правда не понял кто конкретно это делает - ПП или ПЗУ.
СА сидит на магистрали ЦП. Поэтому для загрузки по сети ПП высылает через DMA в память ЦП программу-загрузчик и запускает ее. Кажется с адреса 10000, но точно не помню. Всё остальное делается этой программой. Вот ее и надо отдизасмить, если это еще не сделано.
У меня в свое время, когда я интересовался этим, содержимого ПЗУ-шек не было, так я написал программулю, которая под RT-11 очищала всю свободную память и останавливалась (HALT). Затем я запускал загрузку из сети, потом останавливал ее кнопкой "Стоп" и пускал свою программулю дальше. Она находила начало и конец вновь появившегося кода, после чего я сохранил его командой SAVE и дизасмил полученный .SAV-файл. Увы, все это осталось на моем ДВК, винчестер которого покрылся бэдами. И уже почти ничего не помню...
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
Да, примерно так все и выглядит:
Код:; Обработка пункта меню ЗАГРУЗКА [сеть] 162440$: JSR R4,163006$ ; Вывод "* ЗАГРУЗКА ИЗ СЕТИ *" .WORD 163573$ ; Адрес надписи JSR R5,162522$ ; Перекачка загрузчика и его запуск .WORD 164160$,210,0 ; Обработка команды "Т" пультового монитора (тест локальной сети) 162460$: JSR R5,162522$ ; Перекачка программы теста и ее запуск .WORD 164600$,360,0 ; Обработка пункта меню ЗАГРУЗКА [стык С2] 162472$: JSR R5,162522$ ; Перекачка загрузчика и его запуск .WORD 165540$,25,0 ; Обработка пункта меню ЗАГРУЗКА [магнитофон] 162504$: JSR R5,162522$ ; Перекачка загрузчика и его запуск .WORD 163774$,44,164130$,14,0 ; Подпрограмма перекачки загрузчика из сист. ОЗУ и его запуск 162522$: MOV #1000,R0 ; R0 = адрес, куда перекачивается загрузчик 162526$: MOV (R5)+,R1 ; R1 = адрес загрузчика в сист. ОЗУ BEQ 162542$ ; Конец перекачки MOV (R5)+,R2 ; R2 = размер загрузчика в словах 162534$: MOV (R1)+,(R0)+ ; Цикл перекачки SOB R2,162534$ BR 162526$ 162542$: CALL 161236$ ; Перевод ЦП в режим USER MOV #200,R0 ; Копия ССП = 200 (прерывания запрещены) $MTPS$ MOV #1000,R0 ; Копия СК = 1000 (адрес загрузчика) $MTPC$ MOV #1000,SP MOV R3,R0 ; R0 = номер устройства (диска или кассеты ПЗУ) $RUN$ ; Запуск загрузчика 162572$: RETURN
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А чем он может быть некорректным? Старался как мог:
Код:; Загрузчик из сети164160$:MTPS #340 ; Запретить прерывания MOVB @#176561,R5 ; Выделение в R5 номера сетевой станции MOV R5,R0 BIC #177760,R5 ASR R0 BIC #177717,R0 BIS R0,R5 MOVB R5,164556$ ; Сохранение номера сетевой станции MOVB 164572$,R0 ; R0 = 173(8) XOR R5,R0 ; R0 = 173(8) XOR номер_сетевой_станции MOVB R0,164572$ MOV #30,R0 ; R0 = 30 (адрес вектора команды EMT) MOV #164500$-164160$+1000,(R0)+ ; Установка вектора прерывания EMT CLR (R0)+ ; Установка ССП при вызове EMT MOV #164512$-164160$+1000,(R0)+ ; Установка вектора прерывания TRAP CLR (R0)+ ; Установка ССП при вызове TRAP 164244$:MOV #10000,SP ; Установка указателя стека MOV #164526$-164160$+1000,@#100 ; Устан. вект. прер. сет. таймера CLR @#102 MTPS #0 ; Разрешить прерывания CLR 164534$ ; Очистка счетчика ожидания 164272$:TRAP 0 ; Чтение пришедшего байта CMP 164534$,#5 ; Счетчик ожидания больше пяти BLO 164272$ ; Нет 164304$:EMT 0 ; Посылка и чтение очередного байта CMPB #376,R0 ; Пришедший байт равен 376(8) BNE 164304$ ; Нет MOV #164554$-164160$+1000,R1 ; R1 = адрес блока передачи 164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи CMPB #376,R0 ; Он равен 376(8) ? BEQ 164334$ ; Да EMT 0 ; Посылка и чтение очередного байта BR 164320$ 164334$:EMT 0 ; Посылка и чтение очередного байта CMPB #377,R0 ; Прочитанный байт равен 377(8) ? BNE 164334$ ; Нет EMT 0 ; Посылка и чтение очередного байта CMPB R5,R0 ; Полученный байт равен номеру станции ? BNE 164334$ ; Нет MOV #377,R4 ; R4 = 377(8) (контрольная сумма) XOR R0,R4 ; R4 = 377(8) XOR номер_сетевой_станции MOV #50000,R1 ; R1 = адрес расположения загрузчика EMT 0 ; Посылка и чтение очередного байта MOV R0,R3 ; R3 = считанный байт XOR R0,R4 ; Подсчет контрольной суммы 164372$:EMT 0 ; Посылка и чтение очередного байта CMPB #373,R0 ; Считанный байт равен 373(8) ? BLOS 164410$ ; Выше или равен 373(8) XOR R0,R4 ; Подсчет контрольной суммы MOVB R0,(R1)+ ; Передача принятого байта в память BR 164372$ 164410$:BNE 164426$ ; Принятый байт равен не равен 373(8) EMT 0 ; Посылка и чтение очередного байта COM R0 ; Инверсия принятого байта XOR R0,R4 ; Подсчет контрольной суммы MOVB R0,(R1)+ ; Передача принятого байта в память COM R0 ; Инверсия для передачи BR 164372$ 164426$:CMPB #374,R0 ; Принятый байт равен 374(8) BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта CMPB R0,R4 ; Он равен контрольной сумме ? BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта BISB #10,R0 ; R0 = R0 OR 10(8) EMT 0 ; Посылка и передача байта CMPB #377,R0 ; Принятый байт равен 377(8) BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта MOV #4,@#176560 ; Включение кольцевой сети MTPS #340 ; Запретить прерывания JMP @#50000 ; Переход на исполнение загрузчика ; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT) 164500$:TSTB @#176564 ; Передатчик СА готов ? BPL 164500$ ; Нет MOVB R0,@#176566 ; Передача байта в сеть ; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP) 164512$:TSTB @#176560 ; Приемник СА готов ? BPL 164512$ ; Нет MOVB @#176562,R0 ; Прием байта из сети RTI ; Подпрограмма исполнения прерываний таймера 164526$:CLR @#176560 ; Включение режима загрузки INC (PC)+ ; Инкремент счетчика ожидания 164534$:.WORD 0 CMP 164534$,#1000 ; Счетчик ожидания превысил лимит времени ? BHI 164550$ ; Да RTI 164550$:JMP 164244$ ; Блок передачи в сеть 164554$:.BYTE 377,0,0,204,0,0,0,0,0,0,0,0,0,374,173,60,377,376,0,0
Да, вроде ничего некорректного нет. Вопрос только в том, что с этим делать чтобы с сетью работать? Например, есть у меня модуль HLK-RM04, который подключается через RS232. Как мне с ним обмен наладить? Ему вроде достаточно AT-команд, если я ничего не путаю.
С сетью? А зачем? Сеть УКНЦ сама по себе довольно бесполезная вещь. Для замены дисковых устройств сетевыми она слишком тормозная. Была бы она, хотя бы, 1Мбит, было бы терпимо, а 56 Кбит - это даже не смешно. Для подключения во "взрослые" сети не годится сама УКНЦ - если и удастся затолкать TCP/IP в машинку без диспетчера памяти и без настоящей DEC'овской сетевухи, толку с него не будет никакого, ибо он один займет все ресурсы машинки, на прикладуху места просто не останется...
А вот принять загрузчик, который загрузит систему с дополнительного дискового устройства на шине ЦП - это запросто.
- - - Добавлено - - -
Да, приведенный дизасм я толком не разглядывал - я сейчас глубоко закопался в ядро ДИАМСа и на другое отвлекаться не хочу...
Последний раз редактировалось AFZ; 27.04.2016 в 08:48.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)