COREWARS for SUN
An Existentialist
laba-2hd at e260-1e.berkeley.edu
Wed Jan 25 06:40:47 AEST 1989
OK, i've been swamped by requests for SUN corewars. Again. So, I'm giving
in and posting this.
This is the pixrect version of the corewars interpreter. I'm posting only
the sections that are changed. This is system specific. It does not depend
on SUNVIEW, X, or any other windowing system. You will need the pixrect
library to run this. Do NOT overlap other windows on the window generated,
and to remove this window, just do a redraw. (Yes, it does a write to the
frame buffer. Pretty ugly, but.....
As usual, bug reports, etc, send to me, and any questions pertaining to
interface2.c direct to Case Larsen (laba-2ho at weaver.berkeley.edu).
Na Choon Piaw
laba-2hd at weaver.berkeley.edu
--------------------------------- cut here --------------------------------
echo x - Makefile
cat >Makefile <<'!E!O!F!'
CFLAGS = -DSUN
interp: main.o load.o output.o play.o inst.o interface2.o
cc -o interp main.o load.o output.o play.o inst.o interface2.o -lcurses -ltermcap -lpixrect
main.o: interp.h main.c Makefile
cc -c $(CFLAGS) main.c -o main.o
load.o: interp.h load.c
cc -c $(CFLAG) load.c -o load.o
output.o: interp.h output.c Makefile
cc -c $(CFLAGS) output.c -o output.o
play.o: play.c interp.h Makefile
cc -c $(CFLAGS) play.c -o play.o
inst.o: inst.c interp.h
cc -c $(FLAGS) inst.c -o inst.o
!E!O!F!
echo x - interface2.c
cat >interface2.c <<'!E!O!F!'
/**********************************************************************
* *
* *
* Copyright 1989 By Case T. Larsen *
* All Rights Reserved *
* *
* *
**********************************************************************/
/*
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author makes no representations about the suitability of
this software for any purpose. It is provided "as is"
without express or implied warranty.
*/
#include <pixrect/pixrect_hs.h>
#include "interp.h"
#define Y(x) (((x)/100)*5)
#define X(x) (((x)%100)*5)
static struct pixrect *screen;
static struct pixrect *bm;
static bitm[8000];
static xpos[8000], ypos[8000];
xcore_init ()
{
int i;
screen = pr_open("/dev/fb");
bm = mem_create(500,400,1);
for (i=0; i<8000;i++) {
bitm[i] = 0;
xpos[i] = X(i); ypos[i] = Y(i);
zero(xpos[i],ypos[i]);
}
pr_rop (screen,0,0,500,400,PIX_SRC,bm,0,0);
} /* xcore_init */
zero (x,y)
int x,y;
{
pr_put (bm,x,y,1);
pr_put (bm,x,y+1,1);
pr_put (bm,x,y+2,1);
pr_put (bm,x+1,y,1);
pr_put (bm,x+1,y+1,1);
pr_put (bm,x+1,y+2,1);
pr_put (bm,x+2,y,1);
pr_put (bm,x+2,y+1,1);
pr_put (bm,x+2,y+2,1);
} /* zero */
one (x,y)
int x,y;
{
pr_put (bm,x,y,0);
pr_put (bm,x,y+1,0);
pr_put (bm,x,y+2,0);
pr_put (bm,x+1,y,0);
pr_put (bm,x+1,y+1,0);
pr_put (bm,x+1,y+2,0);
pr_put (bm,x+2,y,0);
pr_put (bm,x+2,y+1,0);
pr_put (bm,x+2,y+2,0);
} /* zero */
two (x,y)
int x,y;
{
pr_put (bm,x,y,1);
pr_put (bm,x,y+1,0);
pr_put (bm,x,y+2,0);
pr_put (bm,x+1,y,0);
pr_put (bm,x+1,y+1,1);
pr_put (bm,x+1,y+2,0);
pr_put (bm,x+2,y,0);
pr_put (bm,x+2,y+1,0);
pr_put (bm,x+2,y+2,1);
} /* zero */
xcore_display (mem)
cell mem[];
{
register int i;
register int owner;
for (i=0;i<8000;i++) {
if (mem[i].lastmod != bitm[i]) {
owner = bitm[i] = mem[i].lastmod;
if (owner) {
if (owner == 1) {
one (xpos[i],ypos[i]);
} else
two (xpos[i],ypos[i]);
} else
zero (xpos[i],ypos[i]);
}
}
pr_rop (screen,0,0,500,400,PIX_SRC,bm,0,0);
} /* xcore_display */
xcore_done ()
{
pr_close(screen);
} /* xcore_done */
!E!O!F!
echo x - interp.h
cat >interp.h <<'!E!O!F!'
/* MARS redcode interpreter:
Header file
Started December '88
Na Choon Piaw */
/*
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author makes no representations about the suitability of
this software for any purpose. It is provided "as is"
without express or implied warranty.
*/
/* instruction set */
typedef enum { dat, mov, add, sub, jmp, jmz, jmn, djn, cmp, spl } instr;
/* addressing modes */
typedef enum { immed, direct, indirect } mode;
/* this is the new definition of a memory cell */
typedef struct
{
instr inst; /* instruction */
int para1, para2; /* first parameter, second parameter */
mode m1, m2; /* addressing modes */
int lastmod; /* last modified by */
} cell;
/* old assembler definition of memory cell */
typedef struct
{
instr inst;
int para1, para2;
mode m1, m2;
} memory;
/* doubly circularly linked list for streams of execution */
typedef struct tag0
{
int pc; /* program counter */
struct tag0 *next, *prev;
} stream;
/* interpreter limits */
#define MAXINST 200 /* maximum number of instructions */
#define SIZE 8000 /* size of array */
#define MAXPLAY 3 /* maximum number of players */
#define RANDIVISOR 33
!E!O!F!
echo x - play.c
cat >play.c <<'!E!O!F!'
/* play.c ---- main program for the interpreter.
1. play player 1
2. play player 2
3. output
4. check deaths
5. repeat
--- 12/17/88 NCP */
/*
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author makes no representations about the suitability of
this software for any purpose. It is provided "as is"
without express or implied warranty.
*/
#include <stdio.h>
#include "interp.h"
extern stream *exe[];
extern cell a[];
int dead(i)
int i;
{
if (exe[i])
return 0;
else
return 1;
}
int alive()
{
int i, j = 1;
for (i = 1; i < MAXPLAY; i ++)
{
if (!exe[i])
{
j = 0;
break;
}
}
return(j);
}
int play(cycles)
long cycles;
{
int i;
while (alive() && cycles)
{
for ( i = 1; i < MAXPLAY; i++)
{
execute(i); /* play player n */
#ifdef DEBUG
output();
#endif
#ifdef BIG
output(cycles);
#endif
}
#ifdef SUN
if (!(cycles % 50))
xcore_display(a);
#endif
#ifdef SMALL
if (!(cycles % 100))
output(cycles);
#endif
cycles --;
}
if (dead(1) && !dead(2))
return(2); /* process 2 won */
else if (dead(2) && !dead(1))
return(1); /* process 1 won */
else
return(0); /* nobody won */
}
execute(i)
int (i);
{
instr temp; /* instruction */
int x; /* cell to execute */
int pc;
if (exe[i] == NULL)
return;
correct(&(exe[i] -> pc));
x = pc = exe[i] -> pc;
temp = a[x].inst;
/* this really should have been a switch-case, but I'm using an
elongated if-else because the compiler doesn't accept it. */
if (temp == dat)
Dat(i);
else if (temp == mov)
Mov(x, &pc, i);
else if (temp == add)
Add(x, &pc, i);
else if (temp == sub)
Sub(x, &pc, i);
else if (temp == jmp)
Jmp(x, &pc);
else if (temp == jmz)
Jmz(x, &pc);
else if (temp == jmn)
Jmn(x, &pc);
else if (temp == djn)
Djn(x, &pc, i);
else if (temp == cmp)
Cmp(x, &pc);
else if (temp == spl)
Spl(x, &pc, exe[i]);
else
{
printf("Instruction not recognized\n");
printf("--- execute\n");
printf("opcode: %d", temp);
printf(" executing no: %d", pc);
printf(" process: %d\n", i);
exit(1);
}
if (temp != dat)
exe[i] -> pc = pc;
if (exe[i] && (temp != dat))
exe[i] = exe[i] -> next;
}
!E!O!F!
echo x - main.c
cat >main.c <<'!E!O!F!'
/* main program for MARS interpreter
As usual, this does not do anything important.
Just calls all the proper subroutines in the right order and
opens files.
-- 12/16/88 --- NCP */
/*
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author makes no representations about the suitability of
this software for any purpose. It is provided "as is"
without express or implied warranty.
*/
#include "interp.h"
#include <ctype.h>
#include <stdio.h>
#include <memory.h>
#include <curses.h>
long atol();
/* memory array -- called "a" for easy typing */
cell a[SIZE];
/* next execution for each player */
stream *exe[MAXPLAY];
/* returns which player won */
int play();
usage()
{
printf("usage: interp cycles file1 file2\n");
printf("--- main\n");
}
/* checks that every element in string is a digit */
int number(str)
char *str;
{
int i = 1;
while (*str && i)
{
if (!isdigit(*str))
i = 0;
str++;
}
return i;
}
initialize()
{
int counter; /* general-purpose counter */
counter = (int) time(0);
#ifndef DEBUG
initscr(); /* for "curses" library */
scrollok(stdscr, 0);
nl();
clear();
refresh();
#endif
#ifdef SUN
xcore_init();
#endif
srand(counter);
for (counter = 0; counter++; counter < SIZE)
memset(a[counter],0,sizeof(cell));
}
main(argc, argv)
int argc;
char *argv[];
{
FILE *f;
int errcode, result;
initialize(); /* initialize all global variables */
if (argc != 4) /* too many or too few */
{
usage();
exit(1);
}
if (!(number(argv[1])))
{
usage();
exit(1);
}
if ((f = fopen(argv[2], "r")) == NULL)
{
printf("%s cannot be opened\n", argv[2]);
exit(1);
}
errcode = load(f, 1);
fclose(f);
if (errcode == 1) {
printf("main: Sorry, but %s is too large to load\n",argv[2]);
exit(1);
}
if ((f = fopen(argv[3], "r")) == NULL)
{
printf("%s cannot be opened\n", argv[3]);
exit(1);
}
errcode = load(f,2);
fclose(f);
if (errcode == 1) {
printf("main: Sorry, but %s is too large to load\n",argv[3]);
exit(1);
}
#ifndef DEBUG
clear();
#endif
result = play(atol(argv[1]));
#ifndef DEBUG
/* output(0); */
move(21, 0);
if (!result)
printw("nobody won!");
else
printw("%s won!", argv[result + 1]);
move(22, 0);
printw("Hit any key to continue...");
refresh();
getch(errcode);
endwin();
#endif
#ifdef SUN
xcore_done();
#endif
}
!E!O!F!
An Existentialist
laba-2hd at weaver.berkeley.edu
%flames >/dev/null
"Do you think that if I stopped thinking so much I'd have less trouble?"
More information about the Alt.sources
mailing list