RT-11 может быть загружена четырьмя различными способами. Ну или по крайне мере я знаю 4 способа. И то, что она загружается некоторыми из них - не значит, что она загрузится другими... Исправил и протестировал.
Вид для печати
RT-11 может быть загружена четырьмя различными способами. Ну или по крайне мере я знаю 4 способа. И то, что она загружается некоторыми из них - не значит, что она загрузится другими... Исправил и протестировал.
Доделал поддержку 64 устройств
Чего пока не получится - отладить в драйвере обработку ошибок чтения-записи - нету у мну таких карт.
Поэтому просьба к сообществу :)
Если у кого то есть работоспособные в принципе, но сбоящие на каких то секторах при чтении-записи CF карты - приму в дар или за символическую плату :) Это поможет улучшить качество драйверов.
Доставка, ессссвенно, за мой счёт :)
XM драйвер сопротивляется. Ну, опыт поиска своих ошибок богатый... :)
- - - Добавлено - - -
YES!!!!!!!
- - - Добавлено - - -
- - - Добавлено - - -Код:.SHO ALL
RT-11XM (S) V05.07
Booted from ZF5:RT11XM
22 bit addressing is on
USR is set NOSWAP
EXIT is set SWAP
KMON is set NOIND
RUN is set NOVBGEXE
MODE is set NOSJ
TT is set NOQUIET
ERROR is set ERROR
SL is set OFF
EDIT is set KEX
FORTRAN is set FORTRA
KMON nesting depth is 3
CLI is set DCL, CCL, UCL, NO UCF
PDP 11/34 Processor
3840KB of memory
Extended Instruction Set (EIS)
Memory Management Unit
50 Hertz System Clock
Device I/O time-out support
Extended unit support
UNIBUS mapping unavailable
Device Status CSR Vector(s)
------ ------ --- ---------
LD Installed 000000 000
VM Installed 177572 000
NL Installed 000000 000
ZF Resident 161014 350
TT (Resident)
ZF (Resident)
ZF5 = DK , SY
MQ (Resident)
LD
VM
NL
6 free slots
Job Name Console Level State Low High Impure
--- ---- ------- ----- ----- --- ---- ------
0 RESORC 0 0 Run 000000 106430 122142
No multi-terminal support
------- Extended Memory --------
Address Module Words Type
------- ------ ----- ----
17760000 IOPAGE 4096. PRM HDW BYP
17000000 MEMTOP
00760000 VM 1839104. SHR
00161200 ...... 97984.
00160000 MCA 320. PRM
00000000 KERNEL 28672. PRM HDW
------ Low Memory -------
Address Module Words
------- ------ -----
157122 ZF 215.
120474 RMON 7819.
106432 USR 2577.
001000 ..BG.. 17805.
No LD units mounted
.
Ну и для полноты картинку второй XM монитор
- - - Добавлено - - -Код:.SHO ALL
RT-11XB (S) V05.07
Booted from ZF5:RT11XB
22 bit addressing is on
USR is set NOSWAP
EXIT is set SWAP
KMON is set NOIND
RUN is set NOVBGEXE
MODE is set NOSJ
TT is set NOQUIET
ERROR is set ERROR
SL is set OFF
EDIT is set KEX
FORTRAN is set FORTRA
KMON nesting depth is 3
CLI is set DCL, CCL, UCL, NO UCF
PDP 11/34 Processor
3840KB of memory
Extended Instruction Set (EIS)
Memory Management Unit
50 Hertz System Clock
Device I/O time-out support
Extended unit support
UNIBUS mapping unavailable
Device Status CSR Vector(s)
------ ------ --- ---------
LD Installed 000000 000
VM Installed 177572 000
NL Installed 000000 000
ZF Resident 161014 350
TT (Resident)
ZF (Resident)
ZF5 = DK , SY
LD
VM
NL
6 free slots
Job Name Console Level State Low High Impure
--- ---- ------- ----- ----- --- ---- ------
0 RESORC 0 0 Run 000000 113070 126466
No multi-terminal support
------- Extended Memory --------
Address Module Words Type
------- ------ ----- ----
17760000 IOPAGE 4096. PRM HDW BYP
17000000 MEMTOP
00760000 VM 1839104. SHR
00160500 ...... 98144.
00160000 MCA 160. PRM
00000000 KERNEL 28672. PRM HDW
------ Low Memory -------
Address Module Words
------- ------ -----
157162 ZF 199.
125134 RMON 6667.
113072 USR 2577.
001000 ..BG.. 18973.
No LD units mounted
.
А так же
- - - Добавлено - - -Код:.DIR Z77:
20-May-2019
SWAP .SYS 28P 31-Oct-1998 RT11SB.SYS 99 03-May-2019
RT11FB.SYS 106 03-May-2019 LD .SYS 11 03-May-2019
VM .SYS 3 03-May-2019 NL .SYS 2 03-May-2019
LP .SYS 2 03-May-2019 SL .SYS 17P 31-Oct-1998
PIP .SAV 30P 31-Oct-1998 DUP .SAV 52P 31-Oct-1998
DIR .SAV 20P 31-Oct-1998 IND .SAV 58P 31-Oct-1998
RESORC.SAV 35P 31-Oct-1998 EDIT .SAV 19P 31-Oct-1998
KED .SAV 85P 31-Oct-1998 KEX .SAV 72P 31-Oct-1998
MACRO .SAV 63P 31-Oct-1998 CREF .SAV 6P 31-Oct-1998
LINK .SAV 59P 31-Oct-1998 MONMRG.SAV 14P 31-Oct-1998
LIBR .SAV 24P 31-Oct-1998 FILEX .SAV 22P 31-Oct-1998
SRCCOM.SAV 26P 31-Oct-1998 BINCOM.SAV 25P 31-Oct-1998
SLP .SAV 13P 31-Oct-1998 DUMP .SAV 10P 31-Oct-1998
SIPP .SAV 21P 31-Oct-1998 BUP .SAV 68P 31-Oct-1998
PAT .SAV 11P 31-Oct-1998 HELP .SAV 161P 31-Oct-1998
SYSMAC.SML 92P 31-Oct-1998 SYSLIB.OBJ 84P 31-Oct-1998
SETUP .SAV 43P 31-Oct-1998 VTCOM .SAV 24P 31-Oct-1998
DATIME.SAV 4P 31-Oct-1998 DATIME.MAC 23P 31-Oct-1998
DATIME.COM 3P 31-Oct-1998 LET .SAV 6P 31-Oct-1998
SPLIT .SAV 3P 31-Oct-1998 UCL .SAV 16P 31-Oct-1998
VBGEXE.SAV 18P 31-Oct-1998 TERMID.SAV 4P 31-Oct-1998
TRANSF.SAV 16P 31-Oct-1998 TRANSF.TSK 76P 31-Oct-1998
TRANSF.EXE 45P 31-Oct-1998 ODT .OBJ 8P 31-Oct-1998
VDT .OBJ 8P 31-Oct-1998 MDUP .SAV 22P 31-Oct-1998
MBOOT .BOT 1P 31-Oct-1998 MBOT16.BOT 1P 31-Oct-1998
MSBOOT.BOT 4P 31-Oct-1998 MDUP .AI 72P 31-Oct-1998
MDUP .MM 72P 31-Oct-1998 MDUP .MS 72P 31-Oct-1998
MDUP .MT 72P 31-Oct-1998 MDUP .MU 72P 31-Oct-1998
SYSTEM.MLB 148P 31-Oct-1998 EDTL .MLB 11P 31-Oct-1998
MSCPCK.SAV 4P 31-Oct-1998 DBGSYM.SAV 10P 31-Oct-1998
SANS01.CND 4 03-May-2019 SSS .COM 1 03-May-2019
SANS01.ANS 8 03-May-2019 SANS01.BLD 3 03-May-2019
SANS01.MON 5 03-May-2019 SANS01.DEV 4 03-May-2019
SANS01.TBL 5 03-May-2019 RT11SB.MAP 34 03-May-2019
RT11FB.MAP 35 03-May-2019 ZF .SYS 4 19-May-2019
70 Files, 2299 Blocks
63167 Free blocks
.
Для RT осталось сделать работу по прерываниям.
Слегка оптимизировал код
До конца работу по прерываниям не добил, но весьма продвинулся. Сама система уже грузится, а вот программы пока нет. Вроде как слетает на запросах с длиной больше одного сектора - специфичность работы контроллера CF сказывается, надо подобрать правильную последовательность команд для него
YES!!!!!!!! Работа по прерываниям!!
Не фига там не специфичность работы CF :) Внимательное чтение документации :) Ну и как обычно - второй подход к тому, что не взлетело (или взлетело но без понимания как) у меня обычно успешен :) Не до конца разобрался с WQ (спасибо "отцам-основателям" за сокрытие улик), зато добил вопрос с ZF :)
Теперь смогу переделать и драйвер WQ. Когда и если восстановлю работу контроллера - что не есть стопроцентно :)
Из технического долга - ускорение работы карты, но это не сейчас.
Следующий на очереди - драйвер под RSX+.
Хотя на самом деле тесты погоняю в RT :)
- - - Добавлено - - -
Ну... на самом деле некоторые особенности в работе карты для архитектуры PDP-11 есть - всё таки не DEC-овское изделие :) Например, ответ со стороны процессора на запрос прерывания не снимает автоматом запрос на прерывание со стороны карты :) И после начала обработки (или продолжения обработки) команды картой некоторое время, вроде как, лучше к её регистрам не лезть. Некоторое количество команд процессора :)
- - - Добавлено - - -
Текущая скорость работы
- - - Добавлено - - -Код:@ 173000
@$6/003405 10000
@B
$ZF0
SL V08.00 [SW] Сторожевых С.В. 1988
RT-11SB (Y) V05.07
.SET TT FORM
.SET TT SCOPE
.SET EDIT K52
.@COPXM
.COPY ZFXT.SYS ZF5:ZFX.SYS
.BOO ZF5:RT11XM
RT-11XM (S) V05.07
?KMON-F-File not found DK:STRTXM.COM
.COP/BOO RT11XM SY:
.TIM 20:55
.DAT 21-MAY-2019
.BOO SY:
RT-11XM (S) V05.07
?KMON-F-File not found DK:STRTXM.COM
.TIM
20:55:14
.@TESTZF
.TIME
20:55:21
.COPY/DEVICE/VERIFY/NOQUERY SY: Z77:
.TIM
21:13:33
.BOO RT11SB
RT-11SB (S) V05.07
?KMON-F-File not found DK:STRTSB.COM
.TIM
21:28:22
.@TESTZF
.TIME
21:28:30
.COPY/DEVICE/VERIFY/NOQUERY SY: Z77:
.TIM
21:43:37
.BOO RT11FB
RT-11FB (S) V05.07
?KMON-F-File not found DK:STRTFB.COM
.@TESTZX
?KMON-F-File not found DK:TESTZX.COM
.@TESTZF
.TIME
21:44:17
.COPY/DEVICE/VERIFY/NOQUERY SY: Z77:
.TIM
21:59:24
.
Размер драйвера (причёсывать ещё есть куда)
Одно из приятных отличий платы от МС1201.01-04 - адресуемый регистр линейных часов - можно не жать кнопку таймер :)Код:.TIM
21:59:24
.BOO RT11SB
RT-11SB (S) V05.07
?KMON-F-File not found DK:STRTSB.COM
.SHO MEM
Address Module Words
------- ------ -----
160000 IOPAGE 4096.
157250 ZF 172.
136142 RMON 4387.
001000 ..BG.. 23857.
.BOO RT11FB
RT-11FB (S) V05.07
?KMON-F-File not found DK:STRTFB.COM
.SHO MEM
Address Module Words
------- ------ -----
160000 IOPAGE 4096.
157210 ZF 188.
132270 RMON 5352.
001000 ..BG.. 22876.
.BOO RT11XB
RT-11XB (S) V05.07
?KMON-F-File not found DK:STRTXB.COM
.SHO MEM
------- Extended Memory --------
Address Module Words Type
------- ------ ----- ----
17760000 IOPAGE 4096. PRM HDW BYP
17000000 MEMTOP
00760000 VM 1839104. SHR
00173100 ...... 95456.
00160500 SL 2688. PVT
00160000 MCA 160. PRM
00000000 KERNEL 28672. PRM HDW
------ Low Memory -------
Address Module Words
------- ------ -----
157122 ZF 215.
125074 RMON 6667.
113032 USR 2577.
001000 ..BG.. 18957.
.BOO RT11XM
RT-11XM (S) V05.07
?KMON-F-File not found DK:STRTXM.COM
.SHO MEM
------- Extended Memory --------
Address Module Words Type
------- ------ ----- ----
17760000 IOPAGE 4096. PRM HDW BYP
17000000 MEMTOP
00760000 VM 1839104. SHR
00173600 ...... 95296.
00161200 SL 2688. PVT
00160000 MCA 320. PRM
00000000 KERNEL 28672. PRM HDW
------ Low Memory -------
Address Module Words
------- ------ -----
157062 ZF 231.
120434 RMON 7819.
106372 USR 2577.
001000 ..BG.. 17789.
.
- - - Добавлено - - -
Ну это не считая PC-шного COM-порта :)
- - - Добавлено - - -
Даааа... До размера VM ещё есть куда уменьшать :)
Код:
.SHO MEM
------- Extended Memory --------
Address Module Words Type
------- ------ ----- ----
17760000 IOPAGE 4096. PRM HDW BYP
17000000 MEMTOP
00760000 VM 1839104. SHR
00173600 ...... 95296.
00161200 SL 2688. PVT
00160000 MCA 320. PRM
00000000 KERNEL 28672. PRM HDW
------ Low Memory -------
Address Module Words
------- ------ -----
157524 VM 86.
121076 RMON 7819.
107034 USR 2577.
001000 ..BG.. 17934.
.
Ждем WQ! И RSX для. Может тогда и для BSD2.11 кто-нибудь осилит..
WQ вряд ли буду доделывать - смысла нет. А вот распотрошить и переделать под вариант, аналогичный ZF - возможно.
Потихоньку двигаюсь с драйвером для RSX.
Есть какая то ошибка (RSX вылетает в "голубой экран"), Квант-е стоит не совсем удобно, поэтому решил написать (точнее поправить под ZF и дописать) запускаемую из под RT программу, которая прогрузит образ RSX - это позволит работать так же, как с драйверами RT - я за рабочим компом, плата передо мной :)
Отлаживается драйвер под RSX несколько сложней, но... мы не привыкли отступать :) Так же в драйвер будет добавлено разбиение карты на секции, только секции будут не по 32 мб, а побольше. Поиграюсь с вариантами 256-512-1024 мб, посмотрю, какой окажется оптимальней. Пока склоняюсь к 512. Это позволит иметь 256 дисков на 128 гиговой карте :):):) Так же драйвер при инициализации будет определять размер карты и подкорректировать доступность дисков (в идеале - делать количество дисков под размер карты - но это если получится)
В силу того, что RSX исходно и гибко использует всю доступную память, проблема размера драйвера не стоит так остро, как в RT :)
а только с терминалом и драйверами типа HX без прерываний может ?
а только с терминалом и драйверами типа HX без прерываний может ?
- - - Добавлено - - -
т.е. никакой монитор RT, никакой версии - без прерываний не работает ?
А ТМОС ?
Внезапно - процессора семейства PDP-11 вообще без прерываний не работают - ибо помимо асинхронных прерываний есть ещё и синхронные и ОС (или безОСёвая программа) не должны надеяться, что они не возникнут.
Я не настолько знаком с ней, что бы однозначно сказать про асинхронные (хотя подозреваю, что используются - у DEC и в очень древних ОС они используются), но синхронные - я про них уже написал выше.
А вообще это вопросы ранга RTFM
я не про программные прерывания, а про аппаратные от внешних (по отношению к процессору) устройств.
ответил - это когда тот, кто задавал вопрос понял о чем спрашивал.
Вопрос не праздный. Если делать свою минимальную реализацию железа, то для того, что бы заработала RT-11 (с загрузкой через терминальную линию), какие минимальные условия надо соблюсти ? Обязательно ли заводить прерывания от терминальной линии, обязательно ли от таймера ?
Может это можно как-то обойти при генерации какой-то версии и какого-то монитора ?
Сколько требуется по минимуму памяти (в каких случаях)?
Есть стандарт архитектуры, если следовать ему - всё работает. Хотящие странного - берут доки, берут исходники и изучают. Меня это не интересовало, поэтому всё, что я мог - написАл. Когда у меня что то не идёт или надо что то реализовать - беру доки, беру исходники - вдумчиво курю. Этот способ меня НИКОГДА не подводил. Другие способы (включая - может кто то ответит), как показывает практика - результат не гарантируют.
Если спрашивающий не понимает своего вопроса - он никогда не получит понятный ему ответ
Вы пишите драйвер CF для RSX. А почему не выкладываете то, что пишите ? Может кто-то что-то подскажет, может кто-то научится чему-то у Вас.
Кстати, драйвер RSX для контроллера винчестера от ДВК написали ?
Платы в общем доступе нет, прошивка дорабатывается, возможны изменения драйвера. Будет готово - будет выложена. И прошивку ПЗУ и драйвера под RT и RSX
У нас так много пишущих драйвера под RT, а особенно под RSX?
Готовых драйвером (и простых и сложных) - и в RT и в RSX навалом. Как и наличие документации. Кому то помогло?
Больше 25 лет назад - в 93 году - почитайте тему Оживление Квант 4С
Каком таком?
MWDRV.MAC
MWTAB.MACКод:.TITLE MWDRV
.IDENT /01/
.LIST ME
.LIST BEX
.NLIST CND
.NLIST TTM
;
; DVK mini winchester controller driver
;
; MACRO library calls
;
M$$W11=2
LD$MW=1
VC$MW=0
.MCALL PKTDF$
.MCALL KRBDF$,UCBDF$
PKTDF$ ; Define i/o packet offsets
KRBDF$
UCBDF$
.MACRO DB REPT
.REPT 'REPT'
.WORD 0
.ENDR
.ENDM DB
.MACRO PATCH REPT
; .REPT 'REPT'
; NOP
; .ENDR
.ENDM PATCH
;
; Equated symbols
;
RETRY=2. ; Error retry count
MWID=-20
MW$ID=401
MWPRE=-14
MWERR=-14
ER.SNF=400
ER.TR0=1000
ER.GFL=2000
ER.HNF=10000
ER.ACR=20000
ER.DCR=40000
MWREV=-12
MWSEC=-12
MWRD=-10
MWCYL=-6
MWTRK=-4
MWCSR2=-2
HSEEK= 20
READ= 40
WRITE= 60
FORMAT=120
S2.ERR=400
S2.DRQ=4000
S2.SEK=10000
S2.WRF=20000
S2.DWY=40000
MWCSR=0
ST.OPN= 1
ST.INIT=10
ST.IE= 100
ST.DRQ= 200
ST.DCP= 4000
ST.BUSY=100000
;
; Local data
;
; Controller impure data tables (indexed by controller number)
;
;
; Diagnostic function code table
;
FUNTBL: .WORD IO.HMS!IQ.UMD, 20
.WORD IO.WDH!IQ.UMD, 120
FUNTBE:
.IF DF R$$MPL
S.VCTM=-1
S.VITM=-1
S.VKRB=-1
S.VPKT=-1
S.VSTS=-1
S.VST2=-1
EXEVEC: .WORD 0 ; Vector yet not filled
SCTM: .WORD S.CTM
SITM: .WORD S.ITM
SKRB: .WORD S.KRB
SPKT: .WORD S.PKT
SSTS: .WORD S.STS
SST2: .WORD S.ST2
BLKC2: .WORD $BLKC2
BMSET: .WORD $BMSET
CRPAS: .WORD $CRPAS
CVLBN: .WORD $CVLBN
DTOER: .WORD $DTOER
DVERR: .WORD $DVERR
FORK: .WORD $FORK
GTPKT: .WORD $GTPKT
IODON: .WORD $IODON
KISR6: .WORD KISAR6
RLCN: .WORD $RLCN
RQCND: .WORD $RQCND
VOLVD: .WORD $VOLVD
EXEVCL=<<<.-EXEVEC>/2>-1>
SCBPAT: .WORD CTM1,SCTM
.WORD ITM1,SITM
.WORD RKRB1,SKRB
.WORD KRB1,SKRB
.WORD KRB2,SKRB
.WORD KRB3,SKRB
.WORD KRB4,SKRB
.WORD KRB5,SKRB
.WORD PKT1,SPKT
.WORD PKT2,SPKT
.WORD PKT3,SPKT
.WORD PKT4,SPKT
.WORD STS1,SSTS
.WORD RST21,SST2
.WORD 0
.ENDC ;DF R$$MPL
RTTBL: DB M$$W11 ; Error retry count and positioning flag
;
; Driver dispatch table
;
DDT$ MW,M$$W11,NEW=Y,OPT=Y ; Generate dispatch table
;+
; ** - MWINI - Controller initiator
;
; This routine is entered from the queue I/O directive when an I/O request
; is queued and at the end of a previous I/O operation to propagate the ini-
; tion of the driver. If the specified controller is not busy, then an attempt
; is made to dequeue the next I/O request. Else a return to the caller is
; executed. If the dequeue attempt is successful, then the next I/O operation
; is initiated. A return to the caller is then executed.
;
; Inputs:
;
; R5=address of the UCB of the controller to be initiated.
;
; Outputs:
;
; If the specified controller is not busy and an I/O request is waiting
; to be processed, then the request is dequeued and the I/O operation
; is initiated.
;-
.ENABL LSB
MWINI: NOP ; OR BPT - CALL XDT - for debug only
GTPKT$ MW,M$$W11 ; Get next i/o packet to process
;
; The following arguments are returned by $GTPKT:
;
; R1=address of the I/O request packet.
; R2=physical unit number of the request UCB.
; R3=controller index.
; R4=address of the status control block.
; R5=address of the UCB of the controller to be initiated.
;
; Controller I/O request packet format:
;
; WD. 00 -- I/O queue thread word.
; WD. 01 -- request priority, event flag number.
; WD. 02 -- address of the tcb of the requestor task.
; WD. 03 -- pointer to second lun word in requestor task header.
; WD. 04 -- contents of the first lun word in requestor task heade
; WD. 05 -- I/O function code (IO.RLB or IO.WLB).
; WD. 06 -- virtual address of I/O status block.
; WD. 07 -- relocation bias of I/O status block.
; WD. 10 -- I/O status block address (real or displacement + 14000
; WD. 11 -- virtual address of AST service routine.
; WD. 12 -- relocation bias of buffer address
; WD. 13 -- buffer address of I/O transfer.
; WD. 14 -- number of bytes to be transfered.
; WD. 15 -- not used.
; WD. 16 -- cylinder
; WD. 17 -- sector in low and track in high byte of word
; WD. 20 -- relocation bias of diagnostic reg. adrs else not used
; WD. 21 -- diagnostic reg. blk adrs (real or displ.+140000)
;
PATCH 5
CALL @RQCND ; Request controller for data transfer
MOV S.VPKT(R4),R1 ; Retreive I/O packet address
PKT1=.-2
MOV S.VKRB(R4),R3 ; Retrieve address of KRB
KRB1=.-2
MOVB K.CON(R3),R3 ; Retrieve controller index
CALL @VOLVD ; Validate volume valid
BCS 50$ ; If CS we failed (JMP 200$ THRU 50$:)
TST R0 ; Transfer function?
BMI 10$ ; If MI yes
TST I.PRM+2(R1) ; Size the disk?
BPL 50$ ; If PL no (JMP 200$ THRU 50$:)
MOV @S.VKRB(R4),R2 ; RETREIVE CSR ADDRESS
KRB2=.-2
CALL MWWAIT ;
MOV #IS.SUC&377, R0
CLR U.CNT(R5)
JMP 220$ ; and exit
10$: ; Ref label
PATCH 3
MOV #RETRY&377,RTTBL(R3) ; Clear recal flag and set retries
CLC ; Convert
ROR U.CNT(R5) ; to word count
PATCH 5
CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ; DIAGNOSTIC FUNCTION?
BNE 40$ ; IF NE NO
MOV #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLE
20$: CMP (R0)+,I.FCN(R1) ; FUNCTION CODE MATCH?
BEQ 30$ ; IF EQ YES
TST (R0)+ ; BYPASS CONTROLLER CODE
CMP #FUNTBE,R0 ; END OF FUNCTION TABLE?
BEQ 40$ ; IF EQ YES
BR 20$ ; TRY AGAIN
30$: MOV (R0),U.BUF(R5) ; SET CONTROLLER FUNCTION BITS
BR 70$ ; GO CHECK LOGICAL BLOCK NUMBER
40$: MOV #IE.IFC&377,R0 ; ASSUME ILLEGAL FUNCTION
MOV #READ,U.BUF(R5) ; ASSUME READ LOGICAL FUNCTION
CMPB #IO.RLB/256.,I.FCN+1(R1) ; READ LOGICAL FUNCTION?
BHIS 60$ ; IF HIS FUNCTION IS LEGAL
50$: JMP 200$ ; FUNCTION IS ILLEGAL
60$: BEQ 70$ ; IF EQ FUNCTION WAS READ
; CONVERT TO WRITE LOGICAL FUNCTION
ADD #WRITE-READ, U.BUF(R5)
70$:
PATCH 3
;
; INITIATE I/O OPERATION
;
MWLOOP:
PATCH 5
MOV @S.VKRB(R4),R2 ; GET ADDRESS OF CSR
KRB3=.-2
MOV S.VPKT(R4),R1 ; RETRIEVE ADDRESS OF I/O REQUEST PACKET
PKT2=.-2
MOVB S.VITM(R4),S.VCTM(R4) ; SET CURRENT DEVICE TIMEOUT COUNT
ITM1=.-4
CTM1=.-2
CALL MWWAIT ;
MOV I.PRM+10(R1), MWCYL(R2) ; INSERT CYLINDER ADDRESS
MOVB I.PRM+13(R1), MWTRK(R2) ; INSERT TRACK ADDRESS
MOVB I.PRM+12(R1), R0
INC R0
BIC #^C<17>, R0
MOVB R0, MWSEC(R2) ; INSERT SECTOR ADDRESS
;
; On REAL ДВК set write predcompensation
;
CMP U.BUF(R5), #WRITE
BNE 80$
MOV #360./4, MWPRE(R2)
80$:
MOV U.BUF(R5), MWCSR2(R2) ; LOAD FUNCTION AND GO
CMP U.BUF(R5), #WRITE
BNE 90$
CALL LOAD
90$:
CALL @BMSET
BIS #ST.IE, (R2)
BMI 100$
BIC #ST.IE, (R2)
CALL @(SP)+
BR 110$
100$: RETURN
;+
; CANCEL i/o OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.
;-
MWCAN: ;;;NOP FOR MW
;+
; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND
; CAUSES NO IMMEDIATE ACTION ON THE UNIT.
;-
MWPWF:
RETURN
;+
; **-$MWINT-CONTROLLER INTERRUPTS
;-
INTSE$ MW,PR4,M$$W11 ;;;SAVE REGISTERS AND SET PRIORITY
PATCH 5
MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB
MOV @S.VKRB(R4),R4 ;;;GET ADDRESS OF CSR
KRB4=.-2
BIC #ST.IE,(R4) ;;;CLEAR INTERRUPT ENABLE
CALL @FORK ;;;CREATE A SYSTEM PROCESS
PATCH 5
MOV R4,R2 ;COPY ADDRESS OF CSR
MOV U.SCB(R5),R4 ;RETRIEVE ADDRESS OF SCB
MOV S.VKRB(R4),R3 ;RETRIEVE ADDRESS OF KRB
KRB5=.-2
MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX
MOV S.VPKT(R4),R1 ;GET i/o PACKET ADDRESS
PKT3=.-2
110$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER
BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?
BNE 220$ ;IF NE YES
PATCH 5
BIT #S2.ERR, MWCSR2(R2) ; Any errors ?
BEQ 150$ ; Branch, if no
CALL @DVERR ; Log device error
CALL FLUSH
120$: BITB #IQ.X,I.FCN(R1) ; Inhibit retries ?
BNE 180$ ; Branch, if yes
130$: DECB RTTBL(R3) ; Any more retries ?
BLE 180$ ; Branch, if no
140$: JMP MWLOOP ; Retry entire operation
150$:
PATCH 5
BITB #IO.WLC&377,I.FCN(R1) ; Write followed by write check ?
BNE 170$ ; Branch, if yes
BITB #US.WCK,U.STS(R5) ; Write check enabled by MCR?
BEQ 170$ ; Branch, if no
160$: CMPB U.BUF(R5), #WRITE ; Write function ?
BNE 170$ ; Branch, if no
; BIS #2*2,U.BUF(R5) ; Set write check function
; BIT #2*2,R1 ; Was last function a write check ?
; BNE 170$ ; Branch, if yes
; MOV #RETRY&377,RTTBL(R3) ; Reinitialize retry count
; BR 140$ ; Start write check operation
170$: CMPB U.BUF(R5), #READ
BNE 172$
CALL UNLOAD
172$:
ADD #256.*2/100, I.PRM(R1) ; Adjust KISAR6 value
SUB #256., U.CNT(R5) ; Yet one sector
BHI 175$ ; Branch, if request not sutisfied
CLR U.CNT(R5) ; All request
BR 190$
175$:
PATCH 5
; HALT ; !!!!!!
INCB I.PRM+12(R1) ; Next sector
BICB #^C<17>, I.PRM+12(R1) ; Up to 16. (fixed) sectors on track
BNE 140$ ; Branch, if not sector #0
INCB I.PRM+13(R1) ; Next track
CMPB I.PRM+13(R1),U.PRM+1(R5); Max head
BLO 140$
CLRB I.PRM+13(R1) ; Zero header
INC I.PRM+10(R1) ; Next cylinder
BR 140$
180$:
MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR
CLR R1
BR 200$
190$: MOV I.PRM+4(R1), R1
CLC
ROL U.CNT(R5)
SUB U.CNT(R5), R1 ; CALCULATE BYTES ACTUALLY TRANSFERED
200$: MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT
BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT
PATCH 2
CALL @RLCN ;RELEASE CONTROLLER
CALL @IODON ;FINISH i/o OPERATION
JMP MWINI ;PROCESS NEXT REQUEST
;
; DEVICE TIMEOUT RESULTS IN A HOME SEEK FOLLOWED BY THE i/o OPERATION
; BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE
; USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A
; HARDWARE FAILURE.
;
MWOUT: INCB S.VSTS(R4) ;;;LEAVE CONTROLLER BUSY
STS1=.-2
CALL @DTOER ;;;LOG DEVICE TIMEOUT
BCC 230$ ;IF CC TIMEOUT DURING NORMAL FUNCTION
220$: CALL @CRPAS ; Pass controller registers to task
BR 190$ ; Diagnostic processing complete
230$: MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS
PKT4=.-2
BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?
BNE 180$ ;IF NE YES
BR 130$ ;
.DSABL LSB
;+
;
;-
MWWAIT:
PATCH 6
TST (R2)
BMI MWWAIT
RETURN ;
;+
;
;-
FLUSH:
PATCH 4
TST MWRD(R2)
BIT #S2.DRQ, MWCSR2(R2)
BNE FLUSH
RETURN
;+
; R0 -
; R1 - I/O packet address
; R2 - CSR
; R3 - controller index
; R4 - SCB
; R5 - UCB
;-
LOAD:
PATCH 4
BIT #S2.DRQ, MWCSR2(R2)
BEQ LOAD
MOV R0, -(SP)
MOV U.CNT(R5), R0
MOV R5, -(SP) ; for KISAR6
MOV R4, -(SP)
MOV R3, -(SP)
MOV KISR6, R5
MOV (R5), -(SP)
MOV I.PRM(R1), (R5)
MOV I.PRM+2(R1), R4
MOV #256., R3
10$: TST R0
BEQ 20$
MOV (R4)+, MWRD(R2)
DEC R0
BR 30$
20$: CLR MWRD(R2)
30$: SOB R3, 10$
BR COMM
;+
; R0 -
; R1 - I/O packet address
; R2 - CSR
; R3 - controller index
; R4 - SCB
; R5 - UCB
;-
UNLOAD:
PATCH 4
BIT #S2.DRQ, MWCSR2(R2)
BEQ UNLOAD
MOV R0, -(SP)
MOV U.CNT(R5), R0
MOV R5, -(SP) ; for KISAR6
MOV R4, -(SP)
MOV R3, -(SP)
MOV KISR6, R5
MOV (R5), -(SP)
MOV I.PRM(R1), (R5)
MOV I.PRM+2(R1), R4
MOV #256., R3
10$: TST R0
BEQ 20$
MOV MWRD(R2), (R4)+
DEC R0
BR 30$
20$: TST MWRD(R2)
30$: SOB R3, 10$
COMM: MOV (SP)+, (R5)
MOV (SP)+, R3
MOV (SP)+, R4
MOV (SP)+, R5
MOV (SP)+, R0
RETURN
;+
; **-MWCHK-VALIDATE AND CONVERT THE LBN
;
; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING
; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2
; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN
; $DRQRQ AFTER CALLING $IOALT.
;
; INPUTS:
;
; R1=I/O PACKET ADDRESS
; R5=UCB ADDRESS
;
; OUTPUTS:
;
; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET
; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.
;
; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL
; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN
; $DRQRQ IS EXECUTED.
;
;
; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.
; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.
;-
MWCHK:
PATCH 5
MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACK
CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH
BEQ 20$ ;IF EQ YES - LEAVE IT ALONE
CMPB #IO.DET/256.,1(SP) ;IS IT DETACH
BEQ 20$ ;IF EQ YES - LEAVE IT ALONE
BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITS
CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?
BEQ 20$ ;IF EQ YES - LEAVE IT ALONE
TST (SP)+ ;CLEAN THE STACK
CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER
CALL @CVLBN ;CONVERT LOGICAL BLOCK NUMBER
SWAB R1 ;SWAP TRACK TO HIGH BYTE
BIS R1,R0 ;MERGE TRACK WITH SECTOR
MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS
MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS
MOV R3,R1 ;RESTORE THE PACKET ADDRESS
10$: RETURN ;EXIT
20$: TST (SP)+ ;CLEAN THE STACK
BR 10$ ;AND EXIT
.IF DF R$$MPL
MWKRB: BCS 20$ ; Off-line request - done
TST EXEVEC ; If done already
BNE 20$ ; Skip this
PATCH 5
MOV R2,-(SP) ; Save R2
MOV R3,-(SP) ; and R3
MOV @#KINAR6,-(SP) ; and mapping APR6
MOV @#112,R0 ; Get address of table of entries
MOV (R0),R0 ; Get address of APR bias (first word)
MOV (R0),@#KINAR6 ; Map common through APR6
MOV #EXEVEC,R3 ; Point to vector
MOV #EXEVCL,R2 ; Specify length of vector
CALL @#140004 ; Translate vector
MOV (SP)+,@#KINAR6 ; Restore mapping
MOV (SP)+,R3 ; And R3
MOV (SP)+,R2 ; And R2
MOV #SCBPAT,R0 ; Get patch table address
10$: MOV (R0)+,R1 ; Move table entry
BEQ 20$ ; If EQ - end of table
MOV @(R0)+,(R1) ; If NEQ - start to patch
BR 10$ ; Complete it
20$:
RETURN
MWUCB: RETURN
PATCH 40
.ENDC ;DF R$$MPL
.END
Работает под RSX-11M-Plus v4.0 и v4.6. Весьма не доделан в плане качества, но вряд ли буду доделыватьКод:.TITLE MWTAB
.IDENT /01/
;
; SYSTEM TABLES
;
; MACRO LIBRARY CALLS
;
.MCALL CLKDF$
.MCALL KRBDF$
.MCALL SCBDF$
.MCALL UCBDF$
CLKDF$ ;DEFINE CLOCK BLOCK OFFSETS
KRBDF$
SCBDF$ ;DEFINE SCB OFFSETS
UCBDF$ ;DEFINE UCB OFFSETS
;
;
$MWDAT::
;
; MW CTB
;
.WORD 0 ; L.ICB
$CTB0:
.WORD $CTB1 ; L.LNK
.ASCII /MW/ ; L.NAM
.WORD .DC0 ; L.DCB
.BYTE 2 ; L.NUM
.BYTE 0 ; L.STS
$MWCTB:: ; L.KRB
.WORD $MWA
.WORD $MWB
;
; MW DCB
;
$MWTBL=0 ;LOADABLE MWDRV
$MWDCB::
.DC0:
.WORD .DC1 ; D.LNK
.WORD .MW0 ; D.UCB
.ASCII /MW/ ; D.NAM
.BYTE 0,1 ; D.UNIT
.WORD MWND-MWST ; D.UCBL
.WORD $MWTBL ; D.DSP
.WORD 177477,70,0,177200,377,0,0,377 ; D.MSK
.WORD 0 ; D.PCB
;
; MW UCB'S
;
MWST=.
.IF DF M$$MUP
.WORD 0
.ENDC
.MW0::
.WORD .DC0
.WORD .-2
.BYTE UC.ALG!1,US.MNT
.BYTE 0,US.OFL
.WORD DV.DIR!DV.MSD!DV.UMD!DV.F11!DV.MNT
.WORD 2
.WORD 0.
.WORD 512.
.WORD $MW0
.WORD 0,0,0,0,0,0,0,0
.BYTE 16.,8.
.WORD 1024.
MWND=.
.IF DF M$$MUP
.WORD 0
.ENDC
.MW1::
.WORD .DC0
.WORD .-2
.BYTE UC.ALG!1,US.MNT
.BYTE 0,US.OFL
.WORD DV.DIR!DV.MSD!DV.UMD!DV.F11!DV.MNT
.WORD 2
.WORD 0.
.WORD 512.
.WORD $MW1
.WORD 0,0,0,0,0,0,0,0
.BYTE 16.,8.
.WORD 1024.
;
; MW SCB'S
;
$MW0::
.WORD 0,.-2 ; S.LHD
.WORD 0,0,0,0 ; S.FRK
.WORD 0 ; S.KS5
.WORD 0 ; S.PKT
.BYTE 0 ; S.CTM
.BYTE 4. ; S.ITM
.BYTE 0 ; S.STS
.BYTE S3.OPT ; S.ST3
.WORD 0!S2.LOG!S2.OPT!0 ; S.ST2
.WORD $MWA ; S.KRB
.BYTE 9. ; S.RCNT
.BYTE -20 ; S.ROFF
.WORD 0 ; S.EMB
$MW1::
.WORD 0,.-2 ; S.LHD
.WORD 0,0,0,0 ; S.FRK
.WORD 0 ; S.KS5
.WORD 0 ; S.PKT
.BYTE 0 ; S.CTM
.BYTE 4. ; S.ITM
.BYTE 0 ; S.STS
.BYTE S3.OPT ; S.ST3
.WORD 0!S2.LOG!S2.OPT!0 ; S.ST2
.WORD $MWB ; S.KRB
.BYTE 9. ; S.RCNT
.BYTE -20 ; S.ROFF
.WORD 0 ; S.EMB
;
; MWA KRB
;
.BYTE PR4 ; K.PRI
.BYTE 300/4 ; K.VCT
.BYTE 0*2,0 ; K.CON, K.IOC
.WORD 0!KS.OFL ; K.STS
$MWA:: .WORD 174020 ; K.CSR
.WORD MWA-$MWA ; K.OFF
.BYTE 0,0 ; K.HPU
.WORD 0 ; K.OWN
.WORD 0,.-2 ; K.CRQ
.BLKW 6 ; MAPPING ASSIGNMENT BLOCK
.WORD 0 ; KE.RHB
MWA:
;
; MWB KRB
;
.BYTE PR4 ; K.PRI
.BYTE 310/4 ; K.VCT
.BYTE 1*2,0 ; K.CON, K.IOC
.WORD 0!KS.OFL ; K.STS
$MWB:: .WORD 174060 ; K.CSR
.WORD MWB-$MWB ; K.OFF
.BYTE 0,0 ; K.HPU
.WORD 0 ; K.OWN
.WORD 0,.-2 ; K.CRQ
.BLKW 6 ; MAPPING ASSIGNMENT BLOCK
.WORD 0 ; KE.RHB
MWB:
;
; MW Configuration
;
; Physical Unit Number
;
; 0 1 2 3 4 5 6 7
;
; MWA MW0:
; MWB MW1:
;
;
$MWEND::
.DC1 = 0 ; END OF DCB LIST FOR MW:
$CTB1 = 0 ; END OF CTB LIST FOR MW:
.END
- - - Добавлено - - -
Готовая система
http://www.kpxx.ru/KBAHT4C/Софт/RSX-...Патрона
Там есть готовый драйвер
а готовый ?
А возможно сделать поддержку 2-х винчестеров ?
Читать не умеем?
Готовый в образе. И он изначально поддерживал два винчестера - потому что у меня так было сделано в Кванте
То и значит, что его код надо ещё вылизать по размеру и скорости работы
Код:.ENABLE SUBSTITUTION
.PARSE <FILSPC> "[" $DR $DR
.PARSE $DR "]" $DR
.SETS $DR "['$DR']"
.GOSUB GEN MW
.EXIT
.GEN:
.SETS P1 COMMAN
MAC '$DR''P1'TAB;1,'$DR''P1'TAB;1=LB:[1,1]EXEMC/ML,[11,10]RSXMC/PA:1,SY:'$DR''P1'TAB
MAC '$DR''P1'DRV;1,'$DR''P1'DRV;1=LB:[1,1]EXEMC/ML,[11,10]RSXMC/PA:1,SY:'$DR''P1'DRV
.OPEN '$DR'TMP.BLD;1
.DATA '$DR''P1'DRV;1/-HD/-MM,'$DR''P1'DRV;1/-SP/CR,'$DR''P1'DRV;1='$DR''P1'DRV,'
$DR''P1'TAB
.DATA LB:[3,54]RSXVEC.STB/SS
.DATA LB:[1,1]EXELIB/LB
.DATA /
.DATA STACK=0
.DATA UNITS=0
.DATA PAR=DRVPAR:120000:20000
.DATA //
.CLOSE
TKB @'$DR'TMP.BLD;1
.RETURN
думал - должно встретится в тексте слово link. Выходит это не так.
link - это если DCL, который транслирует его в вызов TKB. Обычно работал в MCR
- - - Добавлено - - -
К тому же это - командник, для сбора (почти) любого драйвера
спасибо !
Не за что
а как поставить RSX на железную машину ?
Наверное с дискет ? Тогда нужен еще и драйвер дискеточный.
Здесь уже мелькал драйвер от Form-а, у меня не доделанный
- - - Добавлено - - -
Если интересно
http://www.kpxx.ru/KBAHT4C/Софт/SystemDisks/
я возиться и вспоминать не буду - сейчас у меня времени свободного нет