CHAR$CR = 015
CHAR$LF = 012
TT$RCSR = 177560
TT$RBUF = 177562
TT$XCSR = 177564
TT$XBUF = 177566
ML$CSR = 170002 ; регистр команд и состояния контроллера НМЛ
ED$ADL = 175000 ; регистр адреса электронного диска - младшее слово
ED$ADH = 175002 ; регистр адреса электронного диска - старшее слово
ED$DAT = 175004 ; регистр данных электронного диска
BIG$ROM = 173776 ; регистр чтения большого ПЗУ с этой платы
ROM$BASE = 173000 ; базовый адрес данного загрузочного ПЗУ
MLDESC = 10000 ; адрес дескриптора операции НМЛ в памяти
MLCMD_INIT = 16 ; инициализация устройства и перемотка на начало
MLCMD_READ = 102 ; чтение блока
MLCMD_BSR = 112 ; возврат на один блок назад
ML$B_EOF = 40000 ; бит признака конца файла в слове результата
; Предположительный формат дескриптора команд контроллера НМЛ.
; Дескриптор формируется в области памяти (для примера показан в 010000).
; Для запуска операции адрес заполненного дескриптора
; вписывается в регистр команд и состояния контроллера НМЛ.
; Сразу после инициализации ЭВМ из этого регистра читается число 000200.
;
; операция: INIT+ BSR+ READ+
; 007776/ отсюда читать код завершения? -2(R3) проверяется на 40000 или 40010
; 010000/ 177777 174000 R3
; 010002/ 10006
; 010004/ 16 112 102 4(R3)
; 010006/ адрес первой свободной ячейки ЗА дескриптором?
;
;-------------------------------------------------------------------------------
.TITLE BOOTROM KP556PT4A ROM module
.ENABL LSB
.ASECT
.=ROM$BASE
173000 005037 177560 START: CLR @#TT$RCSR ;005037 177570 +
173004 012706 007776 MOV #7776,SP ;012716 007776 +
173010 004067 000652 1$: JSR R0,PRTSTR ;004077 173666 +
173014 005015 026502 060572 .ASCII <15><12>/B-zagruzka/ ; B-загрузка
071147 075165 060553 .ASCII <15><12>/R-perezapusk/ ; R-перезапуск
005015 026522 062560 .ASCII <15><12>/T-testy/ ; T-тесты
062562 060572 072560 .ASCIZ <15><12>/?/ ; ?
065563 005015 026524
062564 072163 006571
037412 000000
.EVEN ;
173064 004767 000624 CALL INPSTR ;004777 000634
173070 001747 BEQ 1$ ;001757
173072 120027 000102 CMPB R0,#'B ;120037 000112
173076 001410 BEQ BOOT ;
173100 120027 000122 CMPB R0,#'R ;120037 000132
173104 001532 BEQ RESTART ;
173106 120027 000124 CMPB R0,#'T ;120037 000134
173112 001336 BNE 1$ ;
173114 000167 000340 JMP TESTS ;000177 000350
;...............................................................................
; ??? 224 это вектор TM. Но может быть тут и 234. пока непонятно.
; Скорее всего это устанавливает вектор прерывания на одну-единственную
; команду RTI, чтобы сбить WAIT и продолжить выполнение (см.ниже в MLSTA).
173120 012737 000226 000224 BOOT: MOV #226,@#224 ;012737 000236 000234 ??? может быть и 234/236
173126 012737 000002 000226 MOV #2,@#226 ;012737 000012 000236 код 2 = инструкция RTI
173134 012705 175000 MOV #ED$ADL,R5 ;012715 175010 адрес регистра адреса электронного диска.
173140 012704 170002 MOV #ML$CSR,R4 ;012714 170012 адрес CSR контроллера НМЛ. проверен.
173144 012703 010000 MOV #MLDESC,R3 ;012713 010010 ??? или всё-таки 010010 ? (есть отрицательные смещения). адрес блока дескриптора операции для выборки контроллером по ПДП ?
173150 004767 000406 10$ CALL MLRES ;004777 000416 сброс (запуск?) НМЛ
173154 004767 000352 CALL MLRDY ;004777 000352 проверка готовности НМЛ.
173160 101017 BHI 2$ ; НМЛ готов
173162 004077 000500 JSR R0,PRTSTR ;004077 000510
173166 006417 073412 066153 .ASCIZ <7><15><12>/wkl`~i nml0<wk>/ ; Включи НМЛ0<ВК>
077140 020151 066556
030154 073474 037153
000010
.EVEN ;
173212 004767 000476 CALL INPSTR ;004777 000476
173216 000754 BR 10$ ;
173220 005025 2$: CLR (R5)+ ;005035 базовый адрес для записи в эл.диск? (с 000000)
173222 005025 CLR (R5)+ ;005035 расширенный адрес эл.диска?
173224 012701 000010 MOV #^D8,R1 ;012711 000010 ; пытаемся считать 8 раз
173230 004767 000254 5$: CALL MLSTA ;004777 000254
173234 101053 BHI 3$ ;101053 ; прочитали успешно! перепишем блок в электронный диск
173236 001453 BEQ TAPEBOOT ; ; считан маркер конца файла? запускаем загрузчик с эл.диска
173240 005301 DEC R1 ;005311 ; есть ещё попытки?
173242 001014 BNE 6$ ; ; да
173244 004067 000416 JSR R0,PRTSTR ;004077 000416
173250 006417 067412 020173 .ASCIZ <7><CR><LF>/o{ ~teniq ml/ ; Ош чтения МЛ
072176 067145 070551
066440 000154
.EVEN ;
173270 000000 12$: HALT ;000010
173272 000776 BR 12$ ;
173274 012713 177777 6$: MOV #-1,(R3) ; модифицировать дескриптор операции с НМЛ: вернуться на один блок назад
173300 012763 000112 000004 MOV #MLCMD_BSR,4(R3) ;012763 000112 000014 команда возврата на блок назад (или позиционирования вообще?)
173306 004767 000214 CALL MLSTA1 ;004777 000214 запустить ещё раз с новыми параметрами
173312 101346 BHI 5$ ;101356 и снова попытаться прочитать с ленты.
173314 004067 000346 JSR R0,PRTSTR ;004077 000356
173320 006417 067412 020173 .ASCIZ <7><15><12>/o{ wozwrata/ ; Ош возврата
067567 073572 060562
060564 000000
.EVEN ;
173340 000000 4$: HALT ;000010
173342 000776 BR 4$ ;
173344 012700 010006 3$: MOV #MLDESC+6,R0 ;012710 010016 ; адрес начала считанных с ленты данных.
173350 012701 002000 MOV #^D1024,R1 ;012711 002010 ; 1024 слова = 2 КБ
173354 012015 11$: MOV (R0)+,@R5 ; переписать считанное с ленты в электронный диск?
173356 077102 SOB R1,11$ ;077112
173360 012701 000010 MOV #^D8,R1 ;012711 000010 считано успешно. восстановим счётчик попыток,
173364 000721 BR 5$ ;000731 и продолжим читать с ленты.
; Загрузчик с какого-нибудь электронного диска. Команда JMP @#0 - просто
; шедевр в написании загрузчиков...
;
173366 004767 000170 TAPEBOOT: CALL MLRES ;004777 000170 ; загрузка с электронного диска
173372 005000 RESTART: CLR R0 ;005010 будем записывать считанное в память с адреса 0
173374 012701 000400 MOV #^D256,R1 ;012711 000410 ; читаем 256 слов (512 байт, один блок)
173400 012705 175000 MOV #ED$ADL,R5 ;012715 175010 адрес регистра адреса электронного диска
173404 005025 CLR (R5)+ ;005035 установим параметры (первая часть адреса?)
173406 005025 CLR (R5)+ ;005035 расширенный адрес блока эл.диска?
173410 011520 7$: MOV @R5,(R0)+ ;011530 читаем данные из 175004 (регистр данных эл.диска?)
173412 077102 SOB R1,7$ ;077112
173414 005000 CLR R0 ;005010 адрес начала считанного
173416 022710 000240 CMP #240,@R0 ;022710 000250 ; загрузчик должен начитаться со слова 000240 (NOP)
173422 001002 BNE 8$ ;001012
173424 000137 000000 JMP @#0 ;000137 000010 ; запускаем загрузчик.
173430 004067 000232 8$: JSR R0,PRTSTR ;004077 000232
173434 006417 067412 020173 .ASCIZ <7><15><12>/o{ zagruzki/ ; Ош загрузки
060572 071147 075165
064553 000000
.EVEN ;
173454 000000 9$: HALT ;000010
173456 000776 BR 9$ ;
;-------------------------------------------------------------------------------
; Чтение скрытой части прошивки. Зачем-то в позиционно-независимых кодах -
; видимо осталось со времен когда код отлаживали еще не прошитый.
; Адрес блока для чтения 173656 или 173646 (точно пока не ясно - оба варианта
; попадают в блок данных пригодный для этого кода).
; По смыслу - 173656.
;
173460 010700 TESTS: MOV PC,R0 ;010710
173462 062700 000174 ADD #RDESC2-.,R0 ;062710 000174 тут точно 174 скоере всего.
173466 012037 173776 MOV (R0)+,@#BIG$ROM ; базовый адрес чтения из ПЗУ
173472 012001 MOV (R0)+,R1 ;012011 число слов
173474 012002 MOV (R0)+,R2 ;012012 куда записывать
173476 013722 173776 1$: MOV @#BIG$ROM,(R2)+ ;013732 173776 ; читаем данные
173502 077103 SOB R1,1$ ;077113
173504 011000 MOV @R0,R0 ;011010 восстановим адрес запуска
173506 000110 JMP @R0 ; переход на считанный блок
;-------------------------------------------------------------------------------
; ??? со 173510 по 173644 код неоднозначный
; Запуск какого-то I/O.
;
; по видимому, запуск чтения данных с НМЛ.
;
173510 010300 MLSTA: MOV R3,R0 ;010310 заполняем дескриптор операции?
173512 012720 174000 MOV #^C^D2048,(R0)+ ;012730 174010 число читаемых байт (2048 в доп.коде) r0=10000
173516 012720 010006 MOV #MLDESC+6,(R0)+ ;012730 010016 адрес размещения считываемых данных r0=10002
173522 012710 000102 MOV #MLCMD_READ,@R0 ;012710 000112 команда чтения r0=10004
173526 010314 MLSTA1: MOV R3,(R4) ; передаём адрес дескриптора -> запуск операции. r3=10000
173530 000001 WAIT ;000011 ждём завершения операции
; ; и продолжаем ниже в MLRDY
;...............................................................................
;
; Проверка результата на ошибку. Охренительная конструкция:
; если равно нулю - сказать, что не равно, а если не равно, сказать что равно.
; Мда... Не иначе код прошивки писал Д. Дэфо в качестве разминки перед
; "Робинзоном Крузо"...
;
; Проверка готовности НМЛ ?
; R3 - адрес дескриптора операции в памяти, считываемого/записываемого контроллером методом ПДП.
; R4 - адрес регистра состояния контроллера
173532 005714 MLRDY: TST @R4 ; бит 15 в ML$CSR - признак ошибки?
173534 100401 BMI 1$ ;100411 при ошибке переход на 1$
173536 000207 RETURN ;000217 ошибки нет. Z=0 (из-за бита готовности), C=0
173540 032763 040000 177776 1$: BIT #ML$B_EOF,-2(R3) ;032773 040010 177776 проверить какой-то бит (конец файла?) в дескрипторе
173546 001402 BEQ 2$ ;001412
173550 000264 SEZ ;000274 бит 14 в дескрипторе = 1, уст. Z=1, C=0 - достигнут конец файла
173552 000402 BR 3$ ;000412
173554 000244 2$: CLZ ;000254
173556 000261 SEC ;000271 бит 14 в дескрипторе = 1, уст. Z=0, C=1 - прочая ошибка.
173560 000207 3$: RETURN ;000217
; Сброс НМЛ и перемотка ленты на начало.
; R3 - адрес дескриптора операции в памяти, считываемого контроллером методом ПДП для выборки параметров операции.
; R4 - адрес регистра контроллера, куда передаётся адрес дескриптора и откуда считывается слово состояния.
173562 012763 000016 000004 MLRES: MOV #MLCMD_INIT,4(R3) ;012773 000016 000014 команда инициализации. проверено.
173570 010314 MOV R3,@R4 ; передать адрес блока дескриптора контроллеру?
173572 105714 1$: TSTB @R4 ; ждать завершения операции?
173574 100376 BPL 1$ ; бит 7 - готовность (если 200 - готов)
173576 000207 RETURN ;000217
; Данные неизвестного назначения.
173600 000010 .WORD 10
173602 000010 .WORD 10
173604 000010 .WORD 10
173606 000010 .WORD 10
173610 007577 .WORD 7577
173612 000010 .WORD 10
173614 000210 .WORD 210
173616 007577 .WORD 7577
173620 007570 .WORD 7570
173622 000010 .WORD 10
173624 000210 .WORD 210
173626 017377 .WORD 17377
173630 007217 .WORD 7217
173632 000010 .WORD 10
173634 000210 .WORD 210
173636 026576 .WORD 26576
173640 003773 .WORD 3773
173642 000010 .WORD 10
173644 000210 .WORD 210
; Два блока данных для чтения кода из скрытой прошивки:
; - адрес внутри прошивки (номер слова, т.е. нужно умножить на два)
; - количество слов
; - адрес памяти куда считывать
; - адрес в памяти куда передать управление после считывания
;
; RDESC1 загружает что-то большое, устанавливающее, в частности, вектор Trap 4.
;
; RDESC2 загружает тестовый код, похожий на тесты из ТМОС. Он выводит меню:
; 1 - основной тест команд
; 2 - тест команд ра
; 3 - тест команд пз
; 4 - тест памяти
; 5 - тест диска системного
;
173646 032561 RDESC1: .WORD 32561 ;032571 ??? скорее 32561, * 2 = 65342 - там осмысленный код.
173650 000333 .WORD 333 ; 333 здесь правильно, охватывает с 65342 до 66230.
173652 001000 .WORD 1000 ;001010 тут правильно 1000.
173654 001000 .WORD 1000 ;001010
173656 033114 RDESC2: .WORD 33114 ; * 2 = 66230 - запуск тестов. 33114 здесь правильно.
173660 000664 .WORD 664 ;000674 ??? скорее 664 (с 66230 до 70000)
173662 100000 .WORD 100000 ;100010 тут правильно 100000.
173664 100000 .WORD 100000 ;100010
;
;-------------------------------------------------------------------------------
;
; Печатает ASCIZ строку начиная с адреса сразу после "JSR R0,PRTSTR",
; выравнивает адрес, возвращает управление на адрес после текста.
;
173666 105737 177564 PRTSTR: TSTB @#TT$XCSR ;105737 177574
173672 100375 BPL PRTSTR ;
173674 112037 177566 MOVB (R0)+,@#TT$XBUF ;112037 177576
173700 105710 TSTB @R0 ;
173702 001371 BNE PRTSTR ;
173704 042700 000001 BIC #1,R0 ;042710 000011
173710 005720 TST (R0)+ ;005730
173712 000200 RTS R0 ;000210
;
;-------------------------------------------------------------------------------
;
; Ввод "строки" текста. Строка завершается нажатием <CR>.
; Код последнего символа (перед <CR>) возвращается в R0. В конце подпрограммы
; заметен любимый прием советских инженеров - бесполезная команда (результат
; этой команды уже получен предыдущей командой).
;
173714 005046 INPSTR: CLR -(SP) ;005056
173716 105737 177560 1$: TSTB @#TT$RCSR ;105737 177570
173722 100375 BPL 1$ ;
173724 113700 177562 MOVB @#TT$RBUF,R0 ;113710 177572
173730 105737 177564 2$: TSTB @#TT$XCSR ;105737 177574
173734 100375 BPL 2$ ;
173736 110037 177566 MOVB R0,@#TT$XBUF ;110037 177576
173742 122700 000015 CMPB #CHAR$CR,R0 ;122710 000015
173746 001402 BEQ 3$ ;001412
173750 010016 MOV R0,@SP ;
173752 000761 BR 1$ ;000771
173754 105737 177564 3$: TSTB @#TT$XCSR ;105737 177574
173760 100375 BPL 3$ ;
173762 112737 000012 177566 MOVB #CHAR$LF,@#TT$XBUF ;112737 000012 177576
173770 012600 MOV (SP)+,R0 ;012610
173772 105700 TSTB R0 ;105710
173774 000207 RETURN ;000217
; Это вообще не относится к этой прошивке. Через этот регистр судя по
; всему достаются данные из микросхем не отмапленых на память. Порядок такой:
; сюда записывается начальный адрес внутри скрытой части и потом делается
; последовательное чтение слов данных.
;
;173776 013436 .WORD 13426
[свернуть]