Сообщение от
Impartial
В регистре HDCSR = 0177720 используются только биты 0,1,2,15 или есть еще какие то биты управления? Что является признаком начала выполнения операции? Просто запись в этот регистр?
Все ответы содержит исходник драйвера HD.MAC
Код:
;
; HD command codes (for HD command reg: 177720 )
;
SetUni = 1 ; Set HD unit number
SetBlk = 2 ; Set HD block number
SetBuf = 3 ; Set memory buffer address
SetWCn = 4 ; Set operation word count
CmdRea = 5 ; Execute READ on HD
CmdWri = 6 ; Execute WRITE on HD
GetSiz = 7 ; Get HD size in blocks.
;
; I/O request entry point.
;
.DrBeg HD
Mov HDCQE, R4 ; R4 -> Queue element
Mov (R4)+, R2 ; R2 = Block number
MovB (R4)+, R1 ; R1 = SpFun code
BNe SPFUN ; Is it SpFun call?
MovB (R4)+, R1 ; R1 = Unit number
BiC #^c7, R1 ; Force it to be 0..7
Mov R1, @#HD$CSR+2 ;
Mov #SetUni, @#HD$CSR ; Select unit for operations.
Tst @#HD$CSR ; Valid unit number?
BMi HDERR ; No - Error!
Mov R2, @#HD$CSR+2 ;
Mov #SetBlk, @#HD$CSR ; Set block number.
Tst @#HD$CSR ; Valid?
BPl 3$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - return EOF
Br DONE ;
3$:
Mov (R4)+, @#HD$CSR+2 ;
Mov #SetBuf, @#HD$CSR ; Set buf addr
Mov (R4), R1 ; R1 = word count
BEq DONE ; R1 = 0 - Nothing to do
BPl HDREAD ; > 0 - Read
EMWRIT: ; < 0 - Write
Neg R1 ; Get true word count
Mov R1, @#HD$CSR+2 ; ...
Mov #SetWCn, @#HD$CSR ; and set it.
Tst @#HD$CSR ; Valid?
BPl 4$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - set EOF bit
4$:
Mov #CmdWri, @#HD$CSR ; Make Write to HD
Br CHECK ; OK?
HDREAD:
Mov R1, @#HD$CSR+2 ;
Mov #SetWCn, @#HD$CSR ; Set word count
Tst @#HD$CSR ; Valid?
BPl 5$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - set EOF bit
5$:
Mov #CmdRea, @#HD$CSR ; Make Read from HD
CHECK:
Tst @#HD$CSR ; Error?
BPl DONE ; No - OK
; Else - abort
EMINT:
HDINT:
HDERR:
Mov HDCQE, R4 ;
BiS #HDERR$, @-(R4) ; Set ERROR bit in CSW.
DONE:
.DRFIN HD
Т.е. в регистре HDCSR = 0177720 используются только биты 0,1,2,15, а признаком начала выполнения операции является просто запись в регистр.
Из текста драйвера также можно извлечь информацию об одном довольно тонком моменте. Если операционная система запрашивает установку позиции чтения/записи в пределах образа диска, но запрашивает чтение/запись большего числа слов, чем остаётся до конца образа - то драйвер, получив от эмулятора признак ошибки в ответ на команду установки счётчика слов - всё же выполняет чтение/запись, чтобы прочитать/записать те слова, которые расположены в образе между установленной позицией чтения/записи и концом образа.
Т.е. эмулятор, получив слишком большой счётчик слов будущей операции - должен не только сообщить об ошибке, но и установить свой внутренний счётчик слов чтения/записи на максимально допустимое значение.