c71e249a4e
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>
68 lines
5.6 KiB
Plaintext
68 lines
5.6 KiB
Plaintext
|
|
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 (Адрес запуска);
|