1 Отредактировано avivanov76 (04-12-2022 18:22)

Тема: Прошивка сетевой платы НИИВК

Понадобилось тут посмотреть отличия прошивок экспериментальной и серийной сетевых плат НИИВК. Ну, а раз уж начал диазассемблировать, то решил изучить этот код повнимательнее и разобраться с протоколом обмена. Любопытно же, что там за ответ на TCP/IP внутри :) Вот что удалось выяснить на данный момент.

Прошивка здоровая, занимает все 2 КБ ПЗУ. К сожалению, целиком ее разобрать трудно. Там две части: одна отвечает за начальную загрузку машины, а вторая за обмен по сети в уже загруженном состоянии. С первой-то частью проблем нет, туда Монитор управление передает и дальше прошивка работает сама. А вот вторую часть должна вызывать операционка. Чтобы понять, что, как и когда она вызывает, ее саму надо сначала дизассемблировать, что непросто и небыстро.

Поэтому пока напишу про начальную загрузку.

Важное замечание: сетевые платы могут работать только на девятке. Прошивка использует адреса ее Монитора и активно работает с девяточным диспетчером памяти. Когда я это выяснил, сразу стало понятно, почему не делали апгрейд семерок. Ведь в школах было много классов семерок, причем, дисководы на них, к моменту начала выпуска сетевых плат, были уже довольно убитые. Почему бы не дать вторую жизнь этим классам, поменяв дисководы на сетевые платы и поставив на учительскую машину дисковод 840К? А вот нет, оказывается, сетевые платы были заточены под девятки.

Кстати, в статье "Функциональные возможности локальной сети для ПЭВМ Агат" в "Информатике и образовании" семерки упоминаются. Может, была версия прошивки для семерок? Или авторы немного приукрасили реальность?

Второе замечание: думаю, всем более-менее известно, как устроена прошивка прошивка контроллера дисковода. Она читает один (обычно один) сектор с диска, кладет его по определенному адресу и передает управление. Ей ничего не нужно знать ни про конфигурацию машины, ни про то, какую операционку с ее помощью будут загружать.

Так вот, прошивка сетевой платы совсем не такая. Первым делом она вызывает код обнаружения оборудования. Этот код опрашивает все платы расширения в машине и запоминает ее конфигурацию в таблицах устройств. Диспетчер памяти и все обнаруженные модули ОЗУ инициализируются в начальное состояние. Кстати, сам код обнаружения оборудования мне показался знакомым. Это оказался код из загрузчика ИКП-90. Прямо байт в байт.

Потом делается некий трюк. В самом начале загрузки прошивка переносит кусочек себя в ОЗУ по адресу $9A20. А после определения оборудования делает на этот кусочек переход. Я так понял, это защита от попытки перезагрузки машины командой Монитора CX00G. Если операционка уже была загружена, значит распределение страниц в диспетчере памяти поменялось, и этот кусочек кода попадет в другую страницу. Потом код обнаружения оборудования восстановит начальное распределение страниц и произойдет... переход в никуда. Перезагрузки не будет.

Дальше код по адресу $9A20 делает хитрый вызов Монитора по адресу $FAA0, и управление наконец-то попадает на код загрузки из сети. В этом месте прошивка очищает экран, выводит зеленые надписи "Сеть-АГАТ  N_xx", где xx - сетевой адрес платы, и текст "Жду загрузку !", после чего переходит в цикл загрузки.

В цикле загрузки делается следующее: сбрасывается и программируется КР580ВВ51, ожидается поступление синхросимвола, после чего читается заголовок пакета, определяется тип пакета и загружаются данные. Если пакет не последний, то цикл повторяется сначала (включая сброс и программирование КР580ВВ51). Если пакет последний, то возможны два варианта: сразу перейти на адрес $6200, либо выполнить обновление таблиц устройств (об этом скажу дальше) и сделать переход на адрес $6200. Выбор варианта определяется значением поля в заголовке последнего пакета.

При загрузке КР580ВВ51 программируется в синхронный режим с размером слова 8 бит, четной четностью, и двойным синхросимволом. Синхросимвол - это слово, которое КР580ВВ51 автоматически мониторит в поступающих данных и сигнализирует о его обнаружении процессору через вывод SYNDET. На плате этот вывод генерирует сигнал IRQ. Синхросимвол нужен примерно для того же, для чего нужен синхросбой на дискетах - чтобы понять, где находится граница байта. КР580ВВ51 может использовать одинарный или двойной синхросимвол. В прошивке используется двойной. Первый байт синхросимвола всегда равен $81, второй байт - это сетевой адрес платы.

Есть странность - обработчик прерывания не устанавливается, а ожидание синхрослова делается циклическим опросом регистра статуса КР580ВВ51. Загадка в том, почему прерывание никогда не вызывается. Возможно, дело в  том, что каждое чтение слова состояния сбрасывает сигнал SYNDET, а сам опрос делается часто (цикл выполняется за 9 тактов, а время передачи одного бита по сети - 16 тактов). Но не может же так быть, чтобы появление синхросимвола всегда совпадало с чтением регистра статуса? Явно тут какая-то хитрость с КР580ВВ51.

После синхросимвола идет заголовок пакета. Он начинается с байта $96. После этого процедура чтения заголовка ждет еще два байта $0 и $FF. Причем ждет она их хитро: если она получает какой-то другой байт, то она просто уменьшает счетчик на единицу и продолжает ждать нужные байты в правильном порядке. По аналогии с дисководами, я бы сказал, что это разделительный интервал (GAP). Процедура может пропустить до 1022 ненужных байт пока ждет нужные.

У меня два предположения, зачем так сделано. Скорее всего, это связано с наличием задержек на передающей стороне. Например, сервер (учительская машина) синхросимвол отправил, а данные для отправки еще не готовы. И передающая КР580ВВ51 просто шлет нули, пока данные готовятся.

Второе предположение - это защита от ситуации, когда синхросимвол есть в передаваемых данных. В идеале синхрослово не должно встречаться в данных, но это решает не микросхема, а программист. Можно было бы перекодировать данные так, чтобы байт $81 в них не встречался, но здесь этого сделано не было. И если начало пакета было определено неправильно, то делается попытка подождать, пока появятся байты $0 и $FF.

После байтов $0 и $FF идет любопытный байт. Я отследил все его перемещения, и оказалось, что он сохраняется... в ячейку номера трека. Напомню, что сетевая плата "прикидывается" контроллером НГМД. А Агатовские контроллеры не имеют регистра с текущим номером трека. Из-за этого про текущий трек приходится "помнить" операционке (RWTS). И чтобы после загрузки байт номера трека имел правильное значение, он передается в каждом сетевом пакете. Прикольно. Но логично, потому что в сети могут быть десятки машин и у каждой "дисковод" может стоять на разных треках.

Следующий байт - это тип пакета. Допустимых значений всего два: 0 и 1. Вообще говоря, это скорее признак "последний пакет/не последний пакет". Но поскольку структура данных пакетов отличается, то назовем его типом.

Пакет типа 0 - это обычный пакет данных. Он начинается с трех байтов. Первый - это адрес диспетчера памяти. Перед приемом каждого пакета делается обращение к девяточному контроллеру памяти по адресу $C1XX, где XX - значение байта. Следующие два байта - это адрес загрузки данных. Далее идет 256 байт данных - как раз один сектор. Контрольной суммы нет.

Пакет типа 1 похож на пакет 0, но содержит в начале три дополнительных байта. После приема этого пакета происходит запуск загруженного кода. По смыслу - это последний пакет. Первый байт определяет, как произойдет запуск: если он равен 3, то сразу будет выполнен переход на адрес $6200, при любом другом значении сначала будет выполнено обновление таблиц устройств, а затем будет выполнен переход на адрес $6200. Кроме того, этот байт одновременно сохраняется в ячейку номера дисковода. В таблицах устройств дисководы, подключенные к контроллеру нумеруются с нуля. Так что, видимо, допустимые значения этого байта 0, 1 и 3. Назначение следующих двух байт неясно. Они сохраняются, но не используются. Похоже, это должен был быть адрес запуска, но в прошивке адрес запуска фиксирован.

Спрашивается, а что это за таблицы устройств такие и зачем их обновлять? Отвечаю. У пакета ИКП есть дисковый загрузчик. При запуске он определяет конфигурацию машины и сохраняет информацию обо всех найденных устройствах в таблицах. После того, как в меню выбирается какой-нибудь компонент пакета (например, Рапира или Бейсик), загрузчик загружает все его части в память, а потом обновляет таблицы устройств. Это обновление состоит в определении числа дисководов (ИКП поддерживает до двух контроллеров НГМД по два дисковода на каждом) и инициализации некоторых плат (принтера, стыка С2). А после этого данные из таблиц используются для настройки загруженного компонента, потому что каждый компонент ИКП содержит свою собственную RWTS и DOS.

Так вот, прошивка полностью повторяет работу ИКП: она вначале определяет конфигурацию, а после загрузки ее обновляет. Более того, поскольку при обновлении таблиц делается опрос дисководов (а для этого нужна RWTS загрузчика ИКП), то считается, что RWTS загрузчика в память загружена и делаются ее вызовы.


Можно подвести некоторые итоги.

1. Протокол загрузки и прошивка позволяют загрузить операционку целиком. Загрузчик позволяет настраивать диспетчер памяти, адреса загрузки ничем не ограничены, количество пакетов тоже.
2. Прошивка сильно заточена под ИКП-90. Разработчики оставили, конечно, возможность грузить что-то другое, но даже в этом случае надо помнить, что данные о конфигурации машины лежат там, где их обычно держит загрузчик ИКП и конфигурация памяти такая же, как при загрузке ИКП.
3. Структура данных пакетов.

Заголовок
+---------+----------+--------------------------+
! № байта ! Значение ! Примечание               !
+---------+----------+--------------------------+
!       0 !      $81 ! Синхросимвол 1           !
!       1 !      $xx ! Синхросимвол 2, равен    !
!         !          ! адресу принимающей машины!
!       2 !      $96 !                          !
!     GAP !    любое ! От 0 до 1022 байт        !
!       3 !      $00 !                          !
!       4 !      $FF !                          !
!       5 !      $xx ! Номер трека              !
!       6 !      $xx ! Тип пакета (0, 1)        !
+---------+----------+--------------------------+

Пакет типа 0
+---------+----------+--------------------------+
! № байта ! Значение ! Примечание               !
+---------+----------+--------------------------+
!       0 !      $xx ! Страница диспетчера      !
!         !          ! памяти                   !
!       1 !      $xx ! Адрес загрузки пакета    !
!       2 !      $xx ! -"- старший байт         !
!   3-258 !      $yy ! 256 байт данных          !
+---------+----------+--------------------------+

Пакет типа 1
+---------+----------+--------------------------+
! № байта ! Значение ! Примечание               !
+---------+----------+--------------------------+
!       0 !      $xx ! Способ запуска и номер   !
!         !          ! дисковода (0, 1, 3)      !
!       1 !      $xx ! Неизвестно               !
!       2 !      $xx ! Неизвестно               !
!       3 !      $xx ! Страница диспетчера      !
!         !          ! памяти                   !
!       4 !      $xx ! Адрес загрузки пакета    !
!       5 !      $xx ! -"- старший байт         !
!   6-261 !      $yy ! 256 байт данных          !
+---------+----------+--------------------------+

Ну и теперь попытка оценить все это критически.

1. Вся загрузка ведется только в режиме приема. Это создает две проблемы. Во-первых, без участия человека машину загрузить нельзя. Пусть у нас есть учительская машина и машина ученика. Учительская машина не может узнать о том, что машина ученика ждет загрузки. Кто-то должен поглядеть на экран машины ученика и махнуть учителю рукой, чтобы он начал процесс загрузки на своей машине.

Было бы намного удобнее, если бы при включении машина ученика отправила по сети широковещательное сообщение "Я машина №XX. Жду загрузку". А машина учителя ответила бы ей "ОК. Начинаю загрузку" или "Ждите, занято" или "Ваш номер не зарегистрирован". Все могло бы грузиться само, без махания руками.

Вторая проблема - невозможность подтверждения приема пакетов. По сути, вся операционка должна загрузиться целиком и без ошибок. Если хоть один пакет придет с ошибкой, то весь процесс надо начинать сначала. А ведь можно было сделать возможность отправки квитанций о приеме пакета и повторной передачи пакета при ошибке.

2. Нет контрольных сумм в пакетах. Да, формально, есть бит четности в каждом байте. Проблема в том, что он работает с нечетным числом ошибок (при искажении 1, 3, 5 или 7 бит в байте). А если искажено 2, 4, 6 или 8 бит, то контроль четности всем доволен и ошибок не видит.

3. Нет нумерации пакетов. Конечно, порядок пакетов в такой сети поменяться не может. Но вполне возможна ситуация, когда учительская машина уже начала передачу данных, а машина ученика еще не готова. Тогда машина ученика начнет прием не с начала и выяснится это только в тот момент, когда данные или код из пропущенных пакетов реально понадобятся.

4. Решение управлять диспетчером памяти напрямую и передавать адреса загрузки в заголовках пакетов - это просто рай для хакера. Можно завесить машину, передав пакет в нулевую страницу или стек. Можно замусорить таблицы устройств. Можно напрямую поуправлять устройствами ввода-вывода, передав пакет по адресам $C000 - $C7FF. Никаких проверок нет. И это может произойти даже без злого умысла, просто из-за ошибок при передаче.

5. С проверками тут вообще очень плохо. Например, при запуске управление передается на адрес $6200, но при этом никакой проверки, что в этот адрес вообще что-то было загружено - нет.

6. Отдельный вопрос, можно ли совмещать процесс загрузки одной машины и работу по сети другой. Если одна машина принимает данные, которые содержат синхросимвол другой машины, то с большой вероятностью вторая машина может загрузить чужие данные.


В общем, есть ощущение, что работоспособности добились, а про удобство и надежность забыли. Впрочем, разработчиков было немного, а работы много: сделать плату, написать прошивку, сделать новый ИКП, включая переделку каждого компонента под работу с сетью. Сроки, видимо, поджимали. В статье написано, что ОС ЛС в 1990 году получила премию министерства радиопромышленности и серебряную медаль ВДНХ. Похоже, разработчики торопились к выставке, поэтому и "срезали углы", где это возможно.

2 Отредактировано Voldemar0 (05-12-2022 11:46)

Re: Прошивка сетевой платы НИИВК

> оказывается, сетевые платы были заточены под девятки.

Вряд ли, при необходимости, не было возможности запилить или перепилить под семёрку.
Там же сам набор процедур очень похож, разница в адресах входов.

> Это оказался код из загрузчика ИКП-90. Прямо байт в байт.

С багом в виде неинициализированной переменной, что иногда вылазит, если не найдена плата принтера ? :)

> Потом код обнаружения оборудования восстановит начальное распределение страниц и произойдет... переход в никуда. Перезагрузки не будет.

Бага или фича?

> Первый байт синхросимвола всегда равен $81, второй байт - это сетевой адрес платы.

Синхросимвол - это только последовательность байт (т.е. их передают стандартно) или есть какой-то секретик, как на флопиках?

Т.е. если у меня поле данных, например, встретится такая же последовательность, то как её отличить от синхросимвола ? Проверяются следующие байты, т.е. получается большая сигнатура ? ($81 XX <любые байты> 0x00 0xFF).
Но затем проверяется ещё несколько байт, так что совпадение уже почти невероятно.

> Явно тут какая-то хитрость с КР580ВВ51.

NMI или IRQ ?
флаг I у проца ?
обработчики по дефолту выставляются сисмоном, но не помню какие и что делают по умолчанию.
Вроде бы какой-то из них делает честный RTI, а другой содержит мусор.

> Контрольной суммы нет.

Epic fail :(
Дело даже не в стабильности работы канала связи, а в потенциальных багах софта.
Ведь проверка CRC могла бы сразу сказать, что ты наверняка правильно синтезировал пакет и затем его распарсил.
Что не пропустил какие-то байты или не добавил лишних.

> она вначале определяет конфигурацию, а после загрузки ее обновляет.

Тут не ясно: конфигурация машины же не изменилась?
Или он результаты первоначального определения просто копирует внутрь загруженных компонент ?

> Загрузчик позволяет настраивать диспетчер памяти, адреса загрузки ничем не ограничены, количество пакетов тоже.

Но получается, что для загрузчика используется что-то вроде собственного формата пакетов ?
Т.е. можно легко ожидать, что для работы уже в составе ОС (после загрузки ОС) формат будет другой.

---

Углы срезали, конечно, причем некоторые из них не срезать было бы легко. Хотя бы ту же CRC посчитать.

Но очень сложно оценить сейчас эту работу адекватно.

У нас сейчас есть стек IP, с кучей продуманных форматов-протоколов и случаев их использования.
А у кого-то есть ещё и IPX :)

А там вряд ли были пенсионеры с отличным знанием ARPANET. И всю разработку наверняка вела молодёжь, которая просто не могла предположить всех возможных вариантов поведения и использования сети.
Кроме того, разработчикам в те годы было легко допускать возможность переписать всё, что надо, включая прошивку ПЗУ, если захочется лучше и больше. Они понимали, что-то из-за встроенного во все операционки дравера флопика,  всё равно невозможно перетащить все системы на сеть, поэтому и могли узко ограничиться ИКП, в том числе какой-то конкретной версией. Софт на тот момент стоил меньше, чем железо.

==

Интересно, получается, что разработчики тут пошли по пути встраивания своего кода в существующий обычный дисковый ИКП.
Хотя исходники были и, наверное, можно было бы переработать сам ИКП под сетевую карту ?

У нас ведь так и нет серверного ПО всего этого дела ?
Т.е. какой софт был на учительской машине?
Кто формировал все эти пакеты?

3

Re: Прошивка сетевой платы НИИВК

Voldemar0 пишет:

Вряд ли, при необходимости, не было возможности запилить или перепилить под семёрку.
Там же сам набор процедур очень похож, разница в адресах входов.

Наверно да, но код пришлось бы перерабатывать. Вызов $FAA0 есть только в Мониторе девятки, управление памятью на семерке немного сложнее, а в ПЗУ свободного места почти нет.

Voldemar0 пишет:

С багом в виде неинициализированной переменной, что иногда вылазит, если не найдена плата принтера ? :)

Я помню, что где-то тут на форуме видел про эту багу, но найти не могу, и в чем там бага состоит уже не помню. Но тут код из ИКП-90, он слегка отличается. Может, ее в нем и пофиксили.

Voldemar0 пишет:

Бага или фича?

Скорее фича. Там нет никакого смысла этот кусок переписывать в память. Я понимаю, если бы там был самомодифицирующийся код или какая-то зависимость от адреса выполнения. Но ничего такого нет. Единственная остающаяся причина - это "сломать" процесс перезагрузки.

CODE_9A20
        LDX     NET_CARD_SLOT
        TXS     
        LDA     #$46
        STA     ZP_00
        STA     DATA_C081
        BIT     SUB_FFCB
        JMP     CODE_FAA0
Voldemar0 пишет:

Синхросимвол - это только последовательность байт (т.е. их передают стандартно) или есть какой-то секретик, как на флопиках?

Т.е. если у меня поле данных, например, встретится такая же последовательность, то как её отличить от синхросимвола ? Проверяются следующие байты, т.е. получается большая сигнатура ? ($81 XX <любые байты> 0x00 0xFF).
Но затем проверяется ещё несколько байт, так что совпадение уже почти невероятно.

Синхросимвол - это просто последовательность байт. Если она встретится в данных, то отличить ее нельзя. Но КР580ВВ51 генерирует SYNDET только в режиме поиска. После того, как синхросимвол найден, режим поиска выключается. Если после этого синхросимвол появится снова, то SYNDET генерироваться не будет. Можно отследить повторное появление синхросимвола через флаги в регистре статуса, но в прошивке это не делается.

Так что при нормальном определении начала пакета про синхросимвол можно забыть. Проблема может возникнуть, если передача уже идет и КР580ВВ51 "зацепится" за середину пакета данных.

Voldemar0 пишет:

NMI или IRQ ?

IRQ

Voldemar0 пишет:

флаг I у проца ?

Ой, блин! Прошляпил! Он установлен.

Voldemar0 пишет:

обработчики по дефолту выставляются сисмоном, но не помню какие и что делают по умолчанию.
Вроде бы какой-то из них делает честный RTI, а другой содержит мусор.

Обработчики по дефолту вообще недоступны, потому что после начала загрузки ПЗУ Монитора отключается.

Voldemar0 пишет:

Тут не ясно: конфигурация машины же не изменилась?
Или он результаты первоначального определения просто копирует внутрь загруженных компонент ?

Это вообще трудно объяснять, потому что одновременно делается много действий. У ИКП есть два цикла обхода плат.

Первый цикл делается после считывания начального загрузчика (или в начале загрузки из сети). В этом цикле в таблицах запоминаются идентификаторы устройств. Кроме того, в таблицу дисков записывается слот загрузочного диска. Если встречается модуль памяти или штатный контроллер памяти, то они инициализируются (карта памяти 0 1 2 3 X 5 6 7). X означает, что страница оставляется как есть.

Далее идет загрузка, а потом идет второй цикл. В нем определяется число дисководов (каждому посылаются команды включения и выключения) и таблица дисков перезаписывается. Видимо, в начале загрузки ИКП это делать боится. Также там проверяется наличие плат стыка С2 и принтера. Со стыком С2 делаются какие-то настройки. С принтером ничего не делается, но в паре ячеек запоминается слот, где он стоит. Вот этот второй цикл я и назвал обновлением конфигурации.

Voldemar0 пишет:

Но получается, что для загрузчика используется что-то вроде собственного формата пакетов ?
Т.е. можно легко ожидать, что для работы уже в составе ОС (после загрузки ОС) формат будет другой.

В прошивке есть куски кода, которые не относятся к загрузке и отвечают за передачу. Отличия там есть (хотя подсчета контрольных сумм я по прежнему не нашел). Но неизвестно, использует ли ОС эти куски кода. Реверсить надо весь ИКП.

Voldemar0 пишет:

Интересно, получается, что разработчики тут пошли по пути встраивания своего кода в существующий обычный дисковый ИКП.
Хотя исходники были и, наверное, можно было бы переработать сам ИКП под сетевую карту ?

Нет, ИКП они переделали. Отличия между ИКП-88 и ИКП-90 видно много где. Там и загрузчик отличается и компоненты пакета имеют другие размеры. Другое дело, что они не стали делать сетевой стек в современном понимании, а сделали что-то вроде сетевого "удлинителя" для дисковода.

Voldemar0 пишет:

У нас ведь так и нет серверного ПО всего этого дела ?
Т.е. какой софт был на учительской машине?
Кто формировал все эти пакеты?

Есть диск с ИКП-90 (он же ОС ЛС). Очень может быть, что он и есть серверное ПО. Но в эмуляторе это проверить трудно. Видно, что там есть меню с сетевыми функциями в Ассемблере. Есть стартовая прога на Бейсике, которая может определить наличие сетевой карты. Возможно, если бы в эмуляторе была сетевая плата, то могли бы активироваться какие-то еще части ИКП для работы с сетью.

4 Отредактировано Voldemar0 (06-12-2022 12:32)

Re: Прошивка сетевой платы НИИВК

> Возможно, если бы в эмуляторе была сетевая плата, то могли бы активироваться какие-то еще части ИКП для работы с сетью.

Вот тут интересно: например, если этот удлинитель дисковода существует внутри кода ИКП и грузится как его часть в ОЗУ (не из отдельного файла), то действительно ли его доступность для пользователя (с комстроки) зависит от наличия карты ?

Например, у ИКП-Бейсика вроде бы есть какое-то сообщение об ошибке в случае, если попытаться обратиться к несуществующему контроллеру флопика, что нибудь вроде "catalog,s3".
Но у dos33 + Basic60 такой блокировки нет. на команду вроде "catalog,s1" система подвиснет на некоторое время, а потом выдаст "I/O ERROR", т.е. она будет пытаться гнать команды контроллеру на регион $c09x.

> Возможно, если бы в эмуляторе была сетевая плата, то могли бы активироваться какие-то еще части ИКП для работы с сетью.

Ты же можешь остановить эмулятор после опроса оборудования и подправить в памяти таблицу результатов опроса, как будто сетевуха найдена ?


PS Когда надоест копаться в этой теме, оставь на форуме список адресов с описаниями того, что удалось найти. Чтобы потом проще было вернуться к этой работе. Мне бы хотелось всё таки докопаться до всего, что касается темы сетевух. В идеале поддержать их в своём эмуляторе и сделать транспорт на базе IP-протокола.

5

Re: Прошивка сетевой платы НИИВК

PS Можно попробовать нечто такое: если ты укажешь какие нибудь конкретные контрольные точки, я могу попробовать на реальном железе посмотреть, доходит ли проц до них и что там происходит (какое- нибудь ветвление или значения переменных) на реальном железе с сетевухой.

6

Re: Прошивка сетевой платы НИИВК

В поисках серверного кода досмотрел с пристрастием диск ИКП-90. Получилось смешно.

Для начала решил найти какой-нибудь файл типа B. Но на диске оказалась какая-то сборная солянка - редакторы, игры, обучалки, психологические тесты. И при этом ни одного файла с документацией. Не похоже на комплектацию обычного ИКП. Зато там лежат какие-то левые файлы с именами IRINA, И, 1, 0, Ж, и в каталоге куча стертых файлов. Похоже, на диске хранили какие-то свои данные и не факт, что его содержимое соответствует штатной комплектации.

Ладно, раз отдельным файлом серверная часть не лежит, значит надо искать в компонентах ИКП. Тем более, что грузить какой-то бинарник вручную для запуска сервера было бы очень неудачным решением. А если его кто-то случайно сотрет?

Логичнее было бы сделать серверную часть отдельным компонентом. А дальше либо нарисовать для нее в меню ИКП еще одну дискету с надписью "сервер", либо вообще загружать ее автоматом. На всякий случай я дизассемблировал меню ИКП-90. Вдруг там есть проверка наличия сетевухи? Или возможность нажать какую-то хитрую комбинацию клавиш, чтобы загрузить сервер? Нет, нифига. Самое обычное меню и никаких скрытых проверок.

Тогда я полез в статью в "Информатике и образовании" и стал ее читать внимательно. И первое, что мне попалось - это сокращение СПК. Он же Сетевой Программный Комплекс. В статье написано, что он должен быть загружен, чтобы машина стала "главной" и могла обеспечивать загрузку и взаимодействие других машин по сети. Более того, в статье есть "скриншот" этого самого СПК.

Посмотрел я на скриншот и полез искать сигнатуру "ОС ЛС". Раз она выводится на экран, значит, где-то такая строка должна быть. Сделал поиск EF F3 A0 EC F3 по образу ikp90.dsk. Вернулся невод с одной тиной морскою. В смысле, не нашлось.

Тут я стал подозревать, что наверно был отдельный диск с этим самым СПК, а то, что есть на диске ИКП-90 - это, так сказать, клиентская ОС. Но почему-то мне казалось, что эти буквы я уже где-то видел. Загрузил в очередной раз ИКП-90, посмотрел на заставку... Так вот же они, эти буквы, рядом с Ассемблером написаны! Я их видел уже раз сто :)

На всякий случай сравнил таблицы загрузки ассемблера из ИКП-88. Там он занимает 82 сектора. А здесь - целых 155. И как раз в ассемблере по нажатию РЕД вместо обычного меню появляется меню в котором есть пункт "Работа по сети". Вот она, серверная часть. Встроена в ассемблер. Вот только меню в эмуляторе виснет.

Я попробовал убедить СПК, что сетевая карта у него есть. Во время показа меню ввел в ячейку $9A06 значение $04, а в ячейку $9A0C значение $01. Это соответствует сетевой карте в слоте 3. Потом загрузил ассемблер. Меню больше не виснет, можно походить по его пунктам. Но при выборе пункта "Работа по сети" все падает по BRK. А при выборе пункта "Работа по СТЫК 2" выводится надпись "Не исполняется в данной версии".

В общем, стоит это проверить на реальной машине с сетевухой.

Post's attachments

OSLS.png, 192.6 kb, 408 x 300
OSLS.png 192.6 kb, 54 downloads since 2022-12-07 

SPK.png, 5.07 kb, 648 x 144
SPK.png 5.07 kb, 57 downloads since 2022-12-07 

7

Re: Прошивка сетевой платы НИИВК

> целых 155. И как раз в ассемблере по нажатию РЕД вместо обычного меню появляется меню в котором есть пункт "Работа по сети".

Вот это хорошее наблюдение!

Я тоже эти буквы СПК встречал, но как-то не придавал им значения.
Хотя что-то такое краем глаза отмечал, необычное.
Пожалуй, надо поискать и картинку эту тоже по разным дискам.
И потом ещё по сигнатурам этих дополнительных блоков.

8 Отредактировано Voldemar0 (08-12-2022 20:47)

Re: Прошивка сетевой платы НИИВК

Ковырнул самую малость.
Взял для образца строку "итес оп атоба" и сходу нашел её в следующих местах:
- ИКП-90
- ИКП-88б - у неё картинка та же что и ИКП-88а (это обычная версия), но как раз ассемблер там с сетью.
- ИКП-90 КЕРМИТ 95
- ИКП-90 NE
А также на BTK и TheBEST встречался файл SYS.Ассемблер, если его размер 106-108 блоков - это тоже он.
Этих файлов у меня лежит 8 разных :)
Возможно, там мелкие отличия, но надо будет копать.

Некоторые варианты на попытку зайти в "работа по сети" валятся в BRK, другие пишут "не исполняется в данной версии", третьи выводят каталог флопика :)


>  $9A06 значение $04, а в ячейку $9A0C значение $01

Не прокатило.
Во время показа меню ассемблера или меню выбора загрузки ИКП ?

> Вот только меню в эмуляторе виснет

У меня в эмуле в разных версиях ИКП или пишет "не реализовано в текущей версии" или валится в BRK.

Если валится в BRK, то из этой процедуры:

1FB3 -   20 2A 1E   "..."   JSR   1E2A          вероятно, построение рамки внизу экрана
1FB6 -   0A .. ..   "."     ASL   A
1FB7 -   1A .. ..   "."     NOP              <==
1FB8 -   1B 1D 20   "..."   SLO   201D, Y
1FBB -   46 19 ..   "f."    LSR   19
1FBD -   A5 C0 ..   "%@"    LDA   C0                возврат из процедуры сюда (выше - аргументы вызова)
1FBF -   20 65 ED   ".еМ"   JSR   ED65        а вот тут по адресам EDxx встречают чистые нули , но фактически- это не инициализированная память
1FC2 -   A9 00 ..   ")."    LDA   #00
1FC4 -   85 C0 ..   ".@"    STA   C0
1FC6 -   60 .. ..   "ю"     RTS   

9

Re: Прошивка сетевой платы НИИВК

Voldemar0 пишет:

А также на BTK и TheBEST встречался файл SYS.Ассемблер, если его размер 106-108 блоков - это тоже он.
Этих файлов у меня лежит 8 разных :)

Вот фиг его знает. Непонятно, как сравнивать. ИКП загружает пакеты не файлами, а блоками. Самый большой блок в СПК - 72 сектора.

Voldemar0 пишет:

Некоторые варианты на попытку зайти в "работа по сети" валятся в BRK, другие пишут "не исполняется в данной версии", третьи выводят каталог флопика :)

Стоп. То есть с реальной сетевухой ни одна версия при выборе пункта "Работа по сети" не показала картинку, похожую на скриншот из статьи? Печалька. Или это все в эмуляторе было?

То, что некоторые версии пишут "не исполняется в данной версии" наводит на мысль, что было две основных версии ОС ЛС: одна работающая с сетевой платой, а вторая с платой стыка С2.

Voldemar0 пишет:

Не прокатило.
Во время показа меню ассемблера или меню выбора загрузки ИКП ?

Патчить надо когда появится меню выбора загрузки ИКП.

Voldemar0 пишет:

У меня в эмуле в разных версиях ИКП или пишет "не реализовано в текущей версии" или валится в BRK.

Вот это непонятно. Я брал архив отсюда http://agatcomp.ru/agat/Software/Other/IKP90/Ikp90.rar, запускал в виндовом эмуляторе. После загрузки ассемблера появляется редактор со строкой 1. Если в этот момент нажать РЕД, появляется меню, все зависает и больше на клавиатуру не реагирует. Если пропатчить, то меню работает.

Какая-то разница между эмуляторами?

Voldemar0 пишет:

Если валится в BRK, то из этой процедуры:

Нет, у меня падает по адресу $BE92. И в этом месте в памяти нули, так что там честный BRK.

***

Кстати, на диске ИКП-90 есть еще один косяк. Там виснет Рапира. Я сначала думал, что ей сетевая плата нужна, но нет, патч на нее не действует. Виснет точно также. Так что есть подозрение, что диск немного побит.

И, как мне кажется, повреждений в файловой системе на дисках с ИКП-90 должно быть больше, чем на других дисках. Если там прокидываются операции записи на диск с десятка других машин, то вероятность, что в процессе что-то сглючит явно выше.

10 Отредактировано avivanov76 (09-12-2022 02:27)

Re: Прошивка сетевой платы НИИВК

avivanov76 пишет:
Voldemar0 пишет:

У меня в эмуле в разных версиях ИКП или пишет "не реализовано в текущей версии" или валится в BRK.

Вот это непонятно.

Ха. Оказывается, в эмуляторе СПК зависает не от отсутствия сетевой платы, а из-за наличия второго контроллера дисковода (140К). Подозреваю, что это как-то связано с ограничением ИКП на количество дисководов. Ограничение равно 4 (к двум контроллерам можно подключить до 4 дисководов), и два контроллера занимают все свободные ячейки в таблице дисков.

Видимо, в СПК какая-то кривая проверка и он принимает второй контроллер дисковода за сетевую плату.

С одним контроллером ничего не виснет.

11

Re: Прошивка сетевой платы НИИВК

> Непонятно, как сравнивать. ИКП загружает пакеты не файлами, а блоками.

Если ты спрашиваешь, как я буду делать, то так: сперва сравнение пофайловое (есть у меня программка мультисравнения: сразу несколько FIL-файлов может сравнить) и при этом понять, нет ли битых блоков, не являются ли сборки перекомпиляциями (т.е. когда код в сторону уехал) и такое прочее.
Если на этом этапе не всё станет ясно, то грузим в эмулятор, например, до появления экрана редактора и мигающего курсора и потом скидываем дамп физической памяти (это дамп с плоской моделью памяти, все 128 кб). И потом уже дампы можно сравнивать.


> После загрузки ассемблера появляется редактор со строкой 1. Если в этот момент нажать РЕД, появляется меню, все зависает и больше на клавиатуру не реагирует.

Хм... Надо бы изучить этот момент. У меня в этом меню всегда нормально бегал курсор, дисковые операции выполнялись. Вываливание в brk происходит после выбора пункта "обмен по сети" и нажатия Ввод. Рисуется внизу рамка и внутри неё как раз BRK.

Пока в юниховом эмуле пробую. Надо сперва примерно понять, что потом на реале проверять. Потренироваться на кошках.
Можно ещё в досовском попробовать.
На выходных попробую в виндовом эмуле.

> Какая-то разница между эмуляторами?

Дофигища разниц может быть.
Начиная от отклика ячеек с неопределёнными значениями (когда устройство отсутствует).
В моём эмуле уже есть известная ошибка на эту тему, но пока исправлять было лень.
Впрочем, может быть, сейчас как раз удачный момент.

> Кстати, на диске ИКП-90 есть еще один косяк. Там виснет Рапира. Я сначала думал, что ей сетевая плата нужна, но нет, патч на нее не действует. Виснет точно также. Так что есть подозрение, что диск немного побит.

У меня были пометки о том, что в этих ИКП88b и выше были баги.
Но и вариантов образов, отличающихся в загрузочных частях, довольно много.

> И, как мне кажется, повреждений в файловой системе на дисках с ИКП-90 должно быть больше, чем на других дисках.

Вот в той солянке, которую ты смотрел, там вообще какой-то мусор файловый, как мне помнится.
Но были и другие сборки. Была сборка с пометкой на морде "LS" вроде - типа локальная сеть.
И была LS Кермит. Там файлов поменьше и всё поаккуратнее.
Но между ними в загрузочных частях есть какая-то разница, то ли только в заставках, а то ли ещё где-то.

Я вроде когда-то писал прогу, которая потрошила списки загрузки разных частей ИКП, вот только не уверен, что она была переносимой между разными сборками. Я ей подробно разбирал каноничный ИКП и составлял карты загрузки.
Если бы иметь эти карты для разных дисков, можно было бы понять, что конкретно в них меняли.
Где только картинку в меню, где ещё что-то.

{ Я не храню образы в сборе с файлами, чтобы хотя бы различия в файлах не мешали таким исследованиям. Файлы отдельно лежат, там вопросов гораздо меньше. }

> Видимо, в СПК какая-то кривая проверка и он принимает второй контроллер дисковода за сетевую плату.

Тоже попробую у себя.

12 Отредактировано Voldemar0 (09-12-2022 18:13)

Re: Прошивка сетевой платы НИИВК

Зацепил к эмулятору своему два флопика, 140 и 840,
во время показа начальной заставки цифры такие:

9A00-  20 6C 36 00 01 0B 00 00  02 02 00 01 00 00 02 01

меняю:

9A00-  20 6C 36 00 01 0B 04 00  02 02 00 01 01 00 02 01

значения в памяти коммутатора банков ОЗУ:

0 1 E F A D 6 7 0 0 0 0 0 0 0 0

Загружается ассемблер, выбираю "работа по сети",
эмуль недоволен тем , что управление отправилось куда-то не туда:

B296-  2A .. ..    "."      ROL   A
B297-  50 01 ..    "p."     BVC   B29A
B29A-  2A .. ..    "."      ROL   A
B29B-  69 02 ..    "и."     ADC   #02
B29D-  8D 07 B0    "..0"    STA   B007
B2A0-  20 FD B2    ".Щ2"    JSR   B2FD
B2FD-  AD 40 C1    "-`A"    LDA   C140
B300-  8D 0A B3    "..3"    STA   B30A
B303-  20 4C C3    ".lC"    JSR   C34C
C34C-  C3 C3 ..    "CC"     DCP   (C3, X)      Тут сейчас нет устройств !
C34C-  C3 C3 ..    "CC"     DCP   (C3, X)         <==

Очень похоже на переход из RWTS в ПЗУ сетевухи.
Любопытно только, почему на третий слот ?

Если память не менять, то вместо

B303 -   20 4C C3   ".lC"   JSR   C34C

будет

B303 -   8D 4A C1   ".jA"   STA   C14A

В оригинале ИКП (без сети) тут всё относительно понятно:

B2FD -   8D 4A C1   ".jA"   STA   C14A    - это стандартный вход в RWTS Школьницы 
Изначально на семёрке тут была команда  sta $c050 - выключение таймера
А с адреса B300 начинался код драйвера.

B300 -   20 08 92   "..."   JSR   9208    - тут какой-то предварительный кусок драйвера
B303 -   8D 4C C1   ".lA"   STA   C14C
B306 -   60 .. ..   "ю"     RTS   

B307 -   A0 04 ..   " ."    LDY   #04  - а это всё напоминает остатки, возможно использующиеся, драйвера 140ки
B309 -   8C 66 B4   ".ф4"   STY   B466
B30C -   AE 00 B0   "..0"   LDX   B000
B30F -   BD 8E C0   "=.@"   LDA   C08E, X
B312 -   BD 8C C0   "=.@"   LDA   C08C, X
B315 -   A0 08 ..   " ."    LDY   #08
B317 -   BD 8C C0   "=.@"   LDA   C08C, X

Но в ИКП с сетью тут всё по другому:

B2FD -   AD 40 C1   "-`A"   LDA   C140
B300 -   8D 0A B3   "..3"   STA   B30A
B303 -   8D 4A C1   ".jA"   STA   C14A
B306 -   20 08 92   "..."   JSR   9208
B309 -   8D 4C C1   ".lA"   STA   C14C
B30C -   60 .. ..   "ю"     RTS   

B30D -   00 .. ..   "."     BRK   

B30E -   B0 BD ..   "0="    BCS   B2CD             Тут отчётливо видны обломки 140кб части. Возможно, 140ка тут совсем отключена
B310 -   8E C0 BD   ".@="   STX   BDC0
B313 -   8C C0 A0   ".@ "   STY   A0C0
B316 -   08 .. ..   "."     PHP   
B317 -   BD 8C C0   "=.@"   LDA   C08C, X

У тебя есть какая нибудь информация по куску Cx4C ?

Странно, что эта подстановка с JSR C34C происходит в любом случае, независимо от того, выбираю ли "работа по сети" или "работа с ГМД".

13 Отредактировано Voldemar0 (09-12-2022 18:24)

Re: Прошивка сетевой платы НИИВК

И вот ещё интересная процедура.
Так она выглядит в нормальном ИКП:

9BAD -   A9 10 ..   ")."    LDA   #10
9BAF -   85 A6 ..   ".&"    STA   A6
9BB1 -   20 AE 1A   "..."   JSR   1AAE
9BB4 -   AD 00 9A   "-.."   LDA   9A00
9BB7 -   8D 5D C1   ".}A"   STA   C15D
9BBA -   0A .. ..   "."     ASL   A
9BBB -   0A .. ..   "."     ASL   A
9BBC -   8D F0 BE   ".П>"   STA   BEF0
9BBF -   4C 46 19   "lf."   JMP   1946

А так в сетевом:

9BF5 -   A5 50 ..   "%p"    LDA   50
9BF7 -   F0 0D ..   "П."    BEQ   9C06
9BF9 -   8D 05 B3   "..3"   STA   B305
9BFC -   A9 4C ..   ")l"    LDA   #4C
9BFE -   8D 04 B3   "..3"   STA   B304
9C01 -   A9 20 ..   ")."    LDA   #20
9C03 -   8D 03 B3   "..3"   STA   B303
9C06 -   AD 00 9A   "-.."   LDA   9A00
9C09 -   8D 5D C1   ".}A"   STA   C15D
9C0C -   0A .. ..   "."     ASL   A
9C0D -   0A .. ..   "."     ASL   A
9C0E -   8D F0 BE   ".П>"   STA   BEF0
9C11 -   A9 00 ..   ")."    LDA   #00
9C13 -   8D B2 03   ".2."   STA   03B2
9C16 -   60 .. ..   "ю"     RTS   

Похоже на кусок кода процедуры определения оборудования.
Но в сетевом ИКП она как раз патчит RWTS и встраивает туда сетевой хук.

Судя по сдвигу адресов - этот кусок явно перекомпилировали.
Соседние процедуры очень похожи между версиями ИКП.

Меню из журнала пока не увидел :(((

Даже если прохожу на руках три запроса к патченному RWTS, всё равно слетаю на том же BRK по адресу ED65.

У тебя на этом диске есть файл KERMIT ?

14 Отредактировано Voldemar0 (09-12-2022 19:11)

Re: Прошивка сетевой платы НИИВК

И вот это тоже не понял:

> На всякий случай сравнил таблицы загрузки ассемблера из ИКП-88. Там он занимает 82 сектора. А здесь - целых 155.

Я сравниваю размеры загрузочных областей ИКП-88 и 90, но они оба оканчиваются на треке 29.
Т.е. вроде как размеры совпадают. Только на треке 12 у 88 есть пустые сектора, а на 90 они вроде как заняты. Но там не 60 секторов, а около 10.

Вот мои карты загрузки ИКП-88:

        Cnt     MemC1xx DestH   ASecL   Рапира
r       04      00      18      10
r       03      2c      40      14
r       20      3d      5f      17
r       10      33      80      37
r       20      27      40      47
r       10      26      40      67
r       17      2b      40      77
r       20      29      40      8e
r       10      28      40      ae
r       02      22      1c      be
00      9d1f
                                        ДОК
d       04      00      18      10
d       0f      3d      70      28
d       12      2c      5e      c8
d       08      22      20      c0
d       03      68      1c      da
d       22      79      d0      dd
00      9d25
                                        Copy
c       05      11      28      243
c       0d      22      03      248
c       05      00      1a      255
c       0a      00      10      25a
00      9d2e
                                        Basic
b       03      00      04      11f
b       08      00      08      117
b       08      79      e0      122
b       10      18      30      12b
b       10      00      20      13f
b       10      16      30      153
b       10      77      20      17a
b       20      11      e0      18a
b       01      00      18      12a
00      9d3f
                                        AppleSoft       >> память эмулятора (0 1 2 3 4 5 6 7 0 0 0 0 0 0 8 9    LC: 1):
#a      10      26      50      1aa     20/ 6..21/ 0  -> 6/1000         -> d000..df00
#a      30      24      d0      1aa     20/ 6..22/11  -> 6/0000,7/0000  -> c000..cf00, e000..ffff
#a      23      35      5d      1da     22/12..24/ 4  -> 4/1d00,5/0000  -> 9d00..bfff
a       10      26      50      1aa
a       30      24      d0      1aa
a       23      35      5d      1da
00      9d4f
                                        Menu
m       20      2e      40      1fd
m       20      3f      60      21d
m       05      11      28      23d
00      2800
r       04      00      18      10      00/10..00/13
r       03      2c      40      14      00/14..01/01
r       20      3d      5f      17      01/02..02/0C
r       10      33      80      37      02/0D..03/07
r       20      27      40      47      03/08..04/12
r       10      26      40      67      04/13..05/0D
r       17      2b      40      77      05/0E..06/0F
r       20      29      40      8e      06/10..08/05
r       10      28      40      ae      08/06..09/00
r       02      22      1c      be      09/01..09/02
d       04      00      18      10      00/10..00/13
d       0f      3d      70      28      01/13..02/0C
d       12      2c      5e      c8      09/0B..0A/07
d       08      22      20      c0      09/03..09/0A
d       03      68      1c      da      0A/08..0A/0A
d       22      79      d0      dd      0A/0B..0C/02
c       05      11      28      243     1B/0C..1B/10
c       0d      22      03      248     1B/11..1C/08
c       05      00      1a      255     1C/09..1C/0D
c       0a      00      10      25a     1C/0E..1D/02
b       03      00      04      11f     0D/0E..0D/10
b       08      00      08      117     0D/06..0D/0D
b       08      79      e0      122     0D/11..0E/03
b       10      18      30      12b     0E/05..0E/14
b       10      00      20      13f     0F/04..0F/13
b       10      16      30      153     10/03..10/12
b       10      77      20      17a     12/00..12/0F
b       20      11      e0      18a     12/10..14/05
b       01      00      18      12a     0E/04..0E/04
a       10      26      50      1aa     14/06..15/00
a       30      24      d0      1aa     14/06..16/0B
a       23      35      5d      1da     16/0C..18/04
m       20      2e      40      1fd     18/05..19/0F
m       20      3f      60      21d     19/10..1B/05
m       05      11      28      23d     1B/06..1B/0A

    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
 0                                                 rd rd rd rd r   0
 1 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd rd  1
 2 rd rd rd rd rd rd rd rd rd rd rd rd rd r  r  r  r  r  r  r  r   2
 3 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   3
 4 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   4
 5 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   5
 6 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   6
 7 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   7
 8 r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   8
 9 r  r  r  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d   9
10 d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  10
11 d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  d  11
12 d  d  d                                                        12
13                   b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  13
14 b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  14
15             b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b     15
16          b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b        16
17                                                                17
18 b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  18
19 b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  19
20 b  b  b  b  b  b  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 20
21 aa a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  21
22 a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  22
23 a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a  23
24 a  a  a  a  a  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  24
25 m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  25
26 m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  m  26
27 m  m  m  m  m  m  m  m  m  m  m     c  c  c  c  c  c  c  c  c  27
28 c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  c  28
29 c  c  c                                                        29
    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 

15

Re: Прошивка сетевой платы НИИВК

Voldemar0 пишет:

Очень похоже на переход из RWTS в ПЗУ сетевухи.
Любопытно только, почему на третий слот ?

Да, это переход в ПЗУ сетевухи и есть. Третий слот, потому что в таблицах оборудования сетевуха значится в третьем слоте. Если записать $04 и $01 в другие адреса, то будет в другом слоте.

Voldemar0 пишет:

У тебя есть какая нибудь информация по куску Cx4C ?

Назову эту точку INIT_FROM_OS :) Этот кусок читает порядковый номер слота + 1 из $B001, проверяет по таблицам оборудования, что он дисковод типа 4 :) Если проверка успешна, то он убирает со стека два байта (адрес возврата), выключает ПЗУ Монитора и устанавливает обработчик прерывания. Обработчик прерывания находится в ПЗУ сетевой платы.

Потом, если я правильно понял, этот код посылает какой-то короткий пакет, пишет на экране "Занято" и сетевой адрес платы.

Дальше по адресам $0 и $1 формируется адрес для косвенного перехода. Причем, адрес зависит от того номера диска, который был присвоен сетевой плате во время определения оборудования. В норме он должен быть равен 0. Если номер диска 0 или 1, то адрес будет $B309. Если номер диска окажется равен 2, то переход будет на адрес $B303. Думаю, что тогда все зациклится.

А дальше делается косвенный JMP ($00).

Voldemar0 пишет:

Странно, что эта подстановка с JSR C34C происходит в любом случае, независимо от того, выбираю ли "работа по сети" или "работа с ГМД".

Подстановка делается при старте Ассемблера.

Voldemar0 пишет:

И вот ещё интересная процедура.

Похоже на кусок кода процедуры определения оборудования.
Но в сетевом ИКП она как раз патчит RWTS и встраивает туда сетевой хук.

Адрес $50 - это слот в котором стоит сетевая плата ($C1 - $C6). А процедуру $9BF5 вызывает "стартёр" ассемблера. В ИКП для каждого компонента есть такие "стартёры", которые запускаются после загрузки всех блоков.

Voldemar0 пишет:

У тебя на этом диске есть файл KERMIT ?

Нет.

Voldemar0 пишет:

И вот это тоже не понял:

> На всякий случай сравнил таблицы загрузки ассемблера из ИКП-88. Там он занимает 82 сектора. А здесь - целых 155.

Ой, блин. Я переврал. Я посчитал размер вместе со старшими битами номера сектора. Там 91 сектор.

        Cnt     MemC1xx DestH   ASecL   Рапира (совпадает)
r       04      00      18      10
r       03      2c      40      14
r       20      3d      5f      17
r       10      33      80      37
r       20      27      40      47
r       10      26      40      67
r       17      2b      40      77
r       20      29      40      8e
r       10      28      40      ae
r       02      22      1c      be
00      9d70
                                        ДОК
d       0f      3d      70      28
d       16      2c      40      c8
d       08      22      08      c0
d       08      68      18     105
d       26      79      d0      df
00      9d76
                                        Copy (совпадает)
c       05      11      28      243
c       0d      22      03      248
c       05      00      1a      255
c       0a      00      10      25a
00      9d87
                                        Basic (совпадает)
b       03      00      04      11f
b       08      00      08      117
b       08      79      e0      122
b       10      18      30      12b
b       10      00      20      13f
b       10      16      30      153
b       10      77      20      17a
b       20      11      e0      18a
b       01      00      18      12a
00      9d9e
                                        AppleSoft (совпадает)
a       10      26      50      1aa
a       30      24      d0      1aa
a       23      35      5d      1da
00      9dae
                                        Menu (совпадает)
m       20      2e      40      1fd
m       20      3f      60      21d
m       05      11      28      23d
00      2800

16 Отредактировано avivanov76 (10-12-2022 00:37)

Re: Прошивка сетевой платы НИИВК

Нда. Нашел я куски текста из журнала. Трек 144, сектора 0-2. Текст реверсирован. К сожалению, сектора помечены как свободные.

То есть, сервер - это действительно был отдельный файл, который как-то хитро запускался. И его таки стёрли :(

Сигнатура 6E 6F 62 61.

17 Отредактировано Voldemar0 (10-12-2022 05:18)

Re: Прошивка сетевой платы НИИВК

Я че то не понял: так ты видел эту журнальную картинку в эмуляторе ?

> Но при выборе пункта "Работа по сети" все падает по BRK. А при выборе пункта "Работа по СТЫК 2" выводится надпись "Не исполняется в данной версии".

Мы всё таки пришли к одной ситуации ?

--

У меня файлы kermit есть, но только: во первых - их несколько сильно различных вариантов,
а кроме того, я не понимаю, как и когда они загружаются?
Т.е. вроде как команда [EXEC KERMIT в коде есть, но я не вижу какого либо обращения к ней.
Кроме того, есть и исходников немало, включая вполне комментированные (хотя и не без странностей) исходники ROM. Но они тоже разные.

Внутри этих файлов есть фразы похожие на журнальную картинку.
Но я не догоняю, при чем тут кермит? Похож ли формат пакетов, которые ты ковырял, на реальный протокол кермит?

18

Re: Прошивка сетевой платы НИИВК

Voldemar0 пишет:

Я че то не понял: так ты видел эту журнальную картинку в эмуляторе ?

Нет, я не видел картинки в эмуляторе и не мог ее видеть. Объясняю, чего я делал:
1) сначала я глазами просмотрел в DOS33 все сектора ассемблера (ДОК), которые есть в таблицах загрузки ИКП. Я искал строки, похожие на текст из журнала, но ничего похожего не нашел.
2) тогда я просто поиском по образу диска нашел одну из строк. Взял смещение, вычислил к какому сектору оно относится и просмотрел образ второй раз - в DOS33.
3) секторы с текстом оказались не в области загрузки, а там, где лежат обычные файлы. Эти секторы оказались помечены как свободные. Кроме текста в секторах, был и код, то есть, это была часть исполняемого файла.

Я считаю, что на скриншоте из журнала показана серверная часть. Отсюда я делаю выводы:
1) серверная часть не грузилась загрузчиком ИКП при старте, так как нужных строк в ДОК нет.
2) серверная часть была отдельным файлом, так как сектора от этого файла нашлись в конце диска. И это был именно отдельный файл, потому что загрузчик ИКП не может достать до 144 трека. Он использует линейные номера секторов от 0 до 1023, то есть, дальше 48 трека он ничего загрузить не может.
3) что это был за файл, как он назывался - неизвестно. От него даже TSL нет. Я думаю, что он был просто удален, а большинство его секторов были заняты чем-то другим.
4) как этот файл грузился - тоже непонятно. Команду [EXECKERMIT я видел, но есть ли обращение к ней - не знаю. Для этого весь ДОК надо дизассемблировать. Но вполне может быть, что команда меню "Работа по сети" просто выполняла какую-то похожую команду и загружала таким способом серверную часть.

Voldemar0 пишет:

Но я не догоняю, при чем тут кермит? Похож ли формат пакетов, которые ты ковырял, на реальный протокол кермит?

Не надо все сваливать в одну кучу. Кермит - это один протокол, сеть ИКП-90 - это совсем другой протокол.

Кермит заточен под RS232 (а плата Стык С2 - это и есть RS232), это штука, которая ближе к какому-нибудь ZMODEM. Он не рассчитан на удаленную загрузку машин, это в основном протокол обмена файлами. У него важное отличие: он может работать по линиям связи, которые не пропускают весь набор значений байтов. В Кермит байты, содержащие числа от 0 до 31, являются специальными и не должны встречаться в данных.

Сеть ИКП-90 заточена под сетевую плату, там есть удаленная загрузка, есть прокидывание дисковых операций, вроде бы есть какие-то средства передачи сообщений из пользовательских программ. А вот передачи файлов там, судя по всему, нет. Кроме того, протокол сетевой платы (та часть, которую я видел) считает, что можно передавать любые значения байтов.

Так что это разные протоколы. Кроме того:
1) здесь http://agatcomp.ru/agat/Software/Other/IKP90.shtml написано, что было два вида заставок: со словами "Кермит 65" и без.
2) есть две команды "Работа по сети" и "Работа по СТЫК 2". Одна из команд сразу говорит, что в данной версии не выполняется.

Из этого я делаю вывод, что было две версии диска. В одной предполагалась работа с платой Стыка С2 по протоколу Kermit, а в другой - предполагалась работа с сетевой платой ее собственному протоколу.

Однако нельзя исключать фактор лени. Возможно, серверная часть в обеих версиях называлась KERMIT, потому что разработчикам было лень исправлять название файла и команду его загрузки.

Voldemar0 пишет:

У меня файлы kermit есть, но только: во первых - их несколько сильно различных вариантов,
а кроме того, я не понимаю, как и когда они загружаются?

Можно хоть один посмотреть?

Voldemar0 пишет:

> Но при выборе пункта "Работа по сети" все падает по BRK. А при выборе пункта "Работа по СТЫК 2" выводится надпись "Не исполняется в данной версии".

Мы всё таки пришли к одной ситуации ?

Не совсем. У меня эмулятор не виснет на сетевом меню только если я оставляю один контроллер дисковода. И падает все по адресу $BE92, а не $ED65.

Похоже, есть какая-то разница в эмуляторах. Либо в начальном состоянии памяти (виндовый эмулятор заполняет все шаблоном 00 00 00 00 FF FF FF FF). Либо в выполнении недокументированных инструкций.

19 Отредактировано Voldemar0 (10-12-2022 16:44)

Re: Прошивка сетевой платы НИИВК

https://drive.google.com/file/d/1csC5rQ … sp=sharing
По этой ссылке архив, там все версии и файлы, которые связаны с темой.
(google drive почему-то не понимает, что это - файл rar'а... Но это таки rar)

ROMs/ - реальные прошивки разных сетевух.

Обращаю внимание, что для ИКП-90 kermit есть только в виде удалённого файла ("r" в конце имени). Не знаю, насколько он живой.

--

> Команду [EXECKERMIT я видел, но есть ли обращение к ней - не знаю. Для этого весь ДОК надо дизассемблировать.

Обращение к ней есть, например, байт за 15 до самой строки :)
Проблема в том, что проц туда не заходит.

--

На недокументированных инструкциях у меня эмулятор останавливается и ждёт разрешения с ними работать. Как правило, такие инструкции не встречаются в обычных прогах. Я всего пару случаев всего знаю, где эти команды - не результат битого кода.

Память инициализируется нулями, если только только явно не заполнить её чем-то другим.

Но, например, у меня эмуляция дисководов сделана так, чтобы обеспечить максимальную скорость работы с ними, поэтому программа Скорость работать не может нормально.

--

Кстати, про 144 трек: я поглядел его, там интересный кусок кода.
Интересен тем, что там строки о сети, есть даже что-то вроде откликов автотеста сетевых плат.
Но сигнатурный поиск не нашел этого в остальной коллекции. Так что, вероятно,
этот файл для нас пока недоступен :((

Версия ПЗУ 9.C
** Внимание! Работа в сети **
Тест модуля сети
Тип абонента Агат9

20

Re: Прошивка сетевой платы НИИВК

А вот и серверная часть нашлась :)

Главное меню

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1211&amp;download=1

Меню загрузки

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1212&amp;download=1

Настройки ("Изменить состояние")

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1213&amp;download=1

Тест модуля сети

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1214&amp;download=1

Режим прогона

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1215&amp;download=1

Ну, кто молодец? Я молодец :) Правда, сразу предупреждаю, что большинство пунктов меню обращаются к ПЗУ сетевой платы, которой в эмуляторе нет, и это ведет к зависанию или падению. Пункты "Тест модуля сети", "Проверка по ТУ", "Режим прогона" тоже не работают. Для их запуска нужны дополнительные файлы, названия которых я пока не выяснял. Но мне кажется, они в коллекции есть.

Теперь обо всем по порядку.

Раскопки

Имя загадочного файла с серверной частью нашлось довольно быстро: при просмотре секторов я нашел еще одну команду: [LOADPZU0. Как вам, кстати, название сервера? ПЗУ0!

Ну ладно malloc обозвать SUP1. Но ПЗУ - это известное сокращение. Неужели нельзя было что-то другое придумать?
У меня три догадки: 1) это сокращение от "программа загрузки и управления"; 2) это как-то связано с использованием ОЗУ на экспериментальных сетевых платах, в которые надо было предварительно загружать прошивку; 3) это чтобы враг не догадался.

В коллекции этих файлов было аж три штуки и все разные. Никаких мыслей, какой из них правильный у меня не было, поэтому начал с первого, размером 5416 байт. Добавил его в образ.

Ничего не заработало! (Эта фраза тут еще много раз появится :) Эмулятор падал на адресе BE92. Хуже того, даже если выйти в отладчик и набрать эту команду руками, то все падало точно также. Я даже думал, что диск просто битый.

Мне ничего не оставалось, как попытаться дизассемблировать все компоненты СПК и понять, что и откуда вызывается и что вообще происходит.

Компонентов всего 5 штук. Из опыта разбора Рапиры было известно, что с адреса 1800 грузится так называемая IOSUB - часть, которая отвечает за вывод на экран и ввод с клавиатуры. Плюс, это место для вспомогательных процедур. Первое, что стало ясно, глядя на код, - это вот эти места:

1FB3 -   20 2A 1E   "..."   JSR   1E2A          вероятно, построение рамки внизу экрана
1FB6 -   0A .. ..   "."     ASL   A
1FB7 -   1A .. ..   "."     NOP              <==
1FB8 -   1B 1D 20   "..."   SLO   201D, Y
1FBB -   46 19 ..   "f."    LSR   19

Нет, это не недокументированные инструкции, это просто данные:

SUB_1FB3
        JSR     DRAWFRAMEAT

        .byte   $0A, $1A, $1B, $1D

        JSR     HOME
        LDA     ERROR
        JSR     SUB_ED65

Довольно распространенный способ передачи параметров: вызываемая процедура берет со стека адрес, откуда она была вызвана, и забирает оттуда свои параметры. Потом процедура прибавляет к этому адресу размер блока данных и кладет адрес обратно в стек. И при возврате "обходит" эту область.

По адресу 1CE3 находится процедура, которую я назвал SHOWMENU. Она вызывается из редактора и получает таким же способом координаты экрана, список адресов обработчиков пунктов меню и текст пунктов меню. Расковыряв адреса обработчиков, и сопоставив их с текстами пунктов меню стало понятно, что за адрес вызывается при выборе пункта "Работа по сети". Это адрес 95A0. И код по этому адресу действительно вызывает интерпретатор команд отладчика и передает ему команду [LOADPZU0.

Отладчик, в свою очередь, вызывает ДОС. А ДОС у меня упорно валился по адресу BE92.


По этому адресу находится BRK. Я пересмотрел все образы дисков, думая, что это просто какой-то битый сектор. Но код везде был одинаковый. Тогда я подумал, что это какой-то assert (типа того, что был в Рапире). Разработчики, видимо, одни и те же, поэтому и стиль похожий. И стал выяснять, что делает процедура BE1E, где и происходит падение.

До конца я не разобрался, но, в общем, эта процедура обходит все модули ОЗУ и сохраняет их состояние. Один из входных параметров - это битовая маска, где каждый установленный бит - это модуль ОЗУ (или встроенный диспетчер на плате). Прикол оказался в том, что эта маска содержала единицы для каждого пустого слота. Процедура общалась с пустыми слотами и что-то в их ответе ей так не нравилось, что срабатывал assert :)

Дело в том, что в ИКП-90 по сравнению с ИКП-88 был изменен код определения модулей памяти. ИКП-88 пытается подключить к 7 странице модуля 7-й банк (делает запись по адресу Cx77) и смотрит: получилось/не получилось. Если получилось, то устройство считается модулем ОЗУ. ИКП-90 эту проверку не делает, вместо нее он проверяет, что младшие четыре бита по адресу C0N0 равны 0. Если слот пустой, то на реальной девятке так и будет.

Проблема в том, что виндовый эмулятор неправильно эмулирует девятку. Он всегда возвращает по неиспользуемым адресам устройств ввода-вывода $FF (как на семерке). И код ИКП-90 ломается. Он начинает считать каждый пустой слот модулем ОЗУ.

Это удалось победить, записав руками правильное значение маски. Но... ничего не заработало. Весь результат состоял в появлении на экране маленькой рамки, в которой проносился вывод обработчика команды BRK. Проблема в том, что рамка была высотой в 1 строку, поэтому адрес останова все время "уползал" и я даже не мог видеть, где все упало.

Пришлось разбирать отладчик и искать, где там обработчик BRK. Сначала я пытался как-то пропатчить размер окна, но все время патчил что-то не то. В конце концов, я просто после печати адреса поставил инструкцию $02...

И оказалось, что теперь все падает по адресу ED65! Наконец-то я совпал с линуксовым эмулятором!

В эту точку процессор попадает из процедуры 1FB3, а в нее из процедуры 1FD0. Чтобы понять, кто вызывает 1FD0, пришлось разбираться в ДОС. В ДОС-е в ячейках B685, B686 лежит адрес обработчика ошибки. Значение 1FD0 в эти ячейки записывает Редактор. Проблема только в том, что этот адрес настроен для Ассемблера, и чтобы всё правильно отработало нужно сначала подключить правильные страницы памяти к старшим адресам.

В команде "Работа по сети" подключение этих страниц не сделано (пропущено?), поэтому ошибка ДОС ведет к падению. Код ошибки $28, что означает попросту "Файл не найден".

Так. Стоп. Но я-то точно знаю, что файл я туда положил и он никак не может быть "не найден"!

На этом месте я довольно долго тупил, пробовал разные варианты и, наконец, "перестановка" сетевой платы из 3 слота в 6-й помогла. Ничего не заработало, но упало по адресу C703.

Виндовый эмулятор, к сожалению, не останавливается, если процессор выполняет код из ПЗУ несуществующего устройства. Поэтому при переходе на адрес C34C процессор щелкает коды $FF и уезжает куда-то в драйвер дисковода. Там следы теряются, но ДОС фиксирует ошибку. А вот при переходе на адрес C64C процессор доезжает только до адресов дисплейного контроллера. Тут я понял, что надо делать патч, имитирующий присутствие сетевой платы.


C первой версией патча не только ничего не заработало, но даже стало хуже - ДОС снова стал падать по адресу ED65. Кроме того, я заметил, что в меню "Работа с ГМД" странно работает команда "Каталог" - она не показывает ни одного файла, а число свободных блоков равно FFFF.

На всякий случай, я проверил, как все работает, если не править таблицы устройств ИКП и не добавлять сетевую плату, оставив только патч для модулей ОЗУ. Команда "Каталог" заработала. Мало того, команда "Работа по сети" заработала! Правда, после загрузки PZU0 показал красивую рамочку с текстом "В конфигурации отсутствует модуль сети или испорчены системные поля".

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1216&amp;download=1

Это был не тот результат, на который я рассчитывал. Поэтому я продолжил эксперименты с патчем. В какой-то момент я перепутал байты, все стало валиться по BRK и тут до меня дошло, что точка входа в ПЗУ не то, чем кажется. Я-то думал, что это какая-то одноразовая инициализация. А оказалось, что нет, это и есть тот самый фильтр, про который в статье написано.

Оказывается, все вызовы к RWTS проходят через эту точку входа. А код в ПЗУ решает: текущий вызов идет к сетевой плате или нет? Если да, то дальше работает сетевой драйвер из ПЗУ. Если нет, то управление возвращается на адрес B306, а там стоит вызов драйвера дисковода.

Короче, первая версия патча просто отключала вызов дисковода, и именно поэтому не было файлов в каталоге, а файл упорно не находился. С учетом этого была сделана вторая версия. А потом сразу третья, потому что сначала я воткнул патч по адресу 0280, а адреса 200-2FF используются ДОС как буфер TSL :)


С новой версией PZU0 загрузился... но ничего не заработало, потому что сетевую плату он не увидел. Я-то всю возню с имитацией наличия платы затеял в надежде обмануть сервер. А оказалось, что он не смотрит на системные таблицы, а просто проверяет, байт CX0C равен $20 или нет. Хуже того, там оказался код расчета контрольной суммы ПЗУ. Но почему-то результат расчета никак не используется.

Ладно, добавил еще маленький патчик для обхода проверки. PZU0 нарисовал рамку с текстом "Внимание! Работа в сети" и опять упал...
После пяти или шести итераций я смог запатчить достаточно вызовов ПЗУ, чтобы снять скриншоты.

У меня в какой-то момент родилась мысль: а что я так парюсь? Ведь есть очень похожая плата принтера. Виндовый эмулятор позволяет указать любой файл ПЗУ. Почему бы не подсунуть туда прошивку от сетевой платы?

Щаз-з-з. Хотя у платы принтера и есть возможность подключать ПЗУ к адресам C800-CFFF, но это подключение работает совсем не так как на сетевой плате. Так что трюк не вышел.

Ну и ладно. В конце концов, цель была проверить, это вообще тот файл? Он может загрузиться? Он относится именно к сетевой плате или к KERMIT? В его меню есть пункты про сетевую загрузку машин?

Я считаю, что на все вопросы получены положительные ответы. Конечно, намного проще было бы просто проверить загрузку PZU0 на реальной машине, но тогда многие подробности прошли бы мимо.


Способ запуска на эмуляторе

Образ я не выкладываю, потому что его легко сделать самостоятельно - я просто взял образ с сайта и добавил в DOS33 файл PZU0.FIL из папки \800-90\kermit

1) во время показа меню ИКП изменить значения

9A09: 04
9A0F: 01

Сетевая плата будет в слоте 6. Как я понял, ее рекомендуется туда ставить. Режим прогона ожидает плату именно в 6 слоте. В патче тоже указан номер слота, поэтому менять слот не стоит.

2) выбрать и загрузить ассемблер СПК

3) изменить значения

BEF0: 80

Это маска модулей ОЗУ. На линуксовом эмуляторе ее вводить не нужно.

4) ввести патч

B304: 40 03
95C8: 6D 03
0340: 8D 4A C1 AC 01 B0 B9 B5
0348: 99 C9 04 F0 01 60 68 68
0350: A0 09 BD 63 03 99 F5 00
0358: 88 10 F7 18 A9 32 A0 01
0360: 4C 09 B3 10 60 01 00 00
0368: 96 AA 81 00 55 A9 A9 8D
0370: 50 43 A9 00 8D 51 43 A9
0378: 65 8D A7 44 A9 03 8D A8
0380: 44 8D B1 44 8D BE 44 8D
0388: F6 46 A9 4D 8D B0 44 8D
0390: BD 44 8D F5 46 A9 D0 8D
0398: C8 44 A9 0F 8D C9 44 4C
03A0: 00 43

5) теперь можно нажать в редакторе РЕД и выбрать команду "Работа по сети"


Вопросы без ответов

1) пока непонятно, чем отличаются три версии PZU0

2) для запуска тестов сетевой платы, проверок и прогона нужны еще какие-то файлы. Непонятно какие

3) в коде сетевой платы какое-то особенное значение имеет номер дисковода. Напомню, что плата притворяется контроллером дисковода. К обычному дисководу можно подключить максимум два дисковода: 0 и 1. Но в коде много проверок, что номер дисковода равен 3! Что это значит - непонятно. Либо это какое-то отладочное значение, либо это способ сказать, что пересылаемые данные не должны попасть на диск (в статье сказано, что был какой-то способ обмена сообщениями между машинами), либо это был какой-то особенный диск (НЖМД?, блок "САДА"?)

Post's attachments

Attachment icon AgatServerBurnIn.png 5.68 kb, 152 downloads since 2023-01-02 

Attachment icon AgatServerLoad.png 5.52 kb, 146 downloads since 2023-01-02 

Attachment icon AgatServerMain.png 5.01 kb, 146 downloads since 2023-01-02 

Attachment icon AgatServerNoNetwork.png 3.71 kb, 147 downloads since 2023-01-02 

Attachment icon AgatServerState.png 5.33 kb, 144 downloads since 2023-01-02 

Attachment icon AgatServerTestModule.png 5.79 kb, 146 downloads since 2023-01-02 

21 Отредактировано Voldemar0 (09-01-2023 06:53)

Re: Прошивка сетевой платы НИИВК

> SUP

"Система управления памятью" ?


> Довольно распространенный способ передачи параметров: вызываемая процедура берет со стека адрес, откуда она была вызвана, и забирает оттуда свои параметры.

Вот этот способ передачи данных я видел только однажды в агатовких прогах: в библиотеке "windous" (да, именно с ошибкой). Библиотека использовалась в редакторе дисков от "Polyintel" (на всё были исходники) и я очень подробно изучал её код, а потом использовал в своих прогах. И этот метод передачи данных стал применять очень широко.


> По адресу 1CE3 находится процедура, которую я назвал SHOWMENU.

...так что можно копнуть и узнать, как эти процедуры назвались в авторском варианте.

Насколько я помню, полная версия библиотеки не просто умела рисовать рамки, но и сохранять содержимое экрана под окном на LIFO-стеке, соответственно, была и процедура a'la close.


> Наконец-то я совпал с линуксовым эмулятором!

:) Он *nix'овый, если точно. Под linux я им не пользуюсь (хотя можно и под linux собрать).


> 2) для запуска тестов сетевой платы, проверок и прогона нужны еще какие-то файлы. Непонятно какие

Если делается попытка их прочитать, то можно зацепить break point на сообщение об ошибке "FILE NOT FOUND" и посмотреть буфер имени файла. У Ассемблера он будет по адресу $0200 (точно не помню, может быть и где-то выше, но точно что адрес "круглый" и не выше $0700). Но это нужно именно в отладчике эмулятора делать, так как $200 - для внутреннего отладчика агата - буфер ввода комстроки.