Add full compiler toolchain, libc, examples and reference docs
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.
What's in here:
bin/sprinter-cc — driver script invoking SDCC + linker + mkexe
libc/ — Sprinter-specific libc layer over ESTEX/BIOS
(conio, gfx, io, mem, stdio + headers)
runtime/ — crt0 variants (default/small/banked/minimal)
+ heap + bank trampolines
toolchain/ — mkexe (SprintEXE packer, C + tests)
examples/ — 30 demo programs (gfx, file I/O, env, time, …)
lib/Makefile — builds the libc archive (sprinter.lib)
docs/ — converted Sprinter manuals + asm reference samples
third_party/ — solid-c reference compiler dump + sdcc setup script
release_docs/ — packaging / release notes
gitignore overhaul:
• Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
• Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
INPUT fixtures, not build outputs.
• Collapse the duplicated SDCC/C/Sdcc sections into one section per
concern (build outputs / vendored / OS-junk).
• Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
|
||||
1) если я и DATA и CODE размещаю в одном окне (W1 - #4000 или W2 - #8000, неважно),
|
||||
то при вызове set_videomode глобальные переменные (errno, g_text_attr) не меняют
|
||||
своих значений.
|
||||
если же DATA и CODE находятся в разных окнах (не важно где DATA - в W1 или W2, главное
|
||||
что не в том где CODE) - то при вызове se_videomode значения глобальных переменных меняются
|
||||
|
||||
То есть похоже что для DATA не назначается отдельный блок памяти а назначается только для CODE
|
||||
Это полностью соответствует документации - если приложение менее 16К (как у нас) то ему выделяется
|
||||
только одна страница. И получается что работа со второй страницей идет несанкционированно (ей память
|
||||
не выделена).
|
||||
|
||||
Потому предлагается
|
||||
1) сейчас размещать ВСЕ в одной странице (и DATA и CODE и стек) - в W2.
|
||||
|
||||
2) дальше - добавить в нашу обертку sprinter-cc режимы памяти -
|
||||
-tiny - все приложение помещается в одну страницу - в W2 (и DATA и CODE и стек)
|
||||
-small - приложение помещается в две страницы - CODE в W1, DATA и стек - в W2.
|
||||
в этом режиме над отдельно выделять и маппить страницу в W2 для DATA и стека
|
||||
-big - DATA, CODE и стек помещаются в одну страницу W2 как в -tiny, добавляется поддержка banked в W1,
|
||||
страница W3 остается служебной и для работы с граффикой из banked code
|
||||
-huge - приложение помещается в двух страницах как и -small но так же добавляется поддержка banked но
|
||||
уже в страницу W3
|
||||
|
||||
Из документации -
|
||||
|
||||
> Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС
|
||||
передаёт управление эти прогораммам, какие банки там нахадятся по
|
||||
умолчанию?
|
||||
|
||||
В зависимости от адреса загрузки и размера приложения DSS выделяет
|
||||
необходимое число страниц памяти. Так при размере меньше 16К будет
|
||||
выделена
|
||||
одна страница, при размере больше 16К - две, и т.д. В окна с
|
||||
"неиспользуемым" адресном пространством будет подключатся
|
||||
специальная страница #FF.Если приложению требуется памяти больше чем
|
||||
зарезервировано в exe-файле, оно должно выделить себе дополнительный
|
||||
блок памяти самостоятельно.
|
||||
|
||||
|
||||
> В конфигурации спринтер
|
||||
> по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами,
|
||||
> чтоб использывать когда сюда подставленна страница пользователся
|
||||
> резеты не доступны!.
|
||||
|
||||
Это так в нижних 16K находится DSS / BIOS в остальных 48К
|
||||
приложение, но с
|
||||
определенными особенностями. Стек не должен быть выше #BFFF при
|
||||
вызове DSS и ниже #8000 при вызове некоторых функций BIOS.
|
||||
|
||||
|
||||
Так же посмотри вот сюда - возможно нам придется для режимов -small и -huge делать свой первичным загрузчиком -
|
||||
Из документации -
|
||||
|
||||
Выполнение EXE-файла осуществляется по следующим пунктам:
|
||||
1) Открывает exe-файл на чтение;
|
||||
2) Считывает в рабочую область префикс exe-файла;
|
||||
3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного
|
||||
загрузчика, если его размер не равен нулю;
|
||||
4) Сохраняет стек;
|
||||
5) Подключает страницы из выделенного блока;
|
||||
6) Строит префикс запуска программы и устанавливает на него регистр IX;
|
||||
7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения кода в
|
||||
памяти);
|
||||
8) Закрывает exe-файл, если это не первичный загрузчик;
|
||||
9) Устанавливает стек равным значению из смещения 20 (Адрес расположения стека);
|
||||
10) Передает управление по адресу указанному в смещении 18 (Адрес запуска);
|
||||
Reference in New Issue
Block a user