Код:
;************************************************************
;* вариант драйвера Винчестера СМ 5508, А.Саньков *
;* использован в качестве системного с 14 июля 1990 г. *
;* последняя коррекция 26 июля 1990, при MMG$T = 1 работает*
;************************************************************
.LIST ME
.NLIST BIN
.NLIST SEQ
.LIST TTM
.NLIST CND
.MCALL .DRDEF,.assume
.DRDEF DW,53,<VARSZ$+FILST$+SPFUN$>,22777,174000,300
DWDS=DW$CSR
SYSPTR = 54
P1EXT = 432
.SBTTL SET OPTIONS
.DRSET RETRY,662.,O.RTRY,NUM
.DRSET WRITE,1,O.WRIT,NO
.DRSET WCHECK,1,O.WCHK,NO
.DRSET NCIL,712.,o.cil,NUM
o.cil: cmp r0,r3
bgt o.bad
mov r0,maxcil
beq o.bad
ash #6,r0
mov r0,maxblk
mov r0,.636
mov r0,54
sub #16.,r0
mov r0,.1250
br o.good
O.RTRY:
CMP R0,R3
BHI O.BAD
MOV R0,$RETRY
BNE O.GOOD
BR O.BAD
O.WRIT:
NOP
TST (PC)+
SEC
ROL #0
.456=.-2
BIC #177776,.456
.466:
MOVB R1,R0
CMP R0,R3
BHI O.BAD
MOV R0,-(SP)
ADD PC,R0
ADD #<NOWRIT-.>,R0
MOVB .456,@R0
JSR PC,.600
MOV (SP)+,R0
BCS O.GOOD
CMP @#54,R1
BHI .534
MOV #100000,346(R1)
.534:
ADD #6,R1
ADD R0,R1
MOVB .456,@R1
O.GOOD:
TST (PC)+
O.BAD: SEC
RTS PC
O.WCHK:
BR .566
.WORD 0
CLR DWWCHK
BR .574
.566:
MOV #177777,DWWCHK
.574:
CLC
RTS PC
.600:
MOV PC,R0
ADD #<DWNAME-.>,R0
MOV PC,-(SP)
ADD #<.630-.>,@SP
EMT 342 ;.DSTAT R0,@SP
BCS O.BAD
MOV .634,R1
BEQ O.BAD
BR O.GOOD
.630: .WORD DWSTS
.632: .WORD <DWEND-DWSTRT>
.634: .WORD 0
.636: .WORD DWDSIZE
DWNAME: .RAD50 "DW "
.assume . lt 1000
.SBTTL DRIVER ENTRY
.DRBEG DW
BR .1020
NOWRIT: .WORD 0 ;[NO]WRITE
$RETRY: .WORD 10
MAXBLK: .WORD 9792.
.1250: .WORD 9727.
MAXCIL: .WORD 153.
.1020:
.IF NE MMG$T
ASR #1
BCC DWENT
MOV @#SYSPTR,R5
MOV P1EXT(R5),(PC)+
$P1EXT: .WORD 0
DWENT:
.ENDC
MOV DWCQE,R5
MOV #DW$CSR,R4
TST .1224
BEQ .1052
MOV #10,20(R4) ;нач. установка
MOV #177777,.1224 ;флаг нач.установки
.1052:
MOV #1000.,R1
.1056: MOV #100000,R3
.1062: TST 20(R4)
BPL .1076 ;свободен
.1070: SOB R3,.1062
.1072: SOB R1,.1056 ;эмуляция тайм-аута(.IF B TIM$IT...)
BR .1216 ;облом...
.1076:
.1136:
MOV $RETRY,RETRY ;иниц. счетчика повторов
CLR .1230
CLR .1232 ;призн.= чтение
CLR .1234
MOV @R5,R3 ; Q$BLKN
MOVB Q$UNIT(R5),R0
BIC #177770,R0
BNE .1212 ;только DW0 - ошибка
MOVB Q$FUNC(R5),R0
ADD #5,R0
CMP R0,#6
BLO .1256
.1212: JMP .2664 ;ошибка
.1216: JMP .2664
DWWCHK: .WORD 0 ;флаг WCHECK
.1224: .WORD 177777
RETRY: .WORD 0
.1230: .WORD 0 ;0 или -1
.1232: .WORD 0 ;призн.чтения(+)-записи(-)-возвр(0)?
.1234: .WORD 0
WCNT: .WORD 0
.1240: .WORD 0 ;# цил.
.1242: .WORD 0 ;# поверхн.
.1244: .WORD 0 ;# сектора
.1254: .WORD 0
.1256:
ASL R0
ADD PC,R0
ADD #<.1270-.>,R0
ADD @R0,PC ;переход по коду функции
.1270: .WORD .1770-.1270 ;возвр.длину-20(для табл.замещения ?)
.1272: .WORD .2664-.1270 ;включ.чтения и возврат
.WORD .2664-.1270
.1276: .WORD .1304-.1270
.1300: .WORD .1304-.1270
.1302: .WORD .1310-.1270 ;запись(?)
.1304: MOV SP,(PC)+ ;(SP)=?
.1306: .WORD 0 ;....?
.1310: BIT #1,Q$BUFF(R5)
BNE .1616 ;нечетный адрес буфера
MOV #1,.1232 ;признак = чтение (?)
TST Q$WCNT(R5)
BMI DW$WRT
BNE DW$READ
JMP DWEXIT
DW$WRT:
BIT #20000,16(R4)
BNE .1612 ;ошибка записи
ASL #0
BCS .1366
TST NOWRIT
BNE .1616 ;установлено set dw nowrite
.1366:
MOV #20000,.1234
MOV #100000,.1232 ;запись
NEG Q$WCNT(R5) ;запись,исп-я как еще один флаг
DW$READ:
MOV R3,R1 ;q$blkn
TST .1306 ;призн.рабоы с уменьш.длиной
BEQ .1426
CMP R3,MAXBLK
BCC .1616
BR .1436
.1426:
CMP R3,.1250 ;использование таблицы замещения ?
BCC .1616
INC R1
.1436:
BIC #-20,R1 ;# сектора
ASR R3
ASR R3
ASR R3
ASR R3
MOV R3,R2
BIC #177774,R2
ASR R3
ASR R3
BIC #176000,R3
CMP R3,MAXCIL
.1472:
BCC .1616
MOV R3,.1240 ;тек. # цилиндра
MOV R2,.1242 ;тек. # поверхности
MOV R1,.1244 ;тек. # сектора
.1512:
MOV .1240,12(R4)
MOV .1242,14(R4)
MOV .1244,6(R4)
TST .1232 ;чтение/запись
BMI .1552
MOV #40,16(R4) ;чтение сектора
BR .1576
.1552:
BIC #1,.1232
MOV #60,16(R4) ;запись сектора
JSR R0,.2002
MOV (R2)+,@R4
MOV R5,@R4
.1576:
CLR .1306
BIS #100,@#174020 ;запрерить прерывание
RTS PC
.1612:
JMP .2664
.1616:
JMP .2664
.1622: BIT #20000,16(R4) ;ссылка на эту точку отсутствует ?!
BNE .1612 ;ошибка записи
MOV #20000,.1234
CMP Q$WCNT(R5),#20
BCS .1616
MOV #20,Q$WCNT(R5)
BIT #1,Q$BUFF(R5)
BNE .1616 ;нечетн. адр буфера
MOV R3,R2
BIC #177770,R2
CMP R2,#4
BHIS .1616 ;# поверхности > 3
ASR R3
ASR R3
ASR R3
CMP R3,MAXCIL
BHIS .1616
MOV R3,.1240
MOV R2,.1242
.1726:
MOV .1240,12(R4) ;# цилиндра
MOV .1242,14(R4) ;# поверхн.
MOV #120,16(R4) ;форматирование !!!
.1750:
JSR R0,.2002
MOV (R2)+,@R4
MOV R5,@R4
BIS #100,@#174020
RTS PC
.IF EQ MMG$T
.1770: MOV .1250,@Q$BUFF(R5)
.IFF
.1770: MOV R4,-(SP)
MOV .1250,-(SP)
MOV R5,R4
CALL @$PTWRD
MOV (SP)+,R4
.ENDC
JMP DWEXIT
.2002:
MOV R5,-(SP)
MOV R4,-(SP)
MOV (R0)+,.2126
MOV (R0)+,.2150
MOV R4,R3
ADD #20,R3
ADD #10,R4
MOV Q$BUFF(R5),R2
MOV Q$WCNT(R5),R1
BEQ .2132
MOV R1,WCNT
CMP R1,#400
BLOS .2060
MOV #400,R1
.2060:
TST .1232
BPL .2074
ASL #100000
BCS .2100
.2074:
SUB R1,WCNT
.2100:
.IF NE MMG$T
MOV Q$PAR(R5),PARVAL
JSR R0,@$P1EXT
.WORD PARVAL-.
.IFF
MOV R2,.1254
TST .1232
BPL .2120
ASL #100000
BCS .2126
.2120: ADD #1000,.1254
.ENDC
.2126: HALT ;сюда пишется команда см. .2002
.2130: SOB R1,.2126
.IF NE MMG$T
PARVAL: .WORD 0
TST .1232
BPL 1$
ASL #100000
BCS 2$
1$: ADD #<256./32.>,PARVAL
2$:
.ENDC
.2132:
MOV @R3,R5
BMI .2154
ASR R5
BCS .2154
ASLB R5
BPL .2132
.2146: CLR R5
.2150: .WORD 0 ;сюда пишется команда, см .2002
BR .2132
.2154:
TSTB @R3
BPL .2162
BR .2154
.2162:
MOV (SP)+,R4
MOV (SP)+,R5
RTS R0
.2170:
MOV R4,R2
ADD #20,R2
MOV R4,R3
ADD #10,R3
.2204:
MOV @R2,R1
ASR R1
BCS .2222
ASLB R1
BPL .2204
MOV @R3,R1
BR .2204
.2222:
TSTB @R2
BPL .2230
.2226: .WORD 0
.2230: RTS PC
.2232: JMP .2664
.2236: JMP DWEXIT
.DRAST DW,4
.2252: BIC #100,@#174020 ; запрет прерывания
.FORK DWFBLK ; 2720
.2266: MOV DWCQE,R5
MOV #DW$CSR,R4
TST 20(R4)
BMI .2232 ;занято
BIT .1234,16(R4) ;ошибка|запр.дан.|...(не совсем корректно)
BNE .2232
BIT #400,16(R4) ;ошибка
BNE .2452
TST .1230
BNE .2562
; IF ERR$L
MOV .1232,R0
BEQ .2236
BPL .2370
TST DWWCHK
BEQ .2402
ASR R0
BCC .2362
JSR PC,.2170
.2356:
BR .2402
.2362:
INC .1232
BR .2624
.2370:
BMI .2402
JSR R0,.2002
MOV @R4,(R2)+ ;эти команды вставляются вместо
MOV @R4,R5 ;HALTов
.2402:
MOV WCNT,6(R5)
BEQ .2236
.IF NE MMG$T
MOV PARVAL,Q$PAR(R5)
.IFF
MOV .1254,4(R5)
.ENDC
TST .1232
BPL .2434
ASL #100000
BCS .2436
.2434:
INC @R5
.2436:
MOV @R5,R3
MOV $RETRY,RETRY
JMP DW$READ
.2452:
TST .1230
BNE .2664
BIT #3000,4(R4)
BNE .2664
TSTB 20(R4)
BPL .2502
JSR PC,.2170
.2502:
BIT #10000,4(R4)
BEQ .2562
MOV 16(R4),R3
BIT #20000,R3
BNE .2664
BIC #127777,R3
CMP #50000,R3
BNE .2664
MOV #-1,.1230
MOV #20,16(R4)
BIS #100,@#174020
RTS PC
.2562:
DEC RETRY
BEQ .2664
CLR .1230
TST .1232
BEQ .2620
BPL .2614
BIT #1,.1232
BNE .2624
.2614:
JMP .1512
.2620:
JMP .1726
.2624:
MOV .1240,12(R4)
MOV .1242,14(R4)
MOV .1244,6(R4)
MOV #40,16(R4) ;чтение, без обнуления эл.очереди
BIS #100,@#174020
RTS PC
.2664:
BIS #1,@Q$CSW(R5)
CLR .1306
DWEXIT:
CLR .1224
.DRFIN DW
DWFBLK: .BLKW 5
.SBTTL BOOTSTRAP DRIVER
.DRBOT DW,BOOT1,READ
. = DWBOOT+40
BOOT1:
JMP @#BOOT-DWBOOT
. = DWBOOT+210
READ: MOV #DW$CSR,R4
MOV #23,.3162
.3160:
DEC (PC)+
.3162: .WORD 23
BEQ .3326 ;облом...
MOV #10,20(R4) ;INIT
MOV #1750,R3
.3200:
MOV #100000,R5
.3204:
TST 20(R4)
BPL .3220 ;готов(нет занятости)
SOB R5,.3204
SOB R3,.3200
BR .3326 ;облом...
.3220:
MOV R0,-(SP)
MOV R1,-(SP)
.3224:
MOV @SP,R1
CMP R1,#400
BLOS .3240
MOV #400,R1
.3240:
SUB R1,@SP
MOV 2(SP),R0
INC 2(SP)
MOV R0,R5
INC R5
BIC #177760,R5
MOV R5,6(R4)
ASR R0
ASR R0
ASR R0
ASR R0
MOV R0,R5
BIC #177774,R5
MOV R5,14(R4)
ASR R0
ASR R0
BIC #177000,R0
.3326:
JMP @#BIOERR-DWBOOT
.3332:
MOV R0,12(R4)
MOV #40,16(R4)
MOV R4,R0
ADD #20,R0
MOV R4,R5
ADD #10,R5
.3360:
TST @R0
BMI .3360
.3364: MOV #1000,R3
.3370: SOB R3,.
BIT #400,16(R4)
BEQ .3414
ADD R1,@SP
MOV (SP)+,R1
MOV (SP)+,R0
DEC R0
BR .3160
.3414:
MOV #23,.3162
.3422:
TSTB @R0
BPL .3422
.3426: MOV @R5,(R2)+
.3430: SOB R1,.3422
.3432:
BIT #1,@R0
BNE .3450
TSTB @R0
BPL .3432
TST @R5
BR .3432
.3450:
TST @SP
BNE .3224
CMP (SP)+,(SP)+
CLC
RTS PC
. = DWBOOT+574
BOOT: MOV #10000,SP
MOV #2,R0
MOV #<4*400>,R1
MOV #1000,R2
JSR PC,READ
MOV #READ-DWBOOT,@#B$READ
MOV #B$DNAM,@#B$DEVN
CLR @#B$DEVU
JMP @#B$BOOT
.DREND DW
.SBTTL INSTALL CHECK
.ASECT
.=200
NOP
1$: MOV #DW$CSR,R0
TST 20(R0)
BMI 1$
CMP #401,0(R0)
BNE 2$
TST (PC)+
2$: SEC
RTS PC
.END
.SBTTL I/O QUEUE ELEMENT FORMAT
DSECT GLOBAL=YES
DS Q.LINK,1,GLOBAL=NO
DS Q.CSW
DS Q.BLKN
DS Q.FUNC,1 BYTE
DS Q.JNUM,0 BYTES
DS Q.UNIT,1 BYTE
DS Q.BUFF
DS Q.WCNT
DS Q.COMP
.IF NE MMG$T
DS Q.PAR
DS Q.FREE,2
.ENDC
QESIZE = ..TEMP
QWDSIZ = QESIZE/2