[comp.sources.misc] Printer Art and a Tool

dmt@mtunb.ATT.COM (Dave Tutelman) (11/09/87)

[Part 2 of this will be in comp.binaries.ibm.pc.  After I manage to convince
the rest of the net that converting comp.binaries.ibm.pc was not a mistake
made by my inews, that is.  ++bsa]

A week or so ago, there were a few requests on the net for samples of
"printer art".  That reminded me of one of my first PC hacks, an editor
to generate printer art.  Here's the source, and a number of examples
of the printer art it can easily generate.

The first file in the shell archive is a README file for more information
on what the program does.  You can read it without unSHARing the file.

The program is in Turbo Pascal 1.0 (circa January 1974) and runs on PCs with
a CGA or compatible display (I use it on an AT&T PC 6300).  For those
who don't have Turbo Pascal 1.0 (:->),  I'm also posting the
arc-ed, uuencoded, .COM file in part 2 of this posting.

+---------------------------------------------------------------+
|    Dave Tutelman						|
|    Physical - AT&T  -  Lincroft, NJ				|
|    Logical -  ...ihnp4!mtuxo!mtunb!dmt			|
|    Audible -  (201) 576 2442					|
+---------------------------------------------------------------+

-----------------  cut here  ----------------------------
: This is a shar archive.  Extract with sh, not csh.
: The rest of this file will extract:
: readme paint.pas pixel.pas ptfancy.pas ptfile.pas ptutils.pas afghan.pic apple.pic logo.pic shoe.pic valentin.pic afghan.lst apple.lst logo.lst shoe.lst valentin.lst
echo extracting - readme
sed 's/^X//' > readme << '!EOR!'
X				PAINT
X
X		A Printer-Art Editor for the PC
X
X			by Dave Tutelman
X
X
XThis program, written in Turbo Pascal Version 1.0 (yup, real old),
Xis a screen-based editor for generating "printer art" on a line printer.
XYou use the program to generate or edit an on-screen, shaded-pixel
Xrepresentation of a printer page (80 x 66).  You can then send a text
Xversion to the printer, or to a .LST file for later printing.  The text
Xversion substitutes printable ASCII characters (of greater or lesser
Xdensity) for the shaded pixels.
X
XIncluded in this distribution is:
X	README		This file.
X	PAINT.PAS	The main Pascal file.
X	PIXEL.PAS	"Included" file of Pascal graphics routines.
X	PTUTILS.PAS	"Included" Pascal file.
X	PTFILE.PAS	ditto
X	PTFANCY.PAS	ditto
X	*.PIC		A number of encoded (source) pictures for PAINT.
X	*.LST		Printer-ready pictures for PAINT.
X
XThe program can be used either from the Turbo Pascal integrated environment
Xor from the command line (as a .COM file).
X
X
XINSTRUCTIONS
X
XThe PAINT screen consists of a "page area" of 66 x 80 "shaded pixels",
Xand a "command menu area".
X
XTo use the PAGE AREA:
X   -	The fast-blinking cursor is a "brush", one print-position in size.
X   -	The brush can be moved in EIGHT directions, not just 4.  The
X	cursor keys control horizontal and vertical movement; the other
X	keys on the cursor keypad control diagonal movement.  (E.g. -
X	the "Home" key moves the cursor up/left one position.)
X   -	The brush can take one of 6 values:
X		0	Neutral, or no-change.
X		1	Blank.
X		2	Light.
X		3	Medium.
X		4	Darker.
X		5	Darkest.
X	You can set the brush value by pressing a numeric key 0-5.
X   -	As the brush is moved around in the page area, it paints its value
X	on each print position it visits.  (If its value is zero, the
X	brush leaves print positions unchanged.)
X   -	Use the above instructions to paint a picture in the page area.
X	(You can also use some fancier constructs from the command menu,
X	like "mirror" and "fill".)
X
XTo use the COMMAND MENU:
X   -	A command is selected by pressing the key corresponding to the
X	capitalized letter in the menu.
X   -	You are prompted for a confirmation and/or further information.
X   -	In the "Fill" command, "darker" refers to the shade on the PRINT,
X	not on the SCREEN.
X   -	In the "Print" command, the default is to scroll the ASCII-text
X	picture to the PC screen (CON:).  You can also send it to a file
X	of arbitrary name, or to the printer (PRN:).
X   -	The "Save" and "Load" commands deal with a "live" (editable)
X	version of the picture, not a print-ready version.  However, it
X	too is legal ASCII text, not a [more efficient] binary
X	representation.
X
XI encourage you to play with the features for a few minutes before using
Xthem on a "real" picture.
X
X					Dave Tutelman
X					November 2, 1987
!EOR!
echo extracting - paint.pas
sed 's/^X//' > paint.pas << '!EOR!'
X{  paint a screen of "cells" of shades.
X   The cells correspond to print positions, so the screen
X   can be printed on a line printer (Low-res graphics)
X}
X
X{$V-}    (* Allow small strings to be passed to procedures *)
X
Xconst  RIGHT = 75;     (* "effective" right edge of screen, 80 for good mon *)
X       WinWidth = 20;
X       WinHite = 19;   (* height of menu window *)
X       MAXBRUSH = 15;
Xtype   MenuItem = string [WinWidth];
X       prompt = array [1..5] of MenuItem;
X       filename = string [14];
X       WinID = 1..2;
X       PagArr = array [0..80, 0..70] of byte;
X       palette = string [MAXBRUSH];
Xconst  OldXlate : palette = ' .oXM';
X                       (* translate from brush code to old character *)
X       PXlate : palette = ' .:XM    |-+\/X';  (* print translation *)
X       SXlate : palette = '123456789|-+\/X';  (* SFile translation *)
X       FilMsg1 : prompt = ('fill to','Darker or Lighter','edge?','','');
Xvar    line,page : integer;   (* columns & rows on print page *)
X       xcell,ycell: integer;  (* # of pixels in a cell *)
X       brush : integer;       (* code for painting a cell *)
X                              (*  0 - no permanent effect
X                                  1-5 progressively heavier tones
X                                  6-9 currently unassigned
X                                  10-15 = | - + \ / X
X                              *)
X       FillFlag : integer;    (* used to indicate the nature of the fill *)
X       ErrMsg : MenuItem;
X       fname, pname : filename;   (* file name & print device name *)
X       x,y : integer;         (* col,row position of cursor *)
X       bkgnd, inchar : char;
X       screen : PagArr;       (* array of brush values *)
X       linecount : array [1..2] of integer;
X                              (* line counters for windows *)
X
Xprocedure blink; forward;
X
X
X{$I pixel.pas }
X{$i ptutils.pas }
X{$I ptfile.pas }
X
X
X
Xprocedure blink;   {  blinks the cursor until key is pressed  }
X    var   curs : integer;
X    begin
X        ResetWin (2);
X        window (2, ErrMsg); (* print the most recent error message *)
X        curs := 5;
X        while not KeyPressed do   (* blink until next keystroke *)
X        begin
X            if curs=5 then curs:=1  else curs:=5;
X            dab (x,y, curs);
X            delay (60);
X        end;
X        ErrMsg := '                    ';
X    end;
X
X{$I ptfancy.pas }
X
Xprocedure MenuDisp;  { displays the menu of commands }
X    var    line : integer;
X    begin
X        linecount[1]:=4;   (* start menu on fourth line *)
X        window (1, 'COMMANDS');
X        window (1, ' ');
X        window (1, 'Quit');
X        window (1, 'Save');
X        window (1, 'Load');
X        window (1, 'Print');
X        window (1, 'Mirror');
X        window (1, 'Fill');
X        window (1, 'Restore screen');
X    end;
X
Xprocedure RestorScr;
X    var    i,j : integer;
X    begin
X        HiRes;
X        if bkgnd='W' then wpage (xcell*line, ycell*page)
X        else            boxpage (xcell*line, ycell*page);
X        MenuDisp;
X        brush:=0;       (* start with dry brush *)
X
X        for j:=0 to (page-1) do
X            for i:=0 to (line-1) do
X                if screen [i,j]>1 then dab (i,j, screen [i,j]);
X    end;
X
Xbegin
X{ initialize parameters for the program }
X    line:=79;
X    page:=66;
X    brush:=0;
X    bkgnd:='B';
X    ErrMsg:='                    ';
X    linecount[2] := WinHite + 1;
X    fname:='';  pname:='CON:';
X
X    xcell:=4; ycell:=3;
X    for x:=0 to line do for y:=0 to page do  screen [x,y] := 1;
X    x:=line div 2;  (* start in the middle of page *)
X    y:=page div 2;
X
X    RestorScr;
X
X{ MAIN WORKING LOOP }
X    repeat
X        blink;
X        read (kbd, inchar);
X        case  inchar of
X        ^[:  begin   (* ESC is cursor control *)
X             if brush>0 then  screen[x,y] := brush;
X             dab (x,y, screen[x,y]);   (* paint cell before leaving *)
X             read (kbd, inchar);
X             case inchar of
X             'G':  (* up & left *)
X                  if (x-1>=0) and (y-1>=0) then
X                  begin  x := x-1;  y := y-1; end;
X             'H':  (* up *)
X                  if y-1>=0 then
X                  y := y-1;
X             'I':  (* up & right *)
X                  if (x+1<line) and (y-1>=0) then
X                  begin  x := x+1;  y := y-1;  end;
X             'M':  (* right *)
X                  if x+1<line then
X                  x := x+1;
X             'Q':  (* down & right *)
X                  if (x+1<line) and (y+1<page) then
X                  begin  x := x+1;  y := y+1;  end;
X             'P':  (* down *)
X                  if y+1<page then
X                  y := y+1;
X             'O':  (* down & left *)
X                  if (x-1>=0) and (y+1<page) then
X                  begin  x := x-1;  y := y+1;  end;
X             'K':  (* left *)
X                  if x-1>=0 then
X                  x := x-1;
X             end;
X                inchar := ' ';   (* kill for Quit check *)
X                if brush>0 then  screen[x,y] := brush;
X             end;
X
X        '0':         (* turn off the brush *)
X             brush := 0;
X
X        '1'..'9','|','-','+','\','/','X':  (* change the brush *)
X             begin
X                 brush := pos (inchar, SXlate);
X                 screen [x,y] := brush;
X             end;
X
X         'l','L':   (* load a file from disk *)
X             if verify ('LOAD?') then
X             begin
X                 load (fname, screen, SXlate);
X                 RestorScr;
X             end;
X
X         's','S':   (* save in a file *)
X             if verify ('SAVE?') then
X             begin
X                 fname := getname(fname, 0);
X                 save (fname, screen, SXlate);
X             end;
X
X         'p','P':   (* print on the line printer *)
X             if verify ('PRINT?') then
X             begin
X                 pname := getname(pname, 0);
X                 save (pname, screen, PXlate);
X                 if pname='CON:' then  RestorScr;
X             end;
X
X         'r','R':   (* restore a corrupted screen image *)
X             RestorScr;
X
X         'm','M':   (* mirror the screen about an axis *)
X             if verify ('MIRROR?') then
X             begin
X                 mirror;
X             end;
X
X         'f','F':   (* fill an area *)
X             if verify ('FILL?') then
X             begin
X                 ClrWin (2);
X                 window (2, 'BRUSH value is');
X                 window (2, SXlate [brush] );
X                 window (2, 'OK?  (Y/N)');
X                 read (kbd, inchar);
X                 if (inchar='y') or (inchar='Y') then
X                 begin
X                     inchar := getchar (FilMsg1);
X
X                     case inchar of
X                      'd','D': FillFlag := 4;
X                      'l','L': FillFlag := 3;
X                      else  FillFlag := 5;  (* assure that fill never starts *)
X                     end;
X
X                     if FillFlag<5 then  fill (x,y);
X                 end;
X                 ClrWin (2);
X             end;
X
X       { ADD NEW COMMANDS HERE }
X
X         'q','Q':   (* looks like QUIT, but let's check *)
X             if not (verify ('QUIT???')) then inchar := ' ';
X
X         else  ErrMsg:= concat(inchar,': NO SUCH COMMAND');
X         end;
X
X    until (inchar='Q') or (inchar='q');
X
X    Alfa;
!EOR!
echo extracting - pixel.pas
sed 's/^X//' > pixel.pas << '!EOR!'
X{  PIXEL is a set of low-level graphic primitives. }
X
Xprocedure HiRes;    { enter HiRes graphics mode }
X    begin
X        inline (       (* uses interupt 10H in BIOS *)
X            $B8/$06/$00/   (* MOV  AX,6H   ;load fn # in A  *)
X            $CD/$10        (* INT  10H                      *)
X         );
X    end;
X
Xprocedure Alfa;    { enter 80x25 alpha mode }
X    begin
X        inline (       (* uses interupt 10H in BIOS *)
X            $B8/$02/$00/   (* MOV  AX,2H   ;load fn # in A  *)
X            $CD/$10        (* INT  10H                      *)
X         );
X    end;
X
Xprocedure pixel ( x,y,val : integer );
X                    { draw a pixel at <x,y>. If val=0,
X                      then erase the pixel instead.    }
X    type  mask = array [0..7] of byte;
X    const MASK1: mask =($80,$40,$20,$10,$08,$04,$02,$01);
X          MASK0: mask =($7F,$BF,$DF,$EF,$F7,$FB,$FD,$FE);
X          PIXBASE = $B800;
X    var   odd, bytA : integer;
X          point : ^byte;
X
X    begin
X        { First compute a pointer to the byte containing pixel }
X        odd := y mod 2;    (* odd or even scan line? *)
X        bytA:= y div 2 * 80  +  x div 8  +  8192*odd;
X        point := ptr ( PIXBASE, bytA );
X
X        { Now write the pixel into the byte  }
X        if  val=0  then point^ := point^ and MASK0 [x mod 8]
X        else            point^ := point^ or  MASK1 [x mod 8];
X    end;
!EOR!
echo extracting - ptfancy.pas
sed 's/^X//' > ptfancy.pas << '!EOR!'
X{ Routines to do fancy editing, like Mirror and Fill }
X
Xprocedure mirror;
X
X    const  msg1 : prompt = ('cursor on','mirror axis?','  (Y/N)','','');
X           msg2 : prompt = ('keep','Top?  Bottom?','Right?  Left?','','');
X    var    inchar, keep, H_or_V : char;
X           offset, i, j, size : integer;
X
X    begin
X        inchar := getchar (msg1);  (* cursor check *)
X        if not((inchar='y') or (inchar='Y')) then
X                (* didn't set up properly. ABORT! *)
X        begin
X            ClrWin (2);
X            window (2, 'Aborting mirror');
X        end
X        else
X        begin
X
X            keep := getchar (msg2);  (* orientation of mirror *)
X
X            offset:=0;  (* 1 only for even symmetry, not implemented *)
X
X            case keep of  (* MAIN WORKING CODE *)
X
X            'L','l':   (* keep the left part *)
X                begin
X                    if x < line-x then  size := x
X                                  else  size := line-x;
X                    for j:=0 to page do
X                        for i:= 0 to size do
X                        begin
X                            screen [x+offset+i, j] := screen [x-i, j];
X                            dab (x+offset+i, j, screen [x+offset+i, j]);
X                        end;
X                end;
X
X            'R','r':   (* keep the right part *)
X                begin
X                    if x < line-x then  size := x
X                                  else  size := line-x;
X                    for j:=0 to page do
X                        for i:= 0 to size do
X                        begin
X                            screen [x-i, j] := screen [x+offset+i, j];
X                            dab (x-i, j, screen [x-i,j]);
X                        end;
X                end;
X
X
X            'T','t':   (* keep the top part *)
X                begin
X                    if y < page-y then  size := y
X                                  else  size := page-y;
X                    for i:=0 to line do
X                        for j:= 0 to size do
X                        begin
X                            screen [i, y+offset+j] := screen [i, y-j];
X                            dab (i, y+offset+j, screen [i, y+offset+j]);
X                        end;
X                end;
X
X            'B','b':   (* keep the bottom part *)
X                begin
X                    if y < page-y then  size := y
X                                  else  size := page-y;
X                    for i:=0 to line do
X                        for j:= 0 to size do
X                        begin
X                            screen [i, y-j] := screen [i, y+offset+j];
X                            dab (i, y-j, screen [i, y-j]);
X                        end;
X                end;
X
X            else
X                begin
X                    ClrWin (2);
X                    window (2, 'Illegal option.');
X                    window (2, 'Mirror aborted.');
X                end;
X            end;
X        end;
X    end;
X
X
Xfunction check (x,y, n : integer) : boolean;
X  {  this function is used by "fill" to test whether a cell is a candidate
X     for the next step.  N identifies whether the test is for:
X     0 - don't test for cell contents, just <x,y> in bounds.
X     1 - test for exact match.
X     2 - test for all but exact match.
X     3 - test for screen > brush.
X     4 - test for screen < brush.
X  }
X    begin
X      check := FALSE;
X      if (x >= 0) and (x < line) and (y >= 0) and (y < page) then
X          case n of
X          0:  check := TRUE;
X          1:  if screen [x,y] = brush then check := TRUE;
X          2:  if not (screen [x,y] = brush) then check := TRUE;
X          3:  if screen [x,y] > brush then check := TRUE;
X          4:  if screen [x,y] < brush then check := TRUE;
X          end;
X    end;
X
X
Xprocedure fill (x,y : integer);
X  { fills an area including the point <x,y>, up to a boundary of cells
X      >= brush if FillFlag = 3
X      <= brush if FillFlag = 4
X  }
X    begin
X        screen [x,y] := brush;
X        dab (x,y, brush);   (* this way, we watch it work *)
X                            (* For speed, drop this line, & RestorScr *)
X        if check (x+1,y, FillFlag)  then  fill (x+1,y);
X        if check (x,y+1, FillFlag)  then  fill (x,y+1);
X        if check (x-1,y, FillFlag)  then  fill (x-1,y);
X        if check (x,y-1, FillFlag)  then  fill (x,y-1);
!EOR!
echo extracting - ptfile.pas
sed 's/^X//' > ptfile.pas << '!EOR!'
X{  This is a set of file-handling utilities,
X  designed for PAINT, but perhaps with wider applicability  }
X
Xfunction getname ( oldname : filename; code : integer ) : filename;
X  {  Queries for a file name, announcing "oldname" as default.
X     If code > 0, file must already exist.
X     Returns the file name. }
X
X    var    newname : filename;
X           inchar : char;
X           fprom : prompt;
X           filemsg : string [20];
X           fname : text;
X    begin
X        inchar:=' ';
X        newname:=oldname;
X        repeat
X            ClrWin (2);
X            window (2,'Current File Name');
X            window (2,newname);
X            window (2,'NAME OF FILE?');
X            GoToXY (RIGHT-WinWidth, linecount [2]);
X            ReadLn (newname);
X            if newname='' then  newname:=oldname;
X            Assign (fname, newname);
X
X            {$I-}  reset (fname)  {$I+} ;
X            if  IOresult=0 then
X            begin
X                filemsg := 'File exists. OK?';
X                close (fname);
X            end
X            else begin
X                if code=0 then filemsg:= 'New file. OK?'
X                else           filemsg:= 'No such file.'
X            end;
X
X            inchar := ' ';
X                ClrWin (2);
X                window (2,newname);
X                window (2,filemsg);
X            if not (filemsg='No such file.') then
X            begin
X                window (2,'(Y/N)');
X                GoToXY (RIGHT-WinWidth+6, linecount [2]-1);
X                read (kbd, inchar);
X            end
X            else Delay (3000);
X
X        until (inchar='y') or (inchar='Y');
X
X        ClrWin (2);
X        getname := newname;
X    end;
X
Xprocedure load (var oldname : filename; var screen : PagArr; xlate : palette);
X    const  abortmsg : prompt = ('NO SUCH FILE','ABORTING LOAD','','','');
X    var    i,j, last : integer;
X           pline : string [132];
X           pfile : text;
X           newname : filename;
X    begin
X        ClrWin (2);
X        window (2,'Current File Name');
X        window (2,oldname);
X        window (2,'NAME OF FILE?');
X        GoToXY (RIGHT-WinWidth, linecount [2]);
X        ReadLn (newname);
X        if newname='' then  newname:=oldname;
X
X        assign (pfile, newname);
X        {$I-}  reset (pfile)  {$I+} ;
X        if  not (IOresult=0) then   (* no such file *)
X            flash (abortmsg)
X        else begin       (* load line-by-line from pfile *)
X            (* start by clearing old screen *)
X            for j:=0 to page do  for i:=0 to line do  screen [i,j] := 1;
X
X            i:=0;      (* line counter *)
X            while not EOF (pfile) do
X            begin
X                readln (pfile, pline);
X                last := length (pline) -1;
X
X                (* construct a line of the screen *)
X                for j:=0 to last do
X                    screen [j,i] := pos (pline [j+1], xlate);
X                              (* use "xlate" to get numeric brush values *)
X                if last < line-1 then    (* fill rest of line with blanks *)
X                    for j:=last+1 to line-1 do   screen [j,i] := 1;
X
X               i := i + 1;
X            end;
X
X            close (pfile);
X            oldname := newname;
X        end;
X    end;
X
X
Xprocedure save (fname : filename; screen : PagArr; xlate : palette);
X    var    i,j, last : integer;
X           pline : string [132];
X           pfile : text;
X           reassure : prompt;
X    begin
X        if fname='CON:' then
X            begin   Alfa; ClrScr;   end;
X        assign (pfile, fname);
X        rewrite (pfile);
X        for i:=0 to page-1 do    (* for each line in turn *)
X        begin
X            (* find last non-blank on line *)
X            last := line-1;
X            while (screen [last,i] < 2) and (last >= 0) do
X                last := last - 1;
X
X            (* construct a print line *)
X            pline := '';
X            if last >=0 then
X              for j:=0 to last do
X                pline := concat (pline, xlate [screen [j,i]]);
X
X            if (fname='CON:') and (line=80)
X                then   write   (pfile, pline)   (* CR takes the 81st col *)
X                else   writeln (pfile, pline);
X        end;
X        close (pfile);
X        if fname='CON:' then repeat until KeyPressed
X            else if not (fname='LST:') then
X            begin
X                reassure [1] := fname;
X                reassure [2] := 'FILE SAVED.';
X                reassure [3] := ''; reassure [4] := ''; reassure [5] := '';
X                flash (reassure);
X            end;
X    end;
!EOR!
echo extracting - ptutils.pas
sed 's/^X//' > ptutils.pas << '!EOR!'
X{ this is a set of utilities (procedures) used by PAINT.
X    Window (num, MenuItem)
X    ResetWin (num)
X    ClrWin (num)
X    flash (prompt)
X    getchar (prompt) --> char
X    verify (MenuItem) --> boolean
X
X    dab (x,y, brush)
X    wpage (width, height)
X    boxpage (width, height)
X}
X
Xprocedure window ( num : WinID; message : MenuItem);
X    { write a message on the next line of the indicated window }
X    begin
X        GoToXY (RIGHT-WinWidth, linecount [num]);
X        write (message);
X        linecount [num] := linecount[num] +1;
X    end;
X
Xprocedure ResetWin (num : WinID);
X    begin
X        if num=1 then linecount [1] := 1
X            else      linecount [2] := WinHite + 1;
X    end;
X
Xprocedure ClrWin (num : WinID);
X    var    x,y, ymin,ymax : integer;
X    begin
X        if num=1 then begin  ymin:=1; ymax:=WinHite;  end
X           else   begin  ymin:=WinHite+1; ymax:=25;  end;
X        for y:=ymin to ymax do
X        begin
X            GoToXY (RIGHT-WinWidth, y);
X            for x:=1 to WinWidth do  write (' ');
X        end;
X        linecount [2] := WinHite + 1;
X    end;
X
Xprocedure flash (msg : prompt);
X  { show a 5-line message in window 2 for  3 seconds }
X    var    i : integer;
X    begin
X        ClrWin (2);
X        for i:=1 to 5 do
X            window (2, msg [i]);
X        delay (3000);
X        ClrWin (2);
X    end;
X
Xfunction getchar (msg : prompt) : char;
X  { puts a 5-line prompt on the screen, then waits for keystroke }
X  { returns the result of the keystroke  }
X    var    i : integer;
X           inchar : char;
X    begin
X        ClrWin (2);
X        ErrMsg := msg [1];  (* will be displayed by "blink" *)
X        window (2, '');
X        for i:=2 to 5 do
X            window (2, msg [i]);
X        blink;
X        read (kbd, inchar);
X        getchar := inchar;
X    end;
X
Xfunction verify (msg : MenuItem) : boolean;
X    var    inchar : char;
X    begin
X        ClrWin (2);
X        window (2, msg);
X        window (2, '  (Y/N)');
X        read (kbd, inchar);
X        if (inchar='y') or (inchar='Y') then verify := TRUE
X                                        else verify := FALSE;
X        ClrWin (2);
X    end;
X
X
Xprocedure dab (x,y,brush : integer);
X    type   brushes = array [0..MAXBRUSH, 0..2] of byte;
X           mask  =  array [0..1] of byte;
X    const  b_palette : brushes = ((0,0,0),     (* brush = 0  *)
X                                (0,0,0),     (*   "   " 1  *)
X                                (8,0,2),     (*         2  *)
X                                (10,5,10),   (*         3  *)
X                                (7,11,13),   (*         4  *)
X                                (15,15,15),  (*         5  *)
X                                (0,0,0),     (*         6  *)
X                                (0,0,0),     (*         7  *)
X                                (0,0,0),     (*         8  *)
X                                (0,0,0),     (*         9  *)
X                                (2,2,2),     (*  10 = |    *)
X                                (0,15,0),    (*  11 = -    *)
X                                (2,15,2),    (*  12 = +    *)
X                                (8,6,1),     (*  13 = \    *)
X                                (1,6,8),     (*  14 = /    *)
X                                (9,6,9));     (*  15 = X    *)
X           half : mask = ($F0, $0F);
X           shifter : mask = (16,1);
X           PIXBASE = $B800;
X    var    xodd, yodd, bytA : integer;
X           xmap, ymap : integer;
X           j : integer;
X           point : ^byte;
X    begin
X        ymap := y*ycell;   (* ymap = row of raster *)
X        xmap := x div 2;   (* xmap = byte in x-raster *)
X        xodd := x mod 2;   (* left or right half of byte *)
X        for j:=0 to 2 do
X        begin
X            (* get a pointer to the byte to be modified *)
X            yodd := ymap mod 2;
X            bytA := ymap div 2 * 80  +  yodd * 8192  +  xmap;
X            point := ptr (PIXBASE, bytA);
X
X            (* now write the palette entry into the half-byte *)
X            point^ := (point^ and half [1-xodd]) or
X                        (b_palette [brush, j] * shifter [xodd]);
X            ymap := ymap + 1;    (* bump the line counter *)
X        end;
X    end;
X
Xprocedure wpage (width, hite : integer);
X    { wpage whites out the page for background color }
X    const  PIXBASE = $B800;
X    var    x,y : integer;
X           bytA : ^byte;
X    begin
X        for x:=0 to (width div 8) do
X            for y:=0 to (hite div 2) do
X            begin
X                bytA:=ptr(PIXBASE, y*80 + x);
X                bytA^:=255;
X                bytA:=ptr(PIXBASE, $2000 + y*80 +x);
X                bytA^:=255;
X            end;
X    end;
X
Xprocedure boxpage (width, hite : integer);
X    { boxpage takes a black-bkgnd page and outlines it }
X    var    x,y : integer;
X    begin
X        for x:=0 to (width-1) do
X        begin
X            pixel (x, 0, 1);
X            pixel (x, hite-1, 1);
X        end;
X        for y:=0 to (hite-1) do
X        begin
X            pixel (0, y, 1);
X            pixel (width-1, y, 1);
X        end;
X    end;
X
!EOR!
echo extracting - afghan.pic
sed 's/^X//' > afghan.pic << '!EOR!'
X3344455555444333322221111122223333444555554443333222211111222233334445555544433
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X5443322122334455115554444455511554433221223344551155544444555115544332212233445
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
X3344455555444333322221111122223333444555554443333222211111222233334445555544433
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X5443322122334455115554444455511554433221223344551155544444555115544332212233445
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
X3344455555444333322221111122223333444555554443333222211111222233334445555544433
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X5443322122334455115554444455511554433221223344551155544444555115544332212233445
X5544332223344551155544434445551155443322233445511555444344455511554433222334455
X155443323344551155544433344455511554433233445511555444333444555115544332334455
X11554433344551155544433333444555115544333445511555444333334445551155443334455
X5115544344551155544433333334445551155443445511555444333333344455511554434455115
X5511554445511555444333323333444555115544455115554443333233334445551155444551155
X5551155455115554443333222333344455511554551155544433332223333444555115545511555
X4555115551155544433332222233334445551155511555444333322222333344455511555115554
X4455511511555444333322222223333444555115115554443333222222233334445551151155544
X4445551115554443333222212222333344455511155544433332222122223333444555111555444
X3444555155544433332222111222233334445551555444333322221112222333344455515554443
!EOR!
echo extracting - apple.pic
sed 's/^X//' > apple.pic << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X1111111111111111111111111111111111111111155
X111111111111111111111111111111111111111155
X11111111111111111111111111111111111111155
X1111111111111111111111111111111111111155
X1111111111111111111111111111111111111155
X1111111111111111111111111111111111111155
X1111111111111111111111111115555555555155115555555555
X111111111111111111111155555555555555555555555555555555555
X11111111111111111111555555555544444455555554444445555555555
X1111111111111111115555554444444444444444444444444444444555555
X11111111111111111555554444433333334444444444433333334444455555
X111111111111111155555444433333333333333333333333333333444455555
X1111111111111115555544443333333111333333333333333333333444455555
X1111111111111115555544433333311111111333333333333333333344455555
X11111111111111555554444333311111111133333333333333333333444455555
X11111111111111555544443333331111111333333333333333333333344445555
X11111111111111555544443333333331333333333333333333333333344445555
X11111111111111555544443333333333333333333333333333333333344445555
X11111111111111555554444333333333333333333333333333333333444455555
X1111111111111115555544443333333333333333333333333333333444455555
X1111111111111115555554444433333333333333333333333333344444555555
X1111111111111115555554444444333333333333333333333334444444555555
X111111111111111155555544444444444333333333333344444444444555555
X111111111111111155555554444444444444433333444444444444445555555
X11111111111111111555555544444444444444444444444444444445555555
X1111111111111111115555555555554444444444444444444555555555555
X111111111111111111155555555555555554444444445555555555555555
X1111111111111111111115555555555555555555555555555555555555
X1111111111111111111111115555555555555555555555555555555
X1111111111111111111111111115555511155555555511155555
X
X
X
X1111111111111111111111111141114
X111111111111111111111111111414
X11111111111111111111111113314
X1111111111111111111111133444
X1111111111111111111113344
X11111111111111111111344
X111111111111111111134
X11111111111111111134
X11111111111111111133
X1111111111111111133
X1111111111111111133
X1111111111111111133
X1111111111111111143111111111111113333
X11111111111111111143111111111133351153333
X11111111111111111114333111133351111111115333
X111111111111111111114443333511111111111111153
X1111111111111111111111111111111111111111111153
X1111111111111111111111111111111111111111111135
X111111111111111111111111111111111111111113335
X
X
!EOR!
echo extracting - logo.pic
sed 's/^X//' > logo.pic << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X111111111111111111111111111111111155555555555
X
X111111111111111111111111155551111111555555555555555555
X111111111111111111111155555555555555555555555555555555555
X
X1111111111111111115551111111111111111111555555555555555555555
X111111111111111155555555555555555555555555555555555555555555555
X
X11111111111111551111111111111111111111111111115555555555555555555
X111111111111155555555555555555555555555555555555555555555555555555
X
X1111111111115511111111111111111111111111111111155555555555555555555
X1111111111115555555555555555555555555555555555555555555555555555555
X
X11111111111555111111111111111111111111111111111555555555555555555555
X11111111111555555555555555555555555555555555555555555555555555555555
X
X11111111111555555511111111111111111111111115555555555555555555555555
X11111111111555555555555555555555555555555555555555555555555555555555
X
X1111111111115555555555555111111111115555555555555555555555555555555
X1111111111115555555555555555555555555555555555555555555555555555555
X
X111111111111155555555555555555555555555555555555555555555555555555
X11111111111111555555555555555555555555555555555555555555555555555
X
X111111111111111155555555555555555555555555555555555555555555555
X1111111111111111115555555555555555555555555555555555555555555
X
X111111111111111111111155555555555555555555555555555555555
X111111111111111111111111155555555555555555555555555555
X
X111111111111111111111111111111111155555555555
X
X
X
X2222222222222225555522222255555555555555222222222222225555555555555552222222222
X2222222222222225555522222222222255222222222222222222222222225522222222222222222
X2222222222222255515552222222222255222222225555552222222222225522222222222222222
X2222222222222255122552222222222255222222555522555522222222225522222222222222222
X2222222222222555222555222222222255222225555222222222222222225522222222222222222
X2222222222222552222255222222222255222222255552222222222222225522222222222222222
X2222222222225555555555522222222255222225555555525555222222225522222222222222222
X2222222222225522222225522222222255222255522225555222222222225522222222222222222
X2222222222255522222225552222222255222255222255255552222222225522222222222222222
X2222222222255222222222552222222255222225555552222555522222225522222222222222222
X
X
X
X
X
!EOR!
echo extracting - shoe.pic
sed 's/^X//' > shoe.pic << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X111111111111111111111111111111111111144111111111111111111111111444
X111111111111111111111111111111111144433444444111111111111444444444
X1111111111111111111111111111114444113333333334444444444444444333344
X1111111111111111111111111144441333111333333333333333333333333333344
X11111111111111111111444444333111333111333333333333333333333333334444
X11111111111114444444333311133311133311133333333333333333333334444444
X11111114444443333333333331113331113331113333333333333333344444444444
X11111144444443333333333333111333111333111333333333333334444444444444
X1111144444444444333333333331113331113331113333333333334444444444444
X111114444444444443333333333311133311133311133333333334444444444444
X1111114444444444443333333333311133311133311135555555555555555555555
X1111111555555555555555555555555555555555555555555555555555555555555
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
!EOR!
echo extracting - valentin.pic
sed 's/^X//' > valentin.pic << '!EOR!'
X
X
X
X
X
X
X
X11111111111111|
X11111111111111||
X1111111111--\1\||
X11111111111--\1\||
X111111111111--\1\||
X1111111111111--\1\|
X11111111111111--\1\
X11111111111111111\1\
X111111111111111111\1\
X1111111111111111111\1\
X1111111111111111115555555551111111111111111111111111555555555
X11111111111111555555555555555555111111111111111555555555555555555
X11111111111555555544444444445555555111111111555555544444444445555555
X11111111555555444444444444444445555551111155555544444433333444444555555
X111111155555444444443333333344444455551115555444444333333333334444455555
X1111115555444444433333333333333344445551555444433333333333333333344445555
X11111555544444433333333333333333333444555444333333333332222233333334445555
X11111555444443333333333333333333333334444433333333322222222222333333444555
X111155544444333333333332222222333333333433333333222222111122222233334444555
X111155544443333333332222222222222233333333333222222211111111122223333444555
X111155544443333333322222222222222222233333222222211111111111112223333444555
X111155544443333333222222222222222222222322222222222211111111122223333444555
X111155544443333333222222222222222222222222222222222222111111122223333444555
X111155544443333333222222222222222222222222222222222222221111222223333444555
X111155544444333333222222222222222222222222222222222222222122222233334444555
X111155554444333333322222222222222222222222222222222222222222222233334445555
X11111555444433333333222222222222222222222222222222222222222222223333444555
X11111555544443333333322222222222222222222222222222222222222222233334445555
X1111115554444333333333322222222222222222222222222222222222222233333444555
X1111115555444433333333333222222222222222222222222222222222223333334445555
X111111155544444333333333333222222222222222222222222222222333333334444555
X111111155554444433333333333332222222222222222222222222333333333344445555
X11111111555544444333333333333333222222222222222222233333333333344445555
X1111111115555444443333333333333333322222222222223333333333333344445555
X111111111155554444443333333333333333332222222333333333333334444445555
X11111111111555544444444333333333333333322233333333333333444444445555
X111111111111155554444444443333333333333333333333\33334444444445555
X11111111111111155555444444444433333333333333333\1\44444444455555
X111111111111111111555555444444444443333333334444\1\4444555555
X1111111111111111111111555555444444444443444444444\1\55555
X11111111111111111111111111555555444444444444444555\1\
X111111111111111111111111111111555555444444455555511\1\
X1111111111111111111111111111111111555554555551111111\1\
X11111111111111111111111111111111111115555511111111111\1\111\
X111111111111111111111111111111111111115551111111111111\1\1\\
X11111111111111111111111111111111111111151111111111111\\\\\\\
X1111111111111111111111111111111111111111111111111111111\\\\\
X111111111111111111111111111111111111111111111111111111111\\\
X11111111111111111111111111111111111111111111111111111111111\
X
X
X
X
X
X
X
X
X
X
!EOR!
echo extracting - afghan.lst
sed 's/^X//' > afghan.lst << '!EOR!'
X::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
XMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
X::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
XMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
X::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::::....     ....::::XXXMMMMMXXX::
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
XMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXMM  MMMXXXXXMMM  MMXX::.. ..::XXM
XMMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM  MMMXXX:XXXMMM  MMXX::...::XXMM
X MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM  MMMXXX:::XXXMMM  MMXX::.::XXMM
X  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM  MMMXXX:::::XXXMMM  MMXX:::XXMM
XM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  MMMXXX:::::::XXXMMM  MMXX:XXMM  M
XMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MMMXXX::::.::::XXXMMM  MMXXXMM  MM
XMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMMXXX::::...::::XXXMMM  MMXMM  MMM
XXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMXXX::::.....::::XXXMMM  MMM  MMMX
XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXXX::::.......::::XXXMMM  M  MMMXX
XXXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX::::.... ....::::XXXMMM   MMMXXX
X:XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX::::....   ....::::XXXMMM MMMXXX:
!EOR!
echo extracting - apple.lst
sed 's/^X//' > apple.lst << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X                                         MM
X                                        MM
X                                       MM
X                                      MM
X                                      MM
X                                      MM
X                           MMMMMMMMMM MM  MMMMMMMMMM
X                      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X                    MMMMMMMMMMXXXXXXMMMMMMMXXXXXXMMMMMMMMMM
X                  MMMMMMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMMMMMM
X                 MMMMMXXXXX:::::::XXXXXXXXXXX:::::::XXXXXMMMMM
X                MMMMMXXXX:::::::::::::::::::::::::::::XXXXMMMMM
X               MMMMMXXXX:::::::   :::::::::::::::::::::XXXXMMMMM
X               MMMMMXXX::::::        :::::::::::::::::::XXXMMMMM
X              MMMMMXXXX::::         ::::::::::::::::::::XXXXMMMMM
X              MMMMXXXX::::::       ::::::::::::::::::::::XXXXMMMM
X              MMMMXXXX::::::::: :::::::::::::::::::::::::XXXXMMMM
X              MMMMXXXX:::::::::::::::::::::::::::::::::::XXXXMMMM
X              MMMMMXXXX:::::::::::::::::::::::::::::::::XXXXMMMMM
X               MMMMMXXXX:::::::::::::::::::::::::::::::XXXXMMMMM
X               MMMMMMXXXXX:::::::::::::::::::::::::::XXXXXMMMMMM
X               MMMMMMXXXXXXX:::::::::::::::::::::::XXXXXXXMMMMMM
X                MMMMMMXXXXXXXXXXX:::::::::::::XXXXXXXXXXXMMMMMM
X                MMMMMMMXXXXXXXXXXXXXX:::::XXXXXXXXXXXXXXMMMMMMM
X                 MMMMMMMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMMMMMMM
X                  MMMMMMMMMMMMXXXXXXXXXXXXXXXXXXXMMMMMMMMMMMM
X                   MMMMMMMMMMMMMMMMXXXXXXXXXMMMMMMMMMMMMMMMM
X                     MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X                        MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X                           MMMMM   MMMMMMMMM   MMMMM
X
X
X
X                          X   X
X                           X X
X                         :: X
X                       ::XXX
X                     ::XX
X                    :XX
X                   :X
X                  :X
X                  ::
X                 ::
X                 ::
X                 ::
X                 X:              ::::
X                  X:          :::M  M::::
X                   X:::    :::M         M:::
X                    XXX::::M               M:
X                                            M:
X                                            :M
X                                         :::M
X
X
!EOR!
echo extracting - logo.lst
sed 's/^X//' > logo.lst << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X                                  MMMMMMMMMMM
X
X                         MMMM       MMMMMMMMMMMMMMMMMM
X                      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X                  MMM                   MMMMMMMMMMMMMMMMMMMMM
X                MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X              MM                              MMMMMMMMMMMMMMMMMMM
X             MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X            MM                                 MMMMMMMMMMMMMMMMMMMM
X            MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X           MMM                                 MMMMMMMMMMMMMMMMMMMMM
X           MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X           MMMMMMM                         MMMMMMMMMMMMMMMMMMMMMMMMM
X           MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X            MMMMMMMMMMMMM           MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X            MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X             MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X              MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X                MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X                  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X                      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X                         MMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X                                  MMMMMMMMMMM
X
X
X
X...............MMMMM......MMMMMMMMMMMMMM..............MMMMMMMMMMMMMMM..........
X...............MMMMM............MM..........................MM.................
X..............MMM MMM...........MM........MMMMMM............MM.................
X..............MM ..MM...........MM......MMMM..MMMM..........MM.................
X.............MMM...MMM..........MM.....MMMM.................MM.................
X.............MM.....MM..........MM.......MMMM...............MM.................
X............MMMMMMMMMMM.........MM.....MMMMMMMM.MMMM........MM.................
X............MM.......MM.........MM....MMM....MMMM...........MM.................
X...........MMM.......MMM........MM....MM....MM.MMMM.........MM.................
X...........MM.........MM........MM.....MMMMMM....MMMM.......MM.................
X
X
X
X
X
!EOR!
echo extracting - shoe.lst
sed 's/^X//' > shoe.lst << '!EOR!'
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X                                     XX                        XXX
X                                  XXX::XXXXXX            XXXXXXXXX
X                              XXXX  :::::::::XXXXXXXXXXXXXXXX::::XX
X                          XXXX :::   ::::::::::::::::::::::::::::XX
X                    XXXXXX:::   :::   ::::::::::::::::::::::::::XXXX
X             XXXXXXX::::   :::   :::   ::::::::::::::::::::::XXXXXXX
X       XXXXXX::::::::::::   :::   :::   :::::::::::::::::XXXXXXXXXXX
X      XXXXXXX:::::::::::::   :::   :::   ::::::::::::::XXXXXXXXXXXXX
X     XXXXXXXXXXX:::::::::::   :::   :::   ::::::::::::XXXXXXXXXXXXX
X     XXXXXXXXXXXX:::::::::::   :::   :::   ::::::::::XXXXXXXXXXXXX
X      XXXXXXXXXXXX:::::::::::   :::   :::   :MMMMMMMMMMMMMMMMMMMMMM
X       MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
!EOR!
echo extracting - valentin.lst
sed 's/^X//' > valentin.lst << '!EOR!'
X
X
X
X
X
X
X
X              |
X              ||
X          --\ \||
X           --\ \||
X            --\ \||
X             --\ \|
X              --\ \
X                 \ \
X                  \ \
X                   \ \
X                  MMMMMMMMM                         MMMMMMMMM
X              MMMMMMMMMMMMMMMMMM               MMMMMMMMMMMMMMMMMM
X           MMMMMMMXXXXXXXXXXMMMMMMM         MMMMMMMXXXXXXXXXXMMMMMMM
X        MMMMMMXXXXXXXXXXXXXXXXXMMMMMM     MMMMMMXXXXXX:::::XXXXXXMMMMMM
X       MMMMMXXXXXXXX::::::::XXXXXXMMMM   MMMMXXXXXX:::::::::::XXXXXMMMMM
X      MMMMXXXXXXX:::::::::::::::XXXXMMM MMMXXXX::::::::::::::::::XXXXMMMM
X     MMMMXXXXXX::::::::::::::::::::XXXMMMXXX:::::::::::.....:::::::XXXMMMM
X     MMMXXXXX::::::::::::::::::::::::XXXXX:::::::::...........::::::XXXMMM
X    MMMXXXXX:::::::::::.......:::::::::X::::::::......    ......::::XXXXMMM
X    MMMXXXX:::::::::..............:::::::::::.......         ....::::XXXMMM
X    MMMXXXX::::::::..................:::::.......             ...::::XXXMMM
X    MMMXXXX:::::::.....................:............         ....::::XXXMMM
X    MMMXXXX:::::::....................................       ....::::XXXMMM
X    MMMXXXX:::::::......................................    .....::::XXXMMM
X    MMMXXXXX::::::....................................... ......::::XXXXMMM
X    MMMMXXXX:::::::.............................................::::XXXMMMM
X     MMMXXXX::::::::............................................::::XXXMMM
X     MMMMXXXX::::::::..........................................::::XXXMMMM
X      MMMXXXX::::::::::.......................................:::::XXXMMM
X      MMMMXXXX:::::::::::...................................::::::XXXMMMM
X       MMMXXXXX::::::::::::..............................::::::::XXXXMMM
X       MMMMXXXXX:::::::::::::.........................::::::::::XXXXMMMM
X        MMMMXXXXX:::::::::::::::...................::::::::::::XXXXMMMM
X         MMMMXXXXX:::::::::::::::::.............::::::::::::::XXXXMMMM
X          MMMMXXXXXX::::::::::::::::::.......::::::::::::::XXXXXXMMMM
X           MMMMXXXXXXXX::::::::::::::::...::::::::::::::XXXXXXXXMMMM
X             MMMMXXXXXXXXX::::::::::::::::::::::\::::XXXXXXXXXMMMM
X               MMMMMXXXXXXXXXX:::::::::::::::::\ \XXXXXXXXXMMMMM
X                  MMMMMMXXXXXXXXXXX:::::::::XXXX\ \XXXXMMMMMM
X                      MMMMMMXXXXXXXXXXX:XXXXXXXXX\ \MMMMM
X                          MMMMMMXXXXXXXXXXXXXXXMMM\ \
X                              MMMMMMXXXXXXXMMMMMM  \ \
X                                  MMMMMXMMMMM       \ \
X                                     MMMMM           \ \   \
X                                      MMM             \ \ \\
X                                       M             \\\\\\\
X                                                       \\\\\
X                                                         \\\
X                                                           \
X
89but t }t }t.'