From ae69a754244c4e475c8d2591772ca8e005071d83 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 18 Feb 2019 11:55:41 +0100 Subject: Update to 5.42 --- hacks/bsod.c | 600 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 591 insertions(+), 9 deletions(-) (limited to 'hacks/bsod.c') diff --git a/hacks/bsod.c b/hacks/bsod.c index ff6c359..f3af911 100644 --- a/hacks/bsod.c +++ b/hacks/bsod.c @@ -61,6 +61,8 @@ #include "images/gen/macbomb_png.h" #include "images/gen/apple_png.h" #include "images/gen/atm_png.h" +#include "images/gen/sun_png.h" +#include "images/gen/dvd_png.h" #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -481,8 +483,14 @@ draw_char (struct bsod_state *bst, char c) { int dir, ascent, descent; XCharStruct ov; + Bool cursorp = (c == '\033'); /* apparently \e is non-standard now! */ + + if (cursorp) c = ' '; XTextExtents (bst->font, &c, 1, &dir, &ascent, &descent, &ov); + if (bst->x < bst->left_margin) + bst->x = bst->left_margin; + if ((bst->wrap_p || bst->word_wrap_p) && bst->x + ov.width > bst->xgwa.width - bst->right_margin - bst->xoff) { @@ -518,8 +526,30 @@ draw_char (struct bsod_state *bst, char c) } } + /* We render the character ESC as an inverted space (block cursor). */ + + if (cursorp) + { + unsigned long swap = bst->fg; + bst->fg = bst->bg; + bst->bg = swap; + XSetForeground (bst->dpy, bst->gc, bst->fg); + XSetBackground (bst->dpy, bst->gc, bst->bg); + } + XDrawImageString (bst->dpy, bst->window, bst->gc, bst->x, bst->y, &c, 1); + + if (cursorp) + { + unsigned long swap = bst->fg; + bst->fg = bst->bg; + bst->bg = swap; + XSetForeground (bst->dpy, bst->gc, bst->fg); + XSetBackground (bst->dpy, bst->gc, bst->bg); + c = ' '; + } + bst->x += ov.width; if (bst->word_wrap_p) @@ -670,6 +700,11 @@ bsod_pop (struct bsod_state *bst) int h = (long) bst->queue[bst->pos].arg4; int tox = (long) bst->queue[bst->pos].arg5; int toy = (long) bst->queue[bst->pos].arg6; + + /* If ~0, place pixmap at current text pos */ + if (tox == ~0) tox = bst->x; + if (toy == ~0) toy = bst->y - bst->font->ascent; + if (type == PIXMAP && bst->mask) { XSetClipMask (bst->dpy, bst->gc, bst->mask); @@ -838,7 +873,7 @@ make_bsod_state (Display *dpy, Window window, char buf1[1024], buf2[1024]; char buf5[1024], buf6[1024]; char buf7[1024], buf8[1024]; - const char *font1, *font3, *font4; + char *font1, *font3, *font4; bst = (struct bsod_state *) calloc (1, sizeof (*bst)); bst->queue_size = 10; @@ -939,6 +974,11 @@ make_bsod_state (Display *dpy, Window window, bst->y = bst->font->ascent + bst->left_margin + bst->yoff; XSetWindowBackground (dpy, window, gcv.background); + + if (font1) free (font1); + if (font3) free (font3); + if (font4) free (font4); + return bst; } @@ -956,6 +996,8 @@ free_bsod_state (struct bsod_state *bst) XFreePixmap(bst->dpy, bst->mask); XFreeFont (bst->dpy, bst->font); + if (bst->fontB && bst->fontB != bst->font) XFreeFont (bst->dpy, bst->fontB); + if (bst->fontC && bst->fontC != bst->font) XFreeFont (bst->dpy, bst->fontC); XFreeGC (bst->dpy, bst->gc); for (i = 0; i < bst->queue_size; i++) @@ -3217,6 +3259,36 @@ sparc_solaris (Display *dpy, Window window) { struct bsod_state *bst = make_bsod_state (dpy, window, "solaris", "Solaris"); int i; + int pix_w = 0, pix_h = 0; + int char_width; + Pixmap mask = 0; + Pixmap pixmap = image_data_to_pixmap (dpy, window, + sun_png, sizeof(sun_png), + &pix_w, &pix_h, &mask); +# if 0 + if (pixmap && + pix_w < bst->xgwa.width / 2 && + pix_h < bst->xgwa.height / 2) + { + int i, n = 1; + if (bst->xgwa.width > 2560) n++; /* Retina displays */ + for (i = 0; i < n; i++) + { + pixmap = double_pixmap (dpy, bst->xgwa.visual, + bst->xgwa.depth, pixmap, pix_w, pix_h); + mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h); + pix_w *= 2; + pix_h *= 2; + } + } +# endif + + char_width = (bst->font->per_char + ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width + : bst->font->min_bounds.width); + + bst->pixmap = pixmap; + bst->mask = mask; bst->scroll_p = True; bst->wrap_p = True; @@ -3224,8 +3296,14 @@ sparc_solaris (Display *dpy, Window window) bst->top_margin = bst->bottom_margin = bst->xgwa.height * 0.07; bst->y = bst->top_margin + bst->yoff + bst->font->ascent; +# if 0 + /* This looks correct if we have a desktop image behind it, but doesn't + make sense if it's a photo. So let's skip it. */ BSOD_IMG (bst); BSOD_PAUSE (bst, 3000000); +# endif + + BSOD_LINE_DELAY (bst, 20000); BSOD_INVERT(bst); BSOD_RECT (bst, True, @@ -3260,30 +3338,359 @@ sparc_solaris (Display *dpy, Window window) " 100131480 10012a6e0 0\n" "End traceback...\n" "panic[cpu0]/thread=30000953a20: trap\n" - "syncing file systems..."); + "syncing file systems...\033"); BSOD_PAUSE (bst, 3000000); - BSOD_TEXT (bst, LEFT, " 1 done\n"); - BSOD_TEXT (bst, LEFT, "dumping to /dev/dsk/c0t0d0s3, offset 26935296\n"); + BSOD_TEXT (bst, LEFT, "\b 1 done\n"); + BSOD_TEXT (bst, LEFT, "dumping to /dev/dsk/c0t0d0s3, offset 26935296\n\033"); BSOD_PAUSE (bst, 2000000); - + BSOD_TEXT (bst, LEFT, "\b"); for (i = 1; i <= 100; ++i) { char buf[100]; - sprintf (buf, "\b\b\b\b\b\b\b\b\b\b\b%3d%% done", i); + sprintf (buf, "\r %3d%% done\033", i); BSOD_TEXT (bst, LEFT, buf); BSOD_PAUSE (bst, 100000); } BSOD_TEXT (bst, LEFT, - ": 2803 pages dumped, compression ratio 2.88, dump succeeded\n"); + "\b: 2803 pages dumped, compression ratio 2.88, dump succeeded\n\033"); BSOD_PAUSE (bst, 2000000); BSOD_TEXT (bst, LEFT, - "rebooting...\n" - "Resetting ..."); + "\brebooting...\n" + "Resetting ...\n\033"); + + BSOD_PAUSE (bst, 3000000); + + BSOD_INVERT(bst); + BSOD_RECT (bst, True, + bst->left_margin, bst->top_margin, + bst->xgwa.width - bst->left_margin - bst->right_margin, + bst->xgwa.height - bst->top_margin - bst->bottom_margin); + BSOD_INVERT(bst); + BSOD_MOVETO (bst, bst->left_margin, bst->top_margin + bst->font->ascent); + BSOD_PAUSE (bst, 1000000); + + BSOD_TEXT (bst, LEFT, + "Starting real time clock...\n" + "Probing /sbus@1,f8000000 at 0,0 dma esp sd st le\n" + "Probing /sbus@1,f8000000 at 1,0 Invalid FCode start byte at ffe70000\n" + "Probing /sbus@1,f8000000 at 2,0 Invalid FCode start byte at ffe70000\n" + "Probing /sbus@1,f8000000 at 3,0 bwtwo\n" + "\n"); + + BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, ~0, ~0); + BSOD_MARGINS (bst, + bst->left_margin + char_width * 12, + bst->top_margin); + BSOD_TEXT (bst, LEFT, + "SPARCstation IPC, Keyboard Present\n" + "ROM Rev. 2.9, 16 MB memory installed, Serial #12648190.\n" + "Ethernet address 8:0:20:37:1:87, Host ID: 52c0fefe.\n"); + BSOD_MARGINS (bst, bst->left_margin, bst->top_margin); + + BSOD_TEXT (bst, LEFT, "\n\n\033"); + BSOD_PAUSE (bst, 3000000); + BSOD_TEXT (bst, LEFT, "\r"); + + BSOD_TEXT (bst, LEFT, "Testing 16 megs of memory. Still to go \033 16"); + + for (i = 16; i > 0; i--) + { + char buf[100]; + sprintf (buf, "\b\b%2d", i); + BSOD_TEXT (bst, LEFT, buf); + BSOD_PAUSE (bst, 100000); + } + BSOD_TEXT (bst, LEFT, "\b\b\b\b 0\n" + "Initializing 16 megs of memory at addr 0\033 16"); + for (i = 16; i >= 0; i--) + { + char buf[100]; + sprintf (buf, "\b\b%2d", i); + BSOD_TEXT (bst, LEFT, buf); + BSOD_PAUSE (bst, 30000); + } + BSOD_TEXT (bst, LEFT, "\r" + " \r" + "Boot device: /sbus/le@0,c00000 File and args:\n\033"); + + { + int n = (random() % 10); + for (i = 0; i < n; i++) + { + BSOD_PAUSE (bst, 3000000); + BSOD_TEXT (bst, LEFT, "\rTimeout waiting for ARP/RARP packet\n\033"); + } + } + BSOD_TEXT (bst, LEFT, "\r"); + + BSOD_TEXT (bst, LEFT, + "Internal loopback test -- Wrong packet length;" + " expected 36, observed 1600\n" + "Can't open boot device\n" + "\n" + "Type b (boot), c (continue), or n (new command mode)\n" + ">"); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 10); + BSOD_TEXT (bst, LEFT, "n\n"); + BSOD_PAUSE (bst, 500000); + BSOD_TEXT (bst, LEFT, "Type help for more information\n" + "ok "); + + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4); + BSOD_CHAR_DELAY (bst, 80000); + BSOD_TEXT (bst, LEFT, /* "test net" */ + "t\033\be\033\bs\033\bt\033\b \033\bn\033\be\033\bt\033\b"); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 2); + BSOD_TEXT (bst, LEFT, "\n\033"); + BSOD_CHAR_DELAY (bst, 0); + + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, "\r Lance register test -- succeeded.\n\033"); + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, "\r Internal loopback test -- succeeded.\n\033"); + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, "\r External loopback test -- succeeded.\n" + "ok "); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 8); + + BSOD_TEXT (bst, LEFT, "\rok "); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4); + BSOD_CHAR_DELAY (bst, 80000); + BSOD_TEXT (bst, LEFT, /* "boot cdrom" */ + "b\033\bo\033\bo\033\bt\033\b \033\bc\033\bd\033\br\033\bo\033\bm\033\b"); + BSOD_TEXT (bst, LEFT, " \n"); + BSOD_CHAR_DELAY (bst, 0); + BSOD_TEXT (bst, LEFT, + "\rBoot device: /sbus/esp@0,800000/sd@6,0:c File and args:\n\033"); + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, + "\rroot on fstype 4.3\n" + "Boot: vmunix\n\033"); + + BSOD_TEXT (bst, LEFT, "\rSize: 696320+"); + BSOD_CHAR_DELAY (bst, 5000); + BSOD_INVERT(bst); + BSOD_TEXT (bst, LEFT, /* spinner */ + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" + "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"); + BSOD_INVERT(bst); + BSOD_TEXT (bst, LEFT, "\b+"); + BSOD_CHAR_DELAY (bst, 0); + BSOD_TEXT (bst, LEFT, + "2218504+28056 bytes\n\033"); + BSOD_PAUSE (bst, 1000000); + + i = random() % 3; + + if (i == 0) + { + BSOD_TEXT (bst, LEFT, + "\rSunOS Release 4.1.1 (MUNIX) #1: Thu Oct 11 11:22:48 PDT 1990\n" + "Copyright (c) 1983-1990, Sun Microsystems, Inc.\n" + "mem = 16384K (0x1000000)\n" + "avail mem = 12865536\n" + "Ethernet address = 8:0:20:37:1:87\n" + "No FPU in configuration\n" + "cpu = SUNW,Sun 4/40\n" + "zs0 at obio 0xf1000000 pri 12\n" + "zs1 at obio 0xf0000000 pri 12\n" + "sbus0 at SBus slot 0 0x0\n" + "dma0 at SBus slot 0 0x400000\n" + "esp0 at SBus slot 0 0x800000 pri 3\n" + "\033"); + } + else if (i == 1) + { + BSOD_TEXT (bst, LEFT, + "\rSunOS Release 5.6 Version Generic [UNIX(R) System V Release 4.0]\n" + "Copyright (c) 1983-1997, Sun Microsystems, Inc.\n" + "No FPU in configuration\n" + "WARNING: kbd: Unknown keyboard type, Type 3 assumed.\n" + "WARNING: kbd: Unknown keyboard type, Type 3 assumed.\n" + "Configuring devices...\n" + "\033"); + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, + "\rWARNING: /sbus@1,f8000000/esp@0,800000/sd@6,0 (sd6):\n" + " incomplete read- retrying\n" + "\n" + "loadkeys: ioctl(KIOCLAYOUT): Invalid argument\n" + "\033"); + } + else + { + BSOD_TEXT (bst, LEFT, + "\rSunOS Release 5.3 Version Generic [UNIX(R) System V Release 4.0]\n" + "Copyright (c) 1983-1993, Sun Microsystems, Inc.\n" + "No FPU in configuration\n" + "WARNING: /sbus@1,f8000000/esp@0,800000/sd@3,0 (sd3):\n" + " corrupt label - wrong magic number\n" + "\n" + "\\ unexpected data phase\n\033"); + for (i = 0; i < 3; i++) + { + BSOD_PAUSE (bst, 3000000); + if (i > 0) + BSOD_TEXT (bst, LEFT, + "\r polled command timeout\n"); + BSOD_TEXT (bst, LEFT, + "\resp: State=DATA Last State=UNKNOWN\n" + "esp: Latched stat=0x11 intr=0x10" + " fifo 0x0\n" + "esp: lst msg out: IDENTIFY; lst msg in: COMMAND COMPLETE\n" + "esp: DMA csr=0x10\n" + "esp: addr=fff0100f dmacnt=8000 last=fff01008 last_cnt=7\n" + "esp: Cmd dump for Target 6 Lun 0:\n" + "esp: cdblen=6, cdb=[ 0x0 0x0 0x0 0x0 0x1 0x0 ]\n" + "esp: pkt_state 0x3 pkt_flags 0x10000" + " pkt_statistics 0x0\n" + "esp: cmd_flags=0x10022 cmd_timeout=120\n" + "\033"); + } + BSOD_PAUSE (bst, 3000000); + BSOD_TEXT (bst, LEFT, + "\rWARNING: /sbus@1,f8000000/esp@0,800000/sd@6,0 (sd6):\n" + " incomplete read- retrying\n" + "\n" + "loadkeys: ioctl(KIOCLAYOUT): Invalid argument\n" + "\033"); + } + + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, + "\rsd1 at esp0 target 1 lun 0\n" + "sd1: corrupt label - wrong magic number\n" + "sd1: Vendor ' SEAGAT', product ' ', 786432 512 byte blocks\n" + "sr0: Unrecongized vendor 'Sony '," + " product 'CDU-76S 'sr0 at esp0 target 6 lun 0\n" + "le0 at SBus slot 0 0xc00000 pri 5\n" + "fd0 at obio 0xf7200000 pri 11\n\033"); + BSOD_PAUSE (bst, 1000000); + BSOD_TEXT (bst, LEFT, + "\rrd0: using preloaded munixfs\n" + "WARNING: TOD clock not initialized -- CHECK AND RESET THE DATE!\n" + "root on rd0a fstype 4.2\n" + "swap on ns0b fstype spec size 12480K\n" + "dump on ns0b fstype spec size 12468K\n" + "\033"); + BSOD_PAUSE (bst, 4000000); + + i = random() % 3; + + if (i == 0) + { + BSOD_TEXT (bst, LEFT, + "\rStarting OpenWindows...\n" + "\n" + "\n" + "waiting for X server to begin accepting connections \033"); + BSOD_PAUSE (bst, 2500000); + BSOD_TEXT (bst, LEFT, "\b.\033"); + BSOD_PAUSE (bst, 2500000); + BSOD_TEXT (bst, LEFT, "\b \n.\033"); + for (i = 0; i < 10; i++) + { + BSOD_PAUSE (bst, 2500000); + BSOD_TEXT (bst, LEFT, "\b.\033"); + BSOD_PAUSE (bst, 2500000); + BSOD_TEXT (bst, LEFT, "\b \n.\033"); + } + } + else if (i == 1) + { + BSOD_TEXT (bst, LEFT, + "\rCan't invoke /sbin/init, error 13\n" + "Can't invoke /etc/init, error 13\n" + "Can't invoke /bin/init, error 13\n" + "Can't invoke /usr/etc/init, error 13\n" + "Can't invoke /usr/bin/init, error 13\n" + "panic: icode\n" + "syncing file systems...\033"); + BSOD_PAUSE (bst, 2000000); + BSOD_TEXT (bst, LEFT, "\b done\n"); + BSOD_TEXT (bst, LEFT, + "00000 low-memory static kernel pages\n" + "00888 additional static and sysmap kernel pages\n" + "00000 dynamic kernel data pages\n" + "00008 additional user structure pages\n" + "00000 segmap kernel pages\n" + "00000 segvn kernel pages\n" + "00000 current user process pages\n" + "00000 user stack pages\n" + "00896 total pages (896 chunks)\n" + "\n" + "dumping to vp ff007dd4, offset 17768\n" + "0 total pages, dump failed: error 19\n" + "rebooting...\n"); + } + else + { + BSOD_TEXT (bst, LEFT, + "\r \n" + "What would you like to do?\n" + " 1 - install SunOS mini-root\n" + " 2 - exit to single user shell\n" + "Enter a 1 or 2: "); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4); + BSOD_TEXT (bst, LEFT, + "2\n" + "you may restart this script by typing \n# "); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4); + BSOD_CHAR_DELAY (bst, 80000); + BSOD_TEXT (bst, LEFT, "l\033\bs\033\b"); + BSOD_TEXT (bst, LEFT, " \n"); + BSOD_CHAR_DELAY (bst, 0); + BSOD_TEXT (bst, LEFT, + ".MUNIXFS bin extract stand\n" + ".profile dev lib tmp\n" + "README etc sbin usr\n" + "# "); + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4); + BSOD_CHAR_DELAY (bst, 80000); + BSOD_TEXT (bst, LEFT, /* ". extract" */ + ".\033\b \033\be\033\bx\033\bt\033\br\033\ba\033\bc\033\bt\033\b"); + BSOD_TEXT (bst, LEFT, " \n"); + BSOD_CHAR_DELAY (bst, 0); + BSOD_TEXT (bst, LEFT, + "using cdrom partition number 2\n" + "esp0: data transfer overrun\n" + " State=DATA Last State=DATA_DNE\n" + " Latched stat=0x11 intr=0x10 fifo 0x0\n" + " lst msg out: EXTENDED; lst msg in: COMMAND COMPLETE\n" + " DMA csr=0x10\n" + " addr=fff026d0 last=fff024d0 last_count=200\n" + " Cmd dump for Target 6 Lun 0:\n" + " cdb=[ 0x8 0x0 0x0 0x0 0x1 0x0 ]\n" + " pkt_state 0xf pkt_flags 0x0" + " pkt_statistics 0x0\n" + " Mapped Dma Space:\n" + " Base = 0x24d0 Count = 0x200\n" + " Transfer History:\n" + " Base = 0x24d0 Count = 0x200\n"); + } + + BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 8); + + XClearWindow(dpy, window); return bst; } @@ -5023,6 +5430,122 @@ apple2ransomware (Display *dpy, Window window) +static void +a2controller_encom (apple2_sim_t *sim, int *stepno, + double *next_actiontime) +{ + apple2_state_t *st=sim->st; + + struct mydata { + const char *str; + Bool bold_p; + } *mine; + + if (!sim->controller_data) + sim->controller_data = calloc(sizeof(struct mydata),1); + mine=(struct mydata *) sim->controller_data; + + switch(*stepno) { + case 0: + + st->gr_mode |= A2_GR_FULL; + a2_cls(st); + a2_goto(st,0,35); + a2_prints(st, "ENCOM"); + a2_goto(st,23,0); + *stepno = 10; + *next_actiontime += 6; + break; + + case 10: + a2_cls(st); + a2_goto(st,0,0); + *stepno = 11; + *next_actiontime += 1; + break; + + case 11: + a2_goto(st, 1, 0); + *stepno = 12; + mine->str = ("\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "SEPT 22, 18:32:21 PM\n" + "\n" + " YOUR ACCESS SUSPENDED\n" + " PLEASE REPORT TO DILLINGER\n" + " IMMEDIATELY\n" + " AUTHORIZATION: MASTER CONTROL\n" + " PROGRAM\n" + "\n" + "\r\r\r\r\r" + " END OF LINE\n" + "\n" + "\n" + "\n" + "\n"); + break; + + case 12: + { + char c = *mine->str; + mine->str++; + + if (c == 0) + { + *next_actiontime += 30; + *stepno = 0; + } + else + { + if (c == '\r') + *next_actiontime += 0.2; + if (mine->bold_p) + c |= 0xC0; + a2_printc_noscroll(st, c); + } + } + break; + + case A2CONTROLLER_FREE: + return; + } +} + + +static int +a2_encom_draw (struct bsod_state *bst) +{ + apple2_sim_t *sim = (apple2_sim_t *) bst->closure; + if (! sim) { + sim = apple2_start (bst->dpy, bst->window, 9999999, + a2controller_encom); + bst->closure = sim; + } + + if (! apple2_one_frame (sim)) { + bst->closure = 0; + } + + return 10000; +} + +static struct bsod_state * +encom (Display *dpy, Window window) +{ + struct bsod_state *bst = make_bsod_state (dpy, window, "encom", "Encom"); + bst->draw_cb = a2_encom_draw; + bst->free_cb = a2_free; + return bst; +} + + /* A crash spotted on a cash machine circa 2006, by jwz. I didn't note what model it was; probably a Tranax Mini-Bank 1000 or similar vintage. */ @@ -5080,6 +5603,56 @@ atm (Display *dpy, Window window) } +static struct bsod_state * +dvd (Display *dpy, Window window) +{ + struct bsod_state *bst = make_bsod_state (dpy, window, "dvd", "DVD"); + int pix_w, pix_h; + float scale = 0.15; + Pixmap mask = 0; + Pixmap pixmap = image_data_to_pixmap (dpy, window, + dvd_png, sizeof(dvd_png), + &pix_w, &pix_h, &mask); + int i = 0; + int x, y, dx, dy; + int steps = 10000; + + XClearWindow (dpy, window); + + while (pix_w <= bst->xgwa.width * scale && + pix_h <= bst->xgwa.height * scale) + { + pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, + pixmap, pix_w, pix_h); + mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h); + pix_w *= 2; + pix_h *= 2; + i++; + } + + bst->pixmap = pixmap; + bst->mask = mask; + x = random() % (bst->xgwa.width - pix_w); + y = random() % (bst->xgwa.height - pix_h); + dx = random() & 1 ? 1 : -1; + dy = random() & 1 ? 1 : -1; + + BSOD_INVERT(bst); + for (i = 0; i < steps; i++) + { + BSOD_RECT (bst, True, x, y, pix_w, pix_h); + if (x + dx < 0 || x + dx + pix_w > bst->xgwa.width) dx = -dx; + if (y + dy < 0 || y + dy + pix_h > bst->xgwa.height) dy = -dy; + x += dx; + y += dy; + BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y); + BSOD_PAUSE (bst, 1000000 / 30.0); + } + + return bst; +} + + /* An Android phone boot loader, by jwz. */ static struct bsod_state * @@ -5355,6 +5928,8 @@ static const struct { { "GLaDOS", glados }, { "Android", android }, { "VMware", vmware }, + { "Encom", encom }, + { "DVD", dvd }, }; @@ -5385,6 +5960,7 @@ hack_title (struct driver_state *dst) XStoreName (dst->bst->dpy, dst->bst->window, nname); free (nname); } + if (oname) free (oname); # endif /* !HAVE_JWXYZ */ } @@ -5673,6 +6249,8 @@ static const char *bsod_defaults [] = { "*doGLaDOS: True", "*doAndroid: True", "*doVMware: True", + "*doEncom: True", + "*doDVD: True", ".foreground: White", ".background: Black", @@ -6000,6 +6578,10 @@ static const XrmOptionDescRec bsod_options [] = { { "-no-android", ".doAndroid", XrmoptionNoArg, "False" }, { "-vmware", ".doVMware", XrmoptionNoArg, "True" }, { "-no-vmware", ".doVMware", XrmoptionNoArg, "False" }, + { "-encom", ".doEncom", XrmoptionNoArg, "True" }, + { "-no-encom", ".doEncom", XrmoptionNoArg, "False" }, + { "-dvd", ".doDVD", XrmoptionNoArg, "True" }, + { "-no-dvd", ".doDVD", XrmoptionNoArg, "False" }, ANALOGTV_OPTIONS { 0, 0, 0, 0 } }; -- cgit v1.2.3-55-g7522