Index of /EMULATORS/DVKEmulator/HD_DDK
Содержимое архива
HD t1 t2 t3 t4 t5 Driver Distribution Kit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HDv1_SYS.DSK = RT-11 v5.7 + HD.SYS v1.6 ( for HD t1 controler )
HDv2_SYS.DSK = RT-11 v5.7 + HD.SYS v2.0 ( for HD t2 or t3 controler )
HDv3_SYS.DSK = RT-11 v5.7 + HD.SYS v3.0 ( for HD t3 controler )
HDv4_SYS.DSK = RT-11 v5.7 + HD.SYS v4.0 ( for HD t4 or t5 controler )
HDv5_SYS.DSK = RT-11 v5.7 + HD.SYS v5.0 ( for HD t5 controler )
MY80_System.DSK :
HE.SYS = HD.SYS v2.0
HF.SYS = HD.SYS v3.0
HG.SYS = HD.SYS v4.0
HH.SYS = HD.SYS v5.0
http://zx-pk.ru/threads/18351-emulyator-dvk.html?p=929457&viewfull=1#post929457
Устройство HD - варианты контроллеров и драйверов.
Устройство HD
- контроллер, предназначенный для реализации
псевдо-дискового устройства с несколькими приводами, содержимое
носителей в которых - эмулируется файлами на неком общем носителе
( файловой системе ОС хоста программного эмулятора HD, флеш-карте,
подключенной к аппаратному эмулятору HD и т.п. ).
Такой контроллер не требует от драйвера вычисления и передачи ему
номера головки, номера дорожки, номера сектора, а использует входные
параметры драйвера, передаваемые ему операционкой - номер диска,
номер блока, счётчик слов и адрес буфера в памяти. Это значительно
упрощает написание драйвера, особенно потому, что любой запрос операционки
может быть выполнен за одно обращение к устройству. Драйверу не надо,
как в случае (например) с контроллером DW - разбивать крупный запрос
операционки на серию одноблочных запросов к устройству. При записи
неполного блока - контроллер HD сам добивает остаток блока нулями.
Устройство HD может быть реализовано как в программных, так и в аппаратных
проектах, причём как в одном модуле с эмулятором процессора, так и в виде
отдельного контроллера на шине. Это предъявляет к контроллеру противоречивые
требования, которые не могут быть выполнены все в рамках одной архитектуры.
Поэтому существует несколько незначительно отличающихся типов контроллера HD,
как и драйверов, работающих с этими контролерами.
На данный момент существует 5 типов контролера HD ( t1, t2, t3, t4, t5 ) и
5 веток драйверов ( v1, v2, v3, v4, v5 ). Все контроллеры имеют два регистра
на шине PDP-11 : CSR=177720 и DATA=177722 : t3 и t5 также используют вектор
прерывания 0164.
HD t1 останавливает процессор и используют прямую работу с памятью.
HD t2 может останавливать процессор или использовать DMA.
Главное отличие HD t2 от t1 в том, что HD t2 позволяет работать
с образами 32-разрядного размера (в блоках по 512 байт) и использовать
22-разрядные адреса памяти, а HD t1 - поддерживает только 16-разрядные
размеры и адреса. Драйвер v2 одинаково хорошо работает с HD t2 и если
тот останавливает процессор, и если использует DMA, снимая в CSR флаг READY
на время работы.
HD t3 - это t2 с прерываниями. Драйвер v2 работает с HD t3 в режиме без прерываний,
драйвер v3 - с прерываниями.
HD t4 и HD t5 не используют DMA, получая и передавая данные чтения и записи
через регистр данных. HD t4 работает без прерываний ( как MX ), а HD t5 - с
прерываниями ( как DW ). Драйвер v4 может работать c HD t5 без прерываний,
драйвер v5 может работать только с HD t5 по прерываниям.
Старший бит CSR используется в качестве флага ошибки. HD t1 не использует
других битов в CSR. HD t2 ( и последующие ) устанавливает бит 040, если в
текущем приводе смонтирован образ, содержащий более 65535 блоков по 512 байт.
HD t2 использует в CSR бит READY ( 0200 ), что позволяет отличить его от t1.
HD t3 позволяет изменять в CSR бит IE ( 0100 ), в случае установленности
которого генерит прерывание после завершения команд чтения и записи. Установка
бита IE у готового устройства не вызывает прерывание. HD t2 и HD t3 могут работать
с 22-разрядной адресной шиной, поэтому для задания старших битов адреса используются
6 младших битов старшего байта CSR. HD t2 и HD t3 допускают байтовую запись в CSR
для раздельного задания старших битов адреса и кода команды чтения/записи.
HD t4 и HD t5 держат установленным в CSR бит NO.DMA ( 040000 ).
HD t5 позволяет изменять в CSR бит IE ( 0100 ), в случае установленности которого
генерит прерывание после завершения фазы работы с образом в командах чтения и записи.
HD t2 и последующие - после каждой команды ( кроме команды GetUnitSize ) возвращают
в младшем байте регистра данных код завершения команды, а в старшем - текущий номер
привода.
Коды завершения:
Код:
IS_SUC = 0001; // нет ошибки
IE_OFL = 0277; // устройство offline
IE_BLK = 0354; // выход за пределы устройства
IE_WLK = 0364; // попытка записи на защищенное устройство
IE_VER = 0374; // неустранимая ошибка (например bus error)
IE_ABT = 0375; // выполнение прервано
IE_IFC = 0376; // неверная команда
Максимально полный набор команд семейства HD, некоторые из которых работают только
при реализации HD в блоке эмуляции процессора, выглядит так:
Код:
#define HD_CheckUnit 0
#define HD_SetUnit 1
#define HD_SetBlockNum 2
#define HD_SetBlockNumHi 022 // 18
#define HD_SetBufAddr 3
#define HD_SetWordCount 4
#define HD_Read 5
#define HD_Write 6
#define HD_GetUnitSize 7
#define HD_GetBootForUnit0 010 // 8
#define HD_GetUnitSizeHi 027 // 23
#define HD_GetUnitSizeLo 047 // 39
#define HD_ExitEmulator 9
#define HD_SetTempCPUSpeed 10
#define HD_RestoreMainCPUSpeed 11
#define HD_SetSlowCPUSpeed 12
#define HD_Take_RT11_ExitCode 13
#define HD_LoadSeviceROM 020 // 16
#define HD_Ignored_040 040 // 32
Цветом выделены "расширенные" команды, не поддерживаемые HD t1.
Если к выбранному приводу подключен образ 32-разрядного размера
- команда GetUnitSize возвращает размер образа 65535 блоков.
Команды GetUnitSizeHi и GetUnitSizeLo - всегда возвращают старшее
и младшее слово размера ( для образов 16-разрядного размера GetUnitSizeHi
возвращает 0 ). Команда SetBlockNum обнуляет старшее слово номера блока,
поэтому для задания 32-разрядного номера блока должна вызываться перед
командой SetBlockNumHi.
Минимальный набор команд, необходимый для полноценной работы контроллера
с драйвером HD выглядит так:
Код:
SetUni = 1 ; Запомнить содержимое регистра данных в качестве номера привода.
SetBlk = 2 ; Запомнить содержимое регистра данных в качестве номера блока.
SetBuf = 3 ; Запомнить содержимое регистра данных в качестве адреса буфера.
SetWCn = 4 ; Запомнить содержимое регистра данных в качестве счётчика слов.
CmdRea = 5 ; Выполнить чтение
CmdWri = 6 ; Выполнить запись
GetSiz = 7 ; Выдать в регистре данных размер файла образа ( в блоках по 512 байт )
Цветом выделена команда, не поддерживаемая HD t4 и HD t5.
В младшем байте CSR по чтению читаются флаги, а по записи - пишутся коды команд,
поэтому подачу команд в контроллер можно выполнять только командами:
MOV, MOVB, CLR, CLRB. Маска команды 077.
При любой ошибке в ходе выполнения команды - в CSR устанавливается флаг ошибки
( старший бит ), а код ошибки возвращается в младшем байте регистра данных.
Если к заданному номеру привода не подключен образ - после выполнения всех этих
команд ( и до выполнения чтения и записи ) - возвращается IE_OFL.
Если номер блока находится за пределами размера образа в текущем приводе - возвращается IE_BLK.
Если счётчик слов запрашивает доступ за пределы образа в текущем приводе - возвращается IE_BLK, но запоминается переданное значение ( иначе t4 и t5 не будут знать, сколько слов позже передаст драйвер ).
При сбое чтения или записи образа - возвращается IE_VER. Чтение и запись с завышенным счётчиком слов не вызывает ошибки, но осуществляется только для "влезающего" количества слов.
Чтение и запись за пределами образа возвращает ошибку IE_BLK.
При попытке записи в защищённый от записи образ - возвращается IE_WLK.
При зависании шины в режиме DMA - возвращается IE_VER.
Дополнительные команды.
GetBootForUnit0 = 010 ( 8 ) - устанавливает: [ НОМЕР ПРИВОДА = 0 ; НОМЕР БЛОКА = 0 ; АДРЕС БУФЕРА = 0 ; СЧЁТЧИК СЛОВ = 256 ] и выполняет команду чтения.
LoadSeviceROM = 020 ( 16 ) - устанавливает: [ АДРЕС БУФЕРА = 020000 ; СЧЁТЧИК СЛОВ = ROM_Size/2 ] и считывает в буфер контроллера ( для t4 и t5 ) или пересылает в память по адресу 020000 сервисный код контроллера.
ExitEmulator = 011 ( 9 ) - завершает эмуляцию, если последнее значение, записанное в регистр данных = 060434.
SetTempCPUSpeed = 012 ( 10 ) - задаёт последнее значение, записанное в регистр данных - в качестве текущей скорости процессора в KIPS ( тысячах команд в секунду ). Значение 0 - устанавливает максимальную скорость.
RestoreMainCPUSpeed = 013 ( 11 ) - восстанавливает "обычную" скорость процессора, задаваемую как-то помимо HD ( например - переключателями на плате ).
SetSlowCPUSpeed = 014 ( 12 ) - в цикле ожидания операционной системы устанавливает для процессора "режим сна" в целях экономии энергии ( используется в ОС AT-11 ).
Take_RT11_ExitCode = 015 ( 13 ) - при программной эмуляции сохраняет код завершения программы RT-11 для передачи Windows в качестве кода завершения программы эмулятора ( используется в ОС AT-11 ).
Ignored_040 = 040 ( 32 ) - игнорируется контроллером, как и команда CheckUnit ( 000 ). Защищает контроллер от попадания флага 32-разрядного образа ( 040 ) обратно в CSR при выполнении команды BIS #100,@#177720.
HD t1
HD t1 - простейший вариант реализации устройства HD, предназначенный для простых программных, микроконтроллерных
и FPGA эмуляторов микро-ЭВМ типа PDP-11. Главная особенность HD t1 - остановка тактовой частоты процессора на
время выполнения контроллером полученной команды. Это позволяет не беспокоиться о синхронизации работы процессора
и контроллера. Когда процессор получает тактовую частоту - это означает, что контроллер HD находится в режиме
ожидания, а когда контроллер выполняет команду - процессор бездействует. Со стороны программы это выглядит так, что на следующем такте, после загрузки команды чтения в регистр HD - прочитанные данные уже находятся в ОЗУ, а контроллер готов к приёму следующей команды. Может работать только с драйвером ветки v1.
HD t2
HD t2 - в отличие от t1 позволяет работать с образами 32-разрядного размера
(в блоках по 512 байт) и использовать 22-разрядные адреса памяти.
В зависимости от реализации может останавливать процессор на время работы,
как HD t1, или использовать DMA, снимая флаг READY в CSR. При остановке
процессора на время работы - может работать с драйвером v1 или v2, при
использовании DMA - только с драйвером ветки v2. При использовании DMA
- должен досрочно завершать команды чтения и записи при получении по шине
сигнала INIT и при записи в CSR.
HD t3
HD t3 - вариант t2 с поддержкой прерываний. При остановке процессора на время
работы - может работать с драйвером v1, v2 или v3. При использовании DMA -
только с драйверами v2 или v3. Режим работы HD t3 по прерываниям используется
только драйвером v3. При использовании DMA - должен досрочно завершать команды
чтения и записи при получении по шине сигнала INIT и при записи в CSR. Сигнал
INIT должен сбрасывать разрешение прерываний.
HD t4
HD t4 - не использует DMA и не использует прерывания ( как MX ). После подачи
команды записи - контроллер снимает флаг READY ( 0200 ) и в регистр данных нужно
(без каких-либо других обращений) записать количество слов, равное текущему значению
"СЧЁТЧИК СЛОВ", после чего контроллер снимает флаг NO.DMA и выполняет запись.
Завершение записи приводит к установке в CSR флагов READY и NO.DMA. При выполнении
чтения - контроллер снимает флаги READY и NO.DMA ( 040000 ), выполняет обращение
к образу, после чего устанавливает флаг NO.DMA. После этого драйвер должен прочитать
в регистре данных счётчик слов пакета и затем (без каких-либо других обращений)
прочитать это количество слов из регистра данных. В после чтения завершающего слова
пакета - контроллер устанавливает в CSR флаг READY. При получении по шине сигнала INIT
и при записи в CSR во время выполнения команд записи и чтения - фаза обмена данными
прерывается/отменяется ( после записи в CSR - с установкой кода ошибки IE_ABT ).
HD t5
HD t5 - вариант t4 с поддержкой прерываний. Всё как у t4, но сигнал INIT ещё должен
сбрасывать разрешение прерываний. При разрешённых прерываниях они возникают в момент
установки флага NO.DMA в операциях чтения и записи. При работе с контроллером HD
прерывания возникают только в процессе выполнения чтения и записи
( по одному прерыванию на каждую команду чтения/записи с разрешёнными прерываниями ).
...
CSR может быть организован как обычный буферный регистр на шине Q-Bus,
куда контроллер HD записывает флаги и откуда читает команды. Поскольку
драйвер v1 рассчитан на работу с HD t1, который никаких флагов в CSR
не пишет - дальнейшее относится только к драйверам и контроллерам
"продвинутых версий". Взаимодействие драйверов с регистром CSR основано
на допущении, что команда CLR @#HDCSR может стереть из CSR все флаги,
но если контроллер не занят выполнением записи или чтения - он воспримет
очистку CSR как команду CheckUnit и восстановит все флаги до следующего
обращения драйвера к CSR.
Поэтому все драйверы HD ( кроме v1 ) начинаются так:
Код:
;
; I/O request entry point.
;
.DrBeg HD
1$:
Mov #HD$CSR, R3
Clr (R3) ; Reset controller if READ not completed
TstB (R3) ; Device READY ?
BPl 1$ ; No - Wait
Однако, "записываемость" флагов в CSR со стороны драйвера не является требованием,
наоборот - драйверы написаны так, чтобы одинаково работать и при записываемых и при
не записываемых флагах CSR. Если флаги CSR могут быть "незаконно" обнулены драйвером
- контроллер должен их восстанавливать только в двух случаях:
1) при установке флага READY
(т.е. после завершения выполнения любой команды, включая команду 000 );
2) когда значение флага должно измениться по логике работы контроллера.
Если операционка перед аварийной выгрузкой драйвера вызывает его в точке аборта -
драйвер выполняет команду CLR @#HDCSR. Занятый контроллер, когда освободится -
должен быть в состоянии обнаружить факт записи в CSR, чтобы отменить передачу
прочитанных данных в ОЗУ по ДМА ( для t2 и t3 ) или отменить фазу выгрузки данных
через регистр данных ( для t4 и t5 ). Монитор RT11SJ не вызывает драйвер в точке
аборта, выдавая вместо этого на шину сигнал INIT, который также не должен быть
"забыт" контроллером, если он временно занят и не реагирует немедленно на
происходящее на шине.