Add full compiler toolchain, libc, examples and reference docs

First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.

What's in here:
  bin/sprinter-cc        — driver script invoking SDCC + linker + mkexe
  libc/                  — Sprinter-specific libc layer over ESTEX/BIOS
                           (conio, gfx, io, mem, stdio + headers)
  runtime/               — crt0 variants (default/small/banked/minimal)
                           + heap + bank trampolines
  toolchain/             — mkexe (SprintEXE packer, C + tests)
  examples/              — 30 demo programs (gfx, file I/O, env, time, …)
  lib/Makefile           — builds the libc archive (sprinter.lib)
  docs/                  — converted Sprinter manuals + asm reference samples
  third_party/           — solid-c reference compiler dump + sdcc setup script
  release_docs/          — packaging / release notes

gitignore overhaul:
  • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
    and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
    on macOS APFS).  Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
  • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
    INPUT fixtures, not build outputs.
  • Collapse the duplicated SDCC/C/Sdcc sections into one section per
    concern (build outputs / vendored / OS-junk).
  • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 16:13:21 +03:00
parent f542608b3f
commit c71e249a4e
404 changed files with 75155 additions and 58 deletions
+554
View File
@@ -0,0 +1,554 @@
; ‚室ï騥 ä㭪樨:
;
; memchr
; strcpy
; strncpy
; strcat
; strncat
; strcmp
; strncmp
; strchr
; strcspn
; strpbrk
; strlen
; strrchr
; strlwr
; strupr
; strspn
; strstr
; strtok
;
MODULE memchr
;
; "string.h"
; ”ã­ªæ¨ï ¨é¥â ¯¥à¢ë¥ count ¡ ©â ¢ buff á æ¥«ìî ®¡­ à㦥­¨ï
; ¯¥à¢®£® ¯®ï¢«¥­¨ï ᨬ¢®«  "c". ®¨áª ¯à®¤®«¦ ¥âáï ¤® â¥å ¯®à,
; ¯®ª  ­¥ ¡ã¤¥â ­ ©¤¥­ 㪠§ ­­ë© ᨬ¢®« ¨«¨ ­¥ ¡ã¤ã⠯஢¥à¥­ë
; ¢á¥ count ¡ ©âë.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  à á¯®«®¦¥­¨¥ ᨬ¢®«  "c" ¢ buff.
; …᫨ ᨬ¢®« "c" ­¥ ®¡­ à㦥­ ¢ ¯¥à¢ëå count ¡ ©â å buff, ¢®§¢à -
; é ¥âáï NULL.
;
; void *memchr(char *buff, c, count)
;
memchr_::
ld a,e ; ᨬ¢®«
cpir
dec hl
ret z ; ­ ©¤¥­
ld hl,0 ; NULL
ret
ENDMODULE
MODULE strcpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â s2 ¢ s1 (¢ª«îç ï 0-© ᨬ¢®« ®ª®­ç ­¨ï áâப¨).
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcpy(*s1, *s2)
;
strcpy_::
ex de,hl
push de
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â â®ç­® count ᨬ¢®«®¢ áâப¨ s2 ¢ áâபã s1.
; …᫨ count ¬¥­ìè¥ ¤«¨­ë s2, ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; ­¥ ¤®¡ ¢«ï¥âáï ª áâப¥ s1. …᫨ count ¡®«ìè¥ ¤«¨­ë s2, â®
; s1 § ¯®«­ï¥âáï ­ã«¥¢ë¬¨ ᨬ¢®« ¬¨, ¢¯«®âì ¤® ¤®á⨦¥­¨ï ¤«¨­ë
; count.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncpy(*s1, *s2, count)
;
strncpy_::
ex de,hl
push de
@2: ld a,(hl)
@3: ldi
jp pe,@4
or a
jp nz,@2
dec hl
jp @3
;
@4: pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â s2 ª s1, § ¢¥àè ï áâபã s1
; ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcat(*s1, *s2)
;
strcat_::
xor a
ld b,a
ld c,a
push hl
cpir
dec hl
ex de,hl
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â count ᨬ¢®«®¢ áâப¨ s2 ¢ ª®­¥æ áâப¨ s1,
; § ¢¥àè ï áâபã s1 ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ‚ s1 ¤®«¦­® ¡ëâì ¤®áâ â®ç­® ¬¥áâ  ¤«ï à §¬¥é¥­¨ï १ã«ìâ¨àã-
; î饩 áâப¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncat(*s1, *s2, count)
;
strncat_::
xor a
push hl
ld bc,0
cpir
dec hl
ex de,hl
@4: ld a,(hl)
or a
jr z,@5
ldi
jp po,@4
@5: xor a
ld (de),a
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥
; áà ¢­¥­¨¥ ᨬ¢®«®¢ áâப s1 ¨ s2, ¨ ¯à®¤®«¦ ¥â íâ®, ¯®ª 
; ®­¨ ᮢ¯ ¤ îâ, «¨¡® ¯®ª  ®¤­  ¨§ áâப ­¥ § ª®­ç¨âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥
; íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strcmp(*s1, *s2)
;
strcmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
inc de
inc hl
ld a,(de)
or a
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strncmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥ áà ¢­¥­¨¥
; ᨬ¢®«®¢ áâப s1 ¨ s2. Š®«¨ç¥á⢮ áà ¢­¨¢ ¥¬ëå ᨬ¢®«®¢ § ¤ ¥âáï
; ¢ count. …᫨ ®¤­  ¨§ áâப § ª ­ç¨¢ ¥âáï, áà ¢­¥­¨¥ ¯à¥ªà é ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥ íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strncmp(*s1, *s2, uint count)
;
strncmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
ld a,(de)
or a
jr z,@7
inc de
inc hl
dec bc
ld a,b
or c
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‘¨¬¢®« "c" ¬®¦¥â ¡ëâì ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‚®§¢à é ¥âáï NULL, ¥á«¨ ᨬ¢®« ­¥ ­ ©¤¥­.
;
; char *strchr(*string, c)
;
strchr_::
ld a,(hl) ; string
cp e ; ᨬ¢®« "c"
ret z
inc hl
or a
jp nz,strchr_
ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE inrange
;
; ¢ë§ë¢ ¥âáï ¨§ ¤à. ¯/¯à®£à ¬¬
;
@inran::
ld a,(hl)
or a
ret z
cp e
inc hl
jp nz,@inran
or 0FFh
ret
ENDMODULE
MODULE strcspn
;
; "string.h"
;  å®¤¨â ¯¥à¢ãî ç áâì áâப¨ ¢ s1, ­¥ ¢å®¤ïéãî ¢ áâபã s2.
; ‚®§¢à é ¥â ¤«¨­ã ç á⨠áâப¨ s1, á®áâ®ï饩 ¨§ ᨬ¢®«®¢, ­¥
; ­ ©¤¥­­ëå ¢ áâப¥ s2. …᫨ ­¨ ®¤¨­ ¨§ ᨬ¢®«®¢ áâப¨ s1 ­¥
; ­ ©¤¥­ ¢ s2, ¢®§¢à é ¥âáï ®¡é ï ¤«¨­  áâப¨ s1 ¡¥§ § ¢¥àè -
; î饣® ­ã«ï.
;
; size_t strcspn(*s1, *s2)
;
strcspn_::
ld b,h
ld c,l
ld hl,0
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret nz
inc hl
inc bc
jp @1
ENDMODULE
MODULE strpbrk
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ ¢ áâப¥ s1 «î¡®£®
; ᨬ¢®«  ¨§ áâப¨ s2. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï ¯à¨
; ¯®¨áª¥ ­¥ à áᬠâਢ ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  ¨§ s2 ¢ áâப¥ s1.
; ਠ®âáãâá⢨¨ ®¡é¨å ᨬ¢®«®¢ ¢ s1 ¨ s2, ¢®§¢à -
; é ¥âáï NULL.
;
; char *strpbrk(*s1, *s2)
;
strpbrk_::
ld a,(hl)
or a
jr z,@2
@1: push hl
ld l,(hl)
push de
ex de,hl
call @inran##
pop de
pop hl
ret nz
inc hl
jp @1
;
@2: ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE strlen
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¢ ¡ ©â å ¤«¨­ã áâப¨ string,
; ¯à¨ç¥¬ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨, ¢ à §¬¥à
; áâப¨ ­¥ ¢å®¤¨â.
;
; size_t strlen(*string)
;
strlen_::
xor a
ld b,a
ld c,a
push hl
cpir
pop de
scf
sbc hl,de ; hl = ¤«¨­  áâப¨
ret
ENDMODULE
MODULE strrchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥ ᨬ¢®«  "c"
; ¢ áâப¥ string. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  "c" ¢ string.
; …᫨ § ¤ ­­ë© ᨬ¢®« ­¥ ­ ©¤¥­, ¢®§¢à é ¥âáï NULL.
;
; char *strrchr(*string, c)
;
strrchr_::
ld b,h
ld c,l
ld hl,0 ; NULL
@1: ld a,(bc) ; string
or a
ret z
cp e ; ᨬ¢®« "c"
jp nz,@2
ld h,b ;  ¤à¥á ¢å®¦¤¥­¨ï
ld l,c
@2: inc bc
jp @1
ENDMODULE
MODULE strlwr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ¢¥àå­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ­¨¦­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strlwr(*string)
;
strlwr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call tolower_## ; A..Z -> a..z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strupr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ­¨¦­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ¢¥àå­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strupr(*string)
;
strupr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call toupper_## ; a..z -> A..Z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strspn
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¤«¨­ã ᮢ¯ ¤ î饩 ç á⨠áâப¨ s1, ª®â®à ï
; ¯®«­®áâìî á®á⮨⠨§ ᨬ¢®«®¢, ­ ©¤¥­­ëå ¢ áâப¥ s2. ã«¥¢®©
; ᨬ¢®« ®ª®­ç ­¨ï áâப¨ s2 ­¥ à áᬠâਢ ¥âáï.
; …᫨ áâப  s1 ­ ç¨­ ¥âáï á ᨬ¢®« , ­¥ ¢å®¤ï饣® ¢ áâபã s2,
; ¢®§¢à é ¥âáï 0.
;
; size_t strspn(*s1, *s2)
;
strspn_::
ld b,h
ld c,l
ld hl,0 ; ­ ç. ¤«¨­  ¯®¤áâப¨
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret z ; ¢¥à­ãâì ¤«¨­ã ¯®¤áâப¨
inc hl
inc bc
jp @1
ENDMODULE
MODULE strstr
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; áâப¨ s2 ¢ áâபã s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â NULL, ¥á«¨ s2 ­¥ ¡ë«  ­ ©¤¥­ .
; …᫨ ¤«¨­  áâப¨ s2 à ¢­  0, ¢®§¢à é ¥âáï s1.
;
; char *strstr(*s1, *s2)
;
strstr_::
ld a,(hl)
or a
jr nz,@1
ld l,a ; NULL
ld h,a
ret
@1: push hl ;  ¤à¥á s1
push de ;  ¤à¥á s2
@2: ld a,(de) ; s2
or a
jr z,@3
cp (hl) ; s1
inc hl
inc de
jp z,@2
pop de
pop hl
inc hl
jp strstr_
;
@3: pop de
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strtok
;
; "string.h"
; ®¨áª ⮪¥­ (®¢).
; ”ã­ªæ¨ï ­ å®¤¨â ¢ áâப¥ s1 ⮪¥­, ®â¤¥«¥­­ë© ®¤­¨¬ (¨«¨ ¡®«¥¥)
; ®£à ­¨ç¨â¥«¥¬ ¨§ ¬­®¦¥á⢠ ᨬ¢®«®¢-®£à ­¨ç¨â¥«¥© áâப¨ s2.
;  ©¤¥­­ë© ⮪¥­ ¢ áâப¥ s1 ®ª ­ç¨¢ ¥âáï ­ã«¥¬.
; „«ï ⮣®, çâ®¡ë ¯à®ç¨â âì á«¥¤ãî騩 ⮪¥­ ¨§ s1, äã­ªæ¨ï strtok
; ¤®«¦­  ¢ë§ë¢ âìáï á NULL-§­ ç¥­¨¥¬ ¤«ï  à£ã¬¥­â  s1.
; €à£ã¬¥­â NULL s1 ¢ë§ë¢ ¥â strtok ­  ¯®¨áª á«¥¤ãî饣® §­ ª  ¢
; ¯à¥¤ë¤ã饩 áâப¥ ᨬ¢®«®¢.
; Œ­®¦¥á⢮ ®£à ­¨ç¨â¥«¥© ¢ áâப s2, ®â ¢ë§®¢  ª ¢ë§®¢ã, ¬®¦¥â
; ¡ëâì à §«¨ç­ë¬, â ª çâ® s2 ¬®¦¥â ¯à¨­¨¬ âì «î¡ë¥ §­ ç¥­¨ï.
; ਠª ¦¤®¬ ¢ë§®¢¥, äã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ­ ©¤¥­­ë©
; ⮪¥­ áâப¨ s1, ª ¦¤ë© à § ¯à®¤¢¨£ ïáì ¢¯¥à¥¤ ¯® áâப¥ s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì NULL, ª®£¤  ¡®«ìè¥ ­¥â ⮪¥­®¢
; ¢ áâப¥ s1.
;
; char *strtok(*s1, *s2)
;
strtok_::
ld (@4+1),de ; s2
ld (@2+1),hl ; s1
ld a,l
or h
jr nz,@0
@3: ld hl,0 ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
ld (@2+1),hl
@0: ld (@1+1),hl ; s1
@2: ld hl,0 ; ⥪.  ¤à¥á ¢ s1
ld a,(hl)
inc hl
ld (@2+1),hl
or a
jr z,@1
ld e,a
@4: ld hl,0 ; á®åà.  ¤à¥á s2
call @inran##
jr z,@2
ld hl,(@2+1) ; ⥪.  ¤à¥á ¢ s1
dec hl
ld (hl),0 ; ­  ¬¥áâ® ­ ©¤¥­­®£® ᨬ¢®«  ?
inc hl
ld (@3+1),hl ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
@1: ld hl,0 ;  ¤à¥á ­ ©¤¥­­®£® ᨬ¢®« 
ret
ENDMODULE