Vitamin, сама утилита ничего особо умного не делает, но делает буквально следующее. Берёт сишный файл-исходник библиотеки со множеством функций:
Код:
#include "SYSTEM.h"

export void NewSupercode_EKRAN_1 (SHORTCARD x);
export void NewSupercode_EKRAN_2 (SHORTCARD x);
/*================================== Header ==================================*/

void NewSupercode_EKRAN_1 (SHORTCARD x) {
__asm
    LD   HL, #2
    ADD  HL, SP
    LD   L, (HL) // x
    LD   H, #0
    LD   DE, #0x5800
    LD   BC, #0x300
    LDIR
__endasm;
} //NewSupercode_EKRAN_1

/*--------------------------------- Cut here ---------------------------------*/
void NewSupercode_EKRAN_2 (SHORTCARD x) {
__asm
    LD   HL, #2
    ADD  HL, SP
    LD   L, (HL) // x
    LD   H, #0
    LD   BC, #0x1800
    LD   DE, #0x4000
    LDIR
__endasm;
} //NewSupercode_EKRAN_2

...
и нарезает на секции по "линиям разреза", так что получаются фрагменты, состоящие из заголовка, взятого до "линии заголовка" - он будет включен в каждый фрагмент (притом какие-либо инклюды из заголовка делать вовсе необязательно, ибо даже можно сделать нужный инклюд прямо в нужном куске). Фрагмент NewSupercode_001:
Код:
#include "SYSTEM.h"

export void NewSupercode_EKRAN_1 (SHORTCARD x);
export void NewSupercode_EKRAN_2 (SHORTCARD x);
/*================================== Header ==================================*/

void NewSupercode_EKRAN_1 (SHORTCARD x) {
__asm
    LD   HL, #2
    ADD  HL, SP
    LD   L, (HL) // x
    LD   H, #0
    LD   DE, #0x5800
    LD   BC, #0x300
    LDIR
__endasm;
} //NewSupercode_EKRAN_1
Фрагмент NewSupercode_002:
Код:
#include "SYSTEM.h"

export void NewSupercode_EKRAN_1 (SHORTCARD x);
export void NewSupercode_EKRAN_2 (SHORTCARD x);
/*================================== Header ==================================*/

void NewSupercode_EKRAN_2 (SHORTCARD x) {
__asm
    LD   HL, #2
    ADD  HL, SP
    LD   L, (HL) // x
    LD   H, #0
    LD   BC, #0x1800
    LD   DE, #0x4000
    LDIR
__endasm;
} //NewSupercode_EKRAN_2
Потом эти кусочки в цикле скармливаются компилятору и библиотекарю, который упаковывает скомпилированные сегменты-объектники .rel в библиотеку.

Сам понимаешь, что приватные (static) функции при таком способе разбиения имеет смысл пихать только в тот фрагмент, который монопольно будет вызывать приватную функцию, потому что если выделить static-функцию в отдельный фрагмент - её извне не будет видно. Хотя никто и не запрещает.

Также я научил Ofront добавлять в генерируемый им сишный исходник те же линии заголовка и разреза, но решены отнюдь не все проблемы с автоматическим разделением, поэтому его можно использовать только в простых случаях (без static и без ООП), но поймите меня правильно: это излечимо, просто нужно придумать как доработать. Подчёркиваю: последний абзац касается только Ofront'а, которым вы всё равно не пользуетесь (и не собираетесь). Поэтому я дорабатываю его исключительно для себя. С SDCC же весь процесс регулируется ручками, так больше свободы.