;+ ; ; A9 boot PROM for RK02/03/05 and TU55/56. ; ; By John Wilson . ; This program is hereby placed in the public domain. ; ; 10/20/2000 JMBW Created. ; ;- dk$csr= 177404 ;base RK11 CSR dt$csr= 177342 ;base TC11 CSR ; ; RK11 stuff ; dkds= -4 ;(777400) drive status dker= -2 ;(777402) error dkcs= 00 ;(777404) control/status dkwc= 02 ;(777406) word count dkba= 04 ;(777410) bus addr dkda= 06 ;(777412) disk addr dkdb= 10 ;(777416) data buf (none of our business) ; dkerr= 100000 ;error bit dkscp= 20000 ;search complete dkrdy= 200 ;ready ; dkcrs= 0*2 ;control reset dkwrd= 1*2 ;write data dkrdd= 2*2 ;read data dksek= 4*2 ;seek dkdrs= 6*2 ;drive reset ; dkgo= 1 ;GO bit ; ; TC11 stuff ; dtst= -2 ;(777340) status register dtcm= 00 ;(777342) command register dtwc= 02 ;(777344) word count dtba= 04 ;(777346) bus address dtdt= 06 ;(777350) data register ; 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 ; dtdo= 1 ;set to start command in bits <3:1> ; ; Macro to check an assumption about constants: ; .macro .assume a,cond,b .if cond - .iff .err ; assumption a cond b is false .endc .endm ; ; ROM header ; .asect .= 0 name: .word 'D*400!'K ;DK, backwards .word next-. ;offset to next PROM nodiag: ; no-diags DK0: entry is at +4 br dk0 ;skip diags diag: ; diag DK0: entry is at +6 ;;; diags like what? dk0: clr r0 ;no console emulator, always use unit #0 .= 10 ;(already there) go: ; +10 -- unit # in R0 br go1 ; +12 -- unit # in R0 ;;; supposed diags here too? no space anyway go1: mov #dk$csr,r1 ;R1 points at base CSR mov pc,r4 ;must point 20 bytes past signature .assume . eq 20 mov r0,r2 ;copy unit # clc ;C=0 ror r2 ;move into <15:13> br dkboot ;go finish up ; ; Second header for DT: bootstrap ; next: .word 'D*400!'T ;DT, backwards .word 200-. ;offset to next PROM ; no-diags DT0: entry is at +4 br dt0 ;skip diags ; diag DT0: entry is at +6 ;;; diags like what? dt0: clr r0 ;no console emulator, always use unit #0 .= next+10 ;(already there) ; +10 -- unit # in R0 br go2 ; +12 -- unit # in R0 ;;; supposed diags here too? no space anyway go2: mov #dt$csr,r1 ;R1 points at base CSR mov pc,r4 ;must point 20 bytes past signature .assume . eq next+20 ; rewind until we run into the end zone mov r0,r2 ;copy unit # swab r2 ;unit # in <10:8> bis #dtrev!dtrnm!dtdo,r2 ;compose RNUM reverse command mov r2,(r1) ;start cmd 10$: tstb (r1) ;wait for expected ENDZ error bpl 10$ ;(nothing we can do if doesn't happen) ; search forwards for block 0 bic #dtrev,r2 ;compose RNUM forward command mov r2,(r1) ;start cmd 20$: tstb (r1) ;wait for completion bpl 20$ ;(ignore errors) add #dtdt,r1 ;point at data reg bit #7777,(r1) ;12 LSBs of block # =0? ;(in case formatted by PDP-8, 6 junk MSBs) bne . ;hang if not ; read it clr -(r1) ;bus addr = 0 .assume dtba eq dtdt-2 mov #-<1000/2>,-(r1) ;word count = 1 block .assume dtwc eq dtba-2 add #dtrdd-dtrnm,r2 ;change to RDATA command mov r2,-(r1) ;start cmd .assume dtcm eq dtwc-2 30$: tstb (r1) ;wait for completion bpl 30$ ;(ignore errors) add #dtsst-dtrdd,r2 ;change to SST cmd (stop selected transport) mov r2,(r1) ;stop the drive clr pc ;drop into boot block ; dkboot: ; DK: boot, continued ror r2 ;(finish getting unit in <15:13>) ror r2 ror r2 add #dkda,r1 ;point at disk addr mov r2,(r1) ;set unit, C/H/S=0/0/0 clr -(r1) ;bus addr = 0 .assume dkba eq dkda-2 mov #-<1000/2>,-(r1) ;word count for one block .assume dkwc eq dkba-2 mov #dkrdd!dkgo,-(r1) ;start command .assume dkcs eq dkwc-2 10$: tstb (r1) ;wait for completion bpl 10$ ;(ignore errors, will be obvious) clr pc ;drop into boot block ; .end