;+ ; ; A9 boot PROM for RX01. ; ; By John Wilson . ; This program is hereby placed in the public domain. ; ; 10/20/2000 JMBW Created. ; ;- dx$csr= 177170 ;base RX11 (etc.) CSR ; dxcs= 0 ;(777170) control/status dxdb= 2 ;(777172) data buffer (function specific) ; dxerr= 100000 ;error bit dxini= 40000 ;control reset dxtr= 200 ;transfer request dxdone= 40 ;finished previous func dxus= 20 ;unit select ; dxemp= 1*2 ;empty buffer dxrds= 3*2 ;read sector ; dxgo= 1 ;GO bit ; ; 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!'X ;DX, backwards .word 200-. ;offset to next PROM nodiag: ; no-diags DX0: entry is at +4 br dx0 ;skip diags diag: ; diag DX0: entry is at +6 ;;; diags like what? dx0: 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 #dx$csr,r1 ;R1 points at base CSR mov pc,r4 ;must point 20 bytes past signature .assume . eq 20 restrt: ; retry mov #dxrds!dxgo,r2 ;"read sector" command tst r0 ;unit 1? beq 10$ bis #dxus,r2 ;yes, set unit select bit 10$: mov #1,r3 ;starting sector # clr r5 ;init memory address 20$: ; read next sector ; R2=read cmd, R3=sector number, R5=address mov r2,(r1) ;start cmd 30$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request beq 30$ bmi restrt ;error, start over .assume dxerr eq 100000 mov r3,dxdb(r1) ;write sector number 40$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request beq 40$ bmi restrt ;error, start over .assume dxerr eq 100000 mov #1,dxdb(r1) ;write track # (always 1 for block 0) 50$: bit #dxerr!dxdone,(r1) ;wait for error or completion beq 50$ bmi restrt ;error .assume dxerr eq 100000 ; success, empty silo add #dxemp-dxrds,r2 ;change command to "empty silo" mov r2,(r1) ;start cmd 60$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request beq 60$ bmi restrt ;error, start over .assume dxerr eq 100000 add #dxrds-dxemp,r2 ;restore "read sector" command 70$: bit #dxerr!dxtr,(r1) ;wait for error or transfer request beq 70$ bmi restrt ;error, start over .assume dxerr eq 100000 movb dxdb(r1),(r5)+ ;read next data byte bit #177,r5 ;reached multiple of 128.? bne 70$ ;loop if not ; bump to next sector add #2,r3 ;skip 2 sectors (2:1 soft interleave) cmp r5,#1000 ;done whole block? blo 20$ ;loop if not clr pc ;happy, drop into boot block ; .end