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