Files
snark13 c71e249a4e 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>
2026-06-03 16:13:21 +03:00

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 (Адрес запуска);