1 /* 2 * Copyright (c) 1980 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 #ifndef lint 8 _sccsid:.asciz "@(#)mtboot.c 6.2 (Berkeley) 06/08/85" 9 #endif not lint 10 11 /* 12 * VAX tape boot block for distribution tapes 13 * works on massbys tu78 14 * 15 * reads a program from a tp directory on a tape and executes it 16 * program must be stripped of the header and is loaded ``bits as is'' 17 * you can return to this loader via ``ret'' as you are called ``calls $0,ent'' 18 * 19 * Based on similar driver for tm03 formatter. 20 * Local modifications by Jeffrey R. Schwab June, 1982 21 * Purdue University Computing Center 22 */ 23 .set RELOC,0x70000 24 /* a.out defines */ 25 .set HDRSIZ,040 /* size of file header for VAX */ 26 .set MAGIC,0410 /* file type id in header */ 27 .set TSIZ,4 /* text size */ 28 .set DSIZ,8 /* data size */ 29 .set BSIZ,12 /* bss size */ 30 .set TENT,024 /* task header entry loc */ 31 /* tp directory definitions */ 32 .set FILSIZ,38 /* tp direc offset for file size */ 33 .set BNUM,44 /* tp dir offset for start block no. */ 34 .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */ 35 .set PTHSIZ,32 /* size of TP path name, bytes */ 36 .set BLKSIZ,512 /* tape block size, bytes */ 37 .set NUMDIR,24 /* no. of dir blocks on tape */ 38 .set ENTBLK,8 /* no. of dir entries per tape block */ 39 /* processor registers and bits */ 40 .set RXCS,32 41 .set RXDB,33 42 .set TXCS,34 43 .set TXDB,35 44 .set RXCS_DONE,0x80 45 .set TXCS_RDY,0x80 46 .set TXCS_pr,7 /* bit position of TXCS ready bit */ 47 .set RXCS_pd,7 /* bit position of RXCS done bit */ 48 /* MBA registers */ 49 .set MBA_CSR,0 /* configuration and status register */ 50 .set MBA_CR,4 /* MBA control reg */ 51 .set MBA_SR,8 /* MBA status reg */ 52 .set MBA_VAR,12 /* MBA virt addr reg */ 53 .set MBA_BCR,16 /* MBA byte count reg */ 54 .set MBA_MAP,0x800 /* start of MBA map reg's */ 55 .set MRV,0x80000000 56 .set MBA_bsy,31 /* massbus busy */ 57 /* TU78 mba registers */ 58 .set MTCS,0 /* MT data transfer control reg */ 59 .set MTER,4 /* data transfer error status reg */ 60 .set MTRC,8 /* record count */ 61 .set MTAS,16 /* attention summary */ 62 .set MTBC,20 /* byte count */ 63 .set MTNER,44 /* non data transfer error status reg */ 64 .set MTNCS,48 /* non data transfer control reg */ 65 .set MTID,68 /* internal data reg */ 66 /* MT commands */ 67 .set GO,1 /* GO bit */ 68 .set MT_REW,6 /* rewind, on-line */ 69 .set MT_RCOM,070 /* read forward */ 70 /* MT bits */ 71 .set MT_rdy,15 /* controller ready */ 72 .set MT_rec,2 /* bit for single record count */ 73 .set MT_rcnt,4 /* record count for single record (shifted) */ 74 .set MT_erc,0xffffffc0 /* error code mask */ 75 .set MT_done,1 /* proper completion code */ 76 /* local stack variables */ 77 .set tapa,-4 /* desired tape addr */ 78 .set mtapa,-8 /* current tape addr */ 79 .set name,-8-PTHSIZ /* operator-typed file name */ 80 /* register usage */ 81 .set rMBA,r10 82 .set rMT,r11 83 84 /* initialization */ 85 init: 86 mull2 $0x80,%rMT 87 addl2 $0x400,%rMT 88 addl2 %rMBA,%rMT 89 movl $RELOC,fp /* core loc to which to move this program */ 90 addl3 $name,fp,sp /* set stack pointer, leaving room for locals */ 91 clrl r0 92 1: 93 movc3 $end,(r0),(fp) /* move boot up to relocated position */ 94 jmp start+RELOC 95 start: 96 movl $1,MBA_CR(%rMBA) /* MBA init */ 97 1: 98 movl MTID(%rMT),r2 /* wait for tape controller to ready */ 99 bbc $MT_rdy,r2,1b /* after massbus init */ 100 bsbw rew /* rewind input tape */ 101 movab name(fp),r4 /* start of filename storage */ 102 movzbl $'=,r0 /* prompt character */ 103 bsbw putc /* output char to main console */ 104 /* read in a file name */ 105 movl r4,r1 /* loc at which to store file name */ 106 nxtc: 107 bsbw getc /* get input char's in file name */ 108 cmpb r0,$012 /* terminator ? */ 109 beql nullc 110 movb r0,(r1)+ 111 brb nxtc 112 nullc: 113 subl3 r4,r1,r9 /* size of path name */ 114 beql start /* dumb operator */ 115 clrb (r1)+ 116 incl r9 117 /* user-specified TP filename has been stored at name(fp) */ 118 /* read in entire tp directory contents into low core */ 119 dirred: 120 movl $8,tapa(fp) /* tp directory starts at block 8 */ 121 movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */ 122 bsbw taper /* read no. bytes indicated */ 123 /* search entire directory for user-specified file name */ 124 clrl r5 /* dir buff loc = 0 */ 125 nxtdir: 126 cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */ 127 beql fndfil /* found match */ 128 acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir 129 /* see if done with tp dir */ 130 brw start /* entry not in directory; start over */ 131 /* found desired tp dir entry */ 132 fndfil: 133 movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */ 134 addl2 $7,tapa(fp) /* skip 7 boot blocks */ 135 movzwl FILSIZ(r5),r6 /* low 2 bytes file size */ 136 insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */ 137 cmpl r6,$RELOC-512 /* check if file fits below stack */ 138 blss filok /* file o.k. */ 139 brw start /* file too large */ 140 /* time to read in desired file from tape */ 141 filok: 142 movl r6,r7 /* save r6 */ 143 bsbb taper 144 bsbw rew 145 /* clear core */ 146 subl3 r7,$RELOC-4,r0 /* no. bytes to clear */ 147 1: 148 clrb (r7)+ 149 sobgtr r0,1b 150 /* time to jump to start of file & execute */ 151 addl3 $20,fp,ap 152 clrl r5 153 calls $0,(r5) 154 brw start 155 /* taper: movcTAPE (r6),tapa(fp),0 */ 156 rew2: 157 bsbb rew /* beginning of tape */ 158 taper0: 159 bsbb rrec /* advance 1 block; never want blk0 */ 160 taper: 161 clrl r0 /* page no. */ 162 cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */ 163 bgtr rew2 164 blss taper0 165 1: 166 bsbb rrec 167 acbl $1,$-BLKSIZ,r6,1b 168 rsb 169 /* rew: rewind the tape */ 170 rew: 171 clrl mtapa(fp) /* current position */ 172 movl MTNER(%rMT),r2 /* read non-data status */ 173 movl MTAS(%rMT),MTAS(%rMT) /* and clear any attention bits */ 174 movl $MT_REW+GO,MTNCS(%rMT) /* rewind command and go bit */ 175 1: 176 movl MTAS(%rMT),r2 /* check attention bits */ 177 beql 1b /* loop if attention not yet set */ 178 movl MTNER(%rMT),r2 /* read non-data status */ 179 movl MTAS(%rMT),MTAS(%rMT) /* and clear any attention bits */ 180 bicl2 $MT_erc,r2 /* isolate error condition */ 181 subl2 $MT_done,r2 /* check with completion condition */ 182 bneq 1b /* wait for completion attention */ 183 rsb 184 /* rrec: read 1 block from mag tape into page (r0) */ 185 rrec: 186 /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */ 187 movl MTNER(%rMT),r2 /* read non-data status */ 188 movl MTAS(%rMT),MTAS(%rMT) /* and clear any attention bits */ 189 movl $-BLKSIZ,MBA_BCR(%rMBA) 190 bisl3 $MRV,r0,MBA_MAP(%rMBA) 191 clrl MBA_VAR(%rMBA) 192 movl $BLKSIZ,MTBC(%rMT) /* set byte count */ 193 bisl2 $MT_rcnt,MTRC(%rMT) /* set record count */ 194 movl $MT_RCOM+GO,MTCS(%rMT) /* load read command */ 195 1: 196 movl MBA_SR(%rMBA),r2 /* load mba status reg */ 197 bbs $MBA_bsy,r2,1b /* wait for mba to go non-busy */ 198 movl MTRC(%rMT),r2 /* fetch record count */ 199 bbs $MT_rec,r2,rrec /* retry read if we did not read a record */ 200 movl MTER(%rMT),r2 /* load data transfer error status */ 201 bicl2 $MT_erc,r2 /* isolate status value */ 202 subl2 $MT_done,r2 /* compare with successful read */ 203 bneq rrec /* load to try read again */ 204 205 incl r0 /* next page no. */ 206 incl mtapa(fp) /* mag tape block position */ 207 rsb 208 getc: 209 mfpr $RXCS,r0 210 bbc $RXCS_pd,r0,getc /* receiver ready ? */ 211 mfpr $RXDB,r0 212 extzv $0,$7,r0,r0 213 cmpb r0,$015 214 bneq putc 215 bsbb putc 216 movb $0,r0 217 bsbb putc 218 movb $012,r0 219 putc: 220 mfpr $TXCS,r2 221 bbc $TXCS_pr,r2,putc /* transmitter ready ? */ 222 extzv $0,$7,r0,r0 223 mtpr r0,$TXDB 224 rsb 225 end: 226