Index of /EMULATORS/DVKEmulator/HD_DDK

[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory   -  
[   ]HD_DDK.rar 2017-09-29 05:38 1.9M 


Содержимое архива 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, который также не должен быть "забыт" контроллером, если он временно занят и не реагирует немедленно на происходящее на шине.