|
|
1.1 root 1: #include <stdio.h>
2: #include <fb.h>
3: #include "pico.h"
4:
5: #define lowbyte(A) (A)&0377
6: #define higbyte(A) ((A) >> 8) & 07
7:
8: extern short CURSCRATCH, CUROLD;
9: extern struct SRC src[MANY];
10: extern long program();
11: extern char usednew, usedold, ramtek, frameb, metheus, faster;
12: extern int DEF_LL, DEF_NL;
13:
14: struct {
15: long u;
16: long p;
17: long chld_usrt;
18: long chld_syst;
19: } tim0, tim1;
20:
21: int sx, sy, ex, ey, delta, offset;
22: int lastx, lasty, lastc;
23:
24: munge(chann)
25: { int i;
26: float t0, t1;
27:
28: sx = Old->sx;
29: sy = Old->sy;
30: ex = Old->ex;
31: ey = Old->ey;
32: offset = sy*DEF_LL + sx;
33: delta = DEF_LL - ex + sx;
34:
35: checkit();
36: /* if (usednew) { setscratch(Old, Scratch); } */
37: times(&tim0);
38:
39: switch (chann) {
40: case NLOOP: noloop(); break;
41: case SLOOP: smalloop(); break;
42: case XLOOP: oneloop(); break;
43: case BLOOP: if (faster && (metheus || Old->nchan == 1) && usednew)
44: { if (ramtek)
45: { hock();
46: break;
47: } else if (frameb)
48: { hack();
49: break;
50: } else if (metheus)
51: { hick();
52: break;
53: }
54: }
55: bigloop();
56: break;
57: }
58: times(&tim1);
59: t0 = (float) (tim1.u - tim0.u);
60: t1 = (float) (tim1.p - tim0.p);
61:
62: fprintf(stderr, "time: %4.2fu + %4.2fs = %4.2f\n",
63: t0/60.0, t1/60.0, (t1+t0)/60.0);
64: if (usednew) { setscratch(Scratch, Old); RESIDENT; }
65: }
66:
67: hock()
68: { register x, y, i = offset; /* r11, r10, r9 */
69: register short *w;
70: short W[1024+16]; /* enough room for largest line */
71: short dW = 2*(7+ex-sx);
72: extern int Rfd;
73:
74: W[0] = 05003; W[1] = 000100; W[2] = sx;
75: W[4] = ex-1; W[6] = 2*(ex-sx);
76:
77: for (y = sy; y < ey; y++, i += delta)
78: { W[3] = y; W[5] = y+1; w = &W[7];
79: for (x = sx; x < ex; x++, i++)
80: {
81: asm(" jsb *_program ");
82: asm(" CB: brb CB+9 ");
83: *w++ = program();
84: }
85: write(Rfd, W, dW);
86: }
87: }
88:
89: hack()
90: { register x, y, i = offset; /* r11, r10, r9 */
91: register r;
92:
93: extern fbreg *F; /* place holder, only 68 bytes */
94: register fbreg *f = F; /* initial value */
95:
96: f->red.csr=f->grn.csr=f->blu.csr=F_IXW;
97: for (y = sy; y < ey; y++, i += delta)
98: { f->red.x=f->grn.x=f->blu.x=sx;
99: f->red.y=f->grn.y=f->blu.y=y;
100: for (x = sx; x < ex; x++, i++)
101: {
102: asm(" jsb *_program ");
103: asm(" CA: brb CA+9 ");
104: r=program();
105: f->red.z=f->grn.z=f->blu.z=r&255;
106: }
107: }
108: }
109:
110: hick()
111: { register x, y, i = offset; /* r11, r10, r9 */
112: register unsigned char *w;
113: unsigned char mcode[16];
114: unsigned char W[1024]; /* avoid allocation */
115: unsigned char *pr, *pg, *pb;
116: extern int om_fd;
117:
118: pr = Scratch->pixred+i;
119: pg = Scratch->pixgrn+i;
120: pb = Scratch->pixblu+i;
121:
122: mcode[0] = 0x4F;
123: mcode[1] = 0377; /* WRMASK */
124: mcode[2] = 0x52; /* set P1 */
125: mcode[7] = 0x53; /* set P2 */
126: mcode[12] = 0;
127: mcode[13] = 'o';
128: mcode[3] = lowbyte(sx);
129: mcode[4] = higbyte(sx);
130: mcode[8] = lowbyte(ex);
131: mcode[9] = higbyte(ex);
132: if (Old->nchan==1)
133: for (y = sy; y < ey; y++, i += delta)
134: { mcode[5] = mcode[10] = lowbyte(y);
135: mcode[6] = mcode[11] = higbyte(y);
136: for (x = sx, w = W; x < ex; x++, i++)
137: {
138: asm(" jsb *_program ");
139: asm(" CD: brb CD+9 ");
140: *w++ = program();
141: }
142: write(om_fd, mcode, 14);
143: write(om_fd, W, ex-sx);
144: }
145: else
146: for (y = sy; y < ey; y++, i += delta)
147: { mcode[5] = mcode[10] = lowbyte(y);
148: mcode[6] = mcode[11] = higbyte(y);
149: for (x = sx; x < ex; x++, i++)
150: {
151: asm(" jsb *_program ");
152: asm(" CE: brb CE+9 ");
153: program();
154: }
155: for (x = sx, w = W; x < ex; x++)
156: *w++ = ((*pr++ & 224))|
157: ((*pg++ & 192)>>3)|
158: ((*pb++ & 224)>>5);
159: write(om_fd, mcode, 14);
160: write(om_fd, W, ex-sx);
161: pr += delta; pg += delta; pb += delta;
162: }
163: }
164:
165: bigloop()
166: { register x, y, i = offset; /* r11, r10, r9 */
167:
168: for (y = sy; y < ey; y++, i += delta)
169: for (x = sx; x < ex; x++, i++)
170: {
171: asm(" jsb *_program ");
172: asm(" C0: brb C0+9 ");
173: program();
174: }
175: }
176:
177: smalloop()
178: { register x, y, i; /* r11, r10, r9 */
179:
180: for (i = 0; i < 256; i++)
181: {
182: asm(" jsb *_program ");
183: asm(" C1: brb C1+9 ");
184: program();
185: }
186: }
187:
188: oneloop()
189: { register x, y, i; /* r11, r10, r9 */
190:
191: for (x = 0; x < DEF_LL; x++)
192: {
193: asm(" jsb *_program ");
194: asm(" C2: brb C2+9 ");
195: program();
196: }
197: }
198:
199: noloop()
200: { register x, y, i; /* r11, r10, r9 */
201:
202: asm(" jsb *_program ");
203: asm(" C3: brb C3+9 ");
204: program();
205: }
206:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.