;АДРЕС ТРАНСЛЯЦИИ - 160000 .PSECT 160000 COMD=177130 COMK=177660 REG16=177716 IF0=177656 ;данные IF1=177654 ;ошибок предкомпенсация IF2=177652 ;счетчик сект. счетчик сект. IF3=177650 ;номер сектора номер сектора IF4=177646 ;цилиндр млад. цилиндр млад. IF5=177644 ;цилиндр старш. цилиндр старш. IF6=177642 ;SDH SDH IF7=177640 ;состояния команд ZF6=177622 ;А состояния упр.биты ZF7=177620 ;адрес привода ---------- T0: BR BOOTS T2: BR BOOT T4: BR LOGIC T6: BR FIZIC T10: BR INIT T12: JMP FORMAT T16: JMP ARIFM+16 ;РАСШ.АРИФМЕТИКА BOOTS: CALL GRUZ0D ;ГРУЗ.С ВИНТА CALL GRUZ0D CALL GRUZ0D CALL GRUZ0D CLR R0 ;ГРУЗ. С A:,B: CALL GRUZ MOV #1,R0 CALL GRUZ CLR @#COMD ;ЗАТОРМОЗИЛИ CLR @#COMK RET BOOT: GRUZ: CMP R0,#2 BLO GMD CALL GRUZND BR 2 GMD: MOV #2000,R3 CALL INIT MOVB R0,34(R3) CLR R0 MOV #400,R1 MOV #1000,R2 CALL LOGIC BCS 2 MOV #1000,R2 CMP (R2)+,#240 BNE 2 CMP @R2,#5 BEQ 2 MOVB 34(R3),R0 ;НОМЕР ПРИВОДА- В R0 !!! CALL -(R2) ;А ТО RT-11 НЕ ГРУЗИТСЯ... 2: RET ; подготовка перед загр PGRUZ: MOV #2000,R3 ;прогр запоминания SP,PSW,@#4 PREDS: MOV SP,50(R3) ADD #2,50(R3) MFPS 52(R3) MOV @#4,46(R3) MOV #STOP,@#4 MOV #177640,R4 ;РЕГИСТР СОСТОЯНИЯ HDD RET FIZIKH: CLR R0 ;ПЕРЕСЧЕТ ДОР/СТОР/СЕКТ В БЛОКИ... MOV #24,R2 MOVB 33(R3),R1 BIC #177400,R1 BEQ 1 2: ADD R1,R0 SOB R2,2 1: TSTB 32(R3) BEQ 3 ADD #12,R0 3: MOVB 35(R3),R1 DEC R1 ADD R1,R0 MOV R0,44(R3) ;обмен по номеру блока в 44(R3) OBMEN: CALL PREDS CLRB @#52 MOV #HLT,@#4 CALL ZAG TSTB @#52 BEQ 1 JMP STOP 1: JMP ENDS ZAG: CALL INDR.N MOV 30(R3),R2 BPL 001 NEG R2 ;и конца лог диска 001: MOV R2,R5 ADD #377,R5 CLRB R5 SWAB R5 MOV R5,R1 ADD 44(R3),R1 CMP R1,54(R3) BLOS 002 CALL ENO .WORD 4 002:;BIT #1,56(R3) ;BEQ 003 ;дописать обход битых секторов ;данные о них хранятся в блоке -3 003: MOV R5,R1 COM R1 MOV R1,@#IF2 ;счетчик SWAB R5 SUB R2,R5 MOV R5,22(R3) ;остаток MOV 44(R3),R0 CALL REGI4 MOV 26(R3),R1 ;-Adres MOV 30(R3),R2 ;-длина BMI 3 BIT #20,56(R3) BNE 5 MOV #337,@R4 CALL READ1 MOV 22(R3),R2 BEQ 11 CALL READF 11: RET 5: CALL ENO .WORD 1 ;защита OT ЧТ/ЗАП 3: NEG R2 BIT #10,56(R3) BNE 5 MOV #317,@R4 CALL WRITE1 MOV 22(R3),R2 BEQ 12 CALL WRITEF 12: RET ;подсчет контрольной суммы бл. пар. CONTR: MOVB 34(R3),R5 ;ном винта BIC #177400,R5 ADD 36(R3),R5 ;емк ц ADC R5 ADD 40(R3),R5 ;емк д ADC R5 ADD 60(R3),R5 ;ном бл ADC R5 ADD 62(R3),R5 ;ном бл ADC R5 RET ;знесение параметров в регистры винта по номеру блока R0 ;ВНИМАНИЕ ! ! ! паред этой программой сделай CONTR REGI4: INC R0 REGI: CALL T120 MOV 62(R3),R1 ;номер блока ST ADD 60(R3),R0 ;номер блока ML ADC R1 CALL DIV2 COM R0 ;номер цилиндра выбраного винта MOV R0,@#IF4 SWAB R0 MOV R0,@#IF5 ; R5 - остаток MOV R5,R0 MOVB 40(R3),R2 BIC #177400,R2 CALL DIV1 COM R0 ;Для режима MASTER-SLAVE. PUSH R1 MOV @#IF6,R1 BIC #177757,R1 BIS R1,R0 POP R1 MOVB R0,@#IF6 ;головка INC R5 COM R5 MOVB R5,@#IF3 ;сектор RET ;нач загрузка по "B" GRUZ0D: ;ожидание разгона CALL PGRUZ MOV #20,R1 10: CLR R2 9: TSTB @#IF7 BMI 8 SOB R2,9 SOB R1,10 RET 8: CALL IND00 BR 7 GRUZND: CALL PGRUZ MOVB R0,34(R3) CALL INDRV 7: CALL CMPDR ;+1 CALL READFP .WORD 377 ;+400 MOV #1000,26(R3) MOV #400,30(R3) CLR 44(R3) CALL ZAG MOV #1000,R2 CMP #240,(R2)+ BNE 1EZ CMP #5,(R2) BEQ 1EZ MOVB 34(R3),R0 JMP -(R2) 1EZ: CALL ENO .WORD 10 CMPDR: CLR R0 CALL REGI MOV #376,@#IF2 ;счетч = 1 MOV #337,@R4 ;чтение CALL READP .BYTE 6 .BYTE 1 ;6(R3) должен быть=номеру лог диска - признак -4го блока CMPB 6(R3),34(R3) BNE 1 RET 1: CALL READFP .WORD 377 CALL ENO ;не совпал признак начала диска .WORD 3 ;чтение параметров выбранного дисковода INDR.N: CALL CONTR CMP R5,64(R3) BEQ 1 CALL INDRV ;ВСЕГДА КОНФИГ. ВИНТА.... 1: CALL CMPDR ; 54(R3) емкость винта ; 56(R3) признаки ; ФОРМАТ БАЙТА ПРИЗНАКОВ ДИСКА ;10-полн.защ от записи ;20-полн.защ от чтения ;40 ;100 ;200 CALL READP .BYTE 54 .BYTE 2 CALL READFP .WORD 375 RET IND36: CALL T120 MOV #377,R0 ;чтение таблицы разделов **** MOV R0,@#IF6 MOV R0,@#IF5 MOV R0,@#IF4 DEC R0 MOV R0,@#IF2 ;счетчик DEC R0 MOV R0,@#IF3 ;блок MOV #337,@R4 ;чтение CALL READP .BYTE 54 ;в 54(R3)- номер привода нач заг .BYTE 1 ;в 36(R3)- об'ем цилиндра ;в 40(R3)- об'ем дорожки ;в 41(R3)- кол-во головок CALL READP .BYTE 36 .BYTE 2 RET IND00: CALL IND36 MOVB 54(R3), 34(R3) BR 390 ;чтение параметров винта, No его блока *** ;в R3 адрес блока параметров INDRV: CALL IND36 390: MOVB 34(R3),R2 SUB #2,R2 BEQ 1 ASL R2 CALL READF 1: CALL READP ;60(R3)мл\ нач. номер блока привода .BYTE 60 .BYTE 2 MOVB 34(R3),R1 ;64(R3)ст/ ASL R1 INC R1 MOV #400,R2 SUB R1,R2 CALL READF ;пропустить r2 слов CALL CONTR MOV R5,64(R3) RET ;программа проверки готовности BSYH: TSTB @R4 BPL 1 RET 1: CLR R5 2: TSTB @R4 BMI BSYH SOB R5,2 CALL ENO .WORD 3 ;проверка готовности принять команду T120: CALL BSYH BIT #120,@R4 BNE 1 BIT #10,@R4 BEQ 3 RET 1: CLR R5 01: BIT #120,@R4 BEQ T120 SOB R5,01 CALL ENO .WORD 6 3: MOV #0,@#ZF6 MOV #2000,R5 33: SOB R5,33 MOV #377,@#ZF6 CALL ENO ;не закончена предыдущая команда .WORD 5 ;проверка готовности обмена T130: CALL BSYH BIT #130,@R4 BNE 1 RET 1: CLR R5 01: BIT #130,@R4 BEQ T130 SOB R5,01 CALL ENO .WORD 10 READP: MOV @SP,R2 MOVB (R2)+,R1 MOVB (R2)+,R2 ADD R3,R1 ADD #2,@SP ;чтение BLOKа в R1+ READ1: 1: CALL T130 0: TSTB @R4 BPL 1 01: MOV @#IF0,(R1)+ SOB R2,0 RET ;запись BLOKа из R1+ WRITE1: 1: CALL T130 0: TSTB @R4 BPL 1 01: MOV (R1)+,@#IF0 SOB R2,0 RET READFP: MOV @SP,R2 ADD #2,@SP MOV @R2,R2 ;фиктивное чтение READF: 1: CALL T130 0: TSTB @R4 BPL 1 01: MOV @#IF0,R5 SOB R2,0 RET ;фиктивная запись WRITEF: 1: CALL T130 0: TSTB @R4 BPL 1 MOV #0,@#IF0 SOB R2,0 RET ;деление R1- старш. R0-младш. ;на R2 36(R3) DIV2: MOV 36(R3),R2 ;об'ем цилиндра DV2: MOV R4,-(SP) MOV #40,R4 CLR R5 1: ASL R0 ROL R1 ROL R5 CMP R2,R5 BHI 2 SUB R2,R5 ADD #1,R0 ADC R1 2: SOB R4,1 BR 88 ;деление R0 на R2 DIV1: MOV R4,-(SP) MOV #20,R4 CLR R5 1: ASL R0 ROL R5 CMP R2,R5 BHI 2 SUB R2,R5 INC R0 2: SOB R4,1 88: MOV (SP)+,R4 RET ;R0-результат R5-остаток ;ХИТРАЯ ОБРАБОТКА "СТОП" HLT: INCB @#52 SUB @PC,@SP RTI ARIFM:.END СЮДА КОМАНДОЙ "LM" ЛИНКОВАТЬ МОДУЛЬ FIS. Т.Е. ТРАНСЛЯЦИЯ ДЕЛАЕТСЯ ТАК: >RS >LO ИМЯ? CONNER.MAC >CL >LM ИМЯ? FIS Имя метки: >SA ИМЯ? CONNER20