Alex_K (13.01.2023), Oleg N. Cher (13.01.2023), Radon17 (13.01.2023), Titus (13.01.2023)
В этих тестах Patron зачем-то перешёл на вывод на экран через перехват прерывания 064 и через регистры терминала. А с этим у СОюз-НЕОН имеются большие проблемы, там вроде переделывали RT-11, чтобы выводить без прерываний.
- - - Добавлено - - -
Даже не для вывода, а для какой-то синхронизации. Используются прерывания 064 (терминал) и таймер (0100). И у Союз-НЕОН где-то идёт неправильно эмуляция всего этого дела, по докам на терминал он всё-таки пытается эмулировать регистры 0177564 и 0177566 в режиме прерываний.
Надо переделывать тест, но написан он очень сложно, такое ощущение, что там целая операционная система.
nzeemin (14.01.2023)
NEONBTL preview 103
https://github.com/nzeemin/neonbtl/r...review-103.zip
В этой версии - улучшения по скорости команд (сейчас эмулятор примерно на 10-15% медленнее реала), улучшена эмуляция RTC (правильно показывается дата).
Alex_K (14.01.2023)
Вроде пропатчил MUL, в UKNCBTL показывает такие же результаты, как и оригинальный тест, только работает побыстрее, нет пауз между тестами.
Исходники и собранный модуль - здесь.
nzeemin (14.01.2023)
Alex_K (14.01.2023)
NEONBTL preview 107
https://github.com/nzeemin/neonbtl/r...review-107.zip
Первое превью эмулятора с записью на диск. Надо тестировать, проверял только на мелких примерах. Берегите свои образы дисков - делайте бэкапы.
Проверил на копировании файла - что в образе они потом совпадают. Проверил на команде squeeze, что после этого образ остался рабочим.
Образ диска в файле на хосте актуализируется либо по команде остановки мотора, либо после 3-х секунд вращения диска.
Индикатор работы мотора выведен на статусбар - "FD Motor".
P.S. @Alex_K уже нашёл пару ошибок, связанных с записью, буду лечить.
Последний раз редактировалось nzeemin; 15.01.2023 в 14:29.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Покопался в прошивке ПЛМ P10. Выяснилось, что к адресному пространству контроллера дисковода относятся регистры 0161070 и 0161072. А к адресному пространству контроллера жёсткого диска с 0161040 по 0161056 и 0161076. Сам счетчик буфера сбрасывается любой записью как в регистр 0161054 (HD.SDH), так и в регистр 0161076 (FD.CNT).
nzeemin (15.01.2023)
По анализу прошивки ПЛМ P10 предусмотрен режим работы буфера - запись или чтение. Соответственно перед работой с буфером его надо перевести в необходимый режим. Перевод в режим чтения осуществляется обращением (чтение или запись) к регистру HD.CSR 0161056, а в режим записи - обращением к регистру HD.SDH 0161054. Это также отражено в исходника ВПО в процессе P16HDC:
;----------------------------------------
; bdir = wr : rd/wr hdsdh ;
; bdir = rd : rd/wr hdcsr ;
;----------------------------------------
В режим записи может его так же перевести контроллер HDD, но только в режим записи, т.к. в режим чтения буфер переводится при записи команды в регистр HD.CSR. Для всех других операций, как адресное чтение и запись буфера, а также для работы дисковода, его необходимо выставить. Для дисковода при чтении данных буфер должен быть в режиме записи, а для записи данных - в режиме чтения.
Также в ПЛМ P10 предусмотрена защита от неправильного использования буфера во время адресного обмена через регистр HD.BUFF 0161040. Т.е. если буфер установили в режим чтения, то запись в него идти не будет и счетчик не будет переходить на следующий адрес. Так же, при установке буфера в режим записи, не будет идти чтение и счетчик не будет переходить на следующий адрес. Это такая защита при исполнении команды MOVB, у которой в цикле записи источника делается пустое чтение этого источника, а затем запись.
Во время обмена с буфером контроллеров FDD и HDD такой полной защиты нет, т.е. операция чтения и записи в память не будет исполняться, но счетчик будет переходить на следующий адрес.
В дополнение по прошивке ПЛМ P10. Ранее я писал, что данная прошивка формирует сигналы для выбора контроллера дисковода /CS-FL (адреса 0161070-0161073) и контроллера жёсткого диска /CS-HD (адреса 0161040-0161057 и 0161076-0161077). Также в этой ПЛМ находится бит выбора режима буфера bdir /BUF_WR.
Выбор контроллера дисковода, выбор осуществляется при проведении операций чтения или записи при условии, что оба контроллера не работают в режиме ПДП:
/HD-BCS*/FL-DRQ*IOR*&O1610XX*A05*A04*A03*/A02
/HD-BCS*/FL-DRQ*IOW*&O1610XX*A05*A04*A03*/A02
Такой же выбор контроллера жёсткого диска:
/HD-BCS*/FL-DRQ*IOR*&O1610XX*A05*/A04
/HD-BCS*/FL-DRQ*IOW*&O1610XX*A05*/A04
IOW*&O1610XX*A05*A04*A03*A02*A01
Дополнительный регистр 0161076 выбирается только при записи в него, независимо от режима работы контроллеров.
А вот и установка бита режима буфера:
CS-HD*/A04*A03*A02*/A01
BUF-WR*/A01
BUF-WR*/A02
BUF-WR*/A03
BUF-WR*A04
BUF-WR*/CS-HD
HD-BCS*FL-WR
Первое условие настроено на обращение к регистру 161054 и переводит буфер в режим записи. Следующие пять условий являются условиями удержания сигнала, что-то типа триггера. Но все эти условия перестают выполняться при обращении к регистру 0161056 и буфер переводится в режим чтения. Последнее условие служит для перевода в режим записи буфера самим контроллером жёсткого диска. Это необходимо, т.к. команда в контроллер HDD записывается в регистр 0161056, переводя одновременно буфер в режим чтения, так что далее сам контроллер переводит его в режим записи при необходимости.
Эта ПЛМ также формирует ответ для контроллера FDD в ответ на запрос обмена ПДП, сигнал /FL-DACK:
FL-DRQ
FL-DACK*HDBUFCS
Сигнал также удерживается, если активен выбор буфера.
А вот и интересный сигнал выбора буфера /HDBUFCS. Сигнал выбора режима чтения/записи буфера /BUF-WR подаётся постоянно, поэтому сама операция работы с буфером делается сигналом /HDBUFCS, который подключен к выводу /CS статического ОЗУ. Также после выдачи этого сигнала осуществляется переход к следующему адресу в счётчике:
/HD-BCS*/FL-DRQ*IOW*BUF_WR*CS_HD*A05*/A04*/A03*/A02*/A01
/HD-BCS*/FL-DRQ*IOR*/BUF_WR*CS_HD*A05*/A04*/A03*/A02*/A01
HD-BCS*FL-RD
HD-BCS*FL-WR
FL-DRQ*FL-DACK
Первые два условия отвечают за адресный обмен с буфером и содержат защиту от его неправильного использования. Видно, что условия выполняются, если осуществляется запись и буфер в режиме записи, а также если осуществляется чтение и буфер в режиме чтения. Если условия не будут выполняться, то буфер не будет выбран, соответственно не осуществится операция чтения/записи и не будет осуществлён переход на следующий адрес.
Третье и четвертое условие выполняются при обмене контроллера HDD с буфером, а пятое - при обмене контроллера FDD. Здесь нет ограничений от неправильного использования. При работе контроллера HDD такого быть не может, т.к. он сам переключает буфер в необходимый режим. А вот при работе контроллера FDD такое возможно, если перед операцией режим буфера был неправильно выставлен. В любом случае переход на следующий адрес всегда будет выполняться, но при записи в буфер в режиме чтения ничего записываться не будет, будет оставаться старое значение, а при чтении с буфера в режиме записи будет читаться всякая ерунда и эта же ерунда записываться в буфер.
Здесь также осуществляется выработка сигналов чтения и записи регистров контроллеров /FL-RD и /FL-WR.
Сигнал /FL-RD:
/HD-BCS
/FL-DRQ*IOR*&O1610XX*A05*/A04
/FL-DRQ*IOR*&O1610XX*A05*A04*A03*/A02
FL-DRQ*FL-DACK*HDBUFCS*BUF-WR
Сигнал /FL-WR:
/HD-BCS
/FL-DRQ*IOW*&O1610XX*A05*/A04
/FL-DRQ*IOW*&O1610XX*A05*A04*A03*/A02
FL-DRQ*FL-DACK*HDBUFCS*/BUF-WR
Видно, что сигналы формируются не только для адресного обмена, но и при работе контроллера FDD в режиме ПДП.
Ну и последний сигнал очистки счетчика CL-CNT. Он используется не только для очистки счётчика буфера, но и в качестве условия для записи в регистры 0161054 и 0161076, т.к. в этих регистрах содержатся биты во внешней логике:
/A04*A01
/A02*/A04
/A03*/A04
/IOW
/CS-HD
Условий много, но они должны все не выполнится, т.к. выход у ПЛМ инверсный, а сигнал нужен прямой. Поэтому по этим условиям выбирают все регистры, кроме 0161054 и 0161076. По остальным регистрам хоть одно условие будет истинным и сигнал очистки не выработается. А при выборе регистров 0161054 и 0161076 все условия будут ложными и выработается сигнал очистки.
Последний раз редактировалось Alex_K; 17.01.2023 в 20:47.
Про ПЛМ P11. Данная ПЛМ содержит в себе биты 0 (HN0), 1 (HN1), 4 (RUN) регистра HD.SDH(0161054), бит 8 счётчика буфера(HDBUFA08) и биты 4 (FD-RESET), 1 (HDBUFA10), 0 (HDBUFA09) регистра FD.CNT(0161076). В регистре 0161076 биты 0 и 1 являются не только выбором части буфера, но и 9-м и 10-м разрядами счётчика буфера. В самой ПЛМ четыре логических вывода, в которых логические произведения складываются по ИЛИ-НЕ, а также четыре регистровых вывода, на выходе которых стоит по D-триггеру, информация в котором защелкивается по переднему фронту на входе CLK, в триггере затем используется инверсный выход. На логических выводах находятся сигналы HN1, HN0, RUN и CLK-P11. Вывод CLK-P11 используется для формирования переднего фронта, который подаётся на вход CLK. Выводы FD-RESET, HDBUFA08, HDBUFA09 и HDBUFA10 являются регистровыми, актуальная информация на них появляется после защелкивания по переднему фронту на входе CLK.
Пока рассмотрим логические выводы HN0, HN1 и RUN.
Вывод RUN:
DB4*CL-CNT*/A01
RUN*DB4
RUN*A01
RUN*/CL-CNT
Первое условие обеспечивает выбор бита 4 регистра 0161054. Сигнал CL-CNT является не только сигналом сброса счётчика буфера, но и условием записи в регистры 0161054 и 0161076. Различаются эти регистры в по адресной линии A01, если ноль, то это 0161054, если единица - 0161076. В данном случае формируется условие, равное записываемому биту 4 в регистр 0161054. Остальные три условия являются условиями удержания, реализуя функции триггера. Так как выход инверсный, то на выводе появляется инвертированное значение записанного бита. Оно подаётся на входы запуска мотора интерфейсов дисковода и жёсткого диска MFM. Т.к. шина дисковода и диска MFM также инверсная, то запись единицы обеспечивает запуск мотора, запись нуля - остановка мотора.
Вывод HN1:
DB1*CL-CNT*/A01
HN1*DB1
HN1*A01
HN1*/CL-CNT
Всё точно так же, как и битом 4 (RUN), но только бит 1 регистра 0161054. Этот вывод подаётся на вход HN1 интерфейса жёсткого диска, обеспечивает бит 1 выбора головки, а также на вход 2 интерфейса дисковода, обеспечивает выбор плотности, при операции с диском двойной плотности DD устанавливается в один.
Вывод HN0:
DB0*CL-CNT*/A01
HN0*DB0
HN0*A01
HN0*/CL-CNT
Всё точно так же, как и битом 4 (RUN), но только бит 0 регистра 0161054. Этот вывод подаётся на вход HN0 интерфейса жёсткого диска, обеспечивает бит 0 выбора головки, а также на вход 32 интерфейса дисковода, обеспечивает выбор стороны.
Потом будут описаны другие выводы, которые обеспечивают формирование сигнала CLK и работу трёх старших бит счётчика.
- - - Добавлено - - -
Далее по работу ПЛМ P11.
Для запоминания информации на регистровых выводах необходимо формирование переднего фронта сигнала CLK. Этот сигнал формируется на выводе CLK-P11, который соединён с выводом CLK самой ПЛМ. По схеме там ещё стоит конденсатор C16 на 330 пФ, служащий для формирования длительности импульса. У формирователя импульса и счётчика два режима работы - обычный и под управлением контроллера жёсткого диска. Обычный режим работы это адресный обмен с буфером и обмен с буфером контроллера дисковода.
Здесь необходимо рассмотреть два вывода сразу - P11-CLK и HDBUFA08, т.к. они взаимосвязаны в работе.
Вывод формирования импульса CLK-P11:
HDBUFA07
/HDBUFA08*HD-BDRQ*P11-CLK
HDBUFA08*HD-BDRQ
Вывод восьмого бита счётчика буфера HDBUFA08:
/HD-BDRQ*HDBUFA08
CL-CNT
Рассмотрим работу в обычном режиме. В данном случае сигнал HD-BDRQ имеет низкий уровень, а значит два последних условия при формировании P11-CLK не будут выполняться. В первом условии сигнала HDBUFA08 подаётся инвертированное значение /HD-BDRQ, поэтому оно всё время будет в единичном состоянии. Так как в данном случае на формирование сигнала P11-CLK влияет только вход HDBUFA07, то при очистке счётчика, если он был в единичном состоянии, то он переходит в нулевое. Также он переходит в нулевое состояние во время счёта, что является одновременно сигналом переноса в старшие разряды. Так как выход у ПЛМ инверсный, то на выходе будет изменение с нулевого на единичное состояние и сформируется передний фронт. Но при ситуации, когда HDBUFA07 был в нулевом состоянии, то формирование фронта при очистке происходить не будет. Но в данном случае разработчики между сигналами очистки буфера CL-CNT и выводом HDBUFA07 со счётчика поставили конденсатор C15 на 75 пФ. Во время очистки счётчика CL-CNT принимает высокий уровень и выводе HDBUFA07 возникает импульс, этакий аналоговый одновибратор. Длительности этого импульса должно хватить на формирование переднего фронта на выходе P11-CLK. Таким образом передний фронт будет сформирован либо во время очистки, либо во время счёта при переходе из единичного состояния в нулевое.
Во время обычного режима работы по сигналу CLK меняется состояние вывода HDBUFA08. Сигнал /HD-BDRQ в единичном состоянии, а вывод у ПЛМ инверсный, поэтому HDBUFA08 будет переключаться на противоположное значение. Т.к. импульс происходит при переносе из HDBUFA07, то просто меняется состояние HDBUFA08 на противоположное. Но импульс CLK может возникать и во время очистки счётчика, поэтому вторым условием стоит состояние сигнала CL-CNT, во время очистки он в единичном состоянии, поэтому на выводе HDBUFA08 возникает нулевое состояние, разряд очистился.
Более сложная работа происходит при управлении с контроллера жёсткого диска. Там при операциях записи перед каждым сектором и при форматировании перед запросом буфера выдаётся сигнал HD-BDRQ, этот же сигнал выдаётся после чтения одного сектора. Почему то разработчики решили переключать страницы адреса буфера (биты 9 и 10) только по этому сигналу, наверное от того, что контроллер после операции с каждым сектором требует подтверждения. Остальные биты с 0 по 8 считаются как обычно, т.к. сигнал HD-BDRQ отсутствует. Но бит 8 HDBUFA08 всё равно принудительно дёргается при смене страницы. При выдаче HD-BDRQ контроллер ждёт ответного сигнала на вход BRDY, но в Союз-НЕОН эти выводы соединены. Таким образом выдаётся HD-BDRQ, он поступает на вход BRDY, контроллер в ответ снимает HD-BDRQ и операция продолжается далее, возникает импульс.
При подаче HD-BDRQ вывод счётчика HDBUFA07 обязательно должен быть очищен, иначе ничего не произойдёт. Состояние вывода HDBUFA08 роли не играет, но рассмотрим ситуацию, когда оно нулевое, что и должно быть.
Диаграмма работы:
При подаче сигнала HD-BDRQ выполняется условие /HDBUFA08*HD-BDRQ*P11-CLK и на выводе P11-CLK появляется низкий уровень. Инвертированное значение P11-CLK с учётом задержек снова поступает на вход и условие /HDBUFA08*HD-BDRQ*P11-CLK уже выполняться не будет и на выходе P11-CLK снова появляется высокий уровень и формируется передний фронт на входе CLK. По этому фронту отрабатывает правило /HD-BDRQ*HDBUFA08 для вывода HDBUFA08. Но т.к. /HD-BDRQ у нас в нуле, то на выходе HDBUFA08 защелкивается единица, т.к. используется инверсный выход триггера. После появления единичного сигнала HDBUFA08 для формирования P11-CLK срабатывает правило HDBUFA08*HD-BDRQ, на выходе появляется низкий уровень и ситуация стабилизируется. После исчезновения HD-BDRQ все условия для формирования P11-CLK становятся ложными и вывод переводится в единичное состояние с выдачей переднего фронта. По этому переднему фронту меняется состояние HDBUFA08 с единичного на нулевое, что также приводит к изменению разрядов HDBUFA09 и HDBUFA10 и переключению на следующую страницу. В данном режиме работы длительность импульса HD-BDRQ должна быть больше, чем длительность импульса P11-CLK, иначе будет только один фронт, HDBUFA08 переведется в единичное состояние и переключения страниц не произойдёт.Код:HDBUFA07 _________________________ _______ HDBUFA08 _________/ \_______ _________ HD-BDRQ __/ \____________ ____ __ _________ P11-CLK \__/ \____/
Осталась третья часть про старшие разряды счётчика HDBUFA09 и HDBUFA10.
Последний раз редактировалось Alex_K; 19.01.2023 в 23:58.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)