Описание ЗДЕСЬ.
Описание ЗДЕСЬ.
С DL(V)11 за последнее время наигрались. Пора заняться DZ(Q,V)11 :)
Поразбирался как оно работает немного. Один контроллер занимает 4 слова на IOPAGE в которых размещаются 6 регистров устройства:
- Регистр состояния и управления (CSR), +0, RW
- Буфер приемника (RBUF), +2, RO
- Регистр параметров линии (LPR), +2, WO
- Регистр управления передатчиком (TCR), +4 RW
- Регистр состояния модема (MSR), +6 RO
- Регистр данных передатчика (TDR), +6 WO
Биты CSR
- <02:00> не используются
- <03> MAINT, замыкание выходов на входы
- <04> CLR, сброс устройства (бит сбрасывается по окончании сброса)
- <05> MSE, разрешение сканирования линий
- <06> RIE, разрешение прерываний от приемника
- <07> RDONE, принят символ
- <10:08> TLINE, номер линии передатчика треюующей обслуживания
- <11> не используется
- <12> SAE, разрешения прерываний по SA и запрет по RDONE
- <13> SA, SILO заполнен (16 или более символов)
- <14> TIE, разрешение перываний передатчика
- <15> TRDY, передатчик линии TLINE готов к приему
В отличие от DL, здесь прерывания передатчика запрещать не нужно вообще. Когда прерывания от передатчика не нужны, просто очищается соответствующий бит в TCR.
Сканирование линий идит сверху вниз. Как только найдена линия, готовая к передаче, сканирование останавливается, номер линии заносится в биты TLINE CSR и выставляется сигнал TRDY. Если при этом выставлен бит TIE, происходит прерывание. Пока линия не будет обслужена (передан символ или снят бит данной линии в TCR), сканирование не возобновится. После обслуживания, сканирование продолжится с того места где остановилось и потом начнется сначала.
При приеме символа, выставляется бит RDONE, если установлен бит RIE, происходит прерывание (если установлен бит SAE, то прерывание происходит только когда заполнится SILO и установится бит SA - в этот момент устройство приняло не менее 16 символов).
Устройства бывают с поддержкой 4 и 8 линий. В оригинале на QBUS поддерживаются только 4 линии, однако попалось описание не-DECовского DZV11 с 8 линиями. В случае 4 линий, старший бит не используется и при записи его должен быть нулем.
Биты RBUF
- <07:00> принятый символ
- <10:08> номер линии с которой символ принят
- <11> не используется
- <12> ошибка четности
- <13> frame error
- <14> overrun
- <15> считаные данные актуальны
Здесь вобщем-то все понятно. Бит 15 показывает, что все прочитанное из регистра актуально (считан символ и состояние). Полезно при включенном SAE для вычитывание всех символов которые устройство приняло.
Биты LPR (только запись)
- <02:00> - номер линии для которой выставляются параметры
- <04:03> длина символа
- 00 - 5 бит
- 01 - 6 бит
- 10 - 7 бит
- 11 - 8 бит
- <05> стоп биты
- 0 - 1 стоп бит
- 1 - 2 (1.5) стоп бита
- <06> parity enable
- <07> odd parity
- <11:08> скорость
- 0000 - 50
- 0001 - 75
- 0010 - 110
- 0011 - 134.5
- 0100 - 150
- 0101 - 300
- 0110 - 600
- 0111 - 1200
- 1000 - 1800
- 1001 - 2000
- 1010 - 2400
- 1011 - 3600
- 1100 - 4800
- 1101 - 7200
- 1110 - 9600
- 1111 - 19800 (скорость не поддерживается DECовским софтом, для DECовского DZQ11 написано что может быть и не 19800 в зависимости от перемычек; для не-DECовского DZV11 написано просто 19200)
- <12> разрешение приемника
- <15:13> не используется
Биты TCR
- <07:00> разрешения передатчика линий 0-7
- <15:08> DTR для линий 0-7
Биты MSR
- <07:00> RI линий 0-7
- <15:08> DCD линий 0-7
Биты TDR
- <07:00> - символ для передачи в линию заданную битами <10:07> CSR
- <15:08> - посылка BREAK в линии 0-7
Все регистры кроме RBUF и MSR допускают байтовое обращение к младшему и старшему байту.
---------- Post added at 20:15 ---------- Previous post was at 20:13 ----------
Первая прога как обычно - offline терминальчик по опросу. Только в отличие от DL, здесь сразу охватываются все линии мультиплексора :)Код:.TITLE DZT
.IDENT /V01.00/
DZ$CSR = 160100 ;АДРЕС CSR
DZ.CSR = 0 ;CSR
DZ.BUF = 2 ;БУФЕР ПРИЕМНИКА
DZ.LPR = 2 ;РЕГИСТР ПАРАМЕТРОВ ЛИНИИ
DZ.TCR = 4 ;РЕГИСТР УПРАВЛЕНИЯ ПЕРЕДАЧЕЙ
DZ.TDR = 6 ;РЕГИСТР ДАННЫХ ПЕРЕДАЧИ
TRDY = 100000 ;ГОТОВНОСТЬ ПЕРЕДАТЧИКА
RDONE = 200 ;СИМВОЛ ПРИНЯТ
MSE = 40 ;РАЗРЕШЕНИЯ СКАНИРОВАНИЯ
MCLR = 20 ;СБРОС УСТРОЙСТВА
S9600 = 7000 ;СКОРОСТЬ 9600
CL8 = 30 ;ДЛИНА СИМВОЛА 8 БИТ
ST1 = 0 ;1 СТОП БИТ
RXEN = 10000 ;РАЗРЕШЕНИЕ ПРИЕМНИКА
.MCALL .DEVICE
START: .DEVICE #AREA,#LIST ;СБРОС УСТРОЙСТВА ПО ВЫХОДУ
MOV #DZ$CSR,R5 ;УСТАНАВЛИВАЕМ CSR
BIS #MCLR,@R5 ;СБРОС УСТРОЙСТВА
BIT #MCLR,@R5 ;ЗАВЕРШЕН?
BNE .-4 ;НЕТ ЕЩЕ
MOV #8.,R0 ;ИНИЦИАЛИЗИРУЕМ ЛИНИИ
MOV #S9600!CL8!ST1!RXEN,R1 ;
10$: MOV R1,DZ.LPR(R5) ;
INC R1 ;
SOB R0,10$ ;
MOV #MSE,@R5 ;РАЗРЕШАЕМ СКАНИРОВАНИЕ
20$: TSTB @R5 ;ЖДЕМ НАЖАТИЯ КЛАВИШИ
BPL .-2 ;
MOV DZ.BUF(R5),R0 ;ПОЛУЧАЕМ ДАННЫЕ
MOV R0,R1 ;ПОЛУЧАЕМ НОМЕР ЛИНИИ
SWAB R1 ;
BIC #^C7,R1 ;
MOVB LINE(R1),DZ.TCR(R5) ;РАЗРЕШАЕМ ПЕРЕДАТЧИК ДЛЯ ЛИНИИ
TST @R5 ;ЖДЕМ ГОТОВНОСТИ ПЕРЕДАТЧИКА
BPL .-2 ;
MOVB R0,DZ.TDR(R5) ;ПЕРЕДАЕМ СИМВОЛ
CLR DZ.TCR(R5) ;ЗАПРЕЩАЕМ ПЕРЕДАТЧИК
BR 20$ ;КУ
AREA: .BLKW 2
LIST: .WORD DZ$CSR,MCLR
.WORD 0
LINE: .BYTE 1,2,4,10,20,40,100,200
.END START
---------- Post added at 20:19 ---------- Previous post was at 20:16 ----------
Про вектора ничего не сказал... Но тут вобщем-то все также: XX0 - прерывание приемника, XX4 - прерывание передатчика.
Замерил количество NOPов между прерываниями на DZQ11. Исходное состояние - выполнен master clear, дождались завершения, тест. Первый тест - просто разрешили прерывания от передатчика линии 0 и пошли нопы, остальные 23 теста - вывод символа и нопы. С разными скоростями. 19800 условно - сколько реально оно дает - фиг знает. На скоростях ниже 600 доходит до HALT в конце буфера.
Код:600 1200 2000 2400 3600 4800 7200 9600 19800
----- ----- ----- ----- ----- ----- ----- ----- -----
440 440 440 440 440 440 440 440 440
705 550 505 515 489 469 459 457 447
16306 8355 5169 4394 3069 2404 1743 1414 901
16205 8404 6410 5823 4023 3120 2218 1768 1072
16205 8389 5953 5391 4375 3385 2395 1899 1135
16207 8395 6122 5553 4502 3482 2460 1949 1158
16206 8394 6060 5493 4540 3519 2484 1966 1167
16206 8392 6084 5514 4550 3531 2492 1973 1170
16207 8397 6076 5509 4547 3536 2497 1977 1173
16208 8395 6079 5511 4549 3539 2499 1977 1172
16208 8396 6080 5512 4550 3541 2497 1980 1175
16209 8397 6079 5511 4550 3539 2500 1978 1173
16210 8396 6080 5512 4551 3543 2501 1980 1175
16209 8397 6080 5512 4550 3542 2500 1979 1176
16211 8396 6081 5513 4552 3544 2502 1981 1176
16210 8400 6081 5513 4552 3544 2502 1982 1177
16213 8397 6083 5514 4553 3544 2504 1982 1177
16211 8400 6082 5515 4553 3545 2502 1982 1178
16213 8400 6084 5515 4554 3544 2504 1984 1178
16212 8400 6083 5515 4554 3546 2504 1981 1179
16215 8402 6084 5516 4554 3546 2505 1985 1179
16213 8401 6084 5516 4555 3545 2503 1984 1180
16215 8402 6086 5517 4555 3548 2507 1985 1180
16213 8400 6082 5514 4553 3545 2503 1983 1178
Прога.
И для интереса разрешил все линии сразу. Тест на скорости 9600, остальные лень делать. Да вобщем-то и так примерно понятно :)
Код:449
450
451
451
452
452
453
453
1321
463
514
455
1646
465
515
458
1767
467
518
459
1813
469
519
461
Отключил пока петли с DZQ11, подключил VT220.
Тест показал, что условные 19800 соответствуют нормальным 19200.
Как-то выкладывал здесь недоразобранную программу автоконфигурации.
Вот более старый вариант (из RSX-11M-PLUS V3.0) в исходниках. Думаю кое-что полезного из них можно почерпнуть...
ZIPовал в VMSе, возможно при распаковке надо делать "unzip -a", но может и не надо.
открыл в winrar-е, там инфо показывает базовую ось vax/vms :) прикольно :)
На скорую руку посмотрел модуль ACFROT.MAC в архиве - в нём среди прочего определяется тип процессора и набор дополнительных (к базовому набору) инструкций процессора.
Не помню точно, но кажется, что при генерации ОС РВ ACF.TSK не запускался. Или нужно было бы подправить значение "TICKS: .WORD 60." на 50 с точкой - на наши 50 Гц.)))