|
|
1.1 ! root 1: /* ! 2: * RP??/RM?? disk boot program to load "/boot" from ! 3: * a UNIX filesystem (starting at block 1 on pack on ! 4: * drive 0) into low core and to execute that file. ! 5: * This program can only read regular small version 7 files ! 6: * from the root of a UNIX filesystem. ! 7: */ ! 8: .set BLKSIZ,1024 /* file system block size */ ! 9: .set RELOC,0x70000 ! 10: .set HDRSIZ,040 ! 11: .set INOSIZ,64 /* no. bytes/inode entry */ ! 12: .set INOBLK,BLKSIZ/INOSIZ /* no. inodes/disc block */ ! 13: .set INOMSK,0xfffffff0 /* changes with inode size */ ! 14: .set NAMSIZ,14 /* bytes in directory name */ ! 15: .set ENTADR,024 /* offset to entry addr in a.out */ ! 16: .set DIRSIZ,16 /* size of directory entry, bytes */ ! 17: .set ROOTINO,2 /* root dir inode no. */ ! 18: .set NBOO,1 ! 19: .set NSUP,1 ! 20: /* MBA registers */ ! 21: .set M_cr,4 /* MBA control reg */ ! 22: .set M_var,12 /* MBA virt addr reg */ ! 23: .set M_bc,16 /* MBA byte count reg */ ! 24: .set M_map,0x800 /* start of MBA map reg's */ ! 25: .set MBAinit,1 /* MBA init bit in MBA control reg */ ! 26: /* Drive information */ ! 27: .set RP6TRK,19 ! 28: .set RP6SEC,22 ! 29: .set RM3SEC,32 ! 30: .set RM3TRK,5 ! 31: .set RM5SEC,32 ! 32: .set RM5TRK,19 ! 33: .set RM80SEC,31 ! 34: .set RM80TRK,14 ! 35: .set RP7TRK,32 ! 36: .set RP7SEC,50 ! 37: .set RP6typ,022 ! 38: .set RM3typ,024 ! 39: .set RM5typ,027 ! 40: .set RM80typ,026 ! 41: .set RP7typ,042 ! 42: .set RP,0x400 /* start of drive registers */ ! 43: .set RP_cr,RP+0 /* control status register */ ! 44: .set RP_sr,RP+4 /* drive status reg */ ! 45: .set RP_stk,RP+0x14 /* desired track/sector reg */ ! 46: .set RP_dt,RP+0x18 /* drive type reg */ ! 47: .set RP_off,RP+0x24 /* RP offset reg */ ! 48: .set RP_cyl,RP+0x28 /* desired cyl reg */ ! 49: /* RP06 function codes, status bits */ ! 50: .set RP_GO,1 /* go */ ! 51: .set RP_RED,070 /* read */ ! 52: .set RP_DC,010 /* drive clear */ ! 53: .set RP_RIP,020 /* read in preset */ ! 54: .set RP_FMT,0x1000 /* format 22 */ ! 55: .set RP_MOL,0x1000 /* medium on line */ ! 56: .set RP_DRY,0200 /* drive ready */ ! 57: .set RP_ERR,040000 /* composite error */ ! 58: .set RP_pDRY,7 /* bit position of RP_DRY */ ! 59: .set RP_pERR,14 /* bit position of RP_ERR */ ! 60: ! 61: init: ! 62: .word 0 /* entry mask for DEC monitor */ ! 63: nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ ! 64: nop;nop; ! 65: start: ! 66: movl r5,r11 ! 67: movl $RELOC,sp ! 68: moval init,r6 ! 69: movc3 $end,(r6),(sp) ! 70: jmp *$RELOC+start1 ! 71: /* running relocated */ ! 72: start1: ! 73: /* get cpu type */ ! 74: .set SID,0x3e ! 75: mfpr $SID,r0 ! 76: extzv $24,$8,r0,r0 ! 77: ashl $2,r0,r1 ! 78: /* get mba location and init it */ ! 79: moval physMBA,r2 ! 80: addl3 r1,r2,r3 ! 81: movl (r3),r9 ! 82: movl $MBAinit,M_cr(r9) ! 83: /* read-in-preset the drive and set format */ ! 84: movl $RP_RIP+RP_GO,RP_cr(r9) ! 85: movl $RP_FMT,RP_off(r9) ! 86: /* get drive type */ ! 87: movl RP_dt(r9),r0 ! 88: cmpb $RP6typ,r0; bneq 1f; movzwl $(RP6SEC<<8)|RP6TRK,r1; 1: ! 89: cmpb $RM3typ,r0; bneq 1f; movzwl $(RM3SEC<<8)|RM3TRK,r1; 1: ! 90: cmpb $RM5typ,r0; bneq 1f; movzwl $(RM5SEC<<8)|RM5TRK,r1; 1: ! 91: cmpb $RM80typ,r0; bneq 1f; movzwl $(RM80SEC<<8)|RM80TRK,r1; 1: ! 92: cmpb $RP7typ,r0; bneq 1f; movzwl $(RP7SEC<<8)|RP7TRK,r1; 1: ! 93: movzbl r1,*$rptrk ! 94: ashl $-8,r1,r1 ! 95: movzbl r1,*$rpsec ! 96: mull3 *$rpsec,*$rptrk,*$rpst ! 97: start2: ! 98: /* search for ``boot'' program in root inode */ ! 99: movl $names+RELOC,r6 ! 100: movzbl $ROOTINO,r0 ! 101: nxti: ! 102: clrw *$bno ! 103: bsbw iget ! 104: tstb (r6) ! 105: beql getfil ! 106: get1b: ! 107: bsbw rmblk ! 108: beql start2 ! 109: movl $buf,r7 ! 110: nxtent: ! 111: tstw (r7) ! 112: beql dirchk ! 113: cmpc3 $NAMSIZ,(r6),2(r7) ! 114: bneq dirchk ! 115: movzwl (r7),r0 ! 116: addl2 $NAMSIZ,r6 ! 117: brb nxti ! 118: dirchk: ! 119: acbl $buf+BLKSIZ-1,$DIRSIZ,r7,nxtent ! 120: brb get1b ! 121: /* found inode, get desired file */ ! 122: getfil: ! 123: clrl bufptr ! 124: getlop: ! 125: bsbb rmblk ! 126: beql clear ! 127: addl2 $BLKSIZ,bufptr ! 128: brb getlop ! 129: /* clear core and execute program */ ! 130: clear: ! 131: movl *$size,r3 ! 132: clrcor: ! 133: clrq (r3) ! 134: acbl $RELOC,$8,r3,clrcor ! 135: /* run loaded program */ ! 136: clrl r10 /* major("/dev/hp0a") */ ! 137: calls $0,*$0 ! 138: brw start2 ! 139: /* iget: get inode whose number is in r0 */ ! 140: iget: ! 141: addl3 $(INOBLK*(NBOO+NSUP))-1,r0,r8 ! 142: divl3 $INOBLK,r8,r4 ! 143: bsbw rblk ! 144: bicl2 $INOMSK,r8 ! 145: mull2 $INOSIZ,r8 ! 146: addl2 $buf,r8 ! 147: movc3 $time-inode,(r8),*$inode ! 148: rsb ! 149: /* rmblk: read block bno into addr */ ! 150: rmblk: ! 151: movzwl *$bno,r0 ! 152: addw2 $3,*$bno ! 153: addl2 $addr,r0 ! 154: /* this boot assumes only small files (<=20 blocks) */ ! 155: extzv $0,$24,(r0),r4 ! 156: bneq rblk ! 157: rsb ! 158: /* rblk: read block in r4 */ ! 159: rblk: ! 160: mull2 $BLKSIZ/512,r4 ! 161: clrl r5 ! 162: ediv *$rpst,r4,RP_cyl(r9),r1 ! 163: clrl r2 ! 164: ediv *$rpsec,r1,r1,r0 ! 165: insv r1,$8,$5,r0 ! 166: movl r0,RP_stk(r9) ! 167: movl $-BLKSIZ,M_bc(r9) ! 168: ashl $-9,bufptr,r0 ! 169: bisl3 $0x80000000,r0,M_map(r9) ! 170: incl r0 ! 171: bisl3 $0x80000000,r0,M_map+4(r9) ! 172: clrl M_var(r9) ! 173: movl $RP_RED+RP_GO,RP_cr(r9) ! 174: rprdy: ! 175: movl RP_sr(r9),r0 ! 176: bbc $RP_pDRY,r0,rprdy ! 177: bbs $RP_pERR,r0,rperr ! 178: bicpsw $2 ! 179: rsb ! 180: rperr: ! 181: halt ! 182: ! 183: bufptr: .long buf ! 184: names: ! 185: .byte 'b,'o,'o,'t,0,0,0,0,0,0,0,0,0,0 ! 186: .byte 0 ! 187: ! 188: .align 2 ! 189: physMBA: ! 190: .long 0 ! 191: .long 0x20010000 ! 192: .long 0xf28000 ! 193: ! 194: end: ! 195: .set buf,RELOC-1536 ! 196: .set inode,RELOC-512 ! 197: .set mode,inode ! 198: .set nlink,mode+2 ! 199: .set uid,nlink+2 ! 200: .set gid,uid+2 ! 201: .set size,gid+2 ! 202: .set addr,size+4 ! 203: .set time,addr+40 ! 204: .set bno,time+12 ! 205: .set rptrk,bno+4 ! 206: .set rpsec,rptrk+4 ! 207: .set rpst,rpsec+4
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.