;+
;
; TC11/TU55,TU56 DECtape boot device driver.
;
; By John Wilson. This file is hereby released into the public domain.
;
; 01/12/97 JMBW Created.
;
;-
tcst= 0 ;(777340) status register
tccm= 2 ;(777342) command register
tcwc= 4 ;(777344) word count
tcba= 6 ;(777346) bus address
tcdt= 10 ;(777350) data register
;
dtrtry= 5 ;max retry count
;
dterr= 100000 ;error bit (sets RDY)
dtrev= 4000 ;reverse direction (forwards if 0)
dtrdy= 200 ;ready
;
dtsat= 0*2 ;stop all transports
dtrnm= 1*2 ;read block number
dtrdd= 2*2 ;read data
dtral= 3*2 ;read all
dtsst= 4*2 ;stop selected transport
dtwtm= 5*2 ;write timing and mark tracks
dtwrd= 6*2 ;write data
dtwal= 7*2 ;write all
;
do= 1 ;set to start command in bits <3:1>
;
.btini
;DECtape init code
mov #177340,bcsr ;DUP.SAV doesn't set R1 for us, normal?
mov bcsr,r0 ;get base CSR
movb 1(r0),r1 ;get unit #
bic #^C7,r1 ;isolate
mov r1,bunit ;save
.btfin ;finish up boot process
;+
;
; TC11/TU55,TU56 bootstrap read driver.
;
; r5 memory addr
; r4 block count
; r3 starting block
;
;-
read: mov #dtrtry,(pc)+ ;init retry count
retry: .blkw ;retry count
10$: ; search for starting block
mov bcsr,r1 ;pick up CSR
mov r3,r2 ;copy
sub #5.,r2 ;offset to allow for turnaround
20$: ; search backwards
mov bunit,r0 ;pick up unit
swab r0 ;in LH
bis #dtrev!dtrnm!do,r0 ;reverse, RNUM, go
mov r0,tccm(r1)
30$: bit #dterr!dtrdy,tccm(r1) ;done?
beq 30$ ;spin
bmi 70$ ;punt on error
cmp tcdt(r1),r2 ;there yet?
bgt 20$ ;keep rewinding if it's before here
;(signed because SUB above might go negative)
40$: ; search forwards
bic #dtrev,r0 ;forward, RNUM, go
mov r0,tccm(r1)
50$: bit #dterr!dtrdy,tccm(r1) ;done?
beq 50$ ;wait
bmi 80$ ;punt on error
cmp tcdt(r1),r3 ;there yet?
blt 40$ ;no, keep going
bgt 20$ ;missed it, go back
; got it, now read
add #tcba,r1 ;skip to TCBA
mov r5,(r1) ;write BA
mov r4,r2 ;get block count
swab r2 ;word count
neg r2 ;2's comp
mov r2,-(r1) ;write TCWC
bic #^C<7*400>,r0 ;isolate unit
bis #dtrdd!do,r0 ;cmd=read data
mov r0,-(r1) ;start cmd
sub #tccm,r1 ;back to base CSR in case of error
60$: bit #dterr!dtrdy,tccm(r1) ;done?
beq 60$ ;wait
bmi 90$ ;retry
add #dtsst-dtrdd,r0 ;change cmd to "stop selected transport"
mov r0,tccm(r1)
rti
70$: ; error while rewinding
tst (r1) ;check ENDZ bit
bmi 40$ ;off begn, try forwards now
;... drop through (check again, who cares)
80$: ; error while fast-forwarding
tst (r1) ;check ENDZ bit
bmi 20$ ;off end, try backwards now
90$: dec retry ;count the try
bne 10$ ;keep going
bic #^C<7*400>,r0 ;isolate unit
bis #dtsst!do,r0 ;cmd=stop
mov r0,tccm(r1)
bpt ;give up
;
.end boot