Вообщем, я закончил первый, черновой вариант базовой поддержки сети. Базовая - потому что эмуляция сетевого адаптера далеко не полная. То есть настройка режима работы ВВ51 через командный порт не реализована - режим жестко задан как 19200-8-О-1. С другой стороны, а надо ли точно эмулировать этот ВВ51? Вот для ИРПС порта - другое дело.
Собственно, эмулируются пока только чтение из сети, запись в сеть, проверка готовности приемника (передатчик готов всегда) и прерывание от сети.
В файл конфигурации я добавил 2 параметра - LANADDR, то есть адрес РМУ в сети, и LANPORT, указывающий имя последовательного устройства, например /dev/ttyS0. Программа открывает этот порт, и взаимодействует через него с подключенным к нему реальным корветом. Как вариант, предусмотрена работа с виртуальными компортами (псевдотерминалами) - если указать LANPORT=/dev/ptmx, то будет создан подчиненный вторичный компорт, имя которого показывается на консоль при старте, например -
Код:
forth32@cad ~/korvet/kemu $ ./kdbg
Последовательный порт /dev/ptmx открыт, fd=5
Подчиненный псевдотерминал - /dev/pts/3
Driver: ALSA
Этот вторичный компорт можно открыть, например, моей программой KL. Ну или запустить еще одну копию эмулятора и указать его в LANPORT.
Итак, программа STS в эмуляторе работает полностью. Я ее, кстати, впервые увидел в работе. Уродство редкостное. Спрашивает подтверждение на каждый чих. За такое в комплекте КУВТ надо оба яйца с корнем отрывать. Поскольку STS привязана к NETLIB, в CP/M она не работает. А с микродосом возникла проблема - в большинстве микродосов в эмуляторе не работает клавиатура. На реальном корвете работает, а тут - нет. И не поймешь где виснет - отладчик в эмуляторе требует полноэкранный режим и мне, соответственно, недоступен. Единственный рабочий микродос оказался на диске de_9_01.kdi.
Программа нашла мой реальный корвет, определила его адрес, позволила передать-принять данные. Кстати, на РМУ при этом вывдится текст "Работа прервана загрузкой программы" - хорошая идея, надо ее ко мне в программу вставить.
Попробовал я CP/N. Он передал клиентскую часть на корвет, она там запустилась и выдала A>, но по первой же команде повисла намертво. КОРНЕТ виснет при загрузке с дискеты, СФЕРА требует сетевой диск B, подробнее я не разбирался.
Теперь о проблемах. Во-первых, в обратную сторону сеть работать не хочет. То есть когда реальный корвет - сервер, а эмулятор - РМУ. Похоже, теряются прерывания. То есть PIC_IntRequest(3) не вызывает прерывания. Тут придется посидеть в GDB, поотлавливать этот момент. Ну и с псевдотерминалом тоже есть проблема:
Код:
forth32@cad ~/korvet/lan $ ./kl -d /dev/pts/3 -vbp -s0 -l100
@ Послан адрес
@ Послана команда запроса данных типа 3
+ Прием данных:
- Принят пакет типа N - прерываем прием данных
- Данные не получены
То есть эмулятор принимает адрес, и даже пытается отреагировать на команду, но отвечает N. Тут я еще заметил, что через псевдотерминал обмен идет ОЧЕНЬ быстро - понятно, что тут скорость не ограниченна 19200, и очень похоже что эмулятор просто не успевает за потоком данных. Надо разбираться с буферизацией и управлением потоком.
Ладно, для первого дня и так неплохо. Поскольку насчет репозиториев мы еще не договорились, выкладываю свои труды на яндексдиск - http://yadi.sk/d/9kivUREpRRam3
Все равно это очень временный файл.
Но все еще впереди. Разберемся с прерываниями, согласованием потоков данных, клавиатурой - будет отличная игрушка.