|
|
researchv10 Norman
#include <stdio.h>
#include <signal.h>
#include <fb.h>
#include "pico.h"
extern short CURSCRATCH, CUROLD;
extern struct SRC src[MANY];
extern long program();
extern char usednew, usedold, frameb, metheus, faster;
extern int DEF_LL, DEF_NL;
extern void onquit();
#define RGBA 0xe
#define RGB 0xd
#define A 0x1
#define R 0x2
#define G 0x4
#define B 0x8
struct {
long u;
long p;
long chld_usrt;
long chld_syst;
} tim0, tim1;
int sx, sy, ex, ey, delta, offset;
munge(chann)
{ int i;
float t0, t1;
sx = Old->sx;
sy = Old->sy;
ex = Old->ex; if ((ex-sx)&1) ex++;
ey = Old->ey;
offset = sy*DEF_LL + sx;
delta = DEF_LL - ex + sx;
checkit();
times(&tim0);
switch (chann) {
case NLOOP: noloop(); break;
case SLOOP: smalloop(); break;
case BLOOP: if (faster && (metheus || Old->nchan == 1) && usednew)
{ if (frameb)
{ hack();
break;
} else if (metheus)
{ hick();
break;
}
}
bigloop();
break;
}
times(&tim1);
t0 = (float) (tim1.u - tim0.u);
t1 = (float) (tim1.p - tim0.p);
fprintf(stderr, "time: %4.2fu + %4.2fs = %4.2f\n",
t0/60.0, t1/60.0, (t1+t0)/60.0);
if (usednew) { setscratch(Scratch, Old); RESIDENT; }
}
hack()
{ register x, y, i = offset; /* r11, r10, r9 */
register r;
extern fbreg *F;
register fbreg *f = F;
f->red.csr=f->grn.csr=f->blu.csr=F_IXW;
for (y = sy; y < ey; y++, i += delta)
{ f->red.x=f->grn.x=f->blu.x=sx;
f->red.y=f->grn.y=f->blu.y=y;
for (x = sx; x < ex; x++, i++)
{
asm(" jsb *_program ");
asm(" CA: brb CA+9 ");
r=program();
f->red.z=f->grn.z=f->blu.z=r&255;
}
}
}
hick()
{ register x, y, i = offset; /* r11, r10, r9 */
unsigned char *pr, *pg, *pb;
int chunk;
extern int om_fd;
pr = Scratch->pixred+i;
pg = Scratch->pixgrn+i;
pb = Scratch->pixblu+i;
chunk = ex-sx+delta;
signal(SIGINT, SIG_IGN); /* don't mess up the device */
if (Old->nchan==1)
{ merect(sx, sy, ex, ey);
setbank(RGBA);
for (y = sy; y < ey; y++, i += delta, pr += chunk)
{ for (x = sx; x < ex; x++, i++)
{
asm(" jsb *_program ");
asm(" CD: brb CD+9 ");
program();
}
write(om_fd, pr, ex-sx);
}
}
else
for (y = sy; y < ey; y++, i += delta)
{ for (x = sx; x < ex; x++, i++)
{
asm(" jsb *_program ");
asm(" CE: brb CE+9 ");
program();
}
merect(sx, y, ex, y+1);
setbank(R); write(om_fd, pr, ex-sx); pr += chunk;
setbank(G); write(om_fd, pg, ex-sx); pg += chunk;
setbank(B); write(om_fd, pb, ex-sx); pb += chunk;
}
signal(SIGINT, onquit);
}
bigloop()
{ register x, y, i = offset; /* r11, r10, r9 */
for (y = sy; y < ey; y++, i += delta)
for (x = sx; x < ex; x++, i++)
{
asm(" jsb *_program ");
asm(" C0: brb C0+9 ");
program();
}
}
smalloop()
{ register x, y, i; /* r11, r10, r9 */
for (i = 0; i < 256; i++)
{
asm(" jsb *_program ");
asm(" C1: brb C1+9 ");
program();
}
}
noloop()
{ register x, y, i; /* r11, r10, r9 */
asm(" jsb *_program ");
asm(" C2: brb C2+9 ");
program();
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.