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
+393
View File
@@ -0,0 +1,393 @@
/*
MM> ®á¬®âà¨â¥, ¯«¨§ ã ᥡï, ¬®¦¥â ã ª®£®-­¨âì ¥áâì ®¯¨á ­¨¥ ¬¥â®¤®¢
MM> á®àâ¨à®¢ª¨ (quick sort, buble sort, ŠŒ ¨ â.¤.). ˆå â ¬ ¯à¨¬¥à­® 6
MM> ¥áâì. ˆ­â¥à¥áãîâ ¨¬¬¥­®  «£®à¨â¬ë á ®¯¨á ­¨¥¬, ª®â®àë¥ ï ¨á¯®«ì§ãî
MM> ¯®â®¬ ¤«ï ªãàᮢ®© à ¡®âë. Ѝ­â¥ ¬­¥, ¯¦ «áâ , ¨«¨ ¯®¤¥«¨â¥áì url¨ª®¬.
MM> ‘¯ á¨¡®!
EI> ޝ¨è¨â¥ c ¯p¨¬¥p ¬¨ ­  ¯ cª «¥, ¯®¦ «ã©câ , ®c­®¢­ë¥ ¬¥â®¤ë
EI> c®pâ¨p®¢ª¨,
EI> 祬 ¡®«ìè¥ â¥¬ «ãçè¥, ¢c¥¬ § p ­¥¥ ®£p®¬­®¥ c¯ c¨¡®«
H . H® ­  C (â ¬ ­  ᪮«ìª® ï ¯®­ï« £« ¢­®¥  «£®à¨â¬ë ­ã¦­ë). Ÿ ¯¨á « ¨
ª®¬¯¨«¨« ¯®¤ BC3.1. ।áâ ¢«ï¥â ᮡ®© ¯à®£ã ¯® á¡®àã áâ â¨á⨪¨ íä䥪⨢-
­®á⨠ «£®à¨â¬®¢.
à®èã ¯®ªà¨â¨ª®¢ âì :) (å®âï ®¯ïâì ¦¥ á ¡¦ ¡ë« ­  ¯¥à¢®¬ ªãàá¥).
----------------
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define SIZE 15
/* Prototypes */
void Binsort();
void Choise();
void Include();
void Bubble();
void Quick();
void Shell();
void Join();
void Prn();
void Test();
unsigned ITERATION, // Š®«¨ç¥á⢮ ¯à®©¤¥­ëå æ¨ª«®¢
EXCHANGES, // ®¡¬¥­®¢ ï祥ª
CONDITIONS; // ¯à®©¤¥­ëå ãá«®¢¨©
int Mass[SIZE];
int i, NumElem;
char key;
/* ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ */
int main()
{
NumElem = sizeof(Mass) / sizeof(Mass[0]);
clrscr();
do {
for(i=0; i < NumElem; i++) Mass[i] = rand() % 100 - 50;
clrscr();
puts("Œ¥­î:\n");
puts(" 1. ‘®àâ¨à®¢ª  ®¡¬¥­ ¬¨ (¬¥â®¤ ¯ã§ëà쪠)");
puts(" 2. ‘®àâ¨à®¢ª  ¢ë¡®à®¬");
puts(" 3. ‘®àâ¨à®¢ª  ¯à®áâ묨 ¢áâ ¢ª ¬¨");
puts(" 4. ‘®àâ¨à®¢ª  ¡¨­ à­ë¬¨ ¢áâ ¢ª ¬¨ (¢áâ ¢ª  ¤¥«¥­¨¥¬ ¯®¯®« ¬)");
puts(" 5. ‘®àâ¨à®¢ª  ¬¥â®¤®¬ ˜¥«« ");
puts(" 6. ‘®àâ¨à®¢ª  ¡ëáâàë¬ ¬¥â®¤®¬\n");
puts(" 7. ‘«¨ï­¨¥ á®àâ¨à®¢ ­­ëå ¬ áᨢ®¢");
puts(" 8. ’¥áâ ­  ¯à®¨§¢®¤¨â¥«ì­®áâì\n");
puts(" ESC. ‚ë室\n\n->");
if ((key=getch()) == 27)
goto done;
clrscr();
if (key >= '0' && key <= '6')
{
cprintf("\nŒ áᨢ (®à¨£¨­ «):");
Prn(Mass, NumElem);
}
ITERATION=EXCHANGES=CONDITIONS=0;
switch(key)
{
case '1': Bubble(Mass, NumElem); break;
case '2': Choise(Mass, NumElem); break;
case '3': Include(Mass, NumElem); break;
case '4': Binsort(Mass, NumElem); break;
case '5': Shell(Mass, NumElem); break;
case '6': Quick(Mass, 0, NumElem); break;
case '7': Join(); continue;
case '8': Test(Mass, NumElem); continue;
default : continue;
}
cprintf("\n(á®àâ¨à®¢ ­­ë©):");
Prn(Mass, NumElem);
cprintf("\n\n\nਠá®àâ¨à®¢ª¥ ¯®âॡ®¢ «®áì ¨â¥à æ¨©: %d\n",ITERATION);
cprintf(" ¯à®¨§¢¥¤¥­® ®¡¬¥­®¢ ï祥ª: %d\n",EXCHANGES);
cprintf(" ¯à®©¤¥­® ãá«®¢¨©: %d\n",CONDITIONS);
puts("\n\n\nAny key...");
getch();
} while(1);
done:
puts("\n\nSee you... ;)");
return 0;
}
/*.......................................................................*/
void Prn(PtrMass, count)
int *PtrMass, count;
{
int i;
cprintf("\n[");
for (i=0; i < count; i++)
cprintf(" %3d", PtrMass[i]);
puts("]");
}
/*.......................................................................*/
void Test(PtrMass, count)
int *PtrMass, count;
{
uint ITERATION1, EXCHANGES1, CONDITIONS1, ITERATION2,
EXCHANGES2, CONDITIONS2, ITERATION3, EXCHANGES3,
CONDITIONS3, ITERATION4, EXCHANGES4, CONDITIONS4,
ITERATION5, EXCHANGES5, CONDITIONS5, i, j;
ITERATION1=EXCHANGES1=CONDITIONS1=ITERATION2=EXCHANGES2=CONDITIONS2=0;
ITERATION3=EXCHANGES3=CONDITIONS3=ITERATION4=EXCHANGES4=CONDITIONS4=0;
ITERATION5=EXCHANGES5=CONDITIONS5=0;
clrscr();
puts("‘®àâ¨à®¢ª  ®¡¬¥­ ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¢ë¡®à®¬: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¯à®áâ묨 ¢áâ ¢ª ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¡¨­ à­ë¬¨ ¢áâ ¢ª ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¬¥â®¤®¬ ˜¥«« : ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¡ëáâàë¬ ¬¥â®¤®¬: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =");
for(j=1; j <= 100; j++)
{
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Bubble(PtrMass ,count);
ITERATION1+=ITERATION; EXCHANGES1+=EXCHANGES; CONDITIONS1+=CONDITIONS;
gotoxy(52,1); cprintf("%d ",ITERATION1/j);
gotoxy(52,2); cprintf("%d ",EXCHANGES1/j);
gotoxy(52,3); cprintf("%d ",CONDITIONS1/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Choise(PtrMass ,count);
ITERATION2+=ITERATION; EXCHANGES2+=EXCHANGES; CONDITIONS2+=CONDITIONS;
gotoxy(52,5); cprintf("%d ",ITERATION2/j);
gotoxy(52,6); cprintf("%d ",EXCHANGES2/j);
gotoxy(52,7); cprintf("%d ",CONDITIONS2/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Include(PtrMass ,count);
ITERATION3+=ITERATION; EXCHANGES3+=EXCHANGES; CONDITIONS3+=CONDITIONS;
gotoxy(52,9); cprintf("%d ",ITERATION3/j);
gotoxy(52,10); cprintf("%d ",EXCHANGES3/j);
gotoxy(52,11); cprintf("%d ",CONDITIONS3/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Binsort(PtrMass ,count);
ITERATION4+=ITERATION; EXCHANGES4+=EXCHANGES; CONDITIONS4+=CONDITIONS;
gotoxy(52,13); cprintf("%d ",ITERATION4/j);
gotoxy(52,14); cprintf("%d ",EXCHANGES4/j);
gotoxy(52,15); cprintf("%d ",CONDITIONS4/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Shell(PtrMass ,count);
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
gotoxy(52,17); cprintf("%d ",ITERATION5/j);
gotoxy(52,18); cprintf("%d ",EXCHANGES5/j);
gotoxy(52,19); cprintf("%d ",CONDITIONS5/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Quick(PtrMass , 0, count);
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
gotoxy(52,21); cprintf("%d ",ITERATION5/j);
gotoxy(52,22); cprintf("%d ",EXCHANGES5/j);
gotoxy(52,23); cprintf("%d ",CONDITIONS5/j);
}
puts("\n\n\nOk...");
getch();
}
/*.......................................................................*/
void Include(PtrMass, count)
int *PtrMass, count;
{
int i, j, temp;
for (i=1; i< count; ++i)
{
temp=PtrMass[i];
for (j=i-1; j>=0 && temp<PtrMass[j]; j--)
{
ITERATION++;
EXCHANGES++;
PtrMass[j+1]=PtrMass[j];
}
ITERATION++;
PtrMass[j+1]=temp;
}
ITERATION -= count-1;
}
/*.......................................................................*/
void Binsort(PtrMass, count)
int *PtrMass, count;
{
int i, j, pos, a, b, middle, num;
for (i=1; i < count; i++)
{
a=0; /* H¨¦­ïï £à ­¨æ  ¯®¨áª  = 1-¬ã í«-âã */
b=i; /* ‚¥àå­ïï = á® 2 ¯® count */
EXCHANGES++;
num=PtrMass[i]; /* —¨á«® ¤«ï ª®â. ­ã¦­® ­ ©â¨ ¬¥áâ® */
while ( a!=b ) /* ...¯®ª  £à ­¨æë ­¥ ᫨«¨áì... */
{
middle=(a+b)/2; /* –¥« ï ç áâì áà. à¨ä¬. áã¬¬ë £à ­¨æ */
if (num > PtrMass[middle]) /* ..¥á«¨ ç¨á«® >ç¨á«  áâ®ïé.¯®¤ */
{ /* ­®¬¥à®¬ middle â®: */
a=middle+1; /* ­¨¦. £à ­. = 業âàã+1 */
} /* */
else /* ¨«¨ */
{ /* */
b = middle; /* ¢¥àå­ïï £à ­¨æ  = 業âàã... */
}
CONDITIONS++;
ITERATION++;
}
pos=a; /* ‘®¤¥à¦¨â ­ ©¤¥­­ãî ¯®§¨æ¨î ­  ª®â. */
/* ­ã¦­® ¯®áâ ¢¨âì ç¨á«® */
for (j=i; j > pos; j--)
{ /* ®¤¢¨£ ¥¬ (­  1 ¢¯à ¢®) í«-âë */
PtrMass[j]=PtrMass[j-1]; /* ¬ áᨢ  «¥¦ é¨¥ ¯¥à¥¤ í«¥¬¥­â®¬, */
EXCHANGES++;
ITERATION++; /* ¤«ï ª®â®à®£® ¨é¥âáï ¬¥áâ® ®á¢®- */
} /* ¡®¦¤ ï 1 ¬¥áâ® */
PtrMass[pos]=num; /* “áâ ­ ¢«¨¢ ¥¬ í«¥¬¥­â ­  ¬¥áâ® */
}
}
/*.......................................................................*/
void Bubble(PtrMass, count)
int *PtrMass, count;
{
int i,j;
for (i=0; i<count; i++)
for (j=i+1; j<count; j++)
{
if (PtrMass[i] > PtrMass[j])
{
PtrMass[i]+=PtrMass[j];
PtrMass[j]= PtrMass[i] - PtrMass[j];
PtrMass[i]-=PtrMass[j];
EXCHANGES++;
CONDITIONS++;
}
ITERATION++;
}
}
/*.......................................................................*/
void Choise(PtrMass, count)
int *PtrMass, count;
{
int i,j;
for (i=0; i<count; i++)
for (j=0; j<count-1; j++)
{
if(PtrMass[j]>PtrMass[j+1])
{
PtrMass[j]+=PtrMass[j+1];
PtrMass[j+1]=PtrMass[j]-PtrMass[j+1];
PtrMass[j]-=PtrMass[j+1];
EXCHANGES++;
CONDITIONS++;
}
ITERATION++;
}
}
int A[]={-1,1,2,3,3}, B[]={-2,0,2,4,4};
/*.......................................................................*/
/* ‘«¨ï­¨¥ ¤¢ãå ®âá®àâ¨à®¢ ­­ëå ¢¥ªâ®à®¢ ¢ ®¤¨­ */
void Join()
{
int C[10], i,j,k;
for (i=j=k=0; k < 10; k++)
{
if (A[i] <= B[j])
{ C[k]=A[i]; i++; }
else
{ C[k]=B[j]; j++; }
}
cprintf("\nŒ áᨢ A[]:");
Prn(A, sizeof(A) / sizeof(A[0]));
cprintf("\nŒ áᨢ B[]:");
Prn(B, sizeof(B) / sizeof(B[0]));
cprintf("\nŒ áᨢ C[]:");
Prn(C, sizeof(C) / sizeof(C[0]));
puts("\n\n\nAny key...");
getch();
}
int aa[]={9,5,3,2,1};
/*.......................................................................*/
void Shell(PtrMass, count)
int *PtrMass, count;
{
int i, j, gap, k, x;
for(k=0; k < 5; k++)
{
gap = aa[k];
for(i=gap; i < count; ++i)
{
x=PtrMass[i];
for(j=i-gap; x < PtrMass[j] && j >= 0; j = j-gap)
{
PtrMass[j+gap]=PtrMass[j];
ITERATION++;
EXCHANGES++;
}
PtrMass[j+gap]=x;
}
}
}
/*.......................................................................*/
void Quick(PtrMass, left, right)
int *PtrMass, left, right;
{
int x, y, i, j;
i = left;
j = right;
x = PtrMass[(left+right) / 2];
do {
while(PtrMass[i] < x && i < right) { i++; ITERATION++; }
while(x < PtrMass[j] && j > left) { j--; ITERATION++; }
if(i <= j)
{
y=PtrMass[i];
PtrMass[i]=PtrMass[j];
PtrMass[j]=y;
i++;
j--;
EXCHANGES++;
CONDITIONS++;
}
} while(i <= j);
if(left < j) Quick(PtrMass,left,j);
if(i < right) Quick(PtrMass,i,right);
}