|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 2803 (0xaf3)
Types: TextFile
Names: »load.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Corewars/load.c«
/* program loader for MARS
12/16/88 --- NCP */
#include "interp.h"
#include <stdio.h>
#include <memory.h>
#include <malloc.h>
#define IO(i,j) if((i) < (j)){printf("error reading file\n");exit(1);}
extern cell a[];
extern stream *exe[];
/* generates starting position */
/* debugging non random version */
int startposition()
{
/* debugging code:
static int i = 0;
if (i == 0)
{
i = 1;
return(0);
}
else
return((int) SIZE / 2)
*/
return(rand()%SIZE);
}
load(f, no)
FILE *f; /* file */
int no; /* player number */
{
memory ele[MAXINST];
int i; /* number of instructions */
int test; /* test instructions read */
int start; /* starting instruction */
int position; /* loading position */
int counter; /* general-purpose counter */
test = fread(&i, sizeof(int), 1, f);
IO(test, 1)
printf("Found %d/%d instructions\n", i, MAXINST);
if (i > MAXINST) {
printf("load: Oops! Too large!!\n");
return(1); /* oops - too large */
}
test = fread(&start, sizeof(int), 1, f);
IO(test, 1)
test = fread(ele, sizeof(memory), i, f);
IO(test, i)
/* get a new starting position */
do {
position = startposition();
printf("Trying position %d\n", position);
} while (testpos(position,i));
/* and load the code there */
printf("Loading %d instructions at location %d\n", i, position);
for (counter = 0; counter < i; counter++) {
memcpy(&a[(counter+position)%SIZE],&ele[counter],sizeof(memory));
#ifdef DEBUG
if (!(((counter+position)%SIZE)%10)) {
printf("%d%",(counter+position)%SIZE);
} else {
putchar('.');
}
#endif
a[(counter+position)%SIZE].lastmod = no;
printf("Contents of location %d: %d %d %d %d %d %d\n",
(counter+position)%SIZE,
a[(counter+position)%SIZE].inst,
a[(counter+position)%SIZE].para1,
a[(counter+position)%SIZE].para2,
a[(counter+position)%SIZE].m1,
a[(counter+position)%SIZE].m2,
a[(counter+position)%SIZE].lastmod);
}
if ((exe[no] = (stream *) malloc(sizeof(stream))) == NULL) {
printf("load: Can't malloc the PC - aborting\n");
exit(1);
} else {
exe[no]->pc = (position + start) % SIZE;
exe[no]->next = exe[no]->prev = exe[no];
#ifdef DEBUG
printf("Starting PC: %d %d %d\n", exe[no]->pc, exe[no]->next->pc, exe[no]->prev->pc);
#endif
}
return(0); /* all OK */
}
/* tests for empty segment of *no* bytes starting at *start* */
testpos(start,no)
int start,no;
{
int counter; /* general-purpose counter */
for (counter = 0; counter < no; counter++) {
#ifdef DEBUG
if (!(((counter+start)%SIZE)%10)) {
printf("%d%",(counter+start)%SIZE);
} else {
putchar('.');
}
#endif
if (a[(counter+start)%SIZE].lastmod) {
printf("testpos: Oops -- something at %d\n",(counter+start)%SIZE);
return(1); /* oops - clash */
}
}
return(0); /* all clear - segment is free */
}