|
|
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.