То есть DSM-11
- - - Добавлено - - -
Код:
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
Код:
add #dlmp,r1 ;point at multi-purpose reg
mov #-<1000/2>,(r1) ;word count = 1 block
clr -(r1) ;disk addr = 0/0/0
.assume dlda eq dlmp-2
clr -(r1) ;bus addr = 0
.assume dlba eq dlda-2
add #dlrdd-dlsek,r2 ;change cmd to "read"
mov r2,-(r1) ;start cmd
.assume dlcs eq dlba-2
50$: bit #dlerr!dlrdy,(r1) ;wait for error or success
beq 50$
bmi 60$ ;error
.assume dlerr eq 100000
clr pc ;happy, drop into boot block
60$: ; error of some kind, just give up
halt
Код:
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
Код:
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
Код:
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
Везде передаётся CSR. Берем документацию на RK11 - адрес CSR по умолчанию 177404
На этом для себя обсуждение считаю законченным.