Описание самого конкретного устройства здесь. А так - вся тема "Эмулятор ДВК", ссылка на последнюю версию должна быть на первой странице и есть на последней в момент выкладывания, кажется, на 111-й или 110-й.
Вид для печати
Описание самого конкретного устройства здесь. А так - вся тема "Эмулятор ДВК", ссылка на последнюю версию должна быть на первой странице и есть на последней в момент выкладывания, кажется, на 111-й или 110-й.
Зачем? Со стороны УКНЦ там обычный 1801ВП1-065, а что там со стороны УКНЦ-шной локалки, пока неважно. Нам достаточно достать ту программулю, которую ПП пересылает в память ЦП для загрузки по сети, отдизасмить ее и разобраться, как с ее помощью загрузить в любое наперед заданное место несколько десятков байтов кода и передать туда управление.
Подозреваю, всё что это давно сделано...
Ну да, дизассемблированное ПЗУ УК-НЦ давно есть. Я видел соответствующую часть кода, который производит загрузку из сети. Правда не понял кто конкретно это делает - ПП или ПЗУ.
СА сидит на магистрали ЦП. Поэтому для загрузки по сети ПП высылает через DMA в память ЦП программу-загрузчик и запускает ее. Кажется с адреса 10000, но точно не помню. Всё остальное делается этой программой. Вот ее и надо отдизасмить, если это еще не сделано.
У меня в свое время, когда я интересовался этим, содержимого ПЗУ-шек не было, так я написал программулю, которая под RT-11 очищала всю свободную память и останавливалась (HALT). Затем я запускал загрузку из сети, потом останавливал ее кнопкой "Стоп" и пускал свою программулю дальше. Она находила начало и конец вновь появившегося кода, после чего я сохранил его командой SAVE и дизасмил полученный .SAV-файл. Увы, все это осталось на моем ДВК, винчестер которого покрылся бэдами. И уже почти ничего не помню...
Да, примерно так все и выглядит:
Код:; Обработка пункта меню ЗАГРУЗКА [сеть]
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
А чем он может быть некорректным? Старался как мог:
Код:; Загрузчик из сети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'овской сетевухи, толку с него не будет никакого, ибо он один займет все ресурсы машинки, на прикладуху места просто не останется...
А вот принять загрузчик, который загрузит систему с дополнительного дискового устройства на шине ЦП - это запросто.
- - - Добавлено - - -
Да, приведенный дизасм я толком не разглядывал - я сейчас глубоко закопался в ядро ДИАМСа и на другое отвлекаться не хочу...