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