--- /dev/null
+#!/bin/bash
+
+# Скрипт для запуска серверной версии BB в качестве среды разраотки версии для Linux
+# !!! замените в этом тексте "~/BlackBox/linproj" на адрес вашей папки linproj.
+# Поместите этот файл в папку ~/.gnome2/nautilus-scripts
+# Вызовите контекстное меню в паке linproj и в меню сценари выберете этот скрипт
+# файл скрипта должен иметь разрешение на исполнение.
+
+
+# Эти команды спрячут подсистемы которые относятся к версии linux на время запуска BB
+mkdir ~/BlackBox/linproj/hide
+mv ~/BlackBox/linproj/Lin ~/BlackBox/linproj/hide/
+mv ~/BlackBox/linproj/System ~/BlackBox/linproj/hide/
+mv ~/BlackBox/linproj/Host ~/BlackBox/linproj/hide/
+mv ~/BlackBox/linproj/Code ~/BlackBox/linproj/hide/
+
+# Эта комманда запустит BB в парпке с проектом
+wine ~/BlackBox/linproj/bb16rc6win/BlackBox.exe -use "`winepath -w "$PWD"`" $* &
+echo "`winepath -w "$PWD"`"
+
+# Подождем пока среда инициализируется
+sleep 1
+
+# Вернем подсистемы на место, чтобы мы могли с ними работать
+mv ~/BlackBox/linproj/hide/Lin ~/BlackBox/linproj/
+mv ~/BlackBox/linproj/hide/System ~/BlackBox/linproj/
+mv ~/BlackBox/linproj/hide/Host ~/BlackBox/linproj/
+mv ~/BlackBox/linproj/hide/Code ~/BlackBox/linproj/
+rm ~/BlackBox/linproj/hide -R
--- /dev/null
+\ 1\ 1\ 1
\ No newline at end of file
--- /dev/null
+# Make File for building the Linux BlackBox Loader\r
+# Runs on Linux ELF \r
+\r
+CFLAGS = -O2\r
+\r
+exe.img: blackbox.o\r
+ gcc $(CFLAGS) -o exe.img blackbox.o -ldl -lm\r
+\r
+blackbox.o:\r
+ gcc $(CFLAGS) -c blackbox.c\r
+\r
+clean:\r
+ rm exe.img blackbox.o\r
--- /dev/null
+\r
+/*\r
+ * C-startup and loader for BlackBox \r
+ * Implemented as the StdLoader. \r
+ */\r
+\r
+\r
+#include <dlfcn.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+/* the exact size (in bytes) of the executable part of the file. */\r
+/* this constant needs to be updated everytime a change is made to this file */\r
+#define exeSize 21399\r
+\r
+\r
+/* fixup types */\r
+#define absolute 100\r
+#define relative 101\r
+#define copy 102\r
+#define table 103\r
+#define tableend 104\r
+#define deref 105\r
+#define halfword 106\r
+\r
+/* import types */\r
+#define mConst 0x1\r
+#define mTyp 0x2\r
+#define mVar 0x3\r
+#define mProc 0x4\r
+#define mExported 4\r
+\r
+#define any 1000000\r
+\r
+#define init 0x10000\r
+\r
+/* set to printf to debug and donothing to avoid debugging */ \r
+#define dprintf donothing\r
+\r
+typedef void (*BodyProc)();\r
+typedef char String[256];\r
+\r
+typedef struct Type {\r
+ int size;\r
+ struct Module* mod;\r
+ int id;\r
+ int base[16]; /* should be ARRAY 16 OF TYPE */\r
+ int fields; /* should be Directory* */\r
+ int ptroffs[any];\r
+} Type;\r
+\r
+typedef struct Object{\r
+ int fprint;\r
+ int offs;\r
+ int id;\r
+ Type* ostruct;\r
+} Object;\r
+\r
+typedef struct Directory{\r
+ int num;\r
+ Object obj[any];\r
+} Directory;\r
+\r
+typedef struct Module{ /* has to be exact copy of Kernel.Module */\r
+ struct Module *next;\r
+ int opts;\r
+ int refcnt;\r
+ short compTime[6], loadTime[6];\r
+ int ext;\r
+ int term; /* actually a pointer to type Command */\r
+ int nofimps, nofptrs;\r
+ int csize, dsize, rsize;\r
+ int code, data, refs;\r
+ int procBase, varBase; /* meta base addresses */\r
+ char* names; /* names[0] = 0X */\r
+ int* ptrs;\r
+ struct Module* imports;\r
+ Directory* export;\r
+ char name[256];\r
+} Module;\r
+\r
+typedef struct ImpList\r
+{\r
+ struct ImpList* next;\r
+ String name;\r
+} ImpList;\r
+\r
+typedef struct ModSpec\r
+{\r
+ ImpList* imp;\r
+ String name;\r
+ int start, hs, ms, ds, cs, vs, mad, dad;\r
+} ModSpec;\r
+\r
+typedef struct BootInfo\r
+{\r
+ Module* modList;\r
+ int argc;\r
+ char** argv;\r
+} BootInfo;\r
+\r
+const char bbfile[] = "./bb.boot";\r
+\r
+FILE* f;\r
+int nofMods;\r
+String kernel, mainmod;\r
+ModSpec mod;\r
+Module *modlist;\r
+BootInfo* bootInfo;\r
+int newRecAdr, newArrAdr;\r
+int newRecFP, newArrFP;\r
+\r
+int donothing(char* fmt, ...)\r
+{\r
+}\r
+\r
+void DumpMod()\r
+{ \r
+ dprintf("\n\n---- Mod info:\n");\r
+ dprintf(" hs, ms, ds, cs, vs = %d, %d, %d, %d, %d\n",\r
+ mod.hs, mod.ms, mod.ds, mod.cs, mod.vs);\r
+ dprintf(" mad, dad = %d, %d\n\n", mod.mad, mod.dad);\r
+}\r
+\r
+\r
+void RegisterModule()\r
+{\r
+ Module* m;\r
+ m = (Module*)mod.dad;\r
+ m->next = modlist;\r
+ modlist = m;\r
+ /*\r
+ if (modlist == NULL){\r
+ modlist = m; \r
+ } else {\r
+ last->next = m;\r
+ last = m;\r
+ }\r
+ last->next = NULL;\r
+ */\r
+ dprintf("Registred module %s\n", mod.name);\r
+}\r
+\r
+void PrintMods()\r
+{\r
+ Module* ml;\r
+ ml = modlist;\r
+ dprintf("Loaded Modules\n");\r
+ while (ml != NULL){\r
+ dprintf("mod name: %s\n", ml->name);\r
+ ml = ml->next;\r
+ }\r
+ dprintf("end of list\n");\r
+}\r
+\r
+\r
+Module* ThisModule(char* name)\r
+{\r
+ Module* ml;\r
+ ml = modlist;\r
+ while ((ml != NULL) && (strcmp(ml->name, name) != 0)){\r
+ ml = ml->next;\r
+ }\r
+ return ml;\r
+}\r
+ \r
+Object* ThisObject(Module* mod, char* name)\r
+{\r
+ int l, r, m;\r
+ char* p;\r
+ l = 0; r = mod->export->num;\r
+ while (l < r){\r
+ m = (l + r) / 2;\r
+ p = (char*) &(mod->names[mod->export->obj[m].id / 256]);\r
+ if (strcmp(p, name) == 0)\r
+ return (Object*)&(mod->export->obj[m]);\r
+ if (strcmp(p, name) < 0)\r
+ l = m + 1;\r
+ else\r
+ r = m;\r
+ }\r
+ return NULL;\r
+}\r
+\r
+Object* ThisDesc(Module* mod, int fprint)\r
+{\r
+ int i, n;\r
+ i = 0; n = mod->export->num;\r
+ while ((i < n) && (mod->export->obj[i].id / 256 == 0))\r
+ {\r
+ if (mod->export->obj[i].offs == fprint)\r
+ return (Object*)&(mod->export->obj[i]);\r
+ i++;\r
+ }\r
+ return NULL;\r
+}\r
+\r
+int LoadDll (char* name)\r
+{\r
+ \r
+ void *handle;\r
+ dprintf("loading: %s\n", name);\r
+ if ((handle = dlopen(name, RTLD_LAZY + RTLD_GLOBAL)) == NULL) {\r
+ printf("LoadDll: failed to load lib %s\n", name); \r
+ printf(" - dlerror: %s\n", dlerror());\r
+ exit(-1);\r
+ }\r
+ return handle != NULL;\r
+}\r
+\r
+ \r
+int ThisDllObj (int mode, int fprint, char* dll, char* name)\r
+{\r
+ void *handle; \r
+ int ad = 0;\r
+ if ((mode == mVar) || (mode == mProc)){\r
+ if ((handle = dlopen(dll, RTLD_LAZY + RTLD_GLOBAL)) == NULL) {\r
+ printf("ThisDllObj: lib %s not found\n", dll); \r
+ printf(" - dlerror: %s\n", dlerror());\r
+ exit(-1);\r
+ } else {\r
+ ad = (int)dlsym((void *) handle, name);\r
+ if (ad == 0) {\r
+ printf("ThisDllObj: symbol %s not found\n", name); exit(-1);\r
+ }\r
+ }\r
+ }\r
+ return ad;\r
+ }\r
+\r
+int Read4 ()\r
+{\r
+ unsigned char b;\r
+ int w;\r
+ b = fgetc(f); w = b % 256;\r
+ b = fgetc(f); w = w + 0x100 * (b % 256);\r
+ b = fgetc(f); w = w + 0x10000 * (b % 256);\r
+ b = fgetc(f); w = w + 0x1000000 * b;\r
+ return w;\r
+}\r
+\r
+int RNum()\r
+{\r
+ char b;\r
+ int s, y;\r
+ s = 0; y = 0;\r
+ b = fgetc(f);\r
+ while (b < 0) \r
+ {\r
+ y = y + ((b + 128) << s);\r
+ s = s + 7;\r
+ b = fgetc(f); \r
+ }\r
+ return (((b + 64) % 128 - 64) << s) + y;\r
+}\r
+\r
+void ReadName (char* str)\r
+{\r
+ unsigned char b;\r
+ int i;\r
+ i = 0; b = fgetc(f);\r
+ while (b != 0)\r
+ {\r
+ str[i] = b; i++; b = fgetc(f);\r
+ }\r
+ str[i] = 0;\r
+}\r
+\r
+void Fixup (int adr)\r
+{\r
+ int link, offset, linkadr, n, x, t;\r
+\r
+ dprintf("fixup: %X ", adr);\r
+ link = RNum();\r
+ while (link != 0)\r
+ {\r
+ offset = RNum();\r
+ dprintf("+%d: ", offset);\r
+ while (link != 0)\r
+ {\r
+ if (link > 0) \r
+ {\r
+ dprintf("c");\r
+ linkadr = mod.mad + mod.ms + link;\r
+ }\r
+ else\r
+ {\r
+ dprintf("d");\r
+ link = -link;\r
+ if (link < mod.ms) \r
+ linkadr = mod.mad + link;\r
+ else\r
+ linkadr = mod.dad + link - mod.ms;\r
+ }\r
+ dprintf("%X ", link);\r
+ \r
+ /*\r
+ t = *(char*)(linkadr + 3);\r
+ n = *(int*)linkadr;\r
+ n = n << 8; n = n >> 8;\r
+ */\r
+ x = *(int*)linkadr;\r
+ t = x / 0x1000000;\r
+ n = (x + 0x800000) % 0x1000000 - 0x800000;\r
+ \r
+ switch (t) {\r
+ case absolute: x = adr + offset; break;\r
+ case relative: x = adr + offset - linkadr -4; break;\r
+ case copy: x = *(int*)(adr + offset); break;\r
+ case table: x = adr + n; n = link + 4; break;\r
+ case tableend: x = adr + n; n = 0; break;\r
+ case deref: x = *(int*)(adr + 2); x = x + offset; break;\r
+ case halfword:\r
+ printf("fixup: halfword not implemented\n");\r
+ break;\r
+ default:\r
+ printf("fixup error(link=%d, offset=%d, linkadr=%d, t=%d, x=%d)\n",\r
+ link, offset, linkadr, t, x);\r
+ return;\r
+ } \r
+ *(int*)linkadr = x;\r
+ link = n;\r
+ }\r
+ link = RNum();\r
+ }\r
+ dprintf("\n");\r
+}\r
+\r
+int ReadBootHeader()\r
+{\r
+ int tag, version;\r
+\r
+ fseek(f, exeSize, SEEK_SET);\r
+ tag = Read4();\r
+ version = Read4();\r
+ if ((tag != 0x3A4B5C6D) || (version != 0))\r
+ {\r
+ return 0;\r
+ }\r
+ nofMods = Read4();\r
+ dprintf("Linked modules: %d\n", nofMods);\r
+ ReadName(kernel);\r
+ dprintf("kernel: %s\n", kernel);\r
+ ReadName(mainmod);\r
+ dprintf("main: %s\n", mainmod);\r
+ newRecFP = Read4(); newRecAdr = 0;\r
+ newArrFP = Read4(); newArrAdr = 0;\r
+ mod.start = ftell(f);\r
+ return 1;\r
+}\r
+\r
+int ReadHeader ()\r
+{\r
+ int ofTag, i, nofImps, processor;\r
+ char str[80];\r
+ ImpList *imp, *last;\r
+ char* n;\r
+\r
+ ofTag = Read4();\r
+ if (ofTag != 0x6F4F4346) \r
+ {\r
+ printf("wrong object file version\n");\r
+ return 0;\r
+ }\r
+ processor = Read4(); \r
+ mod.hs = Read4();\r
+ mod.ms = Read4();\r
+ mod.ds = Read4();\r
+ mod.cs = Read4();\r
+ mod.vs = Read4();\r
+ dprintf("File tag: %d ", ofTag); dprintf("Processor: %d\n", processor);\r
+ dprintf("Header size: %d ", mod.hs);\r
+ dprintf("Meta size: %d ", mod.ms);\r
+ dprintf("Desc size: %d ", mod.ds );\r
+ dprintf("Code size: %d ", mod.cs);\r
+ dprintf("Data size: %d\n", mod.vs);\r
+ nofImps = RNum(); dprintf("Nof imports: %d\n", nofImps);\r
+ ReadName(mod.name); dprintf("Module name: %s\n", mod.name);\r
+ mod.imp = NULL;\r
+ for (i = 0; i < nofImps; i++)\r
+ {\r
+ imp = (ImpList*)calloc(1, sizeof(ImpList));\r
+ ReadName(imp->name);\r
+ if (mod.imp == NULL)\r
+ mod.imp = imp;\r
+ else\r
+ last->next = imp;\r
+ last = imp;\r
+ last->next = NULL;\r
+ dprintf("Import %d: %s\n", i, imp->name);\r
+ if ((imp->name[0] == '$') && (imp->name[1] == '$'))\r
+ strcpy(imp->name, "Kernel");\r
+ if (imp->name[0] == '$'){\r
+ n = imp->name;\r
+ n++;\r
+ if (!LoadDll(n)){\r
+ printf("Could not load lib: %s\n", imp->name[1]);\r
+ return 0;\r
+ }\r
+ }\r
+ }\r
+ dprintf("Pos: %d\n", ftell(f));\r
+ return 1;\r
+}\r
+\r
+int ReadModule ()\r
+{\r
+ char *dp, *mp; \r
+ unsigned int cnt;\r
+ ImpList* imp;\r
+ int x, fp, opt, link, ofp, imptab, a;\r
+ Module *desc, *k;\r
+ String name;\r
+ Object* obj;\r
+ int isLib;\r
+ char* im;\r
+\r
+ mod.dad = (int) calloc(1, mod.ds);\r
+ mod.mad = (int) calloc(1, mod.ms + mod.cs + mod.vs);\r
+ if ((mod.dad == 0) || (mod.mad == 0)) \r
+ {\r
+ printf("BootLoader: Couldn't initalize heap\n");\r
+ free((void*)mod.dad);\r
+ free((void*)mod.mad);\r
+ return 0;\r
+ }\r
+ dp = (char*) mod.dad;\r
+ mp = (char*) mod.mad;\r
+ fseek(f, mod.start + mod.hs, SEEK_SET);\r
+ dprintf("ReadModule after fseek pos: %d\n", ftell(f));\r
+ cnt = fread(mp, 1, mod.ms, f);\r
+ dprintf("Read meta bulk (%d bytes. New pos: %d)\n", cnt, ftell(f));\r
+ cnt = fread(dp, 1, mod.ds, f);\r
+ dprintf("Read desc bulk (%d bytes. New pos: %d)\n", cnt, ftell(f));\r
+ mp = (char*)(mod.mad + mod.ms);\r
+ cnt = fread(mp, 1, mod.cs, f); \r
+ dprintf("Read code bulk (%d bytes. New pos: %d)\n", cnt, ftell(f));\r
+\r
+ DumpMod();\r
+\r
+ dprintf("before fixup: pos = %d\n", ftell(f));\r
+ \r
+ if ((!newRecAdr) || (!newArrAdr)){\r
+ k = ThisModule(kernel);\r
+ if (k != NULL){\r
+ /* obj = ThisDesc(k, newRecFP);*/\r
+ obj = ThisObject(k, "NewRec");\r
+ if (obj != NULL)\r
+ newRecAdr = k->procBase + obj->offs;\r
+ /* obj = ThisDesc(k, newArrFP);*/\r
+ obj = ThisObject(k, "NewArr");\r
+ if (obj != NULL)\r
+ newArrAdr = k->procBase + obj->offs;\r
+ dprintf("newRecFP: %X newArrFP: %X\n", newRecFP, newArrFP);\r
+ dprintf("newRecAdr: %X newArrAdr: %X\n", newRecAdr, newArrAdr);\r
+ } else {\r
+ dprintf("no kernel before %s.\n", mod.name);\r
+ }\r
+ }\r
+ Fixup(newRecAdr);\r
+ Fixup(newArrAdr);\r
+ Fixup(mod.mad);\r
+ Fixup(mod.dad);\r
+ Fixup(mod.mad + mod.ms);\r
+ Fixup(mod.mad + mod.ms + mod.cs);\r
+ dprintf("after fixup: pos = %d\n", ftell(f));\r
+ imp = mod.imp; imptab = (int)((Module*)(mod.dad))->imports;\r
+ while (imp != NULL){\r
+ x = RNum();\r
+ if ((imp->name[0] == '$') && (imp->name[1] == '$'))\r
+ printf("should be Kerneln");\r
+ if (imp->name[0] == '$')\r
+ isLib = 1;\r
+ else{\r
+ isLib = 0;\r
+ desc = ThisModule(imp->name);\r
+ if (desc == NULL){\r
+ printf("invalid import list\n");\r
+ return 0;\r
+ }\r
+ }\r
+ while (x != 0) {\r
+ ReadName(name); fp = RNum(); opt = 0;\r
+ if (!isLib) {\r
+ if (name[0] == 0)\r
+ obj = ThisDesc(desc, fp);\r
+ else\r
+ obj = ThisObject(desc, name);\r
+ if ((obj != NULL) && (obj->id % 16 == x)){\r
+ ofp = obj->fprint;\r
+ switch (x){\r
+ case mTyp:\r
+ opt = RNum();\r
+ if (opt % 2 == 1) ofp = obj->offs;\r
+ if ((opt > 1) && ((obj->id / 16) % 16 != mExported)){\r
+ printf("object not found (%s)\n", imp->name);\r
+ return 0;\r
+ }\r
+ Fixup((int)obj->ostruct);\r
+ break;\r
+ case mVar:\r
+ Fixup(desc->varBase + obj->offs);\r
+ break;\r
+ case mProc:\r
+ Fixup(desc->procBase + obj->offs);\r
+ }\r
+ if (ofp != fp){\r
+ printf("illigal foot print (%s)\n", imp->name);\r
+ return 0;\r
+ }\r
+ } else {\r
+ if (obj == NULL) printf("obj == NULL\n");\r
+ printf("descriptor not found (%s, x: %d, id: %d)\n", name, x, obj->id);\r
+ return 0;\r
+ }\r
+ }else{\r
+ if ((x == mVar) || (x == mProc)){ \r
+ im = imp->name;\r
+ im++;\r
+ a = ThisDllObj(x, fp, im, name);\r
+ if (a != 0)\r
+ Fixup(a);\r
+ else{\r
+ printf("ReadModule: Object not found: %s\n", name);\r
+ return 0;\r
+ }\r
+ } else {\r
+ if (x == mTyp) {\r
+ opt = RNum();\r
+ x = RNum();\r
+ if (x != 0) {\r
+ printf("ReadModule: Object not found: %s\n", name);\r
+ return 0;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ x = RNum();\r
+ }\r
+ *(int*)imptab = (int)desc; imptab += 4;\r
+ imp = imp->next;\r
+ }\r
+\r
+ mod.start = ftell(f);\r
+ return 1;\r
+}\r
+\r
+int main (int argc, char *argv[])\r
+{\r
+ int i, ok;\r
+ BodyProc body;\r
+ int callBackAdr;\r
+ Module *k, *m;\r
+\r
+ modlist = NULL;\r
+ dprintf("initializing BlackBox for Linux...\n");\r
+ /*f = fopen(bbfile, "rb");*/\r
+ f = fopen(argv[0], "r");\r
+ if (f != NULL) \r
+ {\r
+ if (ReadBootHeader())\r
+ {\r
+ i = 0; ok = 1;\r
+ while ((i < nofMods) && (ok)){\r
+ ok = ReadHeader();\r
+ if (ok) {\r
+ ok = ReadModule();\r
+ if (ok)\r
+ RegisterModule();\r
+ else\r
+ printf("Incorrect module: %s\n", mod.name);\r
+ } else\r
+ printf("Incorrect header: %s\n", mod.name);\r
+ i++;\r
+ }\r
+ fclose(f);\r
+ if (ok) {\r
+ k = ThisModule(kernel);\r
+ m = ThisModule(mainmod);\r
+ if (k == NULL)\r
+ printf("no kernel\n");\r
+ else\r
+ {\r
+ if (m == NULL) \r
+ printf("no main module");\r
+ else\r
+ {\r
+ /* assign the boot info to first variable in Kernel */\r
+ bootInfo = calloc(1, sizeof(BootInfo));\r
+ bootInfo->modList = modlist;\r
+ bootInfo->argc = argc;\r
+ bootInfo->argv = argv;\r
+ *((int*)(k->varBase)) = (int)bootInfo;\r
+ dprintf("before body\n");\r
+ body = (BodyProc)(m->code);\r
+ k->opts = k->opts | init; /* include init in opts */\r
+ body();\r
+ dprintf("after body\n");\r
+ }\r
+ }\r
+ PrintMods();\r
+ }\r
+ } else\r
+ printf("Invalid BlackBox executable, make sure that the constant exeSize is correctly set\n");\r
+\r
+ } else \r
+ printf("Couldn't find file: %s\n", bbfile);\r
+}\r
--- /dev/null
+/* XPM */\r
+static char * file_xpm[] = {\r
+"12 12 3 1",\r
+" s None c None",\r
+". c black",\r
+"X c #FFFFFFFFF3CE",\r
+" ........ ",\r
+" .XXXXXX. ",\r
+" .XXXXXX... ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .XXXXXXXX. ",\r
+" .......... "};\r
--- /dev/null
+/* XPM */\r
+static char * folder_foo_xpm[] = {\r
+/* width height num_colors chars_per_pixel */\r
+"16 12 3 1",\r
+/* colors */\r
+" s None c None",\r
+". c black",\r
+"X c #f0ff80",\r
+/* pixels */\r
+" .... ",\r
+" .XXXX. ",\r
+" .XXXXXX. ",\r
+"............. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+".XXXXXXXXXXX. ",\r
+"............. "};\r
--- /dev/null
+/* XPM */\r
+static char * openfolder_xpm[] = {\r
+/* width height num_colors chars_per_pixel */\r
+"16 12 3 1",\r
+/* colors */\r
+" s None c None",\r
+". c black",\r
+"X c #f0ff80",\r
+/* pixels */\r
+" .... ",\r
+" .XXXX. ",\r
+" .XXXXXX. ",\r
+"............. ",\r
+".XXXXXXXXXXX. ",\r
+".XXX............",\r
+".XX.XXXXXXXXXXX.",\r
+".XX.XXXXXXXXXX. ",\r
+".X.XXXXXXXXXXX. ",\r
+".X.XXXXXXXXXXX. ",\r
+"..XXXXXXXXXX.. ",\r
+"............. "};\r