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,82 @@
|
||||
Пример процедур цветной печати на графический экран с разрешением 640x256x16 цветов.
|
||||
Такая процедура использовалась во Flex Navigator v1.xx.
|
||||
Написан под Estex v1.xx и выше.
|
||||
|
||||
Описание файлов:
|
||||
main.z80 - инициализирующий файл
|
||||
print.z80 - процедура печати
|
||||
|
||||
|
||||
Описание формата шрифта:
|
||||
в шрифте используется 256 символов, высотой 8 точек и различной длиной.
|
||||
|
||||
+000 [256] - длина символа по x (для каждого символа) (в байтах)
|
||||
+256 [256] - младший байт смешения на образ символа (для каждого символа)
|
||||
+512 [256] - старший байт смешения на образ символа (для каждого символа)
|
||||
+768 ... - образы символов (от 0 до 255 символа)
|
||||
образы храняться в виде вертикальных линий точек по 8 байт, по 4 бита на точку.
|
||||
кол-во линий (в байтах) определяется из размера по х
|
||||
цвет background = 0x00
|
||||
цвет foreground = 0x0F
|
||||
|
||||
например образ символа А:
|
||||
длина символа по x = 4 (байта)
|
||||
00 00 00 00
|
||||
00 FF FF 00
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
0F FF FF F0
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
00 00 00 00
|
||||
|
||||
в образе символа он будет лежать так:
|
||||
|
||||
00 00 0F 0F 0F 0F 0F 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 00 F0 F0 F0 F0 F0 00
|
||||
|
||||
|
||||
|
||||
Описание алгоритма:
|
||||
Самая главная проблема цветной печати это быстрое преоброзование точки фона/символа в нужный цвет.
|
||||
Здесь показано, как я вышел из этого "нелегкого" положения ;) Если кто-нибудь придумает более быстрый
|
||||
вариант, то я буду рад его увидеть :)
|
||||
|
||||
Печать на экран осуществляется вертикальными линиями с испольэованием акселератора сразу по 8 байт.
|
||||
Для замешивания цветов нам требуется 2 буфера (цвет background и foreground) размером в 8 байт, т.к.
|
||||
замешивать будем сразу по 1 вертикальной линии. Эти 2 буфера инициализируются заново при каждой смене
|
||||
цвета функцией PreparePrintColors (это делается автоматически, вам не нужно об этом заботиться!).
|
||||
Печатаем функцией TextOut.
|
||||
|
||||
операция | - поразрядное логическое ИЛИ (на Z80 CPU команда or)
|
||||
операция ^ - поразрядное исключение ИЛИ (на Z80 CPU команда xor)
|
||||
|
||||
Функция PreparePrintColors:
|
||||
1. инициализируем ForegroundBuffer
|
||||
ForegroundBuffer = цвет Foreground ^ 0xFF
|
||||
2. инициализируем BackgroundBuffer
|
||||
BackgroundBuffer = цвет Background ^ ForegroundBuffer
|
||||
|
||||
Функция TextOut (входные параметры см. в исходнике):
|
||||
непосредственно печать образа:
|
||||
Screen = (линия_образа | BackgroundBuffer) ^ ForegroundBuffer
|
||||
|
||||
Рассмотрим это на уровне точки:
|
||||
цвет печати допустим Background = 0, Foreground = 1
|
||||
|
||||
получаем ForegroundBuffer = 1 ^ 0xFF получаем 0xFE
|
||||
получаем BackgroundBuffer = 0 ^ 0xFE получаем 0xFE
|
||||
|
||||
для цвета background из образа (=0x00)
|
||||
Screen = (0x00 | 0xFE) ^ 0xFE получаем 0x00
|
||||
|
||||
для цвета foreground из образа (=0xFF)
|
||||
Screen = (0xFF | 0xFE) ^ 0xFE получаем 0x01
|
||||
|
||||
можно всё это проделать для любого из цветов...
|
||||
|
||||
Этот алгоритм работает медленнее при печати очень маленьких строк, из-за большой инициализации, а также из-за
|
||||
частой смены цвета (хотя я во Flex Navigato'e его часто не менял, только по надобности). ;)
|
||||
|
||||
27 june 2002
|
||||
Anton Enin (C) Copyright 2002 R-lab
|
||||
если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме.
|
||||
Reference in New Issue
Block a user