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
+660
View File
@@ -0,0 +1,660 @@
; ‚室ï騥 ä㭪樨:
;
; sbrk (¢ë¤¥«. ¡«®ª  ¯ ¬ï⨠¬¥¦¤ã 㪠§. ᢮¡. ¯ ¬ï⨠"$MEMRY" ¨ á⥪®¬)
; brk
; free
; malloc
; calloc
; realoc
;
MODULE sbrk
;
; "malloc.h"
; ‚뤥«ï¥â ¡«®ª ¤«¨­®© n ¢ ¯à¥¤¥«ïå ¬¥¦¤ã 㪠§ â¥«¥¬
; ᢮¡®¤­®© ¯ ¬ï⨠¨ 㪠§ â¥«¥¬ á⥪ .
; ‡­ ç¥­¨¥ n ¬®¦¥â ¡ëâì ®âà¨æ â¥«ì­ë¬, ⮣¤  ª®«¨ç¥á⢮
; § å¢ ç¥­­®© ¯ ¬ï⨠㬥­ìè ¥âáï ­  n ¡ ©â®¢.
; ਠãᯥ譮¬ ¢ë¤¥«¥­¨¨ ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥-
; «¥­­ë© ¡«®ª.
; …᫨ ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥â -1 (0FFFFh).
;
; in: hl = à §¬¥à ¡«®ª 
; out: hl = 㪠§ â¥«ì ­  ¢ë¤¥«. ¡«®ª, ¥á«¨ Ok.
; hl = -1 ¯à¨ ­¥¤®áâ âª¥ ¯ ¬ïâ¨.
;
; char *sbrk(int n)
;
sbrk_::
ld de,($MEMRY) ;  ¤à¥á 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
add hl,de
jr c,sbrkerr ; ¯¥à¥¯®«­. ç¨á« 
call brk_
ld a,h
and l
inc a
ret z ; ®è¨¡ª 
ex de,hl ; hl=­ ç «® ¢ë¤¥«. ¡«®ª 
ret
; Set free memory pointer.
; int brk(int n)
brk_::
push hl
inc h
inc h ; + 512 bytes reserved
or a
sbc hl,sp ; ¢ë¤¥«¨âì ¯ ¬ïâì
pop hl
jr nc,sbrkerr ; ¬ «® ¯ ¬ïâ¨
ld ($MEMRY),hl ; ­®¢®¥ ¯®«®¦. 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
ret
;
sbrkerr:ld hl,-1 ; EOF ®è¨¡ª 
ret
; 㪠§ â¥«ì ­ ç «  ᢮¡®¤­®© ¯ ¬ï⨠(¤® á⥪ )
$MEMRY::
dw 0 ; § ¯®«­ï¥âáï «¨­ª¥à®¬!
ENDMODULE
MODULE free
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï ®á¢®¡®¦¤ ¥â ¡«®ª ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  à ­¥¥ § å¢ ç¥­­ë© ¡«®ª
; ¯ ¬ï⨠¯®á।á⢮¬ ¢ë§®¢  malloc, calloc, realloc.
; ‚®§¢à é ¥¬®£® §­ ç¥­¨ï ­¥â.
;
; void free(char *ptr)
;
free_::
dec hl
dec hl
dec hl
dec hl ; ­  ­ ç «® § £®«®¢ª  ¡«®ª 
ld c,l
ld b,h
ld hl,(_alloc_)
ld (?49+1),hl
ex de,hl
@22: ld a,e
sub c
ld a,d
sbc a,b
jr nc,@19
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@19: ld l,e
ld h,d
ld a,e
sub (hl)
inc hl
ld a,d
sbc a,(hl)
jr c,@21
ld a,e
sub c
ld a,d
sbc a,b
jr c,@20
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@21: ex de,hl
ld e,(hl)
inc hl
ld d,(hl)
ld (?49+1),de
jr @22
;
@20: ld l,e
ld h,d
ld (?48+1),bc
ld c,(hl)
inc hl
ld b,(hl)
push bc
?48: ld bc,0 ; á®åà. §­ ç¥­¨¥
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ;1+1=2
add hl,hl ;2+2=4
add hl,bc
ld (?48+1),bc
pop bc
push de
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@23
ld hl,(?48+1)
push hl
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
?49: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld hl,(?49+1)
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld c,(hl)
inc hl
ld b,(hl)
pop hl
ld (hl),c
inc hl
ld (hl),b
jr @24
;
@23: ex de,hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(?48+1)
ld (hl),c
inc hl
ld (hl),b
@24: pop de
ld hl,2
add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl
add hl,hl
add hl,de
push de
ld bc,(?48+1)
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@25
ld hl,2
add hl,de
push de
ld e,(hl)
inc hl
ld d,(hl)
push hl
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld l,c
ld h,b
ld c,(hl)
inc hl
ld b,(hl)
pop de
ex de,hl
ld (hl),c
inc hl
ld (hl),b
jr @26
;
@25: ex de,hl
ld (hl),c
inc hl
ld (hl),b
@26: pop hl
ld (_alloc_),hl
ret
; ï祩ª   ¤à¥á  ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
_alloc_::
dw 0
dseg
; áâàãªâãà  § £®«®¢ª  ¡«®ª 
_base_::
dw 0 ; addr next free block
dw 0 ; size of this free block
ENDMODULE
MODULE malloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¡«®ª ¯ ¬ï⨠ࠧ¬¥à®¬ ¢ size ¡ ©â®¢.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; …᫨ ᢮¡®¤­®© ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥âáï NULL.
;
; char *malloc(int size)
;
malloc_::
inc hl
inc hl
inc hl
srl h ; hl/4
rr l
srl h
rr l
inc hl
ld (units+1),hl ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(_alloc_##)
ld a,l
or h
jr nz,@0
ld (_base_##+2),hl ; á¡à. à §¬¥à ¢ë¤¥«. ¡«®ª 
ld hl,_base_## ; áâàãªâãà  § £®«®¢ª  ¡«®ª 
ld (_alloc_##),hl ;  ¤à¥á ¢ë¤¥«. ¡«®ª 
ld (_base_##),hl ;  ¤à¥á á«¥¤. § £®«®¢ª 
;
@0: ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl ; hl=_base_
@3: ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp z,@1
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ; *4
add hl,hl ;
ex de,hl
ld hl,(tp+1)
add hl,de
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp nz,@1
ld hl,(tp+1)
ld e,l;
ld d,h;
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(_alloc_##)
ld a,l
cp c
jr nz,@2
ld a,h
cp b
jr nz,@2
;ld hl,(tp+1)
ld l,e;
ld h,d;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (_alloc_##),hl
@2: ;ld hl,(tp+1)
ex de,hl;
ld c,l;
ld b,h;
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;ld c,(hl)
;inc hl
;ld b,(hl)
;ld hl,(tp+1)
;ld (hl),c
;inc hl
;ld (hl),b
ld a,(hl);
ld (bc),a;
inc hl;
inc bc;
ld a,(hl);
ld (bc),a;
jp @3
;
@1: ld hl,(tp+1)
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
units: ld hl,0 ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
sub l
ld a,b
sbc a,h
jp c,@4
ld hl,(tp+1)
ld e,l;
ld d,h;
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
cp l
jr nz,@5
ld a,b
cp h
jr nz,@5
;ld hl,(tp+1)
ex de,hl;
ld c,(hl)
inc hl
ld b,(hl)
prev: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),c
inc hl
ld (hl),b
jp @6
;
@5: ;ld hl,(units+1) ; hl=(units+1) à §¬¥à ­®¢®£® ¡«®ª 
add hl,hl
add hl,hl
ex de,hl
;ld hl,(tp+1)
add hl,de
ld (_alloc_##),hl
ex de,hl
ld hl,(prev+1)
ld (hl),e
inc hl
ld (hl),d
ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(_alloc_##)
ex de,hl;
ld (hl),c
inc hl
ld (hl),b
;ld hl,(tp+1)
;inc hl
ex de,hl;
inc hl
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld de,(units+1)
ld a,c
sub e ;l
ld c,a
ld a,b
sbc a,d ;h
ld b,a
ld hl,(_alloc_##)
inc hl
inc hl
ld (hl),c
inc hl
ld (hl),b
;ld de,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(tp+1)
inc hl
inc hl
ld (hl),e
inc hl
ld (hl),d
@6: ld hl,(prev+1)
ld (_alloc_##),hl
tp: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),0
inc hl
ld (hl),0
inc hl
inc hl
inc hl ; ¯¥à¥©â¨ ­  ¢ë¤¥«. ¡«®ª
ret
;
@4: ld de,(tp+1)
ld hl,(_alloc_##)
ld a,e
cp l
jr nz,@7
ld a,d
cp h
jr nz,@7
ld hl,512
call sbrk_##
ld (tp+1),hl
ld a,l
and h
inc a
jr nz,@8
inc hl ; NULL
ret
;
@8: ld (hl),0
inc hl
ld (hl),0
inc hl
ld (hl),128 ; 512/sizeof(FREE)
inc hl
ld (hl),0
inc hl
call free_##
ld hl,(_alloc_##)
ld (tp+1),hl
@7: ld hl,(tp+1)
ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl
jp @3
ENDMODULE
MODULE calloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¯à®áâà ­á⢮ ¤«ï åà ­¥­¨ï ¬ áᨢ  ¨§ n í«¥¬¥­â®¢,
; ª ¦¤ë© à §¬¥à®¬ size ¡ ©â. Š ¦¤ë© í«¥¬¥­â ¨­¨æ¨ «¨§¨àã¥âáï ¢ 0.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § å¢ ç¥­­®¥ ¯à®áâà ­á⢮.
; …᫨ ­¥¤®áâ â®ç­® ¯ ¬ïâ¨, ¢®§¢à é ¥âáï §­ ç¥­¨¥ NULL.
;
; char *calloc(int n, int size)
;
calloc_::
call ?MULHD## ; n * size = à §¬¥à ¢á¥£® ¬ áᨢ 
ld (@34+1),hl
call malloc_## ; ¢ë¤¥«¨âì ¯ ¬ïâì
ld a,l
or h
ret z ; ­¥¤®áâ â®ç­® ¯ ¬ï⨠(hl=NULL)
@34: ld bc,0 ; á®åà. à §¬¥à ¬ áᨢ 
ld (hl),0 ; ¡ ©â § ¯®«­¥­¨ï
push hl
ld d,h
ld e,l
inc de
dec bc
ldir
pop hl ; Ok
ret
ENDMODULE
MODULE realloc
;
; "malloc.h"
; ”ã­ªæ¨ï ¨§¬¥­ï¥â à §¬¥à à ­¥¥ ¢ë¤¥«¥­­®£® ¡«®ª  ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  ­ ç «® ¡«®ª . €à£ã¬¥­â size § ¤ ¥â ­®¢ë©
; à §¬¥à ¡«®ª  ¢ ¡ ©â å. ‘®¤¥à¦¨¬®¥ ¡«®ª  ­¥ ¨§¬¥­ï¥âáï.
; …᫨ size à ¢¥­ 0, ¡«®ª ®á¢®¡®¦¤ ¥âáï ¨ ¢®§¢à é ¥âáï NULL.
; …᫨ ptr à ¢¥­ NULL, â® ®â¢®¤¨âáï (¯® malloc) size ¡ ©â®¢ ¯ ¬ïâ¨
; ¨ ¢®§¢à é ¥âáï 㪠§ â¥«ì ­  íâ®â ¡«®ª.
; €à£ã¬¥­â ptr ¬®¦¥â 㪠§ë¢ âì ­  ¡«®ª, ª®â®àë© ¤®«¦¥­ ¡ëâì ®á¢®¡®¦¤¥­
; ¯à¥¦¤¥, 祬 ¯®á«¥¤ãî⠢맮¢ë malloc, calloc, realloc.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¥§ å¢ ç¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; «®ª ¬®¦¥â ¡ëâì ¯¥à¥¤¢¨­ãâ, ¥á«¨ ¥£® à §¬¥àë ¨§¬¥­¥­ë, ¯®íâ®¬ã  à£ã-
; ¬¥­â ptr ¤«ï ä㭪樨 realloc ­¥ ®¡ï§ â¥«ì­® ¤®«¦¥­ ¡ëâì â ª¨¬ ¦¥,
; ª ª ¨ ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥.
; ‚®§¢à é ¥âáï §­ ç¥­¨¥ NULL, ¥á«¨ ¯ ¬ï⨠­¥¤®áâ â®ç­® ¤«ï à áè¨à¥­¨ï
; ¡«®ª  ª § ¤ ­­®¬ã à §¬¥àã. ਠí⮬ ¯¥à¢®­ ç «ì­ë© ¡«®ª ®áâ ¥âáï
; ­¥¨§¬¥­­ë¬.
;
; char *realloc(*ptr, int size);
;
realloc_::
ld a,l
or h
jr nz,@0 ; *ptr != NULL
ex de,hl
jp malloc_##
;
@0: ld a,e
or d
jr nz,@1 ; size != 0
call free_##
ld hl,0 ; NULL
ret
;
@1: push hl ; *ptr
dec hl
ld a,(hl)
dec hl
ld l,(hl) ; hl=à §¬¥à ¡«®ª  ptr
ld h,a
add hl,hl ;
add hl,hl ; *4
dec hl
dec hl
dec hl
dec hl
ld (osize+1),hl
pop hl
push de ; size
push hl ; ptr
push de
call free_##
pop hl ; size
call malloc_##
ld (@3+1),hl ; ­®¢ë© ¡«®ª
pop de ; ptr
pop bc ; size
ld a,l
or h
jr z,@3 ; ®è¨¡ª 
; alloc != ptr
ld a,l
cp e
jr nz,osize
ld a,h
cp d
jr z,@3
osize: ld hl,0 ; á®åà. §­ ç¥­¨¥
; size > osize ?
ld a,l
sub c
ld a,h
sbc a,b
jr nc,@2 ; osize > size
ld c,l ; bc=osize
ld b,h
@2: ex de,hl ; hl = *ptr
ld de,(@3+1)
call movmem_## ; hl=from, de=to, bc=size
@3: ld hl,0 ; á®åà. 㪠§ â¥«ì ­  ­®¢ë© ¡«®ª
ret
ENDMODULE