|
|
1.1 root 1: #
2: # fake boot ROM for star, UDA50
3: #
4: # read block 0 of some specified drive into memory,
5: # and branch there, with registers set to point to
6: # a device driver that can read other blocks.
7: # register conventions a la the comet boot ROMs
8: # we expect to be loaded at address 0xfa00,
9: # and that we have 1024 bytes to squander there
10: # (like the four comet ROMs)
11: #
12: # assume first UNIBUS adapter, default UDA address
13: #
14:
15: #
16: # nautilus-specific defs
17: #
18: .set NMICSR,0x20080000 # nmi csrs -- device 0
19: .set NMIto2,30 # 0x40000000; add to get device 1
20: .set LOOP,0x10000 # csr0 loopback mode
21:
22: #
23: # DW780 defs
24: #
25:
26: .set MRV,0x80000000 # map register valid bit
27:
28: #
29: # UDA50 defs
30: #
31: .set IP,0 # word -- ip reg
32: .set SAR,2 # word -- read version of sa reg
33: .set SAW,2 # word -- write version of sa
34:
35: .set STEP0,10 # STEP1 == bit 11
36:
37: .set BPOWN,31 # bit 31 == port owns descriptor
38: .set RTOC,4
39:
40: #
41: # mscp defs
42: # packet offsets have 4 added to account for UQSSP header (mostly length)
43: #
44:
45: .set m_crf,4 # command ref number
46: .set m_unit,8 # disk unit number
47: .set m_opcd,12 # opcode
48: .set m_sts,14 # status (word)
49: .set RPKSIZE,16 # as much as we want on rcv
50: .set m_bcnt,16 # byte count
51: .set SOSIZE,20 # as much as we send for ONLINE
52: .set m_buff,20 # buffer address
53: .set m_lbn,32 # block number
54: .set SRSIZE,36 # as much as we send to read
55: .set SOSIZE,36 # as much as we send for ONLINE
56:
57: .set OPONL,011 # unit online
58: .set OPRD,041 # read block
59:
60: #
61: # boot ROM conventions
62: #
63: .set WMEM,0x200 # sp == some working memory + WMEM
64: # usually working memory == 0
65: .set BSIZE,512 # size of a block
66:
67:
68: ourstack:
69: .byte 'U,'D # ROM id (though we're not in a ROM)
70: #
71: # here to start off, at 0xfa02
72: # registers:
73: # r1 adapter and controller number: 0xuc, u==unibus, c==uda50
74: # r2 uninteresting to us; we put register addr there
75: # r3 unit number: 0xacuu: unit uu, controller c, adapter a
76: # r5 boot flags; ignored but preserved
77: # sp working memory + WMEM
78: #
79: # registers to save: r0 r1 r3 r5 r10 r11 ap sp
80: #
81: # assume the UNIBUS adapter is already OK
82: # fill in the map for the first 64KB
83: # (which means our ring phys addr == unibus addr)
84: #
85: movl sp,savesp
86: movab ourstack,sp
87: extzv $4,$4,r1,r2
88: movl ubamap[r2],r7
89: clrl r6
90: 0: bisl3 $MRV,r6,(r7)+
91: aobleq $64*2,r6,0b
92:
93: #
94: # init the UDA50
95: #
96:
97: extzv $0,$4,r1,r7
98: movl ubabase[r2],r2
99: addl2 udareg[r7],r2
100: clrw IP(r2) # kick into startup
101: 0: movw SAR(r2),r7
102: blss oops
103: bbc $STEP0+1,r7,0b # wait for step1
104: movw $0x8000,SAW(r2) # no vector, ring size (2^0,2^0)
105: 0: movw SAR(r2),r7
106: blss oops
107: bbc $STEP0+2,r7,0b # wait for step2
108: movab rsp,r6 # ring address
109: movw r6,SAW(r2)
110: 0: movw SAR(r2),r7
111: blss oops
112: bbc $STEP0+3,r7,0b # wait for step3
113: ashl $-16,r6,r6
114: movw r6,SAW(r2)
115: 0: movw SAR(r2),r7
116: blss oops
117: bbc $STEP0+4,r7,0b # wait for step4
118: movw $1,SAW(r2) # GO
119:
120: #
121: # read block 0 into bottom of memory
122: #
123:
124: pushl r0 # rblk eats it
125: movab rblk,r6 # set up device driver address
126: subl3 $WMEM,savesp,-(sp) # physical addr
127: # trick: we know driver doesn't use r5, so we needn't preserve boot flags
128: clrl r8 # block 0
129: jsb (r6)
130: blbc r0,oops
131: tstl (sp)+
132: movl (sp)+,r0
133: #
134: # start boot block
135: # registers now:
136: # r0 device type (unchanged)
137: # r1 adapter, controller (unchanged)
138: # r2 device register addr
139: # r3 device unit number (unchanged)
140: # r5 boot flags (unchanged)
141: # r6 address of our device driver
142: # sp `working memory + 0x200' (unchanged)
143: #
144: movl savesp,sp
145: jmp 0xc-WMEM(sp)
146:
147: #
148: # here when something is broken
149: #
150: oops: halt
151:
152: #
153: # device addresses
154: #
155: ubamap: .long 0x20006800, 0x20008800 # map regs for UNIBUS adapters adapters
156: ubabase:.long 0x20100000, 0x20140000 # UNIBUS space base addresses
157: udareg: .long 0772150, 0772160 # UDA50 addresses
158:
159: #
160: # device driver; called above and by boot block and friends
161: #
162: # r2 device registers
163: # r3 device unit number
164: # r5 buffer address, relative to `working memory' (ignored)
165: # 4(sp) physical buffer address; we use that
166: # r8 block number
167: #
168: # do not destroy r1-r6 r10 r11 ap
169: # on return, low bit of r0 set if we read it, clear if we failed
170: #
171: # always bring disk online, even if already is
172: #
173:
174: rblk:
175: movq r10,-(sp)
176: clrl r0 # assume failure
177: movab cp,r10
178: movab rp,r11
179: movab rsp,r9
180: movl r3,m_unit(r10) # make ONLINE packet
181: movzbl $OPONL,m_opcd(r10)
182: movzbl $SOSIZE,(r10)
183: clrl m_bcnt(r10) # ugh
184: clrl m_buff(r10) # ugh
185: clrl m_lbn(r10) # ugh
186: bsbb sendrcv
187: bneq rfail
188: movzbl $OPRD,m_opcd(r10) # now make READ packet
189: movl 4+8(sp),m_buff(r10) # unmapped address
190: movzwl $BSIZE,m_bcnt(r10)
191: movl r8,m_lbn(r10)
192: movzbl $SRSIZE,(r10)
193: bsbb sendrcv
194: bneq rfail
195: incl r0 # success
196: rfail: movq (sp)+,r10
197: rsb
198:
199: sendrcv:
200: movzbl $RPKSIZE,(r11)
201: movab m_crf(r10),RTOC(r9)
202: movab m_crf(r11),(r9)
203: bbss $BPOWN,(r9),0f # make response buffer available
204: 0: bbss $BPOWN,RTOC(r9),0f # send the ONLINE packet
205: 0: movw IP(r2),r7 # kick to make it go
206: 0: bbs $BPOWN,(r9),0b # wait for answer
207: tstb m_sts(r11) # tstb: ignore `already online' flag
208: rsb
209:
210: #
211: # UDA50 communication area
212: #
213: .align 2
214: savesp: .space 4 # working mem + WMEM
215: .space 8 # crap at the top
216: rsp: .space 4 # response descriptor
217: .space 4 # command descriptor
218:
219: #
220: # a pair of packets
221: # +4 for length
222: #
223:
224: cp: .space SRSIZE+4 # command packet
225: rp: .space RPKSIZE+4 # response packet
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.