|
|
1.1 ! root 1: #include "jerq.h" ! 2: #include <stdio.h> ! 3: #include <ctype.h> ! 4: ! 5: unsigned short delta[] = { ! 6: 0x0001, 0x0100, 0x0101, 0x00ff, 0xff00, 0xffff, 0xff01, 0xfeff ! 7: }; ! 8: ! 9: char magic[] = { ! 10: 0, 0, 0, 1, 0, 0, 0, 0, ! 11: 0, 0, 1, 1, 0, 0, 0, 0 ! 12: }; ! 13: ! 14: char *setment[] = { ! 15: "run", ! 16: "clear", ! 17: "read file", ! 18: "write file", ! 19: "exit", ! 20: 0 ! 21: }; ! 22: ! 23: Menu setmen = { setment }; ! 24: ! 25: char *runment[] = { ! 26: "setup", ! 27: "stop", ! 28: "slow", ! 29: "exit", ! 30: 0 ! 31: }; ! 32: ! 33: Menu runmen = { runment }; ! 34: ! 35: unsigned long *hash; ! 36: unsigned short list[512]; ! 37: unsigned short *lend; ! 38: unsigned short olist[512]; ! 39: unsigned short *olend; ! 40: unsigned long *hlist[768]; ! 41: unsigned long **hlistp; ! 42: Bitmap *discmap; ! 43: Bitmap *circmap; ! 44: Point setpt(); ! 45: unsigned short getpt(); ! 46: int stopmode; ! 47: int slowmode; ! 48: int stepcount; ! 49: FILE *filep; ! 50: ! 51: main(argc, argv) ! 52: char *argv[]; ! 53: { ! 54: register i; ! 55: register unsigned short *lp; ! 56: ! 57: #ifdef JERQ ! 58: request(KBD|MOUSE|RCV); ! 59: #else ! 60: request(KBD|MOUSE); ! 61: #endif ! 62: initdisplay(argc, argv); ! 63: olend = olist; ! 64: if ((discmap = balloc(Rect(0, 0, 16, 16))) == (Bitmap *)NULL) ! 65: exit(); ! 66: if ((circmap = balloc(Rect(0, 0, 16, 16))) == (Bitmap *)NULL) ! 67: exit(); ! 68: rectf(discmap, discmap->rect, F_CLR); ! 69: disc(discmap, Pt(7, 7), 7, F_XOR); ! 70: rectf(circmap, circmap->rect, F_CLR); ! 71: circle(circmap, Pt(7, 7), 2, F_XOR); ! 72: if ((hash = (unsigned long *)gcalloc(sizeof(long)*8192L, ! 73: (char **)&hash)) == (unsigned long *)NULL) ! 74: exit(); ! 75: setup(); ! 76: while (kbdchar() != 'q') { ! 77: if (own()&MOUSE && button1()) ! 78: stepcount = 1; ! 79: if (own()&MOUSE && button2()) { ! 80: switch(menuhit(&runmen, 2)) { ! 81: case 0: /* setup */ ! 82: setup(); ! 83: continue; ! 84: case 1: /* stop/go */ ! 85: runment[1] = stopmode? "stop":"go"; ! 86: stopmode ^= 01; ! 87: break; ! 88: ! 89: case 2: /* fast/slow */ ! 90: runment[2] = slowmode? "slow":"fast"; ! 91: slowmode ^= 01; ! 92: break; ! 93: ! 94: case 3: /* exit */ ! 95: exit(0); ! 96: } ! 97: } ! 98: if (stopmode && stepcount == 0) { ! 99: wait(MOUSE); ! 100: continue; ! 101: } ! 102: if (stepcount > 0) ! 103: stepcount--; ! 104: if (slowmode) ! 105: sleep(30); ! 106: gendisplay(); ! 107: genhash(); ! 108: genlist(); ! 109: wait(CPU); ! 110: } ! 111: } ! 112: ! 113: genhash() ! 114: { ! 115: register unsigned short *lp; ! 116: register unsigned long *hp, vl; ! 117: register short unsigned i, v, vn; ! 118: ! 119: hlistp = hlist; ! 120: for (lp = list; lp < lend; ) { ! 121: v = *lp++; ! 122: hp = &hash[v>>3]; ! 123: if (*hp == 0) ! 124: *hlistp++ = hp; ! 125: *hp |= 0x8L << ((v&07) << 2); ! 126: for (i=0; i<8; i++) { ! 127: vn = v + delta[i]; ! 128: hp = &hash[vn>>3]; ! 129: if (*hp == 0) ! 130: *hlistp++ = hp; ! 131: vl = 0x4L << ((vn&07) << 2); ! 132: if ((*hp & vl) == 0) { ! 133: vl >>= 2; ! 134: *hp += vl; ! 135: } ! 136: } ! 137: } ! 138: *hlistp = 0; ! 139: } ! 140: ! 141: genlist() ! 142: { ! 143: register unsigned long h; ! 144: register i, j; ! 145: register unsigned short *lp; ! 146: register unsigned long *hp; ! 147: ! 148: lp = lend = list; ! 149: hlistp = hlist; ! 150: while (hp = *hlistp++) { ! 151: h = *hp; ! 152: i = hp - hash; ! 153: for (j = 0; h != 0; j++) { ! 154: if (magic[h&0xf] /* && not at side edge */ ) ! 155: *lp++ = (i<<3) + j; ! 156: h >>= 4; ! 157: } ! 158: *hp = 0; ! 159: } ! 160: lend = lp; ! 161: } ! 162: ! 163: gendisplay() ! 164: { ! 165: register x, y; ! 166: register unsigned short *lp; ! 167: Point orig; ! 168: static short black_bits[]={ ! 169: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ! 170: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ! 171: }; ! 172: static Texture black; ! 173: static int first = 1; ! 174: ! 175: if (first) { ! 176: first = 0; ! 177: black = ToTexture(black_bits); ! 178: } ! 179: rectf(&display, display.rect, F_STORE); ! 180: orig = div(add(Drect.origin, Drect.corner), 2); ! 181: for (lp = list; lp < lend; ) { ! 182: x = ((*lp >> 8) - 0x80) << 2; ! 183: y = ((*lp++ & 0xff) - 0x80) << 2; ! 184: texture(&display, Rpt(add(orig, Pt(x,y)), ! 185: add(orig, Pt(x+2,y+2))), &black, F_XOR); ! 186: } ! 187: } ! 188: ! 189: setup() ! 190: { ! 191: register i, j; ! 192: register unsigned short *lp; ! 193: ! 194: for (i = 0; i < 8192; i++) ! 195: hash[i] = 0; ! 196: cleanset(); ! 197: more: ! 198: while(button1() && wait(MOUSE)) ! 199: ; ! 200: for (;; wait(MOUSE)) { ! 201: if (button1()) { ! 202: unsigned short p; ! 203: p = getpt(); ! 204: for (lp = olist; lp < olend; lp++) { ! 205: if (*lp == p) { ! 206: while (lp < olend-1) { ! 207: *lp = *(lp+1); ! 208: lp++; ! 209: } ! 210: dispt(circmap, p); ! 211: olend--; ! 212: goto more; ! 213: } ! 214: } ! 215: *olend++ = p; ! 216: dispt(discmap, p); ! 217: goto more; ! 218: } ! 219: if (button2()) { ! 220: switch(menuhit(&setmen, 2)) { ! 221: ! 222: case 0: /* run */ ! 223: break; ! 224: ! 225: case 1: /* clear */ ! 226: olend = olist; ! 227: cleanset(); ! 228: goto more; ! 229: ! 230: case 2: /* read file */ ! 231: if (getfile('r') == 0) ! 232: goto more; ! 233: olend = olist; ! 234: cleanset(); ! 235: for (;;) { ! 236: int x, y; ! 237: if (getnum(&x)==0) ! 238: break; ! 239: if (getnum(&y)==0) ! 240: break; ! 241: x += 0x80; ! 242: y += 0x80; ! 243: *olend = (x<<8) | (y & 0xff); ! 244: dispt(discmap, *olend++); ! 245: } ! 246: fclose(filep); ! 247: goto more; ! 248: ! 249: case 3: /* write file */ ! 250: if (getfile('w') == 0) ! 251: goto more; ! 252: for (lp = olist; lp < olend; lp++) { ! 253: putnum((*lp>>8)-0x80); ! 254: putc(' ', filep); ! 255: putnum((*lp&0xFF)-0x80); ! 256: putc('\n', filep); ! 257: } ! 258: putc('X', filep); ! 259: fclose(filep); ! 260: goto more; ! 261: ! 262: case 4: /* exit */ ! 263: exit(0); ! 264: ! 265: default: ! 266: continue; ! 267: } ! 268: break; ! 269: } ! 270: } ! 271: for (lp = olist, lend = list; lp < olend; ) ! 272: *lend++ = *lp++; ! 273: } ! 274: ! 275: Point ! 276: setpt(p) ! 277: unsigned short p; ! 278: { ! 279: Point pt; ! 280: register x, y; ! 281: ! 282: pt = add(Drect.origin,mul(div(sub(Drect.corner,Drect.origin),32),16)); ! 283: x = ((p>>8) - 0x80) << 4; ! 284: y = ((p & 0xff) - 0x80) << 4; ! 285: return(add(pt, Pt(x,y))); ! 286: } ! 287: ! 288: dispt(map, p) ! 289: register struct Bitmap *map; ! 290: unsigned short p; ! 291: { ! 292: trimblt(map, map->rect, setpt(p), F_STORE); ! 293: } ! 294: ! 295: unsigned short ! 296: getpt() ! 297: { ! 298: register Point sp, o; ! 299: ! 300: sp = div(sub(mouse.xy, Drect.origin), 16); ! 301: o = div(sub(Drect.corner,Drect.origin),32); ! 302: sp = sub(sp, o); ! 303: return(((0x80+sp.x)<<8) + ((0x80+sp.y) & 0xff)); ! 304: } ! 305: ! 306: cleanset() ! 307: { ! 308: register unsigned short *lp; ! 309: register i, j; ! 310: ! 311: for (i=Drect.origin.x; i < Drect.corner.x; i += 16) ! 312: trimblt(circmap, circmap->rect, ! 313: Pt(i, Drect.origin.y), F_STORE); ! 314: for (j=Drect.origin.y+16; j < Drect.corner.y; j += 16) ! 315: trimblt(&display, ! 316: Rpt(Drect.origin, Pt(Drect.corner.x, Drect.origin.y+16)), ! 317: Pt(Drect.origin.x, j), F_STORE); ! 318: for (lp = olist; lp <olend; lp++) ! 319: dispt(discmap, *lp); ! 320: } ! 321: ! 322: getnum(np) ! 323: register int *np; ! 324: { ! 325: register n=0, c, got=0, neg=0; ! 326: ! 327: for (;;) { ! 328: c = getc(filep); ! 329: if (c==' ' || c=='\t' || c=='\n') { ! 330: if (got) { ! 331: if (neg) ! 332: n = -n; ! 333: *np = n; ! 334: return(1); ! 335: } ! 336: } else if (c>='0' && c<='9') { ! 337: n = n*10 + c - '0'; ! 338: got = 1; ! 339: } else if (c=='-') ! 340: neg = 1; ! 341: else { ! 342: if (c != 'X') { ! 343: rectf(&display, Drect, F_CLR); ! 344: string(&defont, "Not a life file", &display, ! 345: add(display.rect.origin, Pt(20,20)), F_XOR); ! 346: sleep(120); ! 347: cleanset(); ! 348: } ! 349: return(0); ! 350: } ! 351: } ! 352: } ! 353: ! 354: getfile(rw) ! 355: { ! 356: char file[128]; ! 357: register char *fp = file; ! 358: register c; ! 359: Point fs; ! 360: int strw = strwidth(&defont, "x"); ! 361: ! 362: fp = file; ! 363: redraw: ! 364: while (kbdchar() >= 0) ! 365: ; ! 366: rectf(&display, Drect, F_CLR); ! 367: fs = string(&defont, "File: ", &display, ! 368: add(display.rect.origin, Pt(20,20)), F_XOR); ! 369: for (;;) { ! 370: wait(KBD); ! 371: c = kbdchar(); ! 372: switch(c) { ! 373: ! 374: case -1: ! 375: return(0); ! 376: ! 377: case '\n': ! 378: case '\r': ! 379: break; ! 380: ! 381: case '\b': ! 382: if (fp > file) { ! 383: *fp = '\0'; ! 384: fp--; ! 385: string(&defont, fp, &display, ! 386: sub(fs, Pt(strw, 0)), F_XOR); ! 387: fs = sub(fs, Pt(strw, 0)); ! 388: } ! 389: continue; ! 390: ! 391: case '@': ! 392: fp = file; ! 393: goto redraw; ! 394: ! 395: default: ! 396: *fp = c; ! 397: fp[1] = '\0'; ! 398: fs = string(&defont, fp++, &display, fs, F_XOR); ! 399: continue; ! 400: } ! 401: break; ! 402: } ! 403: *fp++ = '\0'; ! 404: if ((filep = fopen(file, rw == 'r' ? "r" : "w")) != NULL) { ! 405: cleanset(); ! 406: return(1); ! 407: } ! 408: rectf(&display, Drect, F_CLR); ! 409: fs = string(&defont, "Can't open it.", &display, ! 410: add(display.rect.origin, Pt(20,20)), F_XOR); ! 411: sleep(120); ! 412: cleanset(); ! 413: return(0); ! 414: } ! 415: ! 416: putnum(x) ! 417: register x; ! 418: { ! 419: register t; ! 420: ! 421: if (x < 0) { ! 422: putc('-', filep); ! 423: x = -x; ! 424: } ! 425: if ((t = x/10) > 0) ! 426: putnum(t); ! 427: putc(x%10 + '0', filep); ! 428: } ! 429: ! 430: trimblt(sb, r, p, f) ! 431: Bitmap *sb; ! 432: Rectangle r; ! 433: Point p; ! 434: Code f; ! 435: { ! 436: Rectangle nr; ! 437: int v; ! 438: ! 439: nr = raddp(r, sub(p, r.origin)); ! 440: v = rectclip(&nr, Drect); ! 441: if (v) { ! 442: nr = rsubp(nr, sub(p, r.origin)); ! 443: bitblt(sb, nr, &display, p, f); ! 444: } ! 445: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.