123142Smckusick /* 226875Skarels * Copyright (c) 1980,1986 Regents of the University of California. 323142Smckusick * All rights reserved. The Berkeley software License Agreement 423142Smckusick * specifies the terms and conditions for redistribution. 523142Smckusick */ 611089Ssam 7*29801Skarels /* "@(#)hpboot.c 7.2 (Berkeley) 08/28/86" */ 8*29801Skarels #include <sys/disklabel.h> 923142Smckusick 1023142Smckusick 1111089Ssam /* 1211089Ssam * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from 1326875Skarels * boot sectors of file system and sets it up to run. 1426875Skarels * Reads from the controller and drive passed in from the boot 1526875Skarels * rom. 1626875Skarels * R1: address of the boot device's adapter 1726875Skarels * R2: controller number of the boot device 1826875Skarels * R3: unit number of the boot device 1926875Skarels * R5: software boot control flags 2026875Skarels * R6: address of driver subroutine from ROM 2126875Skarels * SP: base address of usable memory + 0x200 2211089Ssam */ 2311089Ssam .set BOOTSIZE,15 /* size of boot in sectors */ 2411089Ssam .set RELOC,0x70000 2511089Ssam /* MBA registers */ 2611089Ssam .set M_cr,4 /* MBA control reg */ 2726875Skarels .set M_sr,8 /* MBA status reg */ 2811089Ssam .set M_var,12 /* MBA virt addr reg */ 2911089Ssam .set M_bc,16 /* MBA byte count reg */ 3011089Ssam .set M_map,0x800 /* start of MBA map reg's */ 3111089Ssam .set MBAinit,1 /* MBA init bit in MBA control reg */ 3226875Skarels .set MBABUSY,0x80000000 /* MBA SR: data transfer busy */ 3326875Skarels .set pMBABUSY,31 /* bit position of MBABUSY */ 3411089Ssam /* Drive information */ 3511089Ssam .set RP,0x400 /* start of drive registers */ 3626875Skarels .set RPDR,0x80 /* offset per drive unit */ 3726875Skarels .set RP_cr,0 /* control status register */ 3826875Skarels .set RP_sr,4 /* drive status reg */ 3926875Skarels .set RP_stk,0x14 /* desired track/sector reg */ 4026875Skarels .set RP_dt,0x18 /* drive type reg */ 4126875Skarels .set RP_off,0x24 /* RP offset reg */ 4226875Skarels .set RP_cyl,0x28 /* desired cyl reg */ 4311089Ssam .set RPBPSECT,512 /* bytes per sector */ 4411089Ssam /* RP?? function codes, status bits */ 4511089Ssam .set RP_GO,1 /* go */ 4611089Ssam .set RP_RED,070 /* read */ 4711089Ssam .set RP_DC,010 /* drive clear */ 4811089Ssam .set RP_RIP,020 /* read in preset */ 4911089Ssam .set RP_FMT,0x1000 /* format 22 */ 5011089Ssam .set RP_MOL,0x1000 /* medium on line */ 5111089Ssam .set RP_DRY,0200 /* drive ready */ 5211089Ssam .set RP_ERR,040000 /* composite error */ 5311089Ssam .set RP_pDRY,7 /* bit position of RP_DRY */ 5411089Ssam .set RP_pERR,14 /* bit position of RP_ERR */ 5511089Ssam 5611089Ssam init: 5711089Ssam .word 0 /* entry mask for DEC monitor */ 5811089Ssam nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ 5911089Ssam nop;nop; 6011089Ssam start: 6126875Skarels clrl r10 /* major("/dev/hp0a") */ 6226875Skarels extzv $13,$2,r1,r4 /* get MBA number from R1 */ 6326875Skarels insv r4,$24,$8,r10 /* set MBA number */ 6426875Skarels insv r3,$16,$8,r10 /* drive number */ 6526875Skarels extzv $12,$4,r5,r4 /* get partition from r5 */ 6626875Skarels bicw2 $0xf000,r5 /* remove from r5 */ 6726875Skarels insv r4,$8,$4,r10 /* set partition */ 6811089Ssam movl r5,r11 6926875Skarels movl r1,r9 /* save adaptor address */ 7026875Skarels movl r3,r8 /* and unit number */ 71*29801Skarels brw start0 72*29801Skarels 73*29801Skarels /* 74*29801Skarels * Leave space for pack label. 75*29801Skarels */ 76*29801Skarels pad: 77*29801Skarels .space LABELOFFSET - (pad - init) 78*29801Skarels packlabel: 79*29801Skarels .space d_end_ 80*29801Skarels 81*29801Skarels start0: 8211089Ssam movl $RELOC,sp 8311089Ssam moval init,r6 8411089Ssam movc3 $end,(r6),(sp) 8511089Ssam jmp *$RELOC+start1 8611089Ssam /* running relocated */ 8711089Ssam start1: 8811089Ssam movl $MBAinit,M_cr(r9) 8911089Ssam /* read-in-preset the drive and set format */ 9026875Skarels mull2 $RPDR,r8 9126875Skarels movab RP(r9)[r8],r8 9226875Skarels movl $RP_RIP+RP_GO,RP_cr(r8) 9326875Skarels movl $RP_FMT,RP_off(r8) 9411089Ssam 9511089Ssam .set PROGSIZE,(BOOTSIZE*RPBPSECT) 9611089Ssam start2: 9726875Skarels movl $0,RP_cyl(r8) 9826875Skarels movl $1,RP_stk(r8) 9911089Ssam movl $-PROGSIZE,M_bc(r9) 10011089Ssam /* set up MASSBUS map for DMA */ 10111089Ssam clrl r0 10211089Ssam 1: 10311089Ssam bisl3 $0x80000000,r0,M_map(r9)[r0] 10411089Ssam aobleq $BOOTSIZE,r0,1b 10511089Ssam clrl M_var(r9) 10626875Skarels movl $RP_RED+RP_GO,RP_cr(r8) 10711089Ssam rprdy: 10826875Skarels movl RP_sr(r8),r0 10911089Ssam bbc $RP_pDRY,r0,rprdy 11011089Ssam bbs $RP_pERR,r0,rperr 11126875Skarels rprdy2: 11226875Skarels bbs $pMBABUSY,M_sr(r9),rprdy2 11326875Skarels 11426875Skarels /* Eagles are too fast for the controller. Slow the thing down. */ 11526875Skarels /* (May not be needed with wait for mba above.) */ 11611319Ssam clrl r3 11711319Ssam buzz: acbl $2000,$1,r3,buzz 11811089Ssam bicpsw $2 11911089Ssam jbr clear 12011089Ssam rperr: 12111089Ssam halt 12211089Ssam /* clear core and execute program */ 12311089Ssam clear: 12411089Ssam movl $PROGSIZE,r3 12511089Ssam clrcor: 12611089Ssam clrq (r3) 12711089Ssam acbl $RELOC,$8,r3,clrcor 12811089Ssam /* run loaded program */ 12911089Ssam calls $0,*$0 13011089Ssam brw start2 13111089Ssam 13211089Ssam end: 133