150f898f2Smckusick /* 2*d1a9a99cSmckusick * Copyright (c) 1980, 1986 Regents of the University of California. 350f898f2Smckusick * All rights reserved. The Berkeley software License Agreement 450f898f2Smckusick * specifies the terms and conditions for redistribution. 550f898f2Smckusick */ 650f898f2Smckusick 7*d1a9a99cSmckusick /* "@(#)utboot.c 7.1 (Berkeley) 06/05/86" */ 85f0eef06Ssam 95f0eef06Ssam /* 105f0eef06Ssam * VAX tape boot block for distribution tapes 115f0eef06Ssam * works on unibus tm03 125f0eef06Ssam * 135f0eef06Ssam * reads a program from a tp directory on a tape and executes it 145f0eef06Ssam * program must be stripped of the header and is loaded ``bits as is'' 155f0eef06Ssam * you can return to this loader via ``ret'' as you are called ``calls $0,ent'' 165f0eef06Ssam */ 175f0eef06Ssam .set RELOC,0x70000 185f0eef06Ssam /* a.out defines */ 195f0eef06Ssam .set HDRSIZ,040 /* size of file header for VAX */ 205f0eef06Ssam .set MAGIC,0410 /* file type id in header */ 215f0eef06Ssam .set TSIZ,4 /* text size */ 225f0eef06Ssam .set DSIZ,8 /* data size */ 235f0eef06Ssam .set BSIZ,12 /* bss size */ 245f0eef06Ssam .set TENT,024 /* task header entry loc */ 255f0eef06Ssam /* tp directory definitions */ 265f0eef06Ssam .set FILSIZ,38 /* tp direc offset for file size */ 275f0eef06Ssam .set BNUM,44 /* tp dir offset for start block no. */ 285f0eef06Ssam .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */ 295f0eef06Ssam .set PTHSIZ,32 /* size of TP path name, bytes */ 305f0eef06Ssam .set BLKSIZ,512 /* tape block size, bytes */ 315f0eef06Ssam .set NUMDIR,24 /* no. of dir blocks on tape */ 325f0eef06Ssam .set ENTBLK,8 /* no. of dir entries per tape block */ 335f0eef06Ssam /* processor registers and bits */ 345f0eef06Ssam .set RXCS,32 355f0eef06Ssam .set RXDB,33 365f0eef06Ssam .set TXCS,34 375f0eef06Ssam .set TXDB,35 385f0eef06Ssam .set RXCS_DONE,0x80 395f0eef06Ssam .set TXCS_RDY,0x80 405f0eef06Ssam .set TXCS_pr,7 /* bit position of TXCS ready bit */ 415f0eef06Ssam .set RXCS_pd,7 /* bit position of RXCS done bit */ 425f0eef06Ssam /* UBA registers */ 435f0eef06Ssam .set UBA_DPR1,68 445f0eef06Ssam .set UBA_MAP,2048 455f0eef06Ssam .set BNE,0x80000000 465f0eef06Ssam .set MRV,0x80000000 475f0eef06Ssam .set MR_BDP1,0x200000 485f0eef06Ssam 495f0eef06Ssam /* UT UBA registers */ 505f0eef06Ssam .set UTCS1,0 515f0eef06Ssam .set UTWC,02 525f0eef06Ssam .set UTBA,04 535f0eef06Ssam .set UTFC,06 545f0eef06Ssam .set UTCS2,010 555f0eef06Ssam .set UTDS,012 565f0eef06Ssam .set UTER,014 575f0eef06Ssam .set UTAS,016 58ac9f8c26Ssam .set UTCC,020 595f0eef06Ssam .set UTDB,022 605f0eef06Ssam .set UTMR,024 615f0eef06Ssam .set UTDT,026 625f0eef06Ssam .set UTSN,030 635f0eef06Ssam .set UTTC,032 645f0eef06Ssam 655f0eef06Ssam /* UT commands and bits */ 665f0eef06Ssam .set GO,01 67ac9f8c26Ssam .set UT_REW,0x6 68ac9f8c26Ssam .set UT_RCOM,0x38 69ac9f8c26Ssam .set UT_SREV,0x1a 70ac9f8c26Ssam .set UT_DCLR,0x8 71db8342d4Skarels .set UT_crdy,7 /* bit pos. */ 72db8342d4Skarels .set UT_gapsd,13 /* bit; aka "positioning in progress" */ 73ac9f8c26Ssam .set UTDENS,0x4c0 /* 1600 bpi, PDP-11 format */ 745f0eef06Ssam /* local stack variables */ 755f0eef06Ssam .set tapa,-4 /* desired tape addr */ 765f0eef06Ssam .set mtapa,-8 /* current tape addr */ 775f0eef06Ssam .set name,-8-PTHSIZ /* operator-typed file name */ 785f0eef06Ssam /* register usage */ 795f0eef06Ssam .set rUBA,r10 805f0eef06Ssam .set rUT,r11 815f0eef06Ssam /* ===== */ 825f0eef06Ssam 835f0eef06Ssam /* initialization */ 845f0eef06Ssam init: 855f0eef06Ssam movl $RELOC,fp /* core loc to which to move this program */ 865f0eef06Ssam addl3 $name,fp,sp /* set stack pointer; leave room for locals */ 875f0eef06Ssam clrl r0 885f0eef06Ssam 1: 895f0eef06Ssam movc3 $end,(r0),(fp) /* move boot up to relocated position */ 905f0eef06Ssam jmp start+RELOC 915f0eef06Ssam start: 925f0eef06Ssam bsbw rew /* rewind input tape */ 935f0eef06Ssam movab name(fp),r4 /* start of filename storage */ 945f0eef06Ssam movzbl $'=,r0 /* prompt character */ 955f0eef06Ssam bsbw putc /* output char to main console */ 965f0eef06Ssam /* read in a file name */ 975f0eef06Ssam movl r4,r1 /* loc at which to store file name */ 985f0eef06Ssam nxtc: 995f0eef06Ssam bsbw getc /* get input char's in file name */ 1005f0eef06Ssam cmpb r0,$012 /* terminator ? */ 1015f0eef06Ssam beql nullc 1025f0eef06Ssam movb r0,(r1)+ 1035f0eef06Ssam brb nxtc 1045f0eef06Ssam nullc: 1055f0eef06Ssam subl3 r4,r1,r9 /* size of path name */ 1065f0eef06Ssam beql start /* dumb operator */ 1075f0eef06Ssam clrb (r1)+ 1085f0eef06Ssam incl r9 1095f0eef06Ssam /* user-specified TP filename has been stored at name(fp) */ 1105f0eef06Ssam /* read in entire tp directory contents into low core */ 1115f0eef06Ssam dirred: 1125f0eef06Ssam movl $8,tapa(fp) /* tp directory starts at block 8 */ 1135f0eef06Ssam movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */ 1145f0eef06Ssam bsbw taper /* read no. bytes indicated */ 1155f0eef06Ssam /* search entire directory for user-specified file name */ 1165f0eef06Ssam clrl r5 /* dir buff loc = 0 */ 1175f0eef06Ssam nxtdir: 1185f0eef06Ssam cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */ 1195f0eef06Ssam beql fndfil /* found match */ 1205f0eef06Ssam acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir 1215f0eef06Ssam /* see if done with tp dir */ 1225f0eef06Ssam brw start /* entry not in directory; start over */ 1235f0eef06Ssam /* found desired tp dir entry */ 1245f0eef06Ssam fndfil: 1255f0eef06Ssam movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */ 1265f0eef06Ssam addl2 $7,tapa(fp) /* skip 7 boot blocks */ 1275f0eef06Ssam movzwl FILSIZ(r5),r6 /* low 2 bytes file size */ 1285f0eef06Ssam insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */ 1295f0eef06Ssam cmpl r6,$RELOC-512 /* check if file fits below stack */ 1305f0eef06Ssam blss filok /* file o.k. */ 1315f0eef06Ssam brw start /* file too large */ 1325f0eef06Ssam /* time to read in desired file from tape */ 1335f0eef06Ssam filok: 1345f0eef06Ssam movl r6,r7 /* save r6 */ 1355f0eef06Ssam bsbb taper 1365f0eef06Ssam bsbw rew 1375f0eef06Ssam /* clear core */ 1385f0eef06Ssam subl3 r7,$RELOC-4,r0 /* no. bytes to clear */ 1395f0eef06Ssam 1: 1405f0eef06Ssam clrb (r7)+ 1415f0eef06Ssam sobgtr r0,1b 1425f0eef06Ssam /* time to jump to start of file & execute */ 1435f0eef06Ssam addl3 $20,fp,ap 1445f0eef06Ssam clrl r5 1455f0eef06Ssam calls $0,(r5) 1465f0eef06Ssam brw start 1475f0eef06Ssam /* taper: movcTAPE (r6),tapa(fp),0 */ 1485f0eef06Ssam rew2: 1495f0eef06Ssam bsbb rew /* beginning of tape */ 1505f0eef06Ssam taper0: 1515f0eef06Ssam bsbb rrec /* advance 1 block; never want blk 0 */ 1525f0eef06Ssam taper: 1535f0eef06Ssam clrl r0 /* page no. */ 1545f0eef06Ssam cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */ 1555f0eef06Ssam bgtr rew2 1565f0eef06Ssam blss taper0 1575f0eef06Ssam 1: 1585f0eef06Ssam bsbb rrec 1595f0eef06Ssam acbl $1,$-BLKSIZ,r6,1b 1605f0eef06Ssam rsb 1615f0eef06Ssam /* rew: rewind the tape */ 1625f0eef06Ssam rew: 1635f0eef06Ssam clrl mtapa(fp) /* current position */ 1645f0eef06Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 1655f0eef06Ssam movw $UT_REW+GO,UTCS1(%rUT) 1665f0eef06Ssam rsb 1675f0eef06Ssam /* rrec: read 1 block from mag tape into page (r0) */ 1685f0eef06Ssam rrec: 1695f0eef06Ssam /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */ 17085fc7887Ssam jsb utquiet 1715f0eef06Ssam movw $-BLKSIZ,UTFC(%rUT) 1725f0eef06Ssam movw $-256,UTWC(%rUT) /* !!!!!!!!!!!!!! */ 1735f0eef06Ssam bisl3 $MRV|MR_BDP1,r0,UBA_MAP(%rUBA) 1745f0eef06Ssam movw $0,UTBA(%rUT) 1755f0eef06Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 1765f0eef06Ssam movw $UT_RCOM+GO,UTCS1(%rUT) 17785fc7887Ssam jsb utquiet 1785f0eef06Ssam bisl2 $BNE,UBA_DPR1(%rUBA) 1795f0eef06Ssam tstw UTER(%rUT) 1805f0eef06Ssam jgeq 2f 1815f0eef06Ssam mnegw $1,UTWC(%rUT) 1825f0eef06Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 1835f0eef06Ssam movw $UT_SREV+GO,UTCS1(%rUT) 1845f0eef06Ssam jmp rrec 1855f0eef06Ssam 2: 1865f0eef06Ssam incl r0 /* next page no. */ 1875f0eef06Ssam incl mtapa(fp) /* mag tape block position */ 1885f0eef06Ssam rsb 1895f0eef06Ssam getc: 1905f0eef06Ssam mfpr $RXCS,r0 1915f0eef06Ssam bbc $RXCS_pd,r0,getc /* receiver ready ? */ 1925f0eef06Ssam mfpr $RXDB,r0 1935f0eef06Ssam extzv $0,$7,r0,r0 1945f0eef06Ssam cmpb r0,$015 1955f0eef06Ssam bneq putc 1965f0eef06Ssam bsbb putc 1975f0eef06Ssam movb $0,r0 1985f0eef06Ssam bsbb putc 1995f0eef06Ssam movb $012,r0 2005f0eef06Ssam putc: 2015f0eef06Ssam mfpr $TXCS,r2 2025f0eef06Ssam bbc $TXCS_pr,r2,putc /* transmitter ready ? */ 2035f0eef06Ssam extzv $0,$7,r0,r0 2045f0eef06Ssam mtpr r0,$TXDB 2055f0eef06Ssam rsb 20685fc7887Ssam utquiet: 2075f0eef06Ssam movw UTCS1(%rUT),r2 20885fc7887Ssam bbc $UT_crdy,r2,utquiet 2095f0eef06Ssam 1: 2105f0eef06Ssam movw UTDS(%rUT),r2 2115f0eef06Ssam bbs $UT_gapsd,r2,1b 2125f0eef06Ssam rsb 2135f0eef06Ssam end: 214