.Title EmBoot size = / 2 uk$rg = 176640 ; УК-НЦ ё dwk$rg = -1 ; ДВК ╥ bk$rg = 177660 ; БК... ╥ Регистры в/в pk$rg = 161000 ; ПК11/16 ╧ uk$rs = 176674 ; рег. состояния ё УК-НЦ uk$rd = 176676 ; рег. данных ╧ канал 2 .MACRO .KOI8 ASCII .IRPC NUM, .IF LT ''NUM-100 .BYTE ''NUM .IFF .BYTE ''NUM ; +200 .ENDC .ENDM .ENDM .macro locate yk,xk .byte 33,'Y,yk+40,xk+40 .endm ; ╨╨╨╨╨╨╨╨╨ Эмулятор загрузчика ╨╨╨╨╨╨╨╨╨╨ .psect .data EmBoot:: nop br test .word t4-EmBoot,105 ; .= 4 .=EmBoot+14 .word no.boot,0 ; .= 14 .word .ttyin,0 ; .= 20 .=EmBoot+30 .word b$print,0 ; .= 20 .=EmBoot+40 ; ╣╣╣╣╣╣╣ вывод сообщений по EMT ╣╣╣╣╣╣╣╣╣╣╣ b$print: mov (sp),r0 mov r1,(sp) mov r0,r1 mov -(r1),r1 bic #^C377,r1 1$: tstb @#177564 bpl 1$ movb (r0)+,@#177566 sob r1,1$ ; mov (sp),r1 mov r0,(sp) rti .=EmBoot+100 .word rti$-EmBoot,340 jmpmas: .word uk$sub,dwk$sub,pk$sub,else ; адреса переходов ; ╣╣╣╣╣╣ Определение типа ЭВМ ╣╣╣╣╣╣╣╣╣ test: reset mov #End$Em+3000,sp ; Установим стек за программой jsr r5,tstreg p$r5: .word bk$rg, uk$rg ,dwk$rg ,pk$rg,2 tstreg: tst @(r5)+ no.bk: br bk$sub mov #EmBoot,r1 1$: mov -EmBoot(r1),(r1)+ dec #size bne 1$ jsr r0,@jmpmas-p$r5-4(r5) ; номер привода - в стек ; ╨╨╨╨╨╨ Обработка УКНЦ ╨╨╨╨╨╨╨╨╨╨╨╨╨╨╨╨╨ ; ╣╣╣╣╣╣ Передача МП в канал К2 УКНЦ ╣╣╣╣╣╣╣╣ put$mp: mov #5,r1 br 1$ 2$: movb (r2)+,@#uk$rd 1$: tstb @#uk$rs bpl 1$ sob r1,2$ tstb (r2) bne 3$ clr pc ; Запустим считанный загрузчик 3$: clrb (r2) ; Очистим флаг ошибки uk$sub: mov #60,r0 add (sp),r0 movb r0,2$ bpt ; "нет загрузчика" emt 1$-.-2 locate 9.,15. .koi8 <Замените диск и задайте номер привода> locate 11.,30. .ascii /MZ/ 2$: .ascii /#:/<10><10> .even 1$: iot ; .ttyin movb r2,3$ sub #60,r2 bmi 5$ cmpb r2,#4 bge 5$ emt 4$-.-2 3$: .byte 0,15,12,12,12 .even 4$: br 6$ 5$: mov (sp),r2 6$: movb r2,n.dev mov r2,r0 jsr r2,put$mp ;ё .word m.par,-1 ;╔╣╣ не раздвигать ! m.par: .byte 0,10,1 ;╥ ответ, чтение, тип накопителя n.dev: .blkb 1 ;╥ номер привода .byte 0,1 ;╥ дорожа, сектор .word 0,400 ;╧ адрес, кол. слов ; ╨╨╨╨╨╨╨╨╨╨ Обработка БК ╨╨╨╨╨╨╨╨╨╨╨╨ bk$sub: emt 14 ; Инициализация БК emt 16 mov #7.,r2 ; mov #18.,r1 ; emt 24 ; Курсор в 7,18 clr r2 ; mov #no$boot-Emboot+1000,r1 emt 20 ; Распечатка строки emt 6 ; Ожидание нажатия клавиши jmp @#160000 ; Перезагрузка ; ╨╨╨╨╨╨╨ Обработка ПК 11/16 ╨╨╨╨╨╨╨╨ pk$sub: emt 1$-.-2 .ascii /No boot on volume !/ ; /it is PK11-16/ .even 1$: halt ; ╨╨╨╨╨╨╨╨╨╨ Обработка ДВК ╨╨╨╨╨╨╨╨╨╨╨ dwk$sub: ; ╨╨ Обработка неопред. машины ╨╨╨╨╨╨ else: 1$: bpt halt ; ╣ Ввод символа с ожиданием по iot ╣╣╣ .ttyin: 1$: tstb @#177560 bpl 1$ movb @#177562,r2 rti ; ╣╣╣╣╣╣ Обработка прерывания 4 ╣╣╣╣╣╣╣ t4: mfps 2(sp) mov #103776,no.bk ; bcs .-2 rti$: rti ; ╣╣╣╣ Печать сообщения по bpt ╣╣╣╣╣╣╣╣ no.boot: emt 1$-.-2 .byte 33,'H,33,'J .byte 16 .even 1$: emt 3$-.-2 locate 7.,26. .koi8 <Ошибка чтения> .byte 17 .even 3$: emt 2$-.-2 locate 7.,20. no$boot = :. .koi8 <В этом диске нет загрузчика> .byte 15,12,17,0 .even 2$: mov #2,3$ ; Поставим инструкцию rti rti .IIF ge,.-1000-EmBoot .Error ; .-1000 - EmBoot overflow end$em: emsize == end$em - EmBoot .end