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

138 lines
7.5 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Последняя редакция: 7.05.2004
ФОРМАТ REL-СОВМЕСТИМЫХ ОБЪЕКТНЫХ ФАЙЛОВ
Объектные файлы REL-формата фирмы Microsoft, представляют собой битовый
поток. Отдельные поля в битовом потоке не выровнены на границу байта,
кроме элементов, описанных ниже.
Использование битового потока для объектных файлов уменьшает их размер,
сводя к минимуму число обращений к диску для чтения/записи данных.
Имеются два основных типа: Абсолютный и Перемещаемый. Первый бит служит
индикатором типов. Если он равен 0, следующие 8 бит загружаются как абсо-
лютный байт. Если первый бит равен 1, следующие 2 бита определяют 4 типа:
00b Спец-элемент (описание ниже).
01b Перемещаемый Код. Значение следующих 16 бит (2 байта)
необходимо прибавить с текущему значению счетчика адреса
Кода.
10b Перемещаемые Данные. Значение следующих 16 бит (2 байта)
необходимо прибавить с текущему значению счетчика адреса
Данных.
11b Перемещаемая Общая область (код+данные). Значение следующих
16 бит (2 байта) необходимо прибавить с текущему значению
счетчика адреса Common-области.
Спец-элемент(ы) содержит:
■ контр. поле из 4-х бит номеров элементов 0..15.
■ не обязательное A-поле. Содержит 2 бита типа адресации cseg,
dseg,common (кроме абсолютного) и 2 (4 у extended REL) байта
значения.
■ не обязательное B-поле. Содержит 3 бита (5 у extended REL)
длины имени и самого имени идентификатора.
Общее представление спец-элемента:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 00b xxx yy nnnn mmmm zzz + имя идентификатора
-------------- ------------------------
A-поле B-поле
xxx 4 бита контр. поля (0..15 номера элементов, см. ниже)
yy 2 бита типа адресации (cseg/dseg/common)
nnnn 16 бит значения (адрес)
mmmm 16 бит дополнительно, при расширенном REL-формате
zzz 3 бита длины имени (5 бит при расш. REL-формате)
... имя идентификатора
Номера элементов контрольного поля
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Номера элементов только в B-поле:
0 - имя метки, на которую имеется ссылка
1 - имя блока COMMON
2 - имя прогр. модуля (program name)
3 - request-имя файла (request library search)
4 - элемент расширения. См. примечание.
Номера элементов в A-поле и B-поле:
5 - размер COMMON (элемент только для A-поля ?)
6 - внешняя цепочка:
для A-поля: адрес головной цепочки
для B-поля: внешнее имя
7 - точка входа метки:
для A-поля: адрес располож. метки
для B-поля: имя метки
Номера элементов только в A-поле:
8 - External - offset. Used for JMP and CALL to externals.
9 - External + offset. The A value will be added to the two
bytes starting at the current location counter immediately
before execution.
10 - размер области Данных.
11 - счетчик памяти сегмента (ORG cseg/dseg/common).
12 - адрес цепочки. A is head of chain, replace all entries
in chain with current location counter.
Вход последней цепочки имеет нулевой адрес.
13 - размер области Кода.
14 - конец программного модуля (end program), далее идет
выравнивание до границы байта.
Этот элемент не содержит ни A-поле, ни B-поле:
15 - конец файла
Примечание по элементу расширения:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C-поле элемента расширения имеет формат B-поля спец-элемента, но область
имени не содержит имя идентификатора, как в B-поле. Вместо него здесь
находится один байт типа (сигнатура) элемента расширения, далее следует
от 1 до 7 байт дополнительной информации.
Таким образом, каждый элемент расширения имеет формат:
1 00b 0100b zzz i jjjjjjjj
----------------
C-поле
zzz любые 3 бита (000b представляется как 8).
(001b у асма SOLID).
i 8 бит типа (сигнатура) элемента расширения.
(0FEh у асма SOLID).
jjjjjjjj zzz-1 число байт информации. Значение зависит
от типа i.
Это присутствует только в одном элементе расширения:
zzz 010b (2)
i X'35' тип (сигнатура) оверлейного сегмента COBOL
j номер COBOL-сегмента - 31h (цифровой формат номера)
Когда линкеру встречается сигнатура оверлейного сегмента, текущее число
оверлейных сегментов устанавливается в значение j+31h (симв. формат номера).
Если предварительно существующий номер сегмента не был нулевой и включена
опция /N (сохр. файл с заданным именем), то область данных записывается на
диск в файл. Имя файла равно текущему имени программы, с расширением файла -
Vxx, где "xx" две hex-цифры номера сегмента j+31h (симв. формат номера).