Про старшие разряды счётчика HDBUFA09 и HDBUFA10 в ПЛМ P11.
Разряды имеют регистровый выход и информация на них защёлкивается по переднему фронту на входе CLK. Передний фронт возникает во время счёта при переносе из 7-ого разряда или во время очистки счётчика. Очистка счётчика возможна при записи в регистры 0161054 и 0161076. При записи в регистр 0161076 должны записаться новые значения 9-го и 10-го разрядов счётчика, которые выступают в качестве выбора банка в СОЗУ. Также передний фронт формируется два раза при выдаче сигнала HD-BDRQ с контроллера жёсткого диска, эти правила срабатывают для обычного счёта.
Правила формирования новых значений разрядов HDBUFA09 и HDBUFA10.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/CL-CNT
/HDBUFA08*/HDBUFA09*/A01
CL-CNT*/DB0*A01
HD-BCS*/HDBUFA09
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
/HDBUFA09*/HDBUFA10*/A01
/HDBUFA08*/HDBUFA10*/A01
DB1*CL-CNT*A01
HD-BCS*/HDBUFA10
Рассмотрим вариант обычного счёта при работе с регистром 0161040 и при работе контроллера FDD в режиме ПДП, а также при подаче сигнала HD-BRRQ с контроллера жёсткого диска (два фронта CLK). В данном варианте активны следующие сигналы /HD-BCS, /CL-CNT. Значение сигнала /A01 не имеет значение, т.к. правила с ним повторяют правила с /CL-CNT. Сигналы CL-CNT и HD-BCS неактивны. Итого у нас получаются для исполнения следующие правила.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/CL-CNT
Первое правило исполняется при равенстве единице разрядов HDBUFA08 и HDBUFA09. Второе правило при равенстве нулю разрядов HDBUFA08 и HDBUFA09. Если эти разряды имеют разные значения, то ни одно правило не исполняется. Не забываем про инверсный выход с триггера. Итого получается 00>0, 01>1, 10>1, 11>0. Получается, что если 8-й разряд был равен нулю, то 9-й разряд сохраняет своё старое значение, а при равенстве 8-го разряда единице происходит перенос и 9-й разряд меняет своё значение на противоположное.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
В случае с 10-м разрядом правила такие же, только участвуют уже три разряда. Изменяться 10-й разряд будет уже только при равенстве единице 8-го и 9-го разрядов из-за переноса. В остальных случаях он сохраняет своё значение. Итог: 000>0, 001>0, 010>0, 011>1, 100>1, 101>1, 110>1, 111>0.
Следующий случай - это очистка счётчика через запись в регистр 0161054. В данном случае активны сигналы /HD-BCS, CL-CNT, /A01. Неактивны /CL-CNT, A01 и HD-BCS.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/A01
Первое правило исполняется при равенстве единице разрядов HDBUFA08 и HDBUFA09. Второе правило при равенстве нулю разрядов HDBUFA08 и HDBUFA09. Если эти разряды имеют разные значения, то ни одно правило не исполняется. Не забываем про инверсный выход с триггера. Итого получается 00>0, 01>1, 10>1, 11>0. В данном варианте 9-й разряд не должен трогаться, но он изменяется, если перед этим был установлен 8-й разряд. Такого по идее не должно быть, т.к. после каждого счёта разряды с нулевого по восьмой должны быть сброшены.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/HDBUFA10*/A01
/HDBUFA08*/HDBUFA10*/A01
Всё точно так же, как и в предыдущем счучае, но здесь в сравнении уже участвуют три разряда. Итог: 000>0, 001>0, 010>0, 011>1, 100>1, 101>1, 110>1, 111>0. Так же видим, что мешает 8-й разряд.
Далее установка этих разрядов через запись в регистр 0161076. В данном случае активны сигналы /HD-BCS, CL-CNT, A01. Неактивны /CL-CNT, /A01 и HD-BCS.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
CL-CNT*/DB0*A01
В случае равенства единице 8-го и 9-го разрядов срабатывает верхнее правило и записывается ноль, что есть неправильно. Если же 8-й разряд равен нулю, как и должно быть, то срабатывает нижнее правило и осуществляет запись нового значения разряда из нулевого бита. Т.к. выход триггера инверсный, то для получения прямого значения записывается инвертированный бит.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
DB1*CL-CNT*A01
Здесь почти всё точно так же, портят картину три одновременно установленных разряда с 8-го по 10-й, запишется ноль. А вот если какой-то из тех разрядов был равен нулю, то срабатывает нижнее правило и записывает первый бит. Но здесь в правиле он прямой, а на выходе появляется инверсный, наоборот. Для чего это делается, будет объяснено ниже.
Ну и наконец счёт в режиме обмена с буфером контроллера жёсткого диска. Здесь активны сигналы HD-BCS, /CL-CNT. Неактивны соответственно /HD-BCS, CL-CNT. Значение A01 и /A01 не играет роли.
Разряд HDBUFA09:
/HDBUFA08*/HDBUFA09*/CL-CNT
HD-BCS*/HDBUFA09
Верхнее правило работает при равенстве разрядов 8 и 9 нулю, в результате получается ноль. В других случаях выполняется нижнее правило. Текущее значение инвертируется и опять же в инверсном виде поступает на выход, т.е. в итоге не меняет значения. При работе верхнего правила значение также не будет изменено.
Разряд HDBUFA10:
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
HD-BCS*/HDBUFA10
Из-за трёх разрядов ситуация более сложная, но в итоге 10-й разряд не меняется.
Из-за того, что 9-й и 10-й разряды не меняются во время обмена с буфером контроллера HDD (сигнал HD-BCS), переключение на следующий банк осуществляется обработкой сигнала HD-BDRQ от контроллера жесткого диска. При записи сектора или форматировании сначала подаётся сигнал HD-BDRQ, а уже потом во время операции используется буфер. В случае с чтением сначала заполняется буфер, а уже потом подаётся HD-BDRQ. Из-за этого при записи возникает небольшая коллизия, из-за того что сначала делается переход на следующий банк. Поэтому при операциях записи и форматирования необходимо после заполнения буфера выставить номер предыдущего банка. Это дело учтено в ВПО в процессе P16HDC:
bitb #10, h.err+1 ; Это дисковод?
bne F.RW ; На работу с дисководом
bitb #20, (r2) ; Запись?
beq 20$ ; Нет
decb bcnt ; На предыдущий банк
bicb #^C3, bcnt ;
20$:
Это надо учесть при эмуляции контроллера жёсткого диска. При работе с жёстким диском начальный адрес банка не имеет значения.
В случае работы с контроллером дисковода необходимо после чтения или записи заданного количества секторов подавать сигнал TC на контроллер дисковода. Для этой цели и записывают инверсное значение бита 1. Также для дисковода имеет значение номер устанавливаемого банка, в зависимости от количества секторов: 11 - один сектор, 10 - два сектора, 01 - три сектора, 00 - четыре сектора. Т.к. бит 1 у нас записывается в инверсном значении, то получается следующая картина. Первая колонка - записываемые значения, вторая колонка - они же с инверсией первого бита, далее изменение при счёте:
11 01 -> 10
10 00 -> 01 10
01 11 -> 00 01 10
00 10 -> 11 00 01 10
Во всех случаях видим, что после чтения последнего сектора 10-й разряд переходит из нуля в единицу. Для этого к выводу HDBUFA10 подсоединён конденсатор C17 (330 пФ) и резистор R41 (56 кОм). Это аналоговый одновибратор, подающий импульс на вход контроллера TC для прекращения считывания или записи.
Остался один сигнал HD-RESET. Логического выхода для него не нашлось, поэтому сделали на регистровом:
Сигнал FD-RESET:
/DB4*CL-CNT*A01
/FD-RESET*/DB4
/FD-RESET*/A01
/FD-RESET*/CL-CNT
Если при записи в регистр 0161076 установлен бит 4, то на контроллера FDD подаётся сигнал сброса. После сброса необходимо записать в этот бит нулевое значение.