#include #include #include /* SEQSI registers */ short *MEMORY_LOW_WORD, *MEMORY_HIGH_WORD; short *JUMP_ADDRESS_REG; short *INTERRUPT_ADDR_REG; short *CLOCK_CONTROL_REG; short *POLARITY_CONTROL_REG; short *DIRECT_REG; short *SIGNAL_CONTROL_REG; short *MEMORY_ADDRESS_COUNTER; short *MEMORY_DATA_REG; short *TRIGGER_CTR_REG; main() { FILE *fp; long word, word1, registers[10]; int line=0, line_max=10000, j, BASE; short a,b; char file[20]; /* The different SEQSI registers */ MEMORY_LOW_WORD = (short *)0xFFC90000; BASE = (int)MEMORY_LOW_WORD; MEMORY_HIGH_WORD = (short *)(BASE+0x2); JUMP_ADDRESS_REG = (short *)(BASE +0x4); INTERRUPT_ADDR_REG = (short*)(BASE +0x06); CLOCK_CONTROL_REG = (short *)(BASE +0x08); POLARITY_CONTROL_REG = (short *)(BASE +0x0A); DIRECT_REG = (short *)(BASE +0x0C); SIGNAL_CONTROL_REG = (short *)(BASE +0x0E); MEMORY_ADDRESS_COUNTER = (short *)(BASE +0x16); MEMORY_DATA_REG = (short *)(BASE +0x18); TRIGGER_CTR_REG = (short *)(BASE +0x1A); /* Open binary configuration file */ printf("File to define the sequence: "); scanf("%s", file); getchar(); if ((fp = fopen(file,"r"))==NULL) { printf("Can't open file \"%s\".\n", file); exit(0); } /* set up the registers before download the sequence */ /* this now serves as the 1st memory address to be downloaded */ *JUMP_ADDRESS_REG = 0; /* clock must be off for the download... */ *CLOCK_CONTROL_REG = 0x200; /* reset memory address counter before downloading the memory */ *MEMORY_ADDRESS_COUNTER = 0; *MEMORY_DATA_REG = 0; *DIRECT_REG = 0; *INTERRUPT_ADDR_REG = 0; /* read 10 first words which are reserved for the registers */ for(j=1; j<11; j++) { fread( &word, 4, 1, fp); printf(" registers %x\n", word); registers[j] = word; } /* Read 32 bit words from the file and download them to the SEQSI memory */ while ((fread( &word, 4, 1, fp)) > 0 ) { a = (short) ( word & 0xFFFF); b = (short) ((word>>16) & 0xFFFF); *MEMORY_LOW_WORD = a; *MEMORY_HIGH_WORD = b; line++; if (line < 20 ) { printf("line = %6i word = %x\n", line, word); } } *JUMP_ADDRESS_REG = 0; *MEMORY_ADDRESS_COUNTER = 0; *MEMORY_DATA_REG = 0; printf("\n Number of words read %i", line); printf(" Good luck!\n"); fclose(fp); /* set up the registers after download of the sequence */ *JUMP_ADDRESS_REG = (short ) (registers[1] & 0xFFFF); *INTERRUPT_ADDR_REG = (short ) (registers[2] & 0xFFFF); *POLARITY_CONTROL_REG = (short ) (registers[4] & 0xFFFF); *DIRECT_REG = (short ) (registers[5] & 0xFFFF); *SIGNAL_CONTROL_REG = (short ) (registers[6] & 0xFFFF); *MEMORY_ADDRESS_COUNTER = (short ) (registers[7] & 0xFFFF); *TRIGGER_CTR_REG = (short ) (registers[8] & 0xFFFF); *MEMORY_DATA_REG = (short ) (registers[9] & 0xFFFF); *CLOCK_CONTROL_REG = (short ) (registers[3] & 0xFFFF); /* that's all! */ exit(0); } /*int AddrMap(address,space) int address,space ; { int status; char *addr; status = RD13_VmeMap(address,0x39,space,&addr,0); if (status != 0) { printf("\n > error %d in mapping ",status); printf("\n > Physical Address %X, Tried Mapping %X ",address,addr); return(0); } else { printf(" > Map done, base = %X Phys.addr = %08X\n\n",addr,address); return (int)addr; } } */