;+ ; ; A9 boot PROM for RX02. ; ; By John Wilson . ; This program is hereby placed in the public domain. ; ; 10/20/2000 JMBW Created. ; ;- dy$csr= 177170 ;base RX211 (etc.) CSR ; dycs= 0 ;(777170) control/status dydb= 2 ;(777172) data buffer (function specific) ; dyerr= 100000 ;error bit dyini= 40000 ;control reset rx211= 4000 ;RX211 controller (vs. RX11) dyhs= 1000 ;head select dydd= 400 ;double density select dytr= 200 ;transfer request dydone= 40 ;finished previous func dyus= 20 ;unit select ; dyemp= 1*2 ;empty buffer dyrds= 3*2 ;read sector ; dygo= 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!'Y ;DY, backwards .word 200-. ;offset to next PROM nodiag: ; no-diags DY0: entry is at +4 br dy0 ;skip diags diag: ; diag DY0: entry is at +6 ;;; diags like what? dy0: 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 #dy$csr,r1 ;R1 points at base CSR mov pc,r4 ;must point 20 bytes past signature .assume . eq 20 restrt: ; retry mov #dyrds!dygo,r2 ;init command, assume SD (about to flip it) tst r0 ;unit 1? beq 10$ bis #dyus,r2 ;yes, set unit select bit 10$: ; try other density add #dydd,r2 ;flip DD flag bic #dydd*2,r2 ;(clear carry) mov #1,r3 ;starting sector # clr r5 ;init memory address 20$: ; read next sector ; R2="read sector" cmd including DD flag, R3=sector number, R5=addr mov r2,(r1) ;start cmd 30$: tstb (r1) ;wait for transfer request bpl 30$ ;(ignore errors) mov r3,dydb(r1) ;write sector number 40$: tstb (r1) ;wait for transfer request bpl 40$ ;(ignore errors) mov #1,dydb(r1) ;write track # (always 1 for block 0) 50$: bit #dyerr!dydone,(r1) ;wait for error or completion beq 50$ bmi 10$ ;error, try other density .assume dyerr eq 100000 ; success, empty silo add #dyemp-dyrds,r2 ;change command to "empty silo" mov r2,(r1) ;start cmd 60$: tstb (r1) ;wait for transfer request bpl 60$ ;(ignore errors) add #dyrds-dyemp,r2 ;(restore "read sector" command) mov #128./2,sp ;SD word count (not using stack, so...) cmp r2,sp ;double density? .assume dydd ge 128./2 .assume dyus!dyrds!dygo lt 128./2 blo 70$ ;no asl sp ;yes, DD word count 70$: mov sp,dydb(r1) ;set word count 80$: tstb (r1) ;wait for transfer request bpl 80$ ;(ignore errors) mov r5,dydb(r1) ;write core addr 90$: bit #dydone,(r1) ;wait for completion beq 90$ ;(ignore errors) add sp,r5 ;bump addr by sector size add sp,r5 ;(twice for byte address) ; 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