|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980,1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: /* "@(#)hpboot.c 7.2 (Berkeley) 8/28/86" */ ! 8: #include <sys/disklabel.h> ! 9: ! 10: ! 11: /* ! 12: * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from ! 13: * boot sectors of file system and sets it up to run. ! 14: * Reads from the controller and drive passed in from the boot ! 15: * rom. ! 16: * R1: address of the boot device's adapter ! 17: * R2: controller number of the boot device ! 18: * R3: unit number of the boot device ! 19: * R5: software boot control flags ! 20: * R6: address of driver subroutine from ROM ! 21: * SP: base address of usable memory + 0x200 ! 22: */ ! 23: .set BOOTSIZE,15 /* size of boot in sectors */ ! 24: .set RELOC,0x70000 ! 25: /* MBA registers */ ! 26: .set M_cr,4 /* MBA control reg */ ! 27: .set M_sr,8 /* MBA status reg */ ! 28: .set M_var,12 /* MBA virt addr reg */ ! 29: .set M_bc,16 /* MBA byte count reg */ ! 30: .set M_map,0x800 /* start of MBA map reg's */ ! 31: .set MBAinit,1 /* MBA init bit in MBA control reg */ ! 32: .set MBABUSY,0x80000000 /* MBA SR: data transfer busy */ ! 33: .set pMBABUSY,31 /* bit position of MBABUSY */ ! 34: /* Drive information */ ! 35: .set RP,0x400 /* start of drive registers */ ! 36: .set RPDR,0x80 /* offset per drive unit */ ! 37: .set RP_cr,0 /* control status register */ ! 38: .set RP_sr,4 /* drive status reg */ ! 39: .set RP_stk,0x14 /* desired track/sector reg */ ! 40: .set RP_dt,0x18 /* drive type reg */ ! 41: .set RP_off,0x24 /* RP offset reg */ ! 42: .set RP_cyl,0x28 /* desired cyl reg */ ! 43: .set RPBPSECT,512 /* bytes per sector */ ! 44: /* RP?? function codes, status bits */ ! 45: .set RP_GO,1 /* go */ ! 46: .set RP_RED,070 /* read */ ! 47: .set RP_DC,010 /* drive clear */ ! 48: .set RP_RIP,020 /* read in preset */ ! 49: .set RP_FMT,0x1000 /* format 22 */ ! 50: .set RP_MOL,0x1000 /* medium on line */ ! 51: .set RP_DRY,0200 /* drive ready */ ! 52: .set RP_ERR,040000 /* composite error */ ! 53: .set RP_pDRY,7 /* bit position of RP_DRY */ ! 54: .set RP_pERR,14 /* bit position of RP_ERR */ ! 55: ! 56: init: ! 57: .word 0 /* entry mask for DEC monitor */ ! 58: nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ ! 59: nop;nop; ! 60: start: ! 61: clrl r10 /* major("/dev/hp0a") */ ! 62: extzv $13,$2,r1,r4 /* get MBA number from R1 */ ! 63: insv r4,$24,$8,r10 /* set MBA number */ ! 64: insv r3,$16,$8,r10 /* drive number */ ! 65: extzv $12,$4,r5,r4 /* get partition from r5 */ ! 66: bicw2 $0xf000,r5 /* remove from r5 */ ! 67: insv r4,$8,$4,r10 /* set partition */ ! 68: movl r5,r11 ! 69: movl r1,r9 /* save adaptor address */ ! 70: movl r3,r8 /* and unit number */ ! 71: brw start0 ! 72: ! 73: /* ! 74: * Leave space for pack label. ! 75: */ ! 76: pad: ! 77: .space LABELOFFSET - (pad - init) ! 78: packlabel: ! 79: .space d_end_ ! 80: ! 81: start0: ! 82: movl $RELOC,sp ! 83: moval init,r6 ! 84: movc3 $end,(r6),(sp) ! 85: jmp *$RELOC+start1 ! 86: /* running relocated */ ! 87: start1: ! 88: movl $MBAinit,M_cr(r9) ! 89: /* read-in-preset the drive and set format */ ! 90: mull2 $RPDR,r8 ! 91: movab RP(r9)[r8],r8 ! 92: movl $RP_RIP+RP_GO,RP_cr(r8) ! 93: movl $RP_FMT,RP_off(r8) ! 94: ! 95: .set PROGSIZE,(BOOTSIZE*RPBPSECT) ! 96: start2: ! 97: movl $0,RP_cyl(r8) ! 98: movl $1,RP_stk(r8) ! 99: movl $-PROGSIZE,M_bc(r9) ! 100: /* set up MASSBUS map for DMA */ ! 101: clrl r0 ! 102: 1: ! 103: bisl3 $0x80000000,r0,M_map(r9)[r0] ! 104: aobleq $BOOTSIZE,r0,1b ! 105: clrl M_var(r9) ! 106: movl $RP_RED+RP_GO,RP_cr(r8) ! 107: rprdy: ! 108: movl RP_sr(r8),r0 ! 109: bbc $RP_pDRY,r0,rprdy ! 110: bbs $RP_pERR,r0,rperr ! 111: rprdy2: ! 112: bbs $pMBABUSY,M_sr(r9),rprdy2 ! 113: ! 114: /* Eagles are too fast for the controller. Slow the thing down. */ ! 115: /* (May not be needed with wait for mba above.) */ ! 116: clrl r3 ! 117: buzz: acbl $2000,$1,r3,buzz ! 118: bicpsw $2 ! 119: jbr clear ! 120: rperr: ! 121: halt ! 122: /* clear core and execute program */ ! 123: clear: ! 124: movl $PROGSIZE,r3 ! 125: clrcor: ! 126: clrq (r3) ! 127: acbl $RELOC,$8,r3,clrcor ! 128: /* run loaded program */ ! 129: calls $0,*$0 ! 130: brw start2 ! 131: ! 132: end:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.