Vitamin, сама утилита ничего особо умного не делает, но делает буквально следующее. Берёт сишный файл-исходник библиотеки со множеством функций:
и нарезает на секции по "линиям разреза", так что получаются фрагменты, состоящие из заголовка, взятого до "линии заголовка" - он будет включен в каждый фрагмент (притом какие-либо инклюды из заголовка делать вовсе необязательно, ибо даже можно сделать нужный инклюд прямо в нужном куске). Фрагмент 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 /*--------------------------------- 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_002:Код:#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Потом эти кусочки в цикле скармливаются компилятору и библиотекарю, который упаковывает скомпилированные сегменты-объектники .rel в библиотеку.Код:#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
Сам понимаешь, что приватные (static) функции при таком способе разбиения имеет смысл пихать только в тот фрагмент, который монопольно будет вызывать приватную функцию, потому что если выделить static-функцию в отдельный фрагмент - её извне не будет видно. Хотя никто и не запрещает.
Также я научил Ofront добавлять в генерируемый им сишный исходник те же линии заголовка и разреза, но решены отнюдь не все проблемы с автоматическим разделением, поэтому его можно использовать только в простых случаях (без static и без ООП), но поймите меня правильно: это излечимо, просто нужно придумать как доработать. Подчёркиваю: последний абзац касается только Ofront'а, которым вы всё равно не пользуетесь (и не собираетесь). Поэтому я дорабатываю его исключительно для себя. С SDCC же весь процесс регулируется ручками, так больше свободы.




Ответить с цитированием