|
|
1.1 root 1: #
2: # pseudo-boot-rom for MASSBUS SMD disks on the star
3: #
4:
5: #
6: # massbus adapter stuff
7: #
8:
9: .set MBASR, 8 # mba status
10: .set MBAVAD, 12 # mba virtual address
11: .set MBABCR, 16 # mba byte count
12: .set MBAREG, 0x400 # start of external registers
13: .set MBAMAP, 0x800 # start of mapping regs
14:
15: .set REGSIZ, 32*4 # size of register space per unit
16:
17: .set V_B, 31 # bit number of `valid' in map reg
18:
19: .set MBBUSY_B, 31 # `busy' bit in mbasr
20: .set MBERR, 0x1000 # error bits in mbasr
21:
22: #
23: # rm controller stuff
24: #
25:
26: #
27: # register offsets
28: #
29: .set HPCS1, 0 # control/status 1
30: .set HPDS, 4 # driver status
31: .set HPDA, 20 # sector & track
32: .set HPDT, 24 # driver type
33: .set HPSN, 32 # serial number
34: .set HPOF, 36 # offset
35: .set HPDC, 40 # cylinder
36:
37: #
38: # useful bits in various registers
39: #
40: .set PRESET, 021 # read in preset
41: .set PACKACK, 023 # pack acknowledge
42: .set READ, 071 # read
43:
44: .set FMT22, 010000 # pdp11 format
45:
46: #
47: # vax stuff
48: #
49:
50: .set PGSIZ, 512 # size of a page/disk sector
51:
52: #
53: # bootstrap stuff
54: #
55:
56: .set BOOT, 0xc # start address in boot block
57: .set TYPE, 0 # device type; 0 == massbus
58: .set SSIZE, 0x20 # stack space needed
59:
60: #
61: # initial bootstrap
62: # read boot block,
63: # set up regs for it
64: # and jump there
65: #
66: # start:
67: # r1 = mba address
68: # r2 = rubbish
69: # r3 = device unit number, assumed == mba controller number
70: # assume sp == 0x200, ie first 64K of memory are good
71: #
72: # finish:
73: # r3, r5, r10, r11, ap, sp as when started
74: # r0 == type of boot device
75: # r1 == mba address still
76: # r2 == controller number
77: # r3 == unit number
78: # r5 == software flags
79: # r6 == address of our driver
80: # sp == 0x200 again
81: #
82:
83: .byte 'P, 'H # device type for rom
84: boot:
85: addl2 $SSIZE,sp # move stack away from boot block
86: movab driver,r6
87: movl r3,r2 # unit == controller (??)
88: mull3 $REGSIZ,r2,r7
89: addl2 $MBAREG,r7
90: addl2 r1,r7 # r7 = address of device registers
91: movzbl $PRESET,HPCS1(r7) # pack acknowledge
92: movzwl $FMT22,HPOF(r7) # pdp-11 format
93:
94: clrl r8 # read block 0
95: clrl -(sp) # onto physadr 0
96: jsb (r6) # call our driver
97: bbad: blbc r0,bbad # hang if error
98: movl $TYPE,r0 # ok, get device type
99: subl2 $SSIZE-4,sp # fix up sp
100: jmp *$BOOT # and run boot block
101:
102: #
103: # table of device types:
104: # each a longword of
105: # (byte) type, (byte) sectors per track, (word) sectors per cylinder
106: # table is reversed for hackish reasons
107: #
108: .long 0
109: .byte 024, 32; .word 32*5 # RM03
110: .byte 027, 32; .word 32*19 # RM05
111: .byte 022, 22; .word 22*19 # RP06
112: .byte 021, 22; .word 22*19 # RP05
113: .byte 042, 50; .word 50*32 # RP07
114: typtab:
115: # fuji/emulex drives left out on purpose for now;
116: # not worth the extra code till someone has one
117:
118: #
119: # driver subroutine
120: # read one block into a specified place
121: # args:
122: # r1 == mba address
123: # r2 == controller number within mba
124: # r3 == unit number (usually == r2)
125: # r5 == offset from beginning of memory; ignored
126: # r6 == our address
127: # r8 == desired block number
128: # 4(sp) == physical address to read to
129: #
130: # preserve r1-r6 r10 r11 ap sp
131: #
132:
133: driver:
134: mull3 $REGSIZ,r2,r7 # compute device addr
135: addl2 $MBAREG,r7
136: addl2 r1,r7
137: movzbl $PACKACK,HPCS1(r7) # just in case
138: moval typtab,r9
139: 0: tstl -(r9)
140: bneq 1f
141: rsb
142: 1: movl HPDT(r7),r0
143: cmpb r0,(r9) # compare types
144: bneq 0b
145: extzv $8,$8,(r9),-(sp) # sec per track
146: extzv $16,$16,(r9),-(sp) # sec per cyl
147: clrl r9 # make r8+r9 == quadword block number
148: ediv (sp)+,r8,HPDC(r7),r8 # r8 == offset in cyl; da == cyl
149: ediv (sp)+,r8,r9,r8 # r8 == sect; r9 == track
150: insv r9,$8,$8,r8 # high part of r8 == track
151: movl r8,HPDA(r7)
152: divl3 $PGSIZ,4(sp),r9 # get phys page number
153: bbss $V_B,r9,0f # make map reg contents
154: 0: movl r9,MBAMAP(r1) # set up map
155: addl3 $1,r9,MBAMAP+4(r1) # in case page unaligned
156: bicl3 $~(PGSIZ-1),4(sp),MBAVAD(r1) # offset within page
157: movzwl $-PGSIZ,MBABCR(r1) # byte count
158: mnegl $1,MBASR(r1) # clear error bits
159: movzbl $READ,HPCS1(r7) # start xfer
160: 1:
161: movl MBASR(r1),r9
162: bbs $MBBUSY_B,r9,1b # spin until not busy
163: clrl r0 # assume bad
164: bitl $MBERR,r9 # any error bits?
165: bneq 2f # yep
166: incl r0 # no, remember ok
167: 2: rsb
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.