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>
98 lines
7.2 KiB
Plaintext
98 lines
7.2 KiB
Plaintext
Акселератор компьютера Sprinter.
|
|
|
|
Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ.
|
|
|
|
Акселератор позволяет:
|
|
|
|
- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек)
|
|
- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек)
|
|
- проводить быстрые операции AND, OR, XOR с блоками памяти.
|
|
|
|
Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ.
|
|
|
|
ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ.
|
|
Операции по пересылке данных производятся путем записи блока данных в это
|
|
внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора.
|
|
Блок данных, записываемый в ОЗУ акселератора может иметь различную
|
|
длинну из диапазона 1..256 байт.
|
|
|
|
После одной записи копирование может производиться несколько раз и, таким
|
|
образом, можно производить заполнение экрана текстурами.
|
|
|
|
Для заполнения экрана одним цветом используется другой режим
|
|
акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ
|
|
производится запись данных с шины процессора, которые в этот момент не
|
|
изменяются.
|
|
|
|
Управление акселератором производится непосредственно из программы.
|
|
Для этого изпользуются команды процессора, которые, фактически, являются
|
|
операциями типа NOP.
|
|
|
|
LD B,B - выключить акселетарор.
|
|
LD D,D - включить акселератор в режим приема байта размера блока
|
|
далее следует команда типа LD A,dat, где dat и будет новым
|
|
размером блока. Если размер блока был установлен ранее,
|
|
его можно не устанавливать.
|
|
LD C,C - Операция Fill - заполнение одним байтом. Последующая
|
|
команда типа LD (HL),A приведет к заполнению указанного
|
|
ранее количества байт значением A
|
|
LD E,E - Операция Fill для графического экрана - заполнение
|
|
вертикальных линий.
|
|
LD H,H - rezerved
|
|
LD L,L - копирование блока. Последующая команда типа LD A,(HL)
|
|
приведет к заполнению ОЗУ акселератора данными из адреса (HL),
|
|
а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ
|
|
акселератора в ОЗУ или видео-ОЗУ.
|
|
LD A,A - копирование блока для графического экрана подобна команде
|
|
LD L,L, но работает с вертикальными линиями экрана.
|
|
|
|
Пример использования акселератора:
|
|
|
|
; Считаем, что экранная страница уже открыта по адресу #C000
|
|
LD HL,#C040 ; адрес начала линии первого экрана
|
|
LD DE,#C180 ; адрес начала линии второго экрана
|
|
LD BC,#140 ; длина экрана по горизонтали
|
|
DI ; запретить прерывания для работы с акселератором
|
|
LD D,D ; включить акселератор на установку размера блока
|
|
LD A,0 ; установить размер блока - 256 байт
|
|
LD A,A ; установить акселератор на копирование
|
|
; вертикальных линий.
|
|
LDIR ; копировать
|
|
LD B,B ; выключить акселератор
|
|
EI ; включить прерывания
|
|
|
|
|
|
|
|
Эта часть программы произведет копирование всего содержимого первого экрана на другой.
|
|
Время исполения составляет примерно 26 милисекунд.
|
|
|
|
Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом.
|
|
Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL).
|
|
|
|
Пример кодирования блока в 256 байт.
|
|
|
|
LD HL,ADRES_1
|
|
LD DE,XOR_DAT
|
|
DI
|
|
LD D,D
|
|
LD A,0 ; число байт, которые надо закодировать
|
|
LD L,L
|
|
LD A,(DE) ; взять блок данных в ОЗУ акселератора
|
|
XOR (HL) ; произвести операцию XOR с данными акселератора
|
|
LD (HL),A ; запомнить в ОЗУ результат операции
|
|
LD B,B
|
|
EI
|
|
|
|
|
|
Скорость работы акселератора ограничивается только физической
|
|
скоростью работы основного ОЗУ. Определить примерное время работы команды с
|
|
акселератором можно по такой формуле:
|
|
|
|
Время работы = время работы команды без акселератора + время работы
|
|
акселератора
|
|
|
|
Время работы акселератора = число пересылаемых байт /7 микросекунд
|
|
|
|
Во время работы акселератора необходимо отключать прерывания, так как в этот момент
|
|
изменяется система команд процессора и программа на прерывании не сможет работать корректно.
|