#include #include #include #include #include #include #include #include "umrbus.h" #include #include "boardaccess.h" #include "run.h" #define LINE_LEN 1024 #define MEMORY_SIZE 1024*1024*32 extern int buffer_Mask; extern UMR_HANDLE addr_handle; extern UMR_HANDLE data1_handle; extern UMR_HANDLE data2_handle; extern UMR_HANDLE reset_handle; void die(char *format, ...) { va_list arg; va_start(arg, format); vfprintf(stderr, format, arg); va_end(arg); puts(""); exit(1); } int upload_file() { FILE *file; char fname[512]; char *startupname="src/startup"; char line[LINE_LEN]; int lineno = 0; int adr, d[4]; int nbytes, copybase, i; int start,maxaddr,text,textsize,data,datasize,stack; unsigned long startup[150]; unsigned long startupadr = 0x0, tmp_opcode, startupcount; printf("Name des Files: ");scanf("%s",fname); buffer_Mask=0; flush_Buffer(); reset(1); if ((file = fopen(fname, "rt")) == NULL) { perror(fname); return 0; } lineno++; if(fgets(line, LINE_LEN, file) == NULL) { perror("fgets"); exit(1); } if(sscanf(line, "start:%x %x %x %x %x %x\n", &start, &maxaddr , &text, &textsize, &data, &datasize) != 6) { die("Error while parsing %s line %u: \n%s", fname, lineno, line); } adr = -1; // requires address field in object file while(fgets(line, LINE_LEN, file) != NULL) { lineno++; //printf("line %d: %s", lineno, line); if((nbytes = sscanf(line, "%x:%02x%02x%02x%02x\n", &adr, d+3, d+2, d+1, d) - 1) >= 1) { // -1 because of address field //printf("read %d : %d %d %d %d\n", adr, d[3], d[2], d[1], d[0]); if(adr < 0 || adr >= MEMORY_SIZE) die("%s line %u: no memory allocated at address %x", fname, lineno, adr); copybase = 4-nbytes; // copy the *upper* entries of d for(i = copybase; i < 4; i++) set_Memory_Byte(adr-copybase+i,d[i]); adr += nbytes; // increase address } else if((nbytes = sscanf(line, ":%02x%02x%02x%02x\n", d+3, d+2, d+1, d)) >= 1) { //printf("read (%d): %d %d %d %d\n", adr, d[3], d[2], d[1], d[0]); if(adr < 0 || adr >= MEMORY_SIZE) die("%s line %u: no memory allocated at address %x", fname, lineno, adr); copybase = 4-nbytes; // copy the *upper* entries of d for(i = copybase; i < 4; i++) set_Memory_Byte(adr-copybase+i,d[i]); adr += nbytes; // increase address } else { die("Error while parsing %s line %u: \n%s", fname, lineno, line); } } flush_Buffer(); fclose(file); stack = MEMORY_SIZE; ////if Startadresse != 0 upload startupcode!!!! if ( start) { if ((file = fopen(startupname, "rt")) == NULL) { perror(startupname); return 0; } lineno=1; startupcount=0; while(fgets(line, LINE_LEN, file) != NULL) { lineno++; if(sscanf(line, ":%08lx\n",&tmp_opcode) != 1) die("Error while parsing %s line %u: \n%s", fname, lineno, line); startup[startupcount]=tmp_opcode; startupcount++; } fclose(file); // set stackpointer startup[startupcount++]= 0x3c1d0000 + ((stack >> 16)&0xffff);// lhi r29, high startup[startupcount++]= 0x3c1c0000 + (stack & 0xffff); // lhi r28, low startup[startupcount++]= 0x0380e402 ; // srli r28,r28,16 startup[startupcount++]= 0x03bce821 ; // add r29,r29,r28 //set start address startup[startupcount++]= 0x3c010000 + ((start >> 16)&0xffff);// lhi r1, high startup[startupcount++]= 0x3c1c0000 + (start & 0xffff); // lhi r28, low startup[startupcount++]= 0x0380e402 ; // srli r28,r28,16 startup[startupcount++]= 0x003c0821 ; // add r1,r1,r28 //set *trapadr to zero startup[startupcount++]= 0x00001021; // add r2,r0,r0 startup[startupcount++]= 0x24030200; // addi r3,r0,#256 startup[startupcount++]= 0xac620000; // sw 0(r3),r2 // jump to program-start startup[startupcount++]= 0x58200000; // jr r1 startup[startupcount++]= 0x24000000; // nop startup[startupcount]=0x24000000; printf(" startup : %lx\n", startupcount); for (i=0;i<(startupcount/2)+1;i++){ write_data(startup+(2*i)+1, startup+(2*i), &startupadr, 255); startupadr++; } } printf("loaded %s (%d lines)\n", fname, lineno); printf("start: 0x%08x, maximum address: 0x%08x\n", start, maxaddr); //printf("text: 0x%x, 0x%x bytes\n", text, textsize); //printf("data: 0x%x, 0x%x bytes\n", data, datasize); printf("stack allocated at 0x%08x\n",stack); return 0; }