Annotation of 41BSD/4.0.upgrade/sys/mdec/hpboot.s, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.