Вроде в принципе все до единой DEC системы игнорируют CSR в R1. Адрес CSR всегда прописан в самом аппаратном загрузчике диска.
Нет, ошибся, DSM-11 - это реализация MUMPS от DEC
1970s
By the early 1970s, there were many and varied implementations of MUMPS on a range of hardware platforms. The most widespread was DEC's MUMPS-11 on the PDP-11, and MEDITECH's MIIS. In 1972, many MUMPS users attended a conference which standardized the then-fractured language, and created the MUMPS Users Group and MUMPS Development Committee (MDC) to do so. These efforts proved successful; a standard was complete by 1974, and was approved, on September 15, 1977, as ANSI standard, X11.1-1977. At about the same time DEC launched DSM-11 (Digital Standard MUMPS) for the PDP-11. This quickly dominated the market, and became the reference implementation of the time. Also, InterSystems sold ISM-11 for the PDP-11 (which was identical to DSM-11).
- - - Добавлено - - -
Так, понятнее, только и с этим проблемы. RSX сделано сильно позже RK11 - а драйвер имеет.
А XXDP v2.5, выпущенная в 1989 г. - не имеет драйвера DK.
- - - Добавлено - - -
Все операционки DEC, ожидающее передачу в R1 адреса CSR - используют правильное значение 177400. Все загрузчики DEC, кроме DUP - передают в R1 неправильное значение. Поэтому ошибочный софт DEC загружает с RK только те операционки, которые игнорируют мусор в R1.
При написании DSM-11 была сделана ошибка и использовали не то значение для CSR RK11. Когда обнаружили - было решено объявить это фичей.
Попробуйте опровергнуть это утверждение
DUP не передает правильное или неправильное значение. Он передает значение из DRDEF, а оно в RT-11 если не ошибаюсь всегда совпадает с первым регистром. Тогда как в других системах такого принципа нет. В том же RSX например CSR пишется правильно: 177404, в RSTS/E если не ошибаюсь, тоже.
Это утверждение не требует опровержения, потому что все операционки DEC, ожидающее передачу в R1 адреса CSR - загружаются исключительно и только при передаче значения 177400.
- - - Добавлено - - -
Имеется в виду, что по счастливой случайности DUP не передаёт при загрузке с RK такой же мусор в R1, как весь остальной загрузочный софт DEC.
Вот когда найдёте хотя бы ещё одну операционку DEC, которая не загрузится без 177400 в качестве адреса "CSR" в R1 - тогда это и будет правильным вариантом. А пока - это фича DSM-11
- - - Добавлено - - -
Если же Вы возьмёте и почитаете документацию на RK11 (благо в инете найти это можно) то увидите, что в качестве CSR в RK11 выступает адрес (по умолчанию) 177404
Кстати, раз уж тут упоминался XXDP, но уж он-то (старый) знает? Поверим ему?Или добавим к списку там где у DEC ошибка? ;)Код:E11>MOU DL XXDP.RL
E11>MOU DK RK05
E11>B DL
CHMDLD0 XXDP+ DL MONITOR
BOOTED VIA UNIT 0
28K UNIBUS SYSTEM
ENTER DATE (DD-MMM-YY):
RESTART ADDR: 152010
THIS IS XXDP+. TYPE "H" OR "H/L" FOR HELP.
.R UPD1
UPD1 .BIN
CHUP1B0 XXDP+ UPD1 UTILITY
RESTART: 002650
*BOOT DK0:
%HALT
R0/000000 R1/177404 R2/002070 R3/001000 CM=K PM=K PRIO=7
R4/014756 R5/002114 SP/006156 PC/000002 N=0 Z=1 V=0 C=0
000002 halt
E11>
Ты что - это ошибка в E-11 ;)
Наоборот - как только отыщется хотя бы одна операционка DEC, которая не рассматривает любое значение R1, отличное от 177400, в качестве мусора, который нужно игнорировать - только тогда правильность передачи в R1 значения CSR 177400 - будет поставлена под сомнение.
А до тех порт глючный загрузочный софт DEC просто сыпет мусор в R1, который или игнорируется загружаемыми операционками, или приводит к их зависанию при загрузке.
%HALT
R0/000000 R1/177404 R2/002070 R3/001000 CM=K PM=K PRIO=7
R4/014756 R5/002114 SP/006156 PC/000002 N=0 Z=1 V=0 C=0
000002 halt
E11>
И при этом - передача любого другого значения CSR в R1 - приводит к зависанию при загрузке всех операционных систем DEC, которые используют при загрузке с RK адрес CSR из R1.
- - - Добавлено - - -
Ошибочное поведение - так невозможно загрузить ни одну операционку DEC, использующую значение из R1.
То есть DSM-11
- - - Добавлено - - -
Код:dkboot: ; DK: boot, continued
ror r2 ;(finish getting unit in <15:13>)
ror r2
ror r2
add #dkda,r1 ;point at disk addr
mov r2,(r1) ;set unit, C/H/S=0/0/0
clr -(r1) ;bus addr = 0
.assume dkba eq dkda-2
mov #-<1000/2>,-(r1) ;word count for one block
.assume dkwc eq dkba-2
mov #dkrdd!dkgo,-(r1) ;start command
.assume dkcs eq dkwc-2
10$: tstb (r1) ;wait for completion
bpl 10$ ;(ignore errors, will be obvious)
clr pc ;drop into boot block
Код:add #dlmp,r1 ;point at multi-purpose reg
mov #-<1000/2>,(r1) ;word count = 1 block
clr -(r1) ;disk addr = 0/0/0
.assume dlda eq dlmp-2
clr -(r1) ;bus addr = 0
.assume dlba eq dlda-2
add #dlrdd-dlsek,r2 ;change cmd to "read"
mov r2,-(r1) ;start cmd
.assume dlcs eq dlba-2
50$: bit #dlerr!dlrdy,(r1) ;wait for error or success
beq 50$
bmi 60$ ;error
.assume dlerr eq 100000
clr pc ;happy, drop into boot block
60$: ; error of some kind, just give up
halt
Код:go1: mov #dm$csr,r1 ;R1 points at base CSR
mov pc,r4 ;must point 20 bytes past signature
.assume . eq 20
mov #dmrdd!dmgo,r2 ;"read" command, as RK06 first time through
10$: ; read block 0, R2 contains "read" command including CDT bit
mov #dmerr,(r1) ;controller clear
;;; need to select drive first?
clr dmdc(r1) ;desired cyl = 0
add #dmcs2,r1 ;point at DMCS2
mov r0,(r1) ;set unit #
clr -(r1) ;disk addr=0/0 (track/sector)
.assume dmda eq dmcs2-2
clr -(r1) ;bus addr = 0
.assume dmba eq dmda-2
mov #-<1000/2>,-(r1) ;word count = 1 block
.assume dmwc eq dmba-2
mov r2,-(r1) ;"read" command
20$: bit #dmerr!dmrdy,(r1) ;wait for error or success
bpl 30$ ;success
.assume dmerr eq 100000
;;; we have lots of space, maybe we can fix soft ECC errors?
; assume drive type mismatch, try it both ways (RK06 vs. RK07)
add #dmcdt,r2 ;assume tried as RK06, now do RK07
bit #dmcdt,r2 ;or did we do that already?
bne 10$ ;no, do it now
br . ;error, hang
30$: clr pc ;happy, drop into boot block
Код:go1: mov #dx$csr,r1 ;R1 points at base CSR
mov pc,r4 ;must point 20 bytes past signature
.assume . eq 20
restrt: ; retry
mov #dxrds!dxgo,r2 ;"read sector" command
tst r0 ;unit 1?
beq 10$
bis #dxus,r2 ;yes, set unit select bit
10$: mov #1,r3 ;starting sector #
clr r5 ;init memory address
20$: ; read next sector
; R2=read cmd, R3=sector number, R5=address
mov r2,(r1) ;start cmd
30$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request
beq 30$
bmi restrt ;error, start over
.assume dxerr eq 100000
mov r3,dxdb(r1) ;write sector number
40$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request
beq 40$
bmi restrt ;error, start over
.assume dxerr eq 100000
mov #1,dxdb(r1) ;write track # (always 1 for block 0)
50$: bit #dxerr!dxdone,(r1) ;wait for error or completion
beq 50$
bmi restrt ;error
.assume dxerr eq 100000
; success, empty silo
add #dxemp-dxrds,r2 ;change command to "empty silo"
mov r2,(r1) ;start cmd
60$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request
beq 60$
bmi restrt ;error, start over
.assume dxerr eq 100000
add #dxrds-dxemp,r2 ;restore "read sector" command
70$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request
beq 70$
bmi restrt ;error, start over
.assume dxerr eq 100000
movb dxdb(r1),(r5)+ ;read next data byte
bit #177,r5 ;reached multiple of 128.?
bne 70$ ;loop if not
; bump to next sector
add #2,r3 ;skip 2 sectors (2:1 soft interleave)
cmp r5,#1000 ;done whole block?
blo 20$ ;loop if not
clr pc ;happy, drop into boot block
Везде передаётся CSR. Берем документацию на RK11 - адрес CSR по умолчанию 177404Код:go1: mov #dy$csr,r1 ;R1 points at base CSR
mov pc,r4 ;must point 20 bytes past signature
.assume . eq 20
restrt: ; retry
mov #dyrds!dygo,r2 ;init command, assume SD (about to flip it)
tst r0 ;unit 1?
beq 10$
bis #dyus,r2 ;yes, set unit select bit
10$: ; try other density
add #dydd,r2 ;flip DD flag
bic #dydd*2,r2 ;(clear carry)
mov #1,r3 ;starting sector #
clr r5 ;init memory address
20$: ; read next sector
; R2="read sector" cmd including DD flag, R3=sector number, R5=addr
mov r2,(r1) ;start cmd
30$: tstb (r1) ;wait for transfer request
bpl 30$ ;(ignore errors)
mov r3,dydb(r1) ;write sector number
40$: tstb (r1) ;wait for transfer request
bpl 40$ ;(ignore errors)
mov #1,dydb(r1) ;write track # (always 1 for block 0)
50$: bit #dyerr!dydone,(r1) ;wait for error or completion
beq 50$
bmi 10$ ;error, try other density
.assume dyerr eq 100000
; success, empty silo
add #dyemp-dyrds,r2 ;change command to "empty silo"
mov r2,(r1) ;start cmd
60$: tstb (r1) ;wait for transfer request
bpl 60$ ;(ignore errors)
add #dyrds-dyemp,r2 ;(restore "read sector" command)
mov #128./2,sp ;SD word count (not using stack, so...)
cmp r2,sp ;double density?
.assume dydd ge 128./2
.assume dyus!dyrds!dygo lt 128./2
blo 70$ ;no
asl sp ;yes, DD word count
70$: mov sp,dydb(r1) ;set word count
80$: tstb (r1) ;wait for transfer request
bpl 80$ ;(ignore errors)
mov r5,dydb(r1) ;write core addr
90$: bit #dydone,(r1) ;wait for completion
beq 90$ ;(ignore errors)
add sp,r5 ;bump addr by sector size
add sp,r5 ;(twice for byte address)
; bump to next sector
add #2,r3 ;skip 2 sectors (2:1 soft interleave)
cmp r5,#1000 ;done whole block?
blo 20$ ;loop if not
clr pc ;happy, drop into boot block
На этом для себя обсуждение считаю законченным.
С чем, к слову, согласен и DSM в процессе инсталяции:Код:1.3 Do you wish to Auto-configure the current system [Y OR N] ? <Y>
Configuring Host System . . .
Processor Type: PDP-11/83
Memory Size: 256 KB
Processor/Memory Options:
Floating Point Unit
Extended Instuction Set
22 Bit Addressing
Cache
Name Vector CSR Unit Type Description
DKA 220 177404 RK11 Disk Controller
...
Информация к размышлению: ни один загрузчик DSM кроме RK05 не использует R1.
При загрузке с того же RL02 в R1 можно положить что угодно.
Аппаратная загрузка с MT пишет 172522 (как и положено) в R1, а не 172520 как можно было бы подумать.
Иными словами, загрузка с RK05 (для которого при генерации любой DEC системы даже не
спрашивается адрес регистра - он всегда жестко зашит) единственная вдруг с какого-то перепуга
хочет использовать R1, причем довольно странным способом: готовится набор регистров к которым
будет обращение методом BIS, а не ADD. В R1 можно записать 0, 400, 1400, 2400, 5400, ... загрузится.
Добавим гипотетический контроллер RK05 по адресу 177410 (CSR=177414) и... правильно: нифига не загрузится хоть ты 177410 хоть 177414 передавай в R1. Или, скажем, 177200 (чтобы не было соблазна сказать, что пересекается со стандартным, не кратен 20 или еще что-нибудь)... То есть реально этому загрузчику (единственному у DSM что-то делающему с R1) CSR передать через R1 невозможно (если быть точнее, то возможно три варианта кроме 177400).
То есть загрузчики для контроллеров, которых официально может быть несколько, игнорируют R1. Единственный загрузчик для контроллера который с точки зрения DEC всегда один и на одном месте (RSX правда позволяет кучу наплодить возможно - спрашивает сколько контроллеров, но отвечать на вопрос не пробовал) пытается манипулировать с R1 и выбрать один из 4 вариантов.
Не удивлюсь, если было какое то нестандартное чудо, в котором было четыре контроллера RK. Учитывая, что DSM - это к тому же своеобразная база данных, а где базы - там большие объёмы и требуется скорость - может DEC под что такое своеобразное и сделало такой не стандартный загрузчик. Но это только предположение.
Кстати, ещё на что обратил внимание (хотя в памяти это и так крутилось) - начальный загрузчик грузиться с адреса 0
Ну может там какое то извращение было задумано :) В общем, сейчас, когда с авторами не связаться... уже и не скажешь...
..
Как выяснилось - загрузчик DSM-11 берёт номер загружаемого привода RK из R0, а не из RKDA, поэтому минимальный загрузчик, способный загрузить с RK0 любую ОС DEC, выглядит так:
Код:MOV (PC), R2 ; READ COMMAND
RESET ; SET UNIT 0 ; BLOCK 0 ; ADDR 0
MOV #177400, R1 ; WORD COUNT
MOV #177406, R3 ; RKWC
MOV R1, (R3) ; SET WORD COUNT
MOV R2,-(R3) ; READ BOOT
TSTB (R3) ; WAIT FOR READY
BPL .-2.
CLR R0 ; BOOT UNIT
CLR PC ; BOOT
Тьфу, да, неправильно строки воспринял, да, всё нормально.
..
Мистическая тайна DSM-11 раскрыта - обсуждаемое использование содержимого R1 отсутствует в оригинальном коде DSM-11 и было внесено патчем.
Оригинал загрузчика DK:
Код:.=0
.DSKBOT DK
MOV %2,-(6)
MOVB BOOTDK+510.,%5 ;GET DISK-TYPE
CMP #DL,%5 ;CHECK TYPE
BEQ BERRDK ;.+210
MUL #000014,%5
ADD #BOTTDK-BOOTDK+VIR.P5,%5
TSTB BOOTDK+510.
BEQ 1$
Патченая версия:
Код:.=0
.DSKBOT DK
MOV %2,-(6)
MOVB BOOTDK+510.,%5 ;GET DISK-TYPE
CMP #DL,%5 ;CHECK TYPE
BEQ BERRDK ;.+210
MUL #000014,%5
ADD #BOTTDK-BOOTDK+VIR.P5,%5
CALL @#640
BEQ 1$
...
.=640
MOV BOOTDK+500.,%2
BIS %2,(5)
BIS %2,6(5)
BIS %2,10(5)
TSTB BOOTDK+510.
RETURN
Оригинал - из файла BOOTDK, находящегося в образе MYmac1.DSK в архиве DSMMAC.zip, а патченная версия - дизасм нулевого блока образа диска RK05 с DSM-11 v3.3.
..
Изменил патч загрузчика в дистрибутиве DSM-11 v3.3 так, чтобы он по-прежнему влиял на DM, DP, DR и DB, но не влиял на DK : DSM-11_v3.3.tap
Загрузчик DSM-11 помог найти ошибку в моей эмуляции RK, которою не выявляют тесты XXDP - мой вариант RK не мог прочитать с диска за один раз более 32К слов. Загрузчик же DSM-11 мапит себя в верхнюю память и считывает одним запросом с диска RK всю область ядра = 45К слов ( 90 Кб ) в адреса 00000..263777 и вторым запросом - 37 Кб системного аннекса в адреса 264000..375777.
Тут интересно бы на живом посмотреть. По описанию можно предположить, что RKWC, выставленный в 0 перед началом R/W операции должен нормально прокрутиться через все 64KW и остановиться когда снова станет равен нулю. SimH так и поступает. E11 тестить не стал - я его уже ловил на разных косяках относительно RK06/RK07 и RP02/RP03 (В SimH впрочем тоже был косяк в RK06/RK07:)). Можно еще в CHARON попробовать.