libc: graphics.h — Turbo-C BGI-слой, Фаза 1 (режим 256)
Функционально-совместимый с Turbo-C <graphics.h> поверх gfx.h. Архитектура: mode-agnostic математика (libc/bgi/*.c → sprinter.lib) + driver-leaf'ы per-режим (libc/bgi/drv256/*.c → sprinter_gfx256.lib). Режим выбирается линковкой: sprinter-cc --gfx 256 (16 — позже, тем же leaf-split'ом). Один код работает в любом режиме без правок. API: initgraph/closegraph/graphresult/cleardevice, set/get color+bkcolor, getmaxx/y/color, put/getpixel, moveto/moverel/getx/gety, line/lineto/ linerel, rectangle, bar, circle, outtext/outtextxy. initgraph грузит EGA-палитру 0..15. Пакетные примитивы (circle) — одна W3-скобка на примитив (иначе на порядок медленнее). Проверено в MAME (tests/bgitest). Попутно: gfx_getpixel256 в libc/gfx. size-check без регресса, baseline обновлён. Детали: memory/bgi_two_lib_design, docs/TODO.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+15
-2
@@ -86,6 +86,7 @@ LD_EXTRA=()
|
||||
MKEXE_EXTRA=()
|
||||
BANK_SPECS=() # entries like "1=engine.c"
|
||||
MAX_ALLOCS="" # if set, passed to sdcc as --max-allocs-per-node
|
||||
GFX_MODE="" # "256" → link BGI graphics.h driver sprinter_gfx256.lib
|
||||
|
||||
# ------- Parse args ----------------------------------------------------------
|
||||
usage() {
|
||||
@@ -110,6 +111,7 @@ while [[ $# -gt 0 ]]; do
|
||||
--bank) BANK_SPECS+=("$2"); shift 2;;
|
||||
--mkexe) MKEXE_EXTRA+=("$2"); shift 2;;
|
||||
--max-allocs) MAX_ALLOCS="$2"; shift 2;;
|
||||
--gfx) GFX_MODE="$2"; shift 2;;
|
||||
--debug) DEBUG_RT=1; shift;;
|
||||
-v) VERBOSE=1; shift;;
|
||||
-h|--help) usage 0;;
|
||||
@@ -121,6 +123,17 @@ done
|
||||
[[ -z "$OUT" ]] && { echo "sprinter-cc: -o NAME is required" >&2; exit 1; }
|
||||
[[ ${#SOURCES[@]} -eq 0 ]] && { echo "sprinter-cc: no input files" >&2; exit 1; }
|
||||
|
||||
# ------- BGI graphics driver selection (--gfx) -------------------------------
|
||||
# graphics.h — mode-agnostic слой; конкретный видеорежим задаёт driver-
|
||||
# архив. Одновременно только один. drv16 пока не реализован.
|
||||
GFX_LD=()
|
||||
case "$GFX_MODE" in
|
||||
"") ;; # graphics.h не используется
|
||||
256) GFX_LD=("-lsprinter_gfx256");;
|
||||
16) echo "sprinter-cc: --gfx 16 ещё не реализован (пока только 256)" >&2; exit 1;;
|
||||
*) echo "sprinter-cc: --gfx: ожидается 256 (или 16), дано: $GFX_MODE" >&2; exit 1;;
|
||||
esac
|
||||
|
||||
# ------- Resolve memory mode → CODE_LOC / DATA_LOC ---------------------------
|
||||
# tiny : CODE in W2 (0x8100), DATA auto after code (= W2)
|
||||
# small : CODE in W1 (0x4100), DATA in W2 (0x8000) — crt0 must alloc W2
|
||||
@@ -342,12 +355,12 @@ for f in "${LD_EXTRA[@]}"; do LINK_FLAGS+=("$f"); done
|
||||
if [[ $VERBOSE -eq 1 ]]; then
|
||||
run "$SDCC" "${LINK_FLAGS[@]}" -o "$IHX" \
|
||||
"$CRT0_REL" "$HEAP_TOP_REL" "${USER_RELS[@]}" "${BANK_RELS[@]}" \
|
||||
"-L$LIB_DIR" "-lsprinter"
|
||||
"-L$LIB_DIR" "${GFX_LD[@]}" "-lsprinter"
|
||||
else
|
||||
# Drop the warning line + its two follow-up "Library:" lines.
|
||||
run "$SDCC" "${LINK_FLAGS[@]}" -o "$IHX" \
|
||||
"$CRT0_REL" "$HEAP_TOP_REL" "${USER_RELS[@]}" "${BANK_RELS[@]}" \
|
||||
"-L$LIB_DIR" "-lsprinter" 2>&1 \
|
||||
"-L$LIB_DIR" "${GFX_LD[@]}" "-lsprinter" 2>&1 \
|
||||
| awk '
|
||||
/^\?ASlink-Warning-Definition of public symbol/ { skip = 3 }
|
||||
skip > 0 { skip--; next }
|
||||
|
||||
Reference in New Issue
Block a user