Понадобилась программа, чтобы склеивать ресурсные файлы в прошивку.

Вот такой код выделяется с двух сторон коммандерами, и запускается первый коммандер
## Код:
```
RecBake.Join "Final.bin"
         0H "Tablet.bin"
         24000H "Fonts/Files/PTAstraSans16.fbin"
         28000H "Fonts/Files/PTAstraSans23.fbin"
```

Получается файл прошивки Final.bin, в котором все ресурсы по нужным адресам.

Подумал, что может быть полезно, как пример для новичков, как работать с файлами в Блэкбоксе.

## Код:
```
MODULE RecBake;

   IMPORT Log, Files, TextModels, TextMappers, DevCommanders;

   VAR rd: Files.Reader; s: TextMappers.Scanner;

   PROCEDURE Join*;
      VAR p: DevCommanders.Par; error: BOOLEAN;
         res, src: Files.File; wr: Files.Writer; rd: Files.Reader;
         resName, path, name: Files.Name; n, i, pos: INTEGER; b: BYTE;
   BEGIN
      p := DevCommanders.par;
      IF p # NIL THEN
         DevCommanders.par := NIL;
         s.ConnectTo(p.text); s.SetPos(p.beg);
         s.SetOpts(s.opts + {TextMappers.returnViews});
         s.Scan;
         IF s.type = TextMappers.string THEN
            Log.String(s.string); Log.Ln;
            resName := s.string$;
            error := FALSE;
            res := Files.dir.New(Files.dir.This(""), Files.shared);
            wr := res.NewWriter(NIL);
            REPEAT
               s.Scan;
               IF s.type # TextMappers.view THEN
                  IF s.type = TextMappers.int THEN
                     Log.Int(s.int); Log.Ln;
                     WHILE wr.Pos() < s.int DO
                        wr.WriteByte(0)
                     END;
                     s.Scan;
                     IF s.type = TextMappers.string THEN
                        Log.String(s.string); Log.Ln;
                        i := 0; pos := 0;
                        path := s.string$;
                        WHILE i < LEN(path$) DO IF path[i] = "/" THEN pos := i END; INC(i) END;
                        path[pos] := 0X;
                        i := pos; n := 0;
                        WHILE i < LEN(s.string$) DO name[n] := s.string[i]; INC(i); INC(n) END;
                        name[n] := 0X;
                        src := Files.dir.Old(Files.dir.This(path), name, Files.shared);
                        IF src # NIL THEN
                           rd := src.NewReader(NIL);
                           WHILE ~rd.eof DO
                              rd.ReadByte(b);
                              IF ~rd.eof THEN wr.WriteByte(b) END
                           END
                        ELSE
                           error := TRUE; Log.String('не удалось открыть файл'); Log.Ln
                        END;
                     ELSE
                        error := TRUE;
                        Log.String('ошибка, ожидается формат: 0H "/path/name.bin"'); Log.Ln;
                     END;
                  ELSE
                     error := TRUE;
                     Log.String('ошибка, ожидается формат: 0H "/path/name.bin"'); Log.Ln;
                  END;
               END
            UNTIL (s.type = TextMappers.view) OR (s.Pos() >= p.end) OR error;
            IF ~error THEN res.Register(resName, "", Files.dontAsk, n) END;
         ELSE
            Log.String("ожидается название файла финальной прошивки"); Log.Ln;
         END
      END
   END Join;


END RecBake.
```
