Files
snark13 c71e249a4e 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>
2026-06-03 16:13:21 +03:00

555 lines
9.3 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; ‚室ï騥 ä㭪樨:
;
; 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