/* * (C) 1983 UniSoft Corp. of Berkeley CA * * UniPlus Source Code. This program is proprietary * with Unisoft Corporation and is not to be reproduced * or used in any manner except as authorized in * writing by Unisoft. */ #include "sys/types.h" #include "sys/param.h" #include "sys/inode.h" #include "saio.h" char line[100]; char file[100]; caddr_t start; char dfboot[] = "sn(0,201)unix"; char dffs[] = "sn(0,201)"; extern short maxrow; extern short maxcol; extern short adm_row, adm_col; extern short row_ofs, col_ofs; extern short winscrl; #define BOOTDEV ((char *)(0x1B3)) char bdev; main() { register fd; register char *p; register i; bdev = *BOOTDEV; maxrow = 13; maxcol = 54; row_ofs = 8; col_ofs =25; winscrl = 1; adm_row = adm_col = 0; sercheck(line); /* verify serial number */ printf("\fStandalone boot\n\n"); loop: do { printf(": "); gets(line); if (strncmp(line, "eject", 5) == 0) { if (eject(0)) printf("boot: diskette eject failed\n"); goto loop; } if (strncmp(line, "copy", 4) == 0) { copysboot(); printf("boot: copy done\nEnter file to boot from"); goto loop; } file[0] = 0; if (line[0] == 0) { append(file, dfboot); } else { for (p = line; *p && *p != '('; p++) ; if (*p == 0) { append(file, dffs); } append(file, line); } fd = open(file, 0); } while (fd < 0); printf("%s\n", file); if (copyunix(fd) == 0) goto loop; *BOOTDEV = mkbdev(&iob[fd-3]); /* reset boot device flag */ if (strcmp(file, "sn(0,201)sunix") == 0) { close(fd); if (eject(0)) printf("boot: diskette eject failed\n"); retry: printf("Insert the Sony root filesystem\n"); printf("Type RETURN to start\n"); gets(line); for (i=0; i<0xC0000; i++) ; if ((fd = open("sn(0,0)", 0)) < 0) goto retry; } ((int (*)())start)(); } append(base, add) char *base, *add; { while (*base) base++; do { *base++ = *add; } while (*add++); } copyunix(io) register io; { register caddr_t addr; register count; long txtsiz, datsiz, bsssiz; long magic; (void)lseek(io, (off_t)0, 0); magic = getw(io); txtsiz = getw(io); datsiz = getw(io); bsssiz = getw(io); switch (magic) { case 0407: /* * space over the header. We do this instead of seeking * because the input might be a tape which doesn't know * how to seek. */ (void)getw(io); (void)getw(io); (void)getw(io); start = addr = (caddr_t)getw(io); /* starting address */ printf("Loading at 0x%x:", addr); printf(" %d", txtsiz); for (count = 0; count < txtsiz; count++) *addr++ = getc(io); printf("+%d", datsiz); for (count = 0; count < datsiz; count++) *addr++ = getc(io); printf("+%d", bsssiz); clrseg(addr, bsssiz); printf("\n"); return(1); default: printf("Can't load type %o files\n", magic); return(0); } } clrseg(addr, size) register caddr_t addr; register long size; { while (size-- > 0) *addr++ = 0; } mkbdev(ip) register struct iob *ip; { if (ip->i_device) { if (ip->i_unit >= 1) return 1; return 0; } else return 2 + ip->i_unit; }