📄 sload.c
字号:
}/* * use GCSR to start execution in MVME162 * adjust pointer to compensate for page alignement */ gcsr_map = (struct gcsr *)((u_long)gcsr_map + (u_long)gcsr_vme % pagesize); if (reset) { /* reset the local bus... */ gcsr_map->board_scr |= 0x80; } if (entry) { /* ...load start address... */ gcsr_map->gpr[0] = entry >> 16U; gcsr_map->gpr[1] = entry & 0x0000FFFF; } if (go) { /* ... and kick it in the ass! */ gcsr_map->lmsig = 0x1; }}/*=================================================================== */main(int argc, char *argv[]){ char inpstr[256]; u_char image[256]; char hdrstr[64]; int i, j, k, result, size, line=0, lastrec=0; long addr, tsize=0, naddr=0, blksize=0, blknum=1; FILE *in; char infile[256] = ""; char vmedev[32] = "/dev/vme32d32"; /* Assume "/dev/vme32d32" */ int vme, verbose = 0, go = 0, reset = 0, havefile = 0; /* Parse the command line */ --argc; while (argv++, argc--) { if (**argv != '-') { strcpy(infile, *argv); havefile = 1; } else if (!strcmp(*argv, "-v")) { verbose = 1; } else if (!strcmp(*argv, "-g")) { go = 1; } else if (!strcmp(*argv, "-r")) { reset = 1;/* } else if (!strcmp(*argv, "-vme32")) { *//* strcpy(vmedev, "/dev/vme32d32"); *//* } else if (!strcmp(*argv, "-vme24")) { *//* strcpy(vmedev, "/dev/vme24d32"); *//* } else if (!strcmp(*argv, "-vme16")) { *//* strcpy(vmedev, "/dev/vme16d32"); */ } else if (!strcmp(*argv, "-")) { usage(); exit(0); } else { usage(); exit(0); } } if (!havefile) { if (!reset && !go) { usage(); } else { MVMEControl(0, reset, go); } exit(0); } if ((in = fopen(infile, "r")) == NULL) { perror("open"); fprintf(stderr, "Cannot open input file %s\n", infile); exit(1); } if ((vme = open(vmedev, O_RDWR)) == -1) { fprintf(stderr, "Cannot open vme as %s\n", vmedev); } while (fscanf(in, "%s", &inpstr) != EOF) { line++; if (validrec(inpstr) == 0) { switch (issrec(inpstr)) { case 0 : hdr2str(inpstr, hdrstr); if (verbose) printf("HEADER string = `%s'\n", hdrstr); lastrec=HEADER; break; case 1 : addr = getaddr(inpstr); size = datasize(inpstr); if (blksize == 0) { blksize+=size; naddr=addr+size; if (verbose) printf("DATA\tS19\t$%04lX", addr); lastrec=DATA19; } else if ((blksize!=0) && (addr==naddr)) { blksize+=size; naddr=addr+size; } else { if (verbose) printf("\t$%04lX\t%lu", naddr-1, blksize); if (verbose) printf("\t%d\n", blknum); blknum+=1; naddr=addr+size; blksize=size; if (verbose) printf("DATA\tS19\t$%04lX", addr); lastrec=DATA19; } tsize += size; if (vme == -1) break; for (i = 0, j = 8, k = size; k-- > 0; i += 1, j += 2) { image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]); } if (lseek(vme, addr, SEEK_SET) == -1) { fprintf(stderr, "lseek() to vme address %08X failed\n", addr); } else { if (write(vme, (u_char *)image, size) != size) { fprintf(stderr, "Write to vme address %08X failed\n", addr); } } break; case 2 : addr = getaddr(inpstr); size = datasize(inpstr); if (blksize == 0) { blksize+=size; naddr=addr+size; if (verbose) printf("DATA\tS28\t$%06lX",addr); lastrec=DATA28; } else if ((blksize!=0) && (addr==naddr)) { blksize+=size; naddr=addr+size; } else { if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize); if (verbose) printf("\t%d\n",blknum); blknum+=1; naddr=addr+size; blksize=size; if (verbose) printf("DATA\tS28\t$%06lX",addr); lastrec=DATA28; } tsize += size; if (vme == -1) break; for (i = 0, j = 10, k = size; k-- > 0; i += 1, j += 2) { image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]); } if (lseek(vme, addr, SEEK_SET) == -1) { fprintf(stderr, "lseek() to vme address %08X failed\n", addr); } else { if (write(vme, (u_char *)image, size) != size) { fprintf(stderr, "Write to vme address %08X failed\n", addr); } } break; case 3 : addr = getaddr(inpstr); size = datasize(inpstr); if (blksize == 0) { blksize+=size; naddr=addr+size; if (verbose) printf("DATA\tS37\t$%08lX",addr); lastrec=DATA37; } else if ((blksize!=0) && (addr==naddr)) { blksize+=size; naddr=addr+size; } else { if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize); if (verbose) printf("\t%d\n",blknum); blknum+=1; naddr=addr+size; blksize=size; if (verbose) printf("DATA\tS37\t$%08lX",addr); lastrec=DATA37; } tsize += size; if (vme == -1) break; for (i = 0, j = 12, k = size; k-- > 0; i += 1, j += 2) { image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]); } if (lseek(vme, addr, SEEK_SET) == -1) { fprintf(stderr, "lseek() to vme address %08X failed\n", addr); } else { if (write(vme, (u_char *)image, size) != size) { fprintf(stderr, "Write to vme address %08X failed\n", addr); } } break; case 7 : if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);} if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);} if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);} if (verbose) printf("\t%d\n",blknum); addr = getaddr(inpstr); if (verbose) printf("TERM\tS37"); printf("\nExecution address = $%08lX\n", addr); lastrec=TERMINATOR; break; case 8 : if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);} if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);} if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);} if (verbose) printf("\t%d\n",blknum); addr = getaddr(inpstr); if (verbose) printf("TERM\tS28"); printf("\nExecution address = $%06lX\n", addr); lastrec=TERMINATOR; break; case 9 : if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);} if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);} if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);} if (verbose) printf("\t%d\n",blknum); addr = getaddr(inpstr); if (verbose) printf("TERM\tS19"); printf("\nExecution address = $%04lX\n", addr); lastrec=TERMINATOR; break; } } else { printf("\nError on line %d. ",line); switch (validrec(inpstr)) { case -1 : {printf("SRecord contains invalid characters.\n"); break; } case -2 : {printf("SRecord checksum is invalid.\n"); break;} case -3 : {printf("SRecord length is invalid.\n"); break;} } exit(1); } } if ((lastrec==DATA19) || (lastrec==DATA28) || (lastrec==DATA37)) { if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);} if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);} if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);} if (verbose) printf("\t%d\n",blknum); printf("ERROR: terminator record not found.\n"); } else { for (i = 0x000FFFF; i-- > 0;) ; /* mystique delay... */ MVMEControl(addr, reset, go); } if (verbose) printf("total data size = %lu bytes\n", tsize);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -