libbgi: выделить графику BGI в отдельную библиотеку + тест спрайтов
Графика вынесена из libc/ в новую библиотеку libbgi/:
- common/ — mode-agnostic математика и состояние (один исходник,
.rel попадает в оба driver-архива);
- bgi256/ + bgi16/ — mode-specific leaf'ы (raw-плот/чтение/спаны);
- include/ — graphics.h + gfx.h; _bgi.h — внутренний заголовок.
Собираются lib/bgi256.lib (и bgi16.lib в Фазе 2); выбор режима
линковкой через sprinter-cc --gfx 256|16. libc/ теперь без графики.
tests/bgi_img — тест спрайтов getimage/putimage/imagesize (5 операций
COPY/XOR/OR/AND/NOT + XOR-round-trip + self-check imagesize).
Проверен автотестом в MAME.
Примечание: make size-check пока красный (gfx_dbuf/gfx_demo выросли
после реорга) — закрыть по завершении миграции libbgi.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
|
|
||||||
# `build/` directories anywhere in the tree
|
# `build/` directories anywhere in the tree
|
||||||
# (top-level build/, lib/build/, toolchain/*/build/, ...)
|
# (top-level build/, libc/build/, libbgi/build/, toolchain/*/build/, ...)
|
||||||
build/
|
build/
|
||||||
|
|
||||||
# sprinter-cc per-example intermediate directory
|
# sprinter-cc per-example intermediate directory
|
||||||
@@ -40,7 +40,7 @@ tests/*/*.cdb
|
|||||||
tests/*/*.mem
|
tests/*/*.mem
|
||||||
tests/*/*.rst
|
tests/*/*.rst
|
||||||
|
|
||||||
# libc archive (built from libc/, see lib/Makefile)
|
# libc + libbgi archives (built by libc/Makefile + libbgi/Makefile)
|
||||||
lib/*.lib
|
lib/*.lib
|
||||||
|
|
||||||
# Host-built mkexe binary + test outputs (input fixtures *.bin/*.ihx kept)
|
# Host-built mkexe binary + test outputs (input fixtures *.bin/*.ihx kept)
|
||||||
|
|||||||
@@ -6,20 +6,26 @@ Target-слой SDCC 4.5 (z80) для компьютера Sprinter Sp2000: crt0
|
|||||||
## Сборка и проверка
|
## Сборка и проверка
|
||||||
|
|
||||||
```
|
```
|
||||||
make # tools + lib + все тесты (43) + examples
|
make # tools + lib + libbgi + все тесты (45) + examples
|
||||||
make -C lib # только libc → lib/sprinter.lib
|
make -C libc # только libc → lib/sprinter.lib
|
||||||
|
make -C libbgi # только BGI → lib/bgi256.lib (и bgi16.lib в Фазе 2)
|
||||||
make floppy # упаковать все .exe в mame/v306/IMG/mc.img
|
make floppy # упаковать все .exe в mame/v306/IMG/mc.img
|
||||||
make size-check # размерный регресс: _CODE vs docs/size_baseline.tsv
|
make size-check # размерный регресс: _CODE vs docs/size_baseline.tsv
|
||||||
make size-baseline # принять текущие размеры эталоном
|
make size-baseline # принять текущие размеры эталоном
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Графика (BGI) — отдельная библиотека libbgi/ (см. ниже). Программа,
|
||||||
|
использующая graphics.h, собирается с `--gfx 256` (или `--gfx 16` в
|
||||||
|
Фазе 2): sprinter-cc подлинкует lib/bgi256.lib и добавит -I libbgi/include.
|
||||||
|
|
||||||
Одиночный тест: `cd tests/<имя> && make run` (пакует ТОЛЬКО этот exe
|
Одиночный тест: `cd tests/<имя> && make run` (пакует ТОЛЬКО этот exe
|
||||||
+ EXTRA_DATA на дискету и запускает MAME). Тесты в MAME гоняет
|
+ EXTRA_DATA на дискету и запускает MAME). Тесты в MAME гоняет
|
||||||
пользователь — готовь дискету и проси прогнать.
|
пользователь — готовь дискету и проси прогнать.
|
||||||
|
|
||||||
После правок libc: пересборка от чистого листа (`make -C lib clean`)
|
После правок libc/libbgi: пересборка от чистого листа (`make -C libc clean`
|
||||||
не обязательна — stale .rel чистятся автоматически; `make size-check`
|
/ `make -C libbgi clean`) не обязательна — stale .rel чистятся
|
||||||
обязателен (рост _CODE без причины — регрессия).
|
автоматически; `make size-check` обязателен (рост _CODE без причины —
|
||||||
|
регрессия).
|
||||||
|
|
||||||
## Правила libc
|
## Правила libc
|
||||||
|
|
||||||
@@ -29,7 +35,7 @@ make size-baseline # принять текущие размеры эталон
|
|||||||
(`_`-префикс); общие статики — в отдельные data-модули
|
(`_`-префикс); общие статики — в отдельные data-модули
|
||||||
(`_xxx_state.c`); internal-заголовки (`_file.h`, `_gfx.h`, …) —
|
(`_xxx_state.c`); internal-заголовки (`_file.h`, `_gfx.h`, …) —
|
||||||
рядом с исходниками, НЕ в libc/include.
|
рядом с исходниками, НЕ в libc/include.
|
||||||
- Имя файла = имя функции. lib/Makefile собирает wildcard'ом —
|
- Имя файла = имя функции. libc/Makefile собирает wildcard'ом —
|
||||||
ничего регистрировать не надо.
|
ничего регистрировать не надо.
|
||||||
- Комментарии — на русском; шапка модуля объясняет что/зачем + ABI.
|
- Комментарии — на русском; шапка модуля объясняет что/зачем + ABI.
|
||||||
- File-scope переменные НЕ инициализировать `= 0` (crt0 зануляет
|
- File-scope переменные НЕ инициализировать `= 0` (crt0 зануляет
|
||||||
@@ -54,12 +60,13 @@ make size-baseline # принять текущие размеры эталон
|
|||||||
лимит 8 файловых манипуляторов, 9-й OPEN ВЕШАЕТ DSS (_fd_guard);
|
лимит 8 файловых манипуляторов, 9-й OPEN ВЕШАЕТ DSS (_fd_guard);
|
||||||
ENV $46: A=0 = NOT FOUND.
|
ENV $46: A=0 = NOT FOUND.
|
||||||
- Перед обвинением компилятора/железа — подтвердить артефактом
|
- Перед обвинением компилятора/железа — подтвердить артефактом
|
||||||
(сгенерированный .asm в lib/build/, дамп, репро) — см.
|
(сгенерированный .asm в libc/build/ или libbgi/build/, дамп, репро) — см.
|
||||||
memory/defer_unexplained_quirks.
|
memory/defer_unexplained_quirks.
|
||||||
|
|
||||||
## Структура
|
## Структура
|
||||||
|
|
||||||
- `libc/<area>/*.c` — модули libc; `libc/include/` — публичные заголовки
|
- `libc/<area>/*.c` — модули libc (ядро, БЕЗ графики); `libc/include/` — публичные заголовки libc
|
||||||
|
- `libbgi/` — графика BGI (отдельная библиотека): `common/` — mode-agnostic (один исходник, .rel в обеих driver-библиотеках), `bgi256/` + `bgi16/` — mode-specific leaf'ы (реальные реализации, без обёрток); `include/` — graphics.h + gfx.h; `_bgi.h` — внутренний заголовок. Собирает `lib/bgi256.lib` (и `bgi16.lib` в Фазе 2). Выбор режима линковкой: `--gfx 256` / `--gfx 16`.
|
||||||
- `runtime/` — crt0-семейство, heap, bank (bank.s собирается per-build)
|
- `runtime/` — crt0-семейство, heap, bank (bank.s собирается per-build)
|
||||||
- `bin/sprinter-cc` — обёртка компилятора; `toolchain/mkexe` — упаковщик
|
- `bin/sprinter-cc` — обёртка компилятора; `toolchain/mkexe` — упаковщик
|
||||||
- `tests/` — по одному API/фиче; `examples/` — реальные приложения
|
- `tests/` — по одному API/фиче; `examples/` — реальные приложения
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# make build host tools, libc archive, all tests, all apps
|
# make build host tools, libc archive, all tests, all apps
|
||||||
# make tools build only host tools (mkexe)
|
# make tools build only host tools (mkexe)
|
||||||
# make lib build lib/sprinter.lib (libc archive used by sprinter-cc)
|
# make lib build lib/sprinter.lib (libc) + lib/bgi256.lib (libbgi)
|
||||||
# make tests build all libc feature tests under tests/
|
# make tests build all libc feature tests under tests/
|
||||||
# make examples build all real applications under examples/
|
# make examples build all real applications under examples/
|
||||||
# make floppy package every .exe + test fixtures into mame/v306/IMG/mc.img
|
# make floppy package every .exe + test fixtures into mame/v306/IMG/mc.img
|
||||||
@@ -18,8 +18,9 @@ TESTS := hello hello2 simple banked bankedbg banktest strtest cat seek \
|
|||||||
attrprob timedir mouse banklocl stdlib assrtest ptime stattest \
|
attrprob timedir mouse banklocl stdlib assrtest ptime stattest \
|
||||||
filetest fdmax fbench solidt irqtest cbltest cblwav dec_test gets stest2 winrest \
|
filetest fdmax fbench solidt irqtest cbltest cblwav dec_test gets stest2 winrest \
|
||||||
bios_text text_palette \
|
bios_text text_palette \
|
||||||
gfx_demo gfx_d16 gfx_text gfx_mous gfx_dbuf
|
gfx_demo gfx_dbuf
|
||||||
|
# gfx_d16 / gfx_text / gfx_mous — 16-цветные; убраны до Фазы 2 (bgi16.lib
|
||||||
|
# ещё не собирается). Вернуть мигрированными на BGI --gfx 16.
|
||||||
# Larger end-user applications under examples/.
|
# Larger end-user applications under examples/.
|
||||||
APPS := mdview mdview2
|
APPS := mdview mdview2
|
||||||
|
|
||||||
@@ -46,7 +47,8 @@ tools:
|
|||||||
$(MAKE) -C toolchain/mkexe
|
$(MAKE) -C toolchain/mkexe
|
||||||
|
|
||||||
lib:
|
lib:
|
||||||
$(MAKE) -C lib
|
$(MAKE) -C libc
|
||||||
|
$(MAKE) -C libbgi
|
||||||
|
|
||||||
check: tools
|
check: tools
|
||||||
$(MAKE) -C toolchain/mkexe check
|
$(MAKE) -C toolchain/mkexe check
|
||||||
@@ -81,7 +83,8 @@ size-baseline:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C toolchain/mkexe clean
|
$(MAKE) -C toolchain/mkexe clean
|
||||||
$(MAKE) -C lib clean
|
$(MAKE) -C libc clean
|
||||||
|
$(MAKE) -C libbgi clean
|
||||||
@for t in $(TESTS); do $(MAKE) -C tests/$$t clean; done
|
@for t in $(TESTS); do $(MAKE) -C tests/$$t clean; done
|
||||||
@for a in $(APPS); do $(MAKE) -C examples/$$a clean; done
|
@for a in $(APPS); do $(MAKE) -C examples/$$a clean; done
|
||||||
|
|
||||||
|
|||||||
@@ -62,8 +62,13 @@ $(EXAMPLE).exe: $(SOURCES) $(MKEXE) $(LIB) $(RUNTIME_DEPS)
|
|||||||
$(MKEXE):
|
$(MKEXE):
|
||||||
$(MAKE) -C $(PROJ_ROOT)/toolchain/mkexe
|
$(MAKE) -C $(PROJ_ROOT)/toolchain/mkexe
|
||||||
|
|
||||||
|
# $(LIB) = lib/sprinter.lib (libc). Графика (bgi256.lib) собирает
|
||||||
|
# libbgi/Makefile; гоним и его — иначе standalone `make` в тесте с
|
||||||
|
# --gfx 256 не найдёт bgi256.lib при линковке. Оба инкрементальные,
|
||||||
|
# на повторном запуске ничего не пересобирают.
|
||||||
$(LIB):
|
$(LIB):
|
||||||
$(MAKE) -C $(PROJ_ROOT)/lib
|
$(MAKE) -C $(PROJ_ROOT)/libc
|
||||||
|
$(MAKE) -C $(PROJ_ROOT)/libbgi
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf .sprinter-cc-* $(EXAMPLE).exe
|
rm -rf .sprinter-cc-* $(EXAMPLE).exe
|
||||||
|
|||||||
+3
-2
@@ -64,6 +64,7 @@ CHECK_BANKS="$PROJ_ROOT/toolchain/check_banks.py"
|
|||||||
RUNTIME="$PROJ_ROOT/runtime"
|
RUNTIME="$PROJ_ROOT/runtime"
|
||||||
LIB_DIR="$PROJ_ROOT/lib"
|
LIB_DIR="$PROJ_ROOT/lib"
|
||||||
INC_DIR="$PROJ_ROOT/libc/include"
|
INC_DIR="$PROJ_ROOT/libc/include"
|
||||||
|
BGI_INC_DIR="$PROJ_ROOT/libbgi/include" # gfx.h, graphics.h (BGI)
|
||||||
|
|
||||||
# ------- Defaults ------------------------------------------------------------
|
# ------- Defaults ------------------------------------------------------------
|
||||||
OUT=""
|
OUT=""
|
||||||
@@ -129,7 +130,7 @@ done
|
|||||||
GFX_LD=()
|
GFX_LD=()
|
||||||
case "$GFX_MODE" in
|
case "$GFX_MODE" in
|
||||||
"") ;; # graphics.h не используется
|
"") ;; # graphics.h не используется
|
||||||
256) GFX_LD=("-lsprinter_gfx256");;
|
256) GFX_LD=("-lbgi256");; # libbgi/bgi256 → lib/bgi256.lib
|
||||||
16) echo "sprinter-cc: --gfx 16 ещё не реализован (пока только 256)" >&2; exit 1;;
|
16) echo "sprinter-cc: --gfx 16 ещё не реализован (пока только 256)" >&2; exit 1;;
|
||||||
*) echo "sprinter-cc: --gfx: ожидается 256 (или 16), дано: $GFX_MODE" >&2; exit 1;;
|
*) echo "sprinter-cc: --gfx: ожидается 256 (или 16), дано: $GFX_MODE" >&2; exit 1;;
|
||||||
esac
|
esac
|
||||||
@@ -288,7 +289,7 @@ run "$SDASZ80" -o "$HEAP_TOP_REL" "$HEAP_TOP_SRC"
|
|||||||
|
|
||||||
# 2. user sources → .rel (HOME)
|
# 2. user sources → .rel (HOME)
|
||||||
USER_RELS=()
|
USER_RELS=()
|
||||||
CC_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size -I "$INC_DIR" "${USER_INCS[@]}")
|
CC_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size -I "$INC_DIR" -I "$BGI_INC_DIR" "${USER_INCS[@]}")
|
||||||
[[ $DEBUG_RT -eq 1 ]] && CC_FLAGS+=(-DDEBUG_RT)
|
[[ $DEBUG_RT -eq 1 ]] && CC_FLAGS+=(-DDEBUG_RT)
|
||||||
[[ -n "$MAX_ALLOCS" ]] && CC_FLAGS+=(--max-allocs-per-node "$MAX_ALLOCS")
|
[[ -n "$MAX_ALLOCS" ]] && CC_FLAGS+=(--max-allocs-per-node "$MAX_ALLOCS")
|
||||||
for src in "${SOURCES[@]}"; do
|
for src in "${SOURCES[@]}"; do
|
||||||
|
|||||||
+11
-3
@@ -32,9 +32,15 @@ SDCC-версию) и дальше только добавляет Sprinter-ра
|
|||||||
|
|
||||||
## 3. Свои заголовки (SDCC-аналога нет — затенения нет)
|
## 3. Свои заголовки (SDCC-аналога нет — затенения нет)
|
||||||
|
|
||||||
conio.h, dir.h, dos.h, errno.h, fcntl.h, gfx.h, mouse.h, palette.h,
|
conio.h, dir.h, dos.h, errno.h, fcntl.h, mouse.h, palette.h,
|
||||||
sprinter*.h, unistd.h, bios/*.
|
sprinter*.h, unistd.h, bios/*.
|
||||||
|
|
||||||
|
Графика вынесена из libc в отдельную библиотеку libbgi/: её публичные
|
||||||
|
заголовки gfx.h (mode-agnostic BGI_GFX) и graphics.h (BGI API) живут в
|
||||||
|
libbgi/include/ и пробрасываются через -I libbgi/include (sprinter-cc
|
||||||
|
добавляет его автоматически). Внутренний заголовок графики —
|
||||||
|
libbgi/_bgi.h (слияние старых libc/gfx/_gfx.h и libc/bgi/_bgi.h).
|
||||||
|
|
||||||
## Правила
|
## Правила
|
||||||
|
|
||||||
- новый стандартный заголовок — сначала пробовать паттерн 1
|
- новый стандартный заголовок — сначала пробовать паттерн 1
|
||||||
@@ -42,5 +48,7 @@ sprinter*.h, unistd.h, bios/*.
|
|||||||
реализацию (как puts/putchar на ESTEX);
|
реализацию (как puts/putchar на ESTEX);
|
||||||
- в заголовках паттерна 2 — комментарий, какие декларации обслуживают
|
- в заголовках паттерна 2 — комментарий, какие декларации обслуживают
|
||||||
z80.lib;
|
z80.lib;
|
||||||
- internal-заголовки libc (`_conio.h`, `_file.h`, `_gfx.h`, …) живут
|
- internal-заголовки libc (`_conio.h`, `_file.h`, …) живут
|
||||||
РЯДОМ с исходниками в libc/<area>/, не в libc/include.
|
РЯДОМ с исходниками в libc/<area>/, не в libc/include. Internal
|
||||||
|
графики — в libbgi/_bgi.h (корень libbgi/, подключается из common/ и
|
||||||
|
bgi256/bgi16/ как `#include "../_bgi.h"`).
|
||||||
|
|||||||
+22
-11
@@ -180,7 +180,13 @@ wrchar rdchar`; режимы `gettextmode/settextmode` (0x02=40×32,
|
|||||||
`bios_fillchar/fillattr/fillcharattr`, `bios_clearwin[_ch]`,
|
`bios_fillchar/fillattr/fillcharattr`, `bios_clearwin[_ch]`,
|
||||||
`bios_scrollwin`. Строка s — в #4000–#BFFF; place продвигается.
|
`bios_scrollwin`. Строка s — в #4000–#BFFF; place продвигается.
|
||||||
|
|
||||||
## <gfx.h> — графика (0x81: 320×256×256; 0x82: 640×256×16)
|
## <gfx.h> — графика, mode-agnostic API (BGI_GFX); живёт в libbgi/include
|
||||||
|
|
||||||
|
Рисование (putpixel/line/bar/circle/…) вынесено в BGI — см. `<graphics.h>`
|
||||||
|
и driver-библиотеки lib/bgi256.lib / lib/bgi16.lib (выбор режима линковкой:
|
||||||
|
`sprinter-cc --gfx 256` / `--gfx 16`). В gfx.h остались только функции
|
||||||
|
БЕЗ BGI-аналога (mode-agnostic, живут в libbgi/common/, .rel в обеих
|
||||||
|
driver-библиотеках):
|
||||||
|
|
||||||
Setup: `gfx_init(mode,page)→prev`, `gfx_done(prev)`.
|
Setup: `gfx_init(mode,page)→prev`, `gfx_done(prev)`.
|
||||||
Страницы/банк: `gfx_set/get_visible_page`, `gfx_set/get_draw_page`
|
Страницы/банк: `gfx_set/get_visible_page`, `gfx_set/get_draw_page`
|
||||||
@@ -199,14 +205,13 @@ Setup: `gfx_init(mode,page)→prev`, `gfx_done(prev)`.
|
|||||||
использования с реальным CBL-звуком. Фолбэк на одно кадровое
|
использования с реальным CBL-звуком. Фолбэк на одно кадровое
|
||||||
прерывание (`halt`), если бит не ведёт себя как ожидается за разумное
|
прерывание (`halt`), если бит не ведёт себя как ожидается за разумное
|
||||||
число попыток.
|
число попыток.
|
||||||
Примитивы (суффикс _256 / _16): `clear putpixel hline vline line
|
Шрифт: `gfx_load_default_font`, `gfx_set_font(ptr)` (interleaved
|
||||||
rect fill_rect` — через акселератор (hline/vline burst до 256 байт;
|
font[row*256+char]) — грузится лениво при первом использовании BGI-текста.
|
||||||
в 0x82 vline через RMW). Координаты int, клиппинг по краям.
|
|
||||||
Текст: `gfx_putchar256/16, gfx_text256/16` (8×8, fg/bg; в 0x82 x —
|
|
||||||
чётный), `gfx_load_default_font`, `gfx_set_font(ptr)` (interleaved
|
|
||||||
font[row*256+char]).
|
|
||||||
Палитра: `gfx_pal_load/set/get/get_color/reset` (страницы 0..3).
|
Палитра: `gfx_pal_load/set/get/get_color/reset` (страницы 0..3).
|
||||||
`gfx_getpixel256(x,y)→color` — чтение пикселя (0x81).
|
|
||||||
|
Константы режимов: `GFX_MODE_320x256x256` (0x81), `GFX_MODE_640x256x16`
|
||||||
|
(0x82); размеры `GFX_WIDTH/HEIGHT` (320/256), `GFX_WIDTH_16/HEIGHT_16`
|
||||||
|
(640/256). Рисование через `<graphics.h>` (BGI).
|
||||||
|
|
||||||
## <graphics.h> — Turbo-C BGI (функц. совместимость), Фаза 1, режим 256
|
## <graphics.h> — Turbo-C BGI (функц. совместимость), Фаза 1, режим 256
|
||||||
|
|
||||||
@@ -237,9 +242,15 @@ drawpoly.
|
|||||||
Стиль текста (Ф2d): `settextstyle(font,dir,size)`/`gettextsettings`,
|
Стиль текста (Ф2d): `settextstyle(font,dir,size)`/`gettextsettings`,
|
||||||
`textwidth`/`textheight` — масштаб 1..10, HORIZ/VERT, прозрачный фон
|
`textwidth`/`textheight` — масштаб 1..10, HORIZ/VERT, прозрачный фон
|
||||||
(только DEFAULT_FONT 8×8).
|
(только DEFAULT_FONT 8×8).
|
||||||
Реализация: libc/bgi/*.c (math) + libc/bgi/drv256/*.c (leaf →
|
Реализация: libbgi/common/*.c (mode-agnostic math + BGI public API +
|
||||||
sprinter_gfx256.lib). Пакетные примитивы — одна W3-скобка на примитив;
|
BGI_GFX) + libbgi/bgi256/*.c (256-цветные leaf'ы) → lib/bgi256.lib
|
||||||
тригонометрия/эллипсы целочисленные (Q7/isqrt, БЕЗ 32-бит).
|
(Фаза 2 добавит libbgi/bgi16/*.c → lib/bgi16.lib; common .rel одни и
|
||||||
|
те же в обоих архивах). Leaf'ы — реальные реализации (БЕЗ обёрток:
|
||||||
|
putpixel/getpixel полностью inline, _bgi_plot_raw/_bgi_hspan_raw/...
|
||||||
|
поглощают акселераторный asm). Пакетные примитивы — одна W3-скобка
|
||||||
|
на примитив; тригонометрия/эллипсы целочисленные (Q7/isqrt, БЕЗ 32-бит).
|
||||||
|
Cross-lib: libbgi всегда линкуется с libc; _cbl_port_ref/unref
|
||||||
|
объявлены extern в libbgi/_bgi.h (сверять с libc/cbl/_cbl.h).
|
||||||
Ф2d (осталось): setviewport/клиппинг, settextjustify, setaspectratio —
|
Ф2d (осталось): setviewport/клиппинг, settextjustify, setaspectratio —
|
||||||
см. docs/TODO.md.
|
см. docs/TODO.md.
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ fgetpos/fsetpos (хвост П2). bdos/brk/ioctl — отказ решение
|
|||||||
(stdio.h, time.h — обязаны дублировать сигнатуры z80.lib);
|
(stdio.h, time.h — обязаны дублировать сигнатуры z80.lib);
|
||||||
из sprinter_compat.h убраны макросы min/max (конфликтовали с
|
из sprinter_compat.h убраны макросы min/max (конфликтовали с
|
||||||
функциями из stdlib.h; в Solid-C это тоже функции)
|
функциями из stdlib.h; в Solid-C это тоже функции)
|
||||||
- [x] lib/Makefile: stale .rel чистятся сверкой списка перед упаковкой;
|
- [x] libc/Makefile: stale .rel чистятся сверкой списка перед упаковкой;
|
||||||
штамп .modules триггерит перелинковку при смене состава (и сносит
|
штамп .modules триггерит перелинковку при смене состава (и сносит
|
||||||
архив — mtime на exFAT грубый)
|
архив — mtime на exFAT грубый)
|
||||||
- [x] Все extra-тесты в top-level TESTS (43 программы: + hello2, simple,
|
- [x] Все extra-тесты в top-level TESTS (43 программы: + hello2, simple,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ banked 1056
|
|||||||
bankedbg 1067
|
bankedbg 1067
|
||||||
banklocl 4832
|
banklocl 4832
|
||||||
banktest 3767
|
banktest 3767
|
||||||
|
bgi_img 6218
|
||||||
bgitest 4196
|
bgitest 4196
|
||||||
bios_text 4470
|
bios_text 4470
|
||||||
cat 915
|
cat 915
|
||||||
|
|||||||
|
-104
@@ -1,104 +0,0 @@
|
|||||||
# Build lib/libsprinter.lib — the Sprinter target libc archive.
|
|
||||||
#
|
|
||||||
# Includes all libc/*.c modules plus the runtime helpers that get
|
|
||||||
# auto-pulled by SDCC's codegen (heap for malloc, bank trampolines for
|
|
||||||
# __banked). The crt0 family is NOT in the lib — they are always
|
|
||||||
# explicitly linked, never DCE-eligible.
|
|
||||||
#
|
|
||||||
# Each .c file becomes its own .rel inside the archive. The linker
|
|
||||||
# pulls only those .rel files whose exported symbols are referenced,
|
|
||||||
# giving free dead-code elimination at module granularity.
|
|
||||||
|
|
||||||
PROJ_ROOT := $(abspath $(CURDIR)/..)
|
|
||||||
SDCC_BIN := $(PROJ_ROOT)/third_party/sdcc/bin
|
|
||||||
SDCC := $(SDCC_BIN)/sdcc
|
|
||||||
SDAR := $(SDCC_BIN)/sdar
|
|
||||||
SDASZ80 := $(SDCC_BIN)/sdasz80
|
|
||||||
|
|
||||||
INC := -I$(PROJ_ROOT)/libc/include
|
|
||||||
CC_FLAGS := -mz80 --no-std-crt0 --std-c99 --opt-code-size $(INC)
|
|
||||||
|
|
||||||
BUILD := $(PROJ_ROOT)/lib/build
|
|
||||||
|
|
||||||
# All libc C modules — every .c under libc/<area>/ becomes its own .rel.
|
|
||||||
# One PUBLIC function per file (see docs/libc-split-asm-cases.md): the
|
|
||||||
# linker pulls whole .rel modules, so file granularity == DCE granularity.
|
|
||||||
# Внимание: `libc/*/*.c` — ровно ОДИН уровень вложенности, поэтому
|
|
||||||
# ловит mode-agnostic BGI-математику libc/bgi/*.c (идёт в sprinter.lib),
|
|
||||||
# но НЕ ловит driver-leaf'ы libc/bgi/drv256/*.c (два уровня) — они
|
|
||||||
# собираются в ОТДЕЛЬНЫЙ архив sprinter_gfx256.lib (выбор режима
|
|
||||||
# линковкой; см. memory/bgi_two_lib_design).
|
|
||||||
LIBC_C := $(patsubst $(PROJ_ROOT)/%,%,$(wildcard $(PROJ_ROOT)/libc/*/*.c))
|
|
||||||
|
|
||||||
# Driver-leaf'ы 256-цветного BGI → sprinter_gfx256.lib.
|
|
||||||
GFX256_C := $(patsubst $(PROJ_ROOT)/%,%,$(wildcard $(PROJ_ROOT)/libc/bgi/drv256/*.c))
|
|
||||||
|
|
||||||
# Runtime modules to bundle (pulled by symbol references from libc-using code).
|
|
||||||
# NOTE: runtime/bank.s is NOT bundled — its trampoline depends on the banking
|
|
||||||
# window (W1 for BIG, W3 for HUGE) which is decided per-build by sprinter-cc.
|
|
||||||
# That tool assembles bank.s on each banked build with the right BANK_W1 flag.
|
|
||||||
RUNTIME_S := runtime/heap.s
|
|
||||||
|
|
||||||
LIBC_RELS := $(patsubst libc/%.c,$(BUILD)/%.rel,$(LIBC_C))
|
|
||||||
GFX256_RELS := $(patsubst libc/%.c,$(BUILD)/%.rel,$(GFX256_C))
|
|
||||||
RUNTIME_RELS := $(patsubst runtime/%.s,$(BUILD)/%.rel,$(RUNTIME_S))
|
|
||||||
|
|
||||||
# Члены основной sprinter.lib.
|
|
||||||
ALL_RELS := $(LIBC_RELS) $(RUNTIME_RELS)
|
|
||||||
# Всё, что вообще собираем (для штампа и чистки stale — иначе .rel'ы
|
|
||||||
# драйвера сочтутся «осиротевшими» и будут удалены).
|
|
||||||
KNOWN_RELS := $(ALL_RELS) $(GFX256_RELS)
|
|
||||||
|
|
||||||
# Штамп списка модулей: обновляется при любом изменении состава
|
|
||||||
# (добавление/удаление/переименование исходника) — иначе удаление
|
|
||||||
# исходника не триггерит перелинковку и stale .rel остаётся в архиве.
|
|
||||||
# Сразу сносим и архив: на exFAT (SAM8) гранулярность mtime грубая,
|
|
||||||
# и «список изменился» через сравнение времён можно проглядеть.
|
|
||||||
MODLIST := $(BUILD)/.modules
|
|
||||||
ifneq ($(shell cat $(MODLIST) 2>/dev/null),$(KNOWN_RELS))
|
|
||||||
_ := $(shell mkdir -p $(BUILD); echo "$(KNOWN_RELS)" > $(MODLIST); rm -f sprinter.lib sprinter_gfx256.lib)
|
|
||||||
endif
|
|
||||||
|
|
||||||
LIB := sprinter.lib
|
|
||||||
GFX256_LIB := sprinter_gfx256.lib
|
|
||||||
|
|
||||||
all: $(LIB) $(GFX256_LIB)
|
|
||||||
|
|
||||||
# Pattern rule for C modules — preserves the libc/io|mem|stdio path
|
|
||||||
# so .rel members keep their natural names inside the archive.
|
|
||||||
$(BUILD)/%.rel: $(PROJ_ROOT)/libc/%.c
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(SDCC) $(CC_FLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
# Runtime .s → .rel
|
|
||||||
$(BUILD)/%.rel: $(PROJ_ROOT)/runtime/%.s
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(SDASZ80) -o $@ $<
|
|
||||||
|
|
||||||
# Archive — sdar with `rcs` = replace/create/symtab.
|
|
||||||
# Перед упаковкой удаляем stale .rel: wildcard не знает об удалённых/
|
|
||||||
# переименованных исходниках, и осиротевший .rel из build/ иначе жил бы
|
|
||||||
# вечно (уже кусало: старый file.rel после сплита).
|
|
||||||
$(LIB): $(ALL_RELS) $(MODLIST)
|
|
||||||
@find $(BUILD) -name '*.rel' -print | sort > $(BUILD)/.have
|
|
||||||
@printf '%s\n' $(KNOWN_RELS) | sort > $(BUILD)/.want
|
|
||||||
@comm -23 $(BUILD)/.have $(BUILD)/.want | while read f; do \
|
|
||||||
echo " stale: $$f (исходник удалён) — rm"; \
|
|
||||||
rm -f "$$f" "$${f%.rel}.asm" "$${f%.rel}.lst" "$${f%.rel}.sym"; \
|
|
||||||
done
|
|
||||||
rm -f $@
|
|
||||||
$(SDAR) -rcs $@ $(ALL_RELS)
|
|
||||||
@echo
|
|
||||||
@echo " Built $@ with $(words $(ALL_RELS)) modules:"
|
|
||||||
@$(SDAR) -t $@ | sed 's/^/ /'
|
|
||||||
|
|
||||||
# Driver-архив 256-цветного BGI: только leaf'ы drv256/.
|
|
||||||
$(GFX256_LIB): $(GFX256_RELS) $(MODLIST)
|
|
||||||
rm -f $@
|
|
||||||
$(SDAR) -rcs $@ $(GFX256_RELS)
|
|
||||||
@echo " Built $@ with $(words $(GFX256_RELS)) modules."
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILD) $(LIB) $(GFX256_LIB)
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# Build lib/bgi256.lib — Sprinter BGI graphics driver (320×256×256).
|
||||||
|
#
|
||||||
|
# libbgi/ — самостоятельная графическая библиотека, отделённая от libc.
|
||||||
|
# Две driver-библиотеки собираются из одной исходной базы:
|
||||||
|
# bgi256.lib = common/*.rel + bgi256/*.rel (эта — Фаза 1)
|
||||||
|
# bgi16.lib = common/*.rel + bgi16/*.rel (Фаза 2; пока не собирается)
|
||||||
|
# common/ — mode-agnostic: .rel компилируется ОДИН раз и кладётся в ОБА
|
||||||
|
# архива (один исходник для функций, общих 256- и 16-цветной версиям).
|
||||||
|
# bgi256/ — mode-specific leaf'ы (реальные реализации, без обёрток).
|
||||||
|
#
|
||||||
|
# Каждый .c — отдельный .rel в архиве (1 публичная функция = 1 модуль);
|
||||||
|
# линкер тянет только нужные .rel → DCE на уровне файлов. См. план
|
||||||
|
# «Рефакторинг GFX → BGI» и memory/bgi_two_lib_design.
|
||||||
|
#
|
||||||
|
# make build lib/bgi256.lib
|
||||||
|
# make clean remove build/ + lib/bgi256.lib
|
||||||
|
#
|
||||||
|
# (Фаза 2 добавит bgi16.lib = common + bgi16; common .rel переиспользуются.)
|
||||||
|
|
||||||
|
PROJ_ROOT := $(abspath $(CURDIR)/..)
|
||||||
|
SDCC_BIN := $(PROJ_ROOT)/third_party/sdcc/bin
|
||||||
|
SDCC := $(SDCC_BIN)/sdcc
|
||||||
|
SDAR := $(SDCC_BIN)/sdar
|
||||||
|
|
||||||
|
# -I libbgi/include (gfx.h, graphics.h) + -I libc/include (palette.h,
|
||||||
|
# sprinter_exit.h — публичные заголовки libc; libbgi всегда линкуется с
|
||||||
|
# libc). SDCC stdint и пр. — из собственного include-пути SDCC.
|
||||||
|
INC := -I$(CURDIR)/include -I$(PROJ_ROOT)/libc/include
|
||||||
|
CC_FLAGS := -mz80 --no-std-crt0 --std-c99 --opt-code-size $(INC)
|
||||||
|
|
||||||
|
BUILD := $(CURDIR)/build
|
||||||
|
|
||||||
|
COMMON_C := $(wildcard $(CURDIR)/common/*.c)
|
||||||
|
BGI256_C := $(wildcard $(CURDIR)/bgi256/*.c)
|
||||||
|
# BGI16_C := $(wildcard $(CURDIR)/bgi16/*.c) # Фаза 2
|
||||||
|
|
||||||
|
COMMON_RELS := $(patsubst $(CURDIR)/common/%.c,$(BUILD)/common/%.rel,$(COMMON_C))
|
||||||
|
BGI256_RELS := $(patsubst $(CURDIR)/bgi256/%.c,$(BUILD)/bgi256/%.rel,$(BGI256_C))
|
||||||
|
KNOWN_RELS := $(COMMON_RELS) $(BGI256_RELS)
|
||||||
|
|
||||||
|
LIB_DIR := $(PROJ_ROOT)/lib
|
||||||
|
LIB256 := $(LIB_DIR)/bgi256.lib
|
||||||
|
|
||||||
|
# Штамп списка модулей — иначе удаление/переименование исходника не
|
||||||
|
# триггерит перелинковку и stale .rel остаётся в архиве. На exFAT
|
||||||
|
# грубая mtime — сравниваем по списку, не по времени.
|
||||||
|
MODLIST := $(BUILD)/.modules
|
||||||
|
ifneq ($(shell cat $(MODLIST) 2>/dev/null),$(KNOWN_RELS))
|
||||||
|
_ := $(shell mkdir -p $(BUILD); echo "$(KNOWN_RELS)" > $(MODLIST); rm -f $(LIB256))
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: $(LIB256)
|
||||||
|
|
||||||
|
# Pattern rule для common/ и bgi256/ (один уровень под build/).
|
||||||
|
$(BUILD)/common/%.rel: $(CURDIR)/common/%.c
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(SDCC) $(CC_FLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
$(BUILD)/bgi256/%.rel: $(CURDIR)/bgi256/%.c
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(SDCC) $(CC_FLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
# Archive — sdar rcs = replace/create/symtab. Перед упаковкой удаляем
|
||||||
|
# stale .rel (wildcard не знает об удалённых исходниках).
|
||||||
|
$(LIB256): $(COMMON_RELS) $(BGI256_RELS) $(MODLIST)
|
||||||
|
@find $(BUILD) -name '*.rel' -print | sort > $(BUILD)/.have
|
||||||
|
@printf '%s\n' $(KNOWN_RELS) | sort > $(BUILD)/.want
|
||||||
|
@comm -23 $(BUILD)/.have $(BUILD)/.want | while read f; do \
|
||||||
|
echo " stale: $$f (исходник удалён) — rm"; \
|
||||||
|
rm -f "$$f" "$${f%.rel}.asm" "$${f%.rel}.lst" "$${f%.rel}.sym"; \
|
||||||
|
done
|
||||||
|
rm -f $@
|
||||||
|
$(SDAR) -rcs $@ $(COMMON_RELS) $(BGI256_RELS)
|
||||||
|
@echo " Built $@ with $(words $(COMMON_RELS)) common + $(words $(BGI256_RELS)) bgi256 modules."
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILD) $(LIB256)
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
+197
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* _bgi.h — внутренности графической подсистемы BGI (НЕ публичный заголовок).
|
||||||
|
*
|
||||||
|
* Слияние старых libc/bgi/_bgi.h и libc/gfx/_gfx.h. Графика вынесена из
|
||||||
|
* libc в самостоятельную библиотеку libbgi/ (см. docs + memory
|
||||||
|
* bgi_two_lib_design). Из libbgi собираются две driver-библиотеки
|
||||||
|
* (каждый .c → отдельный .rel):
|
||||||
|
* bgi256.lib ← common/ + bgi256/ (320×256×256, mode 0x81)
|
||||||
|
* bgi16.lib ← common/ + bgi16/ (640×256×16, mode 0x82)
|
||||||
|
* common/ — mode-agnostic: .rel компилируется ОДИН раз и кладётся в
|
||||||
|
* ОБА архива (один исходник для функций, общих 256- и 16-цветной
|
||||||
|
* версиям). bgi256/ и bgi16/ — mode-specific leaf'ы (реальные
|
||||||
|
* реализации, БЕЗ обёрток-делегатов). Режим выбирается линковкой
|
||||||
|
* (--gfx 256 / --gfx 16), одновременно один.
|
||||||
|
*
|
||||||
|
* Публичные leaf-символы (_bgi_plot_raw, _bgi_hspan_raw, _bgi_read_raw,
|
||||||
|
* _bgi_vspan_raw, _bgi_clear_raw, _bgi_mode_set) одинаково объявлены в
|
||||||
|
* обоих driver-каталогах, поэтому common-математика не знает режима —
|
||||||
|
* нужный .rel тянет линкер из выбранной библиотеки.
|
||||||
|
*/
|
||||||
|
#ifndef _BGI_INTERNAL_H
|
||||||
|
#define _BGI_INTERNAL_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <graphics.h>
|
||||||
|
#include <gfx.h> /* GFX_MODE_*, размеры — для внутренних таблиц */
|
||||||
|
|
||||||
|
/* ---- Состояние BGI (_bgi_state.c) -------------------------------- */
|
||||||
|
extern uint8_t _bgi_fg; /* текущий цвет рисования */
|
||||||
|
extern uint8_t _bgi_bg; /* фоновый цвет */
|
||||||
|
extern int _bgi_cx; /* текущая позиция X (CP) */
|
||||||
|
extern int _bgi_cy; /* текущая позиция Y */
|
||||||
|
extern int _bgi_maxx; /* правая граница (319 / 639) */
|
||||||
|
extern int _bgi_maxy; /* нижняя граница (255) */
|
||||||
|
extern int _bgi_maxcolor; /* макс. индекс цвета (255 / 15) */
|
||||||
|
extern uint8_t _bgi_prevmode; /* видеорежим до initgraph */
|
||||||
|
extern int _bgi_result; /* код graphresult */
|
||||||
|
|
||||||
|
/* ---- Общее gfx-состояние (common/_gfx_state.c) ------------------ *
|
||||||
|
* Пишут gfx_set_visible_page / gfx_set_draw_page /
|
||||||
|
* gfx_set_bank; читают все mode-специфичные примитивы. */
|
||||||
|
|
||||||
|
extern uint8_t _gfx_visible_page;
|
||||||
|
extern uint8_t _gfx_draw_page;
|
||||||
|
|
||||||
|
/* Байт страницы W3 (0x50..0x5F) — какой видеобанк мапится при записи.
|
||||||
|
* См. memory/sprinter_vram_transparency.md (0x50 normal, 0x54 temp,
|
||||||
|
* 0x58 transparent, 0x5C оба). */
|
||||||
|
extern uint8_t _gfx_bank;
|
||||||
|
|
||||||
|
/* CPU-адрес колонки 0 текущей draw-страницы: 0xC000 (page 0) или
|
||||||
|
* 0xC140 (page 1); каждый примитив использует его вместо константы. */
|
||||||
|
extern uint16_t _gfx_addr_base;
|
||||||
|
|
||||||
|
/* ---- Низкоуровневый видеорежим (libc/video) ---------------------- */
|
||||||
|
uint8_t _videomode_raw_get(void);
|
||||||
|
int _videomode_raw_set(uint8_t mode);
|
||||||
|
|
||||||
|
/* ---- W3-скобки (common/_bgi_begin.c, _bgi_end.c) ----------------- *
|
||||||
|
* begin: DI + сохранить текущий W3 и замапить _gfx_bank;
|
||||||
|
* end: восстановить W3 + EI. Не реентерабельно (сейв в статике). */
|
||||||
|
|
||||||
|
extern uint8_t _gfx_saved_w3;
|
||||||
|
|
||||||
|
void _bgi_begin(void);
|
||||||
|
void _bgi_end(void);
|
||||||
|
|
||||||
|
/* ---- LEAF-операции драйвера (bgi256/ или bgi16/) ----------------- *
|
||||||
|
* Каждая self-contained: raw-варианты НЕ ставят свою W3-скобку
|
||||||
|
* (вызывающий обязан обернуть в _bgi_begin/_bgi_end); self-bracket
|
||||||
|
* (_bgi_read/_bgi_hspan/_bgi_clearall) ставят скобку сами. */
|
||||||
|
|
||||||
|
uint8_t _bgi_mode_set(void); /* войти в режим + палитра + границы */
|
||||||
|
|
||||||
|
void _bgi_plot_raw (int x, int y, uint8_t color); /* точка, без скобки */
|
||||||
|
uint8_t _bgi_read_raw (int x, int y); /* чтение, без скобки */
|
||||||
|
void _bgi_hspan_raw(int x, int y, int len, uint8_t color); /* H-отрезок, без скобки */
|
||||||
|
void _bgi_vspan_raw(int x, int y, int len, uint8_t color); /* V-отрезок, без скобки */
|
||||||
|
void _bgi_clear_raw(uint8_t color); /* заливка экрана, без скобки */
|
||||||
|
|
||||||
|
/* Self-bracket версии (begin + raw + end) — для разовых вызовов из
|
||||||
|
* математики, которой не нужен пакетный режим (floodfill, cleardevice).
|
||||||
|
* _bgi_read возвращает цвет пикселя как unsigned (в SDCC __sdcccall(1)
|
||||||
|
* 8-битный возврат идёт в A, расширяется до int). */
|
||||||
|
unsigned _bgi_read (int x, int y);
|
||||||
|
void _bgi_hspan (int x, int y, int len, uint8_t color);
|
||||||
|
void _bgi_clearall(uint8_t color);
|
||||||
|
|
||||||
|
/* ---- Скретч акселератора 256 (bgi256/_gfx_acc256.c) -------------- *
|
||||||
|
* Общий для hspan/vspan/clear; однопоточно, IRQ выключены между
|
||||||
|
* _bgi_begin/_bgi_end. */
|
||||||
|
extern uint8_t _gfx_acc_color;
|
||||||
|
extern uint8_t _gfx_acc_y;
|
||||||
|
extern uint8_t _gfx_acc_len; /* 0 = 256 — конвенция акселератора */
|
||||||
|
extern uint16_t _gfx_acc_addr;
|
||||||
|
|
||||||
|
/* Горизонтальный Fill-burst: _gfx_acc_len байт с _gfx_acc_addr на
|
||||||
|
* строке _gfx_acc_y (W3 замаплен, DI активен). */
|
||||||
|
void _gfx_hfill256_chunk(void);
|
||||||
|
|
||||||
|
/* ---- Скретч 16-цветных примитивов (bgi16/_gfx_g16_state.c) ------- */
|
||||||
|
extern uint8_t _gfx_g16_y;
|
||||||
|
extern uint8_t _gfx_g16_byte; /* nibble | (nibble<<4) */
|
||||||
|
extern uint8_t _gfx_g16_nibble; /* цвет в нужной половине байта */
|
||||||
|
extern uint8_t _gfx_g16_mask; /* маска, сохраняющая ДРУГУЮ половину */
|
||||||
|
extern uint8_t _gfx_g16_len; /* размер accel-блока (0 = 256) */
|
||||||
|
extern uint16_t _gfx_g16_addr;
|
||||||
|
|
||||||
|
/* Горизонтальный Fill-burst байтами _gfx_g16_byte (bgi16/_gfx_hfill16.c). */
|
||||||
|
void _gfx_hfill16_chunk(void);
|
||||||
|
|
||||||
|
/* RMW одного нибла по (_gfx_g16_addr, _gfx_g16_y) (bgi16/_gfx_rmw16.c). */
|
||||||
|
void _gfx_rmw16_pixel(void);
|
||||||
|
|
||||||
|
/* ---- Шрифт (common/_gfx_font_state.c, _gfx_font_ensure.c) -------- *
|
||||||
|
* Формат: 256 глифов × 8 рядов, INTERLEAVED — offset = row*256 + char;
|
||||||
|
* биты MSB-first. См. memory/sprinter_font_format. */
|
||||||
|
|
||||||
|
#define _GFX_FONT_BYTES 2048
|
||||||
|
|
||||||
|
extern uint8_t _gfx_font_buf[_GFX_FONT_BYTES];
|
||||||
|
extern const uint8_t *_gfx_font_ptr;
|
||||||
|
extern uint8_t _gfx_font_loaded;
|
||||||
|
|
||||||
|
/* Ленивая инициализация: грузит системный шрифт при первом использовании. */
|
||||||
|
void _gfx_font_ensure(void);
|
||||||
|
|
||||||
|
/* 8 байт строк глифа c (грузит шрифт при первом использовании) —
|
||||||
|
* mode-agnostic, просто читает _gfx_font_ptr. common/_bgi_font_rows.c. */
|
||||||
|
void _bgi_font_rows(unsigned char c, uint8_t *rows8);
|
||||||
|
|
||||||
|
/* ---- Тригонометрия для дуг (common/_bgi_trig.c) ------------------ *
|
||||||
|
* Угол в градусах; результат sin/cos × 128 (Q7 — чтобы радиус×значение
|
||||||
|
* влезало в int без 32-бит арифметики). */
|
||||||
|
int _bgi_sin128(int deg);
|
||||||
|
int _bgi_cos128(int deg);
|
||||||
|
|
||||||
|
/* Общий рисователь дуги/контура эллипса (common/_bgi_arc_draw.c):
|
||||||
|
* полилиния по точкам от stangle до endangle с полуосями xr,yr вокруг
|
||||||
|
* (cx,cy). */
|
||||||
|
void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle,
|
||||||
|
int xr, int yr, uint8_t color);
|
||||||
|
|
||||||
|
/* Целочисленный sqrt (0..~32767) для fillellipse (common/_bgi_isqrt.c). */
|
||||||
|
int _bgi_isqrt(int n);
|
||||||
|
|
||||||
|
/* ---- Состояние линий (common/_bgi_line_state.c) ------------------ */
|
||||||
|
extern uint8_t _bgi_line_style; /* SOLID_LINE..USERBIT_LINE */
|
||||||
|
extern uint8_t _bgi_line_thick; /* 1 (NORM) или 3 (THICK) */
|
||||||
|
extern uint16_t _bgi_line_pattern; /* маска для USERBIT_LINE */
|
||||||
|
|
||||||
|
/* Отрезок текущим стилем/толщиной линии (common/_bgi_styled_line.c). */
|
||||||
|
void _bgi_styled_line(int x0, int y0, int x1, int y1, uint8_t color);
|
||||||
|
|
||||||
|
/* Отрезок (x0,y0)->(x1,y1) БЕЗ стиля: ортогонал → hspan/vspan,
|
||||||
|
* диагональ → Брезенхэм over _bgi_plot_raw, своя W3-скобка
|
||||||
|
* (common/_bgi_lineseg.c). Реальная логика, не обёртка. */
|
||||||
|
void _bgi_lineseg(int x0, int y0, int x1, int y1, uint8_t color);
|
||||||
|
|
||||||
|
/* ---- Состояние заливки (common/_bgi_fill_state.c) ---------------- */
|
||||||
|
extern uint8_t _bgi_fill_pattern; /* *_FILL */
|
||||||
|
extern uint8_t _bgi_fill_color;
|
||||||
|
|
||||||
|
/* Залить строку [x0..x1] на y ТЕКУЩИМ стилем заливки (паттерн+цвет),
|
||||||
|
* с клипом по экрану. Вызывать между _bgi_begin/_bgi_end. */
|
||||||
|
void _bgi_fill_span(int x0, int x1, int y);
|
||||||
|
|
||||||
|
/* ---- Стиль текста (common/_bgi_text_state.c) --------------------- */
|
||||||
|
extern uint8_t _bgi_text_dir; /* HORIZ_DIR / VERT_DIR */
|
||||||
|
extern uint8_t _bgi_text_size; /* масштаб 1..10 */
|
||||||
|
|
||||||
|
/* Нарисовать строку s в (x,y) текущим стилем текста (масштаб/направление,
|
||||||
|
* цвет _bgi_fg, прозрачный фон) — common/_bgi_draw_scaled.c. */
|
||||||
|
void _bgi_draw_scaled(int x, int y, const char *s);
|
||||||
|
|
||||||
|
/* ---- Скан-таблицы min/max X по строкам для fillpoly -------------- *
|
||||||
|
* (common/_bgi_poly_state.c). GFX_HEIGHT — высота экрана (256 в обоих
|
||||||
|
* режимах), см. <gfx.h>. */
|
||||||
|
extern int _bgi_span_min[GFX_HEIGHT];
|
||||||
|
extern int _bgi_span_max[GFX_HEIGHT];
|
||||||
|
|
||||||
|
/* Прогнать ребро (Брезенхэм) обновляя _bgi_span_min/max
|
||||||
|
* (common/_bgi_poly_edge.c). */
|
||||||
|
void _bgi_poly_edge(int x0, int y0, int x1, int y1);
|
||||||
|
|
||||||
|
/* ---- Cross-library: внутренние символы libc/cbl ------------------ *
|
||||||
|
* libbgi ВСЕГДА линкуется вместе с libc (sprinter.lib), поэтому
|
||||||
|
* зависимость от внутренних символов libc допустима. gfx_wait_vsync
|
||||||
|
* держит bit7 порта 0x004E через рефкаунт _cbl_port_ref/unref, чтобы
|
||||||
|
* бит 5 порта 0xFE (позиция луча) был доступен.
|
||||||
|
* ВНИМАНИЕ: это ВНУТРЕННИЕ символы libc/cbl — при изменении сигнатур
|
||||||
|
* СВЕРЯТЬ с libc/cbl/_cbl.h и синхронизировать. (По тому же паттерну,
|
||||||
|
* каким здесь живут _videomode_raw_* из libc/video.) */
|
||||||
|
extern void _cbl_port_ref(void);
|
||||||
|
extern void _cbl_port_unref(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_clear16_raw — залить всё поле 640×256 цветом color, mode 0x82.
|
* _bgi_clear_raw — залить всё поле 640×256 цветом color, mode 0x82.
|
||||||
* Построчный hfill: 256 строк × 2 burst'а (256 + 64 байта). W3-naive.
|
* Построчный hfill: 256 строк × 2 burst'а (256 + 64 байта). W3-naive.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_clear16_raw(uint8_t color)
|
void _bgi_clear_raw(uint8_t color)
|
||||||
{
|
{
|
||||||
_gfx_g16_byte = (uint8_t)((color & 0x0F) | ((color & 0x0F) << 4));
|
_gfx_g16_byte = (uint8_t)((color & 0x0F) | ((color & 0x0F) << 4));
|
||||||
for (int y = 0; y < GFX_HEIGHT_16; y++) {
|
for (int y = 0; y < GFX_HEIGHT_16; y++) {
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_hline16_raw — горизонтальная линия len пикселей от (x,y),
|
* _bgi_hspan_raw — горизонтальная линия len пикселей от (x,y),
|
||||||
* mode 0x82: невыровненные крайние ниблы через RMW, середина —
|
* mode 0x82: невыровненные крайние ниблы через RMW, середина —
|
||||||
* Fill-burst'ами акселератора по целым байтам. W3-naive.
|
* Fill-burst'ами акселератора по целым байтам. W3-naive.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_hline16_raw(int x, int y, int len, uint8_t color)
|
void _bgi_hspan_raw(int x, int y, int len, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)y >= GFX_HEIGHT_16) return;
|
if ((unsigned)y >= GFX_HEIGHT_16) return;
|
||||||
if (x < 0) { len += x; x = 0; }
|
if (x < 0) { len += x; x = 0; }
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_putpixel16_raw — пиксель (x,y) цветом 0..15, mode 0x82.
|
* _bgi_plot_raw — пиксель (x,y) цветом 0..15, mode 0x82.
|
||||||
* Байт по адресу _gfx_addr_base + x/2 держит два пикселя: high nibble =
|
* Байт по адресу _gfx_addr_base + x/2 держит два пикселя: high nibble =
|
||||||
* ЛЕВЫЙ (чётный x), low = ПРАВЫЙ (нечётный). W3-naive.
|
* ЛЕВЫЙ (чётный x), low = ПРАВЫЙ (нечётный). W3-naive.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_putpixel16_raw(int x, int y, uint8_t color)
|
void _bgi_plot_raw(int x, int y, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)x >= GFX_WIDTH_16 || (unsigned)y >= GFX_HEIGHT_16) return;
|
if ((unsigned)x >= GFX_WIDTH_16 || (unsigned)y >= GFX_HEIGHT_16) return;
|
||||||
_gfx_g16_y = (uint8_t)y;
|
_gfx_g16_y = (uint8_t)y;
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_vline16_raw — вертикальная линия len пикселей от (x,y),
|
* _bgi_vspan_raw — вертикальная линия len пикселей от (x,y),
|
||||||
* mode 0x82. Вертикального accel-пути нет: байт покрывает два
|
* mode 0x82. Вертикального accel-пути нет: байт покрывает два
|
||||||
* горизонтальных пикселя, Fill затёр бы соседний нибл — поэтому
|
* горизонтальных пикселя, Fill затёр бы соседний нибл — поэтому
|
||||||
* RMW на каждую строку. W3-naive.
|
* RMW на каждую строку. W3-naive.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_vline16_raw(int x, int y, int len, uint8_t color)
|
void _bgi_vspan_raw(int x, int y, int len, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)x >= GFX_WIDTH_16) return;
|
if ((unsigned)x >= GFX_WIDTH_16) return;
|
||||||
if (y < 0) { len += y; y = 0; }
|
if (y < 0) { len += y; y = 0; }
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* между W3-begin/end.
|
* между W3-begin/end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _gfx_g16_y;
|
uint8_t _gfx_g16_y;
|
||||||
uint8_t _gfx_g16_byte; /* nibble | (nibble<<4) — цвет в обе половины */
|
uint8_t _gfx_g16_byte; /* nibble | (nibble<<4) — цвет в обе половины */
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
* как новый размер блока.
|
* как новый размер блока.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_hfill16_chunk(void) __naked
|
void _gfx_hfill16_chunk(void) __naked
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* Pre: W3 замаплен, DI активен.
|
* Pre: W3 замаплен, DI активен.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_rmw16_pixel(void) __naked
|
void _gfx_rmw16_pixel(void) __naked
|
||||||
{
|
{
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_clear256_raw — залить всё поле 320×256 цветом color, mode 0x81.
|
* _bgi_clear_raw — залить всё поле 320×256 цветом color, mode 0x81.
|
||||||
* Построчный hfill: 256 строк × 2 burst'а (256 + 64 байта) = 512.
|
* Построчный hfill: 256 строк × 2 burst'а (256 + 64 байта) = 512.
|
||||||
* W3-naive: вызывающий обрамляет begin/end.
|
* W3-naive: вызывающий обрамляет begin/end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_clear256_raw(uint8_t color)
|
void _bgi_clear_raw(uint8_t color)
|
||||||
{
|
{
|
||||||
_gfx_acc_color = color;
|
_gfx_acc_color = color;
|
||||||
for (int y = 0; y < GFX_HEIGHT; y++) {
|
for (int y = 0; y < GFX_HEIGHT; y++) {
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_hline256_raw — горизонтальная линия len пикселей от (x,y),
|
* _bgi_hspan_raw — горизонтальная линия len пикселей от (x,y),
|
||||||
* mode 0x81, через Fill-burst'ы акселератора (до 256 байт за выстрел).
|
* mode 0x81, через Fill-burst'ы акселератора (до 256 байт за выстрел).
|
||||||
* W3-naive: вызывающий обрамляет begin/end.
|
* W3-naive: вызывающий обрамляет begin/end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_hline256_raw(int x, int y, int len, uint8_t color)
|
void _bgi_hspan_raw(int x, int y, int len, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)y >= GFX_HEIGHT) return;
|
if ((unsigned)y >= GFX_HEIGHT) return;
|
||||||
if (x < 0) { len += x; x = 0; }
|
if (x < 0) { len += x; x = 0; }
|
||||||
@@ -31,7 +31,11 @@ static const uint8_t _bgi_ega_pal[16 * 4] = {
|
|||||||
|
|
||||||
uint8_t _bgi_mode_set(void)
|
uint8_t _bgi_mode_set(void)
|
||||||
{
|
{
|
||||||
uint8_t prev = gfx_init(GFX_MODE_320x256x256, 0);
|
uint8_t prev = _videomode_raw_get();
|
||||||
|
_videomode_raw_set(GFX_MODE_320x256x256);
|
||||||
|
_gfx_bank = 0x50;
|
||||||
|
gfx_set_visible_page(0);
|
||||||
|
gfx_set_draw_page(0);
|
||||||
gfx_pal_load(0, 0, 16, _bgi_ega_pal);
|
gfx_pal_load(0, 0, 16, _bgi_ega_pal);
|
||||||
_bgi_maxx = GFX_WIDTH - 1;
|
_bgi_maxx = GFX_WIDTH - 1;
|
||||||
_bgi_maxy = GFX_HEIGHT - 1;
|
_bgi_maxy = GFX_HEIGHT - 1;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_putpixel256_raw — пиксель (x,y) цветом color, mode 0x81.
|
* _bgi_plot_raw — пиксель (x,y) цветом color, mode 0x81.
|
||||||
*
|
*
|
||||||
* "Raw" = W3-naive: вызывающий уже сделал _gfx_w3_video_begin (W3 на
|
* "Raw" = W3-naive: вызывающий уже сделал _gfx_w3_video_begin (W3 на
|
||||||
* видеобанке, DI). Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y.
|
* видеобанке, DI). Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y.
|
||||||
@@ -8,13 +8,13 @@
|
|||||||
* Брезенхэма не топтал внешнее состояние акселератора.
|
* Брезенхэма не топтал внешнее состояние акселератора.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
static uint8_t _gfx_pp_y;
|
static uint8_t _gfx_pp_y;
|
||||||
static uint16_t _gfx_pp_addr;
|
static uint16_t _gfx_pp_addr;
|
||||||
static uint8_t _gfx_pp_color;
|
static uint8_t _gfx_pp_color;
|
||||||
|
|
||||||
void _gfx_putpixel256_raw(int x, int y, uint8_t color)
|
void _bgi_plot_raw(int x, int y, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return;
|
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return;
|
||||||
_gfx_pp_y = (uint8_t)y;
|
_gfx_pp_y = (uint8_t)y;
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_getpixel256_raw — прочитать пиксель (x,y) БЕЗ своей W3-скобки
|
* _bgi_read_raw — прочитать пиксель (x,y) БЕЗ своей W3-скобки
|
||||||
* (вызывающий уже сделал _gfx_w3_video_begin). Для блиттинга image:
|
* (вызывающий уже сделал _gfx_w3_video_begin). Для блиттинга image:
|
||||||
* getimage/putimage читают тысячи пикселей в одной скобке.
|
* getimage/putimage читают тысячи пикселей в одной скобке.
|
||||||
* За пределами экрана возвращает 0.
|
* За пределами экрана возвращает 0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
static uint8_t _gfx_gpr_y;
|
static uint8_t _gfx_gpr_y;
|
||||||
static uint16_t _gfx_gpr_addr;
|
static uint16_t _gfx_gpr_addr;
|
||||||
static uint8_t _gfx_gpr_color;
|
static uint8_t _gfx_gpr_color;
|
||||||
|
|
||||||
uint8_t _gfx_getpixel256_raw(int x, int y)
|
uint8_t _bgi_read_raw(int x, int y)
|
||||||
{
|
{
|
||||||
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return 0;
|
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return 0;
|
||||||
_gfx_gpr_y = (uint8_t)y;
|
_gfx_gpr_y = (uint8_t)y;
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_vline256_raw — вертикальная линия len пикселей от (x,y),
|
* _bgi_vspan_raw — вертикальная линия len пикселей от (x,y),
|
||||||
* mode 0x81. Вертикальный Fill акселератора сам инкрементирует Port_Y,
|
* mode 0x81. Вертикальный Fill акселератора сам инкрементирует Port_Y,
|
||||||
* так что вся колонка (высота 256) — один burst. W3-naive.
|
* так что вся колонка (высота 256) — один burst. W3-naive.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
/* Вертикальный Fill: _gfx_acc_len пикселей в колонке _gfx_acc_addr,
|
/* Вертикальный Fill: _gfx_acc_len пикселей в колонке _gfx_acc_addr,
|
||||||
* верхняя строка _gfx_acc_y. Про SMC и правила FSM акселератора —
|
* верхняя строка _gfx_acc_y. Про SMC и правила FSM акселератора —
|
||||||
@@ -33,7 +33,7 @@ static void vfill_chunk(void) __naked
|
|||||||
__endasm;
|
__endasm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _gfx_vline256_raw(int x, int y, int len, uint8_t color)
|
void _bgi_vspan_raw(int x, int y, int len, uint8_t color)
|
||||||
{
|
{
|
||||||
if ((unsigned)x >= GFX_WIDTH) return;
|
if ((unsigned)x >= GFX_WIDTH) return;
|
||||||
if (y < 0) { len += y; y = 0; }
|
if (y < 0) { len += y; y = 0; }
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* GFX работает с выключенными прерываниями между W3-begin/end.
|
* GFX работает с выключенными прерываниями между W3-begin/end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _gfx_acc_color;
|
uint8_t _gfx_acc_color;
|
||||||
uint8_t _gfx_acc_y;
|
uint8_t _gfx_acc_y;
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
* как новый размер блока.
|
* как новый размер блока.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_hfill256_chunk(void) __naked
|
void _gfx_hfill256_chunk(void) __naked
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* getpixel (bgi256) — цвет пикселя (x,y), mode 0x81. Полностью inline
|
||||||
|
* (bounds + W3-скобка + чтение пикселя), без вызовов _bgi_read/raw.
|
||||||
|
* Возвращает 0 вне экрана.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
static uint8_t _gp_y;
|
||||||
|
static uint16_t _gp_addr;
|
||||||
|
static uint8_t _gp_color;
|
||||||
|
|
||||||
|
unsigned getpixel(int x, int y)
|
||||||
|
{
|
||||||
|
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return 0;
|
||||||
|
_gp_y = (uint8_t)y;
|
||||||
|
_gp_addr = (uint16_t)(_gfx_addr_base + (unsigned)x);
|
||||||
|
__asm
|
||||||
|
di
|
||||||
|
in a, (#0xE2)
|
||||||
|
ld (__gfx_saved_w3), a
|
||||||
|
ld a, (__gfx_bank)
|
||||||
|
out (#0xE2), a
|
||||||
|
ld a, (_gp_y)
|
||||||
|
out (#0x89), a
|
||||||
|
ld hl, (_gp_addr)
|
||||||
|
ld a, (hl)
|
||||||
|
ld (_gp_color), a
|
||||||
|
ld a, (__gfx_saved_w3)
|
||||||
|
out (#0xE2), a
|
||||||
|
ei
|
||||||
|
__endasm;
|
||||||
|
return _gp_color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* putpixel (bgi256) — точка (x,y) цветом color, mode 0x81.
|
||||||
|
* ПОЛНОСТЬЬЮ inline: bounds + W3-скобка + запись пикселя в теле, БЕЗ
|
||||||
|
* вызовов _bgi_plot / gfx_putpixel256 / _bgi_plot_raw (устранены
|
||||||
|
* прокладки старой цепочки putpixel→_bgi_plot→gfx_putpixel256→raw).
|
||||||
|
* Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y; W3 мапится на
|
||||||
|
* _gfx_bank, сейв восстанавливается. Bounds — compile-time GFX_WIDTH/
|
||||||
|
* HEIGHT (меньше/быстрее, ≡ runtime _bgi_maxx/_bgi_maxy).
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
/* File-static скретч (как в _bgi_plot_raw, но свой — putpixel не должен
|
||||||
|
* топтать скретч акселератора/plot_raw, если звать вперемешку). */
|
||||||
|
static uint8_t _pp_y;
|
||||||
|
static uint16_t _pp_addr;
|
||||||
|
static uint8_t _pp_color;
|
||||||
|
|
||||||
|
void putpixel(int x, int y, int color)
|
||||||
|
{
|
||||||
|
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return;
|
||||||
|
_pp_y = (uint8_t)y;
|
||||||
|
_pp_addr = (uint16_t)(_gfx_addr_base + (unsigned)x);
|
||||||
|
_pp_color = (uint8_t)color;
|
||||||
|
__asm
|
||||||
|
di
|
||||||
|
in a, (#0xE2)
|
||||||
|
ld (__gfx_saved_w3), a
|
||||||
|
ld a, (__gfx_bank)
|
||||||
|
out (#0xE2), a
|
||||||
|
ld a, (_pp_y)
|
||||||
|
out (#0x89), a
|
||||||
|
ld hl, (_pp_addr)
|
||||||
|
ld a, (_pp_color)
|
||||||
|
ld (hl), a
|
||||||
|
ld a, (__gfx_saved_w3)
|
||||||
|
out (#0xE2), a
|
||||||
|
ei
|
||||||
|
__endasm;
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
* эллипс через (long)…>>8 рисовался прямоугольником).
|
* эллипс через (long)…>>8 рисовался прямоугольником).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle,
|
void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle,
|
||||||
int xr, int yr, uint8_t color)
|
int xr, int yr, uint8_t color)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_begin — открыть W3-сессию для пакетного рисования: DI, сохранить
|
||||||
|
* текущую страницу W3 и замапить _gfx_bank (видеобанк 0x50..0x5F).
|
||||||
|
* Композитные примитивы обрамляют одной парой _bgi_begin/_bgi_end весь
|
||||||
|
* внутренний цикл — W3-танец оплачивается один раз на операцию, а не
|
||||||
|
* на пиксель. НЕ реентерабельно (сейв в _gfx_saved_w3): между begin и
|
||||||
|
* end IRQ выключены.
|
||||||
|
*
|
||||||
|
* Real код (поглощён из старого libc/gfx/_gfx_w3_video_begin.c) — не
|
||||||
|
* обёртка. Mode-agnostic: использует только _gfx_bank/_gfx_saved_w3.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_begin(void) __naked
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
di
|
||||||
|
in a, (#0xE2)
|
||||||
|
ld (__gfx_saved_w3), a
|
||||||
|
ld a, (__gfx_bank)
|
||||||
|
out (#0xE2), a
|
||||||
|
ret
|
||||||
|
__endasm;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_clearall — залить весь экран цветом, self-bracket (своя W3-скобка).
|
||||||
|
* cleardevice зовёт это фоновым цветом. Реальная композиция
|
||||||
|
* _bgi_begin + _bgi_clear_raw + _bgi_end.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_clearall(uint8_t color)
|
||||||
|
{
|
||||||
|
_bgi_begin();
|
||||||
|
_bgi_clear_raw(color);
|
||||||
|
_bgi_end();
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
* Каждый «пиксель» глифа — блок size×size из raw-плотов, всё в одной
|
* Каждый «пиксель» глифа — блок size×size из raw-плотов, всё в одной
|
||||||
* W3-скобке.
|
* W3-скобке.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _bgi_draw_scaled(int x, int y, const char *s)
|
void _bgi_draw_scaled(int x, int y, const char *s)
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_end — закрыть W3-сессию: восстановить сохранённую страницу W3 и
|
||||||
|
* EI. Real код (поглощён из старого libc/gfx/_gfx_w3_video_end.c).
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_end(void) __naked
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
ld a, (__gfx_saved_w3)
|
||||||
|
out (#0xE2), a
|
||||||
|
ei
|
||||||
|
ret
|
||||||
|
__endasm;
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* Клип по экрану внутри. ВЫЗЫВАТЬ между _bgi_begin/_bgi_end.
|
* Клип по экрану внутри. ВЫЗЫВАТЬ между _bgi_begin/_bgi_end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
/* Стандартные 8×8-паттерны Borland, индексы LINE_FILL..CLOSE_DOT_FILL. */
|
/* Стандартные 8×8-паттерны Borland, индексы LINE_FILL..CLOSE_DOT_FILL. */
|
||||||
static const uint8_t _bgi_pat[10][8] = {
|
static const uint8_t _bgi_pat[10][8] = {
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* Без инициализации (crt0 зануляет _DATA).
|
* Без инициализации (crt0 зануляет _DATA).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _bgi_fill_pattern;
|
uint8_t _bgi_fill_pattern;
|
||||||
uint8_t _bgi_fill_color;
|
uint8_t _bgi_fill_color;
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_font_rows — 8 байт строк глифа символа c (mode-agnostic: просто
|
||||||
|
* читает шрифт через _gfx_font_ptr). Шрифт системный, interleaved:
|
||||||
|
* offset = row*256 + char (MSB-first), см. memory/sprinter_font_format.
|
||||||
|
* Грузится лениво (_gfx_font_ensure) при первом использовании.
|
||||||
|
*
|
||||||
|
* Раньше жил в drv256/ по недосмотру — перенесён в common/, т.к. логика
|
||||||
|
* не зависит от видеорежима (один и тот же .rel в bgi256.lib и bgi16.lib).
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_font_rows(unsigned char c, uint8_t *rows8)
|
||||||
|
{
|
||||||
|
const uint8_t *f;
|
||||||
|
int r;
|
||||||
|
_gfx_font_ensure();
|
||||||
|
f = _gfx_font_ptr;
|
||||||
|
for (r = 0; r < 8; r++)
|
||||||
|
rows8[r] = f[r * 256 + c];
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_hspan — горизонтальный отрезок len пикселей от (x,y), self-bracket
|
||||||
|
* (своя W3-скобка). Для floodfill (заливка строки вне пакетной сессии).
|
||||||
|
* Реальная композиция _bgi_begin + _bgi_hspan_raw + _bgi_end.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_hspan(int x, int y, int len, uint8_t color)
|
||||||
|
{
|
||||||
|
_bgi_begin();
|
||||||
|
_bgi_hspan_raw(x, y, len, color);
|
||||||
|
_bgi_end();
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* без float и 32-бит.
|
* без float и 32-бит.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int _bgi_isqrt(int n)
|
int _bgi_isqrt(int n)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* _bgi_line_state — текущий стиль/толщина/маска линий BGI.
|
* _bgi_line_state — текущий стиль/толщина/маска линий BGI.
|
||||||
* initgraph ставит SOLID_LINE / NORM / 0xFFFF. Без инициализации.
|
* initgraph ставит SOLID_LINE / NORM / 0xFFFF. Без инициализации.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _bgi_line_style;
|
uint8_t _bgi_line_style;
|
||||||
uint8_t _bgi_line_thick;
|
uint8_t _bgi_line_thick;
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_lineseg — отрезок (x0,y0)->(x1,y1) БЕЗ стиля/толщины (SOLID+NORM).
|
||||||
|
* Real логика (поглощена из старого libc/gfx/gfx_line256.c), не обёртка.
|
||||||
|
*
|
||||||
|
* Ортогональные отрезки уходят на driver-leaf'ы _bgi_hspan_raw /
|
||||||
|
* _bgi_vspan_raw (акселератор); наклонные — Брезенхэм поточечно через
|
||||||
|
* _bgi_plot_raw. Каждый путь ставит свою W3-скобку (_bgi_begin/_bgi_end)
|
||||||
|
* — вызывать _bgi_lineseg ВНЕ чужой скобки (W3-сейв не реентерабелен).
|
||||||
|
* Вызывают: _bgi_styled_line (SOLID+NORM), _bgi_arc_draw, fillpoly,
|
||||||
|
* sector — все вне скобки.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void _bgi_lineseg(int x0, int y0, int x1, int y1, uint8_t color)
|
||||||
|
{
|
||||||
|
/* Горизонталь — один H-burst. */
|
||||||
|
if (y0 == y1) {
|
||||||
|
int x = x0 <= x1 ? x0 : x1;
|
||||||
|
int w = (x0 <= x1 ? x1 - x0 : x0 - x1) + 1;
|
||||||
|
_bgi_begin();
|
||||||
|
_bgi_hspan_raw(x, y0, w, color);
|
||||||
|
_bgi_end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Вертикаль — один V-burst (256) или RMW-цикл (16). */
|
||||||
|
if (x0 == x1) {
|
||||||
|
int y = y0 <= y1 ? y0 : y1;
|
||||||
|
int h = (y0 <= y1 ? y1 - y0 : y0 - y1) + 1;
|
||||||
|
_bgi_begin();
|
||||||
|
_bgi_vspan_raw(x0, y, h, color);
|
||||||
|
_bgi_end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Наклонный — Брезенхэм в одной W3-скобке. */
|
||||||
|
int dx = x1 - x0; int sx = dx < 0 ? -1 : 1; if (dx < 0) dx = -dx;
|
||||||
|
int dy = y1 - y0; int sy = dy < 0 ? -1 : 1; if (dy < 0) dy = -dy;
|
||||||
|
int err = (dx > dy ? dx : -dy) / 2;
|
||||||
|
int x = x0, y = y0;
|
||||||
|
_bgi_begin();
|
||||||
|
for (;;) {
|
||||||
|
_bgi_plot_raw(x, y, color);
|
||||||
|
if (x == x1 && y == y1) break;
|
||||||
|
int e2 = err;
|
||||||
|
if (e2 > -dx) { err -= dy; x += sx; }
|
||||||
|
if (e2 < dy) { err += dx; y += sy; }
|
||||||
|
}
|
||||||
|
_bgi_end();
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* пропускаются. Заливка потом идёт от min до max по строке.
|
* пропускаются. Заливка потом идёт от min до max по строке.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _bgi_poly_edge(int x0, int y0, int x1, int y1)
|
void _bgi_poly_edge(int x0, int y0, int x1, int y1)
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* однопоточно (рисование не реентерабельно).
|
* однопоточно (рисование не реентерабельно).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int _bgi_span_min[GFX_HEIGHT];
|
int _bgi_span_min[GFX_HEIGHT];
|
||||||
int _bgi_span_max[GFX_HEIGHT];
|
int _bgi_span_max[GFX_HEIGHT];
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* _bgi_read — цвет пикселя (x,y), self-bracket (своя W3-скобка).
|
||||||
|
* Для разовых чтений из математики, которой не нужен пакетный режим
|
||||||
|
* (floodfill). getpixel тоже зовёт это. Реальная композиция
|
||||||
|
* _bgi_begin + _bgi_read_raw + _bgi_end — не обёртка над обёрткой.
|
||||||
|
*/
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
unsigned _bgi_read(int x, int y)
|
||||||
|
{
|
||||||
|
unsigned c;
|
||||||
|
_bgi_begin();
|
||||||
|
c = _bgi_read_raw(x, y);
|
||||||
|
_bgi_end();
|
||||||
|
return c;
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* выставляет initgraph().
|
* выставляет initgraph().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _bgi_fg;
|
uint8_t _bgi_fg;
|
||||||
uint8_t _bgi_bg;
|
uint8_t _bgi_bg;
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* дублированием перпендикулярно основной оси (±1). Всё raw в одной
|
* дублированием перпендикулярно основной оси (±1). Всё raw в одной
|
||||||
* W3-скобке.
|
* W3-скобке.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
/* Маски стандартных стилей (SOLID/DOTTED/CENTER/DASHED). */
|
/* Маски стандартных стилей (SOLID/DOTTED/CENTER/DASHED). */
|
||||||
static const uint16_t _bgi_line_pat[4] = { 0xFFFF, 0xCCCC, 0xFF18, 0xF8F8 };
|
static const uint16_t _bgi_line_pat[4] = { 0xFFFF, 0xCCCC, 0xFF18, 0xF8F8 };
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* _bgi_text_state — направление и масштаб текста BGI.
|
* _bgi_text_state — направление и масштаб текста BGI.
|
||||||
* initgraph ставит HORIZ_DIR / size 1. Без инициализации.
|
* initgraph ставит HORIZ_DIR / size 1. Без инициализации.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _bgi_text_dir;
|
uint8_t _bgi_text_dir;
|
||||||
uint8_t _bgi_text_size;
|
uint8_t _bgi_text_size;
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
* (см. memory/avoid_32bit_arith_z80; ловили эллипс-в-прямоугольник).
|
* (см. memory/avoid_32bit_arith_z80; ловили эллипс-в-прямоугольник).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
/* sin(0°..90°) × 128. */
|
/* sin(0°..90°) × 128. */
|
||||||
static const int _bgi_sintab[91] = {
|
static const int _bgi_sintab[91] = {
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* использовании (чисто графическая программа BIOS-вызов не платит).
|
* использовании (чисто графическая программа BIOS-вызов не платит).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void _gfx_font_ensure(void)
|
void _gfx_font_ensure(void)
|
||||||
{
|
{
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
* _gfx_font_ensure(); программы могут подменить шрифт gfx_set_font().
|
* _gfx_font_ensure(); программы могут подменить шрифт gfx_set_font().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _gfx_font_buf[_GFX_FONT_BYTES];
|
uint8_t _gfx_font_buf[_GFX_FONT_BYTES];
|
||||||
const uint8_t *_gfx_font_ptr = _gfx_font_buf;
|
const uint8_t *_gfx_font_ptr = _gfx_font_buf;
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* _gfx_state — общее состояние графики (модуль только с данными).
|
* _gfx_state — общее состояние графики (модуль только с данными).
|
||||||
*
|
*
|
||||||
* Пишут gfx_init / gfx_set_visible_page / gfx_set_draw_page /
|
* Пишут gfx_set_visible_page / gfx_set_draw_page /
|
||||||
* gfx_set_bank; читают все mode-специфичные примитивы.
|
* gfx_set_bank; читают все mode-специфичные примитивы.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _gfx_visible_page;
|
uint8_t _gfx_visible_page;
|
||||||
uint8_t _gfx_draw_page;
|
uint8_t _gfx_draw_page;
|
||||||
@@ -5,6 +5,6 @@
|
|||||||
* прерывания выключенными между _gfx_w3_video_begin и _end.
|
* прерывания выключенными между _gfx_w3_video_begin и _end.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t _gfx_saved_w3;
|
uint8_t _gfx_saved_w3;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* arc — дуга окружности радиуса r от stangle до endangle (градусы). */
|
/* arc — дуга окружности радиуса r от stangle до endangle (градусы). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void arc(int x, int y, int stangle, int endangle, int radius)
|
void arc(int x, int y, int stangle, int endangle, int radius)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* bar — залитый прямоугольник (left,top)-(right,bottom) включительно
|
* bar — залитый прямоугольник (left,top)-(right,bottom) включительно
|
||||||
* ТЕКУЩИМ стилем заливки (setfillstyle), без рамки — как в Turbo-C.
|
* ТЕКУЩИМ стилем заливки (setfillstyle), без рамки — как в Turbo-C.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void bar(int left, int top, int right, int bottom)
|
void bar(int left, int top, int right, int bottom)
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* заливки, рёбра — текущим цветом рисования. depth — глубина (вправо-
|
* заливки, рёбра — текущим цветом рисования. depth — глубина (вправо-
|
||||||
* вверх), topflag != 0 рисует верхнюю грань.
|
* вверх), topflag != 0 рисует верхнюю грань.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void bar3d(int left, int top, int right, int bottom, int depth, int topflag)
|
void bar3d(int left, int top, int right, int bottom, int depth, int topflag)
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* raw-плот — иначе скобка на каждый пиксель делает большие окружности
|
* raw-плот — иначе скобка на каждый пиксель делает большие окружности
|
||||||
* мучительно медленными (тысячи DI/EI).
|
* мучительно медленными (тысячи DI/EI).
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void circle(int cx, int cy, int r)
|
void circle(int cx, int cy, int r)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* cleardevice — очистить экран фоновым цветом, вернуть CP в (0,0). */
|
/* cleardevice — очистить экран фоновым цветом, вернуть CP в (0,0). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void cleardevice(void)
|
void cleardevice(void)
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/* closegraph — вернуть текстовый режим, действовавший до initgraph.
|
||||||
|
* _bgi_mode_done удалён — _videomode_raw_set (mode-agnostic) */
|
||||||
|
#include "../_bgi.h"
|
||||||
|
|
||||||
|
void closegraph(void)
|
||||||
|
{
|
||||||
|
_videomode_raw_set(_bgi_prevmode);
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* текущим цветом. Как в Turbo-C, контур НЕ замыкается автоматически:
|
* текущим цветом. Как в Turbo-C, контур НЕ замыкается автоматически:
|
||||||
* чтобы получить замкнутый полигон, повторите первую точку последней.
|
* чтобы получить замкнутый полигон, повторите первую точку последней.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void drawpoly(int numpoints, const int *polypoints)
|
void drawpoly(int numpoints, const int *polypoints)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* ellipse — контур эллипса/эллиптической дуги с полуосями xradius,
|
* ellipse — контур эллипса/эллиптической дуги с полуосями xradius,
|
||||||
* yradius от stangle до endangle. Полный эллипс: stangle=0,endangle=360.
|
* yradius от stangle до endangle. Полный эллипс: stangle=0,endangle=360.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void ellipse(int x, int y, int stangle, int endangle,
|
void ellipse(int x, int y, int stangle, int endangle,
|
||||||
int xradius, int yradius)
|
int xradius, int yradius)
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* _bgi_isqrt). ry²,dy² ≤ ~180² < 32767, rx*s ≤ rx*ry < 32767 — без
|
* _bgi_isqrt). ry²,dy² ≤ ~180² < 32767, rx*s ≤ rx*ry < 32767 — без
|
||||||
* 32-бит (см. memory/avoid_32bit_arith_z80).
|
* 32-бит (см. memory/avoid_32bit_arith_z80).
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void fillellipse(int cx, int cy, int rx, int ry)
|
void fillellipse(int cx, int cy, int rx, int ry)
|
||||||
{
|
{
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* оболочка по строкам (упрощение). Крайние X даёт брезенхэмовский
|
* оболочка по строкам (упрощение). Крайние X даёт брезенхэмовский
|
||||||
* проход рёбер (_bgi_poly_edge) — без 32-бит арифметики.
|
* проход рёбер (_bgi_poly_edge) — без 32-бит арифметики.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void fillpoly(int numpoints, const int *polypoints)
|
void fillpoly(int numpoints, const int *polypoints)
|
||||||
{
|
{
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
* фигурах) — компромисс по памяти.
|
* фигурах) — компромисс по памяти.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
#define FF_STACK 300
|
#define FF_STACK 300
|
||||||
static int ff_sx[FF_STACK];
|
static int ff_sx[FF_STACK];
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getbkcolor — текущий фоновый цвет. */
|
/* getbkcolor — текущий фоновый цвет. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getbkcolor(void)
|
int getbkcolor(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getcolor — текущий цвет рисования. */
|
/* getcolor — текущий цвет рисования. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getcolor(void)
|
int getcolor(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getfillsettings — прочитать текущий паттерн и цвет заливки. */
|
/* getfillsettings — прочитать текущий паттерн и цвет заливки. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void getfillsettings(struct fillsettingstype *fillinfo)
|
void getfillsettings(struct fillsettingstype *fillinfo)
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* Формат: uint16 width, uint16 height, затем w*h байт (по строкам).
|
* Формат: uint16 width, uint16 height, затем w*h байт (по строкам).
|
||||||
* Чтение raw в одной W3-скобке.
|
* Чтение raw в одной W3-скобке.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void getimage(int left, int top, int right, int bottom, void *bitmap)
|
void getimage(int left, int top, int right, int bottom, void *bitmap)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getlinesettings — прочитать текущий стиль/маску/толщину линий. */
|
/* getlinesettings — прочитать текущий стиль/маску/толщину линий. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void getlinesettings(struct linesettingstype *lineinfo)
|
void getlinesettings(struct linesettingstype *lineinfo)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getmaxcolor — максимальный индекс цвета (255 в 256-цветном режиме). */
|
/* getmaxcolor — максимальный индекс цвета (255 в 256-цветном режиме). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getmaxcolor(void)
|
int getmaxcolor(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getmaxx — максимальная координата X (ширина-1). */
|
/* getmaxx — максимальная координата X (ширина-1). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getmaxx(void)
|
int getmaxx(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getmaxy — максимальная координата Y (высота-1). */
|
/* getmaxy — максимальная координата Y (высота-1). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getmaxy(void)
|
int getmaxy(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* gettextsettings — текущий стиль текста (justify не реализован → 0). */
|
/* gettextsettings — текущий стиль текста (justify не реализован → 0). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gettextsettings(struct textsettingstype *textinfo)
|
void gettextsettings(struct textsettingstype *textinfo)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* getx — текущая позиция X. */
|
/* getx — текущая позиция X. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int getx(void)
|
int getx(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* gety — текущая позиция Y. */
|
/* gety — текущая позиция Y. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int gety(void)
|
int gety(void)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* gfx_get_bank — текущий байт страницы W3 (0x50..0x5F).
|
* gfx_get_bank — текущий байт страницы W3 (0x50..0x5F).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t gfx_get_bank(void)
|
uint8_t gfx_get_bank(void)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* gfx_get_draw_page — кэшированный номер рисуемой страницы (0/1).
|
* gfx_get_draw_page — кэшированный номер рисуемой страницы (0/1).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t gfx_get_draw_page(void)
|
uint8_t gfx_get_draw_page(void)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* gfx_get_visible_page — кэшированный номер видимой страницы (0/1).
|
* gfx_get_visible_page — кэшированный номер видимой страницы (0/1).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
uint8_t gfx_get_visible_page(void)
|
uint8_t gfx_get_visible_page(void)
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* через BIOS WIN_GET_ZG (fn 0xB8) в _gfx_font_buf и включить его.
|
* через BIOS WIN_GET_ZG (fn 0xB8) в _gfx_font_buf и включить его.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
/* BIOS WIN_GET_ZG (0xB8): DE = приёмник, возвращает 2 КБ. */
|
/* BIOS WIN_GET_ZG (0xB8): DE = приёмник, возвращает 2 КБ. */
|
||||||
static void bios_get_zg(uint8_t *dest) __naked
|
static void bios_get_zg(uint8_t *dest) __naked
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* обёртка над pal_get (libc/video) — не на горячем пути.
|
* обёртка над pal_get (libc/video) — не на горячем пути.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
#include <palette.h>
|
#include <palette.h>
|
||||||
|
|
||||||
void gfx_pal_get(uint8_t pal_num, uint8_t start, uint8_t count,
|
void gfx_pal_get(uint8_t pal_num, uint8_t start, uint8_t count,
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* R/G/B (любой указатель может быть NULL); обёртка над pal_get_color.
|
* R/G/B (любой указатель может быть NULL); обёртка над pal_get_color.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
#include <palette.h>
|
#include <palette.h>
|
||||||
|
|
||||||
void gfx_pal_get_color(uint8_t pal_num, uint8_t idx,
|
void gfx_pal_get_color(uint8_t pal_num, uint8_t idx,
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* палитру (следующая печать в текстовом режиме вешалась).
|
* палитру (следующая печать в текстовом режиме вешалась).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
#include <palette.h>
|
#include <palette.h>
|
||||||
|
|
||||||
static uint8_t gpl_num_;
|
static uint8_t gpl_num_;
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* (BIOS $A6, type = PAL_GRAPH).
|
* (BIOS $A6, type = PAL_GRAPH).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
#include <palette.h>
|
#include <palette.h>
|
||||||
|
|
||||||
void gfx_pal_reset(void)
|
void gfx_pal_reset(void)
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* четвёрку (B, G, R, 0) и зовёт gfx_pal_load(pal_num, idx, 1, ...).
|
* четвёрку (B, G, R, 0) и зовёт gfx_pal_load(pal_num, idx, 1, ...).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gfx_pal_set(uint8_t pal_num, uint8_t idx,
|
void gfx_pal_set(uint8_t pal_num, uint8_t idx,
|
||||||
uint8_t r, uint8_t g, uint8_t b)
|
uint8_t r, uint8_t g, uint8_t b)
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* gfx_set_bank — задать байт страницы W3 (0x50..0x5F) для gfx-записей.
|
* gfx_set_bank — задать байт страницы W3 (0x50..0x5F) для gfx-записей.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gfx_set_bank(uint8_t bank)
|
void gfx_set_bank(uint8_t bank)
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* _gfx_addr_base, который читают все примитивы.
|
* _gfx_addr_base, который читают все примитивы.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gfx_set_draw_page(uint8_t page)
|
void gfx_set_draw_page(uint8_t page)
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* storage должен жить, пока шрифт активен). Формат см. _gfx.h.
|
* storage должен жить, пока шрифт активен). Формат см. _gfx.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gfx_set_font(const uint8_t *font)
|
void gfx_set_font(const uint8_t *font)
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* (один из свопов показывается чёрным). Через syscall DSS доволен.
|
* (один из свопов показывается чёрным). Через syscall DSS доволен.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void gfx_set_visible_page(uint8_t page)
|
void gfx_set_visible_page(uint8_t page)
|
||||||
{
|
{
|
||||||
@@ -19,8 +19,7 @@
|
|||||||
* зависнуть намертво.
|
* зависнуть намертво.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_gfx.h"
|
#include "../_bgi.h"
|
||||||
#include "../cbl/_cbl.h"
|
|
||||||
#include <sprinter_exit.h>
|
#include <sprinter_exit.h>
|
||||||
|
|
||||||
static uint8_t vsync_ready;
|
static uint8_t vsync_ready;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* graphresult — код последней ошибки; вызов сбрасывает его в grOk. */
|
/* graphresult — код последней ошибки; вызов сбрасывает его в grOk. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
int graphresult(void)
|
int graphresult(void)
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* Произведение w*h считаем в unsigned — для валидных (<64 КБ) образов
|
* Произведение w*h считаем в unsigned — для валидных (<64 КБ) образов
|
||||||
* умещается точно; без 32-бит.
|
* умещается точно; без 32-бит.
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
unsigned imagesize(int left, int top, int right, int bottom)
|
unsigned imagesize(int left, int top, int right, int bottom)
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* 320×256×256). По умолчанию: цвет WHITE, фон BLACK, позиция (0,0).
|
* 320×256×256). По умолчанию: цвет WHITE, фон BLACK, позиция (0,0).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void initgraph(void)
|
void initgraph(void)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* line — отрезок (x1,y1)->(x2,y2) текущим цветом; CP не меняется. */
|
/* line — отрезок (x1,y1)->(x2,y2) текущим цветом; CP не меняется. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void line(int x1, int y1, int x2, int y2)
|
void line(int x1, int y1, int x2, int y2)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* linerel — линия от CP до CP+(dx,dy); CP сдвигается в конец. */
|
/* linerel — линия от CP до CP+(dx,dy); CP сдвигается в конец. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void linerel(int dx, int dy)
|
void linerel(int dx, int dy)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* lineto — линия от CP до (x,y) текущим цветом; CP := (x,y). */
|
/* lineto — линия от CP до (x,y) текущим цветом; CP := (x,y). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void lineto(int x, int y)
|
void lineto(int x, int y)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* moverel — сдвинуть текущую позицию относительно. */
|
/* moverel — сдвинуть текущую позицию относительно. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void moverel(int dx, int dy)
|
void moverel(int dx, int dy)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* moveto — задать текущую позицию (CP). */
|
/* moveto — задать текущую позицию (CP). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void moveto(int x, int y)
|
void moveto(int x, int y)
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* outtext — строка в текущей позиции (CP) текущим стилем текста; CP
|
* outtext — строка в текущей позиции (CP) текущим стилем текста; CP
|
||||||
* сдвигается на textwidth (гориз.) или вверх на textheight (верт.).
|
* сдвигается на textwidth (гориз.) или вверх на textheight (верт.).
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void outtext(const char *text)
|
void outtext(const char *text)
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/* outtextxy — строка в (x,y) текущим стилем текста (масштаб/направление,
|
/* outtextxy — строка в (x,y) текущим стилем текста (масштаб/направление,
|
||||||
* прозрачный фон); CP не меняет. */
|
* прозрачный фон); CP не меняет. */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void outtextxy(int x, int y, const char *text)
|
void outtextxy(int x, int y, const char *text)
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* pieslice — залитый сектор круга радиуса r (частный случай sector). */
|
/* pieslice — залитый сектор круга радиуса r (частный случай sector). */
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void pieslice(int x, int y, int stangle, int endangle, int radius)
|
void pieslice(int x, int y, int stangle, int endangle, int radius)
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* COPY — пишем src; XOR/OR/AND — комбинируем с экраном (нужно raw-
|
* COPY — пишем src; XOR/OR/AND — комбинируем с экраном (нужно raw-
|
||||||
* чтение); NOT — пишем ~src. Всё в одной W3-скобке (raw-плот/чтение).
|
* чтение); NOT — пишем ~src. Всё в одной W3-скобке (raw-плот/чтение).
|
||||||
*/
|
*/
|
||||||
#include "_bgi.h"
|
#include "../_bgi.h"
|
||||||
|
|
||||||
void putimage(int left, int top, const void *bitmap, int op)
|
void putimage(int left, int top, const void *bitmap, int op)
|
||||||
{
|
{
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user