;+ ; ; 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