;+ ; ; A9 boot PROM for RK06/07. ; ; By John Wilson . ; This program is hereby placed in the public domain. ; ; 10/20/2000 JMBW Created. ; ;- dm$csr= 177440 ;base RK611 CSR ; dmcs1= 00 ;(777440) control/status 1 dmwc= 02 ;(777442) word count dmba= 04 ;(777444) bus addr dmda= 06 ;(777446) disk addr dmcs2= 10 ;(777450) control/status 2 dmds= 12 ;(777452) drive status dmer= 14 ;(777454) error dmas= 16 ;(777456) attn summary/offset dmdc= 20 ;(777460) desired cyl ; 22 ;(777462) unused R/W register dmdb= 24 ;(777464) data buf dmmr1= 26 ;(777466) maint reg 1 dmecps= 30 ;(777470) ECC posn dmecpt= 32 ;(777472) ECC pattern dmmr2= 34 ;(777474) maint reg 2 dmmr3= 36 ;(777476) maint reg 3 ; ; DMCS1 bits: dmerr= 100000 ;composite error dmcdt= 2000 ;controller('s idea of) drive type, 1=07, 0=06 dmrdy= 200 ;ready ; dmsel= 00*2 ;select drive dmack= 01*2 ;pack acknowledge dmdcl= 02*2 ;drive clear dmrcl= 05*2 ;recalibrate dmrdd= 10*2 ;read data ; dmgo= 1 ;"GO" bit ; ; DMER bits: dmdck= 100000 ;data check error dmech= 100 ;DCK error is not ECC correctable ; ; 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!'M ;DM, backwards .word 200-. ;offset to next PROM nodiag: ; no-diags DM0: entry is at +4 br dm0 ;skip diags diag: ; diag DM0: entry is at +6 ;;; diags like what? dm0: 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 #dm$csr,r1 ;R1 points at base CSR mov pc,r4 ;must point 20 bytes past signature .assume . eq 20 mov #dmrdd!dmgo,r2 ;"read" command, as RK06 first time through 10$: ; read block 0, R2 contains "read" command including CDT bit mov #dmerr,(r1) ;controller clear ;;; need to select drive first? clr dmdc(r1) ;desired cyl = 0 add #dmcs2,r1 ;point at DMCS2 mov r0,(r1) ;set unit # clr -(r1) ;disk addr=0/0 (track/sector) .assume dmda eq dmcs2-2 clr -(r1) ;bus addr = 0 .assume dmba eq dmda-2 mov #-<1000/2>,-(r1) ;word count = 1 block .assume dmwc eq dmba-2 mov r2,-(r1) ;"read" command 20$: bit #dmerr!dmrdy,(r1) ;wait for error or success bpl 30$ ;success .assume dmerr eq 100000 ;;; we have lots of space, maybe we can fix soft ECC errors? ; assume drive type mismatch, try it both ways (RK06 vs. RK07) add #dmcdt,r2 ;assume tried as RK06, now do RK07 bit #dmcdt,r2 ;or did we do that already? bne 10$ ;no, do it now br . ;error, hang 30$: clr pc ;happy, drop into boot block ; .end