
Сообщение от
Jarik65535
записываем в CSR код операции, затем в регистр данных пишем последовательно номер тома, номер блока, кол-во блоков, затем собственно пишем или читаем данные, причем постоянно проверяем бит готовности в CSR перед каждым обращением к регистру.
Да, драйвер HX так и работает, только при чтении система может запросить не целый блок, а только одно слово, поэтому в операции сообщается не количество блоков для передачи, а количество байтов.
Код:
Mov #"CW, R0 ; Packet type = COMMAND ; Command = Cmd_WRITE_RAW
Call WOs
Mov R3, R0 ; Unit
Call ChOs
Mov R2, R0 ; Block
Call WOs
Clr R0
Call WOs ; 16bit Block -> 32bit Block
Mov R1, R0 ; ByteCount
Add (SP), R0 ; R0 = ByteCount + fill count
Call WOs
1$:
.IF EQ MMG$T
MovB (R5)+, R0
.IFF
Call @$GTBYT
Mov (SP)+, R0
.EndC
Call ChOs
SOB R1, 1$
Mov (SP)+, R1 ; R1 = Bytes to fill
BEq SkipFill ; Skip fill on full blocks
Clr R0
4$:
Call ChOs
SOB R1, 4$
SkipFill:

Сообщение от
Jarik65535
Может кто знает, что приходит на вход драйвера в RT-11?
Код:
Mov HXCQE, R4 ; R4 -> Queue element
Mov (R4)+, R2 ; R2 = Block number
MovB (R4)+, R1 ; R1 = SpFun code
MovB (R4)+, R3 ; R3 = Unit number
BiC #^c7, R3 ; Force it to be 0..7
Tst R1
BNE SPFUN ; Is it SpFun call?
Mov (R4)+, R5 ; R5 = buf addr
Mov (R4), R1 ; R1 = word count
Tst R1
BEq DONE ; R1 = 0 - Nothing to do
BPl HXREAD ; > 0 - Read
; < 0 - Write
Call HX.Write ; Make Write to HX
Br CHECK ; OK?
HXREAD: ; Make Read from HX
Call HX.Read
CHECK: ; Error?
BCC DONE ; No - OK
; Else - abort
HXINT:
HXERR:
Mov HXCQE, R4 ;
BiS #HDERR$, @-(R4) ; Set ERROR bit in CSW.